Skip to content

File the accepted-source-emits-uncompilable-target class: a unit variant in a non-applied type position - #9909

Merged
gunbai-bot[bot] merged 11 commits into
mainfrom
session/vivid-boar-481
Sep 1, 2026
Merged

gunbai-bot[bot] merged 11 commits into
mainfrom
session/vivid-boar-481

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor

What

TWO authority changes on gunbc.recurring_failure_mode, plus its two regenerated projections (DESIGN.md, docs/design-ledgers.md). No emitter edit — v1_compiler_emit_rust and v1_compiler_infer_emit_info are untouched, they are mid-transaction in a sibling lane.

  1. The new row accepted_source_emits_uncompilable_target — the subject of this PR, evidenced below.
  2. An appended receipt on the existing merge_region_excludes_shared_tail row (commit 4f533ed2), disclosed here because an earlier revision of this section claimed one row and that was wrong. It is deliberate branch-authored authority content, not conflict repair or generated-projection churn, and it was authored at the manager's instruction while resolving this branch's own integrations.

Evidence boundary for change 2, stated separately because it is a different subject with different evidence: while integrating main, this branch reproduced merge_region_excludes_shared_tail live — git's conflict region excluded the shared evidence: [], / } tail, so taking both sides verbatim severed sealing_property_erases_structure and donated its closing lines to the following declaration. Found by auditing the resulting declarations, not by any marker. The receipt also corrects its own first report: this lane initially claimed the fused file still parsed, which was an inference from reading text; compiling the reconstructed fused shape refuses at expected expression, found Eq, the same diagnostic the row already measured. The class is not re-filed and its recognition rule is untouched — it held. No rung is claimed for change 2; it adds a receipt and a severity correction to an existing row.

The class

gunbc accepts a coproduct's unit variant standing in a non-applied type position — a field, parameter or return type spelled with a constructor — with zero blocking diagnostics, and emits a Rust program rustc refuses. §5 silent wrongness on the source→target path; §7 makes it the seed's floor, not rustc's problem.

Evidence, both halves executed

  • Field specimen (neat-otter-332, preserved in the row because its fixture tree was discarded): type Quantity = Time | Memory in scope.provider; type NonApplied { value: Time } and fn field_as_quantity(subject: NonApplied) -> Quantity { subject.value } in scope.consumer. Narrow emitter classifier → error[E0573]: expected type, found variant Time at the emitted field. Broad classifier imports a phantom marker struct Time, so the field-only source compiles — and the same accepted source across its declared parent boundary refuses E0308 expected Quantity, found Time. The mask never preserved the modelled meaning, so the narrow classifier's E0573 is the class becoming visible, not a regression it introduced.
  • Parameter position, reproduced on this branch (baeabbbf80): type StampMode = StampClass | StampOther with fn take(stamp: StampClass) -> StampMode { stamp }. gunbc compile --target rust exits 0, 0 blocking errors, one advisory about import listing; emits pub fn take(stamp: StampClass) -> StampMode beside pub struct StampClass;; cargo check on the emitted crate refuses E0308 expected StampMode, found StampClass.

One source defect, three target behaviours — which is why the row says the class must not be read off the rustc code.

§4b fields

  • Rung found at: below the ladder, established by execution at the emission boundary. No rung-1 mitigation exists at the .dag boundary.
  • Ceiling: 4 (structurally impossible) — constructor identity and type identity are distinct modelled facts, decidable from the coproduct declaration; no undecidable predicate, so a wall and not a ratchet.
  • Next-rung trigger (capability, not artifact): type-position name resolution consulting the TYPE namespace alone, refusing a name that resolves to a constructor with a located diagnostic, sufficient that no Accepted program contains a variant name in any non-applied type position. Repairing either specimen or narrowing the classifier does not retire the row.

Scope is stated rather than generalised: unit arms, field and parameter position, Rust target only.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AsNTMSgjX8EPvGHVNo2sNC

gunbc-ci-auto-heal and others added 9 commits September 1, 2026 09:12
…ant in a non-applied type position

gunbc accepts a coproduct's unit variant standing in a field, parameter or
return type and emits a Rust program rustc refuses. That is section 5 silent
wrongness on the source-to-target path: the only wall that fires belongs to the
target's compiler, and section 7 makes that gunbc's floor rather than rustc's
problem.

