Skip to content

v0.86 MEMLAYER3 (#1145): the refuting command held, but the downstream's own numbers refute the lane's scope - #1526

Closed
avrabe wants to merge 4 commits into
mainfrom
v086-memlayer3
Closed

avrabe wants to merge 4 commits into
mainfrom
v086-memlayer3

Conversation

@avrabe

@avrabe avrabe commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

The refuting command ran first, and did not refute

The v0.84 design answer still stands in the artifact tree, the bounding assertion that memory 0 carries no suffixed alias still holds, and the call-site count still reads nine.

The correction this lane owes on itself

The first draft of this PR took the reporter's fit measurement — two domains reserving 64 + 128 KiB against boards of 8, 64 and 96 KiB — as refuting the premise that the layering is the whole remaining blocker, and recommended doing the sizing half first.

That was wrong, and the dates settle it. Their comment is dated 2026-10-06 and names the version they measured. The release that honours a declared byte page on the relocatable path was tagged 2026-10-09 — three days later — and its changelog entry credits this same reporter.

Verified against this tree rather than inferred:

  • the capability is reachable on exactly the flag set their transcript shows them compiling with (--relocatable);
  • each memory is sized by its own declared page, through the twinned byte getters;
  • __synth_mem_size_k and __synth_mem_region_k are emitted for every memory, not memory 0 alone.

So the fit number is stale by one release, the premise holds, and the layering is the remaining blocker — which is what the artifact said before this lane argued with it. The order follows from the shipped tree, not from a judgement: sizing is done, layering is next.

Worth naming, because it nearly shipped: the sizing issue is still open even though its capability shipped, so reading the issue state alone gives the wrong answer here. The tree had to be read. The apparent tension between the reporter's two asks is likewise resolved, not open — the issue itself argued the declared size was the one worth trusting, because an embedder need not believe a derivation, and the declared one is what shipped.

The four code measurements, which stand

1 — the nine call sites are the wrong target. The memory index is carried by a wrapper variant, not a field; the decoder wraps a load/store only when its memarg names a non-default memory, so memory 0 keeps the bare variants and single-memory streams stay bit-identical by construction. The selector's envelope arm spans 152 lines with zero references to the static-data classifier — it relocates through its own per-memory region symbol, and neither helper it calls reaches the classifier. All nine sites lie before that arm begins.

2 — the classification window is already memory-0-scoped. Upper bound: the first declared memory's initial size (all_memories.first() in the compile driver, the value handed to the selector's native-pointer setter). Lower bound: the stack-pointer global's initializer.

3 — a narrowed symbol claim. A search for the full region-symbol name cannot contain a prefix test spelled with a shorter one. Re-run over the short spellings, every match compares for equality, and a prefix form appears for no suffixed name at all. Positive control: the same spellings return 11 real matches elsewhere in the same crates. Scoped to shipped crate code — this lane did not locate the post-link in-range oracle and asserts nothing about it.

4 — now the sharpest remaining bound, promoted from a footnote. The envelope arm covers the i32 access family only (8 variants), so an i64, f32, f64 or v128 access on memory k still declines loudly. Lifting the two refusals would move the blocker for any module whose memory k is touched at another width — and nothing here establishes which widths the reporter's two-domain module uses.

What is actually costing the reporter

Found by verifying a held draft rather than by reading code: the reply that says the sizing shipped has been drafted and held for three releases, while their thread still carries the stale fit framing. Its claims were re-verified against this release's tree and they hold; only its version stamp is behind. A correct answer nobody sent is worth nothing to them.

What this lane deliberately did not do

Neither refusal is lifted. Both were located — a CLI pre-flight and the selector's own arm, the pre-flight being the one their transcript shows them hitting. Lifting them is gated on an execution differential under their exact flags, which per this repo's own rule lands first.

Conduct rule 4, stated against this lane

Measuring and correcting a scope is not progress on an externally reported defect that is still open. Nothing the reporter runs behaves differently after this release than before it.

Refs #1145
Refs #1441

🤖 Generated with Claude Code

https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L

avrabe and others added 4 commits October 14, 2026 07:04
…m's own numbers refute the lane's scope

The refuting command ran first and did NOT refute on its own terms: the v0.84
design answer still stands in the artifact tree, the bounding assertion that
memory 0 carries no suffixed alias still holds, and the call-site count still
reads nine.

Four measurements then re-scope the blocker:

1. The nine call sites are the WRONG target. The memory index is carried by a
   wrapper variant, not a field; the decoder wraps a load/store only when its
   memarg names a non-default memory. The selector's envelope arm contains zero
   references to the static-data classifier and relocates through its own
   per-memory region symbol instead. All nine sites lie before that arm begins,
   on the memory-0 path the decoder guarantees never carries memory k.

2. The classification window is already memory-0-scoped - its upper bound comes
   from the first declared memory and its lower bound from the stack-pointer
   global - so a second memory cannot widen it. Every shipped match on the
   region symbol is an equality, not a prefix.

