Skip to content

Follow the renamed witness in the cost-debt roster instead of deleting its row - #10769

Merged
briansrls merged 1 commit into
mainfrom
session/snappy-lark-356-stale-debt-rename
Sep 7, 2026
Merged

briansrls merged 1 commit into
mainfrom
session/snappy-lark-356-stale-debt-rename

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

main is red repo-wide and every open PR inherits it. The floor refuses:

identity=test.claim.live_deploy.emit.apply_script_and_tree_sync_unit_stay_within_ci_runner_grants is enrolled in v2.workflow.floor_cost_debt but the tree DECLARES NO SUCH IDENTITY … Delete the row. cause=stale_cost_debt

Deleting the row would have been wrong, and the row itself says so

Its annotation carries:

TRIGGER (CAPABILITY, NOT ROSTER ERASURE) … merely deleting this identity, emptying the roster, or replacing production emission with a smaller fixture does not restore the coverage and does not satisfy the trigger.

The diagnostic is correct that the identity is absent. It cannot see why, and the remedy it suggests is the one the row explicitly forbids.

The witness was renamed, not deleted

#10724 (74e7ab63bfb) stopped the publication member writing two programs to one unit name, so the tree-sync half of the subject went away and the witness narrowed with it:

apply_script_and_tree_sync_unit_stay_within_ci_runner_grants
  -> apply_script_stays_within_ci_runner_grants

Same module, test.claim.live_deploy.emit. The debt row was not carried across. So the subject still exists and its debt is still owed — what broke is the reference, and the fix is to follow it.

The historical measurement keeps the old spelling, deliberately

The annotation's 563ms figure was taken against the two-program subject. Rewriting it to the new name would attribute a measurement to a subject that did not exist when it was taken. A note above it records the rename so the old spelling is not read as live.

Verified rather than assumed

  • the new identity exists at dag/test/claim/live_deploy/emit_test.dag, module test.claim.live_deploy.emit
  • the old spelling appears nowhere in the tree outside this file
  • the new name was absent from the roster before this change
  • compile: 26 blocking errors, none in this file — the same count main carries

Not my lane; I hit it because it reds my own PRs, and the diagnosis was cheap once the deleting commit was read. Flagging for #10724's author in case the rename has other stranded references I did not look for.

🤖 Generated with Claude Code

https://claude.ai/code/session_01632CTZ8diiLNBQaXobNWKQ

…g its row

main is red repo-wide and every open PR inherits it. The floor refuses with
identity=test.claim.live_deploy.emit.apply_script_and_tree_sync_unit_stay_within_ci_runner_grants
is enrolled in v2.workflow.floor_cost_debt but the tree DECLARES NO SUCH
IDENTITY, cause=stale_cost_debt, and instructs: "Delete the row."

DELETING THE ROW WOULD HAVE BEEN WRONG, and the row itself says so. Its
annotation carries "TRIGGER (CAPABILITY, NOT ROSTER ERASURE) ... merely deleting
this identity, emptying the roster, or replacing production emission with a
smaller fixture does not restore the coverage and does not satisfy the trigger."
The diagnostic is right that the identity is absent and cannot see why.

THE WITNESS WAS RENAMED, NOT DELETED. #10724 (74e7ab6) stopped the
publication member writing two programs to one unit name, so the tree-sync half
of the subject went away and the witness narrowed with it:
apply_script_and_tree_sync_unit_stay_within_ci_runner_grants became
apply_script_stays_within_ci_runner_grants, in the same module, and the debt row
was not carried across. So the subject still exists and its debt is still owed;
what broke is the reference.

The roster now names the live identity. The historical measurement in the
annotation deliberately KEEPS the old spelling -- 563ms was taken against the
two-program subject, and rewriting it to the new name would attribute a figure
to a subject that did not exist when it was measured -- with a note above it
recording the rename so the old spelling is not read as live.

