Repository navigation
Conversation
…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
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
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