@ornexus/neocortex 4.60.60 → 4.60.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/release-source.json +1 -0
  2. package/dist/sbom.cdx.json +150 -47
  3. package/install.ps1 +1 -1
  4. package/install.sh +1 -1
  5. package/package.json +9 -4
  6. package/packages/client/dist/cli.js +52 -2
  7. package/packages/client/dist/commands/invoke.d.ts +1 -0
  8. package/packages/client/dist/commands/invoke.js +80 -73
  9. package/packages/client/dist/commands/legacy-epic-terminal.d.ts +9 -0
  10. package/packages/client/dist/commands/legacy-epic-terminal.js +1 -0
  11. package/packages/client/dist/commands/legacy-story-pr.d.ts +2 -1
  12. package/packages/client/dist/commands/legacy-story-pr.js +1 -1
  13. package/packages/client/dist/commands/mutation-qa-checkpoint.d.ts +39 -0
  14. package/packages/client/dist/commands/mutation-qa-checkpoint.js +5 -0
  15. package/packages/client/dist/commands/mutation-qa-gate.d.ts +35 -0
  16. package/packages/client/dist/commands/mutation-qa-gate.js +1 -0
  17. package/packages/client/dist/commands/mutation-qa-git.d.ts +2 -0
  18. package/packages/client/dist/commands/mutation-qa-git.js +1 -0
  19. package/packages/client/dist/commands/mutation-qa-policy.d.ts +15 -0
  20. package/packages/client/dist/commands/mutation-qa-policy.js +1 -0
  21. package/packages/client/dist/commands/mutation-qa-run.d.ts +14 -0
  22. package/packages/client/dist/commands/mutation-qa-run.js +3 -0
  23. package/packages/client/dist/commands/mutation-qa-verdict.d.ts +21 -0
  24. package/packages/client/dist/commands/mutation-qa-verdict.js +1 -0
  25. package/packages/client/dist/commands/mutation-qa.d.ts +22 -0
  26. package/packages/client/dist/commands/mutation-qa.js +1 -0
  27. package/packages/client/dist/commands/property-qa.d.ts +1 -0
  28. package/packages/client/dist/commands/property-qa.js +1 -0
  29. package/packages/client/dist/commands/qa-scan-capture.d.ts +52 -0
  30. package/packages/client/dist/commands/qa-scan-capture.js +11 -0
  31. package/packages/client/dist/commands/qa-scan-discovery.d.ts +36 -0
  32. package/packages/client/dist/commands/qa-scan-discovery.js +3 -0
  33. package/packages/client/dist/commands/qa-scan-review.d.ts +119 -0
  34. package/packages/client/dist/commands/qa-scan-review.js +5 -0
  35. package/packages/client/dist/commands/refactor-characterization.d.ts +47 -0
  36. package/packages/client/dist/commands/refactor-characterization.js +12 -0
  37. package/packages/client/dist/commands/refactor-commit.d.ts +45 -0
  38. package/packages/client/dist/commands/refactor-commit.js +13 -0
  39. package/packages/client/dist/commands/refactor-review.d.ts +37 -0
  40. package/packages/client/dist/commands/refactor-review.js +5 -0
  41. package/packages/client/dist/commands/refactor-root.d.ts +85 -0
  42. package/packages/client/dist/commands/refactor-root.js +7 -0
  43. package/packages/client/dist/generated/command-registry.generated.d.ts +9 -9
  44. package/packages/client/dist/generated/command-registry.generated.js +1 -1
  45. package/packages/client/dist/generated/public-projections.generated.d.ts +20 -20
  46. package/packages/client/dist/generated/public-projections.generated.js +1 -1
  47. package/packages/client/dist/git/legacy-story-pr.d.ts +137 -6
  48. package/packages/client/dist/git/legacy-story-pr.js +51 -43
  49. package/packages/client/dist/license/license-client.js +1 -1
  50. package/packages/client/dist/private-execution/delivery.d.ts +49 -4
  51. package/packages/client/dist/private-execution/delivery.js +4 -2
  52. package/packages/client/dist/private-execution/isolated-admission.d.ts +7 -0
  53. package/packages/client/dist/private-execution/isolated-admission.js +10 -10
  54. package/packages/client/dist/private-execution/private-report-store.d.ts +17 -0
  55. package/packages/client/dist/private-execution/private-report-store.js +1 -0
  56. package/packages/client/dist/private-execution/property-test-candidate.d.ts +14 -0
  57. package/packages/client/dist/private-execution/property-test-candidate.js +1 -0
  58. package/packages/client/dist/private-execution/property-test-choices.d.ts +15 -0
  59. package/packages/client/dist/private-execution/property-test-choices.js +3 -0
  60. package/packages/client/dist/private-execution/property-test-plan.d.ts +65 -0
  61. package/packages/client/dist/private-execution/property-test-plan.js +7 -0
  62. package/packages/client/dist/private-execution/property-test-review.d.ts +58 -0
  63. package/packages/client/dist/private-execution/property-test-review.js +4 -0
  64. package/packages/client/dist/private-execution/property-test-runtime.d.ts +18 -0
  65. package/packages/client/dist/private-execution/property-test-runtime.js +9 -0
  66. package/packages/client/dist/private-execution/property-test-source.d.ts +8 -0
  67. package/packages/client/dist/private-execution/property-test-source.js +1 -0
  68. package/packages/client/dist/state/project-state-snapshot.js +1 -1
  69. package/packages/shared/dist/generated/command-registry.generated.js +9 -9
  70. package/packages/shared/dist/generated/invocation-schema.generated.js +2 -2
  71. package/packages/shared/dist/generated/public-projections.generated.js +18 -18
  72. package/packages/shared/dist/invocation/index.d.ts +1 -1
  73. package/packages/shared/dist/invocation/index.js +13 -0
  74. package/packages/shared/dist/merge-readiness/c12-registry-projection.js +111 -0
  75. package/packages/shared/dist/merge-readiness/c12-remote-observation.js +60 -0
  76. package/targets-stubs/antigravity/gemini.md +1 -1
  77. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  78. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  79. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  80. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  81. package/targets-stubs/claude-code/neocortex.md +2 -2
  82. package/targets-stubs/codex/AGENTS.md +1 -1
  83. package/targets-stubs/cursor/agent.md +2 -2
  84. package/targets-stubs/gemini-cli/agent.md +2 -2
  85. package/targets-stubs/opencode/neocortex-root.md +1 -1
  86. package/targets-stubs/vscode/neocortex.agent.md +2 -2
