Skip to content

ci(1979): arm the stale sweep — .github joins the wave, and the flip lands last - #293

Merged
LukasWodka merged 3 commits into
developfrom
ci/1979-arm-the-sweep
Aug 23, 2026
Merged

ci(1979): arm the stale sweep — .github joins the wave, and the flip lands last#293
LukasWodka merged 3 commits into
developfrom
ci/1979-arm-the-sweep

Conversation

@LukasWodka

@LukasWodka LukasWodka commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

The last PR of the backend#1979 wave, and the last exit-criterion work for backend#1680.

Two things, in one PR because they cannot be separated

1. This repo gets its caller. It was deliberately left out of #288 (Bugbot's
call): exempt plus a caller on the audited branch is itself a finding
(caller-drift.py:2260), so shipping the caller alongside the reusable would have
gone green on a repo the audit had been told to skip.

2. All 17 migration entries flip exemptrequired, and the
stale_backlog_migration_in_flight anchor is deleted rather than left behind.
Its own text asked for that:

if this anchor is still here after that, it has become the same finding as
wip_limit_check_has_no_callers — a reusable that shipped and was never wired up,
with a written excuse. Treat it as a defect then, not a justification.

What is deliberately NOT flipped

release-train and rfcs keep their exemptions, because those rest on reasons that
are still true and are not the migration:

