You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Make Mergecraft's publisher survive a moving base and keep PR text receipts current #286
The arch-pkgs resurrection orchestrator reported two failures on 2026-09-29 (routed through #256):
Creation under a moving base. The base branch moved between preflight and create_reviewable_pr.py. The helper created the draft PR, then exited with "created PR does not have the exact nonce-tagged transport state". Recovery through a text update leaves no creation receipt, so readiness has to fall back to the numbered manifest.
Stale text after pushes. After later pushes, the PR body's change navigation went stale, and an unreceipted body edit went unnoticed until the next text update.
Scope
plugins/mergecraft/skills/publishing-reviewable-prs/: the create and update helpers and the audit. Decide whether a created but unconfirmed PR can be adopted with a creation receipt, and how the audit detects stale navigation and unreceipted edits.
Sequencing
Under decision 1 on #256, a fix that touches files pinned by the Mergecraft relation evidence lands after #210 and joins the shared post-reset refresh with #194, #195, and #182, which also change publishing-reviewable-prs/SKILL.md. This ticket is blocked by #210.
Done when
Both failure paths have regression tests, the publisher recovers the first case with a creation receipt, the audit flags the second, and the Mergecraft validators pass.
It could not resume: the nonce is random, and a second run refuses because an open PR already exists for the branch.
Recovery was a body-only update_reviewable_pr.py text, with a manifest bound to base 9c4c5b2, installing the body the template would have rendered. The merge base, and so the Diff numbers, were unchanged.
Result: the first receipt is a text-update receipt (sequence 1, canonical, not-required), and there is no creation receipt. Readiness must now use the numbered manifest; the token manifest can't be used.
Its latest receipt was sequence 14, at head 5e0ae2e. The head had since moved 13 commits, to fe43f42.
The body's change navigation still described 5e0ae2e: 10 files and IMPL +5108, where the real figures were 13 files and IMPL +5934.
The body had also been edited at 2026-09-26T09:42:34Z with no receipt in the canonical store.
The pre-update audit returned drift ("latest receipt belongs to an older PR identity epoch").
Nothing flagged the stale navigation until a later bullet-only text update tried to publish. The validator then failed all four Diff checks, and the update had to widen to regenerate the navigation. That was receipt 15.
Related ergonomics. Two delegates first ran the publisher helpers from the wrong directory. They failed at validation before any write, because the helpers validate against the current directory's repository, which must be the checkout at the PR head.
Activity
nisavid commentedon Sep 29, 2026
Evidence from nisavid/arch-pkgs, 2026-09-26 and 27.
3a. Creation while the base moved. The PR is nisavid/arch-pkgs#115.
origin/mainat7aeab8b. Beforecreate_reviewable_pr.pyfinished,mainmoved to9c4c5b2: docs(utilyze): point the READMEs at the utilyze lane issue (#84) arch-pkgs#111 squash-merged at 2026-09-27T00:45:17Z, touching onlypackages/utilyze.created PR does not have the exact nonce-tagged transport state. It neither retried nor rolled back.update_reviewable_pr.py text, with a manifest bound to base9c4c5b2, installing the body the template would have rendered. The merge base, and so the Diff numbers, were unchanged.not-required), and there is no creation receipt. Readiness must now use the numbered manifest; the token manifest can't be used.3b. Stale PR text and an unreceipted edit. The PR is nisavid/arch-pkgs#94.
5e0ae2e. The head had since moved 13 commits, tofe43f42.5e0ae2e: 10 files and IMPL +5108, where the real figures were 13 files and IMPL +5934.drift("latest receipt belongs to an older PR identity epoch").Related ergonomics. Two delegates first ran the publisher helpers from the wrong directory. They failed at validation before any write, because the helpers validate against the current directory's repository, which must be the checkout at the PR head.