Skip to content

release-train: develop -> staging - #419

Merged
tracebloc-release-train[bot] merged 9 commits into
stagingfrom
release-train/to-staging
Jul 29, 2026
Merged

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

Conversation

@LukasWodka

@LukasWodkaLukasWodka commented Jul 29, 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
Changes frozen exit-code semantics and prompt-cancel behavior that customer scripts may rely on, plus release tagging and cosign identity rules that affect installs and what counts as latest.

Overview
Release train promotion (develop → staging) carrying 0.10.1 via a new root VERSION file and release-workflow checks that fail if a tag’s semver base doesn’t match VERSION, plus stricter GitHub prerelease labeling so only plain vX.Y.Z can become latest.

CLI behavior (scripting contract): Adds shared cleanCancel / mapPromptErr so backing out of prompts (Ctrl-C or “no”) always prints Cancelled — … and exits 0, fixing silent success on client create, delete, and aligning data ingest, data delete, and resources set. Docs and exitcodes.go now distinguish prompt cancel (0) from interrupting work already running (130). New cancel_test.go and copy-catalog golden updates guard the contract.

Update check: Skips GitHub fetch when ~/.tracebloc is missing (fresh install / after offboard) so every command doesn’t pay the timeout; writeUpdateCache uses the same configDirExists gate so offboard doesn’t recreate the config dir.

Install/release verification: Cosign certificate identity regexp tightens from workflow @.* to @refs/tags/v.* in install.sh, install.ps1, and release.yml comments.

Docs/process: Adds .cursor/BUGBOT.md, qualified RFC banner IDs, PR template / CONTRIBUTING cross-repo issue closing notes, and docs/troubleshooting.md exit-code table updates.

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

