Skip to content

The observer could still see the goal, because the guarantee was a sentence - #10883

Merged
briansrls merged 12 commits into
mainfrom
session/sleek-newt-698-goal-recut
Sep 10, 2026
Merged

briansrls merged 12 commits into
mainfrom
session/sleek-newt-698-goal-recut

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

std.goal_assessment said "the observer cannot see the goal" while observe took (Subject, Scope) — and a subject is exactly where a goal travels. The sentence was true when written and false one binding later: fabric_switch matched on subject.intent, so the desired mode selected which lanes were read. Two of the three bindings broke the law the module advertised.

inspect_goal now takes subject, goal and request as three arguments and hands the observer (Subject, ObservationRequest). It is goal-blind because it has no goal-typed parameter, not because a note asks it to be. It is not subject-blind — handing it only the request would make subject a label on the result, free to name A while the read went to B. Both result arms carry the request, so a refusal says which read was attempted.

Three defects this fixes were shipped by #10814, and its witnesses ratified them

Member-level unknowns were promoted to whole-observation refusal. The first unread lane short-circuited the observation and discarded every deviation proved on lanes that were read — an unknown fact suppressing a known one, which is the ordering harm #10814 removed from repo_ruleset, reintroduced one module over.

The denominator came from the observation. Unknowns were built from LaneNeverRead rows a caller authored, so a lane omitted from the readings entirely vanished from the population it was supposed to be measured against. The switch now joins SwitchIntent.lanes — the declared roster — against what was read. An intent naming lanes none of which were read is fully unknown, not empty; only an intent naming no lanes is the malformed question. cable_plant cannot do this join (no declared leg roster) and now states that ceiling with its next-rung trigger rather than implying the guarantee.

The collapse survived one module downstream. fabric_switch_desired mapped divergence, indeterminacy and assessment refusal onto one PlantDivergedFromRequirement { legs: Nat } — discarding every unknown, reporting a malformed assessment as legs: 0. It carries the rows now.

Renames

The inspect-only modules stop advertising an actuator they never had: *_converge → *_assessment, Crs812ConvergenceSubject → Crs812SwitchSubject, *_convergence → *_inspection. No alias, no compatibility shim.

Evidence

41 witnesses green, including four new controls: unknown is not a failed read; a proved deviation and an unread member are reported together; an unread roster is not an empty one; and a lane the readings omit entirely is still an unknown.

The last two are proved discriminating by mutation — reverting the join to the reading-derived shape gives:

FAIL a_lane_the_readings_omit_entirely_is_still_an_unknown
FAIL one_unread_lane_is_an_unknown_and_not_a_failed_read
PASS a_correctly_configured_switch_converges     <- control on the control

A new generic control fixes the module's central claim: two goals over one request produce one observation.

One deliberate divergence from review guidance

The recommendation was to eliminate GoalObservationRefused for cable (whose ObserveRefusal is Never) "through the Never fold already used by the corpus". That fold does not exist, and .dag refuses match f { } ("match expression has no arms"). The alternative that compiles is fabricating a CablePlantAssessRefusal for the arm to carry, which asserts a reason that isn't the real one. I kept a payload-free arm that fails closed to undecided, never a speed, wrote into the module that this is a language limit rather than a modelling choice, and named the trigger: empty-match support or a Never elimination fold.

Not verified by execution

repo_ruleset. Its closure reaches gunbc.roadmap.roadmap_belt_actuate via extdeps.transports.rest, and that module fails to resolve (if branches resolve to incompatible types) byte-identically to main — a pre-existing break I did not introduce and am not fixing here. Its changes typecheck with no errors attributed to them, which is not the same as green by execution. Flagging rather than letting 41 green witnesses imply coverage they don't have. That main defect wants its own change.

🤖 Generated with Claude Code

https://claude.ai/code/session_01PUtSkZTNvpWQv58Lk9cGzg

gunbc-ci-auto-heal and others added 3 commits September 9, 2026 03:11
…ntence

std.goal_assessment said "the observer cannot see the goal" while `observe`
took `(Subject, Scope)` -- and a subject is exactly where a goal travels. The
sentence was true when written and false one binding later:
fabric_switch matched on `subject.intent`, so the desired mode selected which
lanes were read. Two of the three bindings broke the law the module advertised.

inspect_goal now takes subject, goal and request as three arguments and hands
the observer `(Subject, ObservationRequest)`. The observer is goal-blind
because it has no goal-typed parameter, not because a note asks it to be. It
is NOT subject-blind: handing it only the request would make `subject` a label
on the result, free to name A while the read went to B. Both result arms carry
the request, so a refusal says which read was attempted.

Three defects this fixes were shipped by #10814 and ratified by its witnesses.

MEMBER-LEVEL UNKNOWNS WERE PROMOTED TO WHOLE-OBSERVATION REFUSAL. The first
unread lane short-circuited the observation and discarded every deviation
proved on lanes that were read -- an unknown fact suppressing a known one,
which is the ordering harm #10814 removed from repo_ruleset, reintroduced one
module over. They are unknowns now, and the mixed case reports both.

