Skip to content

Join recurring-failure-mode receipts with a space - #11047

Merged
briansrls merged 9 commits into
mainfrom
session/keen-cat-170
Sep 12, 2026
Merged

briansrls merged 9 commits into
mainfrom
session/keen-cat-170

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

Summary

  • gunbc.recurring_failure_mode authored now joins receipts on a single space. The trailing-space-on-every-receipt convention is deleted; it was a migration-time byte oracle, not a wall.
  • Trailing (and the three leftover leading) padding spaces are stripped from existing receipts. Regenerated docs/design-failure-modes.md via tools.docs_projection_gate regen (not hand-edited).
  • Discriminating check against the pre-change projection: 145/222 row bodies byte-identical; 34 differ only by losing the end-of-item trailing space the convention had been injecting; 43 were already wrong (receipts glued with no separator, or double padding) and the join is the repair. Identities of those 43 are listed in the test plan.

Test plan

  • Regen before (ee27c085…, 1594988 bytes) and after (85d77fc5…, 1595046 bytes) through gunbc run … docs_projection_gate --function regen.
  • Per-row body compare of the generated markdown (222 identities). Already-wrong (glue / double-pad) identities:
    a_type_name_asserts_an_algebra_the_arithmetic_does_not_carry, a_written_row_is_not_a_firing_mechanism, absence_classifier_default_bucket, absent_reads_identically_to_never_looked, absorbing_fallback, accepted_source_emits_uncompilable_target, append_only_carrier_whose_serialization_shares_a_merge_region, artifact_declares_a_threshold_it_is_not_measured_against, authority_substitution, base_readability_gate_refuses_a_grammar_change, binding_chosen_by_pool_membership_rather_than_by_the_declared_rule, check_subject_narrower_than_its_declared_claim, check_subject_shape_cannot_represent_the_state_the_check_detects, comparison_keyed_on_part_of_the_identity_it_compares, diagnostic_name_mechanism_silent, dispatch_correctness_resting_on_arm_order, docs_markdown_projections_have_no_completing_actuator, edit_pass_that_matched_nothing_reports_success, emitter_residual_renders_inert_text, empty_capture_read_as_clean_result, empty_observation_narrow, evaluation_model_cleanup_undeclared, exact_duplicate_match_arm_not_refused, executed_conjunct_discriminates_nothing, execution_provenance_loss, green_reported_over_a_population_the_instrument_does_not_own, guard_precondition_discharged_by_the_route_that_uses_it, identity_absent_graph_traversal, kind_carried_but_its_fields_stay_optional, match_bound_element_type_mask, merge_region_excludes_shared_tail, non_verdict_disposition_surfaces_as_refusal, obligation_fields_as_prose_make_their_own_grain_check_undecidable, predicate_vacuously_true_on_an_empty_domain, refusal_reabsorbed_by_intermediate_default, required_evidence_absent_reads_as_evidence_of_pass, restoration_promise_names_a_route_that_does_not_exist, selection_view_read_as_population, stale_base_branch_reads_as_pending_work, subject_and_its_digest_as_independent_parameters, transport_close_read_as_completion, trigger_satisfied_before_the_row_was_written, upstream_carrier_substituted_for_the_consumer_selected_subject.
  • CI required lanes.

Made with Cursor

@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

Leaving the stray end-of-line space after the comma on stale_claim_survives_its_own_correct_edit (review 63788). It is outside the receipt string, so authored / the join is unaffected; restarting the floor for that cosmetic is not worth it.

— sent from keen-cat-170

@gunbai-bot
gunbai-bot Bot force-pushed the session/keen-cat-170 branch 6 times, most recently from 4c15785 to e447d55 Compare September 11, 2026 22:11
Brian Searls and others added 9 commits September 11, 2026 23:08
…ng-space convention.

The fold no longer depends on each receipt carrying a trailing space; the projection is the oracle, and glued rows were already wrong.

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

Co-authored-by: Cursor <cursoragent@cursor.com>
…the join cut.

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

Co-authored-by: Cursor <cursoragent@cursor.com>
…t landed on main.

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

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

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

Co-authored-by: Cursor <cursoragent@cursor.com>
… landed on main.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot
gunbai-bot Bot force-pushed the session/keen-cat-170 branch from e447d55 to da2011b Compare September 11, 2026 23:08
@briansrls
briansrls merged commit 0a6cd8a into main Sep 12, 2026
4 checks passed
@briansrls
briansrls deleted the session/keen-cat-170 branch September 12, 2026 00:11
gunbai-bot Bot pushed a commit that referenced this pull request Sep 12, 2026
… rung corrections on top

