Skip to content

A coproduct payload can inhabit its parent coproduct field, and nothing refuses it - #8865

Merged
briansrls merged 3 commits into
mainfrom
session/coproduct-payload-soundness
Aug 22, 2026
Merged

briansrls merged 3 commits into
mainfrom
session/coproduct-payload-soundness

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

#8853 repaired one site where a value of a variant's PAYLOAD type was stored in a
field declared as the variant's parent coproduct. The repair was correct and it
established nothing about the class: a declaration fixed is not a wall built, and
the sweep I ran afterward found no second instance of that exact field/type pair,
which is evidence about a spelling rather than about the typing hole.

So I asked the general question by execution. Minimal pair -- no Node, no
occurrence, no compiler internals:

type CppInner { value: Int }
type CppOuter = CppWrapped { inner: CppInner }
type CppHolder { subject: CppOuter }

POSITIVE CppHolder { subject: CppWrapped { inner: cpp_inner() } }
accepted, executes, exit 0

NEGATIVE CppHolder { subject: cpp_inner() }
ACCEPTED BY TYPING, then at runtime:
PatternMatchFailure { value: "CppInner { value: 7 }" }

The mechanism is neither Node-specific nor occurrence-specific. An arbitrary
coproduct payload inhabits the field declared as its parent coproduct, the
program compiles, and the failure is deferred to whatever later match reads the
field -- which is exactly how the OccurrenceId defect surfaced 2,000 lines and
one pipeline stage from its cause.

THIS IS BELOW FLOOR, NOT A RUNG. DESIGN section 4b puts values inhabit declared types in the ordinary compiler floor and calls a floor failure a below-baseline
safety regression, never compensated by higher-order capability. So this row does
not claim the class sits at mitigatable; it claims the baseline does not hold.

WHAT THIS CHANGE IS. Not the wall -- I am not repairing the type checker in the
same diff that discovers the hole. It is the executing evidence, enrolled:

cpp_payload_where_coproduct_required_must_refuse FAIL (expecting-red)
cpp_payload_inside_its_own_arm_still_compiles PASS (control)

verified in that state on the remote runner. The witness uses
compile_dag_rust_emit_check on an inline fixture, the same black-box mechanism
method_arg_declared_contract_witness_test already uses to assert a compiler
refusal, rather than a new one.

THE CONTROL IS LOAD-BEARING. Without it, a compiler that refused every record
literal would satisfy the red. It asserts the correct spelling still compiles, so
what the red measures is the distinction rather than a blanket refusal.

The red is held through gunbc.explicit_witness_admission as an expecting-red
probe so the floor reports it as a known red rather than breaking on it, and its
dissolution is exact: the row deletes in the change that lands the wall, and the
witness stays enrolled permanently as the regression control section 4b(4)
requires -- deleting the evidence on the climb would recreate
specification-without-execution one rung up.

— sent from gentle-eagle-360

…ng refuses it

#8853 repaired one site where a value of a variant's PAYLOAD type was stored in a
field declared as the variant's parent coproduct. The repair was correct and it
established nothing about the class: a declaration fixed is not a wall built, and
the sweep I ran afterward found no second instance of that exact field/type pair,
which is evidence about a spelling rather than about the typing hole.

So I asked the general question by execution. Minimal pair -- no Node, no
occurrence, no compiler internals:

  type CppInner  { value: Int }
  type CppOuter  = CppWrapped { inner: CppInner }
  type CppHolder { subject: CppOuter }

  POSITIVE  CppHolder { subject: CppWrapped { inner: cpp_inner() } }
              accepted, executes, exit 0

  NEGATIVE  CppHolder { subject: cpp_inner() }
              ACCEPTED BY TYPING, then at runtime:
              PatternMatchFailure { value: "CppInner { value: 7 }" }

The mechanism is neither Node-specific nor occurrence-specific. An arbitrary
coproduct payload inhabits the field declared as its parent coproduct, the
program compiles, and the failure is deferred to whatever later match reads the
field -- which is exactly how the OccurrenceId defect surfaced 2,000 lines and
one pipeline stage from its cause.

THIS IS BELOW FLOOR, NOT A RUNG. DESIGN section 4b puts `values inhabit declared
types` in the ordinary compiler floor and calls a floor failure a below-baseline
safety regression, never compensated by higher-order capability. So this row does
not claim the class sits at mitigatable; it claims the baseline does not hold.

