Repository navigation
Deploys on merge: a merge that deploys is a release - #105
Conversation
… is a release and needs release-production's authority Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T5z3hZtpGaQUGsTaAMQrAg
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T5z3hZtpGaQUGsTaAMQrAg
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T5z3hZtpGaQUGsTaAMQrAg
…corrected, not lapsed, naming this target); the release act carries it, not the merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T5z3hZtpGaQUGsTaAMQrAg
Adversarial review (upstream loop): #105 CHANGES, #106 CHANGESA fresh reviewer reproduced each blocker on Node 18.20.4, in a throwaway project with forge git and a local bare origin. Line numbers are in devteam.mjs on Blockers
Should-fix
Nits
What held
|
…e ticket's repo, and the review's #105 findings - Resolved against main's multi-repo merge: the release check reads the ticket's repo's release setting and diff (R), and the release act carries repo like the merge act. - A release decision is carried out once per target: merge --decision refuses one an act already carries for that ticket or chore (review should-fix 3). - settings release is validated: paths without "on": "merge", unknown keys, or other shapes fail validate, and merge fails closed on them (nit 10). - With release.paths, root build manifests (Procfile, package.json and lockfiles, Dockerfile, ...) deploy whatever paths says (nit 10). - No plan-undefined target when merging a ticket or chore (nit 10). - A release-production decision is never cited by the merge act, even when nothing deploys. - Tests: a hand-written decision reusing the release answer is refused at merge --decision (for another target, and a second time); a manifest outside paths deploys; a decision carried out twice; paths without on: merge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream loop: #105 brought up to main, review findings addressedI merged main in twice: first up to v0.20.1+, then through #126. The second merge was clean. In the first, I resolved the two conflicts in The release check after the mergeMain's
Before this change, a ticket in another repo was diffed in home, so the release check passed without checking anything. Findings
What held (re-checked after the merge)
Tests
🤖 Generated with Claude Code |
…rmed release fails closed only when it could mean merge; the diff fails closed
- A release-production decision under answer or default authority releases only the targets its
question named (--ticket, or --approves for a batch); a question naming neither releases nothing.
- A malformed release that could mean deploy-on-merge fails validate and merge; any other is a
warning, read as not deploying on merge ({"branch": "production"} is unaffected).
- More build files deploy whatever paths says (.npmrc, .yarnrc.yml, .yarn/, Aptfile, .slugignore,
bin/pre_compile, bin/post_compile, .profile.d/, Dockerfile.*, next.config.*, tsconfig.json,
vite.config.*, ...); the owner lists the rest in paths.
- The release check reads the diff itself: a failed diff fails closed instead of reading as no files.
- With paths, the kit's line (and so project/log) never deploys.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream loop: second review of #105 (at 6f43598) addressed in
|
|
Merging (upstream loop).
|
…sions runs in line forge git now asserts release-production is below rung 3, which the decisions step's correction leaves: a later step reads it, so decisions no longer forks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TL;DR
releasetakes"merge": production deploys whenever main changes (Heroku's automatic deploys, a deploy-on-push workflow). Also{ "on": "merge", "paths": ["app/**"] }when only some paths deploy, and{ "branch": <main_branch> }.release-production's authority: the class on rung 3, or arelease-productiondecision naming that ticket (decide --class release-production --refs <ticket> [--approved <qid>], thenmerge <ticket> --decision <d-id>).release-productionact carrying it.Why
Merging and releasing were separate decisions. On an app that deploys on merge, every merge skipped your trust setting for
release-production. This closes that gap for every ticket.Docs
Tests
The forge-git merge test sets
release: "merge":merge --decisionlands itThe suite passes, except one tmux-session test that also fails on main in this environment.
Generated by Claude Code