#11047 joins recurring-failure-mode receipts with a space and therefore strips
the trailing space each row used to carry before its closing quote, across 215
rows. Two of those rows are the ones this branch rewrote for review 63978, so
git saw a content conflict on both files.

Neither side is takeable whole: main's side is the new convention without the
rung corrections, and this branch's side is the corrections under the old
convention, which would reintroduce 2 of the 215 trailing spaces #11047 just
removed and leave the row joined with a double space.

Resolved by taking main's file and re-applying only the rows this branch
actually changed, restripped to main's convention. Determined by diffing each
side against the MERGE BASE row by row rather than by eye: one changed row in
each file (index 119 of 120, index 5 of 7). Verified after: both corrections
present, and zero rows in either file still carry a trailing space before the
quote.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013aZDLk2CxsCDznqn49Xhe8
gunbai-bot Bot pushed a commit that referenced this pull request Sep 12, 2026
One conflict, in the row this branch edits:
dag/gunbc/recurring_failure_mode/identity_hashed_from_a_shared_mutable_path.dag.
main's #11047 joined recurring-failure-mode receipts with a space, which
rewrote every receipt string's tail (the trailing space before the
closing quote is gone), and this branch rewrote the SECOND INSTANCE
receipt. Resolved by re-applying this branch's three edits onto main's
normalized text, so main's normalization is preserved verbatim: the
narrowed SECOND INSTANCE narrative, the second next-rung trigger, and
the two added evidence refs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DS2VUDWzACwhcKmc3gUmVQ
gunbai-bot Bot pushed a commit that referenced this pull request Sep 12, 2026
…e join supplies them.

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

#11047 changed authored() to join with a space; leaving the old trailing space would render this row double-spaced and as the only such file.
gunbai-bot Bot pushed a commit that referenced this pull request Sep 12, 2026
#11047 stripped the trailing-space padding from every receipt and joined
them with a space instead, which collided with my eleven additions —
written in the old convention because I matched the file's own style.

Resolved to my content in main's convention. The only receipt removed is
the original SUBJECT BOUNDARY line, which this branch deliberately
rescoped to bound the FIRST SPECIMEN rather than the class; main added no
receipts of its own to this row, so nothing of main's went dark. Verified
by identity join of both conflict sides with the trailing-space
difference normalised away: one main-side-only line, and it is that one.

Geometry preserved: 17 receipts, one whole element per line, trailing
comma on the last, no trailing-space padding left, braces balanced.

Merged rather than rebased: this is a squash repo, and a rebase
force-push would kill the approval and every green run on the head for
nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015xnR1WBywRAkc4JiWJW1DH
briansrls pushed a commit that referenced this pull request Sep 12, 2026
Brings in #11047, which changed RecurringFailureMode.authored to join
receipts with a space instead of the trailing-space convention.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013YcKjgpfRzhjNJrjaNZjJG
gunbai-bot Bot pushed a commit that referenced this pull request Sep 12, 2026
…rect the repair provenance; migrate to the join separator

Three blocking findings from quick-ibex-468, all verified against the tree
before acting on them.

1. THE BOUNDARY CONTRADICTED ITS OWN MECHANISM. The row asserted both "B's
gate compiles A+B, but it only ever runs for changes authored in B" and "no
gate on either side ever had both repositories in scope". Those cannot both
hold, and the second is both false and the weaker claim: B's gate has exactly
the right closure. The invalid state is now stated as NO GATE ELIGIBLE TO
BLOCK A'S MERGE COMPILES BOTH REPOSITORIES -- a split between two properties
a gate normally holds together, (i) compiling the closure a merge governs and
(ii) being able to refuse that merge. In a one-repository lane they are the
same gate and the split is invisible.

That is not a wording fix; it re-derives the ceiling and the trigger. The
ceiling previously argued about the cost of building a second full compile of
B inside A's gate. Under the corrected statement the compile ALREADY EXISTS
AND ALREADY RUNS, so the repair is to BIND it to A's merge admission -- runner
time on an existing job, not a new one. Rung 3 is still not claimed, and now
for the right reason: not cost, but that the binding is ENROLLMENT and the
invalid state stays writable. The trigger gains its missing conjunct and is
now three: refusal authority over this repository's merges, closure covering
every dependent, and a DISCOVERED dependent set -- each separately able to be
satisfied while the class stays live.

2. THE REPAIR PROVENANCE WAS WRONG. The row cited gunbc-private#82 as the
repair; #82 CLOSED UNMERGED at 21:03:18Z. The repair that landed is
gunbc-private#81 (1b7f87e88f), merged 20:55:06Z -- eight minutes earlier. A
failure-mode authority about merges was citing an unmerged branch as the event
that restored main. Corrected with the genealogy kept rather than the number
swapped, because two lanes independently building the same repair is itself a
fact about this class: with no signal naming the origin, every observer starts
from the symptom and duplicated repair effort is the default. The row now says
so, and says that its own mis-citation was produced by the same condition.

