Maelstrom event observer: retained native synthetic qualification

PASS: one Node process, one actual native Wasm instantiation, reused across OFF and ON scenarios. Native exit 0, natural termination, 10,437 output bytes, group absent and child reaped. No production observer change, original-game execution, build, acquisition, box operation, deployment, main integration or other worker.

Accepted base ff594b75bc500a12200302e87dd963b277b5ac56, tree 5638a8460fda07a07d3ecbe5c284a7c61f25511e. Exact immutable inputs:

Input SHA-256
Actual retained 1,879,746-byte module 8fac39936b6df2418ad86cab118cef19a65a727f649fbc14c412b37818904686
Unchanged event observer 52909f8dc9e39c9c294602c952d9bbbf4e91c52d5c56ddbba45fb3cb30d9e226
Scheduler f0a2f006b0eb992bcdb904f10128167b06bfe143ac05661b82f9586d9755bf40
Runner 4d7b9587676db38fcf3314807acb2b2a42b5f09d2c98fcf3dccb8a6cde9e1809
Exports source 739397dc54a77e93b367334fd4ca96c921180f57a7558913a3301f1de4520b86
Prior init/import recipe test 938458b147c43f72a0792a6fd1bf625a4fb8c67e472b3079dda00e7c3deb9a5b

The module's supplied provenance is source b41a7c5f, ABI 291, layout 9a3bc9149d58209c. This task independently checks module bytes and export/import contract; it does not rebuild or independently reproduce that source provenance.

Executable and controls

test/maelstrom-event-boundary-native.cjs accepts, in order, the standing runner, exports source, scheduler and module paths. --preflight checks identities, binary exports/imported memory limits, direct spans, disjoint counter fixtures, and six rejecting mutations without compiling/instantiating a module. Exact argv is in native-attempt.json; supervise.py supplies the exclusive lock, fresh measured admission, CPU 90s/wall 60s, fixed 512 MiB arena, 512 MiB heap, 131,072-byte output cap, 24 MiB per file, process-group TERM/KILL within 5s and reaping. Native launch stops ahead of 19:00 UTC on 2026-10-24. It refuses an existing attempt receipt. Do not rerun this assignment's native process.

Syntax and final changed-input preflight passed under 256 MiB heap and CPU/wall 60s. Six production-function mutations rejected: reason-only select attribution, extra original run, dropped arguments, swallowed exception, ignored record cap, and wrong head event. Each mutation replaces an asserted literal in the actual production createObserver source. Fixture tests use immutable diagnostic exports and check receiver, argument, result, exact exception identity and zero-record cap behavior. These isolated fixtures are explicitly separate from native evidence. The unchanged accepted observer's earlier exact focused and independent receipts are retained as accepted-exact-*.receipt.json; this task reuses that focused evidence and adds the native qualification rather than rerunning the old suite.

Both actual native lanes started with counts [0,0]: OFF addresses 0x7a3c62,0x7a3c66, ON 0x7a3362,0x7a3366. Each lane executes six planned calls. Native set_count, register setters and set_yield_state configure the fixture; no counter/cache clears or observer-added runs occur. A final coercion check on each real run function throws the same sentinel object before guest execution. There are 14 run API calls in total, of which two stop at coercion; only one native process and one instantiation. OFF/ON snapshots match normalized EIP/EDI, EAX/EBP/ESP, counter values, yield reason/flag/halt, cache store/clear/ invalidation deltas, and hashes of the explicit stack and fdset/timeval spans. This is bounded fixture memory/state equivalence, not a whole-arena byte diff. Native run's void result is preserved for normal and pending-yield returns; extra arguments/custom receiver are accepted by native Wasm. Fixture controls establish forwarding semantics that Wasm itself does not expose for inspection.

Observations and limits

The unchanged observer's createObserver and wrapInstance wrap the actual immutable native exports. Six raw bounded records total 4,124 bytes, below 16 records/8,192 bytes. The actual unrelated API-id 935 thunk produces no select event. Invocation 3/batch 50002 observes reason 8 and native thunk_word values [4096,934]; invocation 4/batch 50003 observes the head; invocation 5/batch 50004 observes the interior return boundary. These shifted invocations are outside the old historical batch window. Pending reason returns have halt 4 and are labelled before dispatch. Normal CALL/RET execution reaches the interior with halt 5.

The synthetic thunk records are written at the source-backed unpatched metadata address THUNK_BASE + index*8 (here linear 0x071160f8). The real native thunk getters validate them. Guest stack 0x07402000 contains return/nfds/read/write/ except/timeout; fdset 0x00430000 has three entries, captured as count 3 and two prefix entries with truncation; timeval 0x00430200 is [0,5000]. The null write/except sets remain NULL. These are diagnostic fixtures, not recovered original-game stack/select state, and the select API is not dispatched.

All getters used by the observer are present in this retained module; none is mocked for native qualification. Select deadline remains explicitly unavailable. Actual pinned scheduler checkMainYield and noteMainSleep methods run against the wrapped native instance with a controlled owner and clock. For reason 8 they return false and preserve yield. The entire scheduler source is evaluated with empty dependency globals; this restricted path does not access those dependencies. No scheduler-internal runSlice/cooperative-send dispatch is qualified.

Coverage is all invocation boundaries while the observer is active. Wholly intra-invocation head visits remain unobserved. API completion is unobserved and return unattributed; counters are not execution proof; overhead is unmeasured. This result establishes no original-game root cause, deadline, network outcome or gameplay acceptance. No production defect appeared, so no production fix or unchanged-observer failure reproducer was needed.

Admission, recovery and deficiencies

Fresh admission under /tmp/wine-ops-heavy-runtime.lock measured 52,021,328 projected task bytes, including all new sparse checkout/Git data, complete external launcher events and session log, conservative SQLite charge, publication/future growth, output, and an 8 MiB reserve, within 67,108,864. Available memory was 3,656,724,480 >= 2,684,354,560; disk after projected growth was 3,357,681,584 >= 2,982,150,144. Standing executables, shared libraries, retained inputs and read-only Git alternate are separately inventoried, not copied.

Preserved workflow deficiencies: the first search was too broad and generated oversized output before narrowing subsequent reads; initial syntax/preflight commands lacked the explicit CPU/wall wrapper. Changed-input final preflight uses the proper limits. SQLite baseline was recorded after setup; admission conservatively charges every extant SQLite WAL, rather than pretending the late baseline proves earlier growth. Source excerpt recovery initially read the whole source file to retain its first 24 lines; no compliance claim erases that read. Earlier task histories/receipts remain unchanged in their existing locations.

Important evidence is committed in the adjacent directory, sealed by seal.json. It includes raw native output and records, terminal, cleanup, preflight, all commands/identities, measured admission/standing manifests, source excerpt and the supervisor recovery recipe. Original operational copies remain under /tmp/maelstrom-event-observer-native-qualification-oct24/ops. For review restore this task branch, verify the seal, and use the pinned standing paths; no ignored Wasm copy is required or implied. Native execution is already consumed.

No assigned box exists. bx_69aem736 was not stopped or otherwise mutated; historical bx_qp99542b was untouched. Coordinator retains host lifecycle ownership. No authoritative new box-state query was performed by this task.

Publication payload 51161eeeeb061d741e4f2455b3a08ba999cb03b7 was pushed and verified through the exact trusted SSH configuration. Initial commit creation failed because the fresh checkout lacked author identity; copying the donor's local Codex <codex@users.noreply.github.com> settings into this owned checkout resolved it. The first failure and changed-configuration success remain in the publication receipts. Final accounting/publication receipts are a separate follow-up commit; they neither modify the test nor repeat native execution.