Skip to content

chore(rivet): flip RQ-62-TABLEDANGLE to implemented — the hole was worse than the artifact predicted - #1140

Merged
avrabe merged 1 commit into
mainfrom
chore/flip-tabledangle-1102
Sep 4, 2026
Merged

chore(rivet): flip RQ-62-TABLEDANGLE to implemented — the hole was worse than the artifact predicted#1140
avrabe merged 1 commit into
mainfrom
chore/flip-tabledangle-1102

Conversation

@avrabe

@avrabe avrabe commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

#1138 closed the #1102 residual. Flipping with the evidence, because the finding is sharper than the artifact anticipated.

The hole was a different and worse failure mode

#1102's form was an object that could not link. This one links clean:

ARM Thumb-2 / A32 --relocatable
  exit 0 · object written · UNDEF symbols: NONE
  arm-none-eabi-ld -> links without complaint
  func_1 (the DECLINED fn) present? NO — code and symbol in no object at all

So the dispatch table gets a slot no embedder can populate, and the call executes whatever that region holds. #1102 was at least loud at link time; this was silent all the way to execution. Reproduced independently on pre-fix main before merging, reading the symtab by SHT_SYMTAB type (the ARM builder names its symtab with an empty name, so a name-based read wrongly reports "no symtab").

The dynamic index is load-bearing

With i32.const 0, the ARM relocatable path devirtualizes the dispatch into a direct call and the table never materializes — a constant-index fixture finds nothing. That is why this survived #1104.

Reported per backend, not generalised

