制:為什么 SHA 一過期就拒絕合并?)
pstack 合并安全機(jī)制為什么 SHA 一過期就拒絕合并【免費(fèi)下載鏈接】pstack-claudeClaude Code, Codex, Copilot, Pi, OpenCode, Gemini, and Prime Agent versions of Potetos pstack. Rigorous agent workflows with Cursor primitives translated for other harnesses.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ps/pstack-claudepstack 是一個(gè)把 Poteto 的嚴(yán)謹(jǐn) Agent 工作流移植到 Claude Code、Codex、GitHub Copilot、Pi 等平臺(tái)的技能棧。它的 Shipping發(fā)貨工作流內(nèi)置了一套合并安全機(jī)制PR 的 SHA 一旦發(fā)生任何變化合并請(qǐng)求就會(huì)被直接拒絕。這篇文章用通俗語言講清楚——為什么一個(gè) 40 位十六進(jìn)制字符串的變化值得讓整條合并流水線停下來。一、為什么 SHA 過期就拒絕合并先理解一個(gè)核心事實(shí)SHA 是 PR 內(nèi)容的指紋。每一次 commit 都會(huì)生成一個(gè)唯一的 SHA也叫 OID。只要 PR 里改了一個(gè)字節(jié)——哪怕只是注釋——head 分支的 SHA 就會(huì)變。pstack 把這一點(diǎn)當(dāng)作整個(gè)安全機(jī)制的地基審批、CI 通過、獨(dú)立驗(yàn)證結(jié)論全部只對(duì)某一個(gè)具體 SHA負(fù)責(zé)而不是對(duì)某個(gè)分支上的某個(gè)提交負(fù)責(zé)。這就回答了你看到的現(xiàn)象如果驗(yàn)證完成之后有人又 push 了一個(gè)新 commit、或者 base 分支前進(jìn)了舊 SHA 就過期了此時(shí)再執(zhí)行合并就可能是把一個(gè)從未被驗(yàn)證過的版本放進(jìn)主干。? 所以 pstack 的策略是SHA 變了一切結(jié)論作廢寧可拒絕合并也不合并一個(gè)未經(jīng)驗(yàn)證的修訂版本。官方文檔 docs/reference.md 描述了各運(yùn)行時(shí)的安裝與配置而合并安全的完整規(guī)則寫在 merge-safety.md。二、LandingRevision唯一確定合的是什么的五元組pstack 用一個(gè)叫LandingRevision的結(jié)構(gòu)來鎖定合并對(duì)象定義見 landing.ts字段含義倉庫 PR 編號(hào)哪個(gè) PRheadRefOidhead 分支的 SHA你的代碼在哪一版baseRefName目標(biāo)分支名合到哪里baseRefOid目標(biāo)分支的 SHA目標(biāo)在哪一版注意base 分支的 SHA 也在保護(hù)范圍內(nèi)。很多人只盯著 head但 base 前進(jìn)同樣會(huì)讓驗(yàn)證失效——同樣的 patch 落到不同的主干上沖突風(fēng)險(xiǎn)和行為都可能不同。比較邏輯很簡單任何一項(xiàng)對(duì)不上整份記錄就判定為changed見 sameLandingRevisionchanged→ 狀態(tài)變了拒絕并停止not-open→ PR 已關(guān)閉停止still-pending→ 待合并機(jī)制仍在不能繞過unavailable→ 讀不到狀態(tài)絕不等于沒有請(qǐng)求必須人工核實(shí)這條規(guī)則值得劃重點(diǎn)缺失的字段和不受支持的 API永遠(yuǎn)不意味著請(qǐng)求不存在。寧可停下來對(duì)賬也不能為了讓檢查通過而悄悄替換已保存的記錄。三、合并時(shí)如何用服務(wù)層 head 條件把關(guān)pstack 在 Shipping 工作流 第 7 步要求合并必須帶上服務(wù)強(qiáng)制的 head 條件而不是合并前最后看一眼gh pr merge pr --repo owner/repo --squash --match-head-commit verified-head三種等價(jià)寫法任選其一但必須攜帶完全驗(yàn)證過的那個(gè) SHAgh的--match-head-commitGraphQLmergePullRequest的expectedHeadOidREST 合并端點(diǎn)的sha參數(shù)為什么最后看一眼再合并不夠因?yàn)榭春秃现g有時(shí)間差。在這個(gè)窗口里 PR 完全可能被改寫。帶上 head 條件后GitHub 會(huì)在執(zhí)行合并的瞬間做原子校驗(yàn)SHA 對(duì)不上直接返回HTTP 409拒絕。最后那一下讀取的競態(tài)窗口被服務(wù)端替你關(guān)掉了。?? 但要知道邊界head 條件不能原子地保護(hù) base 分支。所以對(duì) base 的觀察要在合并前后各做一次并協(xié)調(diào) retarget 權(quán)限而不能宣稱目標(biāo)完全受保護(hù)。四、cancel-pending過期 SHA 的標(biāo)準(zhǔn)取消動(dòng)作改寫分支或改 base 之前必須先用ship-pr取消所有掛起的合并機(jī)制auto-merge 和 merge queue 算兩套獨(dú)立機(jī)制。它位于 watch-pr 腳本目錄ship-pr inspect --repo $owner/$repo --pr $pr $record_file ship-pr cancel-pending --record $record_file流程是讀出當(dāng)前完整 LandingRevision → 保存記錄 → 取消時(shí)重新讀取現(xiàn)場 → 與保存記錄逐項(xiàng)比對(duì) → 只有比對(duì)一致才真正取消。這一步正是SHA 過期就拒絕的具體體現(xiàn)取消操作本身也校驗(yàn)修訂版本防止你取消的其實(shí)是別人剛改過的 PR。只有kind: cancelled加退出碼 0才允許后續(xù)的改寫操作其余結(jié)果一律停止、對(duì)賬。五、它不是嘴上說說真實(shí)倉庫的拒絕測試pstack 有一支實(shí)彈驗(yàn)證腳本會(huì)在一次性私有倉庫里完整演練這套機(jī)制絕不在生產(chǎn) PR 上測試服務(wù)行為驗(yàn)證通過某個(gè) head SHA然后向分支再 push 一個(gè)新 commitSHA 過期用舊 SHA 執(zhí)行g(shù)h pr merge --match-head-commit→ 被拒絕 ?直接調(diào) REST 端點(diǎn)帶舊sha→ 收到HTTP 409?確認(rèn) PR 依然是OPEN沒有被誤合 ?換新的正確 SHA 再合并 → 成功且 merge commit 確實(shí)進(jìn)了目標(biāo)分支 ?對(duì)應(yīng)的行為測試見 integrity.test.ts其中專門覆蓋了兩個(gè)刁鉆場景head 變了即使之前的 CI 和檢查全綠也要拒絕只是 base 被 retarget 了head 和檢查都沒變同樣拒絕。配合 babysit 工作流 的未知狀態(tài)絕不允許合并原則形成閉環(huán)狀態(tài)不明時(shí)停止比合并更安全。六、快速上手pstack 的安全合并四步法 想在項(xiàng)目里獲得這套保護(hù)記住這四步即可安裝插件Claude Code 里執(zhí)行/plugin marketplace add加/plugin install pstackpstack-claude其他運(yùn)行時(shí)安裝方式見 README用 babysit 把 PR 推到 merge-ready拿到帶 SHA 的驗(yàn)證結(jié)論合并帶 head 條件--match-head-commit verified-headSHA 一變立即失敗改寫前 cancel-pending任何 rebase、retarget 之前先取消掛起機(jī)制只認(rèn)cancelled結(jié)果。寫在最后SHA 過期就拒絕合并看起來嚴(yán)苛本質(zhì)是把驗(yàn)證結(jié)論的可信邊界釘死在一個(gè)不可變的指紋上。分支會(huì)漂移、CI 會(huì)重跑、審批會(huì)過期——但 SHA 不會(huì)服務(wù)端的 head 條件把最后時(shí)刻的競態(tài)交給平臺(tái)原子判定而 pstack 的 Shipping 檢查清單 確保 Agent 不會(huì)偷懶跳過其中任何一環(huán)。對(duì)新手來說這套機(jī)制最大的價(jià)值是即使你交給 Agent 的指令很簡單它合并進(jìn)主干的代碼也一定是經(jīng)過驗(yàn)證的那一版?!久赓M(fèi)下載鏈接】pstack-claudeClaude Code, Codex, Copilot, Pi, OpenCode, Gemini, and Prime Agent versions of Potetos pstack. Rigorous agent workflows with Cursor primitives translated for other harnesses.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ps/pstack-claude創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考