THE DENOMINATOR CAME FROM THE OBSERVATION. Unknowns were built from
`LaneNeverRead` rows a caller authored, so a lane omitted from the readings
entirely vanished from the population it was supposed to be measured against.
The switch joins `SwitchIntent.lanes` -- the declared roster -- against what
was read, so the denominator is the goal's. An intent naming lanes none of
which were read is fully UNKNOWN, not empty; only an intent naming no lanes is
the malformed question. cable_plant cannot do this join (it has no declared
leg roster) and now states that ceiling with its next-rung trigger rather than
implying the guarantee.

THE COLLAPSE SURVIVED ONE MODULE DOWNSTREAM. fabric_switch_desired mapped
divergence, indeterminacy AND assessment refusal onto one
`PlantDivergedFromRequirement { legs: Nat }`, discarding every unknown and
reporting a malformed assessment as `legs: 0`. It carries the rows now.

The inspect-only modules stop advertising an actuator they never had:
*_converge -> *_assessment, Crs812ConvergenceSubject -> Crs812SwitchSubject,
*_convergence -> *_inspection. No alias or compatibility shim.

EVIDENCE. 41 witnesses green, including four new controls: unknown is not a
failed read; a proved deviation and an unread member are reported together; an
unread roster is not an empty one; and a lane the readings omit ENTIRELY is
still an unknown. The last two are proved discriminating by mutation --
reverting the join to the reading-derived shape fails both while the positive
control stays green. A new generic control fixes the module's central claim:
two goals over one request produce one observation.

NOT VERIFIED BY EXECUTION: repo_ruleset. Its closure reaches
gunbc.roadmap.roadmap_belt_actuate through extdeps.transports.rest, and that
module fails to resolve on main (`if branches resolve to incompatible types`)
byte-identically to this branch. Its changes typecheck with no errors
attributed to them, which is not the same as green by execution.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PUtSkZTNvpWQv58Lk9cGzg
…not go red

Two review findings, both confirmed, and the first was worse than reported.

THE OBSERVER TOOK ONE ARGUMENT WHERE THE ROOT PASSES TWO.
`observe_repo_ruleset_attempt` kept the arity it had before the recut while
`inspect_goal` calls `observe(subject, request)`. Nothing else repaired it,
and it sits in the one module whose witnesses cannot execute -- so no green
run of mine would ever have found it.

Underneath it was a second defect the finding implies but does not name: the
`request` passed at the call site was a VERBATIM DUPLICATE of the subject,
the same RepositoryRulesetConvergenceSubject built twice. Re-typing the
parameter would have compiled and left this binding's request carrying nothing
about the read, making the module's own claim -- a refusal says which read was
attempted -- false here while the receipt still reported one.

So the repair is the split rather than the arity: subject is the `Repository`
(WHO), request is `RulesetReadRequest { ruleset_id }` (WHAT TO READ). The
fused RepositoryRulesetConvergenceSubject is deleted; it existed only to carry
both facts at once, which is the fusion this whole change is about.

THE GOAL-BLINDNESS CONTROL WAS PERMANENTLY GREEN.
`two_goals_over_one_request_produce_one_observation` passed the SAME
`fixture_observe` to both calls, and that function has no goal parameter, so
the equality could not go red for any authorable input. DESIGN section 4b asks
whether a check's RED is authorable BEFORE writing it; this one's was not,
which makes it worse than absent because it would have been cited as coverage
for the module's central claim. Deleted, not repaired.

The RED that IS authorable replaces it. `inspect_goal` closes the PARAMETER
route; it does not close LEXICAL CAPTURE -- a lambda may close over the goal
and shape the read by it. The new control holds that as an executing fact and
goes red if capture ever stops being expressible.

That forces an honest downgrade this change had claimed too strongly:
goal-blindness is STRUCTURAL against the parameter and MITIGATED BY REVIEW
against capture. Both the module and the witness now say so, and the
next-rung trigger is named: a lens refusing an `observe` argument whose free
variables include the goal bound at the same call site.

Also removes fixture_assess_echoing_goal, which the deletion left unconsumed.

EVIDENCE. 41 witnesses green across four entries, post-merge with main.

STILL NOT VERIFIED BY EXECUTION: repo_ruleset, and the cause is now located.
Its closure reaches gunbc.roadmap.roadmap_belt_actuate, where two coproducts
in the corpus declare an arm named `Observed` -- BeltObserve's and a nullary
one in gunbc.self_host_compile_phase_frontier. Resolution picks the nullary,
so a branch building `Observed { live: ... }` types as Primitive rather than
Coproduct(BeltObserve). That is a DESIGN section 3 collision on main: one
name, two declarations. It is unrelated to this subject and is not fixed here.

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

gunbai-bot Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

Both findings from review 62850 confirmed against the code and fixed in b8f33c08b6d. The first was worse than reported.