@@ -1,32 +1,33 @@
1
- import{execFileSync as K}from"node:child_process";import{createHash as Pe,randomBytes as U}from"node:crypto";import{closeSync as rt,constants as Re,existsSync as D,fstatSync as at,lstatSync as Z,mkdirSync as st,mkdtempSync as ot,openSync as nt,readFileSync as it,realpathSync as E,rmdirSync as ct,unlinkSync as yt,writeFileSync as dt}from"node:fs";import{tmpdir as lt}from"node:os";import{isAbsolute as Ce,join as N}from"node:path";import{parseDocument as X}from"yaml";import{summarizeC12RemoteRollup as qe}from"../../../shared/dist/merge-readiness/c12-remote-observation.js";import{resolveBranchUnit as je}from"../../../shared/dist/yoloop/branch-unit.js";import{acquireGitLifecyclePhysicalIntegrationLock as ee,assertGitLifecyclePrivateDirectory as ze,assertGitLifecyclePrivateFile as J,ensureGitLifecyclePrivateChildDirectory as W,gitLifecycleRuntimeDirectory as F,releaseGitLifecyclePhysicalIntegrationLock as te}from"./git-lifecycle-store.js";import{anchoredAtomicWriteFile as z,anchoredCompareAndSwapFile as G}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_CREATE_PR_STEP_ID as Q,GIT_LIFECYCLE_MERGE_PR_STEP_ID as ge,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as Y,GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as T,GIT_LIFECYCLE_SYNC_MAIN_STEP_ID as V,GIT_LIFECYCLE_UPDATE_PROJECT_MEMORY_STEP_ID as ye}from"./git-lifecycle-step-ids.js";import{executeP205TransientAuthority as Le,projectP205TransientExecutionEvidence as Ve}from"./git-lifecycle-store.js";import{readCompletedLegacyStoryBranchPlan as ht}from"./legacy-story-branch-setup.js";function i(t){return{ok:!1,reasonCode:t}}function m(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function u(t,...r){return K("git",r,{cwd:t,encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:2*1024*1024}).trim()}function w(t,...r){return K("git",r,{cwd:t,encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:2*1024*1024})}function B(t,r){const a=nt(t,Re.O_RDONLY|(Re.O_NOFOLLOW??0));try{const e=at(a);if(!e.isFile()||e.size>r)throw new Error("legacy-story-pr-file-unsafe");return it(a,"utf8")}finally{rt(a)}}function R(t,r){const a=u(t,"ls-remote","--heads","origin",`refs/heads/${r}`).split(`
2
- `).filter(Boolean);if(a.length!==1)throw new Error("legacy-story-pr-remote-ref-missing");const e=a[0].match(/^([a-f0-9]{40})\s+refs\/heads\/(.+)$/);if(!e||e[2]!==r)throw new Error("legacy-story-pr-remote-ref-invalid");return e[1]}function re(t){const a=u(t,"config","--get","remote.origin.url").match(/^(?:https:\/\/github\.com\/|git@github\.com:)([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+?)(?:\.git)?$/);if(!a||a[1].includes("..")||a[2].includes(".."))throw new Error("legacy-story-pr-repository-invalid");return`${a[1]}/${a[2]}`}function Ie(t){const r=u(t,"rev-parse","--git-common-dir");return E(Ce(r)?r:N(t,r))}function de(t,r){if(!Array.isArray(r)||r.length>=100)throw new Error("legacy-story-pr-list-incomplete");const a=r.filter(o=>o.headRefName===t.branch);if(a.length>1||a.some(o=>o.state!=="OPEN"||o.baseRefName!==t.baseBranch||o.headRefOid!==t.headSha))throw new Error("legacy-story-pr-provider-conflict");const e=a[0];if(!e)return null;if(!Number.isSafeInteger(e.number)||e.number<=0||e.url.toLowerCase()!==`https://github.com/${t.repository}/pull/${e.number}`.toLowerCase())throw new Error("legacy-story-pr-provider-invalid");return e}async function ft(t,r){const a=await W(await F(t),"legacy-story-pr-intents"),e=`${Pe("sha256").update(r.storyId).digest("hex")}.json`,o=N(a,e),c={schemaVersion:1,kind:"legacy-story-pr-create-attempt",storyId:r.storyId,epicId:r.epicId,repository:r.repository,branch:r.branch,baseBranch:r.baseBranch,headSha:r.headSha};if(D(o)){if(await J(o,a),B(o,4096)!==`${JSON.stringify(c)}
3
- `)throw new Error("legacy-story-pr-attempt-conflict");return!1}return await z(a,e,`${JSON.stringify(c)}
4
- `),await J(o,a),!0}function pt(t){if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-commit-target-invalid");try{const r=E(t.projectRoot);if(E(u(r,"rev-parse","--show-toplevel"))!==r||w(r,"diff","--name-only","-z")!==""||w(r,"ls-files","--others","--exclude-standard","-z")!=="")return i("legacy-story-commit-checkout-invalid");const a=w(r,"diff","--cached","--name-only","-z").split("\0").filter(Boolean);if(a.length===0||new Set(a).size!==a.length||a.some(_=>_.length>1024||_.startsWith("/")||_.includes("\\")||_.includes("\0")||_.split("/").includes("..")||_===".git"||_.startsWith(".git/")))return i("legacy-story-commit-write-set-invalid");if(w(r,"ls-files","-u","-z")!==""||a.some(_=>{const M=w(r,"ls-files","-s","-z","--",_).split("\0").filter(Boolean);return M.length>1||M.some(ce=>{const ue=ce.match(/^(100644|100755) [a-f0-9]{40} 0\t(.+)$/);return!ue||ue[2]!==_})}))return i("legacy-story-commit-index-unsafe");u(r,"diff","--cached","--check");const e=w(r,"show",":.neocortex/state.json"),o=`docs/stories/${t.storyId}.story.md`,c=w(r,"show",`:${o}`);if(B(N(r,".neocortex/state.json"),2*1024*1024)!==e||B(N(r,o),2*1024*1024)!==c)return i("legacy-story-commit-preimage-drift");const h=m(JSON.parse(e)),l=m(h?.stories),y=m(l?.[t.storyId]),s=y?.epic_id,d=typeof s=="string"?m(m(h?.epics)?.[s]):null,n=d?.stories;if(!y||y.id!==t.storyId||typeof s!="string"||!d||d.id!==s||d.branch_mode==="epic"||y.status!=="memory-updated"||y.last_step!==ye||!Array.isArray(y.steps_completed)||!y.steps_completed.includes(ye)||y.steps_completed.includes(T)||!Number.isSafeInteger(y.issue_number)||y.issue_number<=0||!Array.isArray(n)||n.length===0||new Set(n).size!==n.length||!n.includes(t.storyId)||n.some(_=>typeof _!="string"||m(l?.[_])?.epic_id!==s)||Object.entries(l??{}).some(([_,M])=>m(M)?.epic_id===s&&!n.includes(_)))return i("legacy-story-commit-state-invalid");const I=je(d,n.map(_=>({...m(l?.[_]),id:_}))),b=`story/${s}/${t.storyId}`,f=m(h?.config)?.default_branch;if(I.mode!=="story"||y.branch_name!==b||u(r,"branch","--show-current")!==b||typeof f!="string"||f===b||u(r,"check-ref-format","--branch",f)!==f)return i("legacy-story-commit-branch-invalid");const k=m(JSON.parse(w(r,"show","HEAD:.neocortex/state.json"))),g=m(m(k?.stories)?.[t.storyId]),$=Array.isArray(g?.files_to_modify)?g.files_to_modify:null;if(!$||$.length===0||new Set($).size!==$.length||g?.epic_id!==s||JSON.stringify(y.files_to_modify)!==JSON.stringify($)||$.some(_=>typeof _!="string"||_.length>1024||_.startsWith("/")||_.includes("\\")||_.split("/").includes("..")||_===".git"||_.startsWith(".git/"))||!a.every(_=>$.includes(_))||!a.includes(".neocortex/state.json")||!a.includes(o)||!$.includes(".neocortex/state.json")||!$.includes(o))return i("legacy-story-commit-write-set-unauthorized");const A=c.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!A)return i("legacy-story-commit-frontmatter-invalid");const v=X(A[1],{strict:!0,uniqueKeys:!0}),C=m(v.toJS()),S=["stepsCompleted","steps_completed"].filter(_=>v.has(_)),O=["lastStep","last_step"].filter(_=>v.has(_)),j=["branchName","branch_name"].filter(_=>v.has(_)),H=["issueNumber","issue_number"].filter(_=>v.has(_));if(v.errors.length>0||v.get("id")!==t.storyId||(v.get("epic_id")??v.get("epic"))!==s||v.get("status")!=="memory-updated"||v.has("currentStatus")&&v.get("currentStatus")!=="memory-updated"||S.length!==1||O.length!==1||j.length!==1||H.length!==1||JSON.stringify(C?.[S[0]])!==JSON.stringify(y.steps_completed)||C?.[O[0]]!==ye||C?.[j[0]]!==b||C?.[H[0]]!==y.issue_number)return i("legacy-story-commit-frontmatter-invalid");const x=u(r,"rev-parse","HEAD"),q=u(r,"ls-remote","--heads","origin",`refs/heads/${b}`).split(`
5
- `).filter(Boolean),L=R(r,f);return!/^[a-f0-9]{40}$/.test(x)||q.length!==0||u(r,"rev-parse",`refs/remotes/origin/${f}`)!==L?i("legacy-story-commit-remote-drift"):{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c08-commit-plan",storyId:t.storyId,epicId:s,repository:re(r),branch:b,baseBranch:f,headSha:x,remoteHeadSha:null,baseSha:L,indexDigestSha256:p(w(r,"ls-files","-s","-z")),stagedPatchSha256:p(w(r,"diff","--cached","--binary","--full-index")),changedPaths:Object.freeze(a),stateSha256:p(e),storySha256:p(c),stateIndexBlobSha:u(r,"rev-parse",":.neocortex/state.json"),storyIndexBlobSha:u(r,"rev-parse",`:${o}`),physicalCommit:!1,checkpointAccepted:!1,localOnly:!0})}}catch{return i("legacy-story-commit-physical-unavailable")}}function Me(t,r){const a=w(t,"show",r.stateIndexBlobSha),e=w(t,"show",r.storyIndexBlobSha);if(u(t,"cat-file","-t",r.stateIndexBlobSha)!=="blob"||u(t,"cat-file","-t",r.storyIndexBlobSha)!=="blob"||p(a)!==r.stateSha256||p(e)!==r.storySha256)throw new Error("legacy-story-commit-preimage-invalid");const o=m(JSON.parse(a)),c=m(m(o?.stories)?.[r.storyId]);if(!c||c.epic_id!==r.epicId||c.status!=="memory-updated"||c.last_step!==ye||!Array.isArray(c.steps_completed)||!c.steps_completed.includes(ye)||c.steps_completed.includes(T))throw new Error("legacy-story-commit-projection-state-invalid");const h=c.steps_completed;c.status="committed",c.last_step=T,c.steps_completed=[...h,T];const l=`${JSON.stringify(o,null,2)}
6
- `,y=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!y)throw new Error("legacy-story-commit-projection-frontmatter-invalid");const s=X(y[1],{strict:!0,uniqueKeys:!0}),d=m(s.toJS()),n=["stepsCompleted","steps_completed"].filter(f=>s.has(f)),I=["lastStep","last_step"].filter(f=>s.has(f));if(s.errors.length>0||s.get("id")!==r.storyId||(s.get("epic_id")??s.get("epic"))!==r.epicId||s.get("status")!=="memory-updated"||n.length!==1||I.length!==1||JSON.stringify(d?.[n[0]])!==JSON.stringify(h)||d?.[I[0]]!==ye)throw new Error("legacy-story-commit-projection-frontmatter-invalid");s.set("status","committed"),s.has("currentStatus")&&s.set("currentStatus","committed"),s.set(n[0],c.steps_completed),s.set(I[0],T);const b=`---
7
- ${s.toString({lineWidth:0})}---
8
- ${e.slice(y[0].length)}`;return{stateBefore:a,storyBefore:e,stateAfter:l,storyAfter:b}}async function Ke(t,r,a){if(a)return a();const e=await ht({projectRoot:t,storyId:r.storyId});if(!e.ok||e.value.epicId!==r.epicId||e.value.branch!==r.branch||e.value.baseBranch!==r.baseBranch||e.value.worktreePath!==t)return!1;try{u(t,"merge-base","--is-ancestor",e.value.baseHeadSha,r.headSha)}catch{return!1}const o=await W(await F(t),"legacy-story-branch-intents"),c=N(o,`${p(r.storyId)}.c01.accepted.json`);if(!D(c))return!1;await J(c,o);const h=m(JSON.parse(B(c,4096))),l=m(JSON.parse(w(t,"show",r.stateIndexBlobSha))),y=m(m(l?.stories)?.[r.storyId]);return!!h&&h.schemaVersion===1&&h.kind==="legacy-story-c01-acceptance-intent"&&h.storyId===r.storyId&&h.planDigest===p(JSON.stringify(e.value))&&h.repository===r.repository&&h.issueNumber===y?.issue_number}function Be(t,r){return r.changedPaths.filter(a=>a!==".neocortex/state.json"&&a!==`docs/stories/${r.storyId}.story.md`).map(a=>{const e=w(t,"ls-files","-s","-z","--",a).split("\0").filter(Boolean);if(e.length>1)throw new Error("legacy-story-commit-index-invalid");return{path:a,entry:e[0]??null}})}async function qt(t){if(!t.authorize)return i("legacy-story-commit-authorization-required");if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-commit-target-invalid");const r=`legacy-c08-${U(16).toString("hex")}`,a=await ee(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return i(a.reasonCode);try{const e=E(t.projectRoot);if(E(u(e,"rev-parse","--show-toplevel"))!==e)return i("legacy-story-commit-checkout-invalid");const o=await W(await F(e),"legacy-story-pr-intents"),c=p(t.storyId),h=`${c}.c08.commit.json`,l=`${c}.c08.commit.accepted.json`;let y=await me(o,h,64*1024);if(!y){const S=pt(t);if(!S.ok)return S;const O=S.value;if(!await Ke(e,O,t.verifyC01))return i("legacy-story-commit-c01-unverified");const j=Me(e,O),H={schemaVersion:1,kind:"legacy-story-c08-commit-intent",plan:O,stateAfterSha256:p(j.stateAfter),storyAfterSha256:p(j.storyAfter),otherIndex:Be(e,O)};await z(o,h,`${JSON.stringify(H)}
9
- `),await J(N(o,h),o),y=H}const s=m(y.plan);if(y.schemaVersion!==1||y.kind!=="legacy-story-c08-commit-intent"||!s||s.schemaVersion!==1||s.kind!=="legacy-story-c08-commit-plan"||s.storyId!==t.storyId||typeof s.epicId!="string"||s.branch!==`story/${s.epicId}/${t.storyId}`||typeof s.repository!="string"||typeof s.baseBranch!="string"||typeof s.headSha!="string"||!/^[a-f0-9]{40}$/.test(s.headSha)||typeof s.stateIndexBlobSha!="string"||!/^[a-f0-9]{40}$/.test(s.stateIndexBlobSha)||typeof s.storyIndexBlobSha!="string"||!/^[a-f0-9]{40}$/.test(s.storyIndexBlobSha)||!Array.isArray(s.changedPaths)||!s.changedPaths.includes(".neocortex/state.json")||!s.changedPaths.includes(`docs/stories/${t.storyId}.story.md`)||s.remoteHeadSha!==null||s.physicalCommit!==!1||s.checkpointAccepted!==!1||typeof y.stateAfterSha256!="string"||!/^[a-f0-9]{64}$/.test(y.stateAfterSha256)||typeof y.storyAfterSha256!="string"||!/^[a-f0-9]{64}$/.test(y.storyAfterSha256)||!Array.isArray(y.otherIndex)||y.otherIndex.length!==s.changedPaths.length-2||y.otherIndex.some(S=>{const O=m(S);return!O||typeof O.path!="string"||!s.changedPaths.includes(O.path)||O.path===".neocortex/state.json"||O.path===`docs/stories/${t.storyId}.story.md`||O.entry!==null&&(typeof O.entry!="string"||!/^(100644|100755) [a-f0-9]{40} 0\t/.test(O.entry)||!O.entry.endsWith(` ${O.path}`))})||!/^[a-f0-9]{64}$/.test(String(s.indexDigestSha256))||!/^[a-f0-9]{64}$/.test(String(s.stagedPatchSha256))||!/^[a-f0-9]{64}$/.test(String(s.stateSha256))||!/^[a-f0-9]{64}$/.test(String(s.storySha256))||new Set(s.changedPaths).size!==s.changedPaths.length||s.changedPaths.some(S=>typeof S!="string"||S.length>1024||S.startsWith("/")||S.includes("\\")||S.split("/").includes("..")||S===".git"||S.startsWith(".git/"))||re(e)!==s.repository||u(e,"branch","--show-current")!==s.branch)return i("legacy-story-commit-intent-invalid");const d=s;if(!await Ke(e,d,t.verifyC01))return i("legacy-story-commit-c01-unverified");const n=Me(e,d);if(p(n.stateAfter)!==y.stateAfterSha256||p(n.storyAfter)!==y.storyAfterSha256||JSON.stringify(Be(e,d))!==JSON.stringify(y.otherIndex))return i("legacy-story-commit-intent-drift");const I=p(JSON.stringify(y)),f=await me(o,l,4096);if(f&&(f.schemaVersion!==1||f.kind!=="legacy-story-c08-commit-accepted"||f.intentSha256!==I||!/^[a-f0-9]{40}$/.test(f.checkpointHeadSha)||!/^[a-f0-9]{64}$/.test(f.qaSha256)))return i("legacy-story-commit-accepted-invalid");let k=u(e,"rev-parse","HEAD");if(k===d.headSha){if(f)return i("legacy-story-commit-accepted-physical-drift");const S=w(e,"diff","--cached","--name-only","-z").split("\0").filter(Boolean),O=w(e,"diff","--name-only","-z").split("\0").filter(Boolean);if(JSON.stringify(S)!==JSON.stringify(d.changedPaths)||O.some(L=>L!==".neocortex/state.json"&&L!==`docs/stories/${d.storyId}.story.md`)||w(e,"ls-files","--others","--exclude-standard","-z")!==""||u(e,"ls-remote","--heads","origin",`refs/heads/${d.branch}`)!==""||R(e,d.baseBranch)!==d.baseSha)return i("legacy-story-commit-precommit-drift");const j=B(N(e,".neocortex/state.json"),2*1024*1024),H=B(N(e,`docs/stories/${d.storyId}.story.md`),2*1024*1024),x=w(e,"show",":.neocortex/state.json"),q=w(e,"show",`:docs/stories/${d.storyId}.story.md`);if(![n.stateBefore,n.stateAfter].includes(j)||![n.storyBefore,n.storyAfter].includes(H)||![n.stateBefore,n.stateAfter].includes(x)||![n.storyBefore,n.storyAfter].includes(q)||x===n.stateAfter&&j!==n.stateAfter||q===n.storyAfter&&H!==n.storyAfter)return i("legacy-story-commit-preimage-drift");if(j===n.stateBefore&&(await G(N(e,".neocortex"),"state.json",n.stateAfter,p(n.stateBefore)),await t.afterStateWrite?.()),H===n.storyBefore&&await G(N(e,"docs/stories"),`${d.storyId}.story.md`,n.storyAfter,p(n.storyBefore)),B(N(e,".neocortex/state.json"),2*1024*1024)!==n.stateAfter||B(N(e,`docs/stories/${d.storyId}.story.md`),2*1024*1024)!==n.storyAfter)return i("legacy-story-commit-projection-drift");if(u(e,"add","--",".neocortex/state.json",`docs/stories/${d.storyId}.story.md`),u(e,"diff","--cached","--check"),w(e,"diff","--name-only","-z")!==""||w(e,"ls-files","--others","--exclude-standard","-z")!==""||JSON.stringify(Be(e,d))!==JSON.stringify(y.otherIndex)||p(w(e,"show",":.neocortex/state.json"))!==y.stateAfterSha256||p(w(e,"show",`:docs/stories/${d.storyId}.story.md`))!==y.storyAfterSha256)return i("legacy-story-commit-index-drift");u(e,"commit","-m",`chore(story): checkpoint ${d.storyId} C08`,"-m",`Neocortex-Legacy-Commit: ${d.storyId}`),k=u(e,"rev-parse","HEAD"),await t.afterCommit?.()}const g=u(e,"rev-list","--parents","-n","1",k).split(" "),$=w(e,"diff-tree","--no-commit-id","--name-only","-r","-z",k).split("\0").filter(Boolean);if(JSON.stringify(g)!==JSON.stringify([k,d.headSha])||JSON.stringify($)!==JSON.stringify(d.changedPaths)||y.otherIndex.some(({path:S,entry:O})=>{const j=w(e,"ls-tree","-z",k,"--",S).split("\0").filter(Boolean);return O===null?j.length!==0:j.length!==1||j[0]!==O.replace(/^(100644|100755) ([a-f0-9]{40}) 0\t/,"$1 blob $2 ")})||p(w(e,"show",`${k}:.neocortex/state.json`))!==y.stateAfterSha256||p(w(e,"show",`${k}:docs/stories/${d.storyId}.story.md`))!==y.storyAfterSha256||!w(e,"log","-1","--format=%B",k).split(`
10
- `).map(S=>S.trim()).includes(`Neocortex-Legacy-Commit: ${d.storyId}`)||w(e,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-commit-checkpoint-invalid");const A=u(e,"ls-remote","--heads","origin",`refs/heads/${d.branch}`);if(A!==""&&A!==`${k} refs/heads/${d.branch}`)return i("legacy-story-commit-remote-drift");let v=f?.qaSha256;if(!v){try{v=t.verifyQa?await t.verifyQa(k):await(async()=>{const S=await Le(e,{headSha:k,graphRevision:p(`legacy-story-c08\0${I}`)}),O=Ve(S);if(!O||O.executionHeadSha!==k)throw new Error("qa-invalid");return O.executionEvidenceDigest})()}catch{return i("legacy-story-commit-qa-failed")}if(!/^[a-f0-9]{64}$/.test(v))return i("legacy-story-commit-qa-failed")}if(u(e,"rev-parse","HEAD")!==k||w(e,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-commit-final-drift");if(A===""&&u(e,"push","--porcelain","origin",`${k}:refs/heads/${d.branch}`),u(e,"ls-remote","--heads","origin",`refs/heads/${d.branch}`)!==`${k} refs/heads/${d.branch}`)return i("legacy-story-commit-push-unverified");await t.afterPush?.();const C={schemaVersion:1,kind:"legacy-story-c08-commit-accepted",intentSha256:I,checkpointHeadSha:k,qaSha256:v};return f&&JSON.stringify(f)!==JSON.stringify(C)?i("legacy-story-commit-accepted-conflict"):(f||(await z(o,l,`${JSON.stringify(C)}
11
- `),await J(N(o,l),o)),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c08-commit-accepted",storyId:d.storyId,epicId:d.epicId,branch:d.branch,checkpointHeadSha:k,qaSha256:v,reused:!!f,physicalCommit:!0,checkpointAccepted:!0,publicSafe:!0})})}catch(e){const o=e instanceof Error?e.message:"";return i(o.startsWith("legacy-story-commit-")?o:"legacy-story-commit-effect-uncertain")}finally{await te(a.path,a.owner).catch(()=>{})}}function ut(t){if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-sync-target-invalid");try{const r=E(t.projectRoot);if(E(u(r,"rev-parse","--show-toplevel"))!==r||w(r,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-sync-checkout-invalid");const a=w(r,"show","HEAD:.neocortex/state.json"),e=`docs/stories/${t.storyId}.story.md`,o=w(r,"show",`HEAD:${e}`);if(B(N(r,".neocortex/state.json"),2*1024*1024)!==a||B(N(r,e),2*1024*1024)!==o)return i("legacy-story-sync-committed-content-drift");const c=m(JSON.parse(a)),h=m(c?.stories),l=m(c?.epics),y=m(h?.[t.storyId]),s=y?.epic_id,d=typeof s=="string"?m(l?.[s]):null;if(!y||y.id!==t.storyId||typeof s!="string"||!d||d.id!==s||d.branch_mode==="epic"||y.status!=="committed"||y.last_step!==T||!Array.isArray(y.steps_completed)||!y.steps_completed.includes(T)||y.steps_completed.includes(V)||!Number.isSafeInteger(y.issue_number)||y.issue_number<=0)return i("legacy-story-sync-state-invalid");const n=Array.isArray(d.stories)?d.stories:null;if(!n||n.length===0||new Set(n).size!==n.length||!n.includes(t.storyId)||n.some(x=>typeof x!="string"||m(h?.[x])?.epic_id!==s)||Object.entries(h??{}).some(([x,q])=>m(q)?.epic_id===s&&!n.includes(x)))return i("legacy-story-sync-topology-invalid");const I=je(d,n.map(x=>({...m(h?.[x]),id:x}))),b=`story/${s}/${t.storyId}`,k=m(c?.config)?.default_branch;if(I.mode!=="story"||y.branch_name!==b||u(r,"branch","--show-current")!==b||typeof k!="string"||k===b||u(r,"check-ref-format","--branch",k)!==k)return i("legacy-story-sync-branch-invalid");const g=o.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!g)return i("legacy-story-sync-frontmatter-invalid");const $=X(g[1],{strict:!0,uniqueKeys:!0}),A=m($.toJS()),v=["stepsCompleted","steps_completed"].filter(x=>$.has(x)),C=["lastStep","last_step"].filter(x=>$.has(x)),S=["branchName","branch_name"].filter(x=>$.has(x));if($.errors.length>0||$.get("id")!==t.storyId||($.get("epic_id")??$.get("epic"))!==s||$.get("status")!=="committed"||$.has("currentStatus")&&$.get("currentStatus")!=="committed"||v.length>1||C.length>1||S.length>1||v.length===1&&JSON.stringify(A?.[v[0]])!==JSON.stringify(y.steps_completed)||C.length===1&&A?.[C[0]]!==T||S.length===1&&A?.[S[0]]!==b)return i("legacy-story-sync-frontmatter-invalid");const O=u(r,"rev-parse","HEAD"),j=R(r,k);if(!/^[a-f0-9]{40}$/.test(O)||R(r,b)!==O||u(r,"rev-parse",`refs/remotes/origin/${k}`)!==j)return i("legacy-story-sync-remote-drift");const H=u(r,"merge-base",O,j);return/^[a-f0-9]{40}$/.test(H)?{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c09-sync-plan",storyId:t.storyId,epicId:s,repository:re(r),branch:b,baseBranch:k,headSha:O,baseSha:j,mergeBaseSha:H,stateSha256:p(a),storySha256:p(o),baseAlreadyAncestor:H===j,physicalSync:!1,checkpointAccepted:!1,localOnly:!0})}:i("legacy-story-sync-ancestry-invalid")}catch{return i("legacy-story-sync-physical-unavailable")}}function gt(t,r){const a=B(N(t,".neocortex/state.json"),2097152),e=`docs/stories/${r.storyId}.story.md`,o=B(N(t,e),2*1024*1024),c=w(t,"show",`${r.headSha}:.neocortex/state.json`),h=w(t,"show",`${r.headSha}:${e}`);if(p(c)!==r.stateSha256||p(h)!==r.storySha256||o!==h)throw new Error("legacy-story-sync-preimage-drift");const l=m(JSON.parse(a)),y=m(JSON.parse(c)),s=m(l?.stories),d=m(m(y?.stories)?.[r.storyId]),n=m(s?.[r.storyId]),I=m(m(l?.epics)?.[r.epicId]),b=I?.stories;if(!n||!d||JSON.stringify(n)!==JSON.stringify(d)||n.status!=="committed"||n.last_step!==T||n.branch_name!==r.branch||!Array.isArray(n.steps_completed)||!n.steps_completed.includes(T)||n.steps_completed.includes(V)||!I||I.id!==r.epicId||I.branch_mode==="epic"||!Array.isArray(b)||!b.includes(r.storyId)||new Set(b).size!==b.length||b.some(S=>typeof S!="string"||m(s?.[S])?.epic_id!==r.epicId)||m(l?.config)?.default_branch!==r.baseBranch)throw new Error("legacy-story-sync-merged-state-invalid");n.status="synced",n.last_step=V,n.steps_completed=[...n.steps_completed,V],n.sync_base_sha=r.baseSha;const f=`${JSON.stringify(l,null,2)}
12
- `,k=o.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!k)throw new Error("legacy-story-sync-frontmatter-invalid");const g=X(k[1],{strict:!0,uniqueKeys:!0}),$=m(g.toJS()),A=["stepsCompleted","steps_completed"].filter(S=>g.has(S)),v=["lastStep","last_step"].filter(S=>g.has(S));if(g.errors.length>0||g.get("id")!==r.storyId||(g.get("epic_id")??g.get("epic"))!==r.epicId||g.get("status")!=="committed"||A.length!==1||v.length!==1||JSON.stringify($?.[A[0]])!==JSON.stringify(d.steps_completed)||$?.[v[0]]!==T)throw new Error("legacy-story-sync-frontmatter-invalid");g.set("status","synced"),g.has("currentStatus")&&g.set("currentStatus","synced"),g.set(A[0],[...d.steps_completed,V]),g.set(v[0],V),g.set("syncBaseSha",r.baseSha);const C=`---
13
- ${g.toString({lineWidth:0})}---
14
- ${o.slice(k[0].length)}`;return{stateBefore:a,stateAfter:f,storyBefore:o,storyAfter:C}}async function me(t,r,a){const e=N(t,r);if(!D(e))return null;await J(e,t);const o=m(JSON.parse(B(e,a)));if(!o)throw new Error("legacy-story-sync-journal-invalid");return o}async function zt(t){if(!t.authorize)return i("legacy-story-sync-authorization-required");if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-sync-target-invalid");const r=`legacy-c09-sync-${U(16).toString("hex")}`,a=await ee(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return i(a.reasonCode);try{const e=E(t.projectRoot);if(E(u(e,"rev-parse","--show-toplevel"))!==e)return i("legacy-story-sync-checkout-invalid");const o=await W(await F(e),"legacy-story-pr-intents"),c=p(t.storyId),h=`${c}.c09.sync.json`,l=`${c}.c09.sync.prepared.json`,y=`${c}.c09.sync.accepted.json`;let s=await me(o,h,8192);if(!s){const _=ut(t);if(!_.ok)return _;const M={schemaVersion:1,kind:"legacy-story-c09-sync-intent",plan:_.value};await z(o,h,`${JSON.stringify(M)}
15
- `),s=M}const d=m(s.plan);if(s.schemaVersion!==1||s.kind!=="legacy-story-c09-sync-intent"||!d||d.schemaVersion!==1||d.kind!=="legacy-story-c09-sync-plan"||d.storyId!==t.storyId||typeof d.epicId!="string"||d.branch!==`story/${d.epicId}/${t.storyId}`||typeof d.baseBranch!="string"||typeof d.repository!="string"||typeof d.headSha!="string"||!/^[a-f0-9]{40}$/.test(d.headSha)||typeof d.baseSha!="string"||!/^[a-f0-9]{40}$/.test(d.baseSha)||typeof d.stateSha256!="string"||!/^[a-f0-9]{64}$/.test(d.stateSha256)||typeof d.storySha256!="string"||!/^[a-f0-9]{64}$/.test(d.storySha256)||typeof d.baseAlreadyAncestor!="boolean"||d.physicalSync!==!1||d.checkpointAccepted!==!1||u(e,"branch","--show-current")!==d.branch||re(e)!==d.repository)return i("legacy-story-sync-intent-invalid");const n=d,I=p(JSON.stringify(s));let f=await me(o,l,4096);if(f&&(f.schemaVersion!==1||f.kind!=="legacy-story-c09-sync-prepared"||f.intentSha256!==I||!/^[a-f0-9]{40}$/.test(f.treeSha)||!/^[a-f0-9]{64}$/.test(f.stateSha256)||!/^[a-f0-9]{64}$/.test(f.storySha256)))return i("legacy-story-sync-prepared-invalid");const g=await me(o,y,4096);if(g&&(g.schemaVersion!==1||g.kind!=="legacy-story-c09-sync-accepted"||g.intentSha256!==I||!/^[a-f0-9]{40}$/.test(g.checkpointHeadSha)||!/^[a-f0-9]{64}$/.test(g.qaSha256)))return i("legacy-story-sync-accepted-invalid");const $=u(e,"rev-parse","HEAD");if(w(e,"status","--porcelain=v1","-uall")!==""||R(e,n.baseBranch)!==n.baseSha||p(w(e,"show",`${n.headSha}:.neocortex/state.json`))!==n.stateSha256||p(w(e,"show",`${n.headSha}:docs/stories/${n.storyId}.story.md`))!==n.storySha256)return i("legacy-story-sync-physical-drift");const A=N(o,`${c}.c09.sync.checkout`);if(D(A)||K("git",["worktree","add","--detach",A,g?.checkpointHeadSha??n.headSha],{cwd:e,encoding:"utf8",timeout:6e4,stdio:["ignore","pipe","pipe"],maxBuffer:32*1024}),!Z(A).isDirectory()||E(A)!==A||E(u(A,"rev-parse","--show-toplevel"))!==A||Ie(A)!==Ie(e)||u(A,"branch","--show-current")!=="")return i("legacy-story-sync-candidate-invalid");let v=u(A,"rev-parse","HEAD");if(v===n.headSha){if(f)return i("legacy-story-sync-prepared-uncommitted");if($!==n.headSha||R(e,n.branch)!==n.headSha||w(A,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-sync-preparation-drift");if(!n.baseAlreadyAncestor){try{u(A,"merge","--no-ff","--no-commit",n.baseSha)}catch{return i("legacy-story-sync-merge-conflict")}if(w(A,"ls-files","-u")!=="")return i("legacy-story-sync-merge-conflict")}const _=gt(A,n);await G(N(A,".neocortex"),"state.json",_.stateAfter,p(_.stateBefore)),await G(N(A,"docs/stories"),`${n.storyId}.story.md`,_.storyAfter,p(_.storyBefore)),u(A,"add","--",".neocortex/state.json",`docs/stories/${n.storyId}.story.md`),u(A,"diff","--cached","--check"),f={schemaVersion:1,kind:"legacy-story-c09-sync-prepared",intentSha256:I,treeSha:u(A,"write-tree"),stateSha256:p(_.stateAfter),storySha256:p(_.storyAfter)},await z(o,l,`${JSON.stringify(f)}
16
- `),await J(N(o,l),o),u(A,"commit","-m",`chore(story): sync ${n.storyId} with ${n.baseBranch}`,"-m",`Neocortex-Legacy-Sync: ${n.storyId}`),v=u(A,"rev-parse","HEAD"),await t.afterCommit?.()}const C=u(A,"rev-list","--parents","-n","1",v).split(" "),S=n.baseAlreadyAncestor?[v,n.headSha]:[v,n.headSha,n.baseSha],O=m(JSON.parse(w(A,"show",`${v}:.neocortex/state.json`))),j=m(m(O?.stories)?.[n.storyId]),H=w(A,"show",`${v}:docs/stories/${n.storyId}.story.md`);if(!f||u(A,"rev-parse",`${v}^{tree}`)!==f.treeSha||p(w(A,"show",`${v}:.neocortex/state.json`))!==f.stateSha256||p(H)!==f.storySha256||JSON.stringify(C)!==JSON.stringify(S)||!j||j.status!=="synced"||j.last_step!==V||j.sync_base_sha!==n.baseSha||!Array.isArray(j.steps_completed)||!j.steps_completed.includes(V)||!H.startsWith(`---
17
- `)||!w(A,"log","-1","--format=%B",v).split(`
18
- `).map(_=>_.trim()).includes(`Neocortex-Legacy-Sync: ${n.storyId}`)||w(A,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-sync-checkpoint-invalid");if(g&&g.checkpointHeadSha!==v)return i("legacy-story-sync-accepted-conflict");const x=R(e,n.branch);if(![n.headSha,v].includes($)||![n.headSha,v].includes(x)||g&&($!==v||x!==v))return i("legacy-story-sync-remote-drift");let q=g?.qaSha256;if(!q){if(!t.verifyQa)try{Ze(A)}catch{return i("legacy-story-sync-dependencies-failed")}const _={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:n.storyId,epicId:n.epicId,repository:n.repository,branch:n.branch,baseBranch:n.baseBranch,headSha:v,baseSha:n.baseSha,qaAuthority:"root-review-required",localOnly:!0};try{q=await se(_,A,t.verifyQa)}catch{return i("legacy-story-sync-qa-failed")}}if(u(A,"rev-parse","HEAD")!==v||w(A,"status","--porcelain=v1","-uall")!==""||u(e,"rev-parse","HEAD")!==$||w(e,"status","--porcelain=v1","-uall")!==""||R(e,n.baseBranch)!==n.baseSha)return i("legacy-story-sync-final-drift");if(x===n.headSha&&u(e,"push","--porcelain","origin",`${v}:refs/heads/${n.branch}`),R(e,n.branch)!==v)return i("legacy-story-sync-push-unverified");if(await t.afterPush?.(),u(e,"rev-parse","HEAD")===n.headSha&&u(e,"merge","--ff-only",v),u(e,"rev-parse","HEAD")!==v||w(e,"status","--porcelain=v1","-uall")!==""||B(N(e,".neocortex/state.json"),2*1024*1024)!==w(e,"show",`${v}:.neocortex/state.json`)||B(N(e,`docs/stories/${n.storyId}.story.md`),2*1024*1024)!==H)return i("legacy-story-sync-local-readback-invalid");const L={schemaVersion:1,kind:"legacy-story-c09-sync-accepted",intentSha256:I,checkpointHeadSha:v,qaSha256:q};return g&&JSON.stringify(g)!==JSON.stringify(L)?i("legacy-story-sync-accepted-conflict"):(g||(await z(o,y,`${JSON.stringify(L)}
19
- `),await J(N(o,y),o)),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c09-sync-accepted",storyId:n.storyId,epicId:n.epicId,branch:n.branch,baseSha:n.baseSha,checkpointHeadSha:v,qaSha256:q,reused:!!g,physicalSync:!0,checkpointAccepted:!0,publicSafe:!0})})}catch(e){const o=e instanceof Error?e.message:"";return i(o.startsWith("legacy-story-sync-")?o:"legacy-story-sync-effect-uncertain")}finally{await te(a.path,a.owner).catch(()=>{})}}function le(t,r){try{const a=E(t.projectRoot);if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId)||E(u(a,"rev-parse","--show-toplevel"))!==a||!r&&u(a,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-pr-checkout-invalid");const e=w(a,"show","HEAD:.neocortex/state.json");if(!r&&e!==B(N(a,".neocortex/state.json"),2*1024*1024))return i("legacy-story-pr-state-not-committed");const o=m(JSON.parse(e)),c=m(o?.stories),h=m(o?.epics),l=m(c?.[t.storyId]),y=l?.epic_id,s=typeof y=="string"?m(h?.[y]):null;if(!l||l.id!==t.storyId||typeof y!="string"||!s||s.id!==y||s.branch_mode==="epic"||l.status!=="synced"||l.last_step!==V||!Array.isArray(l.steps_completed)||!l.steps_completed.includes(V)||l.steps_completed.includes(Q))return i("legacy-story-pr-state-invalid");const d=Array.isArray(s.stories)?s.stories:null;if(!d||d.length===0||new Set(d).size!==d.length||!d.includes(t.storyId)||d.some(C=>typeof C!="string"||m(c?.[C])?.epic_id!==y)||Object.entries(c??{}).some(([C,S])=>m(S)?.epic_id===y&&!d.includes(C)))return i("legacy-story-pr-topology-invalid");const n=je(s,d.map(C=>({...m(c?.[C]),id:C}))),I=`story/${y}/${t.storyId}`,f=m(o?.config)?.default_branch;if(n.mode!=="story"||l.branch_name!==I||u(a,"branch","--show-current")!==I||typeof f!="string"||f===I||u(a,"check-ref-format","--branch",f)!==f)return i("legacy-story-pr-branch-invalid");const g=u(a,"show",`HEAD:docs/stories/${t.storyId}.story.md`).match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!g)return i("legacy-story-pr-frontmatter-invalid");const $=X(g[1],{strict:!0,uniqueKeys:!0});if($.errors.length>0||$.get("id")!==t.storyId||($.get("epic_id")??$.get("epic"))!==y||$.get("status")!=="synced")return i("legacy-story-pr-frontmatter-invalid");const A=u(a,"rev-parse","HEAD"),v=R(a,f);return!/^[a-f0-9]{40}$/.test(A)||R(a,I)!==A||u(a,"rev-parse",`refs/remotes/origin/${f}`)!==v?i("legacy-story-pr-remote-drift"):(u(a,"merge-base","--is-ancestor",v,A),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-pr-plan",storyId:t.storyId,epicId:y,repository:re(a),branch:I,baseBranch:f,headSha:A,baseSha:v,qaAuthority:"root-review-required",localOnly:!0})})}catch{return i("legacy-story-pr-physical-unavailable")}}function he(t){return le(t,!1)}async function se(t,r,a){const e=a?await a(t):await(async()=>{const o=await Le(r,{headSha:t.headSha,graphRevision:p(`legacy-story-pr-c10\0${JSON.stringify(t)}`)}),c=Ve(o);if(!c||c.executionHeadSha!==t.headSha)throw new Error("legacy-story-pr-checkpoint-qa-invalid");return c.executionEvidenceDigest})();if(!/^[a-f0-9]{64}$/.test(e))throw new Error("legacy-story-pr-checkpoint-qa-invalid");return e}function Ze(t){for(const r of[".","packages/server","portal","admin","landing"]){const a=N(t,r),e=N(a,"package.json"),o=N(a,"package-lock.json");if(!D(a)||!Z(a).isDirectory()||E(a)!==a||!D(e)||!Z(e).isFile()||!D(o)||!Z(o).isFile())throw new Error("legacy-story-pr-candidate-dependencies-missing");try{K("npm",["ci","--include=dev","--no-audit","--no-fund"],{cwd:a,encoding:"utf8",timeout:10*6e4,stdio:["ignore","pipe","pipe"],maxBuffer:1024*1024})}catch{throw new Error("legacy-story-pr-candidate-dependencies-failed")}}}const oe={async list(t,r,a){const e=K("gh",["pr","list","--repo",t,"--state","all","--head",r,"--json","number,state,headRefName,headRefOid,baseRefName,url","--limit","100"],{encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:262144});return JSON.parse(e)},async create(t,r,a,e,o){K("gh",["pr","create","--repo",t,"--head",r,"--base",a,"--title",e,"--body-file",o],{encoding:"utf8",timeout:3e4,stdio:["ignore","pipe","pipe"],maxBuffer:16*1024})}},Se={async view(t,r){const a=K("gh",["pr","view",String(r),"--repo",t,"--json","number,state,headRefName,headRefOid,baseRefName,baseRefOid,isDraft,mergeable,mergeCommit,statusCheckRollup,url"],{encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:262144});return JSON.parse(a)},async merge(t,r,a){K("gh",["api","--method","PUT",`repos/${t}/pulls/${r}/merge`,"-f",`sha=${a}`,"-f","merge_method=merge"],{encoding:"utf8",timeout:3e4,stdio:["ignore","pipe","pipe"],maxBuffer:16*1024})}};async function Lt(t){if(!t.authorize)return i("legacy-story-pr-authorization-required");let r;try{if(Z(t.bodyFile).isSymbolicLink())return i("legacy-story-pr-body-unsafe");const h=B(t.bodyFile,32*1024);if(!h.trim()||h.includes("\0"))return i("legacy-story-pr-body-unsafe");r=h}catch{return i("legacy-story-pr-body-unsafe")}const a=he(t);if(!a.ok)return a;try{await se(a.value,t.projectRoot,t.verifyQa)}catch{return i("legacy-story-pr-checkpoint-qa-failed")}const e=t.provider??oe,o=`legacy-c10-${U(16).toString("hex")}`,c=await ee(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:o,idempotencyKey:o,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!c.ok)return i(c.reasonCode);try{const h=he(t);if(!h.ok||JSON.stringify(h.value)!==JSON.stringify(a.value))return i("legacy-story-pr-pre-effect-race");const l=await e.list(a.value.repository,a.value.branch,a.value.baseBranch);let y=de(a.value,l);const s=y!==null;if(!y){const n=he(t);if(!n.ok||JSON.stringify(n.value)!==JSON.stringify(a.value))return i("legacy-story-pr-pre-effect-race");if(!await ft(t.projectRoot,a.value))return i("legacy-story-pr-create-attempt-unresolved");const I=ot(N(lt(),"legacy-story-pr-body-")),b=N(I,"body.md");try{dt(b,r,{flag:"wx",mode:384}),await e.create(a.value.repository,a.value.branch,a.value.baseBranch,`[YOLO] Story ${a.value.storyId}`,b)}finally{try{yt(b)}catch{}ct(I)}const f=he(t);if(!f.ok||JSON.stringify(f.value)!==JSON.stringify(a.value))return i("legacy-story-pr-post-effect-race");if(y=de(a.value,await e.list(a.value.repository,a.value.branch,a.value.baseBranch)),!y)return i("legacy-story-pr-readback-unavailable")}const d=he(t);return!d.ok||JSON.stringify(d.value)!==JSON.stringify(a.value)?i("legacy-story-pr-post-effect-race"):{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-pr-provider-receipt",storyId:a.value.storyId,epicId:a.value.epicId,repository:a.value.repository,branch:a.value.branch,baseBranch:a.value.baseBranch,headSha:a.value.headSha,number:y.number,url:y.url,reused:s,checkpointAccepted:!1,publicSafe:!0})}}catch(h){const l=h instanceof Error?h.message:"";return i(l.startsWith("legacy-story-pr-")?l:"legacy-story-pr-provider-unavailable")}finally{await te(c.path,c.owner).catch(()=>{})}}function p(t){return Pe("sha256").update(t).digest("hex")}function Ee(t,r,a){const e=w(t,"show","HEAD:.neocortex/state.json"),o=m(JSON.parse(e)),c=m(m(o?.stories)?.[r.storyId]);if(!c||c.status!=="synced"||c.last_step!==V||!Array.isArray(c.steps_completed)||!c.steps_completed.includes(V)||c.steps_completed.includes(Q)||c.pr_number!=null)throw new Error("legacy-story-pr-checkpoint-state-conflict");const h=c.steps_completed;c.status="pr-created",c.last_step=Q,c.steps_completed=[...h,Q],c.pr_number=a;const l=`${JSON.stringify(o,null,2)}
20
- `,y=`docs/stories/${r.storyId}.story.md`,s=w(t,"show",`HEAD:${y}`),d=s.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!d)throw new Error("legacy-story-pr-checkpoint-frontmatter-invalid");const n=X(d[1],{strict:!0,uniqueKeys:!0}),I=m(n.toJS()),b=["stepsCompleted","steps_completed"].filter(A=>n.has(A)),f=["lastStep","last_step"].filter(A=>n.has(A)),k=["prNumber","pr_number"].filter(A=>n.has(A)),g=["branchName","branch_name"].filter(A=>n.has(A));if(n.errors.length>0||n.get("id")!==r.storyId||(n.get("epic_id")??n.get("epic"))!==r.epicId||n.get("status")!=="synced"||b.length>1||f.length>1||k.length>1||g.length>1||n.has("currentStatus")&&n.get("currentStatus")!=="synced"||b.length===1&&(!Array.isArray(I?.[b[0]])||JSON.stringify(I?.[b[0]])!==JSON.stringify(h))||f.length===1&&I?.[f[0]]!==V||g.length===1&&I?.[g[0]]!==r.branch||k.length===1&&I?.[k[0]]!=null)throw new Error("legacy-story-pr-checkpoint-frontmatter-conflict");n.set("status","pr-created"),n.has("currentStatus")&&n.set("currentStatus","pr-created"),n.set(b[0]??"stepsCompleted",[...b.length===1?I[b[0]]:h,Q]),n.set(f[0]??"lastStep",Q),n.set(k[0]??"prNumber",a);const $=`---
21
- ${n.toString({lineWidth:0})}---
22
- ${s.slice(d[0].length)}`;return{stateBefore:e,stateAfter:l,storyBefore:s,storyAfter:$,storyPath:y}}function we(t,r,a){const e=le({projectRoot:t,storyId:r.storyId},!0);if(!e.ok||JSON.stringify(e.value)!==JSON.stringify(r))throw new Error("legacy-story-pr-checkpoint-physical-drift");const o=B(N(t,".neocortex/state.json"),2*1024*1024),c=B(N(t,a.storyPath),2*1024*1024);if(![a.stateBefore,a.stateAfter].includes(o)||![a.storyBefore,a.storyAfter].includes(c))throw new Error("legacy-story-pr-checkpoint-preimage-conflict");if(w(t,"status","--porcelain=v1","-uall").split(`
23
- `).filter(Boolean).some(l=>!l.startsWith(" M ")||![".neocortex/state.json",a.storyPath].includes(l.slice(3))))throw new Error("legacy-story-pr-checkpoint-worktree-dirty");return{stateCurrent:o,storyCurrent:c}}async function fe(t,r){const a=N(t,r);if(!D(a))return null;await J(a,t);const e=B(a,4096),o=m(JSON.parse(e));if(!o||o.schemaVersion!==1||o.kind!=="legacy-story-c10-acceptance-intent"||typeof o.qaDigest!="string"||!/^[a-f0-9]{64}$/.test(o.qaDigest))throw new Error("legacy-story-pr-checkpoint-journal-invalid");return o}async function We(t,r,a){await z(t,r,`${JSON.stringify(a)}
24
- `),await J(N(t,r),t)}async function Vt(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0)return i("legacy-story-pr-checkpoint-number-invalid");const r=he(t);let a=null;if(r.ok)try{a=await se(r.value,t.projectRoot,t.verifyQa)}catch{return i("legacy-story-pr-checkpoint-qa-failed")}const e=`legacy-c10-accept-${U(16).toString("hex")}`,o=await ee(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:e,idempotencyKey:e,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!o.ok)return i(o.reasonCode);try{const c=E(t.projectRoot),h=le(t,!0);if(!h.ok||r.ok&&JSON.stringify(h.value)!==JSON.stringify(r.value))return i("legacy-story-pr-checkpoint-plan-drift");const l=h.value,y=Ee(c,l,t.prNumber),s=we(c,l,y),d=await W(await F(c),"legacy-story-pr-intents"),n=p(l.storyId),I=`${n}.c10.json`,b=`${n}.c10.accepted.json`,f=await fe(d,I),k=await fe(d,b);if(!f&&(!r.ok||!a||s.stateCurrent!==y.stateBefore||s.storyCurrent!==y.storyBefore))return i("legacy-story-pr-checkpoint-unjournaled-drift");if(k&&(!f||JSON.stringify(k)!==JSON.stringify(f)))return i("legacy-story-pr-checkpoint-accepted-conflict");const g=de(l,await(t.provider??oe).list(l.repository,l.branch,l.baseBranch));if(!g||g.number!==t.prNumber)return i("legacy-story-pr-checkpoint-provider-mismatch");const $={schemaVersion:1,kind:"legacy-story-c10-acceptance-intent",storyId:l.storyId,planDigest:p(JSON.stringify(l)),repository:l.repository,number:g.number,url:g.url,qaDigest:f?.qaDigest??a,stateBefore:p(y.stateBefore),stateAfter:p(y.stateAfter),storyBefore:p(y.storyBefore),storyAfter:p(y.storyAfter)};if(f&&JSON.stringify(f)!==JSON.stringify($))return i("legacy-story-pr-checkpoint-journal-conflict");f||await We(d,I,$);const A=we(c,l,y);if(k&&(A.stateCurrent!==y.stateAfter||A.storyCurrent!==y.storyAfter))return i("legacy-story-pr-checkpoint-accepted-physical-mismatch");A.stateCurrent===y.stateBefore&&(await G(N(c,".neocortex"),"state.json",y.stateAfter,$.stateBefore),await t.afterStatePersist?.()),we(c,l,y).storyCurrent===y.storyBefore&&(await G(N(c,"docs/stories"),`${l.storyId}.story.md`,y.storyAfter,$.storyBefore),await t.afterStoryPersist?.());const C=we(c,l,y);return C.stateCurrent!==y.stateAfter||C.storyCurrent!==y.storyAfter?i("legacy-story-pr-checkpoint-post-write-mismatch"):(k||await We(d,b,$),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c10-checkpoint",storyId:l.storyId,epicId:l.epicId,branch:l.branch,repository:l.repository,number:g.number,url:g.url,headSha:l.headSha,stateSha256:$.stateAfter,storySha256:$.storyAfter,reused:!!k,checkpointAccepted:!0,localOnly:!0})})}catch(c){const h=c instanceof Error?c.message:"";return i(h.startsWith("legacy-story-pr-")?h:h.includes("secure-filesystem-cas-conflict")?"legacy-story-pr-checkpoint-write-raced":"legacy-story-pr-checkpoint-failed")}finally{await te(o.path,o.owner).catch(()=>{})}}async function Mt(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0)return i("legacy-story-pr-checkpoint-number-invalid");try{const r=E(t.projectRoot),a=le(t,!0);if(!a.ok)return a;const e=a.value,o=Ee(r,e,t.prNumber),c=we(r,e,o);if(c.stateCurrent!==o.stateAfter||c.storyCurrent!==o.storyAfter)return i("legacy-story-pr-checkpoint-not-accepted");const h=await W(await F(r),"legacy-story-pr-intents"),l=p(e.storyId),y=await fe(h,`${l}.c10.json`),s=await fe(h,`${l}.c10.accepted.json`);if(!y||!s||JSON.stringify(y)!==JSON.stringify(s))return i("legacy-story-pr-checkpoint-not-accepted");const d=de(e,await(t.provider??oe).list(e.repository,e.branch,e.baseBranch));if(!d||d.number!==t.prNumber)return i("legacy-story-pr-checkpoint-provider-mismatch");const n={schemaVersion:1,kind:"legacy-story-c10-acceptance-intent",storyId:e.storyId,planDigest:p(JSON.stringify(e)),repository:e.repository,number:d.number,url:d.url,qaDigest:s.qaDigest,stateBefore:p(o.stateBefore),stateAfter:p(o.stateAfter),storyBefore:p(o.storyBefore),storyAfter:p(o.storyAfter)};return JSON.stringify(s)!==JSON.stringify(n)?i("legacy-story-pr-checkpoint-journal-conflict"):{ok:!0,value:Object.freeze({plan:e,receipt:Object.freeze({schemaVersion:1,kind:"legacy-story-c10-checkpoint",storyId:e.storyId,epicId:e.epicId,branch:e.branch,repository:e.repository,number:d.number,url:d.url,headSha:e.headSha,stateSha256:s.stateAfter,storySha256:s.storyAfter,reused:!0,checkpointAccepted:!0,localOnly:!0})})}}catch(r){const a=r instanceof Error?r.message:"";return i(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-checkpoint-read-failed")}}function mt(t,r){const a=w(t,"diff","--raw","-z",r.baseSha,r.headSha),e=w(t,"diff","--name-only","-z",r.baseSha,r.headSha).split("\0").filter(Boolean);if(e.length===0||e.length>256||e.some(o=>!Fe(o)))throw new Error("legacy-story-pr-review-diff-invalid");return{diffSha256:p(a),changedPaths:Object.freeze(e)}}function Fe(t){return t.length>0&&t.length<=240&&/^[A-Za-z0-9_.-]+(?:\/[A-Za-z0-9_.-]+)*$/.test(t)&&t.split("/").every(r=>r!=="."&&r!=="..")}function Ae(t,r,a,e){const o=m(JSON.parse(r.stateAfter)),c=m(m(o?.stories)?.[t.storyId]);if(!c||c.status!=="pr-created"||c.last_step!==Q||c.pr_number!==a||c.review_request!=null||!Array.isArray(c.steps_completed)||!c.steps_completed.includes(Q)||c.steps_completed.includes(Y))throw new Error("legacy-story-pr-review-state-conflict");c.status="pr-reviewed",c.last_step=Y,c.steps_completed=[...c.steps_completed,Y],c.review_request={schemaVersion:1,kind:"git-pull-request",gitPullRequest:!0,prNumber:a,headSha:t.headSha,reviewEvidenceDigest:e};const h=`${JSON.stringify(o,null,2)}
25
- `,l=r.storyAfter.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!l)throw new Error("legacy-story-pr-review-frontmatter-invalid");const y=X(l[1],{strict:!0,uniqueKeys:!0}),s=m(y.toJS()),d=["stepsCompleted","steps_completed"].filter(f=>y.has(f)),n=["lastStep","last_step"].filter(f=>y.has(f)),I=s?.[d[0]];if(y.errors.length>0||y.get("id")!==t.storyId||(y.get("epic_id")??y.get("epic"))!==t.epicId||y.get("status")!=="pr-created"||d.length!==1||n.length!==1||y.has("currentStatus")&&y.get("currentStatus")!=="pr-created"||s?.[n[0]]!==Q||!Array.isArray(I)||!I.includes(Q))throw new Error("legacy-story-pr-review-frontmatter-conflict");y.set("status","pr-reviewed"),y.has("currentStatus")&&y.set("currentStatus","pr-reviewed"),y.set(d[0],[...I,Y]),y.set(n[0],Y);const b=`---
1
+ import{execFileSync as Q}from"node:child_process";import{createHash as Qe,randomBytes as re}from"node:crypto";import{closeSync as gt,constants as Ye,existsSync as H,fstatSync as mt,lstatSync as W,mkdirSync as St,mkdtempSync as wt,openSync as bt,readFileSync as vt,realpathSync as D,rmdirSync as It,unlinkSync as At,writeFileSync as Nt}from"node:fs";import{tmpdir as $t}from"node:os";import{isAbsolute as Pe,join as A}from"node:path";import{parseDocument as ae}from"yaml";import{projectC12ScopedCiFollowUpDebt as _e,summarizeC12RemoteRollup as fe}from"../../../shared/dist/merge-readiness/c12-remote-observation.js";import{projectC12ScopedCiRegistryUpdate as Re}from"../../../shared/dist/merge-readiness/c12-registry-projection.js";import{resolveBranchUnit as qe}from"../../../shared/dist/yoloop/branch-unit.js";import{acquireGitLifecyclePhysicalIntegrationLock as se,assertGitLifecyclePrivateDirectory as je,assertGitLifecyclePrivateFile as P,ensureGitLifecyclePrivateChildDirectory as T,gitLifecycleRuntimeDirectory as G,releaseGitLifecyclePhysicalIntegrationLock as oe}from"./git-lifecycle-store.js";import{anchoredAtomicWriteFile as L,anchoredCompareAndSwapFile as Y}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_CREATE_PR_STEP_ID as ie,GIT_LIFECYCLE_MERGE_PR_STEP_ID as ye,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as ne,GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as U,GIT_LIFECYCLE_SYNC_MAIN_STEP_ID as Z,GIT_LIFECYCLE_UPDATE_PROJECT_MEMORY_STEP_ID as ge}from"./git-lifecycle-step-ids.js";import{executeP205TransientAuthority as ze,projectP205TransientExecutionEvidence as Le}from"./git-lifecycle-store.js";import{readCompletedLegacyStoryBranchPlan as Ot}from"./legacy-story-branch-setup.js";function n(t){return{ok:!1,reasonCode:t}}function S(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function g(t,...r){return Q("git",r,{cwd:t,encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:2*1024*1024}).trim()}function v(t,...r){return Q("git",r,{cwd:t,encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:2*1024*1024})}function E(t,r){const a=bt(t,Ye.O_RDONLY|(Ye.O_NOFOLLOW??0));try{const e=mt(a);if(!e.isFile()||e.size>r)throw new Error("legacy-story-pr-file-unsafe");return vt(a,"utf8")}finally{gt(a)}}function z(t,r){const a=g(t,"ls-remote","--heads","origin",`refs/heads/${r}`).split(`
2
+ `).filter(Boolean);if(a.length!==1)throw new Error("legacy-story-pr-remote-ref-missing");const e=a[0].match(/^([a-f0-9]{40})\s+refs\/heads\/(.+)$/);if(!e||e[2]!==r)throw new Error("legacy-story-pr-remote-ref-invalid");return e[1]}function X(t){const a=g(t,"config","--get","remote.origin.url").match(/^(?:https:\/\/github\.com\/|git@github\.com:)([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+?)(?:\.git)?$/);if(!a||a[1].includes("..")||a[2].includes(".."))throw new Error("legacy-story-pr-repository-invalid");return`${a[1]}/${a[2]}`}function me(t){const r=g(t,"rev-parse","--git-common-dir");return D(Pe(r)?r:A(t,r))}function Se(t,r){if(!Array.isArray(r)||r.length>=100)throw new Error("legacy-story-pr-list-incomplete");const a=r.filter(s=>s.headRefName===t.branch);if(a.length>1||a.some(s=>s.state!=="OPEN"||s.baseRefName!==t.baseBranch||s.headRefOid!==t.headSha))throw new Error("legacy-story-pr-provider-conflict");const e=a[0];if(!e)return null;if(!Number.isSafeInteger(e.number)||e.number<=0||e.url.toLowerCase()!==`https://github.com/${t.repository}/pull/${e.number}`.toLowerCase())throw new Error("legacy-story-pr-provider-invalid");return e}async function kt(t,r){const a=await T(await G(t),"legacy-story-pr-intents"),e=`${Qe("sha256").update(r.storyId).digest("hex")}.json`,s=A(a,e),o={schemaVersion:1,kind:"legacy-story-pr-create-attempt",storyId:r.storyId,epicId:r.epicId,repository:r.repository,branch:r.branch,baseBranch:r.baseBranch,headSha:r.headSha};if(H(s)){if(await P(s,a),E(s,4096)!==`${JSON.stringify(o)}
3
+ `)throw new Error("legacy-story-pr-attempt-conflict");return!1}return await L(a,e,`${JSON.stringify(o)}
4
+ `),await P(s,a),!0}function Ct(t){if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-commit-target-invalid");try{const r=D(t.projectRoot);if(D(g(r,"rev-parse","--show-toplevel"))!==r||v(r,"diff","--name-only","-z")!==""||v(r,"ls-files","--others","--exclude-standard","-z")!=="")return n("legacy-story-commit-checkout-invalid");const a=v(r,"diff","--cached","--name-only","-z").split("\0").filter(Boolean);if(a.length===0||new Set(a).size!==a.length||a.some(C=>C.length>1024||C.startsWith("/")||C.includes("\\")||C.includes("\0")||C.split("/").includes("..")||C===".git"||C.startsWith(".git/")))return n("legacy-story-commit-write-set-invalid");if(v(r,"ls-files","-u","-z")!==""||a.some(C=>{const V=v(r,"ls-files","-s","-z","--",C).split("\0").filter(Boolean);return V.length>1||V.some(te=>{const K=te.match(/^(100644|100755) [a-f0-9]{40} 0\t(.+)$/);return!K||K[2]!==C})}))return n("legacy-story-commit-index-unsafe");g(r,"diff","--cached","--check");const e=v(r,"show",":.neocortex/state.json"),s=`docs/stories/${t.storyId}.story.md`,o=v(r,"show",`:${s}`);if(E(A(r,".neocortex/state.json"),2*1024*1024)!==e||E(A(r,s),2*1024*1024)!==o)return n("legacy-story-commit-preimage-drift");const l=S(JSON.parse(e)),p=S(l?.stories),y=S(p?.[t.storyId]),i=y?.epic_id,d=typeof i=="string"?S(S(l?.epics)?.[i]):null,c=d?.stories;if(!y||y.id!==t.storyId||typeof i!="string"||!d||d.id!==i||d.branch_mode==="epic"||y.status!=="memory-updated"||y.last_step!==ge||!Array.isArray(y.steps_completed)||!y.steps_completed.includes(ge)||y.steps_completed.includes(U)||!Number.isSafeInteger(y.issue_number)||y.issue_number<=0||!Array.isArray(c)||c.length===0||new Set(c).size!==c.length||!c.includes(t.storyId)||c.some(C=>typeof C!="string"||S(p?.[C])?.epic_id!==i)||Object.entries(p??{}).some(([C,V])=>S(V)?.epic_id===i&&!c.includes(C)))return n("legacy-story-commit-state-invalid");const b=qe(d,c.map(C=>({...S(p?.[C]),id:C}))),w=`story/${i}/${t.storyId}`,f=S(l?.config)?.default_branch;if(b.mode!=="story"||y.branch_name!==w||g(r,"branch","--show-current")!==w||typeof f!="string"||f===w||g(r,"check-ref-format","--branch",f)!==f)return n("legacy-story-commit-branch-invalid");const m=S(JSON.parse(v(r,"show","HEAD:.neocortex/state.json"))),u=S(S(m?.stories)?.[t.storyId]),I=Array.isArray(u?.files_to_modify)?u.files_to_modify:null;if(!I||I.length===0||new Set(I).size!==I.length||u?.epic_id!==i||JSON.stringify(y.files_to_modify)!==JSON.stringify(I)||I.some(C=>typeof C!="string"||C.length>1024||C.startsWith("/")||C.includes("\\")||C.split("/").includes("..")||C===".git"||C.startsWith(".git/"))||!a.every(C=>I.includes(C))||!a.includes(".neocortex/state.json")||!a.includes(s)||!I.includes(".neocortex/state.json")||!I.includes(s))return n("legacy-story-commit-write-set-unauthorized");const N=o.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!N)return n("legacy-story-commit-frontmatter-invalid");const O=ae(N[1],{strict:!0,uniqueKeys:!0}),_=S(O.toJS()),$=["stepsCompleted","steps_completed"].filter(C=>O.has(C)),k=["lastStep","last_step"].filter(C=>O.has(C)),j=["branchName","branch_name"].filter(C=>O.has(C)),B=["issueNumber","issue_number"].filter(C=>O.has(C));if(O.errors.length>0||O.get("id")!==t.storyId||(O.get("epic_id")??O.get("epic"))!==i||O.get("status")!=="memory-updated"||O.has("currentStatus")&&O.get("currentStatus")!=="memory-updated"||$.length!==1||k.length!==1||j.length!==1||B.length!==1||JSON.stringify(_?.[$[0]])!==JSON.stringify(y.steps_completed)||_?.[k[0]]!==ge||_?.[j[0]]!==w||_?.[B[0]]!==y.issue_number)return n("legacy-story-commit-frontmatter-invalid");const x=g(r,"rev-parse","HEAD"),J=g(r,"ls-remote","--heads","origin",`refs/heads/${w}`).split(`
5
+ `).filter(Boolean),R=z(r,f);return!/^[a-f0-9]{40}$/.test(x)||J.length!==0||g(r,"rev-parse",`refs/remotes/origin/${f}`)!==R?n("legacy-story-commit-remote-drift"):{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c08-commit-plan",storyId:t.storyId,epicId:i,repository:X(r),branch:w,baseBranch:f,headSha:x,remoteHeadSha:null,baseSha:R,indexDigestSha256:h(v(r,"ls-files","-s","-z")),stagedPatchSha256:h(v(r,"diff","--cached","--binary","--full-index")),changedPaths:Object.freeze(a),stateSha256:h(e),storySha256:h(o),stateIndexBlobSha:g(r,"rev-parse",":.neocortex/state.json"),storyIndexBlobSha:g(r,"rev-parse",`:${s}`),physicalCommit:!1,checkpointAccepted:!1,localOnly:!0})}}catch{return n("legacy-story-commit-physical-unavailable")}}function Ue(t,r){const a=v(t,"show",r.stateIndexBlobSha),e=v(t,"show",r.storyIndexBlobSha);if(g(t,"cat-file","-t",r.stateIndexBlobSha)!=="blob"||g(t,"cat-file","-t",r.storyIndexBlobSha)!=="blob"||h(a)!==r.stateSha256||h(e)!==r.storySha256)throw new Error("legacy-story-commit-preimage-invalid");const s=S(JSON.parse(a)),o=S(S(s?.stories)?.[r.storyId]);if(!o||o.epic_id!==r.epicId||o.status!=="memory-updated"||o.last_step!==ge||!Array.isArray(o.steps_completed)||!o.steps_completed.includes(ge)||o.steps_completed.includes(U))throw new Error("legacy-story-commit-projection-state-invalid");const l=o.steps_completed;o.status="committed",o.last_step=U,o.steps_completed=[...l,U];const p=`${JSON.stringify(s,null,2)}
6
+ `,y=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!y)throw new Error("legacy-story-commit-projection-frontmatter-invalid");const i=ae(y[1],{strict:!0,uniqueKeys:!0}),d=S(i.toJS()),c=["stepsCompleted","steps_completed"].filter(f=>i.has(f)),b=["lastStep","last_step"].filter(f=>i.has(f));if(i.errors.length>0||i.get("id")!==r.storyId||(i.get("epic_id")??i.get("epic"))!==r.epicId||i.get("status")!=="memory-updated"||c.length!==1||b.length!==1||JSON.stringify(d?.[c[0]])!==JSON.stringify(l)||d?.[b[0]]!==ge)throw new Error("legacy-story-commit-projection-frontmatter-invalid");i.set("status","committed"),i.has("currentStatus")&&i.set("currentStatus","committed"),i.set(c[0],o.steps_completed),i.set(b[0],U);const w=`---
7
+ ${i.toString({lineWidth:0})}---
8
+ ${e.slice(y[0].length)}`;return{stateBefore:a,storyBefore:e,stateAfter:p,storyAfter:w}}async function Xe(t,r,a){if(a)return a();const e=await Ot({projectRoot:t,storyId:r.storyId});if(!e.ok||e.value.epicId!==r.epicId||e.value.branch!==r.branch||e.value.baseBranch!==r.baseBranch||e.value.worktreePath!==t)return!1;try{g(t,"merge-base","--is-ancestor",e.value.baseHeadSha,r.headSha)}catch{return!1}const s=await T(await G(t),"legacy-story-branch-intents"),o=A(s,`${h(r.storyId)}.c01.accepted.json`);if(!H(o))return!1;await P(o,s);const l=S(JSON.parse(E(o,4096))),p=S(JSON.parse(v(t,"show",r.stateIndexBlobSha))),y=S(S(p?.stories)?.[r.storyId]);return!!l&&l.schemaVersion===1&&l.kind==="legacy-story-c01-acceptance-intent"&&l.storyId===r.storyId&&l.planDigest===h(JSON.stringify(e.value))&&l.repository===r.repository&&l.issueNumber===y?.issue_number}function Ve(t,r){return r.changedPaths.filter(a=>a!==".neocortex/state.json"&&a!==`docs/stories/${r.storyId}.story.md`).map(a=>{const e=v(t,"ls-files","-s","-z","--",a).split("\0").filter(Boolean);if(e.length>1)throw new Error("legacy-story-commit-index-invalid");return{path:a,entry:e[0]??null}})}async function er(t){if(!t.authorize)return n("legacy-story-commit-authorization-required");if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-commit-target-invalid");const r=`legacy-c08-${re(16).toString("hex")}`,a=await se(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return n(a.reasonCode);try{const e=D(t.projectRoot);if(D(g(e,"rev-parse","--show-toplevel"))!==e)return n("legacy-story-commit-checkout-invalid");const s=await T(await G(e),"legacy-story-pr-intents"),o=h(t.storyId),l=`${o}.c08.commit.json`,p=`${o}.c08.commit.accepted.json`;let y=await $e(s,l,64*1024);if(!y){const $=Ct(t);if(!$.ok)return $;const k=$.value;if(!await Xe(e,k,t.verifyC01))return n("legacy-story-commit-c01-unverified");const j=Ue(e,k),B={schemaVersion:1,kind:"legacy-story-c08-commit-intent",plan:k,stateAfterSha256:h(j.stateAfter),storyAfterSha256:h(j.storyAfter),otherIndex:Ve(e,k)};await L(s,l,`${JSON.stringify(B)}
9
+ `),await P(A(s,l),s),y=B}const i=S(y.plan);if(y.schemaVersion!==1||y.kind!=="legacy-story-c08-commit-intent"||!i||i.schemaVersion!==1||i.kind!=="legacy-story-c08-commit-plan"||i.storyId!==t.storyId||typeof i.epicId!="string"||i.branch!==`story/${i.epicId}/${t.storyId}`||typeof i.repository!="string"||typeof i.baseBranch!="string"||typeof i.headSha!="string"||!/^[a-f0-9]{40}$/.test(i.headSha)||typeof i.stateIndexBlobSha!="string"||!/^[a-f0-9]{40}$/.test(i.stateIndexBlobSha)||typeof i.storyIndexBlobSha!="string"||!/^[a-f0-9]{40}$/.test(i.storyIndexBlobSha)||!Array.isArray(i.changedPaths)||!i.changedPaths.includes(".neocortex/state.json")||!i.changedPaths.includes(`docs/stories/${t.storyId}.story.md`)||i.remoteHeadSha!==null||i.physicalCommit!==!1||i.checkpointAccepted!==!1||typeof y.stateAfterSha256!="string"||!/^[a-f0-9]{64}$/.test(y.stateAfterSha256)||typeof y.storyAfterSha256!="string"||!/^[a-f0-9]{64}$/.test(y.storyAfterSha256)||!Array.isArray(y.otherIndex)||y.otherIndex.length!==i.changedPaths.length-2||y.otherIndex.some($=>{const k=S($);return!k||typeof k.path!="string"||!i.changedPaths.includes(k.path)||k.path===".neocortex/state.json"||k.path===`docs/stories/${t.storyId}.story.md`||k.entry!==null&&(typeof k.entry!="string"||!/^(100644|100755) [a-f0-9]{40} 0\t/.test(k.entry)||!k.entry.endsWith(` ${k.path}`))})||!/^[a-f0-9]{64}$/.test(String(i.indexDigestSha256))||!/^[a-f0-9]{64}$/.test(String(i.stagedPatchSha256))||!/^[a-f0-9]{64}$/.test(String(i.stateSha256))||!/^[a-f0-9]{64}$/.test(String(i.storySha256))||new Set(i.changedPaths).size!==i.changedPaths.length||i.changedPaths.some($=>typeof $!="string"||$.length>1024||$.startsWith("/")||$.includes("\\")||$.split("/").includes("..")||$===".git"||$.startsWith(".git/"))||X(e)!==i.repository||g(e,"branch","--show-current")!==i.branch)return n("legacy-story-commit-intent-invalid");const d=i;if(!await Xe(e,d,t.verifyC01))return n("legacy-story-commit-c01-unverified");const c=Ue(e,d);if(h(c.stateAfter)!==y.stateAfterSha256||h(c.storyAfter)!==y.storyAfterSha256||JSON.stringify(Ve(e,d))!==JSON.stringify(y.otherIndex))return n("legacy-story-commit-intent-drift");const b=h(JSON.stringify(y)),f=await $e(s,p,4096);if(f&&(f.schemaVersion!==1||f.kind!=="legacy-story-c08-commit-accepted"||f.intentSha256!==b||!/^[a-f0-9]{40}$/.test(f.checkpointHeadSha)||!/^[a-f0-9]{64}$/.test(f.qaSha256)))return n("legacy-story-commit-accepted-invalid");let m=g(e,"rev-parse","HEAD");if(m===d.headSha){if(f)return n("legacy-story-commit-accepted-physical-drift");const $=v(e,"diff","--cached","--name-only","-z").split("\0").filter(Boolean),k=v(e,"diff","--name-only","-z").split("\0").filter(Boolean);if(JSON.stringify($)!==JSON.stringify(d.changedPaths)||k.some(R=>R!==".neocortex/state.json"&&R!==`docs/stories/${d.storyId}.story.md`)||v(e,"ls-files","--others","--exclude-standard","-z")!==""||g(e,"ls-remote","--heads","origin",`refs/heads/${d.branch}`)!==""||z(e,d.baseBranch)!==d.baseSha)return n("legacy-story-commit-precommit-drift");const j=E(A(e,".neocortex/state.json"),2*1024*1024),B=E(A(e,`docs/stories/${d.storyId}.story.md`),2*1024*1024),x=v(e,"show",":.neocortex/state.json"),J=v(e,"show",`:docs/stories/${d.storyId}.story.md`);if(![c.stateBefore,c.stateAfter].includes(j)||![c.storyBefore,c.storyAfter].includes(B)||![c.stateBefore,c.stateAfter].includes(x)||![c.storyBefore,c.storyAfter].includes(J)||x===c.stateAfter&&j!==c.stateAfter||J===c.storyAfter&&B!==c.storyAfter)return n("legacy-story-commit-preimage-drift");if(j===c.stateBefore&&(await Y(A(e,".neocortex"),"state.json",c.stateAfter,h(c.stateBefore)),await t.afterStateWrite?.()),B===c.storyBefore&&await Y(A(e,"docs/stories"),`${d.storyId}.story.md`,c.storyAfter,h(c.storyBefore)),E(A(e,".neocortex/state.json"),2*1024*1024)!==c.stateAfter||E(A(e,`docs/stories/${d.storyId}.story.md`),2*1024*1024)!==c.storyAfter)return n("legacy-story-commit-projection-drift");if(g(e,"add","--",".neocortex/state.json",`docs/stories/${d.storyId}.story.md`),g(e,"diff","--cached","--check"),v(e,"diff","--name-only","-z")!==""||v(e,"ls-files","--others","--exclude-standard","-z")!==""||JSON.stringify(Ve(e,d))!==JSON.stringify(y.otherIndex)||h(v(e,"show",":.neocortex/state.json"))!==y.stateAfterSha256||h(v(e,"show",`:docs/stories/${d.storyId}.story.md`))!==y.storyAfterSha256)return n("legacy-story-commit-index-drift");g(e,"commit","-m",`chore(story): checkpoint ${d.storyId} C08`,"-m",`Neocortex-Legacy-Commit: ${d.storyId}`),m=g(e,"rev-parse","HEAD"),await t.afterCommit?.()}const u=g(e,"rev-list","--parents","-n","1",m).split(" "),I=v(e,"diff-tree","--no-commit-id","--name-only","-r","-z",m).split("\0").filter(Boolean);if(JSON.stringify(u)!==JSON.stringify([m,d.headSha])||JSON.stringify(I)!==JSON.stringify(d.changedPaths)||y.otherIndex.some(({path:$,entry:k})=>{const j=v(e,"ls-tree","-z",m,"--",$).split("\0").filter(Boolean);return k===null?j.length!==0:j.length!==1||j[0]!==k.replace(/^(100644|100755) ([a-f0-9]{40}) 0\t/,"$1 blob $2 ")})||h(v(e,"show",`${m}:.neocortex/state.json`))!==y.stateAfterSha256||h(v(e,"show",`${m}:docs/stories/${d.storyId}.story.md`))!==y.storyAfterSha256||!v(e,"log","-1","--format=%B",m).split(`
10
+ `).map($=>$.trim()).includes(`Neocortex-Legacy-Commit: ${d.storyId}`)||v(e,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-commit-checkpoint-invalid");const N=g(e,"ls-remote","--heads","origin",`refs/heads/${d.branch}`);if(N!==""&&N!==`${m} refs/heads/${d.branch}`)return n("legacy-story-commit-remote-drift");let O=f?.qaSha256;if(!O){try{O=t.verifyQa?await t.verifyQa(m):await(async()=>{const $=await ze(e,{headSha:m,graphRevision:h(`legacy-story-c08\0${b}`)}),k=Le($);if(!k||k.executionHeadSha!==m)throw new Error("qa-invalid");return k.executionEvidenceDigest})()}catch{return n("legacy-story-commit-qa-failed")}if(!/^[a-f0-9]{64}$/.test(O))return n("legacy-story-commit-qa-failed")}if(g(e,"rev-parse","HEAD")!==m||v(e,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-commit-final-drift");if(N===""&&g(e,"push","--porcelain","origin",`${m}:refs/heads/${d.branch}`),g(e,"ls-remote","--heads","origin",`refs/heads/${d.branch}`)!==`${m} refs/heads/${d.branch}`)return n("legacy-story-commit-push-unverified");await t.afterPush?.();const _={schemaVersion:1,kind:"legacy-story-c08-commit-accepted",intentSha256:b,checkpointHeadSha:m,qaSha256:O};return f&&JSON.stringify(f)!==JSON.stringify(_)?n("legacy-story-commit-accepted-conflict"):(f||(await L(s,p,`${JSON.stringify(_)}
11
+ `),await P(A(s,p),s)),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c08-commit-accepted",storyId:d.storyId,epicId:d.epicId,branch:d.branch,checkpointHeadSha:m,qaSha256:O,reused:!!f,physicalCommit:!0,checkpointAccepted:!0,publicSafe:!0})})}catch(e){const s=e instanceof Error?e.message:"";return n(s.startsWith("legacy-story-commit-")?s:"legacy-story-commit-effect-uncertain")}finally{await oe(a.path,a.owner).catch(()=>{})}}function _t(t){if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-sync-target-invalid");try{const r=D(t.projectRoot);if(D(g(r,"rev-parse","--show-toplevel"))!==r||v(r,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-sync-checkout-invalid");const a=v(r,"show","HEAD:.neocortex/state.json"),e=`docs/stories/${t.storyId}.story.md`,s=v(r,"show",`HEAD:${e}`);if(E(A(r,".neocortex/state.json"),2*1024*1024)!==a||E(A(r,e),2*1024*1024)!==s)return n("legacy-story-sync-committed-content-drift");const o=S(JSON.parse(a)),l=S(o?.stories),p=S(o?.epics),y=S(l?.[t.storyId]),i=y?.epic_id,d=typeof i=="string"?S(p?.[i]):null;if(!y||y.id!==t.storyId||typeof i!="string"||!d||d.id!==i||d.branch_mode==="epic"||y.status!=="committed"||y.last_step!==U||!Array.isArray(y.steps_completed)||!y.steps_completed.includes(U)||y.steps_completed.includes(Z)||!Number.isSafeInteger(y.issue_number)||y.issue_number<=0)return n("legacy-story-sync-state-invalid");const c=Array.isArray(d.stories)?d.stories:null;if(!c||c.length===0||new Set(c).size!==c.length||!c.includes(t.storyId)||c.some(x=>typeof x!="string"||S(l?.[x])?.epic_id!==i)||Object.entries(l??{}).some(([x,J])=>S(J)?.epic_id===i&&!c.includes(x)))return n("legacy-story-sync-topology-invalid");const b=qe(d,c.map(x=>({...S(l?.[x]),id:x}))),w=`story/${i}/${t.storyId}`,m=S(o?.config)?.default_branch;if(b.mode!=="story"||y.branch_name!==w||g(r,"branch","--show-current")!==w||typeof m!="string"||m===w||g(r,"check-ref-format","--branch",m)!==m)return n("legacy-story-sync-branch-invalid");const u=s.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!u)return n("legacy-story-sync-frontmatter-invalid");const I=ae(u[1],{strict:!0,uniqueKeys:!0}),N=S(I.toJS()),O=["stepsCompleted","steps_completed"].filter(x=>I.has(x)),_=["lastStep","last_step"].filter(x=>I.has(x)),$=["branchName","branch_name"].filter(x=>I.has(x));if(I.errors.length>0||I.get("id")!==t.storyId||(I.get("epic_id")??I.get("epic"))!==i||I.get("status")!=="committed"||I.has("currentStatus")&&I.get("currentStatus")!=="committed"||O.length>1||_.length>1||$.length>1||O.length===1&&JSON.stringify(N?.[O[0]])!==JSON.stringify(y.steps_completed)||_.length===1&&N?.[_[0]]!==U||$.length===1&&N?.[$[0]]!==w)return n("legacy-story-sync-frontmatter-invalid");const k=g(r,"rev-parse","HEAD"),j=z(r,m);if(!/^[a-f0-9]{40}$/.test(k)||z(r,w)!==k||g(r,"rev-parse",`refs/remotes/origin/${m}`)!==j)return n("legacy-story-sync-remote-drift");const B=g(r,"merge-base",k,j);return/^[a-f0-9]{40}$/.test(B)?{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c09-sync-plan",storyId:t.storyId,epicId:i,repository:X(r),branch:w,baseBranch:m,headSha:k,baseSha:j,mergeBaseSha:B,stateSha256:h(a),storySha256:h(s),baseAlreadyAncestor:B===j,physicalSync:!1,checkpointAccepted:!1,localOnly:!0})}:n("legacy-story-sync-ancestry-invalid")}catch{return n("legacy-story-sync-physical-unavailable")}}function jt(t,r){const a=E(A(t,".neocortex/state.json"),2097152),e=`docs/stories/${r.storyId}.story.md`,s=E(A(t,e),2*1024*1024),o=v(t,"show",`${r.headSha}:.neocortex/state.json`),l=v(t,"show",`${r.headSha}:${e}`);if(h(o)!==r.stateSha256||h(l)!==r.storySha256||s!==l)throw new Error("legacy-story-sync-preimage-drift");const p=S(JSON.parse(a)),y=S(JSON.parse(o)),i=S(p?.stories),d=S(S(y?.stories)?.[r.storyId]),c=S(i?.[r.storyId]),b=S(S(p?.epics)?.[r.epicId]),w=b?.stories;if(!c||!d||JSON.stringify(c)!==JSON.stringify(d)||c.status!=="committed"||c.last_step!==U||c.branch_name!==r.branch||!Array.isArray(c.steps_completed)||!c.steps_completed.includes(U)||c.steps_completed.includes(Z)||!b||b.id!==r.epicId||b.branch_mode==="epic"||!Array.isArray(w)||!w.includes(r.storyId)||new Set(w).size!==w.length||w.some($=>typeof $!="string"||S(i?.[$])?.epic_id!==r.epicId)||S(p?.config)?.default_branch!==r.baseBranch)throw new Error("legacy-story-sync-merged-state-invalid");c.status="synced",c.last_step=Z,c.steps_completed=[...c.steps_completed,Z],c.sync_base_sha=r.baseSha;const f=`${JSON.stringify(p,null,2)}
12
+ `,m=s.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!m)throw new Error("legacy-story-sync-frontmatter-invalid");const u=ae(m[1],{strict:!0,uniqueKeys:!0}),I=S(u.toJS()),N=["stepsCompleted","steps_completed"].filter($=>u.has($)),O=["lastStep","last_step"].filter($=>u.has($));if(u.errors.length>0||u.get("id")!==r.storyId||(u.get("epic_id")??u.get("epic"))!==r.epicId||u.get("status")!=="committed"||N.length!==1||O.length!==1||JSON.stringify(I?.[N[0]])!==JSON.stringify(d.steps_completed)||I?.[O[0]]!==U)throw new Error("legacy-story-sync-frontmatter-invalid");u.set("status","synced"),u.has("currentStatus")&&u.set("currentStatus","synced"),u.set(N[0],[...d.steps_completed,Z]),u.set(O[0],Z),u.set("syncBaseSha",r.baseSha);const _=`---
13
+ ${u.toString({lineWidth:0})}---
14
+ ${s.slice(m[0].length)}`;return{stateBefore:a,stateAfter:f,storyBefore:s,storyAfter:_}}async function $e(t,r,a){const e=A(t,r);if(!H(e))return null;await P(e,t);const s=S(JSON.parse(E(e,a)));if(!s)throw new Error("legacy-story-sync-journal-invalid");return s}async function tr(t){if(!t.authorize)return n("legacy-story-sync-authorization-required");if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-sync-target-invalid");const r=`legacy-c09-sync-${re(16).toString("hex")}`,a=await se(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return n(a.reasonCode);try{const e=D(t.projectRoot);if(D(g(e,"rev-parse","--show-toplevel"))!==e)return n("legacy-story-sync-checkout-invalid");const s=await T(await G(e),"legacy-story-pr-intents"),o=h(t.storyId),l=`${o}.c09.sync.json`,p=`${o}.c09.sync.prepared.json`,y=`${o}.c09.sync.accepted.json`;let i=await $e(s,l,8192);if(!i){const C=_t(t);if(!C.ok)return C;const V={schemaVersion:1,kind:"legacy-story-c09-sync-intent",plan:C.value};await L(s,l,`${JSON.stringify(V)}
15
+ `),i=V}const d=S(i.plan);if(i.schemaVersion!==1||i.kind!=="legacy-story-c09-sync-intent"||!d||d.schemaVersion!==1||d.kind!=="legacy-story-c09-sync-plan"||d.storyId!==t.storyId||typeof d.epicId!="string"||d.branch!==`story/${d.epicId}/${t.storyId}`||typeof d.baseBranch!="string"||typeof d.repository!="string"||typeof d.headSha!="string"||!/^[a-f0-9]{40}$/.test(d.headSha)||typeof d.baseSha!="string"||!/^[a-f0-9]{40}$/.test(d.baseSha)||typeof d.stateSha256!="string"||!/^[a-f0-9]{64}$/.test(d.stateSha256)||typeof d.storySha256!="string"||!/^[a-f0-9]{64}$/.test(d.storySha256)||typeof d.baseAlreadyAncestor!="boolean"||d.physicalSync!==!1||d.checkpointAccepted!==!1||g(e,"branch","--show-current")!==d.branch||X(e)!==d.repository)return n("legacy-story-sync-intent-invalid");const c=d,b=h(JSON.stringify(i));let f=await $e(s,p,4096);if(f&&(f.schemaVersion!==1||f.kind!=="legacy-story-c09-sync-prepared"||f.intentSha256!==b||!/^[a-f0-9]{40}$/.test(f.treeSha)||!/^[a-f0-9]{64}$/.test(f.stateSha256)||!/^[a-f0-9]{64}$/.test(f.storySha256)))return n("legacy-story-sync-prepared-invalid");const u=await $e(s,y,4096);if(u&&(u.schemaVersion!==1||u.kind!=="legacy-story-c09-sync-accepted"||u.intentSha256!==b||!/^[a-f0-9]{40}$/.test(u.checkpointHeadSha)||!/^[a-f0-9]{64}$/.test(u.qaSha256)))return n("legacy-story-sync-accepted-invalid");const I=g(e,"rev-parse","HEAD");if(v(e,"status","--porcelain=v1","-uall")!==""||z(e,c.baseBranch)!==c.baseSha||h(v(e,"show",`${c.headSha}:.neocortex/state.json`))!==c.stateSha256||h(v(e,"show",`${c.headSha}:docs/stories/${c.storyId}.story.md`))!==c.storySha256)return n("legacy-story-sync-physical-drift");const N=A(s,`${o}.c09.sync.checkout`);if(H(N)||Q("git",["worktree","add","--detach",N,u?.checkpointHeadSha??c.headSha],{cwd:e,encoding:"utf8",timeout:6e4,stdio:["ignore","pipe","pipe"],maxBuffer:32*1024}),!W(N).isDirectory()||D(N)!==N||D(g(N,"rev-parse","--show-toplevel"))!==N||me(N)!==me(e)||g(N,"branch","--show-current")!=="")return n("legacy-story-sync-candidate-invalid");let O=g(N,"rev-parse","HEAD");if(O===c.headSha){if(f)return n("legacy-story-sync-prepared-uncommitted");if(I!==c.headSha||z(e,c.branch)!==c.headSha||v(N,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-sync-preparation-drift");if(!c.baseAlreadyAncestor){try{g(N,"merge","--no-ff","--no-commit",c.baseSha)}catch{return n("legacy-story-sync-merge-conflict")}if(v(N,"ls-files","-u")!=="")return n("legacy-story-sync-merge-conflict")}const C=jt(N,c);await Y(A(N,".neocortex"),"state.json",C.stateAfter,h(C.stateBefore)),await Y(A(N,"docs/stories"),`${c.storyId}.story.md`,C.storyAfter,h(C.storyBefore)),g(N,"add","--",".neocortex/state.json",`docs/stories/${c.storyId}.story.md`),g(N,"diff","--cached","--check"),f={schemaVersion:1,kind:"legacy-story-c09-sync-prepared",intentSha256:b,treeSha:g(N,"write-tree"),stateSha256:h(C.stateAfter),storySha256:h(C.storyAfter)},await L(s,p,`${JSON.stringify(f)}
16
+ `),await P(A(s,p),s),g(N,"commit","-m",`chore(story): sync ${c.storyId} with ${c.baseBranch}`,"-m",`Neocortex-Legacy-Sync: ${c.storyId}`),O=g(N,"rev-parse","HEAD"),await t.afterCommit?.()}const _=g(N,"rev-list","--parents","-n","1",O).split(" "),$=c.baseAlreadyAncestor?[O,c.headSha]:[O,c.headSha,c.baseSha],k=S(JSON.parse(v(N,"show",`${O}:.neocortex/state.json`))),j=S(S(k?.stories)?.[c.storyId]),B=v(N,"show",`${O}:docs/stories/${c.storyId}.story.md`);if(!f||g(N,"rev-parse",`${O}^{tree}`)!==f.treeSha||h(v(N,"show",`${O}:.neocortex/state.json`))!==f.stateSha256||h(B)!==f.storySha256||JSON.stringify(_)!==JSON.stringify($)||!j||j.status!=="synced"||j.last_step!==Z||j.sync_base_sha!==c.baseSha||!Array.isArray(j.steps_completed)||!j.steps_completed.includes(Z)||!B.startsWith(`---
17
+ `)||!v(N,"log","-1","--format=%B",O).split(`
18
+ `).map(C=>C.trim()).includes(`Neocortex-Legacy-Sync: ${c.storyId}`)||v(N,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-sync-checkpoint-invalid");if(u&&u.checkpointHeadSha!==O)return n("legacy-story-sync-accepted-conflict");const x=z(e,c.branch);if(![c.headSha,O].includes(I)||![c.headSha,O].includes(x)||u&&(I!==O||x!==O))return n("legacy-story-sync-remote-drift");let J=u?.qaSha256;if(!J){if(!t.verifyQa)try{et(N)}catch{return n("legacy-story-sync-dependencies-failed")}const C={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:c.storyId,epicId:c.epicId,repository:c.repository,branch:c.branch,baseBranch:c.baseBranch,headSha:O,baseSha:c.baseSha,qaAuthority:"root-review-required",localOnly:!0};try{J=await de(C,N,t.verifyQa)}catch{return n("legacy-story-sync-qa-failed")}}if(g(N,"rev-parse","HEAD")!==O||v(N,"status","--porcelain=v1","-uall")!==""||g(e,"rev-parse","HEAD")!==I||v(e,"status","--porcelain=v1","-uall")!==""||z(e,c.baseBranch)!==c.baseSha)return n("legacy-story-sync-final-drift");if(x===c.headSha&&g(e,"push","--porcelain","origin",`${O}:refs/heads/${c.branch}`),z(e,c.branch)!==O)return n("legacy-story-sync-push-unverified");if(await t.afterPush?.(),g(e,"rev-parse","HEAD")===c.headSha&&g(e,"merge","--ff-only",O),g(e,"rev-parse","HEAD")!==O||v(e,"status","--porcelain=v1","-uall")!==""||E(A(e,".neocortex/state.json"),2*1024*1024)!==v(e,"show",`${O}:.neocortex/state.json`)||E(A(e,`docs/stories/${c.storyId}.story.md`),2*1024*1024)!==B)return n("legacy-story-sync-local-readback-invalid");const R={schemaVersion:1,kind:"legacy-story-c09-sync-accepted",intentSha256:b,checkpointHeadSha:O,qaSha256:J};return u&&JSON.stringify(u)!==JSON.stringify(R)?n("legacy-story-sync-accepted-conflict"):(u||(await L(s,y,`${JSON.stringify(R)}
19
+ `),await P(A(s,y),s)),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c09-sync-accepted",storyId:c.storyId,epicId:c.epicId,branch:c.branch,baseSha:c.baseSha,checkpointHeadSha:O,qaSha256:J,reused:!!u,physicalSync:!0,checkpointAccepted:!0,publicSafe:!0})})}catch(e){const s=e instanceof Error?e.message:"";return n(s.startsWith("legacy-story-sync-")?s:"legacy-story-sync-effect-uncertain")}finally{await oe(a.path,a.owner).catch(()=>{})}}function we(t,r){try{const a=D(t.projectRoot);if(!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId)||D(g(a,"rev-parse","--show-toplevel"))!==a||!r&&g(a,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-pr-checkout-invalid");const e=v(a,"show","HEAD:.neocortex/state.json");if(!r&&e!==E(A(a,".neocortex/state.json"),2*1024*1024))return n("legacy-story-pr-state-not-committed");const s=S(JSON.parse(e)),o=S(s?.stories),l=S(s?.epics),p=S(o?.[t.storyId]),y=p?.epic_id,i=typeof y=="string"?S(l?.[y]):null;if(!p||p.id!==t.storyId||typeof y!="string"||!i||i.id!==y||i.branch_mode==="epic"||p.status!=="synced"||p.last_step!==Z||!Array.isArray(p.steps_completed)||!p.steps_completed.includes(Z)||p.steps_completed.includes(ie))return n("legacy-story-pr-state-invalid");const d=Array.isArray(i.stories)?i.stories:null;if(!d||d.length===0||new Set(d).size!==d.length||!d.includes(t.storyId)||d.some(_=>typeof _!="string"||S(o?.[_])?.epic_id!==y)||Object.entries(o??{}).some(([_,$])=>S($)?.epic_id===y&&!d.includes(_)))return n("legacy-story-pr-topology-invalid");const c=qe(i,d.map(_=>({...S(o?.[_]),id:_}))),b=`story/${y}/${t.storyId}`,f=S(s?.config)?.default_branch;if(c.mode!=="story"||p.branch_name!==b||g(a,"branch","--show-current")!==b||typeof f!="string"||f===b||g(a,"check-ref-format","--branch",f)!==f)return n("legacy-story-pr-branch-invalid");const u=g(a,"show",`HEAD:docs/stories/${t.storyId}.story.md`).match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!u)return n("legacy-story-pr-frontmatter-invalid");const I=ae(u[1],{strict:!0,uniqueKeys:!0});if(I.errors.length>0||I.get("id")!==t.storyId||(I.get("epic_id")??I.get("epic"))!==y||I.get("status")!=="synced")return n("legacy-story-pr-frontmatter-invalid");const N=g(a,"rev-parse","HEAD"),O=z(a,f);return!/^[a-f0-9]{40}$/.test(N)||z(a,b)!==N||g(a,"rev-parse",`refs/remotes/origin/${f}`)!==O?n("legacy-story-pr-remote-drift"):(g(a,"merge-base","--is-ancestor",O,N),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-pr-plan",storyId:t.storyId,epicId:y,repository:X(a),branch:b,baseBranch:f,headSha:N,baseSha:O,qaAuthority:"root-review-required",localOnly:!0})})}catch{return n("legacy-story-pr-physical-unavailable")}}function be(t){return we(t,!1)}async function de(t,r,a){const e=a?await a(t):await(async()=>{const s=await ze(r,{headSha:t.headSha,graphRevision:h(`legacy-story-pr-c10\0${JSON.stringify(t)}`)}),o=Le(s);if(!o||o.executionHeadSha!==t.headSha)throw new Error("legacy-story-pr-checkpoint-qa-invalid");return o.executionEvidenceDigest})();if(!/^[a-f0-9]{64}$/.test(e))throw new Error("legacy-story-pr-checkpoint-qa-invalid");return e}function et(t){for(const r of[".","packages/server","portal","admin","landing"]){const a=A(t,r),e=A(a,"package.json"),s=A(a,"package-lock.json");if(!H(a)||!W(a).isDirectory()||D(a)!==a||!H(e)||!W(e).isFile()||!H(s)||!W(s).isFile())throw new Error("legacy-story-pr-candidate-dependencies-missing");try{Q("npm",["ci","--include=dev","--no-audit","--no-fund"],{cwd:a,encoding:"utf8",timeout:10*6e4,stdio:["ignore","pipe","pipe"],maxBuffer:1024*1024})}catch{throw new Error("legacy-story-pr-candidate-dependencies-failed")}}}const he={async list(t,r,a){const e=Q("gh",["pr","list","--repo",t,"--state","all","--head",r,"--json","number,state,headRefName,headRefOid,baseRefName,url","--limit","100"],{encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:262144});return JSON.parse(e)},async create(t,r,a,e,s){Q("gh",["pr","create","--repo",t,"--head",r,"--base",a,"--title",e,"--body-file",s],{encoding:"utf8",timeout:3e4,stdio:["ignore","pipe","pipe"],maxBuffer:16*1024})}},F={async view(t,r){const a=Q("gh",["pr","view",String(r),"--repo",t,"--json","number,state,headRefName,headRefOid,baseRefName,baseRefOid,isDraft,mergeable,mergeCommit,statusCheckRollup,url"],{encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:262144});return JSON.parse(a)},async merge(t,r,a){Q("gh",["api","--method","PUT",`repos/${t}/pulls/${r}/merge`,"-f",`sha=${a}`,"-f","merge_method=merge"],{encoding:"utf8",timeout:3e4,stdio:["ignore","pipe","pipe"],maxBuffer:16*1024})}};async function rr(t){if(!t.authorize)return n("legacy-story-pr-authorization-required");let r;try{if(W(t.bodyFile).isSymbolicLink())return n("legacy-story-pr-body-unsafe");const l=E(t.bodyFile,32*1024);if(!l.trim()||l.includes("\0"))return n("legacy-story-pr-body-unsafe");r=l}catch{return n("legacy-story-pr-body-unsafe")}const a=be(t);if(!a.ok)return a;try{await de(a.value,t.projectRoot,t.verifyQa)}catch{return n("legacy-story-pr-checkpoint-qa-failed")}const e=t.provider??he,s=`legacy-c10-${re(16).toString("hex")}`,o=await se(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:s,idempotencyKey:s,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!o.ok)return n(o.reasonCode);try{const l=be(t);if(!l.ok||JSON.stringify(l.value)!==JSON.stringify(a.value))return n("legacy-story-pr-pre-effect-race");const p=await e.list(a.value.repository,a.value.branch,a.value.baseBranch);let y=Se(a.value,p);const i=y!==null;if(!y){const c=be(t);if(!c.ok||JSON.stringify(c.value)!==JSON.stringify(a.value))return n("legacy-story-pr-pre-effect-race");if(!await kt(t.projectRoot,a.value))return n("legacy-story-pr-create-attempt-unresolved");const b=wt(A($t(),"legacy-story-pr-body-")),w=A(b,"body.md");try{Nt(w,r,{flag:"wx",mode:384}),await e.create(a.value.repository,a.value.branch,a.value.baseBranch,`[YOLO] Story ${a.value.storyId}`,w)}finally{try{At(w)}catch{}It(b)}const f=be(t);if(!f.ok||JSON.stringify(f.value)!==JSON.stringify(a.value))return n("legacy-story-pr-post-effect-race");if(y=Se(a.value,await e.list(a.value.repository,a.value.branch,a.value.baseBranch)),!y)return n("legacy-story-pr-readback-unavailable")}const d=be(t);return!d.ok||JSON.stringify(d.value)!==JSON.stringify(a.value)?n("legacy-story-pr-post-effect-race"):{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-pr-provider-receipt",storyId:a.value.storyId,epicId:a.value.epicId,repository:a.value.repository,branch:a.value.branch,baseBranch:a.value.baseBranch,headSha:a.value.headSha,number:y.number,url:y.url,reused:i,checkpointAccepted:!1,publicSafe:!0})}}catch(l){const p=l instanceof Error?l.message:"";return n(p.startsWith("legacy-story-pr-")?p:"legacy-story-pr-provider-unavailable")}finally{await oe(o.path,o.owner).catch(()=>{})}}function h(t){return Qe("sha256").update(t).digest("hex")}function Me(t,r,a){const e=v(t,"show","HEAD:.neocortex/state.json"),s=S(JSON.parse(e)),o=S(S(s?.stories)?.[r.storyId]);if(!o||o.status!=="synced"||o.last_step!==Z||!Array.isArray(o.steps_completed)||!o.steps_completed.includes(Z)||o.steps_completed.includes(ie)||o.pr_number!=null)throw new Error("legacy-story-pr-checkpoint-state-conflict");const l=o.steps_completed;o.status="pr-created",o.last_step=ie,o.steps_completed=[...l,ie],o.pr_number=a;const p=`${JSON.stringify(s,null,2)}
20
+ `,y=`docs/stories/${r.storyId}.story.md`,i=v(t,"show",`HEAD:${y}`),d=i.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!d)throw new Error("legacy-story-pr-checkpoint-frontmatter-invalid");const c=ae(d[1],{strict:!0,uniqueKeys:!0}),b=S(c.toJS()),w=["stepsCompleted","steps_completed"].filter(N=>c.has(N)),f=["lastStep","last_step"].filter(N=>c.has(N)),m=["prNumber","pr_number"].filter(N=>c.has(N)),u=["branchName","branch_name"].filter(N=>c.has(N));if(c.errors.length>0||c.get("id")!==r.storyId||(c.get("epic_id")??c.get("epic"))!==r.epicId||c.get("status")!=="synced"||w.length>1||f.length>1||m.length>1||u.length>1||c.has("currentStatus")&&c.get("currentStatus")!=="synced"||w.length===1&&(!Array.isArray(b?.[w[0]])||JSON.stringify(b?.[w[0]])!==JSON.stringify(l))||f.length===1&&b?.[f[0]]!==Z||u.length===1&&b?.[u[0]]!==r.branch||m.length===1&&b?.[m[0]]!=null)throw new Error("legacy-story-pr-checkpoint-frontmatter-conflict");c.set("status","pr-created"),c.has("currentStatus")&&c.set("currentStatus","pr-created"),c.set(w[0]??"stepsCompleted",[...w.length===1?b[w[0]]:l,ie]),c.set(f[0]??"lastStep",ie),c.set(m[0]??"prNumber",a);const I=`---
21
+ ${c.toString({lineWidth:0})}---
22
+ ${i.slice(d[0].length)}`;return{stateBefore:e,stateAfter:p,storyBefore:i,storyAfter:I,storyPath:y}}function Oe(t,r,a){const e=we({projectRoot:t,storyId:r.storyId},!0);if(!e.ok||JSON.stringify(e.value)!==JSON.stringify(r))throw new Error("legacy-story-pr-checkpoint-physical-drift");const s=E(A(t,".neocortex/state.json"),2*1024*1024),o=E(A(t,a.storyPath),2*1024*1024);if(![a.stateBefore,a.stateAfter].includes(s)||![a.storyBefore,a.storyAfter].includes(o))throw new Error("legacy-story-pr-checkpoint-preimage-conflict");if(v(t,"status","--porcelain=v1","-uall").split(`
23
+ `).filter(Boolean).some(p=>!p.startsWith(" M ")||![".neocortex/state.json",a.storyPath].includes(p.slice(3))))throw new Error("legacy-story-pr-checkpoint-worktree-dirty");return{stateCurrent:s,storyCurrent:o}}async function ve(t,r){const a=A(t,r);if(!H(a))return null;await P(a,t);const e=E(a,4096),s=S(JSON.parse(e));if(!s||s.schemaVersion!==1||s.kind!=="legacy-story-c10-acceptance-intent"||typeof s.qaDigest!="string"||!/^[a-f0-9]{64}$/.test(s.qaDigest))throw new Error("legacy-story-pr-checkpoint-journal-invalid");return s}async function tt(t,r,a){await L(t,r,`${JSON.stringify(a)}
24
+ `),await P(A(t,r),t)}async function ar(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0)return n("legacy-story-pr-checkpoint-number-invalid");const r=be(t);let a=null;if(r.ok)try{a=await de(r.value,t.projectRoot,t.verifyQa)}catch{return n("legacy-story-pr-checkpoint-qa-failed")}const e=`legacy-c10-accept-${re(16).toString("hex")}`,s=await se(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:e,idempotencyKey:e,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!s.ok)return n(s.reasonCode);try{const o=D(t.projectRoot),l=we(t,!0);if(!l.ok||r.ok&&JSON.stringify(l.value)!==JSON.stringify(r.value))return n("legacy-story-pr-checkpoint-plan-drift");const p=l.value,y=Me(o,p,t.prNumber),i=Oe(o,p,y),d=await T(await G(o),"legacy-story-pr-intents"),c=h(p.storyId),b=`${c}.c10.json`,w=`${c}.c10.accepted.json`,f=await ve(d,b),m=await ve(d,w);if(!f&&(!r.ok||!a||i.stateCurrent!==y.stateBefore||i.storyCurrent!==y.storyBefore))return n("legacy-story-pr-checkpoint-unjournaled-drift");if(m&&(!f||JSON.stringify(m)!==JSON.stringify(f)))return n("legacy-story-pr-checkpoint-accepted-conflict");const u=Se(p,await(t.provider??he).list(p.repository,p.branch,p.baseBranch));if(!u||u.number!==t.prNumber)return n("legacy-story-pr-checkpoint-provider-mismatch");const I={schemaVersion:1,kind:"legacy-story-c10-acceptance-intent",storyId:p.storyId,planDigest:h(JSON.stringify(p)),repository:p.repository,number:u.number,url:u.url,qaDigest:f?.qaDigest??a,stateBefore:h(y.stateBefore),stateAfter:h(y.stateAfter),storyBefore:h(y.storyBefore),storyAfter:h(y.storyAfter)};if(f&&JSON.stringify(f)!==JSON.stringify(I))return n("legacy-story-pr-checkpoint-journal-conflict");f||await tt(d,b,I);const N=Oe(o,p,y);if(m&&(N.stateCurrent!==y.stateAfter||N.storyCurrent!==y.storyAfter))return n("legacy-story-pr-checkpoint-accepted-physical-mismatch");N.stateCurrent===y.stateBefore&&(await Y(A(o,".neocortex"),"state.json",y.stateAfter,I.stateBefore),await t.afterStatePersist?.()),Oe(o,p,y).storyCurrent===y.storyBefore&&(await Y(A(o,"docs/stories"),`${p.storyId}.story.md`,y.storyAfter,I.storyBefore),await t.afterStoryPersist?.());const _=Oe(o,p,y);return _.stateCurrent!==y.stateAfter||_.storyCurrent!==y.storyAfter?n("legacy-story-pr-checkpoint-post-write-mismatch"):(m||await tt(d,w,I),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c10-checkpoint",storyId:p.storyId,epicId:p.epicId,branch:p.branch,repository:p.repository,number:u.number,url:u.url,headSha:p.headSha,stateSha256:I.stateAfter,storySha256:I.storyAfter,reused:!!m,checkpointAccepted:!0,localOnly:!0})})}catch(o){const l=o instanceof Error?o.message:"";return n(l.startsWith("legacy-story-pr-")?l:l.includes("secure-filesystem-cas-conflict")?"legacy-story-pr-checkpoint-write-raced":"legacy-story-pr-checkpoint-failed")}finally{await oe(s.path,s.owner).catch(()=>{})}}async function sr(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0)return n("legacy-story-pr-checkpoint-number-invalid");try{const r=D(t.projectRoot),a=we(t,!0);if(!a.ok)return a;const e=a.value,s=Me(r,e,t.prNumber),o=Oe(r,e,s);if(o.stateCurrent!==s.stateAfter||o.storyCurrent!==s.storyAfter)return n("legacy-story-pr-checkpoint-not-accepted");const l=await T(await G(r),"legacy-story-pr-intents"),p=h(e.storyId),y=await ve(l,`${p}.c10.json`),i=await ve(l,`${p}.c10.accepted.json`);if(!y||!i||JSON.stringify(y)!==JSON.stringify(i))return n("legacy-story-pr-checkpoint-not-accepted");const d=Se(e,await(t.provider??he).list(e.repository,e.branch,e.baseBranch));if(!d||d.number!==t.prNumber)return n("legacy-story-pr-checkpoint-provider-mismatch");const c={schemaVersion:1,kind:"legacy-story-c10-acceptance-intent",storyId:e.storyId,planDigest:h(JSON.stringify(e)),repository:e.repository,number:d.number,url:d.url,qaDigest:i.qaDigest,stateBefore:h(s.stateBefore),stateAfter:h(s.stateAfter),storyBefore:h(s.storyBefore),storyAfter:h(s.storyAfter)};return JSON.stringify(i)!==JSON.stringify(c)?n("legacy-story-pr-checkpoint-journal-conflict"):{ok:!0,value:Object.freeze({plan:e,receipt:Object.freeze({schemaVersion:1,kind:"legacy-story-c10-checkpoint",storyId:e.storyId,epicId:e.epicId,branch:e.branch,repository:e.repository,number:d.number,url:d.url,headSha:e.headSha,stateSha256:i.stateAfter,storySha256:i.storyAfter,reused:!0,checkpointAccepted:!0,localOnly:!0})})}}catch(r){const a=r instanceof Error?r.message:"";return n(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-checkpoint-read-failed")}}function Et(t,r){const a=v(t,"diff","--raw","-z",r.baseSha,r.headSha),e=v(t,"diff","--name-only","-z",r.baseSha,r.headSha).split("\0").filter(Boolean);if(e.length===0||e.length>256||e.some(s=>!rt(s)))throw new Error("legacy-story-pr-review-diff-invalid");return{diffSha256:h(a),changedPaths:Object.freeze(e)}}function rt(t){return t.length>0&&t.length<=240&&/^[A-Za-z0-9_.-]+(?:\/[A-Za-z0-9_.-]+)*$/.test(t)&&t.split("/").every(r=>r!=="."&&r!=="..")}function ke(t,r,a,e){const s=S(JSON.parse(r.stateAfter)),o=S(S(s?.stories)?.[t.storyId]);if(!o||o.status!=="pr-created"||o.last_step!==ie||o.pr_number!==a||o.review_request!=null||!Array.isArray(o.steps_completed)||!o.steps_completed.includes(ie)||o.steps_completed.includes(ne))throw new Error("legacy-story-pr-review-state-conflict");o.status="pr-reviewed",o.last_step=ne,o.steps_completed=[...o.steps_completed,ne],o.review_request={schemaVersion:1,kind:"git-pull-request",gitPullRequest:!0,prNumber:a,headSha:t.headSha,reviewEvidenceDigest:e};const l=`${JSON.stringify(s,null,2)}
25
+ `,p=r.storyAfter.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!p)throw new Error("legacy-story-pr-review-frontmatter-invalid");const y=ae(p[1],{strict:!0,uniqueKeys:!0}),i=S(y.toJS()),d=["stepsCompleted","steps_completed"].filter(f=>y.has(f)),c=["lastStep","last_step"].filter(f=>y.has(f)),b=i?.[d[0]];if(y.errors.length>0||y.get("id")!==t.storyId||(y.get("epic_id")??y.get("epic"))!==t.epicId||y.get("status")!=="pr-created"||d.length!==1||c.length!==1||y.has("currentStatus")&&y.get("currentStatus")!=="pr-created"||i?.[c[0]]!==ie||!Array.isArray(b)||!b.includes(ie))throw new Error("legacy-story-pr-review-frontmatter-conflict");y.set("status","pr-reviewed"),y.has("currentStatus")&&y.set("currentStatus","pr-reviewed"),y.set(d[0],[...b,ne]),y.set(c[0],ne);const w=`---
26
26
  ${y.toString({lineWidth:0})}---
27
- ${r.storyAfter.slice(l[0].length)}`;return{stateBefore:r.stateAfter,stateAfter:h,storyBefore:r.storyAfter,storyAfter:b,storyPath:r.storyPath}}async function pe(t){const r=E(t.projectRoot),a=le(t,!0);if(!a.ok)throw new Error(a.reasonCode);const e=a.value;if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0)throw new Error("legacy-story-pr-review-number-invalid");const o=Ee(r,e,t.prNumber),c=await W(await F(r),"legacy-story-pr-intents"),h=p(e.storyId),l=await fe(c,`${h}.c10.json`),y=await fe(c,`${h}.c10.accepted.json`);if(!l||!y||JSON.stringify(l)!==JSON.stringify(y))throw new Error("legacy-story-pr-review-c10-unaccepted");const s=de(e,await(t.provider??oe).list(e.repository,e.branch,e.baseBranch));if(!s||s.number!==t.prNumber)throw new Error("legacy-story-pr-review-provider-mismatch");const d={schemaVersion:1,kind:"legacy-story-c10-acceptance-intent",storyId:e.storyId,planDigest:p(JSON.stringify(e)),repository:e.repository,number:s.number,url:s.url,qaDigest:y.qaDigest,stateBefore:p(o.stateBefore),stateAfter:p(o.stateAfter),storyBefore:p(o.storyBefore),storyAfter:p(o.storyAfter)};if(JSON.stringify(y)!==JSON.stringify(d))throw new Error("legacy-story-pr-review-c10-journal-conflict");const n=mt(r,e),I=Object.freeze({schemaVersion:1,kind:"legacy-story-pr-review-plan",storyId:e.storyId,epicId:e.epicId,repository:e.repository,branch:e.branch,baseBranch:e.baseBranch,baseSha:e.baseSha,headSha:e.headSha,prNumber:t.prNumber,diffSha256:n.diffSha256,changedPaths:n.changedPaths,checkpointAccepted:!1,localOnly:!0});return{cwd:r,plan:e,c10:o,directory:c,reviewPlan:I}}function ne(t,r,a){const e=le({projectRoot:t,storyId:r.storyId},!0);if(!e.ok||JSON.stringify(e.value)!==JSON.stringify(r))throw new Error("legacy-story-pr-review-physical-drift");const o=B(N(t,".neocortex/state.json"),2*1024*1024),c=B(N(t,a.storyPath),2*1024*1024);if(![a.stateBefore,a.stateAfter].includes(o)||![a.storyBefore,a.storyAfter].includes(c))throw new Error("legacy-story-pr-review-preimage-conflict");if(w(t,"status","--porcelain=v1","-uall").split(`
28
- `).filter(Boolean).some(l=>!l.startsWith(" M ")||![".neocortex/state.json",a.storyPath].includes(l.slice(3))))throw new Error("legacy-story-pr-review-worktree-dirty");return{stateCurrent:o,storyCurrent:c}}function Te(t,r,a){if(!Array.isArray(a)||a.length<1||a.length>64)return!1;const e=new Set;return a.every(o=>{const c=m(o);if(!c||Object.keys(c).sort().join(",")!=="disposition,id,path,sha256"||typeof c.id!="string"||!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$/.test(c.id)||e.has(c.id)||typeof c.path!="string"||!Fe(c.path)||typeof c.sha256!="string"||!/^[a-f0-9]{64}$/.test(c.sha256)||c.disposition!=="passed"&&c.disposition!=="not-applicable")return!1;e.add(c.id);try{return p(w(t,"show",`${r}:${c.path}`))===c.sha256}catch{return!1}})}function Ne(t,r){if(Buffer.byteLength(t)>32*1024)throw new Error("legacy-story-pr-review-report-unsafe");const a=m(JSON.parse(t)),e=r.reviewPlan;if(!a||Object.keys(a).sort().join(",")!==["acceptanceEvidence","baseSha","blockingFindings","diffSha256","epicId","headSha","kind","nonBlockingFindings","prNumber","remoteObservations","schemaVersion","sddEvidence","storyId","verdict"].sort().join(",")||a.schemaVersion!==1||a.kind!=="legacy-story-pr-review"||a.storyId!==e.storyId||a.epicId!==e.epicId||a.prNumber!==e.prNumber||a.headSha!==e.headSha||a.baseSha!==e.baseSha||a.diffSha256!==e.diffSha256||a.verdict!=="approved"||!Array.isArray(a.blockingFindings)||a.blockingFindings.length!==0||!Array.isArray(a.nonBlockingFindings)||a.nonBlockingFindings.length!==0||!Array.isArray(a.remoteObservations)||a.remoteObservations.length!==0||!Te(r.cwd,e.headSha,a.acceptanceEvidence)||!Te(r.cwd,e.headSha,a.sddEvidence))throw new Error("legacy-story-pr-review-report-invalid");return{report:a,raw:t,sha256:p(t)}}function Ge(t,r){if(Z(t).isSymbolicLink())throw new Error("legacy-story-pr-review-report-unsafe");return Ne(B(t,32*1024),r)}async function ae(t,r){const a=N(t,r);if(!D(a))return null;await J(a,t);const e=m(JSON.parse(B(a,64*1024)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c11-acceptance-intent"||typeof e.reviewSha256!="string"||!/^[a-f0-9]{64}$/.test(e.reviewSha256)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256)||typeof e.reviewRaw!="string"||p(e.reviewRaw)!==e.reviewSha256)throw new Error("legacy-story-pr-review-journal-invalid");return e}async function Qe(t,r,a){await z(t,r,`${JSON.stringify(a)}
29
- `),await J(N(t,r),t)}async function Kt(t){try{const r=await pe(t),a=ne(r.cwd,r.plan,Ae(r.plan,r.c10,t.prNumber,"0".repeat(64)));return a.stateCurrent!==r.c10.stateAfter||a.storyCurrent!==r.c10.storyAfter?i("legacy-story-pr-review-already-transitioned"):{ok:!0,value:r.reviewPlan}}catch(r){const a=r instanceof Error?r.message:"";return i(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-review-plan-failed")}}async function Zt(t){if(!t.authorize)return i("legacy-story-pr-review-authorization-required");let r,a,e=null;try{r=await pe(t),a=Ge(t.reportFile,r);const h=Ae(r.plan,r.c10,t.prNumber,a.sha256),l=ne(r.cwd,r.plan,h);if(l.stateCurrent===r.c10.stateAfter&&l.storyCurrent===r.c10.storyAfter)try{e=await se(r.plan,r.cwd,t.verifyQa)}catch{throw new Error("legacy-story-pr-review-qa-failed")}}catch(h){const l=h instanceof Error?h.message:"";return i(l.startsWith("legacy-story-pr-")?l:"legacy-story-pr-review-preflight-failed")}const o=`legacy-c11-accept-${U(16).toString("hex")}`,c=await ee(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:o,idempotencyKey:o,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!c.ok)return i(c.reasonCode);try{const h=await pe(t);if(JSON.stringify(h.reviewPlan)!==JSON.stringify(r.reviewPlan))return i("legacy-story-pr-review-plan-drift");const l=Ge(t.reportFile,h);if(l.sha256!==a.sha256)return i("legacy-story-pr-review-report-drift");const y=Ae(h.plan,h.c10,t.prNumber,l.sha256),s=ne(h.cwd,h.plan,y),d=p(h.plan.storyId),n=`${d}.c11.json`,I=`${d}.c11.accepted.json`,b=await ae(h.directory,n),f=await ae(h.directory,I);if(!b&&(!e||s.stateCurrent!==y.stateBefore||s.storyCurrent!==y.storyBefore))return i("legacy-story-pr-review-unjournaled-drift");if(f&&(!b||JSON.stringify(f)!==JSON.stringify(b)))return i("legacy-story-pr-review-accepted-conflict");const k={schemaVersion:1,kind:"legacy-story-c11-acceptance-intent",storyId:h.plan.storyId,planDigest:p(JSON.stringify(h.reviewPlan)),prNumber:t.prNumber,reviewSha256:l.sha256,qaSha256:b?.qaSha256??e,reviewRaw:l.raw,stateBefore:p(y.stateBefore),stateAfter:p(y.stateAfter),storyBefore:p(y.storyBefore),storyAfter:p(y.storyAfter)};if(b&&JSON.stringify(b)!==JSON.stringify(k))return i("legacy-story-pr-review-journal-conflict");b||await Qe(h.directory,n,k);const g=ne(h.cwd,h.plan,y);if(f&&(g.stateCurrent!==y.stateAfter||g.storyCurrent!==y.storyAfter))return i("legacy-story-pr-review-accepted-physical-mismatch");g.stateCurrent===y.stateBefore&&(await G(N(h.cwd,".neocortex"),"state.json",y.stateAfter,k.stateBefore),await t.afterStatePersist?.()),ne(h.cwd,h.plan,y).storyCurrent===y.storyBefore&&(await G(N(h.cwd,"docs/stories"),`${h.plan.storyId}.story.md`,y.storyAfter,k.storyBefore),await t.afterStoryPersist?.());const A=ne(h.cwd,h.plan,y);return A.stateCurrent!==y.stateAfter||A.storyCurrent!==y.storyAfter?i("legacy-story-pr-review-post-write-mismatch"):(f||await Qe(h.directory,I,k),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c11-checkpoint",storyId:h.plan.storyId,epicId:h.plan.epicId,branch:h.plan.branch,prNumber:t.prNumber,headSha:h.plan.headSha,reviewSha256:k.reviewSha256,qaSha256:k.qaSha256,stateSha256:k.stateAfter,storySha256:k.storyAfter,reused:!!f,checkpointAccepted:!0,localOnly:!0})})}catch(h){const l=h instanceof Error?h.message:"";return i(l.startsWith("legacy-story-pr-")?l:l.includes("secure-filesystem-cas-conflict")?"legacy-story-pr-review-write-raced":"legacy-story-pr-review-accept-failed")}finally{await te(c.path,c.owner).catch(()=>{})}}async function St(t){try{const r=await pe(t),a=p(r.plan.storyId),e=await ae(r.directory,`${a}.c11.json`),o=await ae(r.directory,`${a}.c11.accepted.json`);if(!e||!o||JSON.stringify(e)!==JSON.stringify(o))return i("legacy-story-pr-review-not-accepted");const c=Ne(o.reviewRaw,r),h=Ae(r.plan,r.c10,t.prNumber,c.sha256),l={schemaVersion:1,kind:"legacy-story-c11-acceptance-intent",storyId:r.plan.storyId,planDigest:p(JSON.stringify(r.reviewPlan)),prNumber:t.prNumber,reviewSha256:c.sha256,qaSha256:o.qaSha256,reviewRaw:c.raw,stateBefore:p(h.stateBefore),stateAfter:p(h.stateAfter),storyBefore:p(h.storyBefore),storyAfter:p(h.storyAfter)};if(JSON.stringify(o)!==JSON.stringify(l))return i("legacy-story-pr-review-journal-conflict");const y=ne(r.cwd,r.plan,h);return y.stateCurrent!==h.stateAfter||y.storyCurrent!==h.storyAfter?i("legacy-story-pr-review-physical-not-accepted"):{ok:!0,value:Object.freeze({plan:r.reviewPlan,receipt:Object.freeze({schemaVersion:1,kind:"legacy-story-c11-checkpoint",storyId:r.plan.storyId,epicId:r.plan.epicId,branch:r.plan.branch,prNumber:t.prNumber,headSha:r.plan.headSha,reviewSha256:o.reviewSha256,qaSha256:o.qaSha256,stateSha256:o.stateAfter,storySha256:o.storyAfter,reused:!0,checkpointAccepted:!0,localOnly:!0})})}}catch(r){const a=r instanceof Error?r.message:"";return i(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-review-read-failed")}}function Ye(t,r,a){const e=o=>o.map(c=>`- ${c.id}: ${c.disposition}; ${c.path}; sha256:${c.sha256}`).join(`
27
+ ${r.storyAfter.slice(p[0].length)}`;return{stateBefore:r.stateAfter,stateAfter:l,storyBefore:r.storyAfter,storyAfter:w,storyPath:r.storyPath}}async function ue(t){const r=D(t.projectRoot),a=we(t,!0);if(!a.ok)throw new Error(a.reasonCode);const e=a.value;if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0)throw new Error("legacy-story-pr-review-number-invalid");const s=Me(r,e,t.prNumber),o=await T(await G(r),"legacy-story-pr-intents"),l=h(e.storyId),p=await ve(o,`${l}.c10.json`),y=await ve(o,`${l}.c10.accepted.json`);if(!p||!y||JSON.stringify(p)!==JSON.stringify(y))throw new Error("legacy-story-pr-review-c10-unaccepted");const i=Se(e,await(t.provider??he).list(e.repository,e.branch,e.baseBranch));if(!i||i.number!==t.prNumber)throw new Error("legacy-story-pr-review-provider-mismatch");const d={schemaVersion:1,kind:"legacy-story-c10-acceptance-intent",storyId:e.storyId,planDigest:h(JSON.stringify(e)),repository:e.repository,number:i.number,url:i.url,qaDigest:y.qaDigest,stateBefore:h(s.stateBefore),stateAfter:h(s.stateAfter),storyBefore:h(s.storyBefore),storyAfter:h(s.storyAfter)};if(JSON.stringify(y)!==JSON.stringify(d))throw new Error("legacy-story-pr-review-c10-journal-conflict");const c=Et(r,e),b=Object.freeze({schemaVersion:1,kind:"legacy-story-pr-review-plan",storyId:e.storyId,epicId:e.epicId,repository:e.repository,branch:e.branch,baseBranch:e.baseBranch,baseSha:e.baseSha,headSha:e.headSha,prNumber:t.prNumber,diffSha256:c.diffSha256,changedPaths:c.changedPaths,checkpointAccepted:!1,localOnly:!0});return{cwd:r,plan:e,c10:s,directory:o,reviewPlan:b}}function le(t,r,a){const e=we({projectRoot:t,storyId:r.storyId},!0);if(!e.ok||JSON.stringify(e.value)!==JSON.stringify(r))throw new Error("legacy-story-pr-review-physical-drift");const s=E(A(t,".neocortex/state.json"),2*1024*1024),o=E(A(t,a.storyPath),2*1024*1024);if(![a.stateBefore,a.stateAfter].includes(s)||![a.storyBefore,a.storyAfter].includes(o))throw new Error("legacy-story-pr-review-preimage-conflict");if(v(t,"status","--porcelain=v1","-uall").split(`
28
+ `).filter(Boolean).some(p=>!p.startsWith(" M ")||![".neocortex/state.json",a.storyPath].includes(p.slice(3))))throw new Error("legacy-story-pr-review-worktree-dirty");return{stateCurrent:s,storyCurrent:o}}function at(t,r,a){if(!Array.isArray(a)||a.length<1||a.length>64)return!1;const e=new Set;return a.every(s=>{const o=S(s);if(!o||Object.keys(o).sort().join(",")!=="disposition,id,path,sha256"||typeof o.id!="string"||!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$/.test(o.id)||e.has(o.id)||typeof o.path!="string"||!rt(o.path)||typeof o.sha256!="string"||!/^[a-f0-9]{64}$/.test(o.sha256)||o.disposition!=="passed"&&o.disposition!=="not-applicable")return!1;e.add(o.id);try{return h(v(t,"show",`${r}:${o.path}`))===o.sha256}catch{return!1}})}function Bt(t,r){if(!Array.isArray(r)||r.length>16)return!1;const a=new Map([["documentation-gap","update-docs"],["test-gap","add-regression-test"],["minor-maintainability","simplify-code"]]),e=new Set;return r.every(s=>{const o=S(s);if(!o||Object.keys(o).sort().join(",")!=="actionCode,id,path,reasonCode,severity,sha256"||typeof o.id!="string"||!/^F[1-9][0-9]{0,2}$/.test(o.id)||e.has(o.id)||o.severity!=="P3"||typeof o.reasonCode!="string"||o.actionCode!==a.get(o.reasonCode)||typeof o.path!="string"||!t.reviewPlan.changedPaths.includes(o.path)||typeof o.sha256!="string"||!/^[a-f0-9]{64}$/.test(o.sha256))return!1;e.add(o.id);try{return h(v(t.cwd,"show",`${t.reviewPlan.headSha}:${o.path}`))===o.sha256}catch{return!1}})}function Ee(t,r){if(Buffer.byteLength(t)>32*1024)throw new Error("legacy-story-pr-review-report-unsafe");const a=S(JSON.parse(t)),e=r.reviewPlan;if(!a||Object.keys(a).sort().join(",")!==["acceptanceEvidence","baseSha","blockingFindings","diffSha256","epicId","headSha","kind","nonBlockingFindings","prNumber","remoteObservations","schemaVersion","sddEvidence","storyId","verdict"].sort().join(",")||a.schemaVersion!==1||a.kind!=="legacy-story-pr-review"||a.storyId!==e.storyId||a.epicId!==e.epicId||a.prNumber!==e.prNumber||a.headSha!==e.headSha||a.baseSha!==e.baseSha||a.diffSha256!==e.diffSha256||a.verdict!=="approved"||!Array.isArray(a.blockingFindings)||a.blockingFindings.length!==0||!Bt(r,a.nonBlockingFindings)||!Array.isArray(a.remoteObservations)||a.remoteObservations.length>1||a.remoteObservations.some(s=>{const o=S(s);return!o||!Array.isArray(o.reasonCodes)||o.reasonCodes.length===0||_e(s,e.storyId,e.prNumber)===null})||!at(r.cwd,e.headSha,a.acceptanceEvidence)||!at(r.cwd,e.headSha,a.sddEvidence))throw new Error("legacy-story-pr-review-report-invalid");return{report:a,raw:t,sha256:h(t)}}function st(t,r){if(W(t).isSymbolicLink())throw new Error("legacy-story-pr-review-report-unsafe");return Ee(E(t,32*1024),r)}async function ot(t,r){const a=await r.view(t.plan.repository,t.reviewPlan.prNumber),e=t.reviewPlan;if(a.number!==e.prNumber||a.state!=="OPEN"||a.headRefName!==e.branch||a.headRefOid!==e.headSha||a.baseRefName!==e.baseBranch||a.baseRefOid!==e.baseSha||a.url.toLowerCase()!==`https://github.com/${e.repository}/pull/${e.prNumber}`.toLowerCase())throw new Error("legacy-story-pr-review-remote-provider-mismatch");const s=fe(a.statusCheckRollup);if(!s.ok)throw new Error("legacy-story-pr-review-remote-observation-unclassified");return s.value}async function it(t,r,a){if(r.remoteObservations.length===0)return;const e=await ot(t,a);if(JSON.stringify(e)!==JSON.stringify(r.remoteObservations[0]))throw new Error("legacy-story-pr-review-remote-observation-drift")}async function or(t){try{const r=await ue(t),a=le(r.cwd,r.plan,ke(r.plan,r.c10,t.prNumber,"0".repeat(64)));if(a.stateCurrent!==r.c10.stateAfter||a.storyCurrent!==r.c10.storyAfter)return n("legacy-story-pr-review-already-transitioned");const e=await ot(r,t.mergeProvider??F);return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c11-remote-observation",storyId:r.plan.storyId,prNumber:t.prNumber,observation:e,checkpointAccepted:!1,mergeAuthorized:!1,publicSafe:!0})}}catch(r){const a=r instanceof Error?r.message:"";return n(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-review-remote-observe-failed")}}async function ce(t,r){const a=A(t,r);if(!H(a))return null;await P(a,t);const e=S(JSON.parse(E(a,64*1024)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c11-acceptance-intent"||typeof e.reviewSha256!="string"||!/^[a-f0-9]{64}$/.test(e.reviewSha256)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256)||typeof e.reviewRaw!="string"||h(e.reviewRaw)!==e.reviewSha256)throw new Error("legacy-story-pr-review-journal-invalid");return e}async function nt(t,r,a){await L(t,r,`${JSON.stringify(a)}
29
+ `),await P(A(t,r),t)}async function ir(t){try{const r=await ue(t),a=le(r.cwd,r.plan,ke(r.plan,r.c10,t.prNumber,"0".repeat(64)));return a.stateCurrent!==r.c10.stateAfter||a.storyCurrent!==r.c10.storyAfter?n("legacy-story-pr-review-already-transitioned"):{ok:!0,value:r.reviewPlan}}catch(r){const a=r instanceof Error?r.message:"";return n(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-review-plan-failed")}}async function nr(t){if(!t.authorize)return n("legacy-story-pr-review-authorization-required");let r,a,e=null;try{r=await ue(t),a=st(t.reportFile,r),await it(r,a.report,t.mergeProvider??F);const l=ke(r.plan,r.c10,t.prNumber,a.sha256),p=le(r.cwd,r.plan,l);if(p.stateCurrent===r.c10.stateAfter&&p.storyCurrent===r.c10.storyAfter)try{e=await de(r.plan,r.cwd,t.verifyQa)}catch{throw new Error("legacy-story-pr-review-qa-failed")}}catch(l){const p=l instanceof Error?l.message:"";return n(p.startsWith("legacy-story-pr-")?p:"legacy-story-pr-review-preflight-failed")}const s=`legacy-c11-accept-${re(16).toString("hex")}`,o=await se(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:s,idempotencyKey:s,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!o.ok)return n(o.reasonCode);try{const l=await ue(t);if(JSON.stringify(l.reviewPlan)!==JSON.stringify(r.reviewPlan))return n("legacy-story-pr-review-plan-drift");const p=st(t.reportFile,l);if(p.sha256!==a.sha256)return n("legacy-story-pr-review-report-drift");await it(l,p.report,t.mergeProvider??F);const y=ke(l.plan,l.c10,t.prNumber,p.sha256),i=le(l.cwd,l.plan,y),d=h(l.plan.storyId),c=`${d}.c11.json`,b=`${d}.c11.accepted.json`,w=await ce(l.directory,c),f=await ce(l.directory,b);if(!w&&(!e||i.stateCurrent!==y.stateBefore||i.storyCurrent!==y.storyBefore))return n("legacy-story-pr-review-unjournaled-drift");if(f&&(!w||JSON.stringify(f)!==JSON.stringify(w)))return n("legacy-story-pr-review-accepted-conflict");const m={schemaVersion:1,kind:"legacy-story-c11-acceptance-intent",storyId:l.plan.storyId,planDigest:h(JSON.stringify(l.reviewPlan)),prNumber:t.prNumber,reviewSha256:p.sha256,qaSha256:w?.qaSha256??e,reviewRaw:p.raw,stateBefore:h(y.stateBefore),stateAfter:h(y.stateAfter),storyBefore:h(y.storyBefore),storyAfter:h(y.storyAfter)};if(w&&JSON.stringify(w)!==JSON.stringify(m))return n("legacy-story-pr-review-journal-conflict");w||await nt(l.directory,c,m);const u=le(l.cwd,l.plan,y);if(f&&(u.stateCurrent!==y.stateAfter||u.storyCurrent!==y.storyAfter))return n("legacy-story-pr-review-accepted-physical-mismatch");u.stateCurrent===y.stateBefore&&(await Y(A(l.cwd,".neocortex"),"state.json",y.stateAfter,m.stateBefore),await t.afterStatePersist?.()),le(l.cwd,l.plan,y).storyCurrent===y.storyBefore&&(await Y(A(l.cwd,"docs/stories"),`${l.plan.storyId}.story.md`,y.storyAfter,m.storyBefore),await t.afterStoryPersist?.());const N=le(l.cwd,l.plan,y);return N.stateCurrent!==y.stateAfter||N.storyCurrent!==y.storyAfter?n("legacy-story-pr-review-post-write-mismatch"):(f||await nt(l.directory,b,m),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c11-checkpoint",storyId:l.plan.storyId,epicId:l.plan.epicId,branch:l.plan.branch,prNumber:t.prNumber,headSha:l.plan.headSha,reviewSha256:m.reviewSha256,qaSha256:m.qaSha256,stateSha256:m.stateAfter,storySha256:m.storyAfter,reused:!!f,checkpointAccepted:!0,localOnly:!0})})}catch(l){const p=l instanceof Error?l.message:"";return n(p.startsWith("legacy-story-pr-")?p:p.includes("secure-filesystem-cas-conflict")?"legacy-story-pr-review-write-raced":"legacy-story-pr-review-accept-failed")}finally{await oe(o.path,o.owner).catch(()=>{})}}async function xt(t){try{const r=await ue(t),a=h(r.plan.storyId),e=await ce(r.directory,`${a}.c11.json`),s=await ce(r.directory,`${a}.c11.accepted.json`);if(!e||!s||JSON.stringify(e)!==JSON.stringify(s))return n("legacy-story-pr-review-not-accepted");const o=Ee(s.reviewRaw,r),l=ke(r.plan,r.c10,t.prNumber,o.sha256),p={schemaVersion:1,kind:"legacy-story-c11-acceptance-intent",storyId:r.plan.storyId,planDigest:h(JSON.stringify(r.reviewPlan)),prNumber:t.prNumber,reviewSha256:o.sha256,qaSha256:s.qaSha256,reviewRaw:o.raw,stateBefore:h(l.stateBefore),stateAfter:h(l.stateAfter),storyBefore:h(l.storyBefore),storyAfter:h(l.storyAfter)};if(JSON.stringify(s)!==JSON.stringify(p))return n("legacy-story-pr-review-journal-conflict");const y=le(r.cwd,r.plan,l);return y.stateCurrent!==l.stateAfter||y.storyCurrent!==l.storyAfter?n("legacy-story-pr-review-physical-not-accepted"):{ok:!0,value:Object.freeze({plan:r.reviewPlan,receipt:Object.freeze({schemaVersion:1,kind:"legacy-story-c11-checkpoint",storyId:r.plan.storyId,epicId:r.plan.epicId,branch:r.plan.branch,prNumber:t.prNumber,headSha:r.plan.headSha,reviewSha256:s.reviewSha256,qaSha256:s.qaSha256,stateSha256:s.stateAfter,storySha256:s.storyAfter,reused:!0,checkpointAccepted:!0,localOnly:!0})})}}catch(r){const a=r instanceof Error?r.message:"";return n(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-review-read-failed")}}function ct(t,r,a){const e=o=>o.map(l=>`- ${l.id}: ${l.disposition}; ${l.path}; sha256:${l.sha256}`).join(`
30
+ `),s=t.nonBlockingFindings.length===0?"None.":t.nonBlockingFindings.map(o=>`- ${o.id}: ${o.severity}; ${o.reasonCode}; ${o.actionCode}; ${o.path}; sha256:${o.sha256}`).join(`
30
31
  `);return`# ${t.storyId} \u2014 PR review
31
32
 
32
33
  Verdict: approved
@@ -45,18 +46,25 @@ ${e(t.acceptanceEvidence)}
45
46
  ## SDD evidence
46
47
 
47
48
  ${e(t.sddEvidence)}
48
- `}async function wt(t){try{const r=await St(t);if(!r.ok)return r;const a=await pe(t),e=p(a.plan.storyId),o=await ae(a.directory,`${e}.c11.accepted.json`);if(!o||o.reviewSha256!==r.value.receipt.reviewSha256||o.qaSha256!==r.value.receipt.qaSha256)return i("legacy-story-pr-merge-review-drift");const c=Ne(o.reviewRaw,a),h=`.neocortex/stories/${a.plan.storyId}/review.md`;if(D(N(a.cwd,h)))return i("legacy-story-pr-merge-review-artifact-conflict");try{return u(a.cwd,"cat-file","-e",`${a.plan.headSha}:${h}`),i("legacy-story-pr-merge-review-artifact-conflict")}catch{}const l=Ye(c.report,o.reviewSha256,o.qaSha256);return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-pr-merge-plan",storyId:a.plan.storyId,epicId:a.plan.epicId,repository:a.plan.repository,branch:a.plan.branch,baseBranch:a.plan.baseBranch,baseSha:a.plan.baseSha,originalHeadSha:a.plan.headSha,prNumber:t.prNumber,reviewArtifactPath:h,reviewArtifactSha256:p(l),reviewSha256:o.reviewSha256,qaSha256:o.qaSha256,stateSha256:o.stateAfter,storySha256:o.storyAfter,nextAuthority:"root-review-commit-and-new-head-qa-required",physicalMerge:!1,localOnly:!0})}}catch(r){const a=r instanceof Error?r.message:"";return i(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-merge-plan-failed")}}async function be(t,r){const a=N(t,r);if(!D(a))return null;await J(a,t);const e=m(JSON.parse(B(a,64*1024))),o=m(e?.plan);if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-review-commit-intent"||!o||o.kind!=="legacy-story-pr-merge-plan"||typeof o.reviewArtifactSha256!="string"||typeof e.reviewArtifact!="string"||p(e.reviewArtifact)!==o.reviewArtifactSha256)throw new Error("legacy-story-pr-merge-intent-invalid");return e}async function ve(t,r){const a=N(t,r);if(!D(a))return null;await J(a,t);const e=m(JSON.parse(B(a,4096)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-prepared"||typeof e.intentSha256!="string"||!/^[a-f0-9]{64}$/.test(e.intentSha256)||typeof e.candidateHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.candidateHeadSha)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256))throw new Error("legacy-story-pr-merge-prepared-journal-invalid");return e}function bt(t,r){const a=[N(t,".neocortex"),N(t,".neocortex/stories"),N(t,".neocortex/stories",r)];for(const e of a)if(D(e)||st(e,{mode:448}),!Z(e).isDirectory()||E(e)!==e)throw new Error("legacy-story-pr-merge-review-directory-unsafe");return a[2]}function $e(t){return[".neocortex/state.json",`docs/stories/${t.storyId}.story.md`,t.reviewArtifactPath].sort()}function ke(t,r,a){const e=r.plan;if(u(t,"rev-parse",`${a}^`)!==e.originalHeadSha||u(t,"rev-list","--count",`${e.originalHeadSha}..${a}`)!=="1")throw new Error("legacy-story-pr-merge-candidate-parent-invalid");const o=w(t,"diff-tree","--no-commit-id","--name-only","-r","-z",a).split("\0").filter(Boolean).sort();if(JSON.stringify(o)!==JSON.stringify($e(e))||p(w(t,"show",`${a}:.neocortex/state.json`))!==e.stateSha256||p(w(t,"show",`${a}:docs/stories/${e.storyId}.story.md`))!==e.storySha256||p(w(t,"show",`${a}:${e.reviewArtifactPath}`))!==e.reviewArtifactSha256||!w(t,"log","-1","--format=%B",a).split(`
49
- `).map(c=>c.trim()).includes(`Neocortex-Legacy-Review: ${e.storyId}`))throw new Error("legacy-story-pr-merge-candidate-invalid")}function Oe(t,r,a,e){const o=r.plan;if(re(t)!==o.repository||u(t,"branch","--show-current")!==o.branch||R(t,o.baseBranch)!==o.baseSha||a.storyId!==o.storyId||a.reviewSha256!==o.reviewSha256||a.qaSha256!==o.qaSha256||a.stateAfter!==o.stateSha256||a.storyAfter!==o.storySha256)throw new Error("legacy-story-pr-merge-intent-drift");const c=u(t,"rev-parse","HEAD"),h=R(t,o.branch);if(c!==o.originalHeadSha&&ke(t,r,c),h!==o.originalHeadSha&&h!==c)throw new Error("legacy-story-pr-merge-remote-drift");const l={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:o.storyId,epicId:o.epicId,repository:o.repository,branch:o.branch,baseBranch:o.baseBranch,baseSha:o.baseSha,headSha:h,qaAuthority:"root-review-required",localOnly:!0},y=de(l,e);if(!y||y.number!==o.prNumber)throw new Error("legacy-story-pr-merge-provider-drift");const s=B(N(t,".neocortex/state.json"),2*1024*1024),d=B(N(t,`docs/stories/${o.storyId}.story.md`),2*1024*1024);if(p(s)!==o.stateSha256||p(d)!==o.storySha256)throw new Error("legacy-story-pr-merge-checkpoint-drift");const n=w(t,"status","--porcelain=v1","-uall").split(`
50
- `).filter(Boolean);if(c===o.originalHeadSha){const I=new Set($e(o));if(n.some(b=>!I.has(b.slice(3))||![" M","M ","MM","??","A "].includes(b.slice(0,2))))throw new Error("legacy-story-pr-merge-worktree-dirty")}else if(n.length>0)throw new Error("legacy-story-pr-merge-worktree-dirty");return{headSha:c,remoteSha:h}}async function Wt(t){if(!t.authorize)return i("legacy-story-pr-merge-authorization-required");if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-pr-merge-target-invalid");const r=`legacy-c12-prepare-${U(16).toString("hex")}`,a=await ee(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return i(a.reasonCode);try{const e=E(t.projectRoot),o=await W(await F(e),"legacy-story-pr-intents"),c=p(t.storyId),h=await ae(o,`${c}.c11.json`),l=await ae(o,`${c}.c11.accepted.json`);if(!h||!l||JSON.stringify(h)!==JSON.stringify(l))return i("legacy-story-pr-merge-review-unaccepted");const y=`${c}.c12.json`,s=`${c}.c12.prepared.json`;let d=await be(o,y);if(!d){const C=await wt(t);if(!C.ok)return C;const S=await pe(t),O=Ne(l.reviewRaw,S),j=Ye(O.report,l.reviewSha256,l.qaSha256);d={schemaVersion:1,kind:"legacy-story-c12-review-commit-intent",plan:C.value,reviewArtifact:j},await z(o,y,`${JSON.stringify(d)}
51
- `),await J(N(o,y),o)}const n=d.plan;if(n.storyId!==t.storyId||n.prNumber!==t.prNumber||p(d.reviewArtifact)!==n.reviewArtifactSha256)return i("legacy-story-pr-merge-intent-conflict");const I=t.provider??oe,b=async()=>Oe(e,d,l,await I.list(n.repository,n.branch,n.baseBranch));let f=await b();const k=p(JSON.stringify(d)),g=await ve(o,s);if(g)return g.intentSha256!==k||g.candidateHeadSha!==f.headSha||f.remoteSha!==f.headSha?i("legacy-story-pr-merge-prepared-conflict"):{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-prepared",storyId:n.storyId,epicId:n.epicId,branch:n.branch,prNumber:n.prNumber,originalHeadSha:n.originalHeadSha,candidateHeadSha:g.candidateHeadSha,qaSha256:g.qaSha256,reused:!0,physicalMerge:!1,localOnly:!0})};if(f.headSha===n.originalHeadSha){if(f.remoteSha!==n.originalHeadSha)return i("legacy-story-pr-merge-remote-drift");const C=bt(e,n.storyId),S=N(C,"review.md");if(D(S)){if(Z(S).isSymbolicLink()||B(S,32*1024)!==d.reviewArtifact)return i("legacy-story-pr-merge-review-artifact-conflict")}else await z(C,"review.md",d.reviewArtifact);f=await b(),u(e,"add","--",...$e(n));const O=w(e,"diff","--cached","--name-only","-z").split("\0").filter(Boolean).sort();if(JSON.stringify(O)!==JSON.stringify($e(n))||p(w(e,"show",":.neocortex/state.json"))!==n.stateSha256||p(w(e,"show",`:docs/stories/${n.storyId}.story.md`))!==n.storySha256||p(w(e,"show",`:${n.reviewArtifactPath}`))!==n.reviewArtifactSha256||w(e,"diff","--name-only","-z")!=="")return i("legacy-story-pr-merge-staged-scope-invalid");u(e,"diff","--cached","--check"),u(e,"commit","-m",`chore(story): record reviewed PR ${n.storyId}`,"-m",`Neocortex-Legacy-Review: ${n.storyId}`),f=await b(),await t.afterCommit?.()}if(f.headSha===n.originalHeadSha)return i("legacy-story-pr-merge-commit-missing");const $={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:n.storyId,epicId:n.epicId,repository:n.repository,branch:n.branch,baseBranch:n.baseBranch,headSha:f.headSha,baseSha:n.baseSha,qaAuthority:"root-review-required",localOnly:!0};let A;try{A=await se($,e,t.verifyQa)}catch{return i("legacy-story-pr-merge-new-head-qa-failed")}if(f=await b(),f.headSha===n.originalHeadSha)return i("legacy-story-pr-merge-candidate-raced");if(f.remoteSha===n.originalHeadSha&&u(e,"push","--porcelain","origin",`${f.headSha}:refs/heads/${n.branch}`),f=await b(),f.remoteSha!==f.headSha)return i("legacy-story-pr-merge-push-unverified");await t.afterPush?.();const v={schemaVersion:1,kind:"legacy-story-c12-prepared",intentSha256:k,candidateHeadSha:f.headSha,qaSha256:A};return await z(o,s,`${JSON.stringify(v)}
52
- `),await J(N(o,s),o),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-prepared",storyId:n.storyId,epicId:n.epicId,branch:n.branch,prNumber:n.prNumber,originalHeadSha:n.originalHeadSha,candidateHeadSha:f.headSha,qaSha256:A,reused:!1,physicalMerge:!1,localOnly:!0})}}catch(e){const o=e instanceof Error?e.message:"";return i(o.startsWith("legacy-story-pr-")?o:"legacy-story-pr-merge-prepare-failed")}finally{await te(a.path,a.owner).catch(()=>{})}}function vt(t,r,a){const e=m(t);return!e||JSON.stringify(Object.keys(e).sort())!==JSON.stringify(["baseSha","blockingChecks","canMerge","candidateHeadSha","epicId","followUpDebt","kind","nonBlockingChecks","prNumber","remoteObservationDigest","reviewSha256","schemaVersion","storyId"].sort())?!1:e.schemaVersion===1&&e.kind==="legacy-story-c12-root-merge-decision"&&e.storyId===r.storyId&&e.epicId===r.epicId&&e.prNumber===r.prNumber&&e.candidateHeadSha===a&&e.baseSha===r.baseSha&&e.reviewSha256===r.reviewSha256&&typeof e.remoteObservationDigest=="string"&&/^[a-f0-9]{64}$/.test(e.remoteObservationDigest)&&e.canMerge===!0&&Array.isArray(e.blockingChecks)&&e.blockingChecks.length===0&&Array.isArray(e.nonBlockingChecks)&&e.nonBlockingChecks.length===0&&Array.isArray(e.followUpDebt)&&e.followUpDebt.length===0}async function _e(t,r){const a=N(t,r);if(!D(a))return null;await J(a,t);const e=m(JSON.parse(B(a,4096)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-merge-attempt"||typeof e.intentSha256!="string"||!/^[a-f0-9]{64}$/.test(e.intentSha256)||typeof e.candidateHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.candidateHeadSha)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256)||typeof e.remoteObservationDigest!="string"||!/^[a-f0-9]{64}$/.test(e.remoteObservationDigest))throw new Error("legacy-story-pr-merge-attempt-invalid");return e}async function xe(t,r){const a=N(t,r);if(!D(a))return null;await J(a,t);const e=m(JSON.parse(B(a,4096)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-merged"||typeof e.intentSha256!="string"||!/^[a-f0-9]{64}$/.test(e.intentSha256)||typeof e.candidateHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.candidateHeadSha)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256)||typeof e.remoteObservationDigest!="string"||!/^[a-f0-9]{64}$/.test(e.remoteObservationDigest)||typeof e.mergeCommitSha!="string"||!/^[a-f0-9]{40}$/.test(e.mergeCommitSha)||typeof e.baseHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.baseHeadSha))throw new Error("legacy-story-pr-merge-journal-invalid");return e}function ie(t,r,a,e){if(a.number!==t.prNumber||a.state!==e||a.headRefName!==t.branch||a.headRefOid!==r||a.baseRefName!==t.baseBranch||a.url.toLowerCase()!==`https://github.com/${t.repository}/pull/${t.prNumber}`.toLowerCase())throw new Error("legacy-story-pr-merge-provider-drift");if(e==="OPEN"&&(a.baseRefOid!==t.baseSha||a.isDraft!==!1||a.mergeable!=="MERGEABLE"))throw new Error("legacy-story-pr-merge-provider-not-ready")}function Ue(t){const r=qe(t.statusCheckRollup);if(!r.ok||r.value.reasonCodes.length>0)throw new Error("legacy-story-pr-merge-remote-observation-unclassified");return r.value}function It(t,r,a,e){const o=r.plan;ie(o,a.candidateHeadSha,e,"MERGED");const c=e.mergeCommit?.oid;if(!c||!/^[a-f0-9]{40}$/.test(c)||u(t,"rev-parse","HEAD")!==a.candidateHeadSha||w(t,"status","--porcelain=v1","-uall")!=="")throw new Error("legacy-story-pr-merge-physical-invalid");ke(t,r,a.candidateHeadSha),u(t,"fetch","--no-tags","origin",`refs/heads/${o.baseBranch}`);const h=u(t,"rev-parse","FETCH_HEAD");if(R(t,o.baseBranch)!==h||!/^[a-f0-9]{40}$/.test(h))throw new Error("legacy-story-pr-merge-base-readback-drift");const l=u(t,"rev-list","--parents","-n","1",c).split(" ");if(l.length!==3||l[0]!==c||l[1]!==o.baseSha||l[2]!==a.candidateHeadSha)throw new Error("legacy-story-pr-merge-commit-parent-invalid");return u(t,"merge-base","--is-ancestor",c,h),{mergeCommitSha:c,baseHeadSha:h}}async function Xe(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-pr-merge-target-invalid");try{const r=E(t.projectRoot),a=u(r,"rev-parse","--git-common-dir"),e=E(Ce(a)?a:N(r,a)),o=N(e,"neocortex-yoloop"),c=N(o,"legacy-story-pr-intents");if(!D(o)||!D(c))return i("legacy-story-pr-merge-not-prepared");if(!Z(o).isDirectory()||E(o)!==o)return i("legacy-story-pr-merge-runtime-unsafe");await ze(c,o);const h=p(t.storyId),l=await be(c,`${h}.c12.json`),y=await ve(c,`${h}.c12.prepared.json`),s=await ae(c,`${h}.c11.accepted.json`);if(!l||!y||!s)return i("legacy-story-pr-merge-not-prepared");const d=l.plan;if(d.storyId!==t.storyId||d.prNumber!==t.prNumber||y.intentSha256!==p(JSON.stringify(l))||s.reviewSha256!==d.reviewSha256||s.qaSha256!==d.qaSha256)return i("legacy-story-pr-merge-prepared-drift");const n=Oe(r,l,s,await(t.provider??oe).list(d.repository,d.branch,d.baseBranch));if(n.headSha!==y.candidateHeadSha||n.remoteSha!==y.candidateHeadSha)return i("legacy-story-pr-merge-remote-drift");ke(r,l,y.candidateHeadSha);const I=await(t.mergeProvider??Se).view(d.repository,d.prNumber);ie(d,y.candidateHeadSha,I,"OPEN");const b=qe(I.statusCheckRollup);if(!b.ok)return i("legacy-story-pr-merge-remote-observation-unclassified");const f=b.value;return f.reasonCodes.length>0?{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-remote-debt-required",storyId:d.storyId,epicId:d.epicId,prNumber:d.prNumber,candidateHeadSha:y.candidateHeadSha,baseSha:d.baseSha,reviewSha256:d.reviewSha256,remoteObservationDigest:f.digest,reasonCodes:f.reasonCodes,reasonCounts:f.reasonCounts,canMerge:!1,publicSafe:!0})}:{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-root-merge-decision",storyId:d.storyId,epicId:d.epicId,prNumber:d.prNumber,candidateHeadSha:y.candidateHeadSha,baseSha:d.baseSha,reviewSha256:d.reviewSha256,remoteObservationDigest:f.digest,canMerge:!0,blockingChecks:[],nonBlockingChecks:[],followUpDebt:[]})}}catch(r){const a=r instanceof Error?r.message:"";return i(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-merge-decision-uncertain")}}async function Ft(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-pr-merge-target-invalid");const r=await Xe(t);if(!r.ok)return i(r.reasonCode);if(r.value.canMerge)return i("legacy-story-pr-merge-remote-debt-not-required");const a=`legacy-c12-remote-debt-${U(16).toString("hex")}`,e=await ee(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:a,idempotencyKey:a,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!e.ok)return i(e.reasonCode);try{const o=await Xe(t);if(!o.ok)return i(o.reasonCode);if(o.value.canMerge)return i("legacy-story-pr-merge-remote-debt-not-required");if(JSON.stringify(o.value)!==JSON.stringify(r.value))return i("legacy-story-pr-merge-remote-debt-observation-drift");const c=o.value,h=E(t.projectRoot),l=await W(await F(h),"legacy-story-pr-intents"),y={schemaVersion:1,kind:"legacy-story-c12-remote-debt-observation",planSha256:p(JSON.stringify(c)),storyId:c.storyId,epicId:c.epicId,prNumber:c.prNumber,candidateHeadSha:c.candidateHeadSha,remoteObservationDigest:c.remoteObservationDigest,reasonCodes:c.reasonCodes,reasonCounts:c.reasonCounts},s=`${p(c.storyId)}.${c.candidateHeadSha}.${c.remoteObservationDigest}.c12.remote-debt.json`,d=N(l,s),n=D(d);if(n){await J(d,l);const I=m(JSON.parse(B(d,4096)));if(!I||JSON.stringify(I)!==JSON.stringify(y))return i("legacy-story-pr-merge-remote-debt-journal-conflict")}else await z(l,s,`${JSON.stringify(y)}
53
- `),await J(d,l);return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-remote-debt-journaled",storyId:c.storyId,epicId:c.epicId,prNumber:c.prNumber,candidateHeadSha:c.candidateHeadSha,remoteObservationDigest:c.remoteObservationDigest,reasonCodes:c.reasonCodes,reasonCounts:c.reasonCounts,reused:n,durableObservation:!0,registryRecorded:!1,canMerge:!1,publicSafe:!0})}}catch(o){const c=o instanceof Error?o.message:"";return i(c.startsWith("legacy-story-pr-")?c:"legacy-story-pr-merge-remote-debt-uncertain")}finally{await te(e.path,e.owner).catch(()=>{})}}async function Tt(t){if(!t.authorize)return i("legacy-story-pr-merge-authorization-required");if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-pr-merge-target-invalid");const r=`legacy-c12-merge-${U(16).toString("hex")}`,a=await ee(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return i(a.reasonCode);try{const e=E(t.projectRoot),o=await W(await F(e),"legacy-story-pr-intents"),c=p(t.storyId),h=await be(o,`${c}.c12.json`),l=await ve(o,`${c}.c12.prepared.json`),y=await ae(o,`${c}.c11.accepted.json`);if(!h||!l||!y)return i("legacy-story-pr-merge-not-prepared");const s=h.plan,d=p(JSON.stringify(h));if(s.storyId!==t.storyId||s.prNumber!==t.prNumber||l.intentSha256!==d||re(e)!==s.repository||u(e,"branch","--show-current")!==s.branch||u(e,"rev-parse","HEAD")!==l.candidateHeadSha||y.reviewSha256!==s.reviewSha256||y.qaSha256!==s.qaSha256||y.stateAfter!==s.stateSha256||y.storyAfter!==s.storySha256||p(B(N(e,".neocortex/state.json"),2*1024*1024))!==s.stateSha256||p(B(N(e,`docs/stories/${s.storyId}.story.md`),2*1024*1024))!==s.storySha256||w(e,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-pr-merge-prepared-drift");ke(e,h,l.candidateHeadSha);const n=`${c}.c12.merge-attempt.json`,I=`${c}.c12.merged.json`,b=await _e(o,n),f=await xe(o,I),k=t.mergeProvider??Se,g=t.rootDecision;if((!b||g)&&!vt(g,s,l.candidateHeadSha))return i("legacy-story-pr-merge-root-decision-required");if(b&&(b.intentSha256!==d||b.candidateHeadSha!==l.candidateHeadSha||g&&b.remoteObservationDigest!==g.remoteObservationDigest))return i("legacy-story-pr-merge-attempt-conflict");if(f&&(!b||f.intentSha256!==d||f.candidateHeadSha!==l.candidateHeadSha||f.qaSha256!==b.qaSha256||f.remoteObservationDigest!==b.remoteObservationDigest))return i("legacy-story-pr-merge-journal-conflict");if(!b){if(!g)return i("legacy-story-pr-merge-root-decision-required");const C=t.provider??oe,S=Oe(e,h,y,await C.list(s.repository,s.branch,s.baseBranch));if(S.headSha!==l.candidateHeadSha||S.remoteSha!==l.candidateHeadSha)return i("legacy-story-pr-merge-remote-drift");const O=await k.view(s.repository,s.prNumber);if(ie(s,l.candidateHeadSha,O,"OPEN"),Ue(O).digest!==g.remoteObservationDigest)return i("legacy-story-pr-merge-remote-observation-drift");const H={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:s.storyId,epicId:s.epicId,repository:s.repository,branch:s.branch,baseBranch:s.baseBranch,headSha:l.candidateHeadSha,baseSha:s.baseSha,qaAuthority:"root-review-required",localOnly:!0};let x;try{x=await se(H,e,t.verifyQa)}catch{return i("legacy-story-pr-merge-final-qa-failed")}const q=Oe(e,h,y,await C.list(s.repository,s.branch,s.baseBranch));if(q.headSha!==l.candidateHeadSha||q.remoteSha!==l.candidateHeadSha)return i("legacy-story-pr-merge-remote-drift");const L=await k.view(s.repository,s.prNumber);ie(s,l.candidateHeadSha,L,"OPEN");const _=Ue(L);if(_.digest!==g.remoteObservationDigest)return i("legacy-story-pr-merge-remote-observation-drift");const M={schemaVersion:1,kind:"legacy-story-c12-merge-attempt",intentSha256:d,candidateHeadSha:l.candidateHeadSha,qaSha256:x,remoteObservationDigest:_.digest};await z(o,n,`${JSON.stringify(M)}
54
- `),await J(N(o,n),o);try{await k.merge(s.repository,s.prNumber,l.candidateHeadSha)}catch{}await t.afterMerge?.()}const $=b??await _e(o,n);if(!$)return i("legacy-story-pr-merge-attempt-missing");const A=await k.view(s.repository,s.prNumber);if(A.state!=="MERGED")return i("legacy-story-pr-merge-effect-not-confirmed");const v=It(e,h,l,A);if(f){if(f.mergeCommitSha!==v.mergeCommitSha)return i("legacy-story-pr-merge-journal-conflict");u(e,"merge-base","--is-ancestor",f.baseHeadSha,v.baseHeadSha)}else{const C={...$,kind:"legacy-story-c12-merged",mergeCommitSha:v.mergeCommitSha,baseHeadSha:v.baseHeadSha};await z(o,I,`${JSON.stringify(C)}
55
- `),await J(N(o,I),o)}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-merged",storyId:s.storyId,epicId:s.epicId,prNumber:s.prNumber,branch:s.branch,candidateHeadSha:l.candidateHeadSha,mergeCommitSha:v.mergeCommitSha,baseHeadSha:v.baseHeadSha,qaSha256:$.qaSha256,remoteObservationDigest:$.remoteObservationDigest,reused:!!f,physicalMerge:!0,checkpointAccepted:!1,localOnly:!0})}}catch(e){const o=e instanceof Error?e.message:"";return i(o.startsWith("legacy-story-pr-")?o:"legacy-story-pr-merge-effect-uncertain")}finally{await te(a.path,a.owner).catch(()=>{})}}const et={async view(t,r){const a=K("gh",["issue","view",String(r),"--repo",t,"--json","number,title,state,url"],{encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:16384});return JSON.parse(a)},async close(t,r){K("gh",["issue","close",String(r),"--repo",t,"--reason","completed"],{encoding:"utf8",timeout:3e4,stdio:["ignore","pipe","pipe"],maxBuffer:16*1024})}};function tt(t,r,a){const e=w(t,"show",`${r.mergeCommitSha}:.neocortex/state.json`),o=`docs/stories/${r.storyId}.story.md`,c=w(t,"show",`${r.mergeCommitSha}:${o}`);if(p(e)!==r.stateSha256||p(c)!==r.storySha256)throw new Error("legacy-story-pr-post-merge-preimage-drift");const h=m(JSON.parse(e)),l=m(h?.stories),y=m(h?.epics),s=m(l?.[r.storyId]),d=m(y?.[r.epicId]),n=s?.steps_completed,I=d?.stories;if(!s||!d||d.id!==r.epicId||s.id!==r.storyId||s.epic_id!==r.epicId||s.status!=="pr-reviewed"||s.last_step!==Y||s.pr_number!==r.prNumber||s.issue_number!==r.issueNumber||s.branch_name!==`story/${r.epicId}/${r.storyId}`||!Array.isArray(n)||!n.includes(Y)||n.includes(ge)||!Array.isArray(I)||!I.includes(r.storyId)||new Set(I).size!==I.length||I.some(j=>typeof j!="string"||m(l?.[j])?.epic_id!==r.epicId))throw new Error("legacy-story-pr-post-merge-state-conflict");s.status="done",s.last_step=ge,s.steps_completed=[...n,ge],s.merged=!0,s.physicalMergeStatus="merged",s.merge_commit_sha=r.mergeCommitSha,s.issue_state="closed";const b=I.filter(j=>m(l?.[j])?.status==="done").length;if(d.total_stories=I.length,d.completed_stories=b,b===I.length)d.status="done",d.completed_at==null&&(d.completed_at=a);else if(d.status==="done")throw new Error("legacy-story-pr-post-merge-epic-conflict");const f=`${JSON.stringify(h,null,2)}
56
- `,k=c.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!k)throw new Error("legacy-story-pr-post-merge-frontmatter-invalid");const g=X(k[1],{strict:!0,uniqueKeys:!0}),$=m(g.toJS()),A=["stepsCompleted","steps_completed"].filter(j=>g.has(j)),v=["lastStep","last_step"].filter(j=>g.has(j)),C=["issueNumber","issue_number"].filter(j=>g.has(j)),S=["prNumber","pr_number"].filter(j=>g.has(j));if(g.errors.length>0||g.get("id")!==r.storyId||(g.get("epic_id")??g.get("epic"))!==r.epicId||g.get("status")!=="pr-reviewed"||g.has("currentStatus")&&g.get("currentStatus")!=="pr-reviewed"||A.length!==1||v.length!==1||C.length>1||S.length>1||JSON.stringify($?.[A[0]])!==JSON.stringify(n)||$?.[v[0]]!==Y||C.length===1&&$?.[C[0]]!==r.issueNumber||S.length===1&&$?.[S[0]]!==r.prNumber)throw new Error("legacy-story-pr-post-merge-frontmatter-conflict");g.set("status","done"),g.has("currentStatus")&&g.set("currentStatus","done"),g.set(A[0],[...n,ge]),g.set(v[0],ge),g.set("mergeCommitSha",r.mergeCommitSha),g.set("issueState","closed");const O=`---
57
- ${g.toString({lineWidth:0})}---
58
- ${c.slice(k[0].length)}`;return{stateBefore:e,stateAfter:f,storyBefore:c,storyAfter:O}}async function At(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-pr-post-merge-target-invalid");try{const r=E(t.projectRoot);if(E(u(r,"rev-parse","--show-toplevel"))!==r||w(r,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-pr-post-merge-checkout-invalid");const a=u(r,"rev-parse","--git-common-dir"),e=E(Ce(a)?a:N(r,a)),o=N(e,"neocortex-yoloop"),c=N(o,"legacy-story-pr-intents");if(!D(o)||!D(c))return i("legacy-story-pr-post-merge-not-journaled");if(!Z(o).isDirectory()||E(o)!==o)return i("legacy-story-pr-post-merge-runtime-unsafe");await ze(c,o);const h=p(t.storyId),l=await be(c,`${h}.c12.json`),y=await ve(c,`${h}.c12.prepared.json`),s=await _e(c,`${h}.c12.merge-attempt.json`),d=await xe(c,`${h}.c12.merged.json`);if(!l||!y||!s||!d)return i("legacy-story-pr-post-merge-not-journaled");const n=l.plan;if(n.storyId!==t.storyId||n.prNumber!==t.prNumber||y.intentSha256!==p(JSON.stringify(l))||s.intentSha256!==y.intentSha256||d.intentSha256!==s.intentSha256||s.candidateHeadSha!==y.candidateHeadSha||d.candidateHeadSha!==s.candidateHeadSha||d.qaSha256!==s.qaSha256||d.remoteObservationDigest!==s.remoteObservationDigest||re(r)!==n.repository||u(r,"branch","--show-current")!==n.baseBranch)return i("legacy-story-pr-post-merge-journal-drift");const I=u(r,"rev-parse","HEAD");if(I!==d.mergeCommitSha||R(r,n.baseBranch)!==I)return i("legacy-story-pr-post-merge-base-drift");const b=await(t.mergeProvider??Se).view(n.repository,n.prNumber);if(ie(n,y.candidateHeadSha,b,"MERGED"),b.mergeCommit?.oid!==d.mergeCommitSha)return i("legacy-story-pr-post-merge-provider-drift");const f=u(r,"rev-list","--parents","-n","1",I).split(" ");if(f.length!==3||f[0]!==I||f[1]!==n.baseSha||f[2]!==y.candidateHeadSha)return i("legacy-story-pr-post-merge-parents-invalid");const k=w(r,"show","HEAD:.neocortex/state.json"),g=`docs/stories/${n.storyId}.story.md`,$=w(r,"show",`HEAD:${g}`);if(p(k)!==n.stateSha256||p($)!==n.storySha256||B(N(r,".neocortex/state.json"),2*1024*1024)!==k||B(N(r,g),2*1024*1024)!==$)return i("legacy-story-pr-post-merge-content-drift");const A=m(JSON.parse(k)),v=m(m(A?.stories)?.[n.storyId]),C=v?.issue_number;if(!v||v.id!==n.storyId||v.epic_id!==n.epicId||v.status!=="pr-reviewed"||v.last_step!==Y||v.pr_number!==n.prNumber||v.branch_name!==n.branch||!Array.isArray(v.steps_completed)||!v.steps_completed.includes(Y)||!Number.isSafeInteger(C)||C<=0)return i("legacy-story-pr-post-merge-state-invalid");const S=$.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!S)return i("legacy-story-pr-post-merge-frontmatter-invalid");const O=X(S[1],{strict:!0,uniqueKeys:!0});if(O.errors.length>0||O.get("id")!==n.storyId||(O.get("epic_id")??O.get("epic"))!==n.epicId||O.get("status")!=="pr-reviewed")return i("legacy-story-pr-post-merge-frontmatter-invalid");const j=await(t.issueProvider??et).view(n.repository,C);return j.number!==C||j.state!=="OPEN"||j.title!==`[YOLO] Story ${n.storyId} - Workflow Run`||j.url.toLowerCase()!==`https://github.com/${n.repository}/issues/${C}`.toLowerCase()?i("legacy-story-pr-post-merge-issue-invalid"):{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-post-merge-plan",storyId:n.storyId,epicId:n.epicId,repository:n.repository,baseBranch:n.baseBranch,prNumber:n.prNumber,issueNumber:C,candidateHeadSha:y.candidateHeadSha,mergeCommitSha:d.mergeCommitSha,stateSha256:n.stateSha256,storySha256:n.storySha256,nextAuthority:"root-state-checkpoint-and-issue-closure-required",checkpointAccepted:!1,localOnly:!0})}}catch(r){const a=r instanceof Error?r.message:"";return i(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-post-merge-physical-unavailable")}}async function Nt(t,r){const a=N(t,r);if(!D(a))return null;await J(a,t);const e=m(JSON.parse(B(a,8192))),o=m(e?.plan);if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-post-merge-intent"||!o||o.schemaVersion!==1||o.kind!=="legacy-story-c12-post-merge-plan"||typeof e.nowIso!="string"||!Number.isFinite(Date.parse(e.nowIso))||typeof e.stateAfterSha256!="string"||!/^[a-f0-9]{64}$/.test(e.stateAfterSha256)||typeof e.storyAfterSha256!="string"||!/^[a-f0-9]{64}$/.test(e.storyAfterSha256))throw new Error("legacy-story-pr-post-merge-intent-invalid");return e}async function $t(t,r){const a=N(t,r);if(!D(a))return null;await J(a,t);const e=m(JSON.parse(B(a,4096)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-post-merge-accepted"||typeof e.intentSha256!="string"||!/^[a-f0-9]{64}$/.test(e.intentSha256)||typeof e.checkpointHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.checkpointHeadSha)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256))throw new Error("legacy-story-pr-post-merge-accepted-invalid");return e}async function Gt(t){if(!t.authorize)return i("legacy-story-pr-post-merge-authorization-required");if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return i("legacy-story-pr-post-merge-target-invalid");const r=`legacy-c12-post-merge-${U(16).toString("hex")}`,a=await ee(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return i(a.reasonCode);try{const e=E(t.projectRoot);if(E(u(e,"rev-parse","--show-toplevel"))!==e)return i("legacy-story-pr-post-merge-checkout-invalid");const o=await W(await F(e),"legacy-story-pr-intents"),c=p(t.storyId),h=`${c}.c12.post-merge.json`,l=`${c}.c12.post-merge.accepted.json`;let y=await Nt(o,h);if(!y){const P=await At(t);if(!P.ok)return P;const De=new Date().toISOString(),He=tt(e,P.value,De);y={schemaVersion:1,kind:"legacy-story-c12-post-merge-intent",plan:P.value,nowIso:De,stateAfterSha256:p(He.stateAfter),storyAfterSha256:p(He.storyAfter)},await z(o,h,`${JSON.stringify(y)}
59
- `),await J(N(o,h),o)}const s=y.plan,d=await be(o,`${c}.c12.json`),n=await ve(o,`${c}.c12.prepared.json`),I=await _e(o,`${c}.c12.merge-attempt.json`),b=await xe(o,`${c}.c12.merged.json`);if(!d||!n||!I||!b||s.storyId!==t.storyId||s.prNumber!==t.prNumber||s.repository!==d.plan.repository||s.epicId!==d.plan.epicId||s.baseBranch!==d.plan.baseBranch||s.candidateHeadSha!==n.candidateHeadSha||s.mergeCommitSha!==b.mergeCommitSha||s.stateSha256!==d.plan.stateSha256||s.storySha256!==d.plan.storySha256||n.intentSha256!==p(JSON.stringify(d))||I.intentSha256!==n.intentSha256||b.intentSha256!==I.intentSha256||b.qaSha256!==I.qaSha256||b.remoteObservationDigest!==I.remoteObservationDigest||re(e)!==s.repository||u(e,"branch","--show-current")!==s.baseBranch)return i("legacy-story-pr-post-merge-intent-drift");const f=tt(e,s,y.nowIso);if(p(f.stateAfter)!==y.stateAfterSha256||p(f.storyAfter)!==y.storyAfterSha256)return i("legacy-story-pr-post-merge-projection-drift");const k=await(t.mergeProvider??Se).view(s.repository,s.prNumber);if(ie(d.plan,n.candidateHeadSha,k,"MERGED"),k.mergeCommit?.oid!==s.mergeCommitSha)return i("legacy-story-pr-post-merge-provider-drift");const g=u(e,"rev-list","--parents","-n","1",s.mergeCommitSha).split(" ");if(g.length!==3||g[0]!==s.mergeCommitSha||g[1]!==d.plan.baseSha||g[2]!==s.candidateHeadSha)return i("legacy-story-pr-post-merge-parents-invalid");const $=await $t(o,l),A=p(JSON.stringify(y));if($&&$.intentSha256!==A)return i("legacy-story-pr-post-merge-accepted-conflict");const v=u(e,"rev-parse","HEAD");let C=R(e,s.baseBranch);if(w(e,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-pr-post-merge-base-worktree-dirty");const S=N(o,`${c}.c12.post-merge.checkout`);if(D(S)||K("git",["worktree","add","--detach",S,$?.checkpointHeadSha??s.mergeCommitSha],{cwd:e,encoding:"utf8",timeout:6e4,stdio:["ignore","pipe","pipe"],maxBuffer:32*1024}),!Z(S).isDirectory()||E(S)!==S||E(u(S,"rev-parse","--show-toplevel"))!==S||Ie(S)!==Ie(e)||u(S,"branch","--show-current")!=="")return i("legacy-story-pr-post-merge-candidate-checkout-invalid");let O=u(S,"rev-parse","HEAD");if(O!==s.mergeCommitSha&&(u(S,"rev-parse",`${O}^`)!==s.mergeCommitSha||JSON.stringify(w(S,"diff-tree","--no-commit-id","--name-only","-r","-z",O).split("\0").filter(Boolean).sort())!==JSON.stringify([".neocortex/state.json",`docs/stories/${s.storyId}.story.md`].sort())||p(w(S,"show",`${O}:.neocortex/state.json`))!==y.stateAfterSha256||p(w(S,"show",`${O}:docs/stories/${s.storyId}.story.md`))!==y.storyAfterSha256||!w(S,"log","-1","--format=%B",O).split(`
60
- `).map(P=>P.trim()).includes(`Neocortex-Legacy-Merge: ${s.storyId}`)))return i("legacy-story-pr-post-merge-checkpoint-commit-invalid");if(![s.mergeCommitSha,O].includes(v)||![s.mergeCommitSha,O].includes(C)||$&&($.checkpointHeadSha!==O||C!==O))return i("legacy-story-pr-post-merge-base-drift");const j=w(S,"status","--porcelain=v1","-uall").split(`
61
- `).filter(Boolean),H=new Set([".neocortex/state.json",`docs/stories/${s.storyId}.story.md`]);if(O!==s.mergeCommitSha&&j.length>0||j.some(P=>!H.has(P.slice(3))||![" M","M ","MM"].includes(P.slice(0,2))))return i("legacy-story-pr-post-merge-worktree-dirty");const x=B(N(S,".neocortex/state.json"),2*1024*1024),q=B(N(S,`docs/stories/${s.storyId}.story.md`),2*1024*1024);if(![f.stateBefore,f.stateAfter].includes(x)||![f.storyBefore,f.storyAfter].includes(q)||O!==s.mergeCommitSha&&(x!==f.stateAfter||q!==f.storyAfter))return i("legacy-story-pr-post-merge-content-drift");const L=t.issueProvider??et,_=async()=>{const P=await L.view(s.repository,s.issueNumber);if(P.number!==s.issueNumber||P.title!==`[YOLO] Story ${s.storyId} - Workflow Run`||P.url.toLowerCase()!==`https://github.com/${s.repository}/issues/${s.issueNumber}`.toLowerCase()||!["OPEN","CLOSED"].includes(P.state))throw new Error("legacy-story-pr-post-merge-issue-invalid");return P.state};if($&&await _()!=="CLOSED")return i("legacy-story-pr-post-merge-accepted-issue-drift");if(!$&&v===s.mergeCommitSha&&C===s.mergeCommitSha){if(j.length>0)return i("legacy-story-pr-post-merge-pre-issue-drift");const P={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:s.storyId,epicId:s.epicId,repository:s.repository,branch:s.baseBranch,baseBranch:s.baseBranch,headSha:s.mergeCommitSha,baseSha:d.plan.baseSha,qaAuthority:"root-review-required",localOnly:!0};try{await se(P,e,t.verifyQa)}catch{return i("legacy-story-pr-post-merge-pre-issue-qa-failed")}if(u(e,"rev-parse","HEAD")!==s.mergeCommitSha||R(e,s.baseBranch)!==s.mergeCommitSha||w(e,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-pr-post-merge-pre-issue-drift")}if(O===s.mergeCommitSha){if(x===f.stateBefore&&await G(N(S,".neocortex"),"state.json",f.stateAfter,p(f.stateBefore)),q===f.storyBefore&&await G(N(S,"docs/stories"),`${s.storyId}.story.md`,f.storyAfter,p(f.storyBefore)),B(N(S,".neocortex/state.json"),2*1024*1024)!==f.stateAfter||B(N(S,`docs/stories/${s.storyId}.story.md`),2*1024*1024)!==f.storyAfter)return i("legacy-story-pr-post-merge-write-drift");u(S,"add","--",".neocortex/state.json",`docs/stories/${s.storyId}.story.md`);const P=w(S,"diff","--cached","--name-only","-z").split("\0").filter(Boolean).sort();if(JSON.stringify(P)!==JSON.stringify([...H].sort())||w(S,"diff","--name-only","-z")!=="")return i("legacy-story-pr-post-merge-staged-scope-invalid");u(S,"diff","--cached","--check"),u(S,"commit","-m",`chore(story): accept merged PR ${s.storyId}`,"-m",`Neocortex-Legacy-Merge: ${s.storyId}`),O=u(S,"rev-parse","HEAD"),await t.afterCommit?.()}if(w(S,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-pr-post-merge-worktree-dirty");const M={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:s.storyId,epicId:s.epicId,repository:s.repository,branch:s.baseBranch,baseBranch:s.baseBranch,headSha:O,baseSha:s.mergeCommitSha,qaAuthority:"root-review-required",localOnly:!0};let ce=$?.qaSha256;if(!ce){if(!t.verifyQa)try{Ze(S)}catch(P){return i(P instanceof Error&&P.message.endsWith("-missing")?"legacy-story-pr-post-merge-dependencies-missing":"legacy-story-pr-post-merge-dependencies-failed")}try{ce=await se(M,S,t.verifyQa)}catch{return i("legacy-story-pr-post-merge-qa-failed")}}if(u(S,"rev-parse","HEAD")!==O||w(S,"status","--porcelain=v1","-uall")!==""||u(e,"rev-parse","HEAD")!==v||w(e,"status","--porcelain=v1","-uall")!=="")return i("legacy-story-pr-post-merge-final-drift");if(await _()==="OPEN"){if(R(e,s.baseBranch)!==s.mergeCommitSha)return i("legacy-story-pr-post-merge-pre-issue-drift");await L.close(s.repository,s.issueNumber),await t.afterIssueClose?.()}if(await _()!=="CLOSED")return i("legacy-story-pr-post-merge-issue-not-closed");const ue=await(t.mergeProvider??Se).view(s.repository,s.prNumber);if(ie(d.plan,n.candidateHeadSha,ue,"MERGED"),ue.mergeCommit?.oid!==s.mergeCommitSha)return i("legacy-story-pr-post-merge-provider-drift");if(C=R(e,s.baseBranch),C===s.mergeCommitSha&&u(e,"push","--porcelain","origin",`${O}:refs/heads/${s.baseBranch}`),R(e,s.baseBranch)!==O)return i("legacy-story-pr-post-merge-push-unverified");if(await t.afterPush?.(),u(e,"rev-parse","HEAD")===s.mergeCommitSha&&u(e,"merge","--ff-only",O),u(e,"rev-parse","HEAD")!==O||w(e,"status","--porcelain=v1","-uall")!==""||B(N(e,".neocortex/state.json"),2*1024*1024)!==f.stateAfter||B(N(e,`docs/stories/${s.storyId}.story.md`),2*1024*1024)!==f.storyAfter)return i("legacy-story-pr-post-merge-base-readback-invalid");const Je={schemaVersion:1,kind:"legacy-story-c12-post-merge-accepted",intentSha256:A,checkpointHeadSha:O,qaSha256:ce};return $&&JSON.stringify($)!==JSON.stringify(Je)?i("legacy-story-pr-post-merge-accepted-conflict"):($||(await z(o,l,`${JSON.stringify(Je)}
62
- `),await J(N(o,l),o)),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-post-merge-accepted",storyId:s.storyId,epicId:s.epicId,prNumber:s.prNumber,issueNumber:s.issueNumber,mergeCommitSha:s.mergeCommitSha,checkpointHeadSha:O,qaSha256:ce,reused:!!$,physicalMerge:!0,issueClosed:!0,checkpointAccepted:!0,publicSafe:!0})})}catch(e){const o=e instanceof Error?e.message:"";return i(o.startsWith("legacy-story-pr-")?o:o.includes("secure-filesystem-cas-conflict")?"legacy-story-pr-post-merge-write-raced":"legacy-story-pr-post-merge-effect-uncertain")}finally{await te(a.path,a.owner).catch(()=>{})}}export{qt as acceptLegacyStoryCommitC08,Vt as acceptLegacyStoryPrC10,Gt as acceptLegacyStoryPrPostMergeC12,Zt as acceptLegacyStoryPrReviewC11,zt as acceptLegacyStorySyncC09,Lt as createLegacyStoryPr,Tt as mergeLegacyStoryPrC12,pt as planLegacyStoryCommitC08,he as planLegacyStoryPr,wt as planLegacyStoryPrMergeC12,Xe as planLegacyStoryPrMergeDecisionC12,At as planLegacyStoryPrPostMergeC12,Kt as planLegacyStoryPrReview,ut as planLegacyStorySyncC09,Wt as prepareLegacyStoryPrMergeC12,Mt as readAcceptedLegacyStoryPrC10,St as readAcceptedLegacyStoryPrReviewC11,Ft as recordLegacyStoryPrRemoteDebtC12};
49
+
50
+ ## Non-blocking review debt
51
+
52
+ ${s}
53
+ `}async function yt(t){try{const r=await xt(t);if(!r.ok)return r;const a=await ue(t),e=h(a.plan.storyId),s=await ce(a.directory,`${e}.c11.accepted.json`);if(!s||s.reviewSha256!==r.value.receipt.reviewSha256||s.qaSha256!==r.value.receipt.qaSha256)return n("legacy-story-pr-merge-review-drift");const o=Ee(s.reviewRaw,a),l=`.neocortex/stories/${a.plan.storyId}/review.md`;if(H(A(a.cwd,l)))return n("legacy-story-pr-merge-review-artifact-conflict");try{return g(a.cwd,"cat-file","-e",`${a.plan.headSha}:${l}`),n("legacy-story-pr-merge-review-artifact-conflict")}catch{}const p=ct(o.report,s.reviewSha256,s.qaSha256);return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-pr-merge-plan",storyId:a.plan.storyId,epicId:a.plan.epicId,repository:a.plan.repository,branch:a.plan.branch,baseBranch:a.plan.baseBranch,baseSha:a.plan.baseSha,originalHeadSha:a.plan.headSha,prNumber:t.prNumber,reviewArtifactPath:l,reviewArtifactSha256:h(p),reviewSha256:s.reviewSha256,qaSha256:s.qaSha256,stateSha256:s.stateAfter,storySha256:s.storyAfter,nextAuthority:"root-review-commit-and-new-head-qa-required",physicalMerge:!1,localOnly:!0})}}catch(r){const a=r instanceof Error?r.message:"";return n(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-merge-plan-failed")}}async function Ie(t,r){const a=A(t,r);if(!H(a))return null;await P(a,t);const e=S(JSON.parse(E(a,64*1024))),s=S(e?.plan);if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-review-commit-intent"||!s||s.kind!=="legacy-story-pr-merge-plan"||typeof s.reviewArtifactSha256!="string"||typeof e.reviewArtifact!="string"||h(e.reviewArtifact)!==s.reviewArtifactSha256)throw new Error("legacy-story-pr-merge-intent-invalid");if(e.remoteDebt!==void 0){const o=S(e.remoteDebt),l=S(o?.observation);if(!o||Object.keys(o).sort().join(",")!==["added","itemIds","observation","observedAt","registryAfterSha256","registryBeforeSha256","registryExisted"].sort().join(",")||!l||o.registryExisted!==!0||typeof o.observedAt!="string"||!Number.isFinite(Date.parse(o.observedAt))||new Date(o.observedAt).toISOString()!==o.observedAt||typeof o.registryBeforeSha256!="string"||!/^[a-f0-9]{64}$/.test(o.registryBeforeSha256)||typeof o.registryAfterSha256!="string"||!/^[a-f0-9]{64}$/.test(o.registryAfterSha256)||!Number.isSafeInteger(o.added)||o.added<0||!Array.isArray(o.itemIds)||o.itemIds.some(p=>typeof p!="string"))throw new Error("legacy-story-pr-merge-intent-invalid")}return e}async function Ae(t,r){const a=A(t,r);if(!H(a))return null;await P(a,t);const e=S(JSON.parse(E(a,4096)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-prepared"||typeof e.intentSha256!="string"||!/^[a-f0-9]{64}$/.test(e.intentSha256)||typeof e.candidateHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.candidateHeadSha)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256))throw new Error("legacy-story-pr-merge-prepared-journal-invalid");return e}function Dt(t,r){const a=[A(t,".neocortex"),A(t,".neocortex/stories"),A(t,".neocortex/stories",r)];for(const e of a)if(H(e)||St(e,{mode:448}),!W(e).isDirectory()||D(e)!==e)throw new Error("legacy-story-pr-merge-review-directory-unsafe");return a[2]}const pe=".neocortex/tech-debt-registry.json",Jt='{"schema_version":2,"items":[]}';function We(t,r){const a=v(t,"ls-tree",r,"--",pe).trim();if(!a)return{existed:!1,raw:Jt};if(!/^100644 blob [a-f0-9]{40}\t\.neocortex\/tech-debt-registry\.json$/.test(a))throw new Error("legacy-story-pr-merge-remote-debt-registry-unsafe");return{existed:!0,raw:v(t,"show",`${r}:${pe}`)}}function Be(t,r){const a=r.remoteDebt;if(!a)return null;const e=We(t,r.plan.originalHeadSha);if(!e.existed||h(e.raw)!==a.registryBeforeSha256)throw new Error("legacy-story-pr-merge-remote-debt-registry-drift");const s=Re({registryRaw:e.raw,observation:a.observation,storyId:r.plan.storyId,prNumber:r.plan.prNumber,nowIso:a.observedAt});if(!s||s.registryAfterSha256!==a.registryAfterSha256||s.added!==a.added||JSON.stringify(s.itemIds)!==JSON.stringify(a.itemIds)||a.observation.reasonCodes.length===0)throw new Error("legacy-story-pr-merge-remote-debt-intent-invalid");return s}function xe(t){const r=t.plan;return[".neocortex/state.json",`docs/stories/${r.storyId}.story.md`,r.reviewArtifactPath,...t.remoteDebt?.added?[pe]:[]].sort()}function De(t,r,a){const e=r.plan;if(g(t,"rev-parse",`${a}^`)!==e.originalHeadSha||g(t,"rev-list","--count",`${e.originalHeadSha}..${a}`)!=="1")throw new Error("legacy-story-pr-merge-candidate-parent-invalid");const s=v(t,"diff-tree","--no-commit-id","--name-only","-r","-z",a).split("\0").filter(Boolean).sort(),o=Be(t,r);if(JSON.stringify(s)!==JSON.stringify(xe(r))||h(v(t,"show",`${a}:.neocortex/state.json`))!==e.stateSha256||h(v(t,"show",`${a}:docs/stories/${e.storyId}.story.md`))!==e.storySha256||h(v(t,"show",`${a}:${e.reviewArtifactPath}`))!==e.reviewArtifactSha256||o&&h(v(t,"show",`${a}:${pe}`))!==o.registryAfterSha256||!v(t,"log","-1","--format=%B",a).split(`
54
+ `).map(l=>l.trim()).includes(`Neocortex-Legacy-Review: ${e.storyId}`))throw new Error("legacy-story-pr-merge-candidate-invalid")}function Je(t,r,a,e){const s=r.plan;if(X(t)!==s.repository||g(t,"branch","--show-current")!==s.branch||z(t,s.baseBranch)!==s.baseSha||a.storyId!==s.storyId||a.reviewSha256!==s.reviewSha256||a.qaSha256!==s.qaSha256||a.stateAfter!==s.stateSha256||a.storyAfter!==s.storySha256)throw new Error("legacy-story-pr-merge-intent-drift");const o=g(t,"rev-parse","HEAD"),l=z(t,s.branch);if(o!==s.originalHeadSha&&De(t,r,o),l!==s.originalHeadSha&&l!==o)throw new Error("legacy-story-pr-merge-remote-drift");const p={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:s.storyId,epicId:s.epicId,repository:s.repository,branch:s.branch,baseBranch:s.baseBranch,baseSha:s.baseSha,headSha:l,qaAuthority:"root-review-required",localOnly:!0},y=Se(p,e);if(!y||y.number!==s.prNumber)throw new Error("legacy-story-pr-merge-provider-drift");const i=E(A(t,".neocortex/state.json"),2*1024*1024),d=E(A(t,`docs/stories/${s.storyId}.story.md`),2*1024*1024);if(h(i)!==s.stateSha256||h(d)!==s.storySha256)throw new Error("legacy-story-pr-merge-checkpoint-drift");const c=Be(t,r);if(c){const w=A(t,pe),m=H(w)?h(E(w,2*1024*1024)):null;if(o===s.originalHeadSha?m!==c.registryBeforeSha256&&m!==c.registryAfterSha256:m!==c.registryAfterSha256)throw new Error("legacy-story-pr-merge-remote-debt-registry-drift")}const b=v(t,"status","--porcelain=v1","-uall").split(`
55
+ `).filter(Boolean);if(o===s.originalHeadSha){const w=new Set(xe(r));if(b.some(f=>!w.has(f.slice(3))||![" M","M ","MM","??","A "].includes(f.slice(0,2))))throw new Error("legacy-story-pr-merge-worktree-dirty")}else if(b.length>0)throw new Error("legacy-story-pr-merge-worktree-dirty");return{headSha:o,remoteSha:l}}async function cr(t){if(!t.authorize)return n("legacy-story-pr-merge-authorization-required");if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-pr-merge-target-invalid");const r=`legacy-c12-prepare-${re(16).toString("hex")}`,a=await se(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return n(a.reasonCode);try{const e=D(t.projectRoot),s=await T(await G(e),"legacy-story-pr-intents"),o=h(t.storyId),l=await ce(s,`${o}.c11.json`),p=await ce(s,`${o}.c11.accepted.json`);if(!l||!p||JSON.stringify(l)!==JSON.stringify(p))return n("legacy-story-pr-merge-review-unaccepted");const y=`${o}.c12.json`,i=`${o}.c12.prepared.json`;let d=await Ie(s,y);if(!d){const _=await yt(t);if(!_.ok)return _;const $=await ue(t),k=Ee(p.reviewRaw,$),j=ct(k.report,p.reviewSha256,p.qaSha256);let B;if(t.recordRemoteDebt){const x=_.value,J=await(t.mergeProvider??F).view(x.repository,x.prNumber);ee(x,x.originalHeadSha,J,"OPEN");const R=fe(J.statusCheckRollup);if(!R.ok)return n("legacy-story-pr-merge-remote-observation-unclassified");if(R.value.reasonCodes.length===0)return n("legacy-story-pr-merge-remote-debt-not-required");const C=We(e,x.originalHeadSha);if(!C.existed)return n("legacy-story-pr-merge-remote-debt-registry-missing");const V=A(e,pe);if((H(V)?E(V,2*1024*1024):null)!==C.raw)return n("legacy-story-pr-merge-remote-debt-registry-drift");const K=new Date().toISOString(),M=Re({registryRaw:C.raw,observation:R.value,storyId:x.storyId,prNumber:x.prNumber,nowIso:K});if(!M)return n("legacy-story-pr-merge-remote-debt-registry-invalid");B={observation:R.value,observedAt:K,registryExisted:C.existed,registryBeforeSha256:M.registryBeforeSha256,registryAfterSha256:M.registryAfterSha256,added:M.added,itemIds:M.itemIds}}d={schemaVersion:1,kind:"legacy-story-c12-review-commit-intent",plan:_.value,reviewArtifact:j,...B?{remoteDebt:B}:{}},await L(s,y,`${JSON.stringify(d)}
56
+ `),await P(A(s,y),s)}const c=d.plan;if(c.storyId!==t.storyId||c.prNumber!==t.prNumber||h(d.reviewArtifact)!==c.reviewArtifactSha256||!!d.remoteDebt!=!!t.recordRemoteDebt)return n("legacy-story-pr-merge-intent-conflict");const b=t.provider??he,w=async()=>Je(e,d,p,await b.list(c.repository,c.branch,c.baseBranch));let f=await w();const m=h(JSON.stringify(d)),u=await Ae(s,i);if(u)return u.intentSha256!==m||u.candidateHeadSha!==f.headSha||f.remoteSha!==f.headSha?n("legacy-story-pr-merge-prepared-conflict"):{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-prepared",storyId:c.storyId,epicId:c.epicId,branch:c.branch,prNumber:c.prNumber,originalHeadSha:c.originalHeadSha,candidateHeadSha:u.candidateHeadSha,qaSha256:u.qaSha256,registryRecorded:!!d.remoteDebt,reused:!0,physicalMerge:!1,localOnly:!0})};if(f.headSha===c.originalHeadSha){if(f.remoteSha!==c.originalHeadSha)return n("legacy-story-pr-merge-remote-drift");const _=Be(e,d);if(_){const B=await(t.mergeProvider??F).view(c.repository,c.prNumber);ee(c,c.originalHeadSha,B,"OPEN");const x=fe(B.statusCheckRollup);if(!x.ok||x.value.digest!==d.remoteDebt.observation.digest||JSON.stringify(x.value)!==JSON.stringify(d.remoteDebt.observation))return n("legacy-story-pr-merge-remote-debt-observation-drift");if(_.added>0){const J=A(e,pe),R=H(J)?E(J,2*1024*1024):null;if(R!==_.registryAfterRaw)if(R===We(e,c.originalHeadSha).raw){const C=A(e,".neocortex");if(!W(C).isDirectory()||D(C)!==C)return n("legacy-story-pr-merge-remote-debt-registry-unsafe");await Y(C,"tech-debt-registry.json",_.registryAfterRaw,_.registryBeforeSha256)}else return n("legacy-story-pr-merge-remote-debt-registry-drift")}}const $=Dt(e,c.storyId),k=A($,"review.md");if(H(k)){if(W(k).isSymbolicLink()||E(k,32*1024)!==d.reviewArtifact)return n("legacy-story-pr-merge-review-artifact-conflict")}else await L($,"review.md",d.reviewArtifact);f=await w(),g(e,"add","--",...xe(d));const j=v(e,"diff","--cached","--name-only","-z").split("\0").filter(Boolean).sort();if(JSON.stringify(j)!==JSON.stringify(xe(d))||h(v(e,"show",":.neocortex/state.json"))!==c.stateSha256||h(v(e,"show",`:docs/stories/${c.storyId}.story.md`))!==c.storySha256||h(v(e,"show",`:${c.reviewArtifactPath}`))!==c.reviewArtifactSha256||_&&h(v(e,"show",`:${pe}`))!==_.registryAfterSha256||v(e,"diff","--name-only","-z")!=="")return n("legacy-story-pr-merge-staged-scope-invalid");g(e,"diff","--cached","--check"),g(e,"commit","-m",`chore(story): record reviewed PR ${c.storyId}`,"-m",`Neocortex-Legacy-Review: ${c.storyId}`),f=await w(),await t.afterCommit?.()}if(f.headSha===c.originalHeadSha)return n("legacy-story-pr-merge-commit-missing");const I={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:c.storyId,epicId:c.epicId,repository:c.repository,branch:c.branch,baseBranch:c.baseBranch,headSha:f.headSha,baseSha:c.baseSha,qaAuthority:"root-review-required",localOnly:!0};let N;try{N=await de(I,e,t.verifyQa)}catch{return n("legacy-story-pr-merge-new-head-qa-failed")}if(f=await w(),f.headSha===c.originalHeadSha)return n("legacy-story-pr-merge-candidate-raced");if(f.remoteSha===c.originalHeadSha&&g(e,"push","--porcelain","origin",`${f.headSha}:refs/heads/${c.branch}`),f=await w(),f.remoteSha!==f.headSha)return n("legacy-story-pr-merge-push-unverified");await t.afterPush?.();const O={schemaVersion:1,kind:"legacy-story-c12-prepared",intentSha256:m,candidateHeadSha:f.headSha,qaSha256:N};return await L(s,i,`${JSON.stringify(O)}
57
+ `),await P(A(s,i),s),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-prepared",storyId:c.storyId,epicId:c.epicId,branch:c.branch,prNumber:c.prNumber,originalHeadSha:c.originalHeadSha,candidateHeadSha:f.headSha,qaSha256:N,registryRecorded:!!d.remoteDebt,reused:!1,physicalMerge:!1,localOnly:!0})}}catch(e){const s=e instanceof Error?e.message:"";return n(s.startsWith("legacy-story-pr-")?s:"legacy-story-pr-merge-prepare-failed")}finally{await oe(a.path,a.owner).catch(()=>{})}}async function yr(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0)return n("legacy-story-pr-merge-target-invalid");const r=await yt(t);if(!r.ok)return r;try{const a=r.value,e=await(t.mergeProvider??F).view(a.repository,a.prNumber);ee(a,a.originalHeadSha,e,"OPEN");const s=fe(e.statusCheckRollup);if(!s.ok)return n("legacy-story-pr-merge-remote-observation-unclassified");const o=_e(s.value,a.storyId,a.prNumber);if(!o)return n("legacy-story-pr-merge-remote-debt-projection-invalid");if(o.length===0)return n("legacy-story-pr-merge-remote-debt-not-required");const l=A(D(t.projectRoot),".neocortex/tech-debt-registry.json"),p=H(l),y=p?E(l,2*1024*1024):'{"schema_version":2,"items":[]}',i=Re({registryRaw:y,observation:s.value,storyId:a.storyId,prNumber:a.prNumber,nowIso:new Date().toISOString()});return i?{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-pre-prepare-debt-plan",storyId:a.storyId,epicId:a.epicId,prNumber:a.prNumber,originalHeadSha:a.originalHeadSha,baseSha:a.baseSha,remoteObservationDigest:s.value.digest,reasonCodes:s.value.reasonCodes,followUpDebt:o,registryExists:p,registryBeforeSha256:i.registryBeforeSha256,registryProjectedItemIds:i.itemIds,registryProjectedAdded:i.added,registryProjectedExisting:i.existing,registryMutationAuthorized:!1,canMerge:!1,publicSafe:!0})}:n("legacy-story-pr-merge-remote-debt-registry-invalid")}catch(a){const e=a instanceof Error?a.message:"";return n(e.startsWith("legacy-story-pr-")?e:"legacy-story-pr-merge-pre-prepare-debt-uncertain")}}function dt(t,r,a,e,s){const o=_e(a,t.storyId,t.prNumber);return!o||o.length===0?null:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-root-merge-decision",storyId:t.storyId,epicId:t.epicId,prNumber:t.prNumber,candidateHeadSha:r,baseSha:t.baseSha,reviewSha256:t.reviewSha256,remoteObservationDigest:a.digest,canMerge:!0,blockingChecks:[],nonBlockingChecks:Object.freeze(o.map(l=>Object.freeze({checkName:l.checkName,bucket:"nonBlockingChecks",reason:l.reason,origin:"remote_ci_cd",safeToContinueYoloop:!0}))),followUpDebt:o,registrySha256:e,registryItemIds:s,publicSafe:!0})}function Ht(t,r,a){const e=r.plan,s=S(t);if(s?.registrySha256!==void 0){const o=r.remoteDebt,l=o&&dt(e,a,o.observation,o.registryAfterSha256,o.itemIds);return!!l&&JSON.stringify(s)===JSON.stringify(l)}return!s||JSON.stringify(Object.keys(s).sort())!==JSON.stringify(["baseSha","blockingChecks","canMerge","candidateHeadSha","epicId","followUpDebt","kind","nonBlockingChecks","prNumber","remoteObservationDigest","reviewSha256","schemaVersion","storyId"].sort())?!1:s.schemaVersion===1&&s.kind==="legacy-story-c12-root-merge-decision"&&s.storyId===e.storyId&&s.epicId===e.epicId&&s.prNumber===e.prNumber&&s.candidateHeadSha===a&&s.baseSha===e.baseSha&&s.reviewSha256===e.reviewSha256&&typeof s.remoteObservationDigest=="string"&&/^[a-f0-9]{64}$/.test(s.remoteObservationDigest)&&s.canMerge===!0&&Array.isArray(s.blockingChecks)&&s.blockingChecks.length===0&&Array.isArray(s.nonBlockingChecks)&&s.nonBlockingChecks.length===0&&Array.isArray(s.followUpDebt)&&s.followUpDebt.length===0}async function Ce(t,r){const a=A(t,r);if(!H(a))return null;await P(a,t);const e=S(JSON.parse(E(a,4096)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-merge-attempt"||typeof e.intentSha256!="string"||!/^[a-f0-9]{64}$/.test(e.intentSha256)||typeof e.candidateHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.candidateHeadSha)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256)||typeof e.remoteObservationDigest!="string"||!/^[a-f0-9]{64}$/.test(e.remoteObservationDigest))throw new Error("legacy-story-pr-merge-attempt-invalid");return e}async function He(t,r){const a=A(t,r);if(!H(a))return null;await P(a,t);const e=S(JSON.parse(E(a,4096)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-merged"||typeof e.intentSha256!="string"||!/^[a-f0-9]{64}$/.test(e.intentSha256)||typeof e.candidateHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.candidateHeadSha)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256)||typeof e.remoteObservationDigest!="string"||!/^[a-f0-9]{64}$/.test(e.remoteObservationDigest)||typeof e.mergeCommitSha!="string"||!/^[a-f0-9]{40}$/.test(e.mergeCommitSha)||typeof e.baseHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.baseHeadSha))throw new Error("legacy-story-pr-merge-journal-invalid");return e}function ee(t,r,a,e){if(a.number!==t.prNumber||a.state!==e||a.headRefName!==t.branch||a.headRefOid!==r||a.baseRefName!==t.baseBranch||a.url.toLowerCase()!==`https://github.com/${t.repository}/pull/${t.prNumber}`.toLowerCase())throw new Error("legacy-story-pr-merge-provider-drift");if(e==="OPEN"&&(a.baseRefOid!==t.baseSha||a.isDraft!==!1||a.mergeable!=="MERGEABLE"))throw new Error("legacy-story-pr-merge-provider-not-ready")}function lt(t,r,a){const e=fe(t.statusCheckRollup);if(!e.ok)throw new Error("legacy-story-pr-merge-remote-observation-unclassified");if(!("registrySha256"in r)&&e.value.reasonCodes.length>0)throw new Error("legacy-story-pr-merge-remote-observation-unclassified");if(e.value.digest!==r.remoteObservationDigest)throw new Error("legacy-story-pr-merge-remote-observation-drift");if("registrySha256"in r&&(!a.remoteDebt||JSON.stringify(e.value)!==JSON.stringify(a.remoteDebt.observation)))throw new Error("legacy-story-pr-merge-remote-debt-observation-drift");return e.value}function Pt(t,r,a,e){const s=r.plan;ee(s,a.candidateHeadSha,e,"MERGED");const o=e.mergeCommit?.oid;if(!o||!/^[a-f0-9]{40}$/.test(o)||g(t,"rev-parse","HEAD")!==a.candidateHeadSha||v(t,"status","--porcelain=v1","-uall")!=="")throw new Error("legacy-story-pr-merge-physical-invalid");De(t,r,a.candidateHeadSha),g(t,"fetch","--no-tags","origin",`refs/heads/${s.baseBranch}`);const l=g(t,"rev-parse","FETCH_HEAD");if(z(t,s.baseBranch)!==l||!/^[a-f0-9]{40}$/.test(l))throw new Error("legacy-story-pr-merge-base-readback-drift");const p=g(t,"rev-list","--parents","-n","1",o).split(" ");if(p.length!==3||p[0]!==o||p[1]!==s.baseSha||p[2]!==a.candidateHeadSha)throw new Error("legacy-story-pr-merge-commit-parent-invalid");return g(t,"merge-base","--is-ancestor",o,l),{mergeCommitSha:o,baseHeadSha:l}}async function pt(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-pr-merge-target-invalid");try{const r=D(t.projectRoot),a=g(r,"rev-parse","--git-common-dir"),e=D(Pe(a)?a:A(r,a)),s=A(e,"neocortex-yoloop"),o=A(s,"legacy-story-pr-intents");if(!H(s)||!H(o))return n("legacy-story-pr-merge-not-prepared");if(!W(s).isDirectory()||D(s)!==s)return n("legacy-story-pr-merge-runtime-unsafe");await je(o,s);const l=h(t.storyId),p=await Ie(o,`${l}.c12.json`),y=await Ae(o,`${l}.c12.prepared.json`),i=await ce(o,`${l}.c11.accepted.json`);if(!p||!y||!i)return n("legacy-story-pr-merge-not-prepared");const d=p.plan;if(d.storyId!==t.storyId||d.prNumber!==t.prNumber||y.intentSha256!==h(JSON.stringify(p))||i.reviewSha256!==d.reviewSha256||i.qaSha256!==d.qaSha256)return n("legacy-story-pr-merge-prepared-drift");const c=Je(r,p,i,await(t.provider??he).list(d.repository,d.branch,d.baseBranch));if(c.headSha!==y.candidateHeadSha||c.remoteSha!==y.candidateHeadSha)return n("legacy-story-pr-merge-remote-drift");De(r,p,y.candidateHeadSha);const b=await(t.mergeProvider??F).view(d.repository,d.prNumber);ee(d,y.candidateHeadSha,b,"OPEN");const w=fe(b.statusCheckRollup);if(!w.ok)return n("legacy-story-pr-merge-remote-observation-unclassified");const f=w.value;if(f.reasonCodes.length>0){const m=p.remoteDebt;if(m&&JSON.stringify(f)===JSON.stringify(m.observation)){const u=Be(r,p);if(!u)return n("legacy-story-pr-merge-remote-debt-registry-invalid");const I=dt(d,y.candidateHeadSha,f,u.registryAfterSha256,u.itemIds);return I?{ok:!0,value:I}:n("legacy-story-pr-merge-remote-debt-projection-invalid")}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-remote-debt-required",storyId:d.storyId,epicId:d.epicId,prNumber:d.prNumber,candidateHeadSha:y.candidateHeadSha,baseSha:d.baseSha,reviewSha256:d.reviewSha256,remoteObservationDigest:f.digest,reasonCodes:f.reasonCodes,reasonCounts:f.reasonCounts,canMerge:!1,publicSafe:!0})}}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-root-merge-decision",storyId:d.storyId,epicId:d.epicId,prNumber:d.prNumber,candidateHeadSha:y.candidateHeadSha,baseSha:d.baseSha,reviewSha256:d.reviewSha256,remoteObservationDigest:f.digest,canMerge:!0,blockingChecks:[],nonBlockingChecks:[],followUpDebt:[]})}}catch(r){const a=r instanceof Error?r.message:"";return n(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-merge-decision-uncertain")}}async function dr(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-pr-merge-target-invalid");const r=await pt(t);if(!r.ok)return n(r.reasonCode);if(r.value.canMerge)return n("legacy-story-pr-merge-remote-debt-not-required");const a=`legacy-c12-remote-debt-${re(16).toString("hex")}`,e=await se(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:a,idempotencyKey:a,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!e.ok)return n(e.reasonCode);try{const s=await pt(t);if(!s.ok)return n(s.reasonCode);if(s.value.canMerge)return n("legacy-story-pr-merge-remote-debt-not-required");if(JSON.stringify(s.value)!==JSON.stringify(r.value))return n("legacy-story-pr-merge-remote-debt-observation-drift");const o=s.value,l=D(t.projectRoot),p=X(l),y=await(t.mergeProvider??F).view(p,o.prNumber);if(y.number!==o.prNumber||y.state!=="OPEN"||y.headRefOid!==o.candidateHeadSha||y.baseRefOid!==o.baseSha||y.headRefName!==`story/${o.epicId}/${o.storyId}`||y.isDraft!==!1||y.mergeable!=="MERGEABLE"||y.url.toLowerCase()!==`https://github.com/${p}/pull/${o.prNumber}`.toLowerCase())return n("legacy-story-pr-merge-remote-debt-observation-drift");const i=fe(y.statusCheckRollup);if(!i.ok||i.value.digest!==o.remoteObservationDigest)return n("legacy-story-pr-merge-remote-debt-observation-drift");const d=_e(i.value,o.storyId,o.prNumber);if(!d||d.length===0)return n("legacy-story-pr-merge-remote-debt-projection-invalid");const c=await T(await G(l),"legacy-story-pr-intents"),b={schemaVersion:1,kind:"legacy-story-c12-remote-debt-observation",planSha256:h(JSON.stringify(o)),storyId:o.storyId,epicId:o.epicId,prNumber:o.prNumber,candidateHeadSha:o.candidateHeadSha,remoteObservationDigest:o.remoteObservationDigest,reasonCodes:o.reasonCodes,reasonCounts:o.reasonCounts},w=`${h(o.storyId)}.${o.candidateHeadSha}.${o.remoteObservationDigest}.c12.remote-debt.json`,f=A(c,w),m=H(f);if(m){await P(f,c);const u=S(JSON.parse(E(f,4096)));if(!u||JSON.stringify(u)!==JSON.stringify(b))return n("legacy-story-pr-merge-remote-debt-journal-conflict")}else await L(c,w,`${JSON.stringify(b)}
58
+ `),await P(f,c);return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-remote-debt-journaled",storyId:o.storyId,epicId:o.epicId,prNumber:o.prNumber,candidateHeadSha:o.candidateHeadSha,remoteObservationDigest:o.remoteObservationDigest,reasonCodes:o.reasonCodes,reasonCounts:o.reasonCounts,followUpDebt:d,reused:m,durableObservation:!0,registryRecorded:!1,canMerge:!1,publicSafe:!0})}}catch(s){const o=s instanceof Error?s.message:"";return n(o.startsWith("legacy-story-pr-")?o:"legacy-story-pr-merge-remote-debt-uncertain")}finally{await oe(e.path,e.owner).catch(()=>{})}}async function lr(t){if(!t.authorize)return n("legacy-story-pr-merge-authorization-required");if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-pr-merge-target-invalid");const r=`legacy-c12-merge-${re(16).toString("hex")}`,a=await se(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return n(a.reasonCode);try{const e=D(t.projectRoot),s=await T(await G(e),"legacy-story-pr-intents"),o=h(t.storyId),l=await Ie(s,`${o}.c12.json`),p=await Ae(s,`${o}.c12.prepared.json`),y=await ce(s,`${o}.c11.accepted.json`);if(!l||!p||!y)return n("legacy-story-pr-merge-not-prepared");const i=l.plan,d=h(JSON.stringify(l));if(i.storyId!==t.storyId||i.prNumber!==t.prNumber||p.intentSha256!==d||X(e)!==i.repository||g(e,"branch","--show-current")!==i.branch||g(e,"rev-parse","HEAD")!==p.candidateHeadSha||y.reviewSha256!==i.reviewSha256||y.qaSha256!==i.qaSha256||y.stateAfter!==i.stateSha256||y.storyAfter!==i.storySha256||h(E(A(e,".neocortex/state.json"),2*1024*1024))!==i.stateSha256||h(E(A(e,`docs/stories/${i.storyId}.story.md`),2*1024*1024))!==i.storySha256||v(e,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-pr-merge-prepared-drift");De(e,l,p.candidateHeadSha);const c=`${o}.c12.merge-attempt.json`,b=`${o}.c12.merged.json`,w=await Ce(s,c),f=await He(s,b),m=t.mergeProvider??F,u=t.rootDecision;if((!w||u)&&!Ht(u,l,p.candidateHeadSha))return n("legacy-story-pr-merge-root-decision-required");if(w&&(w.intentSha256!==d||w.candidateHeadSha!==p.candidateHeadSha||u&&w.remoteObservationDigest!==u.remoteObservationDigest))return n("legacy-story-pr-merge-attempt-conflict");if(f&&(!w||f.intentSha256!==d||f.candidateHeadSha!==p.candidateHeadSha||f.qaSha256!==w.qaSha256||f.remoteObservationDigest!==w.remoteObservationDigest))return n("legacy-story-pr-merge-journal-conflict");if(!w){if(!u)return n("legacy-story-pr-merge-root-decision-required");const _=t.provider??he,$=Je(e,l,y,await _.list(i.repository,i.branch,i.baseBranch));if($.headSha!==p.candidateHeadSha||$.remoteSha!==p.candidateHeadSha)return n("legacy-story-pr-merge-remote-drift");const k=await m.view(i.repository,i.prNumber);ee(i,p.candidateHeadSha,k,"OPEN"),lt(k,u,l);const j={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:i.storyId,epicId:i.epicId,repository:i.repository,branch:i.branch,baseBranch:i.baseBranch,headSha:p.candidateHeadSha,baseSha:i.baseSha,qaAuthority:"root-review-required",localOnly:!0};let B;try{B=await de(j,e,t.verifyQa)}catch{return n("legacy-story-pr-merge-final-qa-failed")}const x=Je(e,l,y,await _.list(i.repository,i.branch,i.baseBranch));if(x.headSha!==p.candidateHeadSha||x.remoteSha!==p.candidateHeadSha)return n("legacy-story-pr-merge-remote-drift");const J=await m.view(i.repository,i.prNumber);ee(i,p.candidateHeadSha,J,"OPEN");const R=lt(J,u,l),C={schemaVersion:1,kind:"legacy-story-c12-merge-attempt",intentSha256:d,candidateHeadSha:p.candidateHeadSha,qaSha256:B,remoteObservationDigest:R.digest};await L(s,c,`${JSON.stringify(C)}
59
+ `),await P(A(s,c),s);try{await m.merge(i.repository,i.prNumber,p.candidateHeadSha)}catch{}await t.afterMerge?.()}const I=w??await Ce(s,c);if(!I)return n("legacy-story-pr-merge-attempt-missing");const N=await m.view(i.repository,i.prNumber);if(N.state!=="MERGED")return n("legacy-story-pr-merge-effect-not-confirmed");const O=Pt(e,l,p,N);if(f){if(f.mergeCommitSha!==O.mergeCommitSha)return n("legacy-story-pr-merge-journal-conflict");g(e,"merge-base","--is-ancestor",f.baseHeadSha,O.baseHeadSha)}else{const _={...I,kind:"legacy-story-c12-merged",mergeCommitSha:O.mergeCommitSha,baseHeadSha:O.baseHeadSha};await L(s,b,`${JSON.stringify(_)}
60
+ `),await P(A(s,b),s)}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-merged",storyId:i.storyId,epicId:i.epicId,prNumber:i.prNumber,branch:i.branch,candidateHeadSha:p.candidateHeadSha,mergeCommitSha:O.mergeCommitSha,baseHeadSha:O.baseHeadSha,qaSha256:I.qaSha256,remoteObservationDigest:I.remoteObservationDigest,reused:!!f,physicalMerge:!0,checkpointAccepted:!1,localOnly:!0})}}catch(e){const s=e instanceof Error?e.message:"";return n(s.startsWith("legacy-story-pr-")?s:"legacy-story-pr-merge-effect-uncertain")}finally{await oe(a.path,a.owner).catch(()=>{})}}const Ke={async view(t,r){const a=Q("gh",["issue","view",String(r),"--repo",t,"--json","number,title,state,url"],{encoding:"utf8",timeout:15e3,stdio:["ignore","pipe","pipe"],maxBuffer:16384});return JSON.parse(a)},async close(t,r){Q("gh",["issue","close",String(r),"--repo",t,"--reason","completed"],{encoding:"utf8",timeout:3e4,stdio:["ignore","pipe","pipe"],maxBuffer:16*1024})}};function ft(t,r,a){const e=v(t,"show",`${r.mergeCommitSha}:.neocortex/state.json`),s=`docs/stories/${r.storyId}.story.md`,o=v(t,"show",`${r.mergeCommitSha}:${s}`);if(h(e)!==r.stateSha256||h(o)!==r.storySha256)throw new Error("legacy-story-pr-post-merge-preimage-drift");const l=S(JSON.parse(e)),p=S(l?.stories),y=S(l?.epics),i=S(p?.[r.storyId]),d=S(y?.[r.epicId]),c=i?.steps_completed,b=d?.stories;if(!i||!d||d.id!==r.epicId||i.id!==r.storyId||i.epic_id!==r.epicId||i.status!=="pr-reviewed"||i.last_step!==ne||i.pr_number!==r.prNumber||i.issue_number!==r.issueNumber||i.branch_name!==`story/${r.epicId}/${r.storyId}`||!Array.isArray(c)||!c.includes(ne)||c.includes(ye)||!Array.isArray(b)||!b.includes(r.storyId)||new Set(b).size!==b.length||b.some(j=>typeof j!="string"||S(p?.[j])?.epic_id!==r.epicId))throw new Error("legacy-story-pr-post-merge-state-conflict");i.status="done",i.last_step=ye,i.steps_completed=[...c,ye],i.merged=!0,i.physicalMergeStatus="merged",i.merge_commit_sha=r.mergeCommitSha,i.issue_state="closed";const w=b.filter(j=>S(p?.[j])?.status==="done").length;if(d.total_stories=b.length,d.completed_stories=w,w===b.length)d.status="done",d.completed_at==null&&(d.completed_at=a);else if(d.status==="done")throw new Error("legacy-story-pr-post-merge-epic-conflict");const f=`${JSON.stringify(l,null,2)}
61
+ `,m=o.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!m)throw new Error("legacy-story-pr-post-merge-frontmatter-invalid");const u=ae(m[1],{strict:!0,uniqueKeys:!0}),I=S(u.toJS()),N=["stepsCompleted","steps_completed"].filter(j=>u.has(j)),O=["lastStep","last_step"].filter(j=>u.has(j)),_=["issueNumber","issue_number"].filter(j=>u.has(j)),$=["prNumber","pr_number"].filter(j=>u.has(j));if(u.errors.length>0||u.get("id")!==r.storyId||(u.get("epic_id")??u.get("epic"))!==r.epicId||u.get("status")!=="pr-reviewed"||u.has("currentStatus")&&u.get("currentStatus")!=="pr-reviewed"||N.length!==1||O.length!==1||_.length>1||$.length>1||JSON.stringify(I?.[N[0]])!==JSON.stringify(c)||I?.[O[0]]!==ne||_.length===1&&I?.[_[0]]!==r.issueNumber||$.length===1&&I?.[$[0]]!==r.prNumber)throw new Error("legacy-story-pr-post-merge-frontmatter-conflict");u.set("status","done"),u.has("currentStatus")&&u.set("currentStatus","done"),u.set(N[0],[...c,ye]),u.set(O[0],ye),u.set("mergeCommitSha",r.mergeCommitSha),u.set("issueState","closed");const k=`---
62
+ ${u.toString({lineWidth:0})}---
63
+ ${o.slice(m[0].length)}`;return{stateBefore:e,stateAfter:f,storyBefore:o,storyAfter:k}}async function Rt(t){if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-pr-post-merge-target-invalid");try{const r=D(t.projectRoot);if(D(g(r,"rev-parse","--show-toplevel"))!==r||v(r,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-pr-post-merge-checkout-invalid");const a=g(r,"rev-parse","--git-common-dir"),e=D(Pe(a)?a:A(r,a)),s=A(e,"neocortex-yoloop"),o=A(s,"legacy-story-pr-intents");if(!H(s)||!H(o))return n("legacy-story-pr-post-merge-not-journaled");if(!W(s).isDirectory()||D(s)!==s)return n("legacy-story-pr-post-merge-runtime-unsafe");await je(o,s);const l=h(t.storyId),p=await Ie(o,`${l}.c12.json`),y=await Ae(o,`${l}.c12.prepared.json`),i=await Ce(o,`${l}.c12.merge-attempt.json`),d=await He(o,`${l}.c12.merged.json`);if(!p||!y||!i||!d)return n("legacy-story-pr-post-merge-not-journaled");const c=p.plan;if(c.storyId!==t.storyId||c.prNumber!==t.prNumber||y.intentSha256!==h(JSON.stringify(p))||i.intentSha256!==y.intentSha256||d.intentSha256!==i.intentSha256||i.candidateHeadSha!==y.candidateHeadSha||d.candidateHeadSha!==i.candidateHeadSha||d.qaSha256!==i.qaSha256||d.remoteObservationDigest!==i.remoteObservationDigest||X(r)!==c.repository||g(r,"branch","--show-current")!==c.baseBranch)return n("legacy-story-pr-post-merge-journal-drift");const b=g(r,"rev-parse","HEAD");if(b!==d.mergeCommitSha||z(r,c.baseBranch)!==b)return n("legacy-story-pr-post-merge-base-drift");const w=await(t.mergeProvider??F).view(c.repository,c.prNumber);if(ee(c,y.candidateHeadSha,w,"MERGED"),w.mergeCommit?.oid!==d.mergeCommitSha)return n("legacy-story-pr-post-merge-provider-drift");const f=g(r,"rev-list","--parents","-n","1",b).split(" ");if(f.length!==3||f[0]!==b||f[1]!==c.baseSha||f[2]!==y.candidateHeadSha)return n("legacy-story-pr-post-merge-parents-invalid");const m=v(r,"show","HEAD:.neocortex/state.json"),u=`docs/stories/${c.storyId}.story.md`,I=v(r,"show",`HEAD:${u}`);if(h(m)!==c.stateSha256||h(I)!==c.storySha256||E(A(r,".neocortex/state.json"),2*1024*1024)!==m||E(A(r,u),2*1024*1024)!==I)return n("legacy-story-pr-post-merge-content-drift");const N=S(JSON.parse(m)),O=S(S(N?.stories)?.[c.storyId]),_=O?.issue_number;if(!O||O.id!==c.storyId||O.epic_id!==c.epicId||O.status!=="pr-reviewed"||O.last_step!==ne||O.pr_number!==c.prNumber||O.branch_name!==c.branch||!Array.isArray(O.steps_completed)||!O.steps_completed.includes(ne)||!Number.isSafeInteger(_)||_<=0)return n("legacy-story-pr-post-merge-state-invalid");const $=I.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);if(!$)return n("legacy-story-pr-post-merge-frontmatter-invalid");const k=ae($[1],{strict:!0,uniqueKeys:!0});if(k.errors.length>0||k.get("id")!==c.storyId||(k.get("epic_id")??k.get("epic"))!==c.epicId||k.get("status")!=="pr-reviewed")return n("legacy-story-pr-post-merge-frontmatter-invalid");const j=await(t.issueProvider??Ke).view(c.repository,_);return j.number!==_||j.state!=="OPEN"||j.title!==`[YOLO] Story ${c.storyId} - Workflow Run`||j.url.toLowerCase()!==`https://github.com/${c.repository}/issues/${_}`.toLowerCase()?n("legacy-story-pr-post-merge-issue-invalid"):{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-post-merge-plan",storyId:c.storyId,epicId:c.epicId,repository:c.repository,baseBranch:c.baseBranch,prNumber:c.prNumber,issueNumber:_,candidateHeadSha:y.candidateHeadSha,mergeCommitSha:d.mergeCommitSha,stateSha256:c.stateSha256,storySha256:c.storySha256,nextAuthority:"root-state-checkpoint-and-issue-closure-required",checkpointAccepted:!1,localOnly:!0})}}catch(r){const a=r instanceof Error?r.message:"";return n(a.startsWith("legacy-story-pr-")?a:"legacy-story-pr-post-merge-physical-unavailable")}}async function ht(t,r){const a=A(t,r);if(!H(a))return null;await P(a,t);const e=S(JSON.parse(E(a,8192))),s=S(e?.plan);if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-post-merge-intent"||!s||s.schemaVersion!==1||s.kind!=="legacy-story-c12-post-merge-plan"||typeof e.nowIso!="string"||!Number.isFinite(Date.parse(e.nowIso))||typeof e.stateAfterSha256!="string"||!/^[a-f0-9]{64}$/.test(e.stateAfterSha256)||typeof e.storyAfterSha256!="string"||!/^[a-f0-9]{64}$/.test(e.storyAfterSha256))throw new Error("legacy-story-pr-post-merge-intent-invalid");return e}async function ut(t,r){const a=A(t,r);if(!H(a))return null;await P(a,t);const e=S(JSON.parse(E(a,4096)));if(!e||e.schemaVersion!==1||e.kind!=="legacy-story-c12-post-merge-accepted"||typeof e.intentSha256!="string"||!/^[a-f0-9]{64}$/.test(e.intentSha256)||typeof e.checkpointHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.checkpointHeadSha)||typeof e.qaSha256!="string"||!/^[a-f0-9]{64}$/.test(e.qaSha256))throw new Error("legacy-story-pr-post-merge-accepted-invalid");return e}async function pr(t){if(!t.authorize)return n("legacy-story-pr-post-merge-authorization-required");if(!Number.isSafeInteger(t.prNumber)||t.prNumber<=0||!/^[A-Za-z0-9][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t.storyId))return n("legacy-story-pr-post-merge-target-invalid");const r=`legacy-c12-post-merge-${re(16).toString("hex")}`,a=await se(t.projectRoot,{kind:"direct",storyId:t.storyId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return n(a.reasonCode);try{const e=D(t.projectRoot);if(D(g(e,"rev-parse","--show-toplevel"))!==e)return n("legacy-story-pr-post-merge-checkout-invalid");const s=await T(await G(e),"legacy-story-pr-intents"),o=h(t.storyId),l=`${o}.c12.post-merge.json`,p=`${o}.c12.post-merge.accepted.json`;let y=await ht(s,l);if(!y){const q=await Rt(t);if(!q.ok)return q;const Te=new Date().toISOString(),Ge=ft(e,q.value,Te);y={schemaVersion:1,kind:"legacy-story-c12-post-merge-intent",plan:q.value,nowIso:Te,stateAfterSha256:h(Ge.stateAfter),storyAfterSha256:h(Ge.storyAfter)},await L(s,l,`${JSON.stringify(y)}
64
+ `),await P(A(s,l),s)}const i=y.plan,d=await Ie(s,`${o}.c12.json`),c=await Ae(s,`${o}.c12.prepared.json`),b=await Ce(s,`${o}.c12.merge-attempt.json`),w=await He(s,`${o}.c12.merged.json`);if(!d||!c||!b||!w||i.storyId!==t.storyId||i.prNumber!==t.prNumber||i.repository!==d.plan.repository||i.epicId!==d.plan.epicId||i.baseBranch!==d.plan.baseBranch||i.candidateHeadSha!==c.candidateHeadSha||i.mergeCommitSha!==w.mergeCommitSha||i.stateSha256!==d.plan.stateSha256||i.storySha256!==d.plan.storySha256||c.intentSha256!==h(JSON.stringify(d))||b.intentSha256!==c.intentSha256||w.intentSha256!==b.intentSha256||w.qaSha256!==b.qaSha256||w.remoteObservationDigest!==b.remoteObservationDigest||X(e)!==i.repository||g(e,"branch","--show-current")!==i.baseBranch)return n("legacy-story-pr-post-merge-intent-drift");const f=ft(e,i,y.nowIso);if(h(f.stateAfter)!==y.stateAfterSha256||h(f.storyAfter)!==y.storyAfterSha256)return n("legacy-story-pr-post-merge-projection-drift");const m=await(t.mergeProvider??F).view(i.repository,i.prNumber);if(ee(d.plan,c.candidateHeadSha,m,"MERGED"),m.mergeCommit?.oid!==i.mergeCommitSha)return n("legacy-story-pr-post-merge-provider-drift");const u=g(e,"rev-list","--parents","-n","1",i.mergeCommitSha).split(" ");if(u.length!==3||u[0]!==i.mergeCommitSha||u[1]!==d.plan.baseSha||u[2]!==i.candidateHeadSha)return n("legacy-story-pr-post-merge-parents-invalid");const I=await ut(s,p),N=h(JSON.stringify(y));if(I&&I.intentSha256!==N)return n("legacy-story-pr-post-merge-accepted-conflict");const O=g(e,"rev-parse","HEAD");let _=z(e,i.baseBranch);if(v(e,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-pr-post-merge-base-worktree-dirty");const $=A(s,`${o}.c12.post-merge.checkout`);if(H($)||Q("git",["worktree","add","--detach",$,I?.checkpointHeadSha??i.mergeCommitSha],{cwd:e,encoding:"utf8",timeout:6e4,stdio:["ignore","pipe","pipe"],maxBuffer:32*1024}),!W($).isDirectory()||D($)!==$||D(g($,"rev-parse","--show-toplevel"))!==$||me($)!==me(e)||g($,"branch","--show-current")!=="")return n("legacy-story-pr-post-merge-candidate-checkout-invalid");let k=g($,"rev-parse","HEAD");if(k!==i.mergeCommitSha&&(g($,"rev-parse",`${k}^`)!==i.mergeCommitSha||JSON.stringify(v($,"diff-tree","--no-commit-id","--name-only","-r","-z",k).split("\0").filter(Boolean).sort())!==JSON.stringify([".neocortex/state.json",`docs/stories/${i.storyId}.story.md`].sort())||h(v($,"show",`${k}:.neocortex/state.json`))!==y.stateAfterSha256||h(v($,"show",`${k}:docs/stories/${i.storyId}.story.md`))!==y.storyAfterSha256||!v($,"log","-1","--format=%B",k).split(`
65
+ `).map(q=>q.trim()).includes(`Neocortex-Legacy-Merge: ${i.storyId}`)))return n("legacy-story-pr-post-merge-checkpoint-commit-invalid");if(![i.mergeCommitSha,k].includes(O)||![i.mergeCommitSha,k].includes(_)||I&&(I.checkpointHeadSha!==k||_!==k))return n("legacy-story-pr-post-merge-base-drift");const j=v($,"status","--porcelain=v1","-uall").split(`
66
+ `).filter(Boolean),B=new Set([".neocortex/state.json",`docs/stories/${i.storyId}.story.md`]);if(k!==i.mergeCommitSha&&j.length>0||j.some(q=>!B.has(q.slice(3))||![" M","M ","MM"].includes(q.slice(0,2))))return n("legacy-story-pr-post-merge-worktree-dirty");const x=E(A($,".neocortex/state.json"),2*1024*1024),J=E(A($,`docs/stories/${i.storyId}.story.md`),2*1024*1024);if(![f.stateBefore,f.stateAfter].includes(x)||![f.storyBefore,f.storyAfter].includes(J)||k!==i.mergeCommitSha&&(x!==f.stateAfter||J!==f.storyAfter))return n("legacy-story-pr-post-merge-content-drift");const R=t.issueProvider??Ke,C=async()=>{const q=await R.view(i.repository,i.issueNumber);if(q.number!==i.issueNumber||q.title!==`[YOLO] Story ${i.storyId} - Workflow Run`||q.url.toLowerCase()!==`https://github.com/${i.repository}/issues/${i.issueNumber}`.toLowerCase()||!["OPEN","CLOSED"].includes(q.state))throw new Error("legacy-story-pr-post-merge-issue-invalid");return q.state};if(I&&await C()!=="CLOSED")return n("legacy-story-pr-post-merge-accepted-issue-drift");if(!I&&O===i.mergeCommitSha&&_===i.mergeCommitSha){if(j.length>0)return n("legacy-story-pr-post-merge-pre-issue-drift");const q={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:i.storyId,epicId:i.epicId,repository:i.repository,branch:i.baseBranch,baseBranch:i.baseBranch,headSha:i.mergeCommitSha,baseSha:d.plan.baseSha,qaAuthority:"root-review-required",localOnly:!0};try{await de(q,e,t.verifyQa)}catch{return n("legacy-story-pr-post-merge-pre-issue-qa-failed")}if(g(e,"rev-parse","HEAD")!==i.mergeCommitSha||z(e,i.baseBranch)!==i.mergeCommitSha||v(e,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-pr-post-merge-pre-issue-drift")}if(k===i.mergeCommitSha){if(x===f.stateBefore&&await Y(A($,".neocortex"),"state.json",f.stateAfter,h(f.stateBefore)),J===f.storyBefore&&await Y(A($,"docs/stories"),`${i.storyId}.story.md`,f.storyAfter,h(f.storyBefore)),E(A($,".neocortex/state.json"),2*1024*1024)!==f.stateAfter||E(A($,`docs/stories/${i.storyId}.story.md`),2*1024*1024)!==f.storyAfter)return n("legacy-story-pr-post-merge-write-drift");g($,"add","--",".neocortex/state.json",`docs/stories/${i.storyId}.story.md`);const q=v($,"diff","--cached","--name-only","-z").split("\0").filter(Boolean).sort();if(JSON.stringify(q)!==JSON.stringify([...B].sort())||v($,"diff","--name-only","-z")!=="")return n("legacy-story-pr-post-merge-staged-scope-invalid");g($,"diff","--cached","--check"),g($,"commit","-m",`chore(story): accept merged PR ${i.storyId}`,"-m",`Neocortex-Legacy-Merge: ${i.storyId}`),k=g($,"rev-parse","HEAD"),await t.afterCommit?.()}if(v($,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-pr-post-merge-worktree-dirty");const V={schemaVersion:1,kind:"legacy-story-pr-plan",storyId:i.storyId,epicId:i.epicId,repository:i.repository,branch:i.baseBranch,baseBranch:i.baseBranch,headSha:k,baseSha:i.mergeCommitSha,qaAuthority:"root-review-required",localOnly:!0};let te=I?.qaSha256;if(!te){if(!t.verifyQa)try{et($)}catch(q){return n(q instanceof Error&&q.message.endsWith("-missing")?"legacy-story-pr-post-merge-dependencies-missing":"legacy-story-pr-post-merge-dependencies-failed")}try{te=await de(V,$,t.verifyQa)}catch{return n("legacy-story-pr-post-merge-qa-failed")}}if(g($,"rev-parse","HEAD")!==k||v($,"status","--porcelain=v1","-uall")!==""||g(e,"rev-parse","HEAD")!==O||v(e,"status","--porcelain=v1","-uall")!=="")return n("legacy-story-pr-post-merge-final-drift");if(await C()==="OPEN"){if(z(e,i.baseBranch)!==i.mergeCommitSha)return n("legacy-story-pr-post-merge-pre-issue-drift");await R.close(i.repository,i.issueNumber),await t.afterIssueClose?.()}if(await C()!=="CLOSED")return n("legacy-story-pr-post-merge-issue-not-closed");const K=await(t.mergeProvider??F).view(i.repository,i.prNumber);if(ee(d.plan,c.candidateHeadSha,K,"MERGED"),K.mergeCommit?.oid!==i.mergeCommitSha)return n("legacy-story-pr-post-merge-provider-drift");if(_=z(e,i.baseBranch),_===i.mergeCommitSha&&g(e,"push","--porcelain","origin",`${k}:refs/heads/${i.baseBranch}`),z(e,i.baseBranch)!==k)return n("legacy-story-pr-post-merge-push-unverified");if(await t.afterPush?.(),g(e,"rev-parse","HEAD")===i.mergeCommitSha&&g(e,"merge","--ff-only",k),g(e,"rev-parse","HEAD")!==k||v(e,"status","--porcelain=v1","-uall")!==""||E(A(e,".neocortex/state.json"),2*1024*1024)!==f.stateAfter||E(A(e,`docs/stories/${i.storyId}.story.md`),2*1024*1024)!==f.storyAfter)return n("legacy-story-pr-post-merge-base-readback-invalid");const M={schemaVersion:1,kind:"legacy-story-c12-post-merge-accepted",intentSha256:N,checkpointHeadSha:k,qaSha256:te};return I&&JSON.stringify(I)!==JSON.stringify(M)?n("legacy-story-pr-post-merge-accepted-conflict"):(I||(await L(s,p,`${JSON.stringify(M)}
67
+ `),await P(A(s,p),s)),{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-story-c12-post-merge-accepted",storyId:i.storyId,epicId:i.epicId,prNumber:i.prNumber,issueNumber:i.issueNumber,mergeCommitSha:i.mergeCommitSha,checkpointHeadSha:k,qaSha256:te,reused:!!I,physicalMerge:!0,issueClosed:!0,checkpointAccepted:!0,publicSafe:!0})})}catch(e){const s=e instanceof Error?e.message:"";return n(s.startsWith("legacy-story-pr-")?s:s.includes("secure-filesystem-cas-conflict")?"legacy-story-pr-post-merge-write-raced":"legacy-story-pr-post-merge-effect-uncertain")}finally{await oe(a.path,a.owner).catch(()=>{})}}async function qt(t){const{cwd:r,directory:a,storyId:e,epicId:s,repository:o,baseBranch:l}=t,p=h(e),y=await Ie(a,`${p}.c12.json`),i=await Ae(a,`${p}.c12.prepared.json`),d=await Ce(a,`${p}.c12.merge-attempt.json`),c=await He(a,`${p}.c12.merged.json`),b=await ht(a,`${p}.c12.post-merge.json`),w=await ut(a,`${p}.c12.post-merge.accepted.json`);if(!y||!i||!d||!c||!b||!w)return n("legacy-epic-terminal-story-receipt-missing");const f=y.plan,m=b.plan;if(f.storyId!==e||f.epicId!==s||f.repository!==o||f.baseBranch!==l||m.storyId!==e||m.epicId!==s||m.repository!==o||m.baseBranch!==l||m.prNumber!==f.prNumber||m.candidateHeadSha!==i.candidateHeadSha||m.mergeCommitSha!==c.mergeCommitSha||m.stateSha256!==f.stateSha256||m.storySha256!==f.storySha256||i.intentSha256!==h(JSON.stringify(y))||d.intentSha256!==i.intentSha256||c.intentSha256!==d.intentSha256||d.candidateHeadSha!==i.candidateHeadSha||c.candidateHeadSha!==d.candidateHeadSha||c.qaSha256!==d.qaSha256||c.remoteObservationDigest!==d.remoteObservationDigest||w.intentSha256!==h(JSON.stringify(b)))return n("legacy-epic-terminal-story-receipt-drift");const u=w.checkpointHeadSha,I=g(r,"rev-parse",`${u}^`),N=g(r,"rev-list","--parents","-n","1",c.mergeCommitSha).split(" "),O=v(r,"diff-tree","--no-commit-id","--name-only","-r","-z",u).split("\0").filter(Boolean).sort(),_=`docs/stories/${e}.story.md`;if(I!==c.mergeCommitSha||N.length!==3||N[0]!==c.mergeCommitSha||N[1]!==f.baseSha||N[2]!==i.candidateHeadSha||JSON.stringify(O)!==JSON.stringify([".neocortex/state.json",_].sort())||!v(r,"log","-1","--format=%B",u).split(`
68
+ `).map(M=>M.trim()).includes(`Neocortex-Legacy-Merge: ${e}`))return n("legacy-epic-terminal-story-git-drift");if(!t.firstParentHeads.has(u))return n("legacy-epic-terminal-story-not-on-base");const $=v(r,"show",`${u}:.neocortex/state.json`),k=v(r,"show",`${u}:${_}`);if(h($)!==b.stateAfterSha256||h(k)!==b.storyAfterSha256)return n("legacy-epic-terminal-story-checkpoint-drift");const j=S(JSON.parse($)),B=S(S(j?.stories)?.[e]),x=k.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/),J=x?ae(x[1],{strict:!0,uniqueKeys:!0}):null,R=J?S(J.toJS()):null,C=["stepsCompleted","steps_completed"].filter(M=>J?.has(M)),V=["lastStep","last_step"].filter(M=>J?.has(M));if(!B||B.id!==e||B.epic_id!==s||B.status!=="done"||B.last_step!==ye||!Array.isArray(B.steps_completed)||!B.steps_completed.includes(ye)||B.pr_number!==f.prNumber||B.issue_number!==m.issueNumber||B.issue_state!=="closed"||B.merged!==!0||B.physicalMergeStatus!=="merged"||B.merge_commit_sha!==c.mergeCommitSha||B.branch_name!==`story/${s}/${e}`||!J||J.errors.length>0||J.get("id")!==e||(J.get("epic_id")??J.get("epic"))!==s||J.get("status")!=="done"||J.has("currentStatus")&&J.get("currentStatus")!=="done"||C.length!==1||V.length!==1||JSON.stringify(R?.[C[0]])!==JSON.stringify(B.steps_completed)||R?.[V[0]]!==ye||R?.mergeCommitSha!==c.mergeCommitSha||R?.issueState!=="closed")return n("legacy-epic-terminal-story-state-drift");const te=await t.mergeProvider.view(o,f.prNumber);if(ee(f,i.candidateHeadSha,te,"MERGED"),te.mergeCommit?.oid!==c.mergeCommitSha)return n("legacy-epic-terminal-story-provider-drift");const K=await t.issueProvider.view(o,m.issueNumber);return K.number!==m.issueNumber||K.state!=="CLOSED"||K.title!==`[YOLO] Story ${e} - Workflow Run`||K.url.toLowerCase()!==`https://github.com/${o}/issues/${m.issueNumber}`.toLowerCase()?n("legacy-epic-terminal-story-issue-drift"):{ok:!0,value:Object.freeze({storyId:e,checkpointHeadSha:u,storyRowSha256:h(JSON.stringify(B)),storyDocumentSha256:h(k),qaSha256:w.qaSha256})}}async function Ne(t){if(!/^P[0-9]+$/.test(t.epicId))return n("legacy-epic-terminal-target-invalid");try{const r=D(t.projectRoot);if(D(g(r,"rev-parse","--show-toplevel"))!==r||v(r,"status","--porcelain=v1","-uall")!=="")return n("legacy-epic-terminal-checkout-invalid");for(const u of[".neocortex","docs","docs/stories"]){const I=A(r,u);if(!H(I)||!W(I).isDirectory()||D(I)!==I)return n("legacy-epic-terminal-checkout-unsafe")}const a=v(r,"show","HEAD:.neocortex/state.json");if(E(A(r,".neocortex/state.json"),2*1024*1024)!==a)return n("legacy-epic-terminal-state-drift");const e=S(JSON.parse(a)),s=S(e?.epics),o=S(e?.stories),l=S(s?.[t.epicId]),p=S(e?.config),y=l?.stories,i=p?.default_branch;if(!l||l.id!==t.epicId||l.branch_mode!=="story"||l.status!=="done"||!Array.isArray(y)||y.length===0||y.length>128||new Set(y).size!==y.length||y.some(u=>typeof u!="string"||!/^P[0-9]+\.[0-9]+(?:\.[0-9]+)*$/.test(u))||!o||Object.entries(o).some(([u,I])=>S(I)?.epic_id===t.epicId&&!y.includes(u))||l.total_stories!==y.length||l.completed_stories!==y.length||typeof i!="string"||!/^[A-Za-z0-9][A-Za-z0-9._/-]*$/.test(i)||g(r,"branch","--show-current")!==i)return n("legacy-epic-terminal-topology-invalid");const d=X(r),c=g(r,"rev-parse","HEAD");if(z(r,i)!==c)return n("legacy-epic-terminal-base-not-pushed");const b=A(me(r),"neocortex-yoloop"),w=A(b,"legacy-story-pr-intents");if(!H(b)||!H(w)||!W(b).isDirectory()||D(b)!==b)return n("legacy-epic-terminal-receipts-missing");await je(w,b);const f=new Set(g(r,"rev-list","--first-parent","--max-count=4096",c).split(`
69
+ `).filter(Boolean)),m=[];for(const u of y){const I=await qt({cwd:r,directory:w,storyId:u,epicId:t.epicId,repository:d,baseBranch:i,firstParentHeads:f,mergeProvider:t.mergeProvider??F,issueProvider:t.issueProvider??Ke});if(!I.ok)return I;const N=S(o[u]),O=E(A(r,`docs/stories/${u}.story.md`),2*1024*1024);if(!N||h(JSON.stringify(N))!==I.value.storyRowSha256||h(O)!==I.value.storyDocumentSha256)return n("legacy-epic-terminal-story-current-drift");m.push(I.value)}return!m.some(u=>u.checkpointHeadSha===c)||g(r,"rev-parse","HEAD")!==c||z(r,i)!==c||v(r,"status","--porcelain=v1","-uall")!==""?n("legacy-epic-terminal-base-final-drift"):{ok:!0,value:Object.freeze({schemaVersion:1,kind:"legacy-epic-terminal-plan",epicId:t.epicId,repositorySha256:h(d),baseBranchSha256:h(i),baseHeadSha:c,storyCount:m.length,storyEvidenceSha256:h(JSON.stringify(m)),physicalStoriesVerified:!0,quotaReleaseAuthorized:!1,checkpointAccepted:!1,localOnly:!0,publicSafe:!0})}}catch(r){const a=r instanceof Error?r.message:"";return n(a.startsWith("legacy-epic-terminal-")?a:"legacy-epic-terminal-physical-unavailable")}}async function Ze(t,r){const a=A(t,r);if(!H(a))return null;await P(a,t);const e=S(JSON.parse(E(a,4096)));if(!e||Object.keys(e).sort().join(",")!==["schemaVersion","kind","epicId","planSha256","baseHeadSha","qaEvidenceDigest","acceptedAt"].sort().join(",")||e.schemaVersion!==1||e.kind!=="legacy-epic-terminal-root-accepted"||typeof e.epicId!="string"||!/^P[0-9]+$/.test(e.epicId)||typeof e.planSha256!="string"||!/^[a-f0-9]{64}$/.test(e.planSha256)||typeof e.baseHeadSha!="string"||!/^[a-f0-9]{40}$/.test(e.baseHeadSha)||typeof e.qaEvidenceDigest!="string"||!/^[a-f0-9]{64}$/.test(e.qaEvidenceDigest)||typeof e.acceptedAt!="string"||!Number.isFinite(Date.parse(e.acceptedAt)))throw new Error("legacy-epic-terminal-journal-invalid");return e}function Fe(t,r,a){return Object.freeze({schemaVersion:1,kind:"legacy-epic-terminal-root-accepted",epicId:t.epicId,baseHeadSha:t.baseHeadSha,storyCount:t.storyCount,planSha256:r.planSha256,qaEvidenceDigest:r.qaEvidenceDigest,reused:a,rootAcceptanceRecorded:!0,quotaReleaseAuthorized:!1,serverAccountingAccepted:!1,localOnly:!0,publicSafe:!0})}async function fr(t){const r=await Ne(t);if(!r.ok)return r;try{const a=D(t.projectRoot),e=A(me(a),"neocortex-yoloop"),s=A(e,"legacy-epic-terminal");if(!H(s))return n("legacy-epic-terminal-acceptance-missing");await je(s,e);const o=await Ze(s,`${h(t.epicId)}.accepted.json`);if(!o)return n("legacy-epic-terminal-acceptance-missing");if(o.epicId!==t.epicId||o.baseHeadSha!==r.value.baseHeadSha||o.planSha256!==h(JSON.stringify(r.value)))return n("legacy-epic-terminal-acceptance-drift");const l=await Ne(t);return!l.ok||h(JSON.stringify(l.value))!==o.planSha256?n("legacy-epic-terminal-acceptance-drift"):{ok:!0,value:Fe(l.value,o,!0)}}catch(a){const e=a instanceof Error?a.message:"";return n(e.startsWith("legacy-epic-terminal-")?e:"legacy-epic-terminal-acceptance-unavailable")}}async function hr(t){if(!t.authorize)return n("legacy-epic-terminal-authorization-required");if(!/^P[0-9]+$/.test(t.epicId))return n("legacy-epic-terminal-target-invalid");const r=`legacy-epic-terminal-${re(16).toString("hex")}`,a=await se(t.projectRoot,{kind:"direct",storyId:t.epicId,sessionId:r,idempotencyKey:r,expiresAt:new Date(Date.now()+60*6e4).toISOString(),persistent:!1});if(!a.ok)return n(a.reasonCode);try{const e=D(t.projectRoot),s=await Ne(t);if(!s.ok)return s;const o=await T(await G(e),"legacy-epic-terminal"),l=`${h(t.epicId)}.accepted.json`,p=h(JSON.stringify(s.value)),y=await Ze(o,l);if(y){if(y.epicId!==t.epicId||y.baseHeadSha!==s.value.baseHeadSha||y.planSha256!==p)return n("legacy-epic-terminal-acceptance-conflict");const f=await Ne(t);return!f.ok||h(JSON.stringify(f.value))!==p?n("legacy-epic-terminal-acceptance-drift"):{ok:!0,value:Fe(f.value,y,!0)}}let i;try{if(t.verifyQa)i=await t.verifyQa(s.value);else{const f=await ze(e,{headSha:s.value.baseHeadSha,graphRevision:h(`legacy-epic-terminal\0${p}`)}),m=Le(f);if(!m||m.executionHeadSha!==s.value.baseHeadSha)return n("legacy-epic-terminal-qa-invalid");i=m.executionEvidenceDigest}}catch{return n("legacy-epic-terminal-qa-failed")}if(!/^[a-f0-9]{64}$/.test(i))return n("legacy-epic-terminal-qa-invalid");const d=await Ne(t);if(!d.ok||h(JSON.stringify(d.value))!==p)return n("legacy-epic-terminal-post-qa-drift");const c={schemaVersion:1,kind:"legacy-epic-terminal-root-accepted",epicId:t.epicId,planSha256:p,baseHeadSha:s.value.baseHeadSha,qaEvidenceDigest:i,acceptedAt:new Date().toISOString()};await L(o,l,`${JSON.stringify(c)}
70
+ `);const b=await Ze(o,l);if(!b||JSON.stringify(b)!==JSON.stringify(c))return n("legacy-epic-terminal-acceptance-write-raced");const w=await Ne(t);return!w.ok||h(JSON.stringify(w.value))!==p?n("legacy-epic-terminal-post-accept-drift"):{ok:!0,value:Fe(w.value,c,!1)}}catch(e){const s=e instanceof Error?e.message:"";return n(s.startsWith("legacy-epic-terminal-")?s:"legacy-epic-terminal-acceptance-unavailable")}finally{await oe(a.path,a.owner).catch(()=>{})}}export{hr as acceptLegacyEpicFinalization,er as acceptLegacyStoryCommitC08,ar as acceptLegacyStoryPrC10,pr as acceptLegacyStoryPrPostMergeC12,nr as acceptLegacyStoryPrReviewC11,tr as acceptLegacyStorySyncC09,rr as createLegacyStoryPr,lr as mergeLegacyStoryPrC12,or as observeLegacyStoryPrReviewC11,Ne as planLegacyEpicFinalization,Ct as planLegacyStoryCommitC08,be as planLegacyStoryPr,yt as planLegacyStoryPrMergeC12,pt as planLegacyStoryPrMergeDecisionC12,Rt as planLegacyStoryPrPostMergeC12,yr as planLegacyStoryPrRemoteDebtBeforePrepareC12,ir as planLegacyStoryPrReview,_t as planLegacyStorySyncC09,cr as prepareLegacyStoryPrMergeC12,sr as readAcceptedLegacyStoryPrC10,xt as readAcceptedLegacyStoryPrReviewC11,fr as readLegacyEpicTerminalAcceptance,dr as recordLegacyStoryPrRemoteDebtC12};