Skip to content

release-train: develop -> staging - #317

Merged
tracebloc-release-train[bot] merged 5 commits into
stagingfrom
release-train/to-staging
Aug 24, 2026
Merged

release-train: develop -> staging#317
tracebloc-release-train[bot] merged 5 commits into
stagingfrom
release-train/to-staging

Conversation

@LukasWodka

@LukasWodkaLukasWodka commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Automated promotion by the release train (RFC-0008 D14). Head is the train-managed release-train/to-staging branch (a mirror of develop), so it never collides with a human PR. Merged only when the fr-gate is green.


Note

Medium Risk
Writes GitHub Projects Status via an org App token on every bug label in wired repos. A wrong monotonic gate could demote cards; fail-closed GraphQL errors can also red CI on a one-shot labeled event.

Overview
Implements the org rule that work-type:bug issues skip refinement: a new bug-to-ready job on the existing labeled reusable (still named customer-priority-bump.yml) moves the kanban card from Backlog to Ready only, never backward.

The job mints a scoped App token, retries until add-to-kanban lands the card, derives option IDs from the live board, and fail-closes on GraphQL errors[], missing cards, unknown/inverted columns, PRs, and unconfirmed writes. Column names are now asserted by kanban-columns-check. Coverage is extracted from the workflow (bug-to-ready-selftest + mutations).

Inventory: stale-backlog.yml is required fleet-wide (migration exemption removed); bugbot-gate.yml is listed as exempt pending caller rollout. rfcs protection/caller notes are corrected (develop exists, board callers staged). Org standards now say automation moves bugs, and that docs/rfcs are main-only. .github, release-train, and rfcs still lack this caller.

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

LukasWodkaand others added 5 commits August 23, 2026 14:06
…lands last (#293)
* ci(1979): arm the stale sweep — this repo joins the wave, and the flip 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>
* ci(1979): move .github's own caller to its own PR, so this one can go 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>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…he fleet again (backend#2284) (#312)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…#2348) (#313)
* feat(2348): a bug-labelled issue lands in Ready, not Backlog (backend#2348)
The org rule -- "bugs get `work-type:bug` and go straight into `Ready`
(defects skip refinement)" -- was written in org-standards.md and
implemented nowhere: add-to-kanban puts every issue at `Backlog` and no
workflow read the label. Measured 2026-08-22: seven bug-labelled tickets
in one day, all seven left in `Backlog`.
Implemented as a job on `customer-priority-bump.yml`, the only reusable
already triggered by `issues: labeled` and already called by 16 of 19
repos -- so it reaches the fleet with no per-repo edit and touches none of
conformance-gate's GUARDED contract files.
MONOTONIC: promotes only from `Backlog` or from no Status, and asks the
BOARD for the direction (col_index byte-identical to the closure router's)
rather than holding a rank table. An inverted Backlog/Ready order refuses
rather than performing a demotion.
FAILS CLOSED like advance-deploy-env, not like the closure router: an
unreadable board, a truncated page, an unplaceable column or a card that
never reaches the project are all RED. Declining quietly here would
reproduce the very defect being fixed -- and a `labeled` event fires once,
where a cron gets another go next week.
Tests: 46 assertions, extracted from the YAML by `# selftest:` markers and
run verbatim; the Status vocabulary is derived from advance-deploy-env's
rank() and cross-checked against the sibling suite, so all twelve columns
are driven. 21 mutations, 0 stale, 0 uncaught. `make check` green.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(2348): the Status write goes through the same errors[] rejection as the reads (backend#2348)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
The develop-first rule named `docs` as its sole exception. `rfcs` has the same
shape and the same reason -- it publishes no artifact, has no deploy stages, and
is not on the release train -- so a promotion gate there has nothing to gate.
Decided on backend#2347.
This line was the last place still asserting otherwise. `repo-inventory.yml` has
described `rfcs` as a single-branch repo all along: `release_train: false`, so
`audit_branch: develop-first-on-train` already resolves to the default branch,
and the `develop` role carries `exempt: *no_develop_branch_single_branch_repo` --
"single-branch repo: `main` is the only integration branch, so there is no
`develop` to protect. Structural, not a gap."
So the machine-readable side needs no change; the prose was the drift. Stated as
a class with its members named, and pointed at the inventory, because a bare list
drifts and a bare class invites argument.
Why nobody caught it: the conformance guard flags a stale exemption only when the
role's branch appears AND carries protection. `rfcs/develop` existed and was
completely unprotected, so the contradiction between "there is no develop" and a
live develop branch was invisible by construction. rfcs#45 deletes that branch and
makes reality match what this file and the inventory both now say.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…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
ContributorAuthor

bugbot run

@cursorcursorBot 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 b0bc388. Configure here.

@tracebloc-release-traintracebloc-release-trainBot added gate-nudge Toggled by the release train to (re-)fire the fr-gate and removed gate-nudge Toggled by the release train to (re-)fire the fr-gate labels Aug 24, 2026
@tracebloc-release-train
tracebloc-release-trainBot merged commit cff3b74 into stagingAug 24, 2026
33 of 37 checks passed
@tracebloc-release-train
tracebloc-release-trainBot deleted the release-train/to-staging branch August 24, 2026 05:34
Sign up for freeto 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

@LukasWodka