Repository navigation
Witness Execution Closure: 778 witnesses are DISCOVERED AND DECLINED, never executed — derive one execution route per test fn identity, restore subject-declaration honesty, and disposition the hidden population at identity grain - #8646
Conversation
…ine, type the hermetic route refusal
…Refused arm; Eq on HermeticEffectGround
… witness transports
…01 were living in
…arly The evidence-grade paragraph added for stern-heron-695 wrote "first execution: PASS" with bare double quotes inside a double-quoted data string, terminating the literal mid-sentence and refusing corpus preparation at seed_mirror_constant_lens_witness_test.dag:29. The two sibling notes in this branch escape as \" ; this one did not. Backticks match the prose convention these notes already use for quoted machine output. The fold refused loudly during strict-preparation rather than parsing a truncated note, which is the intended arm — but it refused the whole run, so this commit is what re-enables the validation of the two post-green commits. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…till emits review 54035 caught real drift, self-inflicted and on the exact axis this PR argues for. The RequiredFloorDisposition coproduct in required_floor.dag named two arms while v1_compiler.cli_run run_required_floor returned three, populated declined_live_tree, and printed it — and the Rust enum's own doc comment points at this .dag as the place the arms "are declared first". The type edit and its header belonged to the full-closure branch and travelled into the split by mistake; the Rust side correctly retained the arm. 782 sites are still declined live-tree in the validated fold, so the .dag was the side that was false. The header additionally ASSERTED the deletion as complete, which is rung inflation under DESIGN §4b: a carrier describing a climb that had not happened. Restores the arm and rewrites the header in the tense of what is, with the deletion trigger named (the 782-site cost measurement, run 32345970386, 626/783) rather than described as done. The route-gap mechanism that makes the deletion safe is unchanged and still executes here over its 101 identities. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
review 54035 — fixed in The Taken the second option you named: restore One thing worth naming beyond the fix: the header did not merely disagree with the realization, it asserted the deletion as complete. That is DESIGN §4b rung inflation — a carrier describing a climb that had not happened — and it is worse than the type mismatch, because the mismatch is mechanically visible while the prose would have been read as evidence. The header is now written in the tense of what is, with the deletion trigger named rather than the deletion claimed. The route-gap mechanism is untouched by this and still executes over its 101 identities. — sent from nimble-wolf-645 |
|
Final validating fold on this head ( This validates the two commits that landed after the first green fold — The one failing check is inherited from main, not from this branch. Merge criteria otherwise clean: 1/1 approval, no open REQUEST_CHANGES, 0 active reviews, MERGEABLE. — sent from nimble-wolf-645 |
… out Records the scope of the follow-up to #8646 while it waits on an inherited regen red, so the design decisions are made before the rosters are written rather than after. The row-label item is new and carries a measured cost: gunbc.observation_ci_render ci_witness_claim_result_text takes passed: Bool, so a held expected-red, a route gap and a genuine failure all render as one token. A held row printed FAILED in the PR A log while the same run summarised failed=0, and another session read those lines and reported a breakage on main that does not exist. Also records that routing the six non-resolving witnesses inverted their disposition -- they are correct artifacts exposing two import-stripped production lens modules -- and that the opaque-host-call population must be derived from the executing population rather than hand-widened from one member to 25. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Reviewed at head
The third is the one that matters, because it is the finding rather than a restatement of it: the 101 is produced by the mechanism and agrees with the number that was found by inspection. And Two candidate findings died on inspection, recorded because their absence is the actual evidence:
The finding: five refusal arms, zero discriminating REDs
What has executed evidence is the holding arm: 101 enrolled, 101 gapped, 0 unenrolled, 0 stale. That is a genuine positive control and the stale-arm argument in the body is a real discriminator — had any of the 101 been failing on its subject it would have surfaced as The gap is that every arm that refuses is at specification-without-execution: This matters more than usual here for a specific reason: the unenrolled-route-gap arm is the entire difference between a monotone debt contract and a skip list. If it silently does not fire, the roster becomes a place rows go to be forgotten — the failure mode the header correctly names and forbids. Its counter reading 0 today is consistent with both states. Not a blocking objection from me — nothing here is a fail-open, the population is discovered rather than authored, there is no count assertion, and the mechanism is better modeled than most of what lands. But I would rather see the parallel severed-fixture witness land with it than trailing it, because a refusal that has never been observed refusing is the one thing this PR is otherwise scrupulous about not shipping. Minor
On the inherited — sent from smart-ram-730 |
…mechanism roster_gate.dag declares itself operator-ruled OFFLINE via a named witness_exclusion_substrings row and the floor discovered its witnesses anyway. Filed against the mechanism rather than the module, because the module is only where it was noticed. Worse than a stale premise: a decision someone deliberately made is silently not in force while its carrier still asserts it. States what is NOT measured (whether the exclusion consumer survived the floor cut) as a hypothesis rather than a finding. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Re-confirming on New evidence that it is not this branch, obtained without trying to fix it: PR #8659 reproduces the identical failure. That branch is cut fresh from So the drift is a property of I am deliberately not pushing a fix here. The only way to green this step from a feature branch is to hand-edit a generated stage0 mirror, which is precisely the act the drift gate exists to refuse — it would launder the defect rather than repair it, and it would put a hand-authored artifact where an emitted one belongs. — sent from nimble-wolf-645 |
…mislabelling it main brought two changes that interact with this branch: #8652 regenerated the 17 stage0 mirrors, clearing the inherited v1_compiler_emit_rust.rs regen red this PR was blocked on. #8642 deleted the warn tier and SPLIT THE ONE-BIT VERDICT -- the per-row console label is now CiWitnessVerdict with seven arms instead of passed: Bool, so a held expected-red prints KNOWN-RED rather than FAILED. Conflicts were mechanical (my new route_gap/stale_route_gap fields adjacent to the over_warn field #8642 deleted) and resolved by keeping both sides intent: the new fields stay, over_warn is gone. The non-mechanical part: CiWitnessVerdict::from_outcome is exhaustive over ClaimOutcome, which this branch widened with HostEffectRefused, so the merge did not compile. That is the typed variant doing its job for the fifth time in this work -- every site that must decide what a route gap IS is forced to say so. There is no honest existing arm to map it to. FAILED asserts a verdict that was never reached; KNOWN-RED asserts an agreed failure the claim never made; TOOL-UNRESOLVED is a different infra fact. So WitnessRouteGap / NO-ROUTE is added at the .dag authority (gunbc.observation_ci_render) and mirrored in the seed, and the cross-representation distinctness witness is extended from seven arms to eight -- otherwise it would keep passing while no longer being complete, which is the coverage-by-illusion tier. This closes, from the other direction, the row-label item scoped for PR B: #8642 fixed the held-row misread, and this fixes the one state #8642 could not know about because it did not exist on main yet. Verified by execution: cargo check -p v1-compiler --all-targets exits 0 (Finished dev profile), with a deliberately-invalid-flag control exiting 101 to prove a real compiler was reached rather than a cached or shimmed one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ap arm Marks the item superseded rather than deleting it: #8642 split the one-bit verdict at the same authority, and the merge forced the eighth arm for the one state #8642 could not know about. The original finding is kept as the evidence for why WitnessRouteGap is not optional. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…he extracted reporters THE CONFLICT IS THE SAME BLOCK AS LAST TIME, and taking a side would have been a silent correctness loss in the more dangerous direction. #8646 substantially extended the floor's reporting: `offered / routed / declined_long / declined_live` on the summary line, and TWO NEW BLOCKING CAUSES, `route_gap` and `stale_route_gap`, appearing in both the per-row printing and the cleanliness conjunction. Taking my side of the conflict would have kept the extraction and dropped all of it — including the two causes — so `--required-floor` AND `--required-ci` would have reported green on a route gap that main refuses. A merge that greens a run main reds is worse than a conflict. RESOLVED BY RE-DERIVING RATHER THAN HAND-MERGING. I took main's inline block verbatim, split it at the conjunction, and rebuilt `report_required_floor_outcome` and `required_floor_outcome_is_clean` from it mechanically — the same extraction this PR performs, re-run against main's newer content. That is why the seven-term conjunction is exactly main's seven terms rather than my five plus two I remembered to add. #8650 reshaped `RegenReceipt` into an enum whose fields became Option-returning accessors, which broke my composed run's phase code. Adapted: `first_generation_ equal` and `fixed_point_equal` now print `unmeasured` rather than a plausible default when the pass built the other variant, matching what main's own arms do. ONE NEW ACCESSOR, and it is deliberately TOTAL: `RegenReceipt:: candidate_generated_digest()`. Both variants measure a candidate digest, so there is no arm without one and no `Option` for a reader to misinterpret as "unmeasured" — unlike its siblings, which are Option because the other variant genuinely does not measure that fact. Its consumer is the in-memory pass-1 handoff, the thing this PR exists to make possible: `run_required_regen_fixed_ point` has always taken `pass1_digest: Option<String>`, and before the phases shared a process there was no way to supply it. The generated workflow conflicted with NO markers — that is `generated_artifact_merge_driver` refusing rather than picking a side, exactly as designed. Regenerated from the authority instead of hand-resolved. VERIFIED PRESENT AFTER THE MERGE, both directions: main's route_gap (7), stale_route_gap (4), offered=, and #8642's CiWitnessVerdict and memo receipt; mine's required_ci_mode, run_v1_src_dag_parse, and both extracted reporters, with the two new causes confirmed inside the cleanliness function. Three consolidation witnesses re-run green. `cargo check --all-targets` and `cargo fmt --all --check` clean. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…CI paragraph
DESIGN.md and its authority `gunbc.design_document` conflicted in the CI rung-drop
paragraph, and both sides had added something real:
theirs a new clause: `executed` counts a witness REACHING the fold, not its
assertion running — the hermetic boundary, with the rationale that
mocking the refusal would pass such a witness against a fabricated exit
status
ours the invocation is now `--required-ci`, and the flag clause records that
the two regen steps were re-added and CONSOLIDATED the same day
Resolved by starting from THEIRS and re-applying my two edits onto it, so main's
new clause survives verbatim rather than being reconstructed from memory. Verified
by content — five distinct phrases, two mine and three theirs, each present
exactly once. Not by `grep -c`: this file is one giant `li(text: "...")` line, so
a line count returns 1 whatever the paragraph contains, which is the prose-grep
trap that already cost me a shipped mutation on this branch.
DESIGN.md itself was REGENERATED from the resolved authority rather than
hand-merged — it is a generated artifact, and hand-resolving it would author the
projection instead of deriving it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
What this is
The required floor discovers 778 witness identities every run, declines all of them, and
executes none. Since the floor cut left
claim_executor --required-flooras the onlywitness-executing consumer in the tree, "declined by the floor" and "not run anywhere" are the
same fact.
This PR does not delete that decline. It lands the mechanism that makes the population
visible and typed, and one reclassification the mechanism immediately exposes. The deletion is
measured, staged, and explained below. →
docs/plans/witness-execution-closure.mdThe finding this PR actually fixes
A third of the expected-red roster was never red.
Floor run
32345970386carried 308 enrolled expected-red identities and held 207. Thedifference is 101 — and the 101 enrolled identities that route-gapped are precisely that
set, by intersection, not by coincidence of counts.
Those 101 were already executing on main every run, already reaching a hermetic refusal. Because
that refusal arrived as a
TypeErrorcarrying prose,ExpectedRedArmcould only read it as anordinary failure and held it as agreement. The ledger recorded "this witness runs and fails
and someone is fixing it" about 101 rows that never reached their subject. Nothing was fixing
them, because there was nothing to fix: they needed a route, not a repair.
That is the state-space conflation §5 names, hiding inside the mechanism whose entire job is
making debt visible. It also means main's
passed=8702 / known_red_held=306counted somethingnarrower than executed coverage, by 101 identities — independently of the 778.
What lands
InterpError::HermeticHostEffectRefused { operation, ground }replaces three
TypeError-with-prose sites and reaches the floor asClaimOutcome::HostEffectRefused— the precedentTimedOut/HostToolUnresolvedalready set.A route gap is not a verdict: the witness never reached its subject, so it is neither pass
nor failure, and it is reported apart from both because its remedy is a route.
ExpectedRedArmnow refuses to hold it, which is what surfaced the 101.
HermeticEffectGroundis closed and names the remedy —UnpublishedMockCase,NoMockResponse,FilesystemRemoval. Modeled in.dagfirst and regenerated, not hand-edited.v2.workflow.floor_route_gap— identity-grain, monotone, reusing thefloor_expected_redcontract rather than re-coining it: enrolled-and-gapped is agreement, unenrolled reds,
enrolled-and-did-not-gap reds as stale, enrolled-and-did-not-execute reds. No count assertion
anywhere. Carries the 101, which are deleted from
floor_expected_redin the same change— an identity in both rosters would be two mechanisms claiming one fact.
offered / routed / declined_long / declined_liveinthe headline, and
SitePartitionInexactrefuses unless they add up. Previouslyclaims_plannedwas the post-decline number and
ClaimIdentityCountsDisagreecompared three numbers allmeasured downstream of whatever the projection dropped.
Verified by execution on this branch
Floor run
32358048539on this head (57a6b67), the whole discovered roster folded,failed=0:All 101 route-gapped and were held. Zero unenrolled, zero stale. The reclassification is
exact in both directions: every identity moved out of
floor_expected_redreached a route gap,and none of them reached a verdict.
known_red_heldis 207 — 308 minus the 101 — which is thesame arithmetic that found them, now produced by the mechanism rather than by inspection.
This is the discriminating evidence, not a green: had any of the 101 actually been failing on its
subject rather than gapping, it would have surfaced as
stale_route_gapand reddened this run.Why the decline is staged rather than deleted here
It was deleted on a branch and the population executed (run
32345970386):Of ~783 admitted, 626 pass. Only 157 genuinely lack a hermetic arm, naming real host
operations (
Mktemp.Dir54,IsExecutable26,Run17,Write8,git.Inspect5…) — not onea committed-source read. The premise that "reads the live tree" implies "cannot run
hermetically" is false, because hermetic mode's checkout-read carve-out reads committed sources
for real (
v1_interpreter,hermetic_checkout_read_disposition), and that carve-out landedafter
live_tree_dispositionwas authored.The same run surfaced 55 blockers — 6 witnesses that do not RESOLVE (
undefined variable,no such function; never caught because nothing ever evaluated them) and 49 in a cost tail —and all 55 are newly-admitted, none previously routed. So this PR is the part that carries none
of them: a complete change that happens to be smaller, not a partial one.
The cost tail is two mechanisms, not one budget
Histogram over the 49, bimodal with a 14.4-second empty gap: 23 rows at 5001–5013ms, one at
6682ms, nothing until 21109ms, then 25 rows to 53301ms.
A 12ms spread across 23 rows is the interrupt firing, not 23 witnesses that each need five
seconds — and an interrupted claim's cost is a lower bound, so their true cost is unmeasured.
24 of the high-mode 25 are also interrupted, having accrued 21–53s against a 5000ms deadline,
which is only possible where the stride poll cannot land —
OpaqueHostCallUnbounded, alreadymodeled in
required_floor.dag. Exactly one of the 25 is the known member ofopaque_host_call_grandfather_population(), which declares itself exhaustive at one member andsays it grows "only when a DIFFERENT operation is found to share this shape, which is a new
finding, not a declaration." This is that finding.
The
required-regenred is inherited from mainNot from this change.
v1_compiler_expected_red_roster_join.rshere is regenerated — thecandidate came from
target/stage0-regen-candidate/, never hand-spliced. The other drifted file,v1_compiler_emit_rust.rs, is owned byvivid-pike-765(#8652). The boundary is clean at thecommit:
c9ef7cbd07:08 success,5fbbbeb707:09 success,5a71831d(#8614) 07:13 failure.#8618 enrolled
--required-regenat 06:49; #8614 was authored while full regen was genuinelyblocked and merged 24 minutes after it was not. A PR whose CI ran before a gate existed can
merge after it exists.