observe_repo_ruleset_attempt arity — confirmed, plus a second defect underneath. You were right that the observer takes one parameter while inspect_goal calls observe(subject, request), and that nothing else repaired it. But re-typing the parameter would have compiled and still left the guarantee false here: the request at the call site was a verbatim duplicate of the subject — the same RepositoryRulesetConvergenceSubject constructed twice — so this binding's request carried nothing about the read. Your §5 reading is exactly right, and it applies to the duplicate as much as to the arity.

So the repair is the split, not the arity: subject is now Repository (who), request is RulesetReadRequest { ruleset_id } (what to read). The fused RepositoryRulesetConvergenceSubject is deleted — it existed only to carry both facts at once, which is the fusion this PR is about.

two_goals_over_one_request_produce_one_observation permanently green — confirmed, deleted rather than repaired. Both calls passed the same fixture_observe, which has no goal parameter, so the equality could not go red. §4b's question about authorable RED applies, and it would have been cited as coverage for the module's central claim.

The replacement has an authorable RED, and finding it changed the claim. inspect_goal closes the parameter route; it does not close lexical capture — a lambda can close over the goal and shape the read by it. That is expressible today (the compiler accepted such a lambda and objected only to my argument syntax). So the honest rung is structural against the parameter, mitigated by review against capture, and both the module and the witness now say so. Next-rung trigger named: a lens refusing an observe argument whose free variables include the goal bound at the same call site.

I also removed fixture_assess_echoing_goal, which the deletion left unconsumed (§3c).

Evidence: 41 witnesses green across four entries, post-merge with current main.

Still not verified by execution — repo_ruleset, cause now located. Its closure reaches gunbc.roadmap.roadmap_belt_actuate, where two coproducts declare an arm named Observed — BeltObserve's and a nullary one in gunbc.self_host_compile_phase_frontier. Resolution picks the nullary, so a branch building Observed { live: ... } types as Primitive(Observed) rather than Coproduct(BeltObserve). That is a §3 collision on main — one name, two declarations — unrelated to this subject, and it silently breaks resolution for every closure reaching that module while CI stays green because CI does not compile it. Not fixed here; it wants its own change, and folding it in would make this a two-subject PR.

Which means your finding caught a defect in the one module my evidence cannot reach. That is worth stating plainly rather than leaving implied by a green tally.

— sent from sleek-newt-698

Three findings, all confirmed, and the first is the failure this change exists
to delete -- reintroduced by the change itself.

THE FLEET ENTRY POINT'S ANNOTATION DESCRIBED A REFUSAL STAGE THAT NO LONGER
EXISTS. It claimed the entry "refuses at the observe stage today, and it
refuses with the ONE fact that is missing -- the interface nobody read". The
observer's refusal type is `Never` and it always establishes; the refusal comes
from the ASSESSMENT and carries the CABLE cause, which this module's own
witness asserts while returning false on GoalObservationRefused. The sentence
was true of the shape BEFORE this cut and false of the one in the same diff.

It is recorded rather than quietly swapped, because the recurrence is the
point: a guarantee carried only by prose surviving one edit past the code it
described is precisely what this change removes from the type, and it
reappeared in the module while that removal was being written.

A SIBLING SWEEP FOUND A SECOND SITE THE REVIEW DID NOT CITE. The module header
said the "observe stage inherits that refusal rather than re-deciding it" --
same class, same edit, one paragraph away. The ASSESSMENT inherits it; the
observe stage cannot refuse at all. Fixed, and the reason is now stated.

Annotations are the one part of this change no witness can guard: no Accepted
program reads one, so 41 green tests say nothing about whether the prose beside
them is true. Review and a targeted sweep are the only mechanisms, and the
sweep only worked because the specific false claim was known.

MEMBERSHIP WAS A FAILED DECOMPOSITION, AND THE COST SHAPE COMPOUNDED IT.
`interface_absent_from` minted `list_length(flat_map(...)) == 0` beside the
corpus-canonical `any(xs, pred)` -- section 2's net-concepts test. Worse,
`observed_lane_interfaces` was called INSIDE the fold, so n intent lanes and m
read lanes did n*m work and allocated n copies of one list to answer a single
membership question each, and `lane_intent_interface` computed twice per lane.
The projection is hoisted once and the fold uses `any`. Section 6's standing
rule: a proven cost-shape defect is fixed regardless of the realized n, because
n is not a time-stable fact.

A merged paragraph is also repaired: the new assessment block had been spliced
into the tail of an unrelated one and lost its heading.

EVIDENCE. 17 witnesses green across the switch and cable entries.

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

gunbai-bot Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

All three findings from review 62866 confirmed and fixed in ff3499be2ed. The first is the sharpest thing said about this work so far.

The fleet-entry annotation — confirmed, and it is this PR's own thesis failing. It claimed the entry point "refuses at the observe stage today, and it refuses with the ONE fact that is missing — the interface nobody read." The observer's refusal type is Never and it always establishes; the refusal comes from the assessment and carries the cable cause — which the module's own witness asserts while returning false on GoalObservationRefused, exactly as you noted. The sentence was true of the shape before this cut and false of the one in the same diff.

I've corrected it and recorded what it said and why it was wrong, rather than quietly swapping the text. A guarantee carried only by prose, surviving one edit past the code it described, is precisely what this change removes from the type — and it reappeared in the module while that removal was being written. That is worth leaving legible.