3. The lane's premise that the layering is the whole remaining blocker is
   refuted by the reporter's own latest comment: granting the layering, his two
   domains reserve 64 KiB + 128 KiB and his three targets have 8, 64 and 96, so
   the image fits none of them and phase two would land unshippable. He asks for
   a judgement on the order; the deciding half is already an open issue of its
   own, scoped a release ago, so extent sizing goes first.

4. The envelope arm covers the i32 access family only, so lifting the two
   refusals would move the blocker for any module touching memory k at another
   width.

Neither refusal is lifted. Both were located - a CLI pre-flight and the
selector arm - and lifting them is gated on an execution differential under the
reporter's exact flags, which per this repo's own rule lands first; building it
now would gate the half the measurement says to do second.

Conduct rule 4 is stated against this lane: a corrected scope is not progress on
an open externally reported defect. Nothing the reporter runs behaves
differently after this release.

Refs #1145
Refs #1441

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
R15 reds a lane-branch `landed:` that does not name its own issue alongside
the delivering PR, because `_acknowledge` resolves the last ref to the issue
before the squash. Also names the second-half issue explicitly rather than in
words, so a reader can follow the ordering conclusion.

Refs #1145

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
1. PRONOUNS. The reporter's pronouns are unstated and the first draft used
   gendered ones throughout. They/them, or "the reporter".

2. A CITATION THAT WAS WRONG because the search that produced it was
   truncated. The static-data window's upper bound is assigned from
   `all_memories.first()` on the compile driver's backend-config path, and
   that is the value handed to the selector's native-pointer setter. The line
   first cited was a different variable on the linker-script path. The claim
   survives; its evidence did not, until now.

3. A SYMBOL CLAIM NARROWED to what was actually measured. A search for the
   full region-symbol name cannot contain a prefix test spelled with a shorter
   one, so the first search could not have found its own counter-example.
   Re-run over the short spellings the answer holds, with a positive control
   proving the search form finds eleven real prefix matches elsewhere. The
   claim is now scoped to shipped crate code, and says plainly that this lane
   did not locate the post-link oracle and asserts nothing about it.

4. DISPOSITION partial, not refuted. The done-when has two delivery branches
   and this lane met the second one; `refuted` also sits in the set that
   authorises issue closure, which is the wrong signal on an open external
   blocker.

Also: the order the reporter asked about is recorded as a measured
RECOMMENDATION for the maintainer, not a ruling, and a real TENSION between two
of the reporter's own asks is recorded rather than resolved - #1441 declines a
derived used-extent symbol in favour of the declared page size, while the later
comment asks for used-extent sizing.

Refs #1145

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
…s the release that fixed it

The first reading of this artifact took the reporter's fit measurement - two
domains reserving 64 + 128 KiB against boards of 8, 64 and 96 - as refuting the
premise that the layering is the whole remaining blocker, and recommended doing
the sizing half first.

THAT IS WRONG, and the dates settle it. Their comment is dated 2026-10-06 and
names the version they measured. The release that HONOURS a declared byte page
on the relocatable path was tagged 2026-10-09, three days later, and its
changelog entry credits this same reporter. Verified against this tree, not
inferred: the capability is reachable on exactly the flag set their transcript
shows them compiling with, each memory is sized by its OWN declared page through
the twinned byte getters, and the per-memory size and PMSA-extent symbols are
emitted for every memory rather than for memory 0 alone.

So the fit number is stale by one release, the premise HOLDS, and the layering
IS the remaining blocker - which is what the artifact said before this lane
argued with it. The order follows from the shipped tree rather than from a
judgement: sizing is done, layering is next.

Note the trap this fell into and nearly shipped: the sizing issue is still OPEN
even though its capability shipped, so reading the issue STATE alone gives the
wrong answer. The tree had to be read. The apparent tension between the
reporter's two asks is likewise RESOLVED, not open - the issue itself argued the
declared size was the one worth trusting, and the declared one is what shipped.

The four code measurements are unaffected and stand. The i32-only phase-one
reach is promoted from a footnote to the sharpest remaining bound.

Added: the thing actually costing the reporter is that the drafted reply SAYING
the sizing shipped has been held for three releases while their thread still
carries the stale framing. Its claims were re-verified against this tree and
they hold; only its version stamp is behind.

Refs #1145

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@avrabe

avrabe commented Oct 14, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #1537, which carries this branch's content in full.

Why: a dependabot auto-merge moved main and put every lane PR behind=1. The merge gate's currency check (rev-list --count head..base must be zero) means merging any one lane PR re-stales the rest, so the six lanes were forced sequential — six rebases and six full CI cycles, with three more auto-merge-enabled dependabot PRs still queued to move main again.

The consolidation was verified by simulation before being chosen: the whole wave applied to a detached worktree off origin/main, the single ci.yml conflict resolved with both steps kept, and gated there at no CI cost — status_evidence 0 failures, claim_check 75/75, verdict_prose clean, and the window anti-vacuity guard untripped.

Nothing was dropped. The artifact records are byte-identical apart from the PR number they name, plus one correction the simulation surfaced: SPELLSCAN now carries issue-scope: outlives, because #1515's own subject is the SELFTEST2 vacuity and that lane is partial.

@avrabe avrabe closed this Oct 14, 2026
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