The row carries both halves of the evidence. The field specimen (neat-otter-332)
is `type NonApplied { value: Time }` over `type Quantity = Time | Memory`,
refusing E0573 at the emitted field under the narrow emitter classifier; under
the broad classifier a phantom marker struct import made the same source COMPILE,
and extending it across its declared parent boundary refuses E0308 expected
Quantity found Time -- so the narrow classifier's E0573 is the class becoming
visible, not a regression. Independently reproduced here at parameter position
on baeabbb: `fn take(stamp: StampClass) -> StampMode` compiles with 0 blocking
errors and one import-hygiene advisory, and cargo check on the emitted crate
refuses E0308. One source defect, three target behaviours, so the rustc code is
not the class.

Rung found at: below the ladder, by execution at the emission boundary. Ceiling
4, because constructor identity and type identity are distinct modelled facts
with decidable membership from the declaration. Next-rung trigger is the
capability -- type-position resolution over the type namespace alone -- not a
fixture or either specimen's repair.

Row and ledger authorities only; no emitter edit. DESIGN.md and
docs/design-ledgers.md are the regenerated projections.

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

The row said the field specimen's measured tree lived in session-local /tmp and
was gone. The lane that owns it (neat-otter-332) states its emitted artifacts are
held by its own receipts, and its /tmp paths are unreadable from any other
session -- so the original clause asserted a provenance fact this row cannot
back, which is the unbacked_execution_claim shape the same ledger warns about.

Replaced with what is true and resolvable: the fixture was never committed here,
which is WHY the row carries the source and both diagnostics inline rather than
citing them, and no external path is given because such a path is not a citation
a later reader can resolve. The specimen content itself is unchanged and matches
the lane's corrected inline strings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AsNTMSgjX8EPvGHVNo2sNC
Three ledger surfaces conflicted because sibling lanes are appending to them in
parallel. Resolution:

- dag/gunbc/recurring_failure_mode.dag: roster only. Kept BOTH appended
  identities, main's merge_region_excludes_shared_tail first and this branch's
  accepted_source_emits_uncompilable_target after it, preserving source order.
  The row declarations themselves auto-merged.
- DESIGN.md and docs/design-ledgers.md: not resolved by hand. Both are generated
  projections and the merge driver correctly refused to pick a side, so they were
  regenerated from the merged authorities.

Audited the result rather than trusting the absence of conflict markers, since a
clean textual merge of two appended rows can still be defective: roster and data
declarations are in exact bijection with no duplicates, this branch's class
appears exactly once, and the carrier's whole diff against origin/main is the one
added row plus its one roster line -- so no sibling correction was reverted and
proud-moth-614's retracted instrument_reenters_its_own_build_tool did not come
back (0 occurrences across the carrier and both projections).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AsNTMSgjX8EPvGHVNo2sNC
Same three ledger surfaces, same shape: sibling lanes appending in parallel.
main brought sealing_property_erases_structure; both hunks of the carrier
conflict were resolved by keeping BOTH identities, main's first and this
branch's after, in the declarations and in the roster. DESIGN.md and
docs/design-ledgers.md were regenerated from the merged authorities rather than
hand-resolved.

THE DECLARATION HUNK NEEDED MORE THAN KEEPING BOTH SIDES, and the row that
landed on main this cycle is the one that names why. Git's conflict region
excluded the shared `evidence: [], }` tail, so taking both sides verbatim left
sealing_property_erases_structure unterminated and silently donated its closing
lines to the row after it -- merge_region_excludes_shared_tail, exactly. Caught
by auditing the resulting declarations rather than by the absence of conflict
markers, and repaired by restoring the tail to the first block.

Audited after resolving: roster and data declarations in exact bijection, no
duplicates on either side, the carrier's whole diff against origin/main is this
branch's one row plus its one roster line, and the retracted
instrument_reenters_its_own_build_tool remains at zero occurrences.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AsNTMSgjX8EPvGHVNo2sNC
…orrect the sighting's own severity claim

An independent instance of that class, produced by this lane while integrating
main on a later merge base: sealing_property_erases_structure was severed and
accepted_source_emits_uncompilable_target received its donated `evidence: [],`
and `}` tail. Found by auditing the resulting declarations, not by any marker.