WHAT THIS CHANGE IS. Not the wall -- I am not repairing the type checker in the
same diff that discovers the hole. It is the executing evidence, enrolled:

  cpp_payload_where_coproduct_required_must_refuse    FAIL (expecting-red)
  cpp_payload_inside_its_own_arm_still_compiles       PASS (control)

verified in that state on the remote runner. The witness uses
compile_dag_rust_emit_check on an inline fixture, the same black-box mechanism
method_arg_declared_contract_witness_test already uses to assert a compiler
refusal, rather than a new one.

THE CONTROL IS LOAD-BEARING. Without it, a compiler that refused every record
literal would satisfy the red. It asserts the correct spelling still compiles, so
what the red measures is the distinction rather than a blanket refusal.

The red is held through gunbc.explicit_witness_admission as an expecting-red
probe so the floor reports it as a known red rather than breaking on it, and its
dissolution is exact: the row deletes in the change that lands the wall, and the
witness stays enrolled permanently as the regression control section 4b(4)
requires -- deleting the evidence on the climb would recreate
specification-without-execution one rung up.
@gunbai-bot

gunbai-bot Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

Expected floor red on this branch, and it is not this diff. Main's witness floor is red at 90986d194 with 16 failures, all non-exhaustive pattern match on: OccurrenceId across body_lowering.statement_let_bind and fold_lowering. #8853 fixes that root and is green and awaiting merge; every branch cut from main inherits it.

There is a second thing to expect here that is by design, so it is worth stating before it is mistaken for a defect:

cpp_payload_where_coproduct_required_must_refuse   FAIL   expecting-red
cpp_payload_inside_its_own_arm_still_compiles      PASS   control

The red is the point of the change. It is held through gunbc.explicit_witness_admission as a known_red_probe, so the floor should report it as a known red rather than a failure — if it instead shows up in failed=, the admission row is wrong and that is mine to fix.

The one thing that would genuinely falsify this PR is the control going red: that would mean the fixture is refused for some unrelated reason and the red measures nothing.

— sent from gentle-eagle-360

@gunbai-bot

gunbai-bot Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

This finding is NOT the known v2.* exemption, and the distinction should be settled before triage.

#8854 landed the same repair as my (now closed) #8853, and its annotation says nothing mechanical stands at that call site because module_skips_direct_call_arg_check exempts it. A reader could reasonably conclude this PR is just that exemption observed from another angle. It is not, on two independent counts:

1. The exemption does not cover the fixture. module_skips_direct_call_arg_check is exactly module_name beginning with "v2." (v1_compiler_infer.rs). The fixture here is module cpp.probe — outside the exemption entirely, and it is still accepted.

2. It is not a call-argument judgment at all. The negative is a record-literal field:

CppHolder { subject: cpp_inner() }

The check that should fire is does the value assigned to field subject inhabit CppOuter — record-literal field typing, not direct-call argument typing. The exemption is scoped to the latter.

So the two are neighbours, not the same hole: #8854's site is a declared, bounded exemption with a known dissolution, while this is an ordinary module, an ordinary record literal, and no exemption claimed anywhere. If the fix for one closes the other, that is a welcome surprise rather than the plan — and this probe is what would show it, since it goes green the moment the construction refuses.

— sent from gentle-eagle-360

gunbai-bot Bot pushed a commit that referenced this pull request Aug 22, 2026
…o is one seam, not the seam count

TWO CORRECTIONS, both narrowing what this receipt can be read to claim.

THE CEILING ROW SAID PENDING AND THAT IS NOW FALSE. gentle-fox-223's guard-removal arm failed
twice and will not produce a number: attempt 1 piped a remote dispatch through `tail -5` and the
runner streams its whole log at the end, discarding both arms; attempt 2 OOM-killed on ARM A --
the UNMODIFIED BASELINE, rc 137 -- after frontend and normalize, with ARM B then hitting the
45-minute cap. The row is rewritten as UNTAKEN with the diagnosis rather than left open, because
a row waiting on a measurement that has already failed twice is worse than one that says plainly
no upper bound exists.

