Skip to content

release-train: staging -> main - #211

Merged
tracebloc-release-train[bot] merged 8 commits into
mainfrom
release-train/to-main
Aug 11, 2026
Merged

release-train: staging -> main#211
tracebloc-release-train[bot] merged 8 commits into
mainfrom
release-train/to-main

Conversation

@LukasWodka

@LukasWodkaLukasWodka commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

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


Note

Medium Risk
Changes how code-quality jobs pass or fail across the org (supply-chain pins and format gates) and how fleet-wide CLAUDE.md sync writes behave; mis-wiring would block merges or leave sync stuck, though the diff is targeted bug fixes with tests.

Overview
CI posture fixes in code-quality.yml: The format job again treats black as advisory when either global soft-fail or format-soft-fail is set (restoring the intended OR after a regression that made every advisory caller a hard format gate). The action-pins job now keys blocking behavior only on action-pins-soft-fail, so repos that pass action-pins-soft-fail: false can actually enforce pinned actions while the rest of the suite stays soft-fail—previously the default soft-fail: true OR logic meant that override could never arm the check.

Org standards sync:standards-sync.py adds retries and fail-closed handling for transient 404s on fresh sync branches and for stale/missing SHAs on writes, and only treats “file must exist on head” when the sync branch was just created (reused branches with a genuine missing CLAUDE.md can create the file again). Selftests cover those paths.

Inventory & hygiene:repo-inventory.yml lists version-bump-gate.yml as a reusable and marks it required or exempt per repo. New root .gitignore drops Python bytecode and local cache noise. org-standards.md / synced CLAUDE.md text clarifies kanban status rules (bugs go straight to Ready).

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

