Parent: #336 Related: #133, #146, #350, #351, #357
The explicit moving-GC boundary currently rejects every context whose baseline JIT is enabled, even when the realm is fully quiescent. That is stricter than the current native tier requires: generated code embeds no movable GC pointers, compiled code and tier metadata are arena/native-owned, numeric scratch is pointer-free, and a live NativeFrame can exist only under an active interpreter—which compaction already rejects.
Scope:
- remove the blanket JIT-enabled rejection from Context.compactGarbage while retaining the active-interpreter, running-thread, conservative-stack, concurrent collector, and relocation-token gates;
- machine-check the narrower fail-closed contract in the relocation inventory;
- add a supported-architecture regression that compiles and executes a genuine numeric baseline tier, moves the rooted function/object graph at a quiescent point, and proves the same native tier executes correctly afterward;
- update the Zig, C, Objective-C, relocation, JIT, API, and concise README documentation;
- keep movement during active native execution unsupported until precise stack maps / a complete stop-the-world rewrite protocol exist.
Acceptance:
- quiescent compaction in a JIT-enabled precise-GC context returns compacted or no_candidates rather than unsupported;
- a ready native tier remains ready and is entered after relocation;
- all existing active-interpreter and conservative/native-stack rejection witnesses remain green;
- Debug, ReleaseSafe, and TSan focused evidence is leak-free.