3. #11047 CHANGED THE RENDERING CONTRACT AND THIS FILE MISSED IT.
RecurringFailureMode.authored is now join(r.receipts, " "); the trailing-space
convention is deleted. All eleven receipts still carried trailing spaces, which
would have rendered TWO spaces at every boundary. Migrated: 0 trailing-space
receipts, and 0 double-spaces in the rendered row, measured against a
pre-existing row on the same page as control.

Note the shape, because it is this row's own class applied to this row: the
file is additive and imports nothing anyone changed, and was still incompatible
-- the coupling is the RENDERER, not the import graph. Judging it safe because
"a single additive file no module imports" is the same closure error the class
describes.

EVIDENCE RE-RUN ON A TREE CONTAINING #11047 (the prior evidence was real and
proved the row against a producer that no longer exists):
 - GREEN: regen exit 0, writes docs/design-failure-modes.md (1786641 bytes);
   corrected invalid-state text and #81 provenance both render; 0 double-spaces.
 - RED: fifth receipt -> Int 42 refuses at :30:5 (expected String, got Int),
   exit 1, and with the projection deleted first NO ARTIFACT IS PRODUCED.
 - RESTORED: exit 0, byte-identical to the green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013YcKjgpfRzhjNJrjaNZjJG
briansrls pushed a commit that referenced this pull request Sep 12, 2026
gunbai-bot Bot pushed a commit that referenced this pull request Sep 12, 2026
gunbc#11047 moved the separator into the fold -- `authored` is now
`join(r.receipts, " ")` -- and deleted the per-receipt trailing-space
convention this row was authored under. All eight of my receipts ended in a
space, so after the merge every one of the seven boundaries would have rendered
double-spaced. Stripped the trailing space from all eight; the diff is 8/8 and
each changed line is a receipt terminator, not prose.

The coupling is the RENDERER, not the import graph. This row imports only
RecurringFailureMode and NonEmptyStr, neither touched by #11047, so an
import-graph reading clears it and is wrong -- which is how #11100 was judged
safe.

Re-derived against the merged tree, with a pre-existing row on the same page as
the control:
  - regen EXIT=0; my rendered paragraph 7426 chars, double-space count 0;
    control `absorbing_fallback` paragraph 3602 chars, double-space count 0.
  - all seven receipt boundaries render with exactly one space
    ("...by no one. WHY IT IS WORSE", "...a climb. THE SPECIMEN", and so on).
  - second regen byte-identical to the first (cmp clean).

The mutation evidence is RE-DERIVED under the new fold rather than carried over
from the old one: one `receipts` element replaced by 42 gives regen EXIT=1, a
located resolve refusal at :10:5 "type mismatch: expected 'Primitive(String)',
got 'Primitive(Int)'", and no projection written. Restoring the row reproduces
the projection byte-for-byte.

This merge also brings in #11093 (census heads modelled, non-closure bodies
dropped after parsing), which is the cause of the MemoryStallRefusedPageThrash
that refused the floor on the previous head. A rerun would have replayed the
merge ref pinned before it; only a push re-measures the current memory shape.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NuEqKq5Jxcy4Wj3fYEwYFL
gunbai-bot Bot pushed a commit that referenced this pull request Sep 12, 2026
…use rotted

review 64357 (claude/opus[1m], REQUEST_CHANGES) is correct and I verified it
rather than taking it: shared_precondition_re_derived_once_per_claim_frame is
on this tree. It landed via #11015 (ec1571e), was appended by #11037
(ce76f34), and this PR's own merge of main brought it in -- so the file is
present in the worktree and the identity resolves.

The BOUNDARIES receipt was therefore printing a justification that was TRUE WHEN
WRITTEN AND IS NOW FALSE, and a false one in the worst direction: it told a
reader the name does not exist when it does, which inverts
unlanded_citation_indistinguishable_at_the_citing_end rather than applying it.
Restored the direct citation and deleted the withholding clause entirely; the
boundary the receipt draws is unchanged, only the handle.