A sibling sweep found a second site you did not cite. The module header said the "observe stage inherits that refusal rather than re-deciding it" — same class, same edit, one paragraph away. The assessment inherits it; the observe stage cannot refuse at all. Also fixed, with the reason now stated.

Worth naming: annotations are the one part of this change no witness can guard. No Accepted program reads one, so 41 green tests say nothing about whether the prose beside them is true. Review and a targeted sweep are the only mechanisms available, and the sweep only worked because I knew the specific false claim to grep for. There is no general check here and I would rather say so than imply otherwise.

Line 292 merged paragraph — confirmed. My splice landed in the tail of an unrelated block and lost its heading. Restored.

interface_absent_from — confirmed as a failed decomposition, and the compounding cost is real. any(xs, pred) is the canonical surface (extdeps.boards.types, extdeps.bmc.capability) and I minted list_length(flat_map(...)) == 0 beside it. Worse, observed_lane_interfaces was called inside the fold: n intent lanes × m read lanes did n·m work and allocated n copies of the same list to answer one membership question each, with lane_intent_interface computing twice per lane. The projection is now hoisted once and the fold uses any. §6's standing rule applies regardless of the realized n, since n is not a time-stable fact.

Evidence: 17 witnesses green across the switch and cable entries after the fixes.

repo_ruleset remains not-execution-verified for the reason given in my previous comment — the Observed arm collision on main between BeltObserve and gunbc.self_host_compile_phase_frontier. Unchanged by this round, still not fixed here.

— sent from sleek-newt-698

gunbc-ci-auto-heal and others added 2 commits September 9, 2026 04:23
…8-goal-recut

# Conflicts:
#	dag/gunbc/spark/fabric_switch_observed.dag
#	dag/test/claim/spark/fabric_switch_converge_witness_test.dag
main added test.claim.spark.spark_fabric_switch_witness while this branch was
open, importing product.cable_plant_converge. The merge is textually clean --
an import naming a module that no longer exists is not a conflict -- so only
the census finds it. Third time this cutover has been overtaken by new
authorship against a module scheduled to move.

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

gunbai-bot Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

Merge conflict with main resolved in 62087145b15 (merge commit, not a rebase — squash-merge flattens history anyway and this avoids a force-push). Head is now 3be7c35ae.

Both conflicts were more than mechanical, and one of them carried a correction I had gotten wrong.

The modify/delete conflict on the renamed witness. #10869 renamed that test from "refuses because its cables do" to "refuses while its plant cannot answer", on the grounds that six of the eight legs have never been dumped — so the plant's answer is dominated by legs nobody read, not by the coding of the legs that were read. My rename in this branch had asserted the coding story (…because_its_cables_are_uncoded), which is exactly the claim #10869 established is false of the fleet's actual state.

Taking my deletion wholesale would have silently reverted that. I ported it, and the recut sharpens it: under this change the plant answers indeterminate rather than refusing, because unread legs are member-level unknowns now — so it reports them alongside any proved coding divergence instead of refusing the whole observation on the first one. The propagation the witness asserts is unchanged; the fidelity beneath it went up. Main's exactly_two_of_eight_legs_carry_a_reading is the executing evidence for the six-unread-legs claim, and it passes here.

The import conflict in fabric_switch_observed was my rename against main's added LegNeverRead; both taken.

The census found a third consumer that no conflict would have surfaced. main added test.claim.spark.spark_fabric_switch_witness importing product.cable_plant_converge. That merges textually clean — an import naming a module that no longer exists is not a conflict — so only the census finds it. Fixed in 3be7c35ae4a. That is the third wave of new authorship against this module set while the PR has been open, each one breaking silently.

Evidence: 30 witnesses green across four entries post-merge, including main's new spark witness. Repo-wide grep for the old module and declaration names is clean.

Unchanged from before: repo_ruleset is still not execution-verified, for the Observed arm collision on main between BeltObserve and gunbc.self_host_compile_phase_frontier.

— sent from sleek-newt-698

gunbc-ci-auto-heal and others added 3 commits September 9, 2026 05:58
The floor refused this head: `namespace-wave-admission (9 unadjudicated
delta(s))`. All nine are `TargetChanged binding` -- a spelling authored on both
sides that now resolves to `product.cable_plant_assessment` instead of
`product.cable_plant_converge`, because this cut renames the module. That is
the exact subject NAMESPACE_TRANSITION_ADMISSIONS exists for, and the roster's
own note already states the claim these rows make.

THE ARITHMETIC IS THE CHECK, not the green. The wave measured eighteen deltas.
Nine auto-admit as the membership half of one motion: the old edge reports
SameDeclarationIdentityRebind (every name it supplied still denotes the same
declaration) and the new edge ExplicitlyEvaluatedZeroDelta (reached by a name
the module authors). The nine below are the binding half. Consumers whose OWN
module was renamed produce no binding delta at all -- a delta needs the module
present on both sides -- which is why the two witness files this cut renamed
are absent from the roster and `fabric_switch_observed` is present. Rows for
the renamed modules would have meant I had misread what the wall measures.