path today
ARM Thumb-2 / A32 --relocatable the live hole — now refused
ARM --cortex-m self-contained already refused (#275 slot-precise bail, preserved verbatim)
RV32 unreachable — call_indirect declines upstream
aarch64 already refused (#851/#1013 builder, kept as defense-in-depth)

The failure this artifact exists to prevent is exactly #1102's own history: fixed on aarch64 (#1013), left live on RV32 for a release, because nobody checked the others.

Two things worth noting

The gate keys on funcref_region_slots + the op stream, so #1116's index-label completeness claim is neither reused nor extended — an extension would have needed its own compile-and-read verification.

The RV32 leg is pinned bidirectionally: if RV32 ever gains call_indirect, the test goes red and forces the table question to be re-answered rather than inherited.

Sweep control: all 171 repro fixtures compiled under the exact corpus leg, 0 hit the new gate, EXPECTED_DECLINES untouched.

On this commit

My first attempt added a second landed: key beside the lane's, and status_evidence_check refused it — "duplicate-key defect in a release file (#1059)". That is #1059's own rule firing on the coordinator, which is the intended direction. Merged into one field rather than silenced.

Refs #1102

…rse than the artifact predicted

#1138 closed the #1102 residual. Flipping with the evidence, because the finding
is sharper than the artifact anticipated and should not live only in a PR body.

THE HOLE WAS A DIFFERENT AND WORSE FAILURE MODE. #1102's form was an object that
could not LINK. This one LINKS CLEAN: ARM Thumb-2 and A32 --relocatable, exit 0,
object written, `UNDEF symbols: NONE`, `arm-none-eabi-ld` links it without
complaint — because the declined function's code AND symbol are in NO OBJECT AT
ALL. The dispatch table gets a slot no embedder can populate, and the call
executes whatever that region holds. #1102 was at least loud at link time; this
was silent all the way to execution. Reproduced independently on pre-fix main
before merging, reading the symtab by SHT_SYMTAB TYPE (the ARM builder names its
symtab with an EMPTY name, so a name-based read wrongly reports "no symtab").

THE DYNAMIC INDEX IS LOAD-BEARING, which is why this survived: with
`i32.const 0` the ARM relocatable path devirtualizes the dispatch into a direct
call and the table never materializes, so a constant-index fixture finds nothing.

Suspicion held for exactly 2 of 5 paths, reported per backend rather than
generalised — the failure this artifact exists to prevent is precisely the
#1102 history of fixing aarch64 (#1013) and leaving RV32 live for a release
because nobody checked the others.

The RV32 leg is pinned BIDIRECTIONALLY, so if RV32 ever gains `call_indirect`
the test goes red and forces the table question to be re-answered rather than
inherited. Sweep control: all 171 repro fixtures compiled under the exact
arm_corpus_sweep_973 leg, 0 hit the new gate, EXPECTED_DECLINES untouched.

Verified on merged main: both previously-silent paths exit 1, write no object,
and name the dead slot precisely ("slot 1 -> function 1").

NOTE ON THIS COMMIT: my first attempt added a SECOND `landed:` key beside the
lane's, and `status_evidence_check` refused it — "duplicate-key defect in a
release file (#1059)". That is #1059's own rule firing on the coordinator, which
is the intended direction. Merged into one field rather than silenced.

Refs #1102

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

codecov Bot commented Sep 3, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

avrabe added a commit that referenced this pull request Sep 3, 2026
…an discarding it

My duplicate-key fix picked a winner by LINE LENGTH, which is arbitrary and
dropped the fact that mattered — that the artifact closed on the integrator's
confirmation rather than on our assessment. The lane's field described the
delivery; mine described the closure basis. Both belong, so they are merged
instead of one being chosen.

The same heuristic ran on RQ-62-TABLEDANGLE (in PR #1140, unmerged) — checked,
and there it kept the richer field, so no loss. Recorded because 'resolve a
duplicate by keeping the longer string' is a bad rule that happened to work
once and not twice.

Refs #1131
avrabe added a commit that referenced this pull request Sep 4, 2026
…and add the sentence they asked for (#1141)

* chore(rivet): close RQ-62-EMBEDDER on the integrator's confirmation, and add the sentence they asked for

jess confirmed on #1131 that the contract unblocks the RT1176 cascade: "The
document is sufficient. I audited jess's existing harness against it line by
line and found no ambiguity I had to resolve by guessing." The artifact was
held open after the code landed precisely so this clause closed on THEIR
assessment rather than ours.

THE DOCUMENT CAUGHT TWO LATENT DEFECTS IN A CONSUMER THAT WAS ALREADY GREEN:

  1. They had read R11 out of synth's self-contained reset handler and treated
     it as authoritative — the exact method category (c) disclaims. That image
     carries TWO linear-memory bases (OPTIMIZED_LINMEM_BASE = 0x2000_0100,
     0x100 above the handler's R11). A 1-in-2 guess, won.
  2. Their C shim happened to compile to a bare `b.w` tail-branch, so GCC never
     allocated R11 as a frame pointer — conformance "by optimisation outcome,
     not by conformance". One more local variable and it would have silently
     produced a wrong linear-memory base on a flight control loop.

Both now fixed on their side with -ffixed-r9/r10/r11 plus an assertion over
EMITTED code rather than over the flag.

CATEGORY (c) EXTENDED AT THEIR REQUEST with the sentence they say they would
most have wanted three days earlier: A WORKING RESULT DOES NOT VERIFY THE
METHOD THAT PRODUCED IT. Their harness matched a SIL reference bit-exact, which
felt like confirmation and was not — it only meant the reading was not
DETECTABLY wrong on that input.

Also recorded honestly in verified-by: two of my three potency attempts on the
audit gate were INVALID (one failed environmentally in both control and
mutation, discriminating nothing; the other mutated a fact the doc explicitly
disclaims). Only the third was a real test.

RESIDUAL, now jess's top-priority ask on #1132: prose is not a gate for the
EMBEDDER's side. They were wrong-but-green in two independent places and found
it only by reading the doc afterwards. A mechanical check is tracked separately.

(This commit's first attempt added a SECOND `landed:` key and
status_evidence_check refused it — #1059's rule firing on the coordinator for
the second time today. Merged rather than silenced.)

Refs #1131

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

* chore(rivet): merge the closure fact into EMBEDDER's landed rather than discarding it

My duplicate-key fix picked a winner by LINE LENGTH, which is arbitrary and
dropped the fact that mattered — that the artifact closed on the integrator's
confirmation rather than on our assessment. The lane's field described the
delivery; mine described the closure basis. Both belong, so they are merged
instead of one being chosen.

The same heuristic ran on RQ-62-TABLEDANGLE (in PR #1140, unmerged) — checked,
and there it kept the richer field, so no loss. Recorded because 'resolve a
duplicate by keeping the longer string' is a bad rule that happened to work
once and not twice.

Refs #1131

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
avrabe added a commit that referenced this pull request Sep 4, 2026
…ommit exactly as designed (#1147)

Merging #1144 turned main red on R10:

  FAIL R10: delivery-shaped commit in the release window is attributable to NO
  release artifact: 'fix(ci): authenticate the federated externals sync ...' —
  no known artifact id or issue number in the subject, and no artifact's
  `landed:`/`verified-by:` names its PR (#1119: work landed, every artifact
  silent).

That rule shipped ten commits ago in #1124, and this is the first time it has
fired on real work. It fired on MINE, which is the right direction: I merged a
CI fix with no artifact, and the gate refused to let the release plan stay
silent about it. Fixed by creating the artifact, not by exempting the commit.

RQ-62-FEDAUTH records the finding, which is worth more than the fix:

THE ERROR MESSAGE ACTIVELY MISLEADS. "could not read Username for
https://github.com" reads as a permissions failure. All seven siblings are
PUBLIC, so an anonymous clone needs no credentials — git only prompts AFTER the
transport refuses, and a throttled anonymous response on a tty-less runner
surfaces as "No such device or address". The cause is a rate limiter on
unauthenticated traffic, hardest from datacenter address space, which is where
the self-hosted fleet lives.

THE PASSES DO NOT PROVE THE FIX, recorded so nobody later claims they did.
#1141 and #1142 passed WITHOUT it at 21:25; #1140 failed without it at 06:14;
#1144 passed with it at 21:29. Every failure sits in one contiguous window and
everything outside succeeds — the limiter eased on its own. The fix is still
right for a reason those passes do not show: it removes the dependence on which
side of a window a run lands.

AN INTERMITTENT LIMITER IS WORSE FOR SIGNAL THAN A PERMANENT ONE. A job that
flaps teaches maintainers to stop reading it — which is precisely what happened:
I described this job's failure from memory twice in the org-wide review and was
wrong both times.

What the job got right and keeps: advisory so nothing was blocked, and it FAILS
CLOSED — the non-vacuity guard was skipped rather than passing vacuously, the
#1012 lesson working as designed.

ARTIFACT_FLOOR re-derived at 519 with `rivet list`.

Refs #1143, #1119, #1062


Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@avrabe
avrabe merged commit 79ee431 into main Sep 4, 2026
59 of 60 checks passed
@avrabe
avrabe deleted the chore/flip-tabledangle-1102 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