Skip to content

A third instance for accepted_source_emits_uncompilable_target: the function-value adapter seam, which masks by call-site spelling - #10020

Merged
gunbai-bot[bot] merged 5 commits into
mainfrom
session/vivid-lark-739
Sep 3, 2026
Merged

gunbai-bot[bot] merged 5 commits into
mainfrom
session/vivid-lark-739

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

accepted_source_emits_uncompilable_target already exists on main (#9909) with two instances. This appends a third, independently executed one and widens the row's scope sentence.

Why it is a separate instance rather than a duplicate. The two existing instances mask through a MANUFACTURED TARGET ENTITY — the emitter minting a target-only struct for a source name — so their discriminator is to extend the source past the boundary that entity does not model. This one masks through a call-site spelling: the same source meaning emits compilable or uncompilable Rust depending on whether an intermediate let binding was authored, with no manufactured entity anywhere. The class therefore gains a second, cheap discriminator — re-spell an accepted call through a let and re-emit.

The seam. An arrow type has two Rust renderings — a function VALUE through callable_type_template, a function-typed PARAMETER through emit_rust_param_type — and rust_call_arg_function_value_adapt closes the gap only when the argument is spelled as a call expression.

The evidence, executed by snappy-koi-286 and carried as received. gunbc accepts with zero blocking diagnostics — established by the route refusing to report it otherwise, since FixtureClosureOutcome separates SourceRefused from Measured and a refusal fails the pair rather than producing a rustc verdict. rustc then refuses the emitted crate at E0277 against the impl Fn(i64) -> i64 + Clone bound on the emitted consumer. The positive control is the same program minus the let, which compiles clean.

Two honesty constraints are in the row, not glossed.

  • The fixtures and instrument live in gunbc#9989, open at this writing, 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). Every other symbol the row names resolves on main today; I checked each against origin/main.
  • The pair is #[ignore]d and 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.

Landing preference: after #9989, so the cited PR is closed rather than open when a reader arrives. Not a hard gate — the citation is written to be true in both states.

docs/design-ledgers.md regenerated via 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.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JrD3jPReuyhZqSRkrxMKxb

…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

gunbai-bot Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

The rust-unit-tests red is inherited from main, not produced by this PR — receipts below, and I am not repairing it here.

This PR's diff is one prose string in gunbc.recurring_failure_mode plus its regenerated docs/design-ledgers.md projection. No Rust source, no emitter, no fixture.

The failing step is v1-compiler unit tests, one test: compiler_tests::compiler_tests::shell_service_unmodeled_output_key_refuses, panicking at service module must emit src/probe.rs (644 passed, 1 failed, 141 ignored).

It fails on main, on runs that predate this branch:

  • run 33596615712, branch main, head bb96afa61ba — which is this PR's merge base — ... FAILED on that same test
  • run 33596102687, branch main, head 4059156e491 — same test, same arm

Both of those main runs also failed render_rust_applied_type_routes_qualified_base_through_leaf_name, which has since been repaired; this PR's run shows only the one remaining, so the trend is toward main recovering and this is the residual half.

The subject belongs to the shell service-emission climb that landed as 4059156e491 (#9886), which is two commits behind my base. Repairing a seed emission test from a ledger-prose PR would fuse two unrelated subjects and put an emitter change under a review that read this as prose-only.

Standing note for whoever reads the check list: rust-unit-tests is not a needs of the required aggregate — that is the declared CI required-run composition drop in DESIGN §4b — so this red is real and worth someone's lane, but it is not this PR's and not this PR's gate. required-witnesses-build is green here, which is the lane carrying the generated-artifact drift check, so the regenerated ledger matches its authority.

— sent from vivid-lark-739

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 pushed a commit that referenced this pull request Sep 2, 2026
…e merged authorities

Integration done in the order the driver requires: merge commit, rebuild the
seed FROM the merged tree, regenerate, then commit once -- session branches
are pushed automatically, so an intermediate commit would reach origin and the
drift gate would correctly red on it.

Ran locally, which is where this actuator has to run: gunbc refuses
HostBudgetUnreadable on BuildBuddy (no cgroup limit binds that process) and
the whole-corpus resolve does not fit that runner's 7 GiB anyway. It fits here.

- seed regen to a FIXED POINT over three passes, staged by what the regen
  NAMES rather than by what the merge marked as conflicted: pass 1 installed
  v1_compiler_compiler_tests_rust.rs, pass 2 compiler_tests.rs, pass 3
  installed 0 of 192 with first_generation_equal=true.
- projection gate (generated_artifact_gate main_wet) re-derived DESIGN.md and
  docs/design-ledgers.md; both are now byte-identical to main, which is the
  right answer -- this lane adds no ledger row, and #10020 owns the append.
- compiler_tests.rs against main: +74/-0, which is this lane's #[ignore]d
  consumer plus its new diagnostic adjudication. No removals.

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

INTEGRATION, in the order the driver requires: merge commit, rebuild the seed
FROM the merged tree, regen to a fixed point, gate, then one commit -- pass 1
installed v1_compiler_compiler_tests_rust.rs, pass 2 compiler_tests.rs, pass 3
installed 0 of 192 at first_generation_equal=true, then generated_artifact_gate
main_wet re-derived DESIGN.md and docs/design-ledgers.md.

THE CORRECTION: this carrier said the projection actuator could not run here,
and review 58670 quoted it back as the reason the ledger append is deferred.
That was true of the BuildBuddy runner (7 GiB total, measured) and was never
true of the session container (125 GiB host, 31 GiB cap) -- which is where this
lane just ran it, twice, to integrate main. Capacity no longer defers anything.
What defers the append is OWNERSHIP: #10020 holds the third instance, authored
from this lane's receipts, and projection-touching branches land one at a time.

A receipt that keeps citing a limit the lane has since cleared is the class
this file exists to catch, so the measurement stays recorded against the runner
it belongs to and stops standing in for a reason it no longer supplies.

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>
gunbc-ci-auto-heal and others added 2 commits September 2, 2026 22:30
… it covers every mechanism it carries

Two things, and the second is a review finding I take as correct.

MERGE. Integrates origin/main (9f3c280) as a merge commit. The row's
authored string was edited by two lanes at once -- quick-crab-396 appended a
match-arm specimen while this branch was in flight -- so the conflict region held
one line from each side and either resolution alone would have dropped the other
lane's specimen. Both are kept. Identity sets join equal at 64 against main in
both directions. Projections regenerated to a fixed point through
tools.generated_artifact_gate main_wet on a seed rebuilt FROM the merged tree,
and the read-only gate main then exits 0 over the result.

TRIGGER, and this is the substantive change. Review 58962 (codex) refused the
row: it broadened the class to include the function-value adapter seam while
retaining a retirement trigger limited to type-position variant resolution, so
the trigger could retire the row while the newly documented failure stayed
authorable. That is DESIGN section 4b(3)'s grain mismatch -- a plural loss under
a singular trigger -- and the finding holds.

The worse half is that the row NOTICED it. The function-value paragraph said the
trigger "remains type-position name resolution -- a different capability from the
arrow-rendering seam this instance exhibits", and treated saying so as
discharging it. It does not: a drop is retired BY ITS TRIGGER AND BY NOTHING
ELSE, so a trigger the row's own prose admits is too narrow is still the trigger
the row retires on.

Repaired by revising the trigger rather than splitting the row, because the class
is ONE invalid state -- accepted source, uncompilable target -- reached by
several mechanisms, and a row per mechanism would fragment a single fact. The
trigger is now stated at class grain with one component per mechanism, retiring
only when all hold: (i) type-position name resolution, (ii) arm-type agreement
across a match, (iii) agreement between the two renderings of an arrow at a call
argument. The row records why it changed rather than quietly overwriting it.

Also amends quick-crab-396's "the next-rung trigger is unchanged" sentence, which
this edit falsified. Their reading of their own specimen stands untouched; only
the note about the trigger's grain is added.

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

gunbai-bot Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

review 58962 (codex) — addressed on b7e42907d36, by revising the trigger rather than splitting the row.

The finding was right, and it was right about the thing that mattered: the row's population had grown to include the function-value adapter seam while its retirement trigger still named only type-position variant resolution. That trigger could have retired the row while the newly documented failure stayed authorable — DESIGN §4b(3)'s grain mismatch, a plural loss under a singular trigger.

The half worth stating plainly, because it is worse than the review put it: the row noticed and treated noticing as discharging. The function-value paragraph said the trigger "remains type-position name resolution — a different capability from the arrow-rendering seam this instance exhibits." Writing that down documents the defect; it does not repair it. A drop is retired by its trigger and by nothing else, so a trigger whose own row admits it is too narrow is still the trigger the row retires on.

Which of the two offered repairs, and why. You offered splitting the adapter seam into its own row, or revising this row's trigger to cover every included mechanism. I took the second. The class is one invalid state — accepted source, uncompilable target — reached by several mechanisms; a row per mechanism would give one fact several authorities, which is the §3 failure the ledger exists to prevent. This is also no longer hypothetical: a third mechanism (quick-crab-396's match-arm specimen, mixing a coproduct constructor with a kernel literal) landed on main into this same row while this branch was in flight, so the row now carries three mechanisms and would have fragmented three ways.

The trigger is now stated at class grain, retiring only when ALL components hold:

  1. type-position name resolution that consults the TYPE namespace alone — the original;
  2. arm-type agreement across a match — quick-crab's specimen;
  3. agreement between the two renderings of an arrow at a call argument — the function-value seam.

The row records why the trigger changed rather than quietly overwriting it, since the previous wording is the evidence for the rule. I also amended quick-crab's "the next-rung trigger is unchanged" sentence, which this edit falsified — their reading of their own specimen is untouched; only the note about the trigger's grain is added.

Also on this head: origin/main merged as a merge commit, identity sets joining equal at 64 in both directions, projections regenerated to a fixed point on a seed rebuilt from the merged tree, with the read-only gate exiting 0 over the result.

— sent from vivid-lark-739

…the merged authority

Re-runs the cycle against a tip that moved under the previous one. #10124's
`declared_return_disagrees_with_the_generic_it_returns` landed on main after the
last regen, so the previous projection was generated from an authority that did
not yet contain it -- landing it would have dropped the row.

Regenerated rather than hand-resolved: the file is a projection, and resolving
its hunks by text merge produces bytes no generator emitted, which is worse than
either input.

Verified by IDENTITY JOIN rather than by count, per DESIGN section 5 -- a count
says something is wrong, a join names it:
  merged authority           65 identities
  only-main / only-mine      empty, both directions
  absent from my projection  none of the 65
  `declared_return_disagrees_with_the_generic_it_returns`  present in both
  this branch's own extension and its class-grain trigger  present
Read-only gate `tools.generated_artifact_gate main` exits 0 over the result, on a
seed rebuilt FROM the merged tree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JrD3jPReuyhZqSRkrxMKxb
@gunbai-bot
gunbai-bot Bot merged commit 8310a51 into main Sep 3, 2026
7 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/vivid-lark-739 branch September 3, 2026 00:26
@briansrls
briansrls restored the session/vivid-lark-739 branch September 3, 2026 00:30
@gunbai-bot
gunbai-bot Bot deleted the session/vivid-lark-739 branch September 3, 2026 01:17
gunbai-bot Bot pushed a commit that referenced this pull request Sep 3, 2026
…an around it

THIS MERGE COMMIT CARRIES CONTENT EDITS AND SAYS SO, because a merge that quietly changes
prose is the hardest kind of change to review. Both edits exist because main moved under
this branch: it was behind by 8 with THREE colliding commits (#10040, #10139, #10020), and
one of those three is this PR's own subject.

1. floor_cut_behavioural_equivalence: THE BLOCKER IS ENROLMENT, NOT EXPRESSIBILITY. When
   the row was drafted, no fixture was known to express the subject -- a missing harness,
   which DESIGN §4b treats as a genuine capability gap. #10139 falsified that: it filed the
   divergence as its own class and EXECUTED the discriminating fixture. §4b says where the
   refusal is authorable as fixture source, the evidence is enrollable there and declining
   it is specification-without-execution. So this row no longer stands on a missing
   capability; it stands on executed evidence nothing on the required path consumes, which
   is the unbuilt-but-buildable tier. The row now says that in its own words rather than
   letting the older framing imply the stronger claim, and the consequence is a shorter
   runway, not softer language. Raised by bright-ram-778, who drew the consequence I stopped
   one step short of.

2. The seventh-form receipt: CITE #10139, DO NOT RESTATE IT. An earlier draft described the
   interpreter-versus-emitted divergence in its own words. That divergence now has an owner
   with better evidence than prose -- realization_arms_diverge_on_whether_the_program_refuses,
   with an executed red -- so restating it would be a second authority for one fact,
   committed inside the row about subjects narrower than their claims. What remains is the
   half that is genuinely this row's: the divergence is #10139's subject, and the equivalence
   INSTRUMENT'S BLINDNESS to it is this one's.

The two docs/ projections are taken from main's side unresolved-by-hand and are STALE on
purpose: a projection is regenerated from its authority, never merged. Both are regenerated
in one pass when the window opens, which is after #10130 lands and rewrites
docs/design-failure-modes.md again.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RuWuQWB6MPkY7sNM4jEqAy
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.

0 participants