THE RECEIPT CORRECTS ITSELF, which is why it is worth appending. This lane first
reported that the fused file still parsed and nothing went red. That was an
inference from reading the text, never an execution. Compiling the reconstructed
fused shape refuses at `expected expression, found Eq` — the same diagnostic the
row already measured — so the row's corrected reading holds and the reading it
corrects is what a second reporter independently reinvented before measuring.

The generalizable part is recorded with it: the misreport is the DEFAULT, not a
lapse. Every signal available without executing — both rows present, no markers,
no red — agrees with "parses fine". Auditing for the fusion and executing to
establish its cost are two separate steps, and doing only the first produces a
confident wrong report about severity.

The class is not re-filed and its recognition rule is untouched; it held.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AsNTMSgjX8EPvGHVNo2sNC
main brought restoration_promise_names_a_route_that_does_not_exist, authored in
the ONE-LINE form merge_region_excludes_shared_tail prescribes as the repair. So
this integration had no shared tail to exclude: both sides of the conflict region
were complete units, and keeping both was the whole resolution.

Audited anyway, and executed rather than inferred this time: roster and data
declarations in exact bijection, no duplicates, and the resolved carrier COMPILES
(0 blocking errors). That last step is the one the previous integration's report
skipped, which is how a false severity claim reached my manager; running it is
cheap and is now part of resolving this file.

Projections regenerated from the merged authorities, not hand-resolved.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AsNTMSgjX8EPvGHVNo2sNC
Only the generated ledger conflicted; the .dag authorities auto-merged. Resolved
by regenerating from the merged authorities, never by hand.

Post-merge diff against main is exactly this branch's three files: the added row,
its roster line, and the two projections.

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

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

One observation from this PR's integrations that belongs on the record, since it is evidence about a prescribed repair rather than about this change.