Verified rather than assumed: the new identity exists at
dag/test/claim/live_deploy/emit_test.dag in module test.claim.live_deploy.emit,
the old spelling appears nowhere in the tree outside this file, and the new name
was absent from the roster before this change. Compile: 26 blocking errors, none
in this file -- the same count main carries.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01632CTZ8diiLNBQaXobNWKQ
@briansrls
briansrls merged commit 88bc548 into main Sep 7, 2026
4 checks passed
@briansrls
briansrls deleted the session/snappy-lark-356-stale-debt-rename branch September 7, 2026 18:00
briansrls pushed a commit that referenced this pull request Sep 11, 2026
…t 1: joint_claim_join, the instrument behind its figures (#11044)

* Scope the jointly-incompatible-open-PR mitigation: a claim-channel x surface join over the declaration index, advisory-first

Three 2026-09-10 reds on main were pairs of individually-green, textually
disjoint PRs whose union does not compile. This records the scope of a
mitigation and builds nothing, answering the four questions the brief asked
before any shape:

THE CUT. All three public instances are one finding kind, ImportMemberAbsent,
and only one was a deletion: #10865 was a rename, and #10923 dropped a
RE-EXPORT with no declaration deleted anywhere. The cut is therefore the
surface predicate the declarations rider already applies, import_surface_has
(declared | variants | reexported) as a base-minus-head DELTA, not the kind of
edit. The general case is every claim channel the index carries -- imports,
citations, rostered rows (#10769, #10718 are the same shape through the other
two) -- and the residuals the index cannot see are named: field rename,
arity/signature, and pure freshness (private #49 x #50).

THE COST. namespace_wave_admission already reconstructs a base index beside
the head index from only the diff-touched files, per run, in the witnesses
lane; the join is A(I) & R(D) minus the claims D itself retires, a set
intersection, not a pairwise compile. Measured retrospectively over 374
first-parent commits since 2026-08-28: the raw join is a 207-hit candidate
list (the superset trap); with the one exclusion it is 5 hits, 4 of them the
three brief instances, the fifth an ordering artefact an open-PR-set join
excludes by construction. Recall 3/3 on the window's ImportMemberAbsent reds.

THE PLACEMENT. No new job (roster closed): a rider on the parse phase, like
rostered_row_join, advisory, reporting and annotating without pushing a phase
failure; the one emitted-workflow change is a pull-requests: read permission
row. The freshness caveat of a push-time verdict is stated as the reason this
sits beneath the ceiling.

THE REFUSAL. One finding per removed entry x claiming site: the (module,
name) and which surface it left, the sibling PR and head, the claiming module,
in_declaration and SourceLocation; NotEvaluated when the open-PR set is
unobservable, never an empty hit set.

gunbc-private: no parse phase, the overlay is outside DAG_PARSE_SWEEP_ROOTS,
so the join is public-only today; 113/114 private modules import from public,
a cross-repo exposure no public PR is ever compiled against, named and left
to warm-badger-62's lane.

Ceiling stays with gunbc.plans.ci_merge_freshness and the landed, deferred
receipt_is_admissible; this record retires with it.

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

* chore: regenerate drifted generated artifacts (ci auto-heal)

Ledger-Repair-Judged: docs/design-rung-drops.md

* Checkpoint 1: joint_claim_join, the instrument behind the scope's figures; the private gap as a typed stall; the within-tree half re-homed

Answers review 63772 / 63786 (a transcribed measurement with no producer) and the
manager's 2026-09-11 rulings, by landing the producer rather than softening the
claim.

THE INSTRUMENT. v1_compiler.bin.joint_claim_join computes, per change, the
export-surface entries removed (declared | variants | reexported, base minus
head) and the import claims added and retired, from only the diff-touched files
on both sides through namespace_wave_admission base_records and diff_sides, and
joins every admitted pair. A claim is joined only while LIVE when the entry
leaves: not retired by the removing change itself, and in retrospective mode not
retired by any change that landed between the pair. raw_candidates is reported
beside findings so the width the exclusion removes stays a number. Seven
fixture-boundary controls, real parser, real join: one positive control per
instance shape (variant deleted, name renamed, re-export dropped), one RED per
exclusion, one for the pair predicate, one for a claim already at the base.

WHAT IT ANSWERS, cited by invocation in the plan and not transcribed:
`joint_claim_join 6a54695^..f078c59` (first-parent main since
2026-08-28, default 3-day window) reports subjects=373 raw_candidates=236
findings=4 -- exactly the three 2026-09-10 instances (instance 1 is two names).
The two candidates the first-exclusion-only run reported as findings were both a
third commit retiring the claim between the pair (#10617 for the harness one; the
DensityMarketedMax one likewise); two artefacts with one cause was a defect in the
retrospective's pair predicate, built in as the second exclusion with its own
control rather than described.

TWO CORRECTIONS THE INSTRUMENT MADE TO THE SCOPE. Instance 2 (#10923 x #10925)
was a MOVE, not a dropped re-export: the base declared
mutation_status_is_commit_ambiguous in secret_provision_actuator and #10923
re-homed it; the instrument reports `(declared)` and the plan's table now says so.
The dropped re-export stays covered by the surface and keeps its control.

THE RULINGS. Checkpoint 2 stops at the pull-requests:read permission row on a
required job (the operator's trade); the dashboard reader is costed in section
4.1 and preferred on every axis but authority. The private gap is a typed
GuaranteeStall row (joint_claim_join_private_corpus_unindexed_stall) with the
overlay's extra-source-root trigger as its grounding, not prose. The within-tree
field-set case is NOT a checkpoint here: its home is
witness_that_fails_to_compile_is_absent_rather_than_red, and this change appends
a receipt there widening the trigger from claim-root files to the ruled capability
-- every construction site of a type whose field set changed, regardless of gate
closure -- per section 4b(3), rather than minting a second authority.

Hand Rust is enumerated in gunbc.joint_claim_join_seed_growth (33 items, no impl
block, every one citable) and rostered in seed_growth_admission.

Verified remotely: clippy -D warnings clean on the bin, 7/7 tests, the
retrospective above, and v1_src_dag_parse over the corpus with every new .dag
present: 5461 files parse-clean, no findings.

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

* State the population compile's boundary on the row: compilability of the claim-root population, not evaluation of it

A file that compiles and whose test fns are declared but never reached from the
entry passes that wall untouched (cool-badger-34's four fns, 2026-09-11). That
hole is discriminating_arm_built_but_never_enrolled's, named as the neighbour so
the word POPULATION is not later cited for a scope the trigger never claimed.

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

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant