Files
Dario LipicarandClaude Opus 5 71e38a33d9 fix(conformance): the drifted sixth contract copy, and what M3 actually needs (#32)
Two corrections, both of things this directory asserts about itself.

The UI plugin's interfaces/full_api.h is a SIXTH copy of the contract and was
the one copy check_contract_copies.py did not check. It had silently lost
echoTriple / fireTripleEvent / tripleEvent when multi-arg arity was added —
exactly the drift that script exists to catch, in the file it could not see.
Restored and registered: 6 copies agree, 33 methods, 15 events.

known.json justified the consumer axis partly with M3, and that is wrong. M3
lives on the Qt-typed consumer path (logos_json_convert turns a one-key tagged
map into a QByteArray on the way to a Qt consumer). Neither proxy reaches it:
interface:"universal" forces apiStyle=lp and interface:"cdylib" forces the Rust
client, so both bypass the Qt wrappers.

That was measured, not reasoned: replaying the table through both proxies
changes 2 cells of 86 — hostile/[any]/scalar and hostile/{tstr:any}/scalar,
where the lp wrapper retypes a non-matching return to an empty container — and
reaches none of the 21 ext cases, which have no proxy at all.

What would make M3 measurable is a consumer on the Qt api style: a headless
`type: core` module with no `interface` key gets Qt-typed modules() wrappers and
is driveable by logoscore, in-sandbox. The UI plugin sits on that style too but
needs a GUI host, and its observation channel wraps ULongLong through
toLongLong() and stringifies QByteArray — it would manufacture the defect
classes under test.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 17:08:11 -03:00
..