LukasWodkaand others added 8 commits July 27, 2026 09:59
…, a visible note (#410)
Ctrl-C at `client create`'s "Provision this client?" confirm and at
`delete`'s typed-name confirmation exited 0 having printed nothing about
it: `mapClientErr` mapped errInteractiveCancelled straight to nil with no
Printer call. A script could not tell an aborted run from a completed one,
and the declined-answer branch sitting directly beside each one DID print.
Centralise the convention instead of duplicating it a fifth and sixth time:
- `cleanCancel(p, nothing, …)` is now the only place a cancellation is
reported — it prints "Cancelled — <nothing>." and returns the clean exit.
- `mapClientErr` becomes `mapPromptErr(p, err, nothing, …)`: the Printer and
the note are in the signature, so the silent-return shape is unreachable.
Non-cancel errors still map to exit 1.
- All six prompt sites route their cancellation through it, including the
declined-answer twins, so Ctrl-C and "no" cannot drift apart. Output is
byte-identical at the four sites that were already correct; `client
create`'s terse "Cancelled." becomes "Cancelled — nothing was
provisioned."
Exit code stays 0, which is what all six sites already did and what
exitOK documents. exitInterrupted (130) is used only for a Ctrl-C that cuts
short work already in flight (sign-in wait, status --wait, the seal suite,
an installer re-run) — its comment claimed the prompt case too,
contradicting exitOK and every call site, so fix that and the matching row
in docs/troubleshooting.md.
Tests: cancel_test.go is a table over every prompt a user can back out of,
asserting the exit code, the user-visible line, and that the command did
not act anyway. The copy-catalog harvester learns about the new copy helper
so the assembled "Cancelled — …" lines stay in the catalog.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Cursor Bugbot reviews this repo with zero project context today — no repo
in the org has a BUGBOT.md. This repo draws the most findings of any
(232), and the recurring classes here are dishonest outcome reporting and
mishandled interrupts, not generic security nits. Writing the house rules
down stops Bugbot re-deriving them and lets its one pass land on the hard
findings.
Encodes the invariants with the reason and a real reference each: honest
outcome reporting via classifyPushOutcome (a Job exiting 0 with row
failures is "completed_with_failures", not "succeeded"), the FROZEN exit
code contract, visible feedback on every errInteractiveCancelled path —
including that mapClientErr swallows it silently today — HTTP 426 as a
hard stop never a warning, fail-closed cosign/SHA256 verification in
install.sh, per-call timeouts, empty/nil guards at boundaries, the
cross-repo pin + generated-artifact rules, and the STYLE.md output
contract.
Also records verified non-issues: .golangci.yml does NOT gate CI (pinned
standalone binaries do), staticcheck's deliberate -ST1005 exclusion, the
single documented nolint, and the deadcode allowlist. Deliberately omits
a SLSA/provenance claim — signing here is cosign keyless, and the term
appears nowhere in the repo.
Item 4 of tracebloc/backend#930.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…oc/backend#930) (#411)
GitHub auto-closes an issue in another repository only when the PR body names
it owner-qualified. A bare `repo#N` merely cross-references and closes nothing
-- and the template's own hint taught `Ref tracebloc/other-repo#456`, which is
not a closing keyword at all.
Eight code-complete issues stayed open for days-to-weeks this way
(tracebloc/backend#1171-#1176, tracebloc/client#376, #393),
dragging two epics to 0% and 14% when the true figures were 67% and 24%.
Someone had to notice and close all eight by hand.
Also corrects CONTRIBUTING.md, which asserted that a `Closes #N` body line
auto-closes on merge. This repo's default branch is `main` while PRs land on
`develop`, and GitHub fires closing keywords only on merges into the default
branch -- so that claim was wrong in both directions and helped propagate the
bug. cli#393 is one of the eight.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
RFC numbers are assigned per repo, so a bare "RFC 0001" names four different
documents across the org and "RFC 0002"/"RFC 0003" name two each.
Add the qualified ID (`RFC-CLI-0001` … `RFC-CLI-0003`) to each header, in the
blockquote style these documents already use. Two of the three also record
which document the existing bare in-code references actually mean: nearly all
`RFC-0001` comments across backend/cli/client point at RFC-CLI-0001, and the
`RFC-0003` references in client's chart templates and docs/SEAL-CHECK.md point
at RFC-CLI-0003 — not at backend's own 0001/0003.
Nothing is renumbered and no file is moved, so existing links still resolve.
The org-wide index lives in tracebloc/backend (private) at docs/rfcs/README.md.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nt (Bugbot #397) (#414)
#404 made writeUpdateCache refuse to recreate a wiped ~/.tracebloc, but
latestReleaseVersion still fetched from GitHub whenever the cache couldn't be
read. On a fresh install / after offboard the dir is absent, so the throttle can
never be persisted and every TTY command re-hit the releases API, burning
updateCheckTimeout each time.
Reconcile both: introduce configDirExists as the single "can the throttle be
persisted?" gate, used by writeUpdateCache (skip write — #404) AND
latestReleaseVersion (skip the network check entirely — #397) when the dir is
absent. A dir-present-but-stale/unreadable cache still falls through to the
normal throttled fetch, so the everyday path is unchanged.
Co-authored-by: shujaat hasan <shujaathasan@shujaats-MacBook-Pro.local>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…9) (#415)
install.sh verified downloaded binaries against certificate-identity-regexp
'.../release.yml@.*' — @.* matches ANY ref, so a binary signed by release.yml
running on a feature branch verified identically to a tagged release. Anchor to
'@refs/tags/v.*' so only tag-built releases are trusted. Same anchor applied to
the documented verify command in release.yml.
Part of tracebloc/backend#1269 (row 4).
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…#417)
* chore: declare next release in VERSION (0.10.1) for the release train
The train reads this file to cut tags: vX.Y.Z-rc.N on every staging
promotion (pre-release binaries for FR; 'latest' never sees them) and
vX.Y.Z on the prod promotion. The binary's own version still derives
from the tag at build time (release.yml ldflags) -- this file only
declares intent, uniform with tracebloc-py-package's pyproject version.
0.10.1 ships the cosign identity anchor fix (#415).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(release): enforce tag==VERSION + strict prerelease detection
Two guards raised in release-train review: (1) any tag's base X.Y.Z must
match the VERSION file (train-cut or manual), so the file can never go
silently stale after an out-of-train release; pre-VERSION tags are
grandfathered for rebuilds. (2) STRICT stability: only plain vX.Y.Z is a
stable release -- rc tags AND malformed variants (v1.2.3rc1, no dash)
are prereleases, so 'releases/latest' (the installer bootstrap) can only
ever resolve a real production build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* style: quote GITHUB_OUTPUT redirects (shellcheck SC2086)
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

Comment threadscripts/install.sh
…415) (#422)
install.sh rejects signatures from non-tag workflow runs; install.ps1
still accepted @.* -- Windows trusted what Unix refused. Same anchor now:
refs/tags/v.* (covers rc tags too).
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 cd995b5. Configure here.

@tracebloc-release-train
tracebloc-release-trainBot merged commit c8d142d into stagingJul 29, 2026
27 checks passed
@tracebloc-release-train
tracebloc-release-trainBot deleted the release-train/to-staging branch July 29, 2026 07:09
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.

4 participants

@LukasWodka@divyasinghds@shujaatTracebloc@saadqbal