LukasWodkaand others added 8 commits August 10, 2026 19:34
…, exempt elsewhere (#202)
Now that the version-bump-gate callers are merged into the 5 version-published
repos (data-ingestors, tracebloc-py-package, cli, design-system, client), add
the reusable to the inventory so caller-drift enforces it: required on those 5,
exempt (no version_file → gate N/A) on the rest. Closes the enrollment gap that
let cli + py-package hit the version refusal only at the prod boundary
(backend#1563).
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
`scripts/__pycache__/standards-sync.cpython-314.pyc` was committed by a
`git add -A` in #200 and reached `develop`. It is now riding the
develop -> staging promotion in .github#203, which is how I noticed it.
It is a build artifact and does not belong in the tree: version- and
platform-specific (cpython-314, while CI runs 3.12), regenerated on every local
run of the selftest, and a stale one silently shadows the source it was built
from.
Added a .gitignore covering the whole class rather than the one file that got
caught -- `__pycache__/`, `*.py[cod]`, plus .DS_Store and .pytest_cache, which
the same careless `add -A` would sweep in next.
The file is also present on the #197 branch, which branched after #200; removed
there too, so whichever lands first the artifact is gone and the other cannot
reintroduce it.
Selftest still passes (20 checks on this branch; #197 takes it to 27).
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…tes (backend#1602) (#197)
* fix(standards): retry fresh-branch reads; refresh sha on rejected writes (backend#1602)
Design rule 5: fresh refs are eventually consistent. On run 31373298821
(frontend-app leg) the contents read on a just-created branch transiently
404'd, the 404 was believed, and the sha-less PUT was rejected as
'Invalid request' — one flaky read failed a fleet run. remediate() now
knows whether the base has the file: reads the base proves must succeed
retry with backoff and fail closed if they never do; genuine absence is
confirmed by a re-read; a 409/422-rejected write refreshes the sha and
retries exactly once. Five new offline selftest checks pin the contract
with a scripted gh stub (25 checks total).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(standards): a reused sync branch may honestly 404, and say so on a real conflict
Two Bugbot findings on #197.
1. `expect_file` MEANS "a 404 here cannot be true" -- which holds only when the
ref was cut moments ago from a base that has the file. That is the eventual
consistency window the retry exists for.
A REUSED branch (the 422 path) is a different situation: it may have been cut
BEFORE CLAUDE.md existed on the base, so a 404 is honest and permanent.
Passing file_on_base alone made the read retry five times and fail closed, so
the sha-less create could never run and that repo was stuck forever. The old
code read the 404 as absence and created the file, which was right here.
expect_file is now `file_on_base and branch_is_fresh`.
2. The second-rejection message was UNREACHABLE. On attempt 2 the flow fell
through to the generic return inside the loop, so the one failure worth
distinguishing -- refreshed the sha and was rejected anyway, i.e. another
writer is racing the branch -- was the one nobody could see. It now returns
its own message, and the post-loop return is documented as a fail-closed
backstop rather than dead code that would return None (i.e. SUCCESS).
Selftest 25 -> 27. Mutation-verified both: reverting expect_file, and making the
second-rejection branch unreachable again -- both CAUGHT.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* test(standards): the reused-branch check asserted an end state and proved nothing
Mutation-checking the previous commit caught its own test. Reverting the
expect_file fix left the selftest GREEN, because the check asserted only "the
file got created".
With the bug present the read retries, swallows the scripted PUT response, reads
its `{}` body as the file, and the run reaches the same end state by a different
path. Same outcome, wrong reason -- so the check could not distinguish fixed from
broken, in either direction.
Assert the READ COUNT instead: 2 when a 404 on a reused branch is believed as
absence, 5 when it is wrongly treated as the eventual consistency window. That is
the thing the fix actually changes. Also catches the stub's exhaustion assertion
and records it as a failure rather than letting it abort the whole selftest.
Re-verified: reverting expect_file is now CAUGHT (reads=3, expected 2).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* chore: drop the committed .pyc here too (backend#1602)
Same artifact as .github#204, removed on this branch as well. This branch was cut
after #200, so it carries the file; without this, merging #197 after #204 would
put it straight back and the fix would look like it had held.
The .gitignore is identical to #204's, so whichever merges first the other
resolves cleanly.
Selftest: 27 checks, 0 failed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* docs(claude): sync org-standards block (backend#1602)
Managed sync from tracebloc/.github/org-standards.md.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(claude): sync org-standards block (backend#1602)
Managed sync from tracebloc/.github/org-standards.md.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…fast-lane (#208)
Saqlain (client-runtime#301): the new bug rule sends defects straight into Ready
unrefined, but the next line still called Ready 'the refined queue' flatly, so a
reader landing there assumes everything in Ready is refined. Qualify it with the
bug exception. Source fix per our own rule (managed block — never hand-edit the
synced copies); the standards-sync re-propagates to every repo's CLAUDE.md.
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…ide (backend#1681) (#207)
* fix(code-quality): make the per-job soft-fail overrides able to override (backend#1681)
`action-pins-soft-fail` and `format-soft-fail` were combined with the global
`soft-fail` via OR:
SOFT_FAIL: ${{ (inputs.soft-fail || inputs.action-pins-soft-fail) && ... }}
`soft-fail` defaults to true, so the override could only ever make a job MORE
advisory -- never arm one. That is the opposite of its purpose: the input exists
so a repo can arm the supply-chain check while the rest of its suite stays
advisory during a migration.
Measured on origin/develop: 16 of 16 callers pass `action-pins-soft-fail: false`,
and docs, model-zoo, start-training and tracebloc-website carry a comment saying
"Armed 2026-08-06 (backend#1492) ... Independent of soft-fail above" while passing
no `soft-fail` at all -- so action-pins has been advisory in exactly the four repos
that believe it is armed. Three of the four are public.
Effect (truth table in the PR): the 12 repos that pass both inputs false are
unchanged; the 4 above flip from advisory to armed. Verified safe before shipping
with a byte-faithful replica of this job's own scanner, mutation-tested to report
violations and to skip commented lines: 0 unpinned refs across all 16 repos, so no
PR turns red on merge.
`format-soft-fail` gets the identical fix and is behaviour-neutral today (no caller
passes it; its default is true) -- it removes the same trap before it springs.
Verified: YAML parses, actionlint clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(code-quality): keep format soft-fail additive (only action-pins is authoritative)
Bugbot: format-soft-fail defaults to false, so replacing (soft-fail ||
format-soft-fail) with the input alone flipped every soft-fail:true caller from
an advisory format job to a hard gate. Per this input's contract it is ADDITIVE
('advisory even when soft-fail is false'), unlike action-pins-soft-fail which 16
callers arm explicitly. Revert just the format job to the OR; action-pins keeps
the authoritative override that backend#1681 is actually about.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <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 3c4e84c. 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 11, 2026
@tracebloc-release-train
tracebloc-release-trainBot merged commit 28d15ca into mainAug 11, 2026
19 checks passed
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