Cleanup pass on the design doc per Ship's Msg 3 review. Two changes, no architecture shifts:
1. Merge commit message updated to locked verbose form:
"Merge external GitHub PR #{N}: {branch_slug}"
N derived from gh-pr-{N}/ regex; branch_slug = post-prefix portion. Embeds
the GitHub PR number explicitly so `git log --merges --grep "#90"` surfaces
the merge from PR number alone. Drops the v2 "{branch}"-only form.
2. "Open questions for Ship" section collapsed to "Locked decisions" —
the three Phase 2 items (backout flag, rebase-after-fix scope, merge commit
message format) were locked in Ship's reply on Msg 2 but the v2 doc still
framed them as open. Now restated as decisions so Ganymede doesn't re-debate
resolved items at line-level review.
Diffs reviewable against v2 (commit fa6cceb).
Phase 1 simplified per Ship's architectural review:
- Drop the one-shot backfill script — the self-healing sweep IS the backfill.
First cron tick post-deploy picks up FwazB PR 4066 automatically via the
same SELECT/UPDATE path that handles all future races.
- Specify sweep placement as Step 0: runs as the very first action after
initial Forgejo+GitHub fetch, ahead of branch-mirror loop AND auto-create-PR
block (line ~250). Same-cycle convergence on fresh-cycle races.
- Replace `.fork-pr-map` design with branch-name-encoded sweep — branch name
carries the GitHub PR number deterministically (gh-pr-{N}/...), no API
call required, no map file, no flag plumbing.
Phase 1 final scope: ~10-line sweep block in sync-mirror.sh, idempotent,
zero-cost when clean.
Phase 2 architecture unchanged. Ship's open questions for Phase 2 (backout
flag, rebase-after-fix scope, merge commit message format) remain open.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>