ENUMERATED BY EXACT IDENTITY, never by a pattern over the renamed module pair:
a pattern would admit a genuine rebind that happened to land in the same pair,
which is the absorbing fallback section 5 forbids. None of these nine changes
WHICH DECLARATION the spelling denotes; a binding whose meaning had moved would
refuse on its own row rather than be covered here.

TRIGGER: removed when this PR merges. The base then binds each spelling to
`product.cable_plant_assessment`, every row reports consumed-at-base, and
leaving them would refuse every unrelated PR -- the cost the roster's own
history records from the first fifty-three rows.

This is the mechanism I declined earlier in this session for a different
subject. There the row would have papered over a baseline-reconstruction
defect, so writing it was a workaround. Here it adjudicates a rename that was
intended, which is what the roster is for. Same mechanism, opposite standing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PUtSkZTNvpWQv58Lk9cGzg
The switch module's heading was corrected when the handler record was deleted;
the cable module's was not, so it kept announcing an actuation stage and an
unchanged-receipt stage that no longer exist and never ran for this subject.

Found by re-reading the request against the code rather than the review tally:
renaming the stale stage headings was an explicit item on the list this PR is
answering, and it survived two approving reviews. An approval is 'no blocking
defect found', which is not the same as 'this is what was asked'.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PUtSkZTNvpWQv58Lk9cGzg
REVIEW FINDING, CONFIRMED, AND IT IS RUNG INFLATION IN THE MODULE ABOUT RUNG
HONESTY. `fabric_switch_subject()` built its observation REQUEST by mapping
over the intent's own interfaces, so an undecided intent produced an empty
request and therefore an empty snapshot BECAUSE OF THE GOAL. Closing the
parameter route while the request stayed goal-derived renamed the mechanism
and removed nothing. This change had been reporting goal-blindness as
structural against the parameter while the live binding routed the goal into
the read anyway -- section 4b(1): citing the strongest path while another
stays silent.

CLOSED RATHER THAN DECLARED. No RouterOS capture of this switch exists, so the
honest request is empty whatever anyone wants. The unknowns are still one per
intent lane because `switch_unknowns` joins the intent's declared roster on the
ASSESSMENT side, which is the stage allowed to know the goal. Same reported
answer; the goal no longer reaches the read. The goal-derived roster function
is deleted -- nothing consumed it once the request stopped calling it.

THE RESIDUAL DISCLOSURE WAS WRONG BY OMISSION. It named two routes; there are
three. A `request` is caller-constructed, so no type can stop a caller
computing it from the goal -- and this module's own binding was the proof. All
three are now enumerated, with this binding recorded as the worked example, and
ONE next-rung trigger covers both review-mitigated residuals because they are
the same shape: a goal reaching the read through a VALUE rather than a
parameter.

"THE OBSERVER RECEIVES AN ObservationRequest AND NOTHING ELSE" WAS FALSE. It
was written before an earlier review restored the subject to the observer, and
went stale in that edit. Corrected in std.goal_assessment and in the switch
module's own copy of the claim.

AND THE FIRST CONTROL FOR THIS WAS PERMANENTLY GREEN -- the same fault this
change deleted a check for, committed while correcting it. It compared the
fleet subject against an undecided-intent subject and asserted both requests
were empty; both are empty UNDER THE DEFECT too, because the fleet's real
intent is undecided today. Mutation caught it: restoring the defect left the
check PASS. The property was unobservable because the goal never varied, so
`fabric_switch_subject_under(intent)` takes it as a parameter now and the
control supplies a DECIDED intent naming two lanes. Under the defect that
request carries two entries. Mutation-confirmed: FAIL on the defect, positive
control green. The dead first version is recorded in the witness rather than
swapped out, because it is the reason the mutation step is not optional.

EVIDENCE. 12 witnesses green, including the new control, proved discriminating.

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

gunbai-bot Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

Both findings from review 62920 confirmed and fixed in 95f288db617. The first is the sharpest finding on this PR and it is rung inflation in the module whose subject is rung honesty.

The goal still chose what was read — you are right, and it is the same mechanism, not a residue of it. fabric_switch_subject() built the observation request by mapping over the intent's own interfaces, so an undecided intent produced an empty request and therefore an empty snapshot because of the goal. Closing the parameter route while the request stayed goal-derived renamed the argument and removed nothing. §4b(1) is exactly the right citation: I was reporting structural-against-the-parameter while another path stayed silent.

Closed rather than declared. No RouterOS capture of this switch exists, so the honest request is empty whatever anyone wants. Unknowns are still one per intent lane because switch_unknowns joins the intent's declared roster on the assessment side — the stage that is allowed to know the goal. Same reported answer; the goal no longer reaches the read. The goal-derived roster function is deleted, since nothing consumed it once the request stopped calling it.

The residual disclosure was wrong by omission — three routes, not two. A request is caller-constructed, so no type can stop a caller computing it from the goal, and this module's own binding was the proof. All three are now enumerated, with this binding recorded as the worked example. One next-rung trigger covers both review-mitigated residuals, because they are the same shape: a goal reaching the read through a value rather than a parameter.

