Repository navigation
perf(release-rc-cut): render the RC command blocks as code, one file per outcome - #1604
Merged
Merged
Conversation
potiuk
force-pushed
the
perf/release-mgmt-1-rc-cut
branch
from
October 13, 2026 13:11
52edbe9 to
a1e7c62
Compare
7 tasks done
potiuk
added this pull request to stack #1620
October 13, 2026 14:14
potiuk
force-pushed
the
perf/release-mgmt-1-rc-cut
branch
8 times, most recently
from
October 16, 2026 06:28
b8dba99 to
f1ba914
Compare
…obe tests A commit made under the gpg-touch overlay's own `wrap` exports MAGPIE_GPG_TOUCH_WRAPPED_SIGNER to its hooks. With it set, signing_in_flight reports a signature whatever is running, so test_signing_in_flight_matches_the_whole_process_name failed whenever the workspace pytest hook ran from such a commit. _run now drops the variable, so the probes see only the processes the test starts. Generated-by: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GTPsZ5aEE5bUVYqp47Dpvv
…per outcome release-rc-cut had the agent compose every paste-ready block by hand from ~10k tokens of prose: the signed tag, the reproducible source build, one sign and checksum command per artefact and digest, the per-backend staging sequence, the ATR upload, the self-check and the planning-issue comment with its reproducibility record. A new tools/release-management package renders all of it from what `release-config load` prints; the agent presents the block and keeps the judgement. The tool runs nothing: no git, gpg, svn, gh, aws or atr call, no key, no network. Two rules the skill only stated in prose are now enforced in code: a svnpubsub staging URL under dist/release/ is refused (Golden rule 5 had no check anywhere), and so is an MD5 or SHA-1 digest. The exact-match RC tag check (rc1 must not match rc10) is a `tag-exists` command. SKILL.md becomes a router (9,962 → 6,503 tokens): each Step 0 blocker, the refused renders, the self-check failures and the ATR staging notes get their own file, and the prerequisites and references move to siblings. Every Golden rule, Hard rule, JSON contract and the headings the evals extract are unchanged. The model-graded step-2, step-2b and step-3 (cases 1-2) suites become pytest cases named after each former case; step-0 and the step-3 injection case stay model evals, the latter now given the real render output. An integration test renders from a real `release-config load`, so a renamed field on either side fails. Also fixes the archive-review step number: rc-cut, the release-config blocker, release-build.md and reproducibility.md said "Step 2f", which in release-prepare is composing the PR; the review is 2e. Generated-by: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GTPsZ5aEE5bUVYqp47Dpvv
… commands The release manager pastes these blocks into a shell, so a value taken from configuration (an archive prefix, an artefact name, a staging URL) must never be able to expand there. A new release_management.shell module provides dq (a double-quoted word with \\, ", $ and backquote escaped) and w (a bare word, unchanged when plainly safe or a <placeholder>, otherwise shell-quoted), and every rc-cut renderer uses them. Ordinary values render byte-for-byte as before; a hostile one comes out as inert text, which tests pin through a real shell. Generated-by: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GTPsZ5aEE5bUVYqp47Dpvv
…rd could mislead Review findings on the rc-cut tool: - svnpubsub staging now requires a normalised path under /repos/dist/dev/, so dist//release/ and dev/../release/ no longer slip past Golden rule 5. - Step 4 takes each convenience artefact's own outcome (--convenience-outcome NAME=RESULT) instead of copying --self-check, which could record "reproducibility off (identical)". - --self-check has no default; under ci-automated a missing or skipped value is a record gap. - binary_check_commands stays empty when binary checks are off. - dq() single-quotes values containing `!`, which interactive shells history-expand inside double quotes. - --upstream and --project are required on render, so a bare <project> can no longer become a shell redirect. - digest_set is an allowlist of sha512 and sha256. - parse_record keeps the first occurrence and a 128-hex sha512 only. - tag-exists returns null (a blocker) when the read printed anything other than refs/tags/ lines. Generated-by: Claude Opus 5
…elf-check Adversarial-review findings on the rc-cut tool: - svnpubsub staging requires --asf-id instead of emitting a bare `--username <asf-id>`, which the shell reads as a redirect; the local artefact directory placeholder is quoted, and so is the CI run id. - Step 2c refuses when ci_release_workflow is unset instead of emitting a bare `--workflow <ci_release_workflow>`. - repro-archive commands carry a real, quoted framework path (--framework, defaulting to the tool's own checkout) instead of `<framework>/…`. - Convenience build, stage and verification commands use the entry's own version, not the source release version. - The self-check runs when an entry sets its own reproducibility mode, even with both global defaults off. - Self-check builds run in a worktree of the RC tag (rebuild/src) and compare against what they build there, with a cleanup command. - release_dist_backend: atr renders the ATR start / upload / check flow instead of refusing it as unknown. Generated-by: Claude Opus 5
Keep comments and heredocs intact and stop when the rebuild checkout is unavailable. Resolve build placeholders, emit custom archive records only after successful builds, report effective per-artefact check modes, and refuse failed reproducibility outcomes before proposing staging. Generated-by: Codex (GPT-6)
potiuk
force-pushed
the
perf/release-mgmt-1-rc-cut
branch
from
October 16, 2026 06:56
f1ba914 to
3e6d812
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
First of a stack that moves the
release-managementskills' deterministic work into code, the same deep split #1570–#1585 did forpr-management.tools/release-managementpackage. It renders everything arelease-*skill hands the release manager from whatrelease-config loadprints. Each skill is a subpackage the CLI discovers, so later PRs add commands without editing a shared file. It is stdlib-only and runs nothing: nogit,gpg,svn,gh,awsoratrcall, no key, no network.release-rc-cutrenders every block as code. That covers the signed tag, the reproducible source build, convenience artefacts, sign and checksum commands, per-backend staging, the ATR upload, the Step 2b self-check, the Step 2c CI-signed trigger and the Step 4 planning-issue comment with its reproducibility record (parsed from whatrepro-archive buildprinted).Security notes
Two rules the skill only stated in prose are now enforced in code:
dist/release/denylist, had no check anywhere. Asvnpubsubstaging URL underdist/release/is now refused ({"ok": false, "refused": …}, exit 2).The exact-match RC tag check (
rc1must not matchrc10) is atag-existscommand.Also in this PR
release-configblocker text,release-build.mdandreproducibility.mdall said "Step 2f". Inrelease-preparethat step composes the PR; the archive review is 2e.test(agent-isolation), a separate commit.test_signing_in_flight_matches_the_whole_process_namefailed whenever the workspace pytest hook ran from a commit made under the gpg-touch overlay'swrap: the inheritedMAGPIE_GPG_TOUCH_WRAPPED_SIGNERmakes the script report a signature in flight. The test helper now drops it. Reproduced before the fix, passing after.Type of change
tools/release-management)Test plan
prek run --all-filespassestools/release-management: pytest (25) / ruff / mypy. This includes an integration test that renders from a realrelease-config load, so a renamed field on either side fails.step-2-tag-build-sign,step-2b-reproducibilityandstep-3-stagingcases 1–2 (9 cases) are now pytest cases named after each former case.release-rc-cutevals after the change: 7/7. That is step-0 6/6, plus the step-3 injection case, now given the real render output. The baseline before the change was 16/16.Notes for reviewers
Was generative AI tooling used to co-author this PR?
Generated-by:.🤖 Generated with Claude Code
https://claude.ai/code/session_01GTPsZ5aEE5bUVYqp47Dpvv