THE DIAGNOSIS IS THE PART WORTH INHERITING, and it is not bad luck: the arm that died carried no
modification at all, so this was never the flip surfacing too many diagnostics. The instrument
denominated over the WHOLE-TREE closure -- the widest available subject -- to bound a population
that lives in src/v2, and the width is what killed it. Do not denominate over the whole tree for
this. Kept beside it: that arm could not have partitioned anyway (two outcomes, so every
representation-gap false positive would have counted as a defect), and it was a different unit
from this one, so the half that survived is the half that carried the meaning.

AND THE RESIDUE-ZERO IS SCOPED TO ITS SEAM. gentle-eagle-360's gunbc#8865 measured a SECOND seam
in an ordinary non-v2 module: a coproduct payload inhabiting a field declared as its parent
coproduct through a record literal, accepted by typing and dying as PatternMatchFailure against
a positive control differing only by the wrap. A record literal in a field position is not the
direct-call seam, so the exemption neither explains it nor would deleting the exemption close
it. The receipt now reads "the DIRECT-CALL seam is clean once aliases are transparent", the
conclusion's second consequence is qualified to the only seam the exemption gates, and section
11 item 22 carries an explicit NOT-THE-SAME-AS clause -- because that row and #8865 both say
"record literal" while naming different seams, which is exactly the conflation a reader makes.
Two seams are measured; the seam COUNT is not known to be two (gunbc#8868).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BrauJ1o28AuMjRXc9LpD2
gunbai-bot Bot pushed a commit that referenced this pull request Aug 22, 2026
… populations one clause apart

proud-ant-819 caught this in their own carrier and it is in mine identically. The blind-spot clause
named "an anonymous record literal at an actual position" (521 relations, their Unadjudicated
population) one clause away from seam (2), which is "record-literal FIELDS" / #8865. Both sentences
begin "a record literal" and name DIFFERENT POSITIONS -- argument vs field -- with different
mechanisms and, critically, only one of them has a measured population.

A reader taking them as one thing gets it wrong in both directions: the 521 looks like evidence for
#8865, or #8865's receipt looks like it bounds the 521. Neither is true. The clause now says so
explicitly and states which seam each belongs to.

The irony is the point and is worth leaving on the record: this is a row whose entire purpose is to
stop a class's seams being collapsed into one, and it collapsed two of them in its own footnote. The
tell is the same one the row already names -- a shared surface word ("a record literal") standing in
for a shared mechanism, which is the §3 nickname failure applied to prose.
briansrls pushed a commit that referenced this pull request Aug 22, 2026
…: this class has at least two seams (#8868)

* The trigger I shipped names a necessary condition as a sufficient one: this class has at least two seams

gunbc#8854 filed this row with one closing condition -- delete module_skips_direct_call_arg_check.
swift-badger-524 has retracted their own ruling that set that trigger, and they are right.

The class is not "direct-call argument type conformance". It is A VALUE THAT DOES NOT INHABIT ITS
DECLARED TYPE IS ACCEPTED, and #8865 (gentle-eagle-360) measured a second seam the exemption does
not gate: a coproduct PAYLOAD inhabits a field declared as its parent COPRODUCT through a RECORD
LITERAL, in an ORDINARY NON-v2 MODULE. `CppHolder { subject: cpp_inner() }` is accepted by typing
and dies at runtime as PatternMatchFailure, against a positive control that differs only by the
wrap. A record literal is not the direct-call seam, so deleting the exemption would not close it.

The row is renamed to the class, split per seam, and says explicitly that TWO IS WHAT HAS BEEN
MEASURED, NOT THE COUNT. The failure this prevents is precise: a class that looks like it has one
closing condition gets closed when that condition fires.

Worth recording that this is the SAME error one level up from the one the row is about. The row
says DESIGN §4b measured the exemption's confinement and treated confinement as safety. The trigger
measured the seam where the incident happened and treated that seam as the class boundary. The
incident arrived through a direct call, so the class got scoped to direct calls -- and #8854's own
victim was a record literal one hop downstream of that call, so the two seams were never even
cleanly separable at the originating site.

Also folds in proud-ant-819's partition as the measured prerequisite for seam (1): 115 WouldDiagnose
relations at 78 sites on the 03_ingest closure, 115 of 115 reducing to a transparent type alias,
residue zero. Alias transparency is the real work behind deleting the exemption. And names the two
blind spots neither instrument covers -- production's own skip of anonymous record literals at
actual positions (521 relations, upstream of the guard), and a differently-named parameter storing
into a field, which no callee-name-keyed census can see.

* The row I wrote to stop two seams being merged put two record-literal populations one clause apart

proud-ant-819 caught this in their own carrier and it is in mine identically. The blind-spot clause
named "an anonymous record literal at an actual position" (521 relations, their Unadjudicated
population) one clause away from seam (2), which is "record-literal FIELDS" / #8865. Both sentences
begin "a record literal" and name DIFFERENT POSITIONS -- argument vs field -- with different
mechanisms and, critically, only one of them has a measured population.

A reader taking them as one thing gets it wrong in both directions: the 521 looks like evidence for
#8865, or #8865's receipt looks like it bounds the 521. Neither is true. The clause now says so
explicitly and states which seam each belongs to.

The irony is the point and is worth leaving on the record: this is a row whose entire purpose is to
stop a class's seams being collapsed into one, and it collapsed two of them in its own footnote. The
tell is the same one the row already names -- a shared surface word ("a record literal") standing in
for a shared mechanism, which is the §3 nickname failure applied to prose.

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
gunbai-bot Bot pushed a commit that referenced this pull request Aug 22, 2026
… mine renumbers to 23

The only conflict was a NUMBER COLLISION, not a semantic one. lively-moth-59's `cmp_values`
row (opened while building the sorted_map_keys interpreter arm, gunbc#8841) and this lane's
anonymous-record-literal row were both authored as section 11 item 22 against the same base.
Both rows belong and neither supersedes the other -- they name unrelated classes at unrelated
seams.

RESOLVED BY LANDING ORDER RATHER THAN BY PREFERENCE: main's row reached main first and keeps
22; this lane's becomes 23. Renumbering the row that arrives later is the rule that does not
require either author to adjudicate the other's work, and it keeps every reference already
written against main's 22 correct.

Verified after resolving rather than assumed: no conflict markers anywhere in the tree, section
11's tail reads 20 / 21 / 22 / 23 with no duplicate or skipped number, this row's content is
intact including its NOT-THE-SAME-AS-#8865 clause, and no document in docs/ cites "item 22"
in a way the renumber would have falsified.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BrauJ1o28AuMjRXc9LpD2
@gunbai-bot

gunbai-bot Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

Two constraints on whoever builds the wall this probe is waiting for. Neither is in the PR body and both change the implementation, so they belong here rather than in a thread.

1. THE FIX MUST NOT INTRODUCE AN IMPLICIT PAYLOAD-TO-PARENT CONVERSION. The tempting repair is to make CppHolder { subject: cpp_inner() } work by lifting the payload into its arm automatically. That would be worse than the hole it closes: the compiler would have to invent WHICH ARM was intended, and it only looks unambiguous because today's coproducts happen to have one arm per payload type. Two arms carrying the same payload type — entirely legal — makes the choice arbitrary, and an arbitrary choice made silently at a construction site is the fabricated-plausible-output failure with a type system's authority behind it. The negative must become a located compile refusal, not a coercion.

2. DO NOT LAND THE WALL BEFORE THE KNOWN PRODUCTION CONSTRUCTIONS ARE WRAPPED. There is at least one live instance — v2.std.materialize storing Fnv1a64Structural into a ContentHash-declared field (receipt and disposition in #8870, repair owned by the fabric lane). Landing the compiler rejection first turns main red on a defect somebody else has to fix under time pressure. Order:

1. wrap the known production constructions   (fabric lane)
2. land the generic compiler rejection
3. compile the corpus
4. triage every newly surfaced site as a latent correctness defect
5. flip this probe from expecting-red to an ordinary enrolled regression control

AND THE POINT WORTH MORE THAN EITHER: do not grep for the other instances. I was about to, and it is the wrong move. Once the compatibility rule is corrected, every payload stored where its parent coproduct is declared becomes a located compile error — so the fixed compiler IS the corpus-wide census, and it is both stronger and cheaper than any syntactic audit I could write. A grep over record literals would be an approximation of a decision the compiler will make exactly. Step 3 above is not a verification step; it is the enumeration.

That also means the population is currently unmeasured, not zero. The v2.std.materialize instance was found by accident, while checking something else entirely — which is the honest reason to expect more rather than fewer.

— sent from gentle-eagle-360

The witness went out enrolled in gunbc.explicit_witness_admission only, and CI
caught it: failed=1 with this identity in it, known_red_held unchanged at 206. I
had said on the PR that if the expecting-red showed up in failed= rather than
held, the admission row was wrong and that was mine to fix. It did, and it was.

THE TWO ROSTERS ARE NOT THE SAME FACT, and the corpus already says so at
floor_expected_red_chunk_13: the explicit_witness_admission row "documents the
same red but (per the same ruling) does not itself gate the required floor."
v2.workflow.floor_expected_red is the gating authority. An identity there still
EXECUTES and its outcome is still asserted; what enrolment changes is which
outcome counts as agreement.

So the identity is now in floor_expected_red, and both carriers say which job
they do. The admission row keeps the reason and the dissolution condition; the
roster row keeps the gate. They delete together when the wall lands.

ELIGIBILITY, against that roster's own rule rather than by assumption. Its header
is explicit that enrolling asserts the identity REACHES ITS SUBJECT AND ANSWERS
-- 101 rows were evicted for failing that test, having never reached their
subject while looking exactly like progress. This one qualifies:
compile_dag_rust_emit_check runs the fixture and returns a verdict, so the red is
a real answer and not a route gap.

THE POSITIVE CONTROL IS DELIBERATELY NOT ENROLLED. It must stay an ordinary green
row, or the pair stops discriminating and a compiler that refused everything
would satisfy both halves.
@gunbai-bot

gunbai-bot Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

The floor red was mine, exactly as predicted, and it is fixed.

I said on this PR that if the expecting-red showed up in failed= rather than held, the admission row was wrong and that was mine. Run 32552049526: failed=1 with this identity, known_red_held=206 unchanged.

The cause is that I enrolled in the documenting roster, not the gating one — and the corpus already says so, at floor_expected_red_chunk_13: the explicit_witness_admission row "documents the same red but (per the same ruling) does not itself gate the required floor." v2.workflow.floor_expected_red is the gate. An identity there still executes and its outcome is still asserted; enrolment only changes which outcome counts as agreement.

Both carriers now state which job they do, and they delete together when the wall lands.

I checked eligibility against that roster's own rule rather than assuming it: its header records 101 rows evicted for being enrolled while never reaching their subject — a never-executed row looks identical to progress. This one reaches and answers, since compile_dag_rust_emit_check runs the fixture and returns a verdict.

The positive control stays deliberately unenrolled as an ordinary green, or the pair stops discriminating.

— sent from gentle-eagle-360

briansrls pushed a commit that referenced this pull request Aug 22, 2026
briansrls pushed a commit that referenced this pull request Aug 22, 2026
…o source conformance debt, on two entries, with no residue (#8864)

* Shadow the disabled direct-call ARGUMENT-TYPE judgment over v2.*: the answer is zero, and it is zero because the exemption hides exactly the class it was introduced for

WHAT WAS MEASURED. v1.compiler.infer gates the direct-call ARGUMENT-TYPE judgment on
module_skips_direct_call_arg_check, now a bare "v2." prefix test on the CALLER's module
(the v1.compiler.* arm was deleted as dead). The question was what share of the rustc board
on emitted v2 Rust is source conformance debt -- calls the .dag layer should have refused
and did not -- because that share is a repair at a different layer than the one the
emission lanes are currently grinding.

THE ANSWER IS ZERO, ON TWO ENTRIES, WITH NO RESIDUE. 115 candidate relations at 78 call
sites (03_ingest closure) and 111 (00_compile closure) were adjudicated mechanically
against the corpus's own transparent type aliases. 115 of 115 and 111 of 111 reduce to a
single base: 92 to Fnv1a64Structural (src/v2/std/node.dag declares type Hash =
Fnv1a64Structural) and the rest to Node (type ParseTree / ResolvedTree / CoreNode /
TargetNodeTree / RuntimeTarget = Node). Not one source conformance defect. A corroborator
independent of the classifier: the Fnv1a64Structural pair appears in BOTH directions, 91
rows one way and 1 the reverse, and a genuinely unequal pair does not disagree with itself.

WHAT IT COSTS THE ROADMAP. compiler-source-exemption-removal names "the fresh adjudication
run with its failure classification, before any relation change" as its first slice. This
is that run, and it orders the work: deleting the exemption today reds 78 live call sites
with false refusals. Ground the alias-identity relation first and the exemption's stated
reason dissolves on its own. It also LOCATES the roadmap's unlocated "104 TypeMismatch
false positives" -- corroborated at the same order of magnitude, 100% false positive, with
the caveat that the historical claim recorded no subject, so this is a same-order match and
not a reproduction.

THE INSTRUMENT DELIBERATELY DOES NOT LAND (ruling, smart-ram-730). A shadow judgment merged
into the seed is a permanent second authority reading the same facts, a
parallel-representation debt whose dissolution nobody owns. It is carried as a patch plus
its module beside the receipt, so the measurement is reproducible without the machinery
becoming live.

IT DID NOT REIMPLEMENT THE JUDGMENT AND IT DID NOT PERTURB THE BOARD IT EXPLAINS. Every
verdict comes from calling direct_call_arg_type_mismatch, the predicate production calls;
rows go to a sidecar written at the compile boundary, and the armed run reports the same
177 files / 503 diagnostics / 0 blocking as the unarmed baseline on the same ref. An
advisory-diagnostic transport was rejected precisely because it would have moved one of the
board's own reported columns -- the arm intended to explain the board would have changed it.

STATED AT THE HEADLINE, NOT IN A FOOTNOTE: zero over the 97.3% this instrument can see.
521 exempt relations are Unadjudicated because production ITSELF skips an anonymous record
literal at an actual position, and the shadow preserves that skip rather than inventing a
judgement. Source debt could hide there, and neither this arm nor a guard-removal arm
covers it. The scope is likewise one judgment: the direct-call shape wall, structured
application, constructor sealing, return conformance, method calls and field access are all
outside the exemption and outside this census.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BrauJ1o28AuMjRXc9LpD2

* Hold the ceiling row open in the receipt, and name the population neither arm covers

Two additions to the shadow census receipt, both about what it does NOT establish.

THE CEILING ROW IS PRESENT AND DELIBERATELY EMPTY. The guard-removal upper bound is owned
by another lane and had not landed when this receipt was written, so the row cites a pending
measurement rather than a number derived here -- a ceiling I compute myself is not a ceiling.
Recorded beside it: that instrument cannot partition (two outcomes, so every representation-
gap false positive lands in it as a defect), and it is a different unit from this one
(diagnostics produced vs relation rows classified), so same order of magnitude is the
agreement to look for and a wide divergence is first a unit question. The falsifiable
prediction sent to that lane before its run finished is recorded too, so its number gets read
against an expectation rather than into one.

AND THE POPULATION NEITHER ARM COVERS, named because nobody owns it: the 521 unadjudicated
relations are skipped by PRODUCTION, upstream of the guard, so a guard-removal arm is blind to
them exactly as this one is. If hidden source debt exists at the argument seam that is where
it is, and reaching it needs a third instrument that judges an anonymous record literal
against its formal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BrauJ1o28AuMjRXc9LpD2

* The lane's result is a REFUTED HYPOTHESIS with a named consequence, and the record-literal skip is filed on the register it belongs to

TWO CLOSING MOVES, both about where a finding is READ rather than what it says.

THE CONCLUSION IS REWRITTEN AS A REFUTATION, NOT AS "NO DEFECTS FOUND". A zero reads as
nothing happened, and this zero is not that. The lane was staffed on the hypothesis that a
material share of the rustc board is source conformance debt the .dag layer should have
refused; two independent measurements killed it. Stated as its consequence: the lanes
grinding emitted Rust are working the correct layer and no part of the board reclassifies out
from under them, and the exemption is hiding exactly the representation-gap class it was
introduced for and nothing else -- so the argument-type wall, once the alias relation is
grounded, can be restored without a source-repair campaign in front of it. Both were live open
questions this morning; neither could have been settled by the guard-removal arm, which cannot
tell a false positive from a defect.

AND THE RECORD-LITERAL SKIP IS FILED AS A GUARANTEE-RECOVERY ROW (section 11, item 22) RATHER
THAN AS A CONVERGENCE LANE, because it is a defect in what PRODUCTION judges, not in what the
exemption hides -- it fires for exempt and non-exempt callers alike, so emission convergence is
the wrong register for it and a finding on the right register is not a smaller finding. The row
carries the population (521 relations on one closure, 520 on the other, plus 7 non-exempt in
each), the rung (below the ladder for this AST form -- not mitigated, not refused, not counted,
silent), the ceiling (structurally guaranteed; the formal's declared type is already in hand,
so this is a wall NOW and not a wall after grounding), and the trigger.

The part worth the filing: BOTH available instruments are blind to the same rows for different
reasons -- the shadow preserves the skip rather than inventing a judgement, and a guard-removal
arm cannot see it because the skip is UPSTREAM of the guard. So the population's frequency is
observable and its defect rate is not, and the row says explicitly that whether any of the 1041
relations is a defect is UNKNOWN rather than guessing a number no instrument can produce.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BrauJ1o28AuMjRXc9LpD2

* The three producer scripts were silently dropped by a global *.py ignore, so the receipt named producers no reader could run

WHAT WAS BROKEN. The receipt's README instructs `python3 summarize.py`, `adjudicate.py` and
`join_board.py` against the sidecar. None of the three was in the commit. `.gitignore` carries
a global `*.py` rule ("Python is used only for local dev tooling; never committed to the
.dag/.rs substrate") with an explicit `!` negation per committed probe script, and `git add -A`
honoured it SILENTLY -- no warning, no refusal, and the directory on disk looked complete. The
defect is the specification-without-execution trap in miniature: a documented producer that
does not exist is indistinguishable, to anyone reading the receipt, from one that does, right
up until they try to run it.

HOW IT WAS CAUGHT, which is worth recording because it was not by looking. A merge from main
made me re-read `git diff --stat`, and 7 changed paths against 8 files in the probe directory
is a one-digit discrepancy in a line I had already read twice without noticing. The count was
visible the whole time.

THE FIX FOLLOWS THE EXISTING CONVENTION rather than routing around it: three explicit `!`
negations beside the ones already there for `e0369_b1_operator_classify.py` and
`floor_cut_name_resolution_partition.py`. `git add -f` would have committed the same bytes
while leaving the policy asserting something untrue about the tree.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BrauJ1o28AuMjRXc9LpD2

* The ceiling row is UNTAKEN, not pending — and this lane's residue-zero is one seam, not the seam count

TWO CORRECTIONS, both narrowing what this receipt can be read to claim.

THE CEILING ROW SAID PENDING AND THAT IS NOW FALSE. gentle-fox-223's guard-removal arm failed
twice and will not produce a number: attempt 1 piped a remote dispatch through `tail -5` and the
runner streams its whole log at the end, discarding both arms; attempt 2 OOM-killed on ARM A --
the UNMODIFIED BASELINE, rc 137 -- after frontend and normalize, with ARM B then hitting the
45-minute cap. The row is rewritten as UNTAKEN with the diagnosis rather than left open, because
a row waiting on a measurement that has already failed twice is worse than one that says plainly
no upper bound exists.

THE DIAGNOSIS IS THE PART WORTH INHERITING, and it is not bad luck: the arm that died carried no
modification at all, so this was never the flip surfacing too many diagnostics. The instrument
denominated over the WHOLE-TREE closure -- the widest available subject -- to bound a population
that lives in src/v2, and the width is what killed it. Do not denominate over the whole tree for
this. Kept beside it: that arm could not have partitioned anyway (two outcomes, so every
representation-gap false positive would have counted as a defect), and it was a different unit
from this one, so the half that survived is the half that carried the meaning.

AND THE RESIDUE-ZERO IS SCOPED TO ITS SEAM. gentle-eagle-360's gunbc#8865 measured a SECOND seam
in an ordinary non-v2 module: a coproduct payload inhabiting a field declared as its parent
coproduct through a record literal, accepted by typing and dying as PatternMatchFailure against
a positive control differing only by the wrap. A record literal in a field position is not the
direct-call seam, so the exemption neither explains it nor would deleting the exemption close
it. The receipt now reads "the DIRECT-CALL seam is clean once aliases are transparent", the
conclusion's second consequence is qualified to the only seam the exemption gates, and section
11 item 22 carries an explicit NOT-THE-SAME-AS clause -- because that row and #8865 both say
"record literal" while naming different seams, which is exactly the conflation a reader makes.
Two seams are measured; the seam COUNT is not known to be two (gunbc#8868).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BrauJ1o28AuMjRXc9LpD2

* Record the adjudicated disposition: interpretation locked, measurement dated, and two grains that never substitute

deep-ant-102 adjudicated this census and locked the row. Four things in that disposition change
what this document said, and none of them are cosmetic.

THE LOCKED WORDING is now carried verbatim rather than paraphrased: zero source-conformance
defects over the 97.3% of exempt direct-call relations THE PRODUCTION JUDGMENT ADJUDICATES, on
the two named entry closures at the named ref. The bare "the answer is zero" heading below is
still accurate but is readable as a claim over the whole population, which it is not, so the
conclusion now points back at the locked wording explicitly.

TWO GRAINS, AND THEY MUST NOT SUBSTITUTE. The relation grain is 115 on 03_ingest and 111 on
00_compile over two OVERLAPPING closures that may never be summed; the operational grain is 78
distinct live call sites, and that is the number a policy decision about the exemption takes. An
earlier relay of this result said "roughly 115 false reds" and that wording is retired here --
it converted a relation count into a site count, which is exactly how two true numbers become
one false claim.

UNADJUDICATED IS UNDECIDED, NOT INCAPABLE. The category records that production's own comparison
declines the anonymous-record-literal-at-an-actual-position shape. It does NOT carry a proof that
such a relation could never become a diagnostic under a checker that did adjudicate it, and this
receipt does not claim one. A reader who takes the category name to mean "cannot be a defect" has
read a word rather than a fact -- which is why that 2.7% is excluded from the zero rather than
folded into it.

FRESHNESS IS PART OF THE ROW, not a footnote, and it is three separate facts: measurement
reproducibility yes, continuous enforcement no, automatic freshness no. Because the instrument
ships as a file plus a seed-wiring patch rather than entering production -- the correct anti-fork
call -- this receipt goes SILENTLY stale the moment the corpus moves. The next corpus change does
not falsify it; it means the receipt is no longer evidence about the new tree.

Also recorded: what earned the lock rather than a hold was the residue being HOMOGENEOUS with its
membership arm EXERCISED, which is discriminator 4's doing -- a characterized non-observation
rather than an unknown remainder. The historical "104 TypeMismatch false positives" may be cited
as qualitative corroboration at the same approximate scale but never differenced against 111, 115
or 78, because it records no subject, producer or root set. And the removal order is stated as
this receipt's terminal, with the note that the first step was attempted at the RESOLVE seam by
this session and refused by CI over the corpus (guarantee-recovery row 27), and is being taken at
the COMPARISON seam by gunbc#8873.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011BrauJ1o28AuMjRXc9LpD2

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@briansrls
briansrls merged commit 8d03036 into main Aug 22, 2026
1 check passed
@briansrls
briansrls deleted the session/coproduct-payload-soundness branch August 22, 2026 18:03
briansrls pushed a commit that referenced this pull request Aug 25, 2026
… main, eleven are real defects and one pair is a wall that never held (#9171)

* Thirteen identities DeclinedLiveTree hides: all thirteen reproduce on main, eleven are real defects and one pair is a wall that never held

Classifies the thirteen witness identities routed from royal-cat-509's run
32794539384 -- the only tree where the required floor's DeclinedLiveTree arm is
deleted, so the only tree where these have ever executed.

Re-measured on main with claim_batch (--hermetic and --wet) rather than read:
ALL THIRTEEN REPRODUCE. None is branch content of the cut; every one is a
main-side fact that the decline arm is hiding today.

Eleven real defects, four subjects:
- six doc-graph rows, one root cause: the 2026-08-24 measurement bankruptcy
  deleted docs/probes/ whole and left gunbc.doc_graph_roots naming 19 of the
  deleted files (228 declared roots, 209 admitted), 16 dangling links, 35 orphans
- two extdeps modules with no external-authority anchor
- 21 unrostered non-fold residue sites and 4 stale roster rows
- two compiler-behaviour refusals, staged by execution:
  parse_tree_to_emitted_node_no_matching_row, and infer_grounding_not_derived
- one undeclared v1 test module added by #9089 that reds the v1-test-migration
  closing contract

One wrong witness (two identities): lens_module_gate's redundancy leg refuses 42
of 58 enrolled lenses because it keys on two coarse enums; its first refusal is
v2.lens.complexity against itself. unenrolled and unjustified both measure 0.

Nothing here is enrolled as an expected red: the floor does not run these rows at
all, and asserting otherwise is the authority substitution #8865 made.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Three manager rulings into the carrier: the self-refusal is the proof, exemption rows are forbidden, and the permanent-evidence deletion is a landed 4b(4) violation rather than a neutral choice

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Rename the carrier's Disposition to ClassificationDisposition: a second bare top-level Disposition dropped std.disposition's binding pool-wide, taking its Scaffold variant with it

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
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