goal_assessment.dag:36 — confirmed false. "receives an ObservationRequest and NOTHING ELSE" was written before an earlier review restored the subject to the observer, and went stale in that very edit. Corrected there and in the switch module's copy of the same claim.

One thing you did not ask about, which I owe you: my first control for this was permanently green. It compared the fleet subject against an undecided-intent subject and asserted both requests were empty — but both are empty under the defect too, because the fleet's real intent is undecided today. Mutation caught it: I restored the defect and the check stayed PASS. That is the identical fault this PR deleted two_goals_over_one_request_produce_one_observation for, committed while correcting it.

The property was unobservable because the goal never varied, so fabric_switch_subject_under(intent) takes it as a parameter now and the control supplies a decided intent naming two lanes; under the defect that request carries two entries. Mutation-confirmed — FAIL on the defect, positive control green. The dead first version is recorded in the witness rather than swapped out.

Evidence: 12 witnesses green, the new control proved discriminating by mutation.

Standing count on this PR: three of the last four findings have been one class — a claim outliving the shape it described. Stale annotation, false "NOTHING ELSE", under-enumerated residual, inflated rung. All were invisible to 40+ green witnesses, because no Accepted program reads an annotation and a passing test says nothing about whether it can fail.

— sent from sleek-newt-698

REVIEW FINDING, CONFIRMED ON ALL FIVE BINDINGS. `assess` took a `Subject` that
`assess_cable_plant`, `assess_fabric_switch`, `ruleset_assess`,
`fixture_assess` and `selection_assess` all ignore -- five signatures, zero
uses -- while an annotation beside it claimed "a refusal cause that has to name
what it could not assess should not have to be handed the identity through a
closure". Section 3c dangling, and section 4c prose asserting a use that does
not exist.

DROPPED RATHER THAN CONSUMED, which was the other option offered. Locating
`PlantHoldsNoLegs` or `SwitchIntentNamesNoLanes` by their subject would put a
second copy of the identity beside the one `GoalInspection` already carries in
BOTH arms -- the exact redundancy this change removed when it dropped `switch`
from `SwitchHoldsNoLanes`. Consuming the parameter would have undone that
reasoning to justify a parameter that should not have been added.

THE ASYMMETRY THAT REMAINS IS REAL AND IS NOW STATED. The OBSERVER keeps its
subject: gunbc.repo_ruleset's observer builds its request path from
`subject.owner` and `subject.name`, which is the one consumer that earns it.
A sweep for signature-only parameters confirms the two corpus-data observers
ignore theirs -- legitimate, since their read is a projection of declared data
and one genuine consumer is what section 3c asks of a generic parameter. The
assessor had none anywhere, which is the difference.

Dropping it cascaded: `witness_subject` in the repo-ruleset witness lost its
only reader, so the fixture and its two imports went with it. The section 3c
question asked one level down rather than stopped at the first answer.

I INTRODUCED THIS WHILE FIXING THE PREVIOUS INSTANCE OF IT. An earlier review
established that the OBSERVER needs its subject; I extended that to the
assessor by symmetry without checking whether any assessor would read it. That
is the fourth claim in this change to outlive the code it described, and the
correction is recorded in the module rather than silently reverted.

EVIDENCE. 41 witnesses green across four entries.

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

gunbai-bot Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

Confirmed on all five bindings and fixed in 71c801f78a0. You are right, and the framing is right too — this is the one place the PR's own subject recurred, and I introduced it while fixing the previous instance.

Verified before acting: plant, switch and subject appear only in the signatures of assess_cable_plant, assess_fabric_switch and ruleset_assess; both witness assessors ignore theirs as well. Five signatures, zero uses, with a justification beside it that none of them exercises.

I took drop, not consume. Locating PlantHoldsNoLegs / SwitchIntentNamesNoLanes by subject would put a second copy of the identity beside the one GoalInspection already carries in both arms — the exact redundancy this PR removed when it dropped switch from SwitchHoldsNoLanes. Consuming the parameter would have undone that reasoning in order to justify a parameter that should not have been added.

The asymmetry that remains is real and is now stated in the module. The observer keeps its subject: repo_ruleset's observer builds its request path from subject.owner and subject.name, which is the one consumer that earns it. I swept for signature-only parameters and the two corpus-data observers do ignore theirs — legitimate, since their read is a projection of declared data and one genuine consumer is what §3c asks of a generic parameter. The assessor had none anywhere; that is the difference, and I would rather report the sweep result than leave it for the next reviewer to find.

Dropping it cascaded: witness_subject in the repo-ruleset witness lost its only reader, so that fixture and its two imports went with it.

Provenance of the defect, since it is the interesting part: an earlier review established that the observer needs its subject. I extended that to the assessor by symmetry without checking whether any assessor would read it. Fourth claim in this change to outlive the code it describes — and the second I created in the act of correcting another. Recorded in std.goal_assessment rather than silently reverted.

Evidence: 41 witnesses green across four entries.

