Skip to content

plan(v0.62): reach stays but stops being the headline, and gets a gating rule (9 -> 10) - #1146

Merged
avrabe merged 1 commit into
mainfrom
chore/reach-gating-rule
Sep 4, 2026
Merged

plan(v0.62): reach stays but stops being the headline, and gets a gating rule (9 -> 10)#1146
avrabe merged 1 commit into
mainfrom
chore/reach-gating-rule

Conversation

@avrabe

@avrabe avrabe commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Resolving the fork jess opened on #1132, against the test "would it hurt anyone, or might others be in need of it".

Others might need it — so reach stays

jess measured synth's reach at 100% for the falcon cascade (5/5 stages on cortex-m7dp and cortex-m4f, bit-exact against relay's SIL reference on emulated RT1176) and argued the compile rate was never their binding constraint.

That is correct about jess, and it is n=1. Their pipeline is curated on a pinned toolchain; the 805-module census measures modules nobody curated for us. A consumer who hasn't filed yet cannot argue for themselves.

But "would it hurt anyone" has a real answer, and it is not no

#1072's own framing: "increasing reach converts latent encoder defects into reachable ones, and a backend that accepts 1.6% of real input has most of its encoder untested by real programs."

That is not a worry — it is what happened. The release-invisible immediate-range defect, where a NULL table slot passes the type check it must trap on, was latent only because those modules declined at module level before reaching the encoder. Widening acceptance made it live. We found it by going to look; a consumer would have found it by flying it.

The gating rule

Every reach increment ships with the oracle that makes the newly-accepted input safe, and the oracle lands first.

An accepted module that silently returns a wrong value is strictly worse for a consumer than a loud decline — that is synth's whole differentiator, and trading it for an acceptance percentage is the flattery the compliance-envelope section forbids. RQ-62-MVLOWER already had this shape; it now applies to multi-memory and AArch64 import dispatch too.

Headline demoted, work kept. The acceptance rate is published as the denominator beside capability claims, not as an objective.

New, and it takes the priority reach gives up

RQ-62-VERIFYEMBED (must). #1131 made our side of the ABI checkable; nothing checks the consumer's. jess conformed correctly by luck on two independent counts — a 1-in-2 guess on which of two linear-memory bases was authoritative, and a C shim that happened to compile to a bare tail-branch so GCC never allocated R11 as a frame pointer — and found both only by reading the document after their code was green.

The ask: a check that refuses an embedder object writing R9/R10/R11. They've offered to validate any prototype against a real fused image on emulated RT1176 before we ship it.

Also recorded so it isn't re-litigated: the func_N alias does not solve the @-in-export-name papercut. Measured — it is emitted STB_LOCAL, so an external bl func_0 cannot resolve to it. jess's objcopy workaround is still load-bearing.

ARTIFACT_FLOOR 518 → 519, re-derived with rivet list.

Refs #242, #1132, #1131

…ing rule (9 -> 10)

Resolving the fork jess opened on #1132, against the maintainer's test: "would
it hurt anyone, or might others be in need of it".

OTHERS MIGHT NEED IT — SO REACH STAYS. jess measured synth's reach at 100% for
the falcon cascade (5/5 stages on cortex-m7dp AND cortex-m4f, bit-exact against
relay's SIL reference on emulated RT1176) and argued the compile rate was never
their binding constraint. That is correct about jess and is n=1: their pipeline
is curated on a pinned toolchain, while the 805-module census measures modules
nobody curated for us. A consumer who has not filed yet cannot argue for
themselves.

BUT "WOULD IT HURT ANYONE" HAS A REAL ANSWER, AND IT IS NOT NO. #1072's own
framing: "increasing reach converts latent encoder defects into reachable ones,
and a backend that accepts 1.6% of real input has most of its encoder untested
by real programs". That is not a worry, it is what happened — the
release-invisible immediate-range defect, where a NULL table slot passes the
type check it must trap on, was latent ONLY because those modules declined at
module level before reaching the encoder. Widening acceptance made it live. We
found it by going to look; a consumer would have found it by flying it.

SO THE GATING RULE, general rather than per-artifact: every reach increment
ships with the oracle that makes the newly-accepted input safe, and the oracle
lands FIRST. An accepted module that silently returns a wrong value is strictly
worse for a consumer than a loud decline — that is synth's whole
differentiator, and trading it for an acceptance percentage is the flattery the
compliance-envelope section forbids. RQ-62-MVLOWER already had this shape; it
now applies to multi-memory and AArch64 import dispatch too.

HEADLINE DEMOTED, WORK KEPT. The acceptance rate is published as the
DENOMINATOR beside capability claims, not as an objective.

NEW, AND IT TAKES THE PRIORITY REACH GIVES UP: RQ-62-VERIFYEMBED (must). The
embedder side of the ABI has no gate. #1131 made OUR side checkable; nothing
checks the consumer's. jess conformed correctly BY LUCK ON TWO INDEPENDENT
COUNTS — a 1-in-2 guess on which of two linear-memory bases was authoritative,
and a C shim that happened to compile to a bare tail-branch so GCC never
allocated R11 as a frame pointer — and found both only by reading the document
after their code was green. The ask is a check that refuses an embedder object
writing R9/R10/R11. They have offered to validate any prototype against a real
fused image on emulated RT1176 before we ship it.

Recorded in that artifact and worth not re-litigating: the `func_N` alias does
NOT solve the `@`-in-export-name papercut. Measured — it is emitted STB_LOCAL,
so an external `bl func_0` cannot resolve to it. jess's objcopy workaround is
still load-bearing.

ARTIFACT_FLOOR 518 -> 519, re-derived with `rivet list`.

Refs #242, #1132, #1131

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

codecov Bot commented Sep 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@avrabe
avrabe merged commit 9b86c0a into main Sep 4, 2026
60 checks passed
@avrabe
avrabe deleted the chore/reach-gating-rule branch September 4, 2026 14:59
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