repo why it stays exempt
release-train enrolling the repo that drives promotions into an unattended closing sweep is a decision someone should take deliberately. Still UNDECIDED, and the note says so rather than inventing a basis.
rfcs it holds decision documents, not a backlog. An RFC that has sat untouched is not stale — it is a decision nobody has taken, which is what the board card is for (.github#138).

Ordering — the reason this is a separate PR

This merges LAST. Flipping to required before a repo's caller lands would
redden the org audit for every repo still waiting: the drift window made to look
permanent, which is exactly how a tier teaches people to ignore it.

step state
1. .github promotes develop → staging → main, carrying #288's reusable pendingmain still has the old 1174-byte copy, develop is 4 ahead
2. the 16 caller PRs merge open as drafts, one per repo
3. this PR draft until 1 and 2 are done

Verification

  • 17 entries required, 2 deliberately exempt — asserted by parsing the
    inventory and printing every repo's resolved value, not by counting diff lines
  • stale_backlog_migration_in_flight: 0 occurrences remaining
  • make check green — 41/41 house-rules cases
  • caller-drift-selftest.py197 pass, 0 fail
  • actionlint clean on the new caller

🤖 Generated with Claude Code


Note

Medium Risk
This is the org contract the caller-drift audit enforces. Flipping many repos to required will redden the fleet audit if any caller is missing or not yet on the audited branch.

Overview
Closes the backend#1979 migration in repo-inventory.yml by flipping stale-backlog.yml from exempt to required on the repos that were waiting on caller PRs (including .github), and deletes the stale_backlog_migration_in_flight shared reason so it cannot linger as a written excuse.

release-train and rfcs stay exempt on their existing, still-true reasons (undecided enrollment of the promotion driver; RFCs are decisions, not a backlog).

Reviewed by Cursor Bugbot for commit a8c5174. Bugbot is set up for automated code reviews on this repo. Configure here.

…p lands last

The final PR of the backend#1979 wave, and the last exit-criterion work for
backend#1680.

Two things, in one PR because they cannot be separated:

1. THIS REPO GETS ITS CALLER. It was deliberately left out of .github#288
   (Bugbot): `exempt` plus a caller on the audited branch is itself a
   finding (caller-drift.py:2260), so shipping the caller with the reusable
   would have gone green on a repo the audit was told to skip.

2. ALL 17 MIGRATION ENTRIES FLIP `exempt` -> `required`, and the
   `stale_backlog_migration_in_flight` anchor is DELETED rather than left
   behind. Its own text says so: "if this anchor is still here after that,
   it has become the same finding as wip_limit_check_has_no_callers -- a
   reusable that shipped and was never wired up, with a written excuse."

`release-train` and `rfcs` keep their exemptions untouched, because those
rest on different reasons that are still true: release-train because
enrolling the repo that drives promotions into an unattended closing sweep
is a decision somebody should take deliberately (still UNDECIDED, and the
note says so), and rfcs because it holds decision documents rather than a
backlog -- an RFC nobody has acted on is a decision nobody has taken.

ORDERING, which is the whole reason this is a separate PR: flipping to
`required` before a repo caller lands would redden the org audit for every
repo still waiting -- the drift window made to look permanent, which is how
a tier teaches people to ignore it. So this merges LAST, after the 16
caller PRs.

Verified: 17 entries required and 2 deliberately exempt (asserted by
reading the parsed inventory, not by counting the diff), the spent anchor
at zero occurrences, `make check` green (41/41 house-rules cases), and
caller-drift-selftest 197/0.

backend#1979

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

Copy link
Copy Markdown
Contributor Author

bugbot run

Comment thread repo-inventory.yml
Comment thread repo-inventory.yml
… green

Bundling the caller with the flip deadlocks: the audit reads caller presence from
the audited branch via the API, so `.github`'s caller is absent from `develop`
until it merges, and `gate` is a required context. The caller now lands in
.github#307; this PR is purely the 17-entry flip.

Refs backend#1979

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

Copy link
Copy Markdown
Contributor Author

Split: .github's own caller moved to #307, because bundling it here could never go green

All 16 other callers are merged, and this PR's flip cleared 16 of the 17 findings. The seventeenth could not clear, and re-running would not have helped:

1 drift finding(s):
- .github: MISSING required caller for stale-backlog.yml on develop.

Fresh run 32595845377 at 20:09, after the wave landed.

The mechanism is a deadlock, not a flake. The audit reads caller presence from a repo's audited branch via the API--source-dir covers only copies and reusables — so for .github itself the caller does not exist on develop until it merges. With the entry flipped to required and the caller only in this PR's diff, the audit must report it missing. And gate is a required context on develop. So the PR that adds the caller cannot merge until the caller is added.

The caller now lands in #307, which touches no contract file and therefore does not trigger conformance-gate at all (GUARDED lists repo-inventory.yml, caller-drift.py, its selftest, caller-drift.yml, conformance-gate.yml — none of them in #307).

On the deliberate bundling this reverses

The caller's header said it shipped with the flip "deliberately", because exempt plus a caller on the audited branch is itself a finding (caller-drift.py:2260).

That finding is real and will appear on .github between #307 merging and this PR merging. But it is a transient window closed by the very next merge — the same window the whole fleet just went through, bounded by the stale_backlog_migration_in_flight anchor — whereas the bundling it was avoiding produces a PR that can never be merged at all. I rewrote that header in #307 rather than leave a rationale describing a plan no longer being followed.

Splitting also restores this file's own governing rule, stated in repo-inventory.yml's header and followed for all 16 other repos: land the caller first, flip the entry after. This repo was the one exception, and the exception is what jammed.

Order

  1. ci(1979): land .github's own stale-sweep caller, ahead of the flip #307.github's caller onto develop
  2. this PR — the 17-entry flip + anchor deletion; its audit should then be green, every one of the 17 callers existing
  3. fix(2242): say why rfcs is exempt, accurately, and stop one anchor describing two repos #306 unblocks as collateral, and backend#1979 closes

Also merged develop in (branch was 9 behind), which fixed a genuine quality / pipefail early-close failure — that check was judging pre-#2264 shell.

@LukasWodka

Copy link
Copy Markdown
Contributor Author

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a8c5174. Configure here.

Comment thread repo-inventory.yml

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit a8c5174. Configure here.

@saadqbal saadqbal left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not approving, because gate and audit are both red and a failing required check is a hard no — but the red here is diagnosed, not mysterious, and it isn't this PR's fault.

The audit run reports one finding:

- .github: MISSING required caller for stale-backlog.yml on develop.

and gate then refuses on caller-drift.yml concluded 'failure' ... A contract change must not merge on a failed or skipped audit. That's the deadlock #307 was split out to break: the audit reads caller presence from the audited branch, so .github's own caller does not exist on develop until #307 merges, and a PR that bundles the exemptrequired flip with the caller can therefore never go green.

So the sequence is #307 first, then re-run these two checks here. I've approved #307 on the strength of the same log. Nothing to change in this diff on that account — when it goes green I'll review the flip itself on its merits.

Flagging one thing so it isn't a surprise: between #307 merging and this one merging, .github's audit is expected to be red for the opposite reason — exempt in the inventory plus a caller present on the audited branch is itself a finding (caller-drift.py). That window is real and closes on this merge, which is the trade #307's comment argues for. Worth not reading that red as a regression when it appears.

@saqlainsyed007 saqlainsyed007 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified against the tree at head (a8c5174), not the description:

  • stale_backlog_migration_in_flight anchor: 0 occurrences remaining — deleted as its own text asked, not left behind as a written excuse.
  • 17 entries flipped to stale-backlog.yml: required, 2 kept exempt — and the two are exactly the ones the description names: *stale_backlog_exemption_needs_redeciding (release-train, enrolment of the promotion driver still undecided) and *stale_backlog_not_a_backlog (rfcs, decisions not a backlog). Neither rests on the migration, so neither should flip. Correct.
  • Decisive check: audit and gate are green at this head. caller-drift reddens the moment a repo flips to required without its caller present, so the green audit is the derived proof that every flipped entry — .github included — has a real caller on the audited branch. This is exactly the outage the staged ordering exists to prevent, and it isn't tripped.

Bugbot pass, 3 threads all resolved, mergeable. BLOCKED is the ordering/branch-protection gate (this lands last), not a conflict — that's the train's concern, not a code issue. LGTM.

@LukasWodka
LukasWodka merged commit 7385a14 into develop Aug 23, 2026
14 of 16 checks passed
@LukasWodka
LukasWodka deleted the ci/1979-arm-the-sweep branch August 23, 2026 12:06
LukasWodka added a commit that referenced this pull request Aug 23, 2026
…(backend#2242)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
LukasWodka added a commit that referenced this pull request Aug 23, 2026
…scribing two repos (#306)

* fix(2242): say why rfcs is exempt, accurately, and stop one anchor describing two repos

The `rfcs` block asserted "this repo has no `develop`" in two places. It has one,
and it takes merges. Corrected both, without touching the `required` flip that is
still blocked on the callers reaching rfcs' default branch.

Refs backend#2242, tracebloc/rfcs#41

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

* fix(2242): name the surviving precedent, not the anchor #293 deleted (backend#2242)

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

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@LukasWodka

Copy link
Copy Markdown
Contributor Author

/fr-pass

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.

3 participants