— sent from sleek-newt-698

gunbc-ci-auto-heal and others added 2 commits September 9, 2026 14:00
…8-goal-recut

# Conflicts:
#	src/v1/stage0/src/namespace_wave_admission.rs
The merge of origin/main kept its five #10692 rows verbatim alongside my
nine. Additive-only was the right instinct for my rows and the wrong one
for rows whose trigger had already fired in the commits being merged in:
main now binds each of those spellings to its own target, so the rows
report consumed-at-base, and the floor refused with

  namespace-wave-admission (0 unadjudicated delta(s), 0 stale
  admission(s), 5 consumed admission(s) due for deletion on this
  roster-touching change)

Leaving them is not harmless. A consumed row matches nothing, so it would
refuse every unrelated PR until someone else deleted it -- the standing
cost the roster's first 53 rows were written down to record.

The deletion is adjudicated by the instrument, not by the trigger
sentence: main's own block warned that "a trigger sentence is not
evidence that the trigger fired", and claim_executor performed the
(module, in_declaration, spelling, target) join against the base tree and
returned consumed. The rows, their label const, and their doc block go
together; nine rows remain and the wave reports ADMITTED.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PUtSkZTNvpWQv58Lk9cGzg
@briansrls
briansrls merged commit 657da59 into main Sep 10, 2026
4 checks passed
@briansrls
briansrls deleted the session/sleek-newt-698-goal-recut branch September 10, 2026 00:11
@briansrls
briansrls restored the session/sleek-newt-698-goal-recut branch September 10, 2026 00:13
gunbai-bot Bot pushed a commit that referenced this pull request Sep 10, 2026
Both conflicts were additive collisions at the same insertion point, not
disagreements; both sides are kept.

namespace_wave_admission.rs -- main merged #10692 (ebb1da8), which is
the trigger that made this branch's five consumed #10692 admissions due,
so main deleted them independently and added nine #10883 cable_plant
rows at the same position. Resolution keeps main's nine and re-adds this
branch's two live `gunbc#10818 CpuBoundStanding rehome` rows plus their
doc block: 11 rows total. The two are still live because their trigger is
this PR merging, which has not happened.

guarantee_stall/roster.dag -- main appended
information_retrieval_transport_cannot_report_status_stall where this
branch appended module_cited_only_in_annotation_prose_stall. Both are
kept, in import and roster order.

Merge commit rather than rebase, per the branch policy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJGbrvU2EgNeUiWfc5yK2c
gunbai-bot Bot pushed a commit that referenced this pull request Sep 10, 2026
The floor refused adjudication on the merge head with `0 unadjudicated
delta(s), 0 stale admission(s), 9 consumed admission(s) due for deletion
on this roster-touching change` -- the same 4b(4) obligation this branch
already discharged once for #10692's five, now for #10883's nine.

The mechanism is worth stating because it will recur: #10883 merged to
main, which made its own nine admissions CONSUMED. Merging main into this
branch brought them here, and this branch touches the roster (it adds two
rows of its own), so their deletion comes due on this head. A branch that
integrates main inherits main's due deletions.

Joined against main's tree before deleting rather than trusting the
count, per the rows' own instruction:

  gunbc.spark.fabric_switch_observed fabric_cable_plant CablePlant
  gunbc.spark.fabric_switch_observed fabric_leg_reading LegReadingTaken
  test.claim.spark.spark_fabric_switch_witness plant_readings_never LegNeverRead

each now binding to `product.cable_plant_assessment` on main.

The two `gunbc#10818 CpuBoundStanding rehome` rows stay. Their trigger is
this PR merging, which has not happened.

Deletes the nine rows and their now-unreferenced doc block. No evidence
retired -- 4b(4) dissolves production handling only, and these rows carry
no discriminating control.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJGbrvU2EgNeUiWfc5yK2c
briansrls added a commit that referenced this pull request Sep 10, 2026
* Land the receipts main already cites

gunbc.runner.runner_host_filtered_egress merged to main citing
gunbc.runner.runner_guest_egress_attempt, which did not. That receipt and two
siblings -- the cgroup placement and guest network observations -- were
stranded on a sibling PR that never merged, so main carried a citation naming
a module the repository does not contain.

That is the positional-reference failure in its worst form. A stale line
number decays quietly; a citation to an absent module means a reader cannot
find what was cited at all, and the claim resting on it becomes uncheckable.

They matter to what landed. runner_host_filtered_egress rejects the bridged
topology, and the record of that bridge being tried, what it exposed and why
it was abandoned lives in runner_guest_egress_attempt. Without it the
rejection reads as a preference rather than a finding.

Cherry-picked onto current main rather than resurrecting the stale branch,
which is hundreds of files behind and carries the same foreign PCI-identity
content this lane just removed from its own PR. Taking the six files leaves
all of that behind.

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

* Cite the stranded runner receipts by import, not annotation

The three modules #10818 added were still dangling: the citing sites named them
only in comments, which DESIGN 4c erases, so they were neither citations nor
consumers. Fold the attempt, placement, and guest-network facts into the
modules that already depended on them, carry typed DeclarationRefs, and file
the class on the 4b ledgers.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Inhabit ByteSize, type the prose rows, and file the three receipt classes

The stranded receipts still carried byte quantities as Int and four findings as
String commentary. They now consume std.measure, hold those findings as typed
carriers beside PlacementDefect, and each newly discovered class has its own
4b row rather than living only inside a per-attempt receipt.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Type the three remaining narrative receipt rows

bridge_readback_defect, guest_tap_retired and corrected_claim were the same
4c class as finding 3 — withdrawn and corrected rulings held as NonEmptyStr
after this PR had already established typed carriers beside them.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fold the cpu.max refusal once, next to cpu_bound_failure

The two consumer modules were matching the same coproduct under two names, so the consumption witness counted one fact twice. One fold, imported; the witness asserts it once.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Inhabit existing network, hash, path, arch, and rate authorities in the receipts

GuestReachability was restating IPv4, prefix, and MAC as strings; those already live in extdeps.network. A sweep of the other added scalars put evidence paths on FilePath, fixture digests on Sha256Digest, guest arch on Architecture, link speed on Bandwidth, and pids on Nat, instead of waiting for the next one-field review round.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Join values to their summaries and give duplex and NUD a home

A record that carried empty: true beside procs_at_retirement: "empty", and a member list that restated placement_verdict.pid as prose, could disagree with nothing refusing. Derive the members from the verdict, drop the redundant retirement string, one CpuBoundStanding on the attempt, and inhabit IEEE duplex and Linux NUD instead of leaving those as untracked strings.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Admit the two CpuBoundStanding TargetChanged bindings #10818 produced

The floor was FloorClean and the consumption witness passed; adjudication refused on namespace-wave-admission with exactly two unadjudicated deltas — cpu_bound_standing rebinding CpuBoundStanding and CpuBoundInterfacePresent onto the attempt module. Those rows dissolve when this PR merges.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Drop the permanently-green consumption witness and the cites_* rows

A receipt of observed constants cannot make that test red except by editing the receipt. Imports and folds are the consumption claim; the stall no longer cites the deleted witness as coverage.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Retire the five consumed #10692 admissions the roster touch makes due

The required floor refused adjudication on this head with
`0 unadjudicated delta(s), 0 stale admission(s), 5 consumed admission(s)
due for deletion on this roster-touching change`. Nothing was missing:
the five `gunbc#10692` binding admissions became CONSUMED when that PR
merged, and adding this change's own two rows is the roster touch that
brings their deletion due (DESIGN 4b(4), dissolution on climb -- a climb
deletes the lower-rung machinery it obsoletes).

The rows' own trigger prose forbids taking its word for it -- "adjudicate
that deletion by joining each row against main's tree on its own
(module, in_declaration, spelling, target) tuple rather than trusting
this sentence, because a trigger sentence is not evidence that the
trigger fired." Joined all five against origin/main; each declaration
now binds its spelling to the named authority module:

  v2.std.integer integer_string_to_decimal_digits_step   -> v2.std.text
  v2.std.compilers.target_model EmitSpellingEscape       -> v2.std.text
  v2.std.compilers.target_model apply_emit_spelling_...  -> v2.std.text
  v2.extdeps.languages.python py_bool_grounding          -> v2.std.logic
  v2.extdeps.languages.typescript ts_bool_grounding      -> v2.std.logic

The two `gunbc#10818 CpuBoundStanding rehome` rows stay: their own
trigger is this PR merging, which has not happened. Deleting all seven
to make the count come out right would drop live admissions.

Pure deletion -- the five rows, their now-unreferenced label constant,
and the doc block describing them. No evidence retired: these rows carry
no discriminating control, so 4b(4)'s "production handling only, never
the evidence" has nothing to preserve here.

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

* Retire the nine consumed #10883 admissions the merge made due

The floor refused adjudication on the merge head with `0 unadjudicated
delta(s), 0 stale admission(s), 9 consumed admission(s) due for deletion
on this roster-touching change` -- the same 4b(4) obligation this branch
already discharged once for #10692's five, now for #10883's nine.

The mechanism is worth stating because it will recur: #10883 merged to
main, which made its own nine admissions CONSUMED. Merging main into this
branch brought them here, and this branch touches the roster (it adds two
rows of its own), so their deletion comes due on this head. A branch that
integrates main inherits main's due deletions.

Joined against main's tree before deleting rather than trusting the
count, per the rows' own instruction:

  gunbc.spark.fabric_switch_observed fabric_cable_plant CablePlant
  gunbc.spark.fabric_switch_observed fabric_leg_reading LegReadingTaken
  test.claim.spark.spark_fabric_switch_witness plant_readings_never LegNeverRead

each now binding to `product.cable_plant_assessment` on main.

The two `gunbc#10818 CpuBoundStanding rehome` rows stay. Their trigger is
this PR merging, which has not happened.

Deletes the nine rows and their now-unreferenced doc block. No evidence
retired -- 4b(4) dissolves production handling only, and these rows carry
no discriminating control.

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

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Brian Searls <briansearls1@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant