Parent: #467.
At 969c0f5, an executed ReleaseSafe/Darwin admission probe warms three required-bytecode functions 64 times. Node and zig-js both return [3,"a","a"] for sum, early-return and break variants over {a:1,b:2}. The sum and early-return functions publish optimizer artifacts with non-continuation side exits; the break function publishes no optimizer artifact. Merely finding an enum_keys operation descriptor is not proof that it executes natively: a direct plan/lowering probe exits at bytecode origin 1, before enum_keys, with its one input still on the recovered operand stack.
Implement owned for-in effects through the optimizer, including enum_keys, one-candidate enum_next, and enum_end_completion. Enumeration returns multiple values: target/key snapshot/index for preparation, and an updated index plus key/presence/candidate flags for each candidate. SSA, native result transport, exact continuations and moving-GC maps must describe all of them. Do not invoke a user-visible effect twice to recover another result or replace it with an unrooted private tuple.
Acceptance:
- Native artifact/admission witnesses prove enumeration effects execute, including exhaustion, break, early return, throw and finally completion.
- Forced optimizer-off/on exact differentials cover primitive/null inputs, prototype shadowing, deleted candidates, proxy callback ordering and exceptions, changing loop targets, captured lexical iteration bindings and nested enumeration.
- Each candidate preserves the existing dispatch/watchdog/termination/GC polling obligations; callback completion resumes after the completed effect without replay.
- Moving GC traces every target/snapshot/key/result across proxy reentry and suspension of a native caller.
- Serialized/no-GIL Debug, ReleaseSafe and unsuppressed TSan controls pass, with OOM/fault recovery and exact-parent test262 for-in/proxy/control subtrees.
- Existing full corpus and seeded fuzz gates pass without exclusions or relaxed budgets.
No source edits have been made for this boundary yet; the reproduced limitation is optimizer admission, not a JavaScript result mismatch.