Every backticked ledger identity in the row now resolves against the directory:
absorbing_fallback and shared_precondition_re_derived_once_per_claim_frame.
(namespace_graft is the specimen's error name, not a ledger identity.)

Re-derived: regen EXIT=0, rendered paragraph 7096 chars with 0 double spaces,
second regen byte-identical to the first (cmp clean), and the receipt
trailing-space count stays 0 under the #11047 join convention.

Worth naming, since this row is about exactly this: the withheld citation was a
correct judgement about a tree that then moved underneath it, and nothing in the
row re-read its own premise. That is the same shape as the class being filed --
a conclusion whose condition was checked once and never again -- which is why a
reviewer reading the current tree caught it and the author who wrote it did not.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NuEqKq5Jxcy4Wj3fYEwYFL
gunbai-bot Bot added a commit that referenced this pull request Sep 12, 2026
* File the class #10942 review 63691 named: a concession annotation is not a disposition.

Keeping a decoration after stating the deletion rule is worse than missing it — the sentence reads as diligence while a fold still publishes the invalid construction.

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

* Strip trailing spaces from concession_annotation receipts now that the join supplies them.

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

#11047 changed authored() to join with a space; leaving the old trailing space would render this row double-spaced and as the only such file.

* Give the last receipts element its trailing comma.

The carrier's merge geometry requires every list element to carry a comma, including the last, so an append does not pull the preceding receipt into the conflict region.

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

* State ceiling and trigger per sub-case, not one trigger over a plural loss.

Sub-case one refuses a closed-roster producer that ignores its subject or an identically fixed axis; sub-case two requires the located cause to remain in the returned carrier. Neither retires the general concession class, which stays outside the modeled guarantee.

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

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
gunbai-bot Bot added a commit that referenced this pull request Sep 12, 2026
… adjudicate it (#11020)

* File the class: routing a subject to an adjudicator never observed to adjudicate it

One row under dag/gunbc/recurring_failure_mode/. The invalid state: a subject
whose adjudication is transferred to an authority never OBSERVED to adjudicate
it, with the transfer recorded as a routing rather than as a loss of coverage.
The origin gate goes green on a typed, honest decline; the destination's silence
is indistinguishable from coverage.

Specimen: the near-miss of 2026-09-09/10 on the four native_decl_selection
witnesses, the ruling that they be routed to required-v2-native, and
clever-dove-148's out-of-scope check of the DESTINATION, which found it refusing
at its own emit/resolve stage before adjudicating any witness. The row records
what actually caught it -- an acceptance condition demanding the destination
COMPLETE and NAME all four identities -- as the repair it points at.

Bounded explicitly against shared_precondition_re_derived_once_per_claim_frame
(cost, not destination), absorbing_fallback (widens, does not refuse), the inert
lens (never consulted; here the destination is consulted and loud), and the
escape hatch (proceeds as if no refusal; here the refusal fires and is located).

Rung found at mitigatable; ceiling argued at mechanically preventable -- a
decline arm required to cite a destination receipt naming the routed subject --
and explicitly NOT structural, since a receipt can be stale or name a run that
reached no verdict. Trigger names the capability: a cross-gate adjudication
receipt carrying destination lane, run, and the subject identities that run
actually reached a verdict on.

EVIDENCE, by execution against a release gunbc built from this tree, through
tools.docs_projection_gate regen (gunbc.design_ledgers
expected_design_failure_modes_md):

  - green: regen EXIT=0, writes docs/design-failure-modes.md 1563582 bytes, and
    the row's identity and prose render into it.
  - MUTATION, consumed field: one element of `receipts` replaced by `42`. regen
    EXIT=1, resolve refusal located at
    routing_a_subject_to_an_unverified_adjudicator.dag:10:5 "type mismatch:
    expected 'Primitive(String)', got 'Primitive(Int)'", and NO
    docs/design-failure-modes.md is written -- the fold reds and the text is gone.
  - CONTROL, unconsumed field: `evidence: 42` on the same row. regen EXIT=0 and
    the projection writes normally, reproducing exactly the green that #11015's
    author found and threw the resolve-only check out over. The pair is what
    makes the first result discriminating rather than incidental.
  - regen re-run after restore is byte-identical to the first generation (cmp
    clean), no drift; docs_projection_gate main EXIT=0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NuEqKq5Jxcy4Wj3fYEwYFL

* Describe the sibling class by shape, not by an identity that resolves nowhere

review 63417 (cursor/auto, REQUEST_CHANGES) is correct: the BOUNDARIES receipt
cited `shared_precondition_re_derived_once_per_claim_frame` as a peer ledger
identity, and that row is on neither tree -- empty on origin/main and empty in
git ls-files at this head, so the only mention of the name in the corpus was my
own citation of it. The named sibling is filed but unlanded.

Repaired the way `unlanded_citation_indistinguishable_at_the_citing_end`
prescribes: describe the sibling by SHAPE -- "the class filed by clever-dove-148
over the same specimen, whose subject is a shared precondition re-derived once
per claim frame" -- and say in the same breath why the identity is withheld, so
a later reader is not left to wonder whether the name rotted or never existed.
The boundary the receipt draws is unchanged; only the handle is. Landing the
sibling in this closure was the other admissible repair and is not mine to do:
it belongs to that row's author and to its own PR.

Every remaining backticked ledger identity in the row resolves against the
directory: `absorbing_fallback` and
`unlanded_citation_indistinguishable_at_the_citing_end`.

Re-verified by execution: tools.docs_projection_gate regen EXIT=0, the reworded
receipt renders into docs/design-failure-modes.md, and a second regen is
byte-identical to the first (cmp clean).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NuEqKq5Jxcy4Wj3fYEwYFL

* Migrate the row's receipts to the #11047 separator convention

gunbc#11047 moved the separator into the fold -- `authored` is now
`join(r.receipts, " ")` -- and deleted the per-receipt trailing-space
convention this row was authored under. All eight of my receipts ended in a
space, so after the merge every one of the seven boundaries would have rendered
double-spaced. Stripped the trailing space from all eight; the diff is 8/8 and
each changed line is a receipt terminator, not prose.

The coupling is the RENDERER, not the import graph. This row imports only
RecurringFailureMode and NonEmptyStr, neither touched by #11047, so an
import-graph reading clears it and is wrong -- which is how #11100 was judged
safe.

Re-derived against the merged tree, with a pre-existing row on the same page as
the control:
  - regen EXIT=0; my rendered paragraph 7426 chars, double-space count 0;
    control `absorbing_fallback` paragraph 3602 chars, double-space count 0.
  - all seven receipt boundaries render with exactly one space
    ("...by no one. WHY IT IS WORSE", "...a climb. THE SPECIMEN", and so on).
  - second regen byte-identical to the first (cmp clean).

The mutation evidence is RE-DERIVED under the new fold rather than carried over
from the old one: one `receipts` element replaced by 42 gives regen EXIT=1, a
located resolve refusal at :10:5 "type mismatch: expected 'Primitive(String)',
got 'Primitive(Int)'", and no projection written. Restoring the row reproduces
the projection byte-for-byte.

This merge also brings in #11093 (census heads modelled, non-closure bodies
dropped after parsing), which is the cause of the MemoryStallRefusedPageThrash
that refused the floor on the previous head. A rerun would have replayed the
merge ref pinned before it; only a push re-measures the current memory shape.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NuEqKq5Jxcy4Wj3fYEwYFL

* Cite the sibling class by identity: it landed, so the withholding clause rotted

review 64357 (claude/opus[1m], REQUEST_CHANGES) is correct and I verified it
rather than taking it: shared_precondition_re_derived_once_per_claim_frame is
on this tree. It landed via #11015 (ec1571e), was appended by #11037
(ce76f34), and this PR's own merge of main brought it in -- so the file is
present in the worktree and the identity resolves.

The BOUNDARIES receipt was therefore printing a justification that was TRUE WHEN
WRITTEN AND IS NOW FALSE, and a false one in the worst direction: it told a
reader the name does not exist when it does, which inverts
unlanded_citation_indistinguishable_at_the_citing_end rather than applying it.
Restored the direct citation and deleted the withholding clause entirely; the
boundary the receipt draws is unchanged, only the handle.

Every backticked ledger identity in the row now resolves against the directory:
absorbing_fallback and shared_precondition_re_derived_once_per_claim_frame.
(namespace_graft is the specimen's error name, not a ledger identity.)

Re-derived: regen EXIT=0, rendered paragraph 7096 chars with 0 double spaces,
second regen byte-identical to the first (cmp clean), and the receipt
trailing-space count stays 0 under the #11047 join convention.

Worth naming, since this row is about exactly this: the withheld citation was a
correct judgement about a tree that then moved underneath it, and nothing in the
row re-read its own premise. That is the same shape as the class being filed --
a conclusion whose condition was checked once and never again -- which is why a
reviewer reading the current tree caught it and the author who wrote it did not.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NuEqKq5Jxcy4Wj3fYEwYFL

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Sep 12, 2026
…no gate compiles with it (#11100)

* File the class: a change green in one repository breaks another that no gate compiles with it

One row under dag/gunbc/recurring_failure_mode/. INVALID STATE: a merge
admitted on a gate whose compiled closure is a strict subset of the closure
its result governs.

The specimen is gunbc#11057 (a correct public change, green on public CI)
against gunbc-private, whose CI builds against public main: eleven private
witnesses used a bare ExitFailure as their failure arm, so private_roster_main
stopped resolving ENTIRELY -- 0 PASS, not a partial failure -- and every
private PR plus private main went red at once. Repaired by hand in
gunbc-private#82. The totality is part of the class: a zero reads as
infrastructure, not as a semantic break, so the first hypothesis is "our CI is
broken" rather than "an upstream change removed a construction we depend on".

Bounded against three neighbours. NOT the same-repo jointly-incompatible class
(gunbc.plans.ci_merge_freshness, instance 1 recorded by gunbc#10984;
gunbc.plans.joint_incompatibility_claim_join, scoped by gunbc#11044): there the
deficit is FRESHNESS and one gate can compile the union, which is why a merge
queue is the ceiling; here the deficit is COVERAGE and no gate on either side
has both repositories in scope. NOT a published-API break: B pins A's main
branch, so there is no release boundary and no deprecation window. NOT the
stale-merge-base class: both sides were current.

RUNG mitigatable. CEILING argued at mechanically preventable, not asserted: the
question is decidable (compile A+B), but the invalid state stays writable, and
what stands between here and rung 3 is a COST -- doubling A's gate on a fleet
at capacity -- which is not a decidability answer. TRIGGER named as the
capability: a gate whose compiled closure includes every repository that builds
against this one, with the dependent set DISCOVERED rather than hand-listed; a
trigger naming one dependent would retire the class while a third stayed
invisible.

EVIDENCE, executed against a gunbc built from this tree:
 - GREEN: docs_projection_gate regen exits 0, writes
   docs/design-failure-modes.md (1752004 bytes) carrying the row's text.
 - RED: mutating the fifth receipt (the RUNG sentence) from its String to the
   Int 42 -- a consumed element of the List<String> that
   gunbc.recurring_failure_mode::authored folds -- refuses with a typed,
   located diagnostic at :26:5 (expected String, got Int), exits 1, and
   PRODUCES NO ARTIFACT AT ALL: with the projection deleted first, the run
   leaves docs/design-failure-modes.md absent. The text is removed, not stale.
 - RESTORED: the same regen exits 0 and is byte-identical to the first green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013YcKjgpfRzhjNJrjaNZjJG

* Rewrite the class as a split between closure and merge authority; correct the repair provenance; migrate to the join separator

Three blocking findings from quick-ibex-468, all verified against the tree
before acting on them.

1. THE BOUNDARY CONTRADICTED ITS OWN MECHANISM. The row asserted both "B's
gate compiles A+B, but it only ever runs for changes authored in B" and "no
gate on either side ever had both repositories in scope". Those cannot both
hold, and the second is both false and the weaker claim: B's gate has exactly
the right closure. The invalid state is now stated as NO GATE ELIGIBLE TO
BLOCK A'S MERGE COMPILES BOTH REPOSITORIES -- a split between two properties
a gate normally holds together, (i) compiling the closure a merge governs and
(ii) being able to refuse that merge. In a one-repository lane they are the
same gate and the split is invisible.

That is not a wording fix; it re-derives the ceiling and the trigger. The
ceiling previously argued about the cost of building a second full compile of
B inside A's gate. Under the corrected statement the compile ALREADY EXISTS
AND ALREADY RUNS, so the repair is to BIND it to A's merge admission -- runner
time on an existing job, not a new one. Rung 3 is still not claimed, and now
for the right reason: not cost, but that the binding is ENROLLMENT and the
invalid state stays writable. The trigger gains its missing conjunct and is
now three: refusal authority over this repository's merges, closure covering
every dependent, and a DISCOVERED dependent set -- each separately able to be
satisfied while the class stays live.

2. THE REPAIR PROVENANCE WAS WRONG. The row cited gunbc-private#82 as the
repair; #82 CLOSED UNMERGED at 21:03:18Z. The repair that landed is
gunbc-private#81 (1b7f87e88f), merged 20:55:06Z -- eight minutes earlier. A
failure-mode authority about merges was citing an unmerged branch as the event
that restored main. Corrected with the genealogy kept rather than the number
swapped, because two lanes independently building the same repair is itself a
fact about this class: with no signal naming the origin, every observer starts
from the symptom and duplicated repair effort is the default. The row now says
so, and says that its own mis-citation was produced by the same condition.

3. #11047 CHANGED THE RENDERING CONTRACT AND THIS FILE MISSED IT.
RecurringFailureMode.authored is now join(r.receipts, " "); the trailing-space
convention is deleted. All eleven receipts still carried trailing spaces, which
would have rendered TWO spaces at every boundary. Migrated: 0 trailing-space
receipts, and 0 double-spaces in the rendered row, measured against a
pre-existing row on the same page as control.

Note the shape, because it is this row's own class applied to this row: the
file is additive and imports nothing anyone changed, and was still incompatible
-- the coupling is the RENDERER, not the import graph. Judging it safe because
"a single additive file no module imports" is the same closure error the class
describes.

EVIDENCE RE-RUN ON A TREE CONTAINING #11047 (the prior evidence was real and
proved the row against a producer that no longer exists):
 - GREEN: regen exit 0, writes docs/design-failure-modes.md (1786641 bytes);
   corrected invalid-state text and #81 provenance both render; 0 double-spaces.
 - RED: fifth receipt -> Int 42 refuses at :30:5 (expected String, got Int),
   exit 1, and with the projection deleted first NO ARTIFACT IS PRODUCED.
 - RESTORED: exit 0, byte-identical to the green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013YcKjgpfRzhjNJrjaNZjJG

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Sep 12, 2026
#11199)

* File the class: a change green in one repository breaks another that no gate compiles with it (#11100)

* File the class: a change green in one repository breaks another that no gate compiles with it

One row under dag/gunbc/recurring_failure_mode/. INVALID STATE: a merge
admitted on a gate whose compiled closure is a strict subset of the closure
its result governs.

The specimen is gunbc#11057 (a correct public change, green on public CI)
against gunbc-private, whose CI builds against public main: eleven private
witnesses used a bare ExitFailure as their failure arm, so private_roster_main
stopped resolving ENTIRELY -- 0 PASS, not a partial failure -- and every
private PR plus private main went red at once. Repaired by hand in
gunbc-private#82. The totality is part of the class: a zero reads as
infrastructure, not as a semantic break, so the first hypothesis is "our CI is
broken" rather than "an upstream change removed a construction we depend on".

Bounded against three neighbours. NOT the same-repo jointly-incompatible class
(gunbc.plans.ci_merge_freshness, instance 1 recorded by gunbc#10984;
gunbc.plans.joint_incompatibility_claim_join, scoped by gunbc#11044): there the
deficit is FRESHNESS and one gate can compile the union, which is why a merge
queue is the ceiling; here the deficit is COVERAGE and no gate on either side
has both repositories in scope. NOT a published-API break: B pins A's main
branch, so there is no release boundary and no deprecation window. NOT the
stale-merge-base class: both sides were current.

RUNG mitigatable. CEILING argued at mechanically preventable, not asserted: the
question is decidable (compile A+B), but the invalid state stays writable, and
what stands between here and rung 3 is a COST -- doubling A's gate on a fleet
at capacity -- which is not a decidability answer. TRIGGER named as the
capability: a gate whose compiled closure includes every repository that builds
against this one, with the dependent set DISCOVERED rather than hand-listed; a
trigger naming one dependent would retire the class while a third stayed
invisible.

EVIDENCE, executed against a gunbc built from this tree:
 - GREEN: docs_projection_gate regen exits 0, writes
   docs/design-failure-modes.md (1752004 bytes) carrying the row's text.
 - RED: mutating the fifth receipt (the RUNG sentence) from its String to the
   Int 42 -- a consumed element of the List<String> that
   gunbc.recurring_failure_mode::authored folds -- refuses with a typed,
   located diagnostic at :26:5 (expected String, got Int), exits 1, and
   PRODUCES NO ARTIFACT AT ALL: with the projection deleted first, the run
   leaves docs/design-failure-modes.md absent. The text is removed, not stale.
 - RESTORED: the same regen exits 0 and is byte-identical to the first green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013YcKjgpfRzhjNJrjaNZjJG

* Rewrite the class as a split between closure and merge authority; correct the repair provenance; migrate to the join separator

Three blocking findings from quick-ibex-468, all verified against the tree
before acting on them.

1. THE BOUNDARY CONTRADICTED ITS OWN MECHANISM. The row asserted both "B's
gate compiles A+B, but it only ever runs for changes authored in B" and "no
gate on either side ever had both repositories in scope". Those cannot both
hold, and the second is both false and the weaker claim: B's gate has exactly
the right closure. The invalid state is now stated as NO GATE ELIGIBLE TO
BLOCK A'S MERGE COMPILES BOTH REPOSITORIES -- a split between two properties
a gate normally holds together, (i) compiling the closure a merge governs and
(ii) being able to refuse that merge. In a one-repository lane they are the
same gate and the split is invisible.

That is not a wording fix; it re-derives the ceiling and the trigger. The
ceiling previously argued about the cost of building a second full compile of
B inside A's gate. Under the corrected statement the compile ALREADY EXISTS
AND ALREADY RUNS, so the repair is to BIND it to A's merge admission -- runner
time on an existing job, not a new one. Rung 3 is still not claimed, and now
for the right reason: not cost, but that the binding is ENROLLMENT and the
invalid state stays writable. The trigger gains its missing conjunct and is
now three: refusal authority over this repository's merges, closure covering
every dependent, and a DISCOVERED dependent set -- each separately able to be
satisfied while the class stays live.

2. THE REPAIR PROVENANCE WAS WRONG. The row cited gunbc-private#82 as the
repair; #82 CLOSED UNMERGED at 21:03:18Z. The repair that landed is
gunbc-private#81 (1b7f87e88f), merged 20:55:06Z -- eight minutes earlier. A
failure-mode authority about merges was citing an unmerged branch as the event
that restored main. Corrected with the genealogy kept rather than the number
swapped, because two lanes independently building the same repair is itself a
fact about this class: with no signal naming the origin, every observer starts
from the symptom and duplicated repair effort is the default. The row now says
so, and says that its own mis-citation was produced by the same condition.

3. #11047 CHANGED THE RENDERING CONTRACT AND THIS FILE MISSED IT.
RecurringFailureMode.authored is now join(r.receipts, " "); the trailing-space
convention is deleted. All eleven receipts still carried trailing spaces, which
would have rendered TWO spaces at every boundary. Migrated: 0 trailing-space
receipts, and 0 double-spaces in the rendered row, measured against a
pre-existing row on the same page as control.

Note the shape, because it is this row's own class applied to this row: the
file is additive and imports nothing anyone changed, and was still incompatible
-- the coupling is the RENDERER, not the import graph. Judging it safe because
"a single additive file no module imports" is the same closure error the class
describes.

EVIDENCE RE-RUN ON A TREE CONTAINING #11047 (the prior evidence was real and
proved the row against a producer that no longer exists):
 - GREEN: regen exit 0, writes docs/design-failure-modes.md (1786641 bytes);
   corrected invalid-state text and #81 provenance both render; 0 double-spaces.
 - RED: fifth receipt -> Int 42 refuses at :30:5 (expected String, got Int),
   exit 1, and with the projection deleted first NO ARTIFACT IS PRODUCED.
 - RESTORED: exit 0, byte-identical to the green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013YcKjgpfRzhjNJrjaNZjJG

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* File two failure-mode classes: first-touch reclaim billing, and increment-only enrolment gate (#11183)

* File two failure-mode classes: admitted reclaim billed by first touch, and an increment-only enrolment gate.

Both classes were measured today; the rows carry the uncertainties rather than rounding them into coverage.

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

* Close the wrapping parenthesis that spanned receipt bullets in both new failure-mode rows.

The list balanced as data; the combined projection renders one receipt per bullet, so the opener and closer became orphaned across bullets.

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

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* Join fleet acquisitions and tax standing into one floor census.

Completed purchases now have lots and typed tax arms (transcribed, derived, attested, unread) without publishing amounts, and srv1-srv4 are assemblies with dredge obligations rather than invented component receipts.

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

* Use std.measure Micro ratios and identity-join tax coverage.

A product SalesTaxRateMillionthsOfUnity type was a third dimensionless-ratio nickname; coverage by equal list lengths still admitted swapped lots. Rates now inhabit Measure<Dimensionless, Micro, Nat>, and lot_tax_covers_ledgers joins ledger identities to tax rows.

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

* Land PartsPerMillion in std.measure and type statutory tax rates with it.

A product sales_tax_rate constructor and bare Nat millionths rows were a third dimensionless-ratio nickname. The Micro-scale carrier now sits beside Percent/BasisPoint; NJ and NYC rates are that carrier, not a unit-in-the-identifier Nat.

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

* Bind cooler lots in the host assembly and stop claiming they were never acquired.

Census already recorded Dynatron W1 purchases for srv3/srv4; the assembly had marked those components unrecorded, and the shared tax obligation said no acquisition existed. Coolers now bind the census lots, unread tax copy matches the DIMM row, and PartsPerMillion consumes the dimensionless ppm factor.

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

* Locate duplicate tax lots by first-seen ordinal and join standings by identity.

first_ordinal was the current ledger length, so a duplicate of index 0 reported 5,5. Coverage and assembly checks also used length/count literals; they now join named lots, components, and containments.

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

* Drop unconsumed tax prose rows; keep effective-date and composition as annotations.

Those NonEmptyStr declarations had no fold and were commentary wearing semantic data. The cited effective date and NYC composition stay on the rate rows as //, which is the quarantine §4c requires.

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

* Author list membership, cover, and predicate folds once in std.list.

Tax and assembly each minted contain/cover and six predicate folds that differed only by equality or standing. Those now consume list_any, list_member, list_cover, list_count_by, and list_select_by.

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

* Drop std.list nicknames of builtin any/filter and bind census omission by identity.

list_any/select_by/count_by re-minted substrate methods; keep only caller-eq membership/cover. Omit Mt. Collins by lot identity, and refuse assembly cover when a rostered component is dropped.

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

---------

Co-authored-by: gunbai-bot[bot] <289086189+gunbai-bot[bot]@users.noreply.github.com>
Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.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