6.6 KiB
Completion record ABI recovery
Static handoff only. The provenance index is
verify/results/research-completion-abi/reva-2026-09-09-index.md; the regenerated instruction
capture and interpretation are respectively
verify/results/research-completion-abi/objdump-2026-09-09-ownership.txt and
verify/results/research-completion-abi/recovered-static.md. The complete dedup/helper repair is
verify/results/research-completion-abi/objdump-2026-09-09-dedup-helper.txt; its first-window raw
provenance is superseded by the paired captures and identity record in
verify/results/research-completion-abi/objdump-2026-09-10-boundary-repair.md under Astra decision
d-d2a9b8be6399a6abaa0e05a5. Input identity is dumps/sots.exe,
SHA-256 970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841 / MD5
9969481c39f4b33a8a21c48b62abee4c.
The ownership archive's terminal-byte provenance is likewise superseded by the complete package
verify/results/research-completion-abi/run-79357a65226f61d6a86c042d/ under Astra decision
d-d4c494ba02ada278030ef473. Its six narrow/wide pairs, raw section-byte checks and full ten-window
audit establish the encoded return immediates while preserving the static-only limitation. The
package found three additional truncated historical stops (ObservedTech append/reallocator and
string allocation/replacement); their widened streams are now the byte authority. No archive
production-history inference or live-safety claim is made.
Implementable machine boundaries recovered
0x008562a0: ObservedTech default constructor, ECX receiver, EAX return, plainret.0x007b7320: ObservedTech vector append, ECX receiver plus one stack word,ret 4; stride0x2c. Its copy helper is0x0079a150(cdecl-style allocator/destination/source stack arguments), which copy-constructs the embedded string rather than copying a vector element header. Capacity growth is0x007b5820->0x007b34e0->0x0057e590.0x0057e590calls0x00924fb6withcount * 0x2c; reallocation destroys every old element via virtual slot 0 with zero and frees the array through0x00924faa. These are MSVCR100 scalar-new and scalar-delete import thunks, not clean-room allocator operations.0x0086c580: PlayerEvent vector append, ECX receiver plus one stack word,ret 4; stride0x74. It grows via0x00869500and copy-constructs through0x007693f0(ECX destination, stack source, EAX destination return, ret 4), independently assigning all three strings.0x0061ae90releases each long string via0x00924faawhen capacity is>= 0x10.0x004249a0(reached by0x00425430assignment) allocates through0x00924fb6and releases a prior long destination buffer through0x00924faa. A temporary long string is therefore not transferable by raw header copy.0x00885380: get-or-create TurnEvents bucket, ECX EventStorage receiver plus stack turn, EAX bucket return,ret 4. It returns the last existing matching turn. On absence it appends a deep copy of a zero/empty stack bucket through0x00884cb0, then writes the stored turn.0x00884cb0: outer TurnEvents vector append, ECX vector receiver plus stack source,ret 4, stride0x18. Full-capacity growth is0x008841a0->0x00883a60; allocation is0x006e8f50->0x00924fb6withcount * 0x18. Existing buckets are copy-constructed by0x0077fed0, including an independently allocated/copied nested PlayerEvent vector via0x00779850->0x0078af40(count * 0x74) ->0x007725a0->0x007693f0.- TurnEvents virtual slot zero resolves from vtable
0x00a0f07cto0x0062e120. It destroys the nested vector through0x00629580; that destroys every0x74PlayerEvent, frees the nested block, and zeros its three pointers. Static unwind edges clean partial PlayerEvent and TurnEvents ranges and free the new outer block, but no allocation failure was executed live.
Ordering / visible effects
RecordObservedTech's append predicate is name absence, not capacity. A matching existing record
keeps first-turn/name and updates last-turn/with mask. 0x00825d40 scans a bucket's events in
0x74 steps, checking action, location, three floats, message and image before passing both
description strings to 0x0046f8c0. Fresh paired-boundary instructions establish that helper as
caller-cleaned bool string_not_equal(stored, candidate): it returns one for any byte/length
difference and zero for equality, handling each operand's inline/heap representation at capacity
0x10. FindDuplicate reaches the match return only on zero, so EvDsc equality is required and a
description-only difference does not deduplicate. This statically contradicts the inherited
description-omission claim; decision d-2ff30c9f5355116bea822924 required the now-archived complete
branch/helper repair. The later provenance correction does not itself prove these semantics: an
independent verifier must reproduce the repaired package and predeclared falsifiers. The wrapper
returns the first element equal in all fields and writes nothing.
0x00879eb0 prunes only a leading
stale run (EvTurn < turn-50), deep-shifts from the run's last stale element, and therefore removes
n-1: one stale bucket survives, a single stale bucket causes no write, and stale buckets after a
fresh bucket are not inspected. The no-duplicate EventStorage path remains distinct from event-vector
capacity: it is the path that appends a 0x74 PlayerEvent and changes IDs/vector contents. Caller
text/position/action/defaulting and the exact PostEvent write order remain required inputs/effects.
No RNG draw occurs in the recovered bucket, duplicate, prune, copy, allocation, or destruction
boundaries.
Original/runtime dependencies and limits
Any original-assisted allocation, string assignment or deletion must retain allocator-family
compatibility: the recovered calls target the original MSVCR100 import thunks. A standalone
replacement needs its own coherent allocation/destruction boundary; calling these original helpers
is an original dependency, not independent replacement. Calling 0x0046f8c0 likewise retains an
original string-layout/comparison dependency, though its equality behavior is implementable without
allocation in a standalone boundary. Required unavailable proof inputs are a safe
long-string/full-capacity pre/post fixture (or equivalent archived trace), same-bucket
equal/description-only-different event fixtures covering short and long strings, exact exceptional
cleanup outcomes under a live throw, and independent reproduction of the named static windows and
falsifiers. This handoff makes no live
allocator-safety, runtime event-construction, or replacement-acceptance claim.