mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-11-08 08:44:37 +08:00
canDynCheckTo answered false at every recursion back-edge in a record or array, so a type whose checked graph re-enters itself had no checked extraction at all. That is ordinary in a callback-options API: a context's method takes an options object whose callback receives the same context, so passing an unknown value into the record raised SC1100 even though every leaf is checkable — pi's LoadExtensionsResult graph (extension commands whose handlers take the extension context) is the census shape. Answer the back-edge coinductively, as the composite dynFrom walk already does for recursive shapes: mark the in-progress key (the wrapper's own success key) for the duration of the frame and verify every reachable field at its first visit. A field that fails anywhere still fails the frame, and the existing failure path keeps dropping dependent conversion results, so a cycle cannot hide an unsupported sibling. The `unsafe` unit fixture now carries a genuinely unsupported sibling; its former Map sibling is inside the check domain, so the back-edge refusal was what made it look unsafe. Only the static conversion domain widens: a program that compiled before compiles to the same code, and the runtime extraction still walks the actual value, throwing a catchable TypeError on a mismatch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>