Skip to content

fix(eval): GT-seed scoping scan must flag _dynRange/_offsetAddr (#66 helpers)#72

Merged
ebootheee merged 1 commit into
mainfrom
fix/eval-dynrange-scan
Jun 10, 2026
Merged

fix(eval): GT-seed scoping scan must flag _dynRange/_offsetAddr (#66 helpers)#72
ebootheee merged 1 commit into
mainfrom
fix/eval-dynrange-scan

Conversation

@ebootheee

Copy link
Copy Markdown
Owner

What

Follow-up to #69/#70, found live during the a1-66c canonical eval: the v0.3.1 emitter (#66) lowers computed-endpoint ranges through _dynRange/_offsetAddr with no bare _offset( call, so per-sheet-eval's dynamic-read scan silently approved GT-seed scoping on exactly the builds where ranges are runtime-addressed. Markers added.

Today this is defense-in-depth rather than a live corruption hole: a sheet-qualified computed-endpoint anchor refuses to parse (post-#66 honest NaN — filed #71), so _dynRange reads are same-sheet-only and cluster-scope warm-starts cover them. But the scan must refuse to scope what it cannot statically bound — when #71 closes, this is already correct.

Tests

New MODEL C in test-row-chunked-modules.mjs: a cluster whose only dynamic construct is a same-sheet computed-endpoint range — asserts the fixture emits _dynRange with no bare _offset( (else it discriminates nothing) and that the scan refuses to scope. Negative-controlled via stash (red pre-fix on exactly the scan assertion). 22/22; targeted suites green.

🤖 Generated with Claude Code

 helpers)

The v0.3.1 emitter lowers computed-endpoint ranges (ref:OFFSET(...)) through
_dynRange/_offsetAddr with NO bare _offset( call, so per-sheet-eval's
dynamic-read scan — which only knew _offset(/ctx.get(String( — silently
approved GT-seed scoping on exactly the builds where ranges are runtime-
addressed. Observed live on the a1-66c canonical eval (scan found no _offset(,
scoped the cluster seed).

Today this is defense-in-depth, not a live corruption hole: a sheet-qualified
computed-endpoint anchor (Ext!E1:OFFSET(...)) refuses to parse (honest NaN,
filed #71), so _dynRange reads are same-sheet-only and cluster-scope
warm-starts cover them. But the scan must refuse to scope what it cannot
statically bound — when #71 closes, this is already correct.

New MODEL C in test-row-chunked-modules.mjs: a cluster whose ONLY dynamic
construct is a same-sheet computed-endpoint range — asserts the scan refuses
to scope (red pre-fix via stash) and the fixture emits _dynRange with no bare
_offset( (else it discriminates nothing). 22/22.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ebootheee ebootheee merged commit 626e9bb into main Jun 10, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant