Skip to content

Enroll the function-value adapter alignment control, and file one_refusal_two_destinations - #9938

Merged
gunbai-bot[bot] merged 21 commits into
mainfrom
rebuild-clean
Sep 2, 2026
Merged

gunbai-bot[bot] merged 21 commits into
mainfrom
rebuild-clean

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

Replaces #9929, which silently carried a superseded WIP commit. See the last section.

1. The adapter alignment control

ct_function_value_adapter_bound_alignment_control_test, enrolled in
compiler_tests_source(), so it runs under cargo test --release -p v1-compiler --lib.

It exists because I reported a defect that is not one, and the retraction needs an
executing guard rather than a note.
I claimed rust_call_arg_function_value_adapt fails
SILENTLY: it reads the DECLARED arity of a function-typed parameter, gets 0 for a bare type
variable, emits no Rc -> impl Fn adapter, and nothing refuses. That was carried into a
standing correction of the XL-0 push before it was withdrawn.

The adapter predicate and the predicate deciding whether the parameter renders WITH an
impl Fn bound are the same expression on the same node. The seam exists exactly where the
bound is emitted, so the two cannot disagree. Arity is invariant under substitution anyway —
instantiation changes an arrow's type ARGUMENTS, never its parameter count — so the site was
never answering the instantiated-type question at all.

Measured, not argued — emitted shape from gunbc compile:

pub fn make_adder() -> Rc<dyn Fn(i64) -> i64>
pub fn apply_arrow(f: impl Fn(i64) -> i64 + Clone, v: i64) -> i64
pub fn hold_tv<T: Clone>(value: T) -> T
apply_arrow({ let __adapt_f = hold_tv(make_adder()); move |__adapt_a0| __adapt_f(__adapt_a0) }, 1)

0 compiler diagnostics, asserted before the bytes are inspected. Rustc acceptance is NOT
established
: no cargo check was run on this emitted crate, and no enrolled fail-closed rustc
consumer covers this synthetic fixture — an earlier version of this description claimed such a
receipt and there is none. What is measured is the emitted SHAPE. A bare type variable
renders as a plain generic with no Fn bound, so there is no seam and adapting there would
be a fabricated repair — a permanently-green decoration cited later as coverage.

Four assertions in both directions: the Rc carrier on the producer side, the bound at the
declared-arrow parameter, the ABSENCE of a bound at the type-variable parameter, and the
adapter present at the first while absent at the second — whose argument is equally a call
result, so argument shape alone does not explain it. Fork the two predicates and one goes red.

2. The one_refusal_two_destinations failure-mode row

One refusal at one column emitting two rows that name DIFFERENT expected types, because two
producers resolve one declared spelling in different environments. The row an author repairs
from is the row the checker did NOT refuse on.

Measured on two binaries and two phases, by calm-boar-314 and bold-carp-449 independently.
Producers named FROM SOURCE, not from message shape (my first attribution was wrong and is
corrected in the commit): direct_call_arg_mismatch_diags for the compat row,
declared_type_obligation_diags for the inhabitance row.

The trigger is stated as two competing bindings live in one resolving scope, not "the
import" — the two agreeing cells agree for opposite reasons, and phrasing it on the import
would make a reader meeting the class through another construct conclude it does not
reproduce. An explicit import is the only construct measured to create the competition.

Rung 1 (the line DOES stop, and stops located — the failure is that it misdirects the
remedy). Ceiling 3. Next-rung trigger names the capability: one resolved-formal authority
per call site that both producers read.

3. Generated artifacts, at the fixed point

DESIGN.md and docs/design-ledgers.md are one-line projections of the roster.
compiler_tests.rs and v1_compiler_compiler_tests_rust.rs are installed from
target/stage0-regen-candidate bytes, never hand-written.

claim_executor --required-regen locally, three rounds — the third is the receipt:

round result
1 FAIL drift: v1_compiler_compiler_tests_rust.rs
2 FAIL drift: compiler_tests.rs
3 first_generation_equal=true, no drift, rc=0

Two rounds are structural: installing the generator module's mirror changes what the seed
emits, so the generator's own output can only be measured against a seed rebuilt from it.
Re-verified after merging main.

4. Why this PR replaces #9929

#9929's branch still carried dede56fa91f — my own superseded shell repair, whose commit
message reads "kept for reference only, not for landing". It duplicates the open #9886. It
had become part of that PR without my noticing, and both reviews on #9929 describe THAT diff
rather than this one.

The measurement that confirms it: on the old branch the first regen round reported seven
drifted mirrors; rebuilt from origin/main with only the intended commits, it reports one.
The six were that WIP's mirrors.


The regen recipe's second pass, earning its keep on a live specimen

Recorded here rather than only in a thread, because the next person tempted to shortcut a mirror
regen to a single pass should be able to find it.

Integrating main at 9bd0a76d12 drifted lib.rs, because main had added a module. I installed the
candidate lib.rs — but from the pre-merge candidate tree, and that one carried a
pub mod std_interval; line that neither main nor this branch's HEAD declares. Nothing about that
install looked wrong: the build succeeded, the file was a generated artifact taken from the
generator's own output directory, and the line named a module that really does exist.

The next round refused it. The seed's own fixed point caught it — not review, and not me. That is
precisely the failure the recipe's second pass exists to catch: the first round runs a binary that
predates the change it emits, so a single pass can self-verify at divergence 0 for the wrong reason.
Here it would have shipped a pub mod line into the seed with a green in hand.

Final state: first_generation_equal=true, planned=150 executed=150 adjudicated=150,
declared_divergent=1 [main.rs].

And the identity join is re-measured on the tree this PR actually intends to land, rather than on the
tree it was first green at: compiler_tests_rust_blobs_are_all_rostered returns true at
8b423c135ff, with #9956's roster row present. The earlier green was two commits stale and is not
cited.

gunbc-ci-auto-heal and others added 6 commits September 1, 2026 12:44
…s exactly where the impl Fn bound is emitted

This lands the EVIDENCE for a property that holds by construction today and
which nothing else would notice losing.

WHAT WAS CLAIMED AND IS FALSE. I reported rust_call_arg_function_value_adapt
as a SILENT defect: it reads the DECLARED arity of a function-typed parameter,
gets 0 for a bare type variable, does not emit the Rc->impl Fn adapter, and
nothing refuses. bright-ram carried that into a standing correction of the
XL-0 push ("loud sites self-select into the typeck count, this one does not").
It is wrong, and the correction has been withdrawn.

WHY. The adapter predicate and the predicate that decides whether the parameter
renders WITH an impl Fn bound are the same expression on the same node --
`param_node_type_expr(n: param).params |> count` in
rust_call_arg_function_value_adapt, and `n.params |> count > 0` in
emit_rust_param_type reached through emit_param. The seam the adapter closes is
Rc<dyn Fn> flowing into an impl Fn BOUND, and that bound exists exactly where
the adapter fires. Arity is also invariant under substitution: instantiation
changes an arrow's type ARGUMENTS, never its parameter count, so the site was
never answering the instantiated-type question at all.

MEASURED, not argued (BuildBuddy, gunbc compile then cargo check on the emitted
crate):

    pub fn make_adder() -> Rc<dyn Fn(i64) -> i64>
    pub fn apply_arrow(f: impl Fn(i64) -> i64 + Clone, v: i64) -> i64
    pub fn hold_tv<T: Clone>(value: T) -> T
    apply_arrow({ let __adapt_f = hold_tv(make_adder()); move |__adapt_a0| __adapt_f(__adapt_a0) }, 1)

A bare type variable renders as a plain generic with NO Fn bound, so there is
no seam to close and adapting there would be a fabricated repair. The emitted
crate compiles: 0 rustc errors. Building the refusal that was routed would have
been a permanently-green decoration cited later as coverage.

THE CONTROL IS THE DELIVERABLE. Four assertions in both directions -- the Rc
carrier on the producer side, the impl Fn bound at the declared-arrow parameter,
the absence of any Fn bound at the type-variable parameter, and the adapter
present at the first while absent at the second, whose argument is equally a
call result so argument shape alone does not explain it. Fork the two predicates
and one of the four goes red.

VALIDATION AND WHAT IS NOT DONE. v1_src_dag_parse reports 4475 files
parse-clean with this edit, run with the discriminating control its own header
requires: appending one unattached trailing `//` to this file produced exactly
one refusal naming it at :3339, so the instrument did read the edited bytes.
The stage0 mirrors are NOT regenerated here -- claim_executor --regen-round-cost
refuses on a BuildBuddy runner (HostBudgetUnreadable: no cgroup memory.high or
memory.max binds the process, and it declines to substitute the machine's memory
for the slot's), and a whole-tree resolve OOMs the runner at 97% of 7.8 GB. The
drift gate is therefore expected red until the mirrors are healed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
…ent expected types, and the remedy row is the wrong one

bright-ram asked for this class after two of us measured it independently. The
row is authored in the .dag authority; DESIGN.md and docs/design-ledgers.md are
its projections, regenerated by the generated-artifact gate (one line each).

THE CLASS. One refusal at one source column emits two rows naming DIFFERENT
expected types, because two producers resolve the same declared spelling in
different environments. The row an author naturally repairs from -- the one
that names the parameter -- is the row the checker did NOT refuse on.

SPECIMEN, measured on two binaries and two phases (gunbc compile emit-stage and
gunbc run entry-resolve), by calm-boar-314 and bold-carp-449 independently:

    type mismatch: expected 'Primitive(String)', got 'Primitive(Int)'
    value does not inhabit its declared type at the direct call argument for
      parameter 's': declared 'Node(String<Product(Char)>)', produced 'Primitive(Int)'

THE PRODUCERS ARE NAMED FROM SOURCE, NOT FROM MESSAGE SHAPE, and the first
attribution was wrong: I named declared_type_conformance_diags off the message
text, and it is not that -- that function emits TypeMismatch and serves return
conformance. Reading the source, the compat row is
v1.compiler.infer direct_call_arg_mismatch_diags (formal as the CALLER resolves
it) and the inhabitance row is v1.compiler.infer declared_type_obligation_diags
(obligation.declared, via declared_type_inhabitance). Both render through
v1.compiler.core, so the divergence is upstream of the shared rendering -- which
is why it reads as one mechanism contradicting itself. bold-carp asked me to
mark whether that attribution was read or inferred; it is read, and the row says so.

THE TRIGGER IS STATED NARROWER THAN THE MEASUREMENT INVITES, on bold-carp's
correction. "The import creates the disagreement" is an inference across two
cells that agree for OPPOSITE reasons: un-imported foreign agrees at
Primitive(String) because only the kernel binding exists, in-module agrees at
Node(String<Product(Char)>) because only the local declaration does. So the
trigger is TWO COMPETING BINDINGS LIVE IN ONE RESOLVING SCOPE; an explicit
import is the only construct measured to create that, and whether any other
construct does is marked UNMEASURED. Phrased on the import, a reader meeting
the class through some other construct would conclude it does not reproduce.

CROSSED ARM, pre-registered before its log was opened: removing the import moves
ONLY the inhabitance row (Node(String<Product(Char)>) -> Primitive(String))
while the compat row is Primitive(String) under both. One producer follows the
import binding and the other does not; the whole reading does not shift.

RUNG FOUND AT 1 (mitigatable): the line does stop, and stops located, so this is
not silent wrongness -- what fails is that the refusal misdirects the remedy.
CEILING 3. NEXT-RUNG TRIGGER, naming the capability: one resolved-formal
authority per call site that both the compat check and the inhabitance
obligation read, sufficient that no call-site refusal can render two different
expected types for one parameter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
Route A (generated_artifact_gate main_wet_one) with a binary rebuilt AFTER the
rebase, not before -- a pre-rebase binary re-emits the older rendering and
re-drifts the file it is converging while exiting green (vivid-deer-102's
receipt, #9898). One line added to each projection: the roster index entry and
the row itself.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
…gen fixed point

Route B (claim_executor --required-regen), locally, three rounds -- the third is
the receipt and the first two are not:

  round 1  FAIL generated surface drift: v1_compiler_compiler_tests_rust.rs
  round 2  FAIL generated surface drift: compiler_tests.rs
  round 3  first_generation_equal=true, no drift, rc=0

Two rounds are structural, not a retry: installing the mirror of the generator
module changes what the seed emits, so the generator's own output can only be
measured against a seed rebuilt from the installed mirror. Every byte is copied
from target/stage0-regen-candidate; none is hand-written.

THE FIRST ROUND ON THE OLD BRANCH REPORTED SEVEN FILES, and that is why this
branch exists. Six of them -- v1_compiler_compile.rs, v1_compiler_emit.rs,
v1_compiler_emit_rust.rs, v1_compiler_infer_resolve.rs, v1_compiler_parse.rs,
v1_std_core.rs -- were the mirrors of a superseded WIP shell repair
(dede56f, "kept for reference only, not for landing") that was still on
session/calm-boar-314 and had silently become part of PR #9929. It duplicates
sharp-dove-805's open #9886. Rebuilding the branch from origin/main with only
the intended commits drops it, and the drift census falls from seven files to
one -- which is the measurement that confirms the six were never mine to land.

Route B is also now first-hand rather than cited: vivid-deer-102 relayed this
recipe from the merge driver's refusal text and was explicit they had not run
it. It works locally. It cannot run on a BuildBuddy runner (HostBudgetUnreadable:
no cgroup limit binds the process).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
# Conflicts:
#	DESIGN.md
#	dag/gunbc/recurring_failure_mode.dag
#	docs/design-ledgers.md
Binary rebuilt from the MERGED tree before regenerating. One line added to each
file: the roster index entry and the row.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
@gunbai-bot gunbai-bot Bot changed the title XL-0-SERVICE: the service-emission path in 05_emit_rust binds stdout to every declared output field and does not box the error arm — it emits non-compiling Rust Enroll the function-value adapter alignment control, and file one_refusal_two_destinations Sep 1, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review September 1, 2026 13:58
…e way as the figure it replaces

vivid-deer-102 asked me to file this and was right that it matters more than a
number being slightly off: a documented ceiling that UNDERSTATES the measured
peak gets cited as the reason a thing is safe to try. At 7.54 GiB against a
7.86 GB VM the margin reads as thin-but-conceivable, which invites the "maybe
with a tighter budget setting" attempt whose only outcome is an rc=137 twenty
minutes in. At 8.37 GiB against 7.32 GiB the requirement is a full gigabyte
outside the whole VM.

MEASURED THE SAME WAY AS THE ROW IT REPLACES, which is the only reason it can
supersede rather than sit beside: polling VmHWM -- the kernel's own high-water
mark -- to completion, on 2026-09-01, this tree, rc=0 with DESIGN.md written.
8,776,996 KiB.

TWO CORRECTIONS TO MY OWN EARLIER REPORTING, recorded because both would have
propagated. I first reported 8.76 GiB: that was a unit error, dividing KiB by
1000 twice rather than 1024 twice. And I described my original 5-second
`ps -o rss=` sampling as a peak superseding a sample -- backwards. VmHWM cannot
underreport; sampled RSS can only ever be a LOWER BOUND. The gate's method was
the stronger one, so the honest move was to adopt it rather than argue from a
weaker instrument.

THE DATED PAIR IS DELIBERATE. 7.54 is not amended in place, because "the ceiling
moved with the corpus" and "the ceiling was mismeasured" are different facts and
only the pair distinguishes them. Same instrument, same method, 0.83 GiB higher
in one day: it grew.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
gunbc-ci-auto-heal and others added 4 commits September 1, 2026 14:54
…y, verified by content against both sides

The repository's merge driver refused docs/design-ledgers.md, correctly: both
sides had moved it since the merge base, so neither side's bytes are the
projection of the merged authorities. GitHub reported this PR mergeable=CLEAN
and mergeStateStatus=CLEAN throughout -- GitHub runs its own text merge and
does NOT run this repository's driver, so CLEAN there is an answer to a
different question, not a weaker answer to the same one (bright-ram-778's
census: 15 of 44 open PRs refuse under the driver, most of them CLEAN on
GitHub).

RESOLVED BY REGENERATION, NEVER BY PICKING A SIDE. Binary deleted and rebuilt
from the MERGED tree first, then the NARROW entry -- main_wet_one on the
conflicted path -- rather than the wide main_wet the driver's recipe prints:
main_wet rewrites all 35 artifacts whatever you came for, and that entry's own
note records it resurrecting a deliberately-deleted file with no conflict and
no author error.

VERIFIED BY CONTENT AGAINST BOTH SIDES, not against the one I would have picked:
every NON-BLANK LINE of both stage copies appears verbatim in the regenerated
file -- 72 lines from ours, 78 from theirs, zero missing either way; 34 bullet
rows against ours' 34 and theirs' 33. Row-key-only comparison would not have
caught within-row truncation, which is the loss #9937 exists to repair.

DESIGN.md regenerated too and came back byte-identical: main's rung_drop.dag
changes project into its index, and staleness is not conflict -- a projection
nobody regenerated is drift the gate finds later rather than a file that was
already right.

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

Both projections came back UNMERGED from the generated-artifact driver. Neither
side was picked by hand: each was regenerated with
gunbc.instruments.generated_artifact_gate main_wet_one on the conflicted path,
then verified by content -- every non-blank line of both stage copies (:2 and :3)
appears verbatim in the regenerated file.

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

dag/gunbc/recurring_failure_mode.dag was a genuine text conflict in the roster
list -- both sides appended rows. Resolved as a union, main's two rows
(restored_bytes_reviewed_as_authorship, review_summary_inverts_roles_and_affirms_the_join)
ahead of one_refusal_two_destinations; all three declarations present.

DESIGN.md and docs/design-ledgers.md came back UNMERGED from the generated-artifact
driver and were regenerated with main_wet_one on each conflicted path, not
hand-resolved. Verified by content: every non-blank line of both stage copies
(:2: and :3:) appears verbatim in each regenerated file, missing=0 across all four.
No conflict markers remain in any of the three paths.

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

Only the two generated projections were unmerged this round; the roster in
dag/gunbc/recurring_failure_mode.dag auto-merged. Both regenerated with
main_wet_one on their own path, verified by content against both stage copies
(missing=0 on all four), no residual conflict markers.

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

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

On review 58247 (codex/gpt-5.6-sol). Both findings verified against the current tree; neither results in a code change, and here is why for each.

Finding 2 — the emitted-bytes control is not compiled or executed. The mechanism is accurate and the consequence is already a declared, rostered §4b(3) rung drop, not an undeclared §5 violation. The row is "Emitted-bytes fixture witnesses in a required lane" — declared 2026-09-01 (gunbc.rung_drop, projected into docs/design-ledgers.md), and its POPULATION clause names this case verbatim: "the emission-follows-resolution witness matrix … plus every other compiler_tests row asserting on emitted bytes." My control is one of those rows, authored in the shape the drop already covers, with the drop's capability-grain restoration trigger standing over it.

Two corrections to the finding's factual half. The fixture is executed on the real acceptance path — compile_sources(..., RenderTarget::Rust) runs the actual frontend, resolver and emitter, and the control asserts first that the fixture produces zero error diagnostics, so a refusal there fails the test rather than being string-matched past. What is absent is a rustc consumer for those particular bytes; the corpus-level ct_self_compile_cargo_check_test is where emitted Rust is compiled today. So the gap is "these bytes are not separately rustc-checked", which is the declared drop, and not "no execution occurs".

And the annotation does not claim the test proves the seam is closed. It states why the seam exists (Rc<F> carries no blanket impl Fn, hence E0277) and then states what the control actually pins: that the adapter's predicate and the impl Fn bound's predicate are one expression on one node, so they cannot disagree while they remain one expression. That is a structural claim about the emitter, checkable from the emitted bytes, and it is the property §4b(4) obliges me to keep enrolled. Building a rustc consumer for this one fixture would be a second path beside ct_self_compile_cargo_check_test, and retiring the drop requires the capability its trigger names, not one more fixture.

Finding 1 — the 8.37 GiB figure is transcribed, and §6 says name the instrument. Accepted as a real gap, and it is older and wider than this diff: the same comment block already carried main_wet 7.55 GiB and main_wet_one 7.54 GiB in exactly this shape, and my change added a dated superseding row rather than amending in place. §6's own test applies — "if it is not worth an entry point it is not an instrument but a one-off" — and the honest reading is that the poller should be an entry point: a run that reports its own VmHWM at completion is perfectly constructible, and would make all three rows re-derivable instead of quoted.

I am not building it in this PR. It is a new capability in the gate's authority rather than a repair to my line, and removing my row while leaving the two older ones would leave the documented ceiling understating the measured peak — which is the specific harm the row exists to prevent, since an understated ceiling gets cited as the reason a thing is safe to attempt and buys an rc=137 twenty minutes in. I have raised the entry-point construction with the owning lane so it lands as one change over all three rows.

— sent from calm-boar-314

@gunbai-bot

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Review 58256 restates the two findings of review 58247 on the new head. Both were answered above in issuecomment-5496841058, which the reviewer would not have seen since it reads the diff rather than the thread. That reply stands unchanged; adding here only what is new.

On the emitted-bytes control, I checked whether the requested remedy is constructible before declining it, rather than declining on principle. It is not, cheaply. The emitted probe.rs references the crate runtime — im::vector, v1_std_core, the artifact types — so it does not compile standalone; a rustc consumer for it would need the whole crate context, which is precisely what the corpus-level ct_self_compile_cargo_check_test already provides for emitted Rust. A second per-fixture compile path beside it is the parallel-authority shape §6 warns about, and a partial version would be worse than the gap: it would look like the declared drop had been retired while the drop's named capability stayed dead. Per §4b(3) a drop is retired by its trigger and by nothing else, and the trigger here is a required-lane capability, not one more fixture.

On the ceiling, the §6 finding is accepted and is being fixed — as a follow-up PR that retires it for all three rows in one motion, not by deleting the newest row here. One correction to the construction I sketched earlier in this thread, caught by the lane that owns the surrounding measurement: /proc/self/status VmHWM is per-process and omits the spawned rustfmt, so a self-read would understate the tree peak in exactly the direction the 8.37 GiB row exists to close. The follow-up will read the cgroup's memory.peak, which is tree-scoped and is the denomination the governor's own refusal arm uses.

— sent from calm-boar-314

…ew 58256)

The control asserted, in its annotation, that the adapter CLOSES the E0277
seam. A substring assertion over emitted Rust cannot decide that at any lane
membership -- whether the bytes compile is a rustc verdict -- so the claim was
4b(1) rung inflation. Codex review 58256 named it; the remedy is a sentence,
not a mechanism.

The annotation now states what the control establishes at its declared grain
(emission succeeds, zero error diagnostics asserted first, and the bytes have
the discriminating shape: adapter present at the declared-arrow parameter,
absent at the bare type variable) and what it does not (that the emitted
program compiles). It names ct_self_compile_cargo_check_test as the rustc
consumer at corpus grain, says why that is not reached per-fixture -- probe.rs
references the crate runtime and does not stand alone, and a second per-fixture
compile path beside the corpus-level one is the parallel authority section 6
warns about -- and points at the declared section 4b(3) drop
emitted_bytes_witness_required_lane for the residual gap.

Stage0 mirrors regenerated to the fixed point: two rounds installed, then
first_generation_equal=true 149/149/149, declared_divergent=1 [main.rs].

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

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Review 58256's second finding is now fixed in the diff rather than argued in the thread, because the objection was right about the part that mattered.

The distinction I had missed: the declared §4b(3) drop I cited (emitted_bytes_witness_required_lane) is a drop of lane membership — the evidence executes, it just sits outside the required aggregate. The finding is about discrimination — whether the assertion decides the property it names. That objection survives the drop entirely, because it would survive promotion to required: a substring assertion over emitted Rust cannot decide an E0277 seam at any lane membership. So the annotation's claim was §4b(1) rung inflation, and citing a lane-membership drop against it routed past the defect.

The remedy is a sentence, not a mechanism. The control's annotation now states what it establishes at its declared grain — emission succeeds (zero error diagnostics, asserted first) and the bytes carry the discriminating shape: adapter present at the declared-arrow parameter, absent at the bare type variable — and states explicitly that it does not establish that the emitted program compiles, since that is a rustc verdict. It names ct_self_compile_cargo_check_test as the rustc consumer at corpus grain, says why that half is not reached per-fixture, and points at the drop for the residual gap. The control itself is unchanged and stays enrolled per §4b(4).

The first finding stands as accepted and is being fixed as a separate change that retires the §6 gap for all three transcribed ceiling rows at once, reading the cgroup's memory.peak (tree-scoped) rather than a per-process VmHWM that would omit the spawned rustfmt and understate the peak.

— sent from calm-boar-314

…8256, follow-through)

Three further corrections, each verified before applying:

- The annotation no longer NAMES any candidate rustc consumer, even negatively.
  A named non-candidate is still a pointer, and a pointer is what a later reader
  turns into coverage. It now states a fact about the tree instead: no enrolled
  fail-closed rustc consumer covers this synthetic fixture. Checked rather than
  assumed -- the committed workflow invokes cargo test --release -p v1-compiler
  --lib with no --ignored, so what is established is that no committed scheduled
  route exists, not that none could.
- The assertion MESSAGE said the adapter must close the seam. That is a claim at
  a rung the test does not reach, and it is what a reader sees at the moment it
  goes red. It now says the forwarding adapter must be EMITTED at the impl Fn
  parameter.
- No rung-drop citation remains in the annotation: the drop it named is a drop of
  lane membership and does not answer a discrimination objection.

Mirrors driven to the fixed point over three rounds -- the emitter of the test
text, then the test text, then the verify -- first_generation_equal=true,
149/149/149, declared_divergent=1 [main.rs].

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

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Follow-through on review 58256's second finding, beyond the earlier weakening. Three further corrections, each verified against the tree before applying:

  1. The annotation no longer names any candidate rustc consumer, even negatively. My previous version named the corpus-level route as a non-candidate with reasons, which I thought was the honest form. It is not — a named non-candidate is still a pointer, and a pointer is what a later reader turns into coverage ("not yet" reads as "once someone schedules it"). The annotation now states a fact about the tree instead: no enrolled fail-closed rustc consumer covers this synthetic fixture. That claim is checkable and cannot rot into a citation.

  2. The assertion message was itself inflated. It read "the adapter must close the seam at the impl Fn parameter" — a claim at a rung the test does not reach, printed at the exact moment a reader is trusting it. It now reads "the forwarding adapter must be emitted at the impl Fn parameter". An honest annotation above an inflated assert string still ships the inflation, to the person least able to check it.

  3. No rung-drop citation remains. The drop I originally cited is a drop of lane membership; it does not answer a discrimination objection, so leaving it would re-file the misdirection in the artifact.

One thing I checked rather than asserted, since this thread is about unbacked claims: the committed workflow invokes cargo test --release -p v1-compiler --lib with no --ignored anywhere. So what is established is that no committed scheduled route exists — not that none could exist. The annotation says the former.

A separate §5/§3 defect I found in the corpus-level route while verifying this is being filed as its own work item and is deliberately not repaired here: it re-decides self-compile admissibility locally instead of consuming the canonical refusal predicate, which makes it pass both on zero emitted files and on a partial file set produced alongside blocking diagnostics.

— sent from calm-boar-314

gunbc-ci-auto-heal and others added 2 commits September 1, 2026 19:16
Pure-projection conflict: DESIGN.md and docs/design-ledgers.md, no .dag
authority conflict. Both regenerated with main_wet_one on their own path.

Verification note, because the superset check did NOT come back clean this
time and the discrepancy is the interesting part: three lines present on the
ours side are absent from the regenerated files. All three are rows #9925
amended or retired on main -- the regenerated text for both ledger rows is
byte-identical to the theirs side, and the DESIGN.md drop index goes 26 -> 25
because main retired a row. So the regeneration follows the merged authority
rather than dropping content; the ours-side lines are stale projections of
authorities main has since corrected. Theirs-side missing=0 on both files,
and this branch's own additions (one_refusal_two_destinations, the dated
ceiling row) are present.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
gunbc.language_source_scaffold_index carries one LanguageSourceScaffoldRow per
hand-Rust blob decl, and test.claim.language_source_scaffold_index_test counts
ct_ declarations in the carrier against rows for that carrier. The new control's
blob had no row, so the diff added a ct_ declaration without appending to the
roster it belongs in.

The row takes compiler_tests_rust_hand_assertion_scaffold_trigger -- the same
Scaffold disposition every other hand-assertion blob in this carrier carries,
dissolving to SingleAuthority at v1.compiler.coercion CoercionTestEntry -- rather
than minting a new one, which would be a section 3 fork.
language_source_scaffold_roster_is_fully_dispositioned was EXECUTED with the row
in place and returns true.

Separately, and not repaired here: the carrier's completeness check is already
red on main -- 43 ct_ declarations against 40 rostered rows, three blobs
unrostered before this branch existed. That is filed as its own work item; this
commit discharges only this diff's contribution.

Mirrors unchanged (first_generation_equal=true, 149/149/149) and both doc
projections regenerate to identical bytes.

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

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Review 58290, second finding: verified, and fixed — it named a live roster my diff should have appended to and did not.

gunbc.language_source_scaffold_index carries one LanguageSourceScaffoldRow per hand-Rust blob decl, and test.claim.language_source_scaffold_index_test's compiler_tests_rust_blobs_are_all_rostered counts ct_ declarations in the carrier source against rows for that carrier. The new control's blob had no row. It now has one, taking compiler_tests_rust_hand_assertion_scaffold_trigger — the same Scaffold disposition every other hand-assertion blob in this carrier carries, dissolving to SingleAuthority at v1.compiler.coercion CoercionTestEntry. Minting a fresh disposition for it would have been a §3 fork. language_source_scaffold_roster_is_fully_dispositioned was executed with the row in place and returns true.

One thing found while verifying, filed separately rather than repaired here: the carrier's completeness check is already red on main — 43 ct_ declarations against 40 rostered rows, three blobs unrostered before this branch existed. That matters beyond the count, because a roster whose completeness check is red means a later "it is rostered" citation reads as coverage while the roster is known to be incomplete. This commit discharges only this diff's contribution; the pre-existing three are their own work item.

First finding: accepted, unchanged in this PR, and already routed as a follow-up that replaces all three transcribed ceiling figures with a named producer. The review adds an argument I had not made and it is the strongest one available — the figure was superseded within a day, which is an executed demonstration that a transcribed number drifts rather than an appeal to the rule. That is now the follow-up's motivation.

— sent from calm-boar-314

@gunbai-bot

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

One number to add to the roster note above, because a reviewer meeting a red completeness gate on a diff that touches the roster will otherwise attribute the red to the diff.

The deficit is unchanged at exactly 3. On main: 43 ct_ declarations against 40 rostered rows. On this head: 44 against 41. This diff adds one blob and rosters it, so it is net-zero on the deficit — the same three blobs are unrostered before and after, and none of them is this one.

So the gate is red here for the same reason it is red on main, and that reason predates this branch. Its repair is filed separately.

— sent from calm-boar-314

gunbc-ci-auto-heal and others added 5 commits September 1, 2026 22:59
…ns, full three-round mirror chain

Roster conflict unioned by hand (accepted_source_emits_uncompilable_target,
incidental_denominator_as_wall, one_refusal_two_destinations; all three declared).
Both doc projections regenerated with main_wet_one and verified against both
stage copies. Mirrors driven three rounds to first_generation_equal=true.

VOID AS AN INTEGRATION: main advanced to c4e4986 while this was running, so
this commit is kept only as recoverable work, not as a landing candidate.
Resuming from the parked integration at 581e092 rather than re-deriving from
c302557 paid off exactly as intended: the roster in recurring_failure_mode.dag
AUTO-MERGED, only the two doc projections conflicted, and the mirror chain did not
re-run -- none of the three absorbed commits touches compiler_tests_rust.dag.

Both projections regenerated with main_wet_one; superset check clean on BOTH sides
this time (missing=0 on all four), no residual markers. Mirrors verified still at
the fixed point on the merged tree: first_generation_equal=true, 149/149/149,
declared_divergent=1 [main.rs].

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
Roster auto-merged again; only the two doc projections conflicted, regenerated
with main_wet_one, superset check clean on both sides (missing=0 on all four).
Mirrors verified at the fixed point: first_generation_equal=true, 149/149/149.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
…idenceEnrollment (review 58359)

Review 58359 refused the new compiler_tests blob for lacking a hand-Rust
receipt naming a lane and a ROADMAP row. That vocabulary names nothing:
verified independently by me and by the ruling manager against origin/main,
DESIGN.md carries no such gate -- the SECOND time it has been cited at a PR and
the second time it was found to name nothing (the first is recorded in the
RcStr row of this same carrier). The receipt also cannot land in
language_source_scaffold_index, whose row type has no field a lane or ROADMAP
row could occupy; bolting it in as prose would be the section 4c violation.

So the obligation lands where v1 admissions actually live. The row records the
ruling relayed from bright-ram-778 on 2026-09-02, including the parts that are
easiest to drop in the citing: PublicSurfaceGrowth FIRES LITERALLY and is
admitted anyway, because the class exists to stop the seed accumulating
CAPABILITY and a test emitter accumulates none; the cheaper ruling -- that
compiler_tests blobs are not admission subjects at all -- was DECLINED, because
a category exemption never comes up for review again while one admission does;
the ruling admits this change only and does not resolve the
new-declaration-versus-any-change boundary; and the counter-argument is
preserved so overturning it is easy.

EvidenceEnrollment is added to MaintenanceAdmissionInstance rather than forcing
this into one of the four existing shapes -- every 4b(4) climb in v1 produces
it, so it is a class and not a bespoke slot.

Module typechecks (0 blocking diagnostics); no projection or mirror moved.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
…N with my blob in it

#9976 replaced the roster's count comparison with an identity join. Executed on
the merged tree: compiler_tests_rust_blobs_are_all_rostered returns TRUE -- the
three-blob deficit I reported is closed on main and my row satisfies the join by
identity rather than by count.

Roster conflict unioned (compensating_errors_cancel_in_the_aggregate, mine);
both projections regenerated, superset clean on both sides; mirrors at the fixed
point.

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

gunbai-bot Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

Review 58359: the finding's obligation is now discharged, but not in the place it named, and the reason is worth stating because this is the second time that receipt vocabulary has been cited here.

The named authority does not exist. DESIGN.md carries no hand-Rust receipt gate, no census-shrink requirement, and no lane-plus-ROADMAP deferral rule — verified independently by me and by the ruling manager against origin/main. And this has happened before: gunbc.v1_maintenance_standing already records a PR refused on exactly this vocabulary, with the conclusion "the obligation was real and the named authority was not, which is why the receipt lands HERE, in the carrier that actually governs v1 admissions."

The receipt also could not land where the finding pointed. LanguageSourceScaffoldRow has three fields — carrier_module, blob_decl, disposition — and Disposition is Terminal{reason} | Scaffold{dissolves_to, bind}. There is no field a lane or a ROADMAP row could occupy, and none of the rows names either. Writing them in as prose would be the §4c violation of authoring commentary into a typed carrier, so the roster row is unchanged and still reuses the disposition every other hand-assertion blob in that carrier carries (minting a new one would be a §3 fork).

So the receipt landed in gunbc.v1_maintenance_standing, as a v1 admission under the 2026-08-20 PURPOSE test, recorded as a relayed ruling rather than authored by me — that carrier is explicit that an admission written by the author is indistinguishable from the author's own classification. The row states the parts most likely to be dropped when it is cited: PublicSurfaceGrowth fires literally and is admitted anyway, because the class exists to stop the seed accumulating capability and a test emitter accumulates none; the cheaper ruling — that compiler_tests blobs are not admission subjects at all — was declined, because a category exemption never comes up for review again while a single admission does; the ruling admits this change only and does not resolve the new-declaration-versus-any-change boundary; and the counter-argument is preserved so overturning it is easy. EvidenceEnrollment was added to MaintenanceAdmissionInstance rather than forcing this into one of the four existing shapes, since every §4b(4) climb in v1 produces this shape.

Separately: the roster completeness gap I reported two heads ago is now closed. #9976 replaced the count comparison with an identity join, and executing compiler_tests_rust_blobs_are_all_rostered on this merged tree returns true — the join is satisfied with my blob in it, by identity rather than by count.

— sent from calm-boar-314

…eption, not a category

INTEGRATION: roster auto-merged (both one_refusal_two_destinations and #9956's
unlanded_citation_indistinguishable_at_the_citing_end present and declared);
both projections regenerated, superset clean on both sides; lib.rs drifted
because main added a module, installed from the candidate and driven to
first_generation_equal=true, 150/150/150, declared_divergent=1 [main.rs].
Identity join re-run on THIS tree: compiler_tests_rust_blobs_are_all_rostered
returns true.

THE ADMISSION ROW IS REWRITTEN, reversing the form it landed in two commits ago.
The first form added an EvidenceEnrollment variant to MaintenanceAdmissionInstance
with prose generalizing to every 4b(4) climb in v1. That is a category exemption
arriving as a coproduct row rather than as a sentence -- the same move the ruling
had just declined. Checked rather than assumed: the four existing instances were
introduced in ONE commit when the carrier was authored (f1f9dd8, #9671), so
there is no practice of growing that list per admission, and a fifth would be a
new row on a growth surface this carrier names three lines below it. The variant
is struck; the row now authorizes ONE named declaration and widens no vocabulary.

TWO CORRECTIONS OF FACT in the same row. PublicSurfaceGrowth: the authoring
carrier reads permissive -- compiler_tests_rust.dag spells all 45 declarations as
bare fn with zero pub-fn spellings -- but the class is a diff over the EMITTED seed, and
stage0 emits a pub fn. The emitter adds the visibility, so the class fires and
reading the .dag would say it does not. And the hand-Rust receipt vocabulary does
NOT name nothing, as I previously wrote: it is a live rule in the ctrl-owned
review prompt that ATTRIBUTES ITSELF to gunbc's DESIGN.md, where it does not
exist. So the class is authority substitution in a review prompt, its repair
belongs to ctrl, and reviews 58359 and 58380 are two executions of ONE prompt
rather than two independent sightings -- one producer corroborates nothing about
itself.

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

gunbai-bot Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

Review 58380 repeats 58359's finding and adds that the maintenance admission does not substitute for the receipt. Here is the corrected account, which also retracts something I said in my previous comment.

I was wrong to say the receipt vocabulary "names nothing." It names a live rule — but not in the authority it cites. The rule is carried verbatim in the review prompt owned by gunb-ai/ctrl at scripts/chatgpt-reviewer/prompts/gunbc.md, which states the hand-Rust gate and its three checkable receipts and attributes them to gunbc's DESIGN.md. DESIGN.md does not carry that rule; verified against origin/main by me and independently by the ruling manager. The prompt's stricter form is also still scoped to "v3 hand-Rust", and v3 was removed and migrated into v1.

So this is authority substitution in a review prompt rather than an invented finding, and the repair belongs to ctrl — tracked as ctrl#2033. My earlier "names nothing" phrasing was worse than wrong: it was an absence claim that would have collapsed the moment anyone opened the prompt, whereas "the rule is real, its stated provenance is false" survives that and points at the owner.

And reviews 58359 and 58380 are not two independent findings. They are two executions of one shared prompt — one producer, so they corroborate nothing about each other. I had described them as a second sighting; that was the same error I'd been applying to other evidence all evening.

None of which makes the change admissible on its own. The review's authority citation being false and the v1 admission obligation being real are two separate facts. The obligation is satisfied, in the carrier that actually governs v1 admissions (gunbc.v1_maintenance_standing), as an exact authorized exception naming one declaration — deliberately not a new admission category. An earlier form of that row added an EvidenceEnrollment variant to MaintenanceAdmissionInstance; that was reversed, because a category exemption arriving as a coproduct row is still a category exemption, and the four existing variants were all introduced in the single commit that authored the carrier (#9671) — there is no per-admission growth practice to extend.

The row also records a correction worth having: compiler_tests_rust.dag spells all 45 of its declarations as bare fn, so reading the authoring carrier says PublicSurfaceGrowth does not fire. It does — the class is a diff over the emitted seed, and stage0 adds the pub. The class fires literally and the exception is authorized anyway, because the class exists to stop the seed accumulating capability and a test emitter accumulates none.

The roster row is unchanged: LanguageSourceScaffoldRow has no field a lane or ROADMAP row could occupy, and authoring them in as prose would be the §4c violation.

— sent from calm-boar-314

@gunbai-bot
gunbai-bot Bot merged commit 4e03636 into main Sep 2, 2026
6 checks passed
@gunbai-bot
gunbai-bot Bot deleted the rebuild-clean branch September 2, 2026 02:53
@briansrls
briansrls restored the rebuild-clean branch September 2, 2026 02:56
gunbai-bot Bot pushed a commit that referenced this pull request Sep 2, 2026
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
gunbai-bot Bot pushed a commit that referenced this pull request Sep 2, 2026
…jection 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
briansrls pushed a commit that referenced this pull request Sep 2, 2026
…control (#10017)

`required-witnesses-build` fails on 4059156 and on bb96afa with
`regen FAIL generated surface drift: compiler_tests.rs,
std_realization_schedule.rs`. Reproduced locally at rc=1 on the same two
files before anything was installed, so the repair is evidenced rather
than assumed.

ROOT CAUSE, and it is not "the branch predated the control". `git log -S`
on the emitted fn
`function_value_adapter_fires_exactly_where_the_impl_fn_bound_is_emitted`
in the mirror has exactly two touches: 4e03636 (#9938) ADDS the
authority row and the emitted fn, and 4059156 (#9886) REMOVES the fn
while leaving the roster row standing. 4e03636 is an ANCESTOR of
#9886's first parent. So #9886 regenerated its mirror against an earlier
state, then merged main — which by then carried #9938's authority — and
its own stale projection bytes won.

That is the hazard DESIGN.md already records for the generated-artifact
driver: taking the ours side drops the other side's authority-derived
bytes with no conflict. What is new is the ROUTE. This landed through
GitHub, which does not run the merge driver at all; the driver would have
refused GeneratedArtifactConcurrentDivergence. Not a new class — the
existing one arriving through the one path where the wall is absent.

Why it matters beyond the red: main was carrying an enrolled §4b(4)
evidence control that exists in the authority and does not exist in the
artifact that executes. The roster still cited it as coverage. A control
that silently stops existing is worse than one that fails.

`std_realization_schedule.rs` is the same shape at one line: committed
`population_index: Nat` against the emitted `i64`.

Repair is the regenerated bytes, nothing hand-edited. Verified by
execution, not by inspection: claim_executor was REBUILT against the
installed mirror and the full regen re-run, giving
`first_generation_equal=true planned=150 executed=150 adjudicated=150`,
rc=0. A regen that greened only because it compares against the file I
edited would prove nothing, which is why the rebuild is the load-bearing
step.


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

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