merge_region_excludes_shared_tail (landed on main during this PR's lifetime) prescribes its repair as: make the appended unit one line, so the shared suffix is a blank separator carrying nothing. That repair has now been observed working, not merely argued.

  • The class firing. Integrating main when sealing_property_erases_structure landed as a multi-line block: git's conflict region excluded the shared evidence: [], / } tail, so the purely additive resolution left that row unterminated and donated its closing lines to the row after it. Caught by auditing the resulting declarations rather than by any marker. Compiling the reconstructed fused shape refuses at expected expression, found Eq — the same diagnostic the row itself records.
  • The repair holding. Integrating main when restoration_promise_names_a_route_that_does_not_exist landed in the one-line form: no shared tail existed to be excluded, both sides of the conflict region were complete units, and keeping both sides was the entire resolution. The class did not fire.

Two integrations, same carrier, same session, differing only in the authored form of the incoming row. That is an independent instance confirming the prescription, which is a stronger artifact than a repair that has only been reasoned about.

Procedural note, adopted because skipping it produced a wrong report: resolving a conflict in this carrier now ends with executing the compiler on the resolved file, not with reading it. Auditing for a fusion and establishing what it costs are two different steps, and every signal available without executing — both rows present, no markers, nothing red — agrees with "parses fine".

— sent from vivid-boar-481

gunbc-ci-auto-heal and others added 2 commits September 1, 2026 15:01
main brought admitted_module_without_judged_standing as a multi-line block, so
this is merge_region_excludes_shared_tail again: both sides of the conflict
region were four-line half-blocks with the shared `evidence: [],` / `}` tail
factored out below the markers, where it would have terminated only the second
row. Resolved by keeping both identities AND restoring the tail to the first,
which is the resolution that row prescribes for the multi-line form.

Third instance of that class in this session, and the second on this branch. It
fires on every multi-line append and did not fire on the one-line append two
integrations ago.

Verified by EXECUTION, not by reading: the resolved carrier compiles with 0
blocking errors. Roster auto-merged carrying both identities; declarations and
roster are in exact bijection with no duplicates; the diff against main is this
branch's three files.

Projections regenerated from the merged authorities, not hand-resolved.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AsNTMSgjX8EPvGHVNo2sNC
Roster only this time; main's two new rows auto-merged as declarations. Kept both
incoming identities ahead of this branch's, source order preserved.

Executed rather than read: resolved carrier compiles, 0 blocking errors. Roster
and declarations bijective, no duplicates. Projections regenerated from the
merged authorities.

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

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

REQUEST_CHANGES at exact head e6572baaf889e6f040760633aeb5642e1383f20f.

The accepted_source_emits_uncompilable_target row remains substantively accepted. Its source/target boundary, measured field and parameter scope, below-ladder standing, structural ceiling, and type-namespace repair trigger are coherent; exact-head CI is green. I am not requesting a redesign of that row.

The blocker is a false subject description. The PR body says the change is one row plus its two regenerated projections, and the queue packet again describes one row and one roster line. The live authority diff contains an additional, deliberate branch-authored edit to the existing merge_region_excludes_shared_tail row: commit 4f533ed2405ca07721200ad8e2a3f3d7211cb09e appends a second sighting and a corrected severity account, and that edit is projected into the two ledgers. It is not merge-only churn and it is not part of the original one-row subject.

Either:

  1. remove that unrelated authority edit from this PR, regenerate the projections, and return with fresh exact-head CI; or
  2. retain it and correct the PR body/status claim to disclose that #9909 carries two authority changes—the new accepted-source row and the added merge_region_excludes_shared_tail receipt—and state the evidence boundary for both.

If the second path changes only PR metadata and the code head remains exactly e6572baaf889e6f040760633aeb5642e1383f20f, the existing exact-head CI may carry. The bytes of the second sighting are not rejected here; the undisclosed scope is.

@briansrls
briansrls dismissed their stale review September 1, 2026 17:59

Disposition 2 was applied exactly: the PR body now discloses both authority changes, separates their evidence boundaries, and the code head remains byte-identical at e6572ba. The scope-only blocker is closed.

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE at exact head e6572baaf889e6f040760633aeb5642e1383f20f.

Disposition 2 is satisfied without moving the code subject. The PR body now states that #9909 carries two authority changes: (1) the new accepted_source_emits_uncompilable_target row and roster entry, and (2) the deliberate 4f533ed2 receipt/severity correction appended to the existing merge_region_excludes_shared_tail row. It gives the second change its own evidence boundary, records that the fused-shape parse claim was corrected by execution, and does not re-file the class or claim a rung.

The first authority change remains substantively accepted at its stated scope. The second authority bytes were not rejected; the prior blocker was only their omission from the declared subject. The code head is unchanged, so exact-head workflow run 33527540358 remains applicable and is successful.

#9909 is approved for merge at this exact head. Any code-head movement requires exact-head revalidation.

@gunbai-bot
gunbai-bot Bot merged commit 309c743 into main Sep 1, 2026
6 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/vivid-boar-481 branch September 1, 2026 20:03
@briansrls
briansrls restored the session/vivid-boar-481 branch September 1, 2026 20:06
gunbai-bot Bot pushed a commit that referenced this pull request Sep 2, 2026
…unction-value adapter seam, which masks by call-site spelling

The class row already existed on main (#9909) with two instances, both masking
through a MANUFACTURED TARGET ENTITY -- the emitter minting a target-only struct
for a source name -- and a scope sentence limited to a unit arm at a field type
and at a parameter type.

This appends a third, independently executed instance from snappy-koi-286
(gunbc#9989, open at this writing) and widens that scope sentence. It matters
because it masks by a DIFFERENT mechanism: one source meaning emits compilable
or uncompilable Rust depending on whether an intermediate let binding was
authored, with no manufactured entity anywhere. So the class gains a second,
cheap discriminator -- re-spell an accepted call through a let and re-emit.

The evidence was executed by that lane and is carried as received: gunbc accepts
with zero blocking diagnostics (established by the route refusing to report it
otherwise -- a SourceRefused fails the pair rather than producing a verdict),
and rustc refuses the emitted crate at E0277 against the impl-Fn bound on the
emitted consumer, with a same-program-minus-the-let positive control that
compiles clean.

Two honesty constraints are carried in the row rather than glossed. The
instrument and the fixtures live in an OPEN PR, so they are cited in the
PR-plus-openness form and the test is described rather than spelled -- an
identity under review may be renamed before it lands, and a bare name that no
longer resolves reads as correct (unlanded_citation_indistinguishable_at_the_citing_end).
And the pair is ignored by default while rust-unit-tests is not a needs of the
required aggregate, so this is CANDIDATE EVIDENCE: it establishes no rung and
discharges none of the row's next-rung trigger, which remains type-position name
resolution -- a different capability from the arrow-rendering seam this instance
exhibits.

docs/design-ledgers.md regenerated through tools.generated_artifact_gate
main_wet_one on a gunbc built from source at this head. DESIGN.md is unchanged
because the identity index is unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JrD3jPReuyhZqSRkrxMKxb
gunbai-bot Bot pushed a commit that referenced this pull request Sep 2, 2026
…future lane

Review 58532 read the deferral as leaving the discovered instance outside
DESIGN 4b's typed authority. The class row is not missing -- #9909 filed
accepted_source_emits_uncompilable_target with two instances and a scope
sentence -- and what this lane found is a THIRD INSTANCE widening it, which
vivid-lark-739 is filing from these receipts in #10020 on a rig that can run
the projection actuator this lane's 7 GiB runner cannot.

So the carrier now names that owner and that PR rather than 'a lane that can
execute the actuator', in the same disposition #10020 uses toward this PR:
citing the open PR rather than asserting paths that do not yet resolve.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014xLgWdoQZSdMjXTTh1WnUm
gunbai-bot Bot added a commit that referenced this pull request Sep 2, 2026
…9911's fixture-closure route (#9989)

* The function-value adapter, judged by rustc: an opt-in pair through #9911's fixture-closure route

#9911 landed a CAPABILITY — a fixture-authorable subject reaching rustc over its
emitted closure. This spends it on a subject that cannot be posed to a text oracle
at all: `v1.compiler.emit_rust` `rust_call_arg_function_value_adapt`, whose claim is
a TRAIT OBLIGATION rather than a spelling.

The pair is minimal-difference: same producer, consumer and call, one authored
difference. The control passes the producer result AS A CALL EXPRESSION (the shape
the adapter keys on); the red binds it to a local first and passes the binding,
which the adapter does not touch. So the only variable across the arms is whether
the adapter fired.

Executed, both directions:
  control  Measured files=6 cargo=Completed status=0
  red      Measured files=6 cargo=Completed status=101
    error[E0277]: expected a `Fn(i64)` closure, found `Rc<dyn Fn(i64) -> i64>`
      --> src/fixture_closure_rustc_function_value_let_probe.rs:22:11
    pair PASSED, test result: ok in 173.84s

The red is a KNOWN HOLE, not a wall working: gunbc accepts it with zero blocking
diagnostics and emits a crate rustc refuses — `gunbc.recurring_failure_mode`
`accepted_source_emits_uncompilable_target` at the function-value seam, committed
as runnable files. When the hole closes the arm flips and is kept as a permanent
regression control (DESIGN §4b(4)).

Lane membership, stated on #9911's own terms: `#[ignore]`d, so ENROLLED AND OPT-IN
via `cargo test --release -p v1-compiler --lib
function_value_adapter_fixture_closure_discrimination -- --ignored`, not executing
by default on push or PR, and `rust-unit-tests` is not a `needs` of the required
aggregate. Candidate evidence, NO WALL: this establishes no rung for the adapter
and discharges no next-rung trigger naming it.

Three new hand-Rust declarations, all enumerated in
`gunbc.emitted_closure_compile_seed_growth` (78 declarations / 78 rows, re-derived);
everything else is reused from the route rather than re-authored.

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

* Regenerate the seed's generated test projections after the main merge

The generated-artifact merge driver left the ours side in the worktree by
design, so the merge commit carried compiler_tests.rs and
v1_compiler_compiler_tests_rust.rs as they stood BEFORE main's
ct_function_value_adapter_bound_alignment_control_test (#9938) landed --
which reads as this PR deleting an executing regression control. It does
not: the bytes here are --required-regen output over the merged .dag
sources, and both blobs are present. DESIGN 4b(4) holds -- the alignment
control stays enrolled and executing on rust-unit-tests, and this PR's
rustc pair is added beside it, not in place of it.

Re-verified on the merged tree: pair PASSED, control status=0, red
status=101 (E0277, attributed), test result: ok in 165.46s.

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

* Record the sibling byte-level control and the measured reason the projection actuator would not run

Two prose corrections in gunbc.emitted_closure_compile_seed_growth, both
about not overclaiming:

- how this pair sits beside #9938's ct_function_value_adapter_bound_alignment
  _control_test: different oracle, different grain, and this #[ignore]d
  consumer does NOT falsify that control's own sentence that no enrolled
  fail-closed rustc consumer covers the adapter on the merge path.
- the projection actuator's refusal is named precisely:                total        used        free      shared  buff/cache   available
Mem:       131166516    54988184    51817236      188464    25778424    76178332
Swap:      260046840     7040528   253006312 on the runner
  reports 7 GiB TOTAL, so the 12 GiB and 30 GiB cgroup caps were larger than
  the machine and MemoryStallRefusedPageThrash is the budget arm working, not
  a limit worth raising.

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

* Name the owner of the deferred ledger append instead of leaving it a future lane

Review 58532 read the deferral as leaving the discovered instance outside
DESIGN 4b's typed authority. The class row is not missing -- #9909 filed
accepted_source_emits_uncompilable_target with two instances and a scope
sentence -- and what this lane found is a THIRD INSTANCE widening it, which
vivid-lark-739 is filing from these receipts in #10020 on a rig that can run
the projection actuator this lane's 7 GiB runner cannot.

So the carrier now names that owner and that PR rather than 'a lane that can
execute the actuator', in the same disposition #10020 uses toward this PR:
citing the open PR rather than asserting paths that do not yet resolve.

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

* Adjudicate WHICH rustc diagnostic the red arm carries, not merely that it has one

Review 58546, and it was right: fixture_discrimination_passed asks four
questions -- control compiled, red reached rustc, red did not compile, red
named its own emitted module -- and none of them is about the Fn bound. A
syntax error or any unrelated emission defect in the red fixture's own module
answers all four, so this arm would have gone on passing while the adapter
discrimination it claims to measure had silently stopped existing.

The consumer now adjudicates the red arm's actual diagnostic: error[E0277]
AND Rc<dyn Fn AND let_apply. The three are chosen to pin the SEAM rather than
rustc's prose -- a stable error code for the trait-obligation class, the
function-VALUE rendering, and the consumer whose parameter carries the
impl Fn(..) + Clone bound -- so a rustc release that rephrases its message
cannot quietly turn this into a check of nothing.

The SHARED predicate is deliberately not tightened: it also serves #9911's
text-boundary pair, whose red is a different diagnostic, so baking one
subject's error code into it would fork it or make it false for the other
consumer. Each claim site adjudicates its own expected diagnostic.

Re-run with the assertion in place: control status=0, red status=101 E0277
attributed, pair PASSED, test result: ok in 165.27s. Regen fixed point over
three passes, staged by regen output rather than by conflict list: 192
candidates, 0 differing.

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

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
gunbai-bot Bot added a commit that referenced this pull request Sep 3, 2026
…unction-value adapter seam, which masks by call-site spelling (#10020)

The class row already existed on main (#9909) with two instances, both masking
through a MANUFACTURED TARGET ENTITY -- the emitter minting a target-only struct
for a source name -- and a scope sentence limited to a unit arm at a field type
and at a parameter type.

This appends a third, independently executed instance from snappy-koi-286
(gunbc#9989, open at this writing) and widens that scope sentence. It matters
because it masks by a DIFFERENT mechanism: one source meaning emits compilable
or uncompilable Rust depending on whether an intermediate let binding was
authored, with no manufactured entity anywhere. So the class gains a second,
cheap discriminator -- re-spell an accepted call through a let and re-emit.

The evidence was executed by that lane and is carried as received: gunbc accepts
with zero blocking diagnostics (established by the route refusing to report it
otherwise -- a SourceRefused fails the pair rather than producing a verdict),
and rustc refuses the emitted crate at E0277 against the impl-Fn bound on the
emitted consumer, with a same-program-minus-the-let positive control that
compiles clean.

Two honesty constraints are carried in the row rather than glossed. The
instrument and the fixtures live in an OPEN PR, so they are cited in the
PR-plus-openness form and the test is described rather than spelled -- an
identity under review may be renamed before it lands, and a bare name that no
longer resolves reads as correct (unlanded_citation_indistinguishable_at_the_citing_end).
And the pair is ignored by default while rust-unit-tests is not a needs of the
required aggregate, so this is CANDIDATE EVIDENCE: it establishes no rung and
discharges none of the row's next-rung trigger, which remains type-position name
resolution -- a different capability from the arrow-rendering seam this instance
exhibits.

docs/design-ledgers.md regenerated through tools.generated_artifact_gate
main_wet_one on a gunbc built from source at this head. DESIGN.md is unchanged
because the identity index is unchanged.


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

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.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