@ornexus/neocortex 4.60.72 → 4.60.74

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 (46) hide show
  1. package/dist/release-source.json +1 -1
  2. package/dist/sbom.cdx.json +1217 -1211
  3. package/install.ps1 +1 -1
  4. package/install.sh +1 -1
  5. package/package.json +2 -2
  6. package/packages/client/dist/commands/invoke.js +66 -66
  7. package/packages/client/dist/continuity/sqlite-store.d.ts +22 -1
  8. package/packages/client/dist/continuity/sqlite-store.js +60 -60
  9. package/packages/client/dist/git/epic-operational-state.d.ts +198 -0
  10. package/packages/client/dist/git/epic-operational-state.js +2 -0
  11. package/packages/client/dist/git/git-lifecycle-store.d.ts +32 -1
  12. package/packages/client/dist/git/git-lifecycle-store.js +9 -8
  13. package/packages/client/dist/migrations/epic-lifecycle-backfill.d.ts +97 -0
  14. package/packages/client/dist/migrations/epic-lifecycle-backfill.js +3 -0
  15. package/packages/client/dist/migrations/state-json.d.ts +22 -0
  16. package/packages/client/dist/migrations/state-json.js +4 -4
  17. package/packages/client/dist/runner/headless/epic-merge-candidate-qa.d.ts +1 -1
  18. package/packages/client/dist/runner/headless/epic-merge-candidate-qa.js +2 -2
  19. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.d.ts +2 -0
  20. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.js +10 -8
  21. package/packages/client/dist/runner/headless/epic-terminal-git-runner.d.ts +18 -2
  22. package/packages/client/dist/runner/headless/epic-terminal-git-runner.js +2 -2
  23. package/packages/client/dist/runner/headless/run-yolo.js +1 -1
  24. package/packages/client/dist/runner/headless/run-yoloop.d.ts +1 -0
  25. package/packages/client/dist/runner/headless/run-yoloop.js +2 -2
  26. package/packages/client/dist/runner/headless/types.js +2 -2
  27. package/packages/client/dist/state/project-state-snapshot.d.ts +8 -0
  28. package/packages/client/dist/state/project-state-snapshot.js +1 -1
  29. package/packages/client/dist/yolo/spec-envelope-collector.js +3 -3
  30. package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +65 -1
  31. package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +8 -0
  32. package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -1
  33. package/packages/shared/dist/yolo/change-evidence.js +1 -1
  34. package/packages/shared/dist/yolo/spec-envelope.js +3 -6
  35. package/packages/shared/dist/yoloop/epic-terminal-git.js +144 -2
  36. package/targets-stubs/antigravity/gemini.md +1 -1
  37. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  38. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  39. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  40. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  41. package/targets-stubs/claude-code/neocortex.md +2 -2
  42. package/targets-stubs/codex/AGENTS.md +1 -1
  43. package/targets-stubs/cursor/agent.md +2 -2
  44. package/targets-stubs/gemini-cli/agent.md +2 -2
  45. package/targets-stubs/opencode/neocortex-root.md +1 -1
  46. package/targets-stubs/vscode/neocortex.agent.md +2 -2
@@ -1,9 +1,10 @@
1
- import{execFile as pi,execFileSync as M}from"node:child_process";import{createHash as w,randomBytes as De}from"node:crypto";import{lstat as Re,open as mi,readFile as F,realpath as X,stat as yi}from"node:fs/promises";import{existsSync as H,lstatSync as ze,readFileSync as He,realpathSync as _e}from"node:fs";import{basename as C,dirname as K,isAbsolute as ae,join as S,relative as bi,resolve as v}from"node:path";import{promisify as wi}from"node:util";import{publicWriteSet as vi}from"../../../shared/dist/yoloop/public-story-write-set.js";import{isRootProjectMemoryEffect as Si}from"../private-execution/shared-root-memory-types.js";import{verifyRootMemoryPhysicalWriteSet as Di}from"../private-execution/root-memory-git-evidence.js";import{resolveBranchUnit as Ri}from"../../../shared/dist/yoloop/branch-unit.js";import{anchoredAtomicWriteFile as _i,anchoredCreateOwnedDirectory as je,anchoredEnsureDirectory as Ge,anchoredExecuteGit as Ei,anchoredExecuteNode as Te,anchoredRemoveDirectory as xi,anchoredRenameDirectory as re}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as Ii,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as Ai,GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID as Ee}from"./git-lifecycle-step-ids.js";const V=wi(pi),le="neocortex-yoloop",he="runtime.json",q="node scripts/test-root.mjs --gate complete",Me=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),ki=Object.freeze({"P174.03.811759":Object.freeze({baseSha:"749c8fc732deaf26c81a8e08cc94b83c8cf0f5ba",headSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",commitBodyDigest:"b4fc759a49765fd8c0b3d0f5d1c333c2a4bf28d324e83eedabb12f9530df3738",changedPathsDigest:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",qaDigest:"f1100775e21f5d0d990f77303a2a06d936908f016983e32a63316d81aee6b9fc",reviewDigest:"50400bbcddb6f02408837cf99077de5d3af8c84822ab23a8b5499c338af7103a"}),"P174.03.685003":Object.freeze({baseSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",headSha:"272a7fee89e4b9324d35701df1c83b671fa96299",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",commitBodyDigest:"e97966e26ce3ba31d5951b9fdac67808c88c1fd8be7ec1e73982f3f1cc7ffd81",changedPathsDigest:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",qaDigest:"7439329a93321f39fb6b0de0a41c22e58373a399f9048e362dff4ffa6f1a7d89",reviewDigest:"1b2d12262e84acf9da7d06149a0effb11274ebdc986affbfd47635b855ec7135"}),"P174.03.029264":Object.freeze({baseSha:"272a7fee89e4b9324d35701df1c83b671fa96299",headSha:"339141be7339a0edf55710cbccb6e6558f514792",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",commitBodyDigest:"0f269a00dcd168a6f548ff10dfa667b193c948ac9c7211f5cb11a0561757c371",changedPathsDigest:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",qaDigest:"ef0fd2c6e216557825cd8521ccb2f9960a3af48f18e7a5ada441bee8bfda400b",reviewDigest:"372d0f4a2f32978c8b39f20167637b3917187edb75d49875e93200c4c5a19d0d"}),"P174.03.913359":Object.freeze({baseSha:"339141be7339a0edf55710cbccb6e6558f514792",headSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",commitBodyDigest:"89a6653197509e75246a758d2706876b337770571a1cac47d9d85ec96c196459",changedPathsDigest:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",qaDigest:"c7d3762ad30e4f9356243df17a1dd7123cbf1b660808d68176f44d1cd5da6449",reviewDigest:"e4ecf577e174fd66f31aa4a0113ab672ced16b12ee531f6831aa533795145ba1"}),"P174.03.724350":Object.freeze({baseSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",headSha:"568e9464fb086304146b9eb4594281f91302aef1",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",commitBodyDigest:"b3032338bfcd6c9dc460e9426220a1966dedeff9968c4064fdd36a315560721b",changedPathsDigest:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",qaDigest:"91f2f5b00935b1b04bb5d400df500cbc97c412072078b713c6e5ba8fda669bd0",reviewDigest:"9bc92069d3b3a76cc8b02d339d432690258be1376464b69e152ed8fd3d682f05"}),"P174.03.011976":Object.freeze({baseSha:"568e9464fb086304146b9eb4594281f91302aef1",headSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",commitBodyDigest:"b8a28392fac663dd614b695a49c894b7cab116d45722a42850e3b24e2aaf36f4",changedPathsDigest:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",qaDigest:"6eb4459a7d80c4a268fc931297e8156ed2a320584f8775f0787d91b42c0929d4",reviewDigest:"98b21de29f7cceeec73da19000c6c144395cce6eb699c6a82dfab505d4ab7b44"}),"P174.03.686659":Object.freeze({baseSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",headSha:"0db3681a5dad4e25ce37d967c636eb9d54915556",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",commitBodyDigest:"143257f4018ad773afc0c7280bd8aab8786851a9c20b65f8110881ff54656839",changedPathsDigest:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",qaDigest:"6303dbf473e2815a3671aeb2c25528d8daba484b92a5a40d1eea5215e1f6763e",reviewDigest:"1bd6695846ed9340c8677cfa9b573880532187aeee487efaaa70577a0c94e7f2"})}),xe="neocortex-yoloop-runtime.json",Ci="runtime.lock",Fe=new WeakMap;async function Pt(i,e){return(await Oi(i,{headSha:e.headSha,graphRevisions:[e.graphRevision],...e.nowIso!==void 0?{nowIso:e.nowIso}:{},...e.anchoredWorkspace!==void 0?{anchoredWorkspace:e.anchoredWorkspace}:{}})).get(e.graphRevision)}async function Oi(i,e){const t=[...new Set(e.graphRevisions)];if(!D(e.headSha)||t.length===0||t.some(x=>!p(x)))throw new Error("p205-transient-binding-invalid");const r=e.anchoredWorkspace;if(r&&v(i)!==S(v(r.parent),r.name))throw new Error("p205-transient-anchor-binding-invalid");const n=async x=>r?(await Ei(r.parent,r.name,r.identity,x)).toString("utf8"):String((await V("git",[...x],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout),a=async()=>r?JSON.parse((await Te(r.parent,r.name,r.identity,["-e","const fs=require('node:fs');process.stdout.write(JSON.stringify({manifest:fs.readFileSync('config/release-gates.v2.json','utf8'),runner:fs.readFileSync('scripts/test-root.mjs','utf8')}));"])).toString("utf8")):{manifest:await F(S(i,"config","release-gates.v2.json"),"utf8"),runner:await F(S(i,"scripts","test-root.mjs"),"utf8")};if((await n(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-mismatch");const{manifest:o,runner:u}=await a(),[c,d]=await Promise.all([n(["show",`${e.headSha}:config/release-gates.v2.json`]),n(["show",`${e.headSha}:scripts/test-root.mjs`])]);if(o!==c||u!==d)throw new Error("p205-transient-producer-dirty");const l=JSON.parse(o),g=Array.isArray(l.requiredCompleteClasses)?l.requiredCompleteClasses.filter(x=>typeof x=="string"&&/^[a-z0-9-]+$/.test(x)):[];if(l.contract!=="P205-CI-02"||g.length===0)throw new Error("p205-transient-manifest-invalid");const h={...process.env};delete h.NEOCORTEX_PROFILE_DIR;const m=r?(await Te(r.parent,r.name,r.identity,["scripts/test-root.mjs","--gate","complete"])).toString("utf8"):String((await V(process.execPath,["scripts/test-root.mjs","--gate","complete"],{cwd:i,encoding:"utf8",maxBuffer:64*1024*1024,env:h})).stdout),{manifest:R,runner:k}=await a();if(R!==o||k!==u)throw new Error("p205-transient-producer-raced");if((await n(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-raced");const G=w("sha256").update(o).digest("hex"),y=w("sha256").update(m).digest("hex"),b=oe(e.nowIso??new Date().toISOString()),T=new Map,Z=Object.freeze(g);for(const x of t){const U=w("sha256").update(["p205-transient-execution-v1",q,e.headSha,x,G,g.join(","),y,b].join("\0")).digest("hex"),ge=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:q,executionHeadSha:e.headSha,graphRevision:x,manifestDigest:G,gateIds:Z,resultDigest:y,executedAt:b,executionEvidenceDigest:U}),ye=Object.freeze(Object.create(null));Fe.set(ye,ge),T.set(x,ye)}return T}async function Ie(i,e={}){const t=await Wi(i);return ni(t,e)}function Pi(i,e={}){let t;try{const r=M("git",["rev-parse","--git-common-dir"],{cwd:i,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=_e(i),a=ae(r)?v(r):v(n,r),s=_e(a);if(s!==a)throw new Error("git-lifecycle-common-dir-symlink");Ui(s);const o=S(s,le),u=S(o,he);if(H(o)&&(ai(o,"directory"),_e(o)!==o))throw new Error("git-lifecycle-runtime-directory-symlink");t=H(u)?u:S(s,xe)}catch{if(e.required)throw new Error("git-lifecycle-common-dir-invalid");return Pe()}if(!H(t)){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Pe()}return ai(t,"file"),Oe(JSON.parse(He(t,"utf8")))}async function $t(i){try{await Ie(i,{required:!0});return}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-missing")throw e}try{await Ke(i,()=>{},{expectedRevision:0})}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-revision-conflict")throw e;await Ie(i,{required:!0})}}function We(i,e,t){if(!i||i.ownerStoryId!==e)return!1;const r=typeof i.sessionId=="string"?i.sessionId:"",n=Date.parse(String(i.expiresAt));return/^setup-[a-f0-9]{64}$/.test(r)&&i.idempotencyKey===r&&Number.isFinite(n)&&n>t}async function Bt(i,e,t=new Date().toISOString()){if(!pt(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=S(v(i),".neocortex","state.json"),n=await F(r,"utf8"),a=f(JSON.parse(n));if(!a)throw new Error("git-lifecycle-tracked-state-invalid");const s=await Ie(i),o=Bi(a,s),u=f(f(o.epics)?.[e.epicId]),c=f(f(o.stories)?.[e.storyId]);if(!u)throw new Error("git-lifecycle-graph-authority-epic-invalid");if(!c||String(c.epic_id??e.storyId.split(".")[0])!==e.epicId)throw new Error("git-lifecycle-graph-authority-story-invalid");const d=Array.isArray(u.stories)?u.stories.filter(y=>typeof y=="string"):Object.keys(f(o.stories)??{}).filter(y=>{const b=f(f(o.stories)?.[y]);return String(b?.epic_id??y.split(".")[0])===e.epicId});if(Array.isArray(u.stories)&&!d.includes(e.storyId))throw new Error("git-lifecycle-graph-authority-story-invalid");const l=d.map(y=>{const b=f(f(o.stories)?.[y])??{};return{id:y,branch_name:typeof b.branch_name=="string"||b.branch_name===null?b.branch_name:void 0,pr_number:typeof b.pr_number=="number"||b.pr_number===null?b.pr_number:void 0,steps_completed:Array.isArray(b.steps_completed)?b.steps_completed.filter(T=>typeof T=="string"):[],checkpoint:f(b.checkpoint)}}),g=Ri({...u,id:e.epicId},l);if(g.mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-invalid");if(g.executionBranch!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-mismatch");if(g.originBranch!==void 0&&g.originBranch!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");const h=typeof f(s.epics[e.epicId])?.origin_branch=="string"?String(f(s.epics[e.epicId]).origin_branch):void 0;if(h!==void 0&&h!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");if(g.originBranch===void 0&&h===void 0){const{stdout:y}=await V("git",["branch","--show-current"],{cwd:i,encoding:"utf8",maxBuffer:1048576});if(String(y).trim()!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-physical-mismatch")}const m=typeof u.graph_revision=="string"?u.graph_revision:void 0,R=typeof f(s.epics[e.epicId])?.graph_revision=="string"?String(f(s.epics[e.epicId]).graph_revision):void 0;if(m!==void 0&&!p(m))throw new Error("git-lifecycle-graph-revision-invalid");if(m===e.graphRevision&&R===e.graphRevision&&g.originBranch===e.originBranch&&h===e.originBranch)return{applied:!1,reused:!0,revision:s.revision,graphRevision:e.graphRevision};const k=Date.parse(t);if(!Number.isFinite(k))throw new Error("git-lifecycle-graph-authority-time-invalid");const E=f(u.branch_lease);if(E&&Number.isFinite(Date.parse(String(E.expiresAt)))&&Date.parse(String(E.expiresAt))>k&&!We(E,e.storyId,k))throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await Ke(i,y=>{const b=Ni(y,e.epicId);if(b.branch_mode!==void 0&&b.branch_mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-raced");const T=b.execution_branch;if(T!==void 0&&T!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const Z=b.origin_branch;if(Z!==void 0&&Z!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-raced");const x=b.graph_revision;if(x!==void 0&&x!==m)throw new Error("git-lifecycle-graph-authority-epoch-raced");const U=f(b.branch_lease);if(U&&Number.isFinite(Date.parse(String(U.expiresAt)))&&Date.parse(String(U.expiresAt))>k&&!We(U,e.storyId,k))throw new Error("git-lifecycle-graph-authority-writer-active");b.branch_mode="epic",b.execution_branch=e.executionBranch,b.origin_branch=e.originBranch,b.graph_revision=e.graphRevision},{expectedRevision:s.revision,preCommit:async()=>{if(await F(r,"utf8")!==n)throw new Error("git-lifecycle-graph-authority-tracked-state-raced")}})).document.revision,graphRevision:e.graphRevision}}async function Ke(i,e,t={}){const r=await Ce(i),n=await ri(r),a=S(n,Ci),s=await yt(a);try{const o=S(n,he),u=S(r,xe),c=await ni(H(o)?o:u);if(t.expectedRevision!==void 0&&t.expectedRevision!==c.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const d=structuredClone(c),l=e(d),g=Oe({...d,schemaVersion:1,revision:c.revision+1});return await t.preCommit?.(g),await j(n,"directory"),await Qi(o),await _i(n,he,`${JSON.stringify(g,null,2)}
2
- `),await j(o,"file"),await $i(n),{document:g,value:l}}finally{await bt(a,s).catch(()=>{})}}async function $i(i){let e;try{e=await mi(i,"r")}catch(t){if(process.platform==="win32"&&(P(t,"EPERM")||P(t,"EISDIR")||P(t,"EINVAL")))return;throw t}try{await e.sync()}finally{await e.close()}}function Bi(i,e){const t=structuredClone(i),r=Ye(t,"epics"),n=Ye(t,"stories");for(const[a,s]of Object.entries(e.epics))r[a]={...f(r[a])??{},...structuredClone(s)};for(const[a,s]of Object.entries(e.stories)){const o=f(n[a])??{},u=o.steps_completed,c=s.steps_completed;s.status==="branch-ready"&&s.last_step===Ee&&Array.isArray(c)&&c.length===1&&c[0]===Ee&&s.checkpoint===void 0&&Array.isArray(u)&&u.includes(Ee)||(n[a]={...o,...structuredClone(s)})}return t}function Ye(i,e){const t=i[e];if(t===void 0){const a={};return i[e]=a,a}const r=f(t);if(r)return r;if(!Array.isArray(t))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of t){const s=f(a),o=typeof s?.id=="string"?s.id.trim():"";if(!o||n[o]!==void 0)throw new Error(`git-lifecycle-tracked-${e}-ambiguous`);n[o]=s}return i[e]=n,n}function Ni(i,e){return i.epics[e]??(i.epics[e]={})}function Nt(i,e){return i.stories[e]??(i.stories[e]={})}function Je(i,e,t,r){const n=f(i);return!!(n&&n.epicId===t&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&ci(n,e))}async function Vt(i,e,t,r,n,a,s=[]){return Qe(i,e,t,r,n,a,s).verdict==="verified"}function Qe(i,e,t,r,n,a,s=[],o=new Date().toISOString(),u=a===void 0?"scheduling":"integration"){const c=()=>Xe({storyId:t,epicId:r,executionBranch:n,value:e,verifiedAt:o,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!Je(e,t,r,n))return c();const d=f(e),l=f(d.qaReceipt),g=f(d.reviewReceipt),h=String(d.headSha),m=String(d.baseSha),R=Ae(i,t,h,g.reviewArtifactDigest===void 0),k=g.reviewArtifactDigest===void 0&&!Fi(i,t,h);if(g.reviewArtifactDigest!==void 0&&g.reviewArtifactDigest!==R?.digest)return c();const E=$(i,["rev-parse",`refs/heads/${n}`]).trim();if(M("git",["merge-base","--is-ancestor",h,E],{cwd:i,stdio:"ignore"}),!k&&R?.verdict!=="approved"){if(g.reviewArtifactDigest!==void 0||!Mi(i,d,g,l,t,r,E))return c()}else if(d.reviewReconciliation!==void 0)return c();const y=$(i,["show","--no-patch","--format=%H%n%P%n%B",h]),b=$(i,["rev-parse",`${h}^`]).trim(),T=$(i,["rev-list","--count",`${m}..${h}`]).trim();if(b!==m||T!=="1")return c();const Z=new Set(y.split(`
3
- `).map(N=>N.trim())),x=y.split(`
4
- `).map(N=>N.trim()).filter(N=>N.startsWith("Neocortex-Review-Artifact-Digest: "));if(x.length>0&&(x.length!==1||x[0]!==`Neocortex-Review-Artifact-Digest: ${R?.digest}`||g.reviewArtifactDigest!==R?.digest))return c();const ge=[`Neocortex-Story: ${t}`,`Neocortex-Epic: ${r}`,`Neocortex-Execution-Branch: ${n}`,`Neocortex-Bundle-Digest: ${String(d.bundleDigest)}`,`Neocortex-Graph-Revision: ${String(d.graphRevision)}`,...d.dispatchId?[`Neocortex-Dispatch: ${String(d.dispatchId)}`]:[],...d.bundleId?[`Neocortex-Bundle: ${String(d.bundleId)}`]:[],...d.claimRevision?[`Neocortex-Claim-Revision: ${String(d.claimRevision)}`]:[]].every(N=>Z.has(N));if(ge){const qe=[...Z].find(hi=>hi.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(qe))return c();M("git",["merge-base","--is-ancestor",qe,h],{cwd:i,stdio:"ignore"})}const ie=$(i,["diff-tree","--no-commit-id","--name-only","-r","-z",h]).split("\0").filter(Boolean);if(ie.length===0||ie.some(N=>!fe(N)))return c();const be=w("sha256").update(y).digest("hex"),we=w("sha256").update([...ie].sort().join("\0")).digest("hex"),L=Ze({projectRoot:i,checkpoint:d,storyId:t,epicId:r,executionBranch:n,baseSha:m,headSha:h,commitBodyDigest:be,changedPathsDigest:we,changedPaths:ie,authorizedWriteSet:s.length>0?s:qi(i,t)});if(!L||l.receiptRef!==`story-qa:${String(l.sourceEvidenceDigest)}`)return c();const Be=ji({storyId:t,baseSha:m,headSha:h,bundleDigest:String(d.bundleDigest),graphRevision:String(d.graphRevision),commitBody:y,changedPaths:ie}),Ne=l.evidenceVersion==="p205-execution-v2"&&l.contract==="P205-CI-02"&&l.command===q&&p(l.manifestDigest)&&z(l.gateIds,32,!0)&&p(l.resultDigest)&&l.sourceEvidenceDigest===Gi({gitEvidenceDigest:Be,headSha:h,graphRevision:String(d.graphRevision),manifestDigest:String(l.manifestDigest),gateIds:l.gateIds,resultDigest:String(l.resultDigest)}),ui=l.evidenceVersion==="git-immutable-v1"&&l.sourceEvidenceDigest===Be,gi=l.evidenceVersion===void 0&&L.mode==="legacy-migration"&&L.binding?.qaDigest===l.sourceEvidenceDigest,ve=Vi(a,E,String(d.graphRevision))&&(Ne||L.mode==="legacy-migration"&&(ui||gi)),Se=u==="scheduling"&&a===void 0&&Ne;if(!ve&&!Se)return c();const Ve=g.reviewArtifactDigest!==void 0,Le=w("sha256").update([Ve?"root-commit-range-review-v2":"root-commit-range-review-v1",t,m,h,String(d.bundleDigest),String(d.graphRevision),String(l.receiptRef),w("sha256").update(y).digest("hex"),[...ie].sort().join(","),...Ve?[R.digest]:[]].join("\0")).digest("hex");if(g.sourceEvidenceDigest!==Le||g.receiptRef!==`story-review:${Le}`||L.mode==="legacy-migration"&&L.binding?.reviewDigest!==void 0&&L.binding.reviewDigest!==g.sourceEvidenceDigest||!ge&&(Me[t]!==h||!Array.isArray(d.receiptRefs)||!d.receiptRefs.some(N=>typeof N=="string"&&N.startsWith("legacy-direct-yolo:"))))return c();const li=w("sha256").update(["checkpoint-p205-transient-v1",t,r,n,m,h,String(d.bundleDigest),be,we,L.mode,L.effectiveClaimRevision,String(l.sourceEvidenceDigest),String(g.sourceEvidenceDigest),...d.reviewReconciliation?[String(f(d.reviewReconciliation)?.sourceEvidenceDigest)]:[],ce(a)?.executionEvidenceDigest??(Se?"scheduling-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),te=ve?ce(a):void 0;return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:t,epicId:r,branch:n,baseSha:m,headSha:h,aggregateHeadSha:te?.executionHeadSha??h,commitBodyDigest:be,changedPathsDigest:we,claimVerification:L.mode,effectiveClaimRevision:L.effectiveClaimRevision,sourceEvidenceDigest:li,command:q,manifestDigest:te?.manifestDigest??"0".repeat(64),gateIds:te?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:te?.resultDigest??"0".repeat(64),graphRevision:String(d.graphRevision),executionEvidenceDigest:te?.executionEvidenceDigest??"0".repeat(64),verifiedAt:te?.executedAt??oe(o),verdict:"verified",reasonCodes:Object.freeze([ve?"checkpoint-p205-transient-verified":Se?"checkpoint-git-scheduling-verified":"checkpoint-legacy-bounded-verified",...L.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return c()}}function Lt(i,e,t,r,n,a,s=[],o=new Date().toISOString()){const u=a?"integration":"scheduling",c=Qe(i,e,t,r,n,a,s,o,u);return c.verdict!=="verified"?{kind:"rejected",verification:c}:u==="integration"?{kind:"integration-authorized",verification:c}:c.reasonCodes.includes("checkpoint-git-scheduling-verified")?{kind:"scheduling-only",evidence:Object.freeze({schemaVersion:1,kind:"story_scheduling_checkpoint_evidence",producer:"client-git-physical-v1",storyId:t,epicId:r,branch:n,baseSha:c.baseSha,headSha:c.headSha,graphRevision:c.graphRevision,effectiveClaimRevision:c.effectiveClaimRevision,sourceEvidenceDigest:c.sourceEvidenceDigest,verifiedAt:c.verifiedAt,reasonCodes:Object.freeze(["checkpoint-git-scheduling-verified"]),integrationAuthorized:!1,publicSafe:!0})}:{kind:"rejected",verification:Xe({storyId:t,epicId:r,executionBranch:n,value:e,verifiedAt:o,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"})}}function Vi(i,e,t){const r=ce(i);return!!(r&&r.schemaVersion===1&&r.kind==="p205_transient_execution_authority"&&r.contract==="P205-CI-02"&&r.command===q&&r.graphRevision===t&&p(r.resultDigest)&&p(r.executionEvidenceDigest)&&r.executionHeadSha===e&&D(e))}function ce(i){return i&&typeof i=="object"?Fe.get(i):void 0}function qt(i){const e=ce(i);return e?Object.freeze({executionHeadSha:e.executionHeadSha,graphRevision:e.graphRevision,manifestDigest:e.manifestDigest,gateIds:Object.freeze([...e.gateIds]),resultDigest:e.resultDigest,executedAt:e.executedAt,executionEvidenceDigest:e.executionEvidenceDigest}):void 0}function zt(i,e,t){const r=ce(i);return!!(r&&r.executionHeadSha===e&&r.graphRevision===t&&r.command===q)}function Ze(i){const e=ki[i.storyId],t=typeof i.checkpoint.claimRevision=="string"?i.checkpoint.claimRevision:void 0,r=i.storyId==="P174.03.811759"||i.storyId==="P174.03.685003",n=Li(i.authorizedWriteSet);let a=[];if(i.checkpoint.rootMemoryEffect!==void 0){if(e)return;try{a=Di(i.projectRoot,i.checkpoint.rootMemoryEffect,{storyId:i.storyId,executionBranch:i.executionBranch,baseSha:i.baseSha,headRef:i.headSha,childPaths:n}).files.map(o=>o.path)}catch{return}}const s=n.length>0&&n.length===i.authorizedWriteSet.length&&i.changedPaths.every(o=>n.some(u=>Hi(u,o))||a.includes(o));if(e&&i.epicId==="P174"&&i.executionBranch==="epic/P174"&&i.baseSha===e.baseSha&&i.headSha===e.headSha&&i.checkpoint.graphRevision===e.graphRevision&&i.commitBodyDigest===e.commitBodyDigest&&i.changedPathsDigest===e.changedPathsDigest&&(r?t===void 0:t===e.effectiveClaimRevision))return i.authorizedWriteSet.length>0&&(!s||!Ue(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(t!==void 0&&!(!t||!p(t))&&!(!s||!Ue(t,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:t})}function Li(i){const e=i.map(t=>t.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(t=>!fe(t))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function qi(i,e){try{const t=JSON.parse(He(S(i,".neocortex","state.json"),"utf8")),r=f(t.stories),n=f(r?.[e]),a=Pi(i),s=f(a.stories[e]?.checkpoint)??f(n?.checkpoint);return zi(e,n,s)}catch{return[]}}function zi(i,e,t){const r=Array.isArray(e?.files_to_modify)?e.files_to_modify.filter(n=>typeof n=="string"):[];if(!t?.dispatchId||!t.bundleId)return r;try{return vi({...e,id:i,files_to_modify:r})}catch{return[]}}function Ue(i,e){return i===w("sha256").update(e.join("\0")).digest("hex")||i===w("sha256").update(JSON.stringify(e)).digest("hex")}function Hi(i,e){return i===e||i.endsWith("/")&&e.startsWith(i)}function Ht(i,e,t,r,n,a){try{if(!Je(e,t,r,n))return!1;const s=f(e),o=f(s.qaReceipt),u=f(s.reviewReceipt),c=String(s.headSha),d=String(s.baseSha),l=$(i,["rev-parse",`refs/heads/${n}`]).trim();if(M("git",["merge-base","--is-ancestor",c,l],{cwd:i,stdio:"ignore"}),$(i,["rev-parse",`${c}^`]).trim()!==d||$(i,["rev-list","--count",`${d}..${c}`]).trim()!=="1")return!1;const g=$(i,["show","--no-patch","--format=%H%n%P%n%B",c]),h=$(i,["diff-tree","--no-commit-id","--name-only","-r","-z",c]).split("\0").filter(Boolean);if(h.length===0||h.some(R=>!fe(R)))return!1;const m=Ze({projectRoot:i,checkpoint:s,storyId:t,epicId:r,executionBranch:n,baseSha:d,headSha:c,changedPaths:h,authorizedWriteSet:a,commitBodyDigest:w("sha256").update(g).digest("hex"),changedPathsDigest:w("sha256").update([...h].sort().join("\0")).digest("hex")});return!(m?.mode!=="legacy-migration"||!m.binding||o.sourceEvidenceDigest!==m.binding.qaDigest||o.receiptRef!==`story-qa:${m.binding.qaDigest}`||u.sourceEvidenceDigest!==m.binding.reviewDigest||u.receiptRef!==`story-review:${m.binding.reviewDigest}`||u.qaReceiptRef!==o.receiptRef)}catch{return!1}}function ji(i){return w("sha256").update(["local-yolo-tdd-git-immutable-v1",i.storyId,i.baseSha,i.headSha,i.bundleDigest,i.graphRevision,w("sha256").update(i.commitBody).digest("hex"),w("sha256").update([...i.changedPaths].sort().join("\0")).digest("hex")].join("\0")).digest("hex")}function Gi(i){return w("sha256").update(["local-yolo-tdd-p205-execution-v2",q,i.gitEvidenceDigest,i.headSha,i.graphRevision,i.manifestDigest,i.gateIds.join(","),i.resultDigest].join("\0")).digest("hex")}function Xe(i){const e=f(i.value);return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:i.storyId,epicId:i.epicId,branch:i.executionBranch,baseSha:D(e?.baseSha)?String(e?.baseSha):"0".repeat(40),headSha:D(e?.headSha)?String(e?.headSha):"0".repeat(40),aggregateHeadSha:"0".repeat(40),commitBodyDigest:"0".repeat(64),changedPathsDigest:"0".repeat(64),claimVerification:"canonical",effectiveClaimRevision:"0".repeat(64),command:q,manifestDigest:"0".repeat(64),gateIds:Object.freeze([]),resultDigest:"0".repeat(64),graphRevision:"0".repeat(64),executionEvidenceDigest:"0".repeat(64),sourceEvidenceDigest:"0".repeat(64),verifiedAt:oe(i.verifiedAt),verdict:i.verdict,reasonCodes:Object.freeze([i.reasonCode]),publicSafe:!0})}function $(i,e){return M("git",[...e],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})}function Ae(i,e,t,r=!1){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(e)||t!==":"&&!/^[a-f0-9]{40,64}$/i.test(t))return;const n=`.neocortex/stories/${e}/review.md`;let a;try{a=M("git",["show",`${t===":"?":":`${t}:`}${n}`],{cwd:i,maxBuffer:128*1024,stdio:["ignore","pipe","ignore"]})}catch{return}if(a.length===0||a.length>64*1024||a.includes(0))return;let s;try{s=new TextDecoder("utf-8",{fatal:!0}).decode(a)}catch{return}const o=s.replace(/\r\n/g,`
1
+ import{execFile as Ii,execFileSync as G}from"node:child_process";import{createHash as b,randomBytes as Re}from"node:crypto";import{lstat as _e,open as ki,readFile as Z,realpath as re,stat as Ci}from"node:fs/promises";import{existsSync as Y,lstatSync as Fe,readFileSync as xe,realpathSync as Ee}from"node:fs";import{basename as P,dirname as X,isAbsolute as he,join as D,relative as Oi,resolve as v}from"node:path";import{promisify as Bi}from"node:util";import{publicWriteSet as Pi}from"../../../shared/dist/yoloop/public-story-write-set.js";import{isRootProjectMemoryEffect as Hi}from"../private-execution/shared-root-memory-types.js";import{verifyRootMemoryPhysicalWriteSet as $i}from"../private-execution/root-memory-git-evidence.js";import{resolveBranchUnit as Ni}from"../../../shared/dist/yoloop/branch-unit.js";import{epicHeadReconciliationInputDigest as Ke,epicHeadReconciliationPathsDigest as Ye,epicHeadReconciliationRangeDigest as Vi,validateEpicHeadReconciliationReceipt as Li}from"../../../shared/dist/yoloop/epic-terminal-git.js";import{anchoredAtomicWriteFile as zi,anchoredCreateOwnedDirectory as Je,anchoredEnsureDirectory as Qe,anchoredExecuteGit as qi,anchoredExecuteNode as Ze,anchoredRemoveDirectory as Ti,anchoredRenameDirectory as oe}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as ji,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as Gi,GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID as Ae}from"./git-lifecycle-step-ids.js";const T=Bi(Ii),ye="neocortex-yoloop",we="runtime.json",F="node scripts/test-root.mjs --gate complete",Ue=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),Wi=Object.freeze({"P174.03.811759":Object.freeze({baseSha:"749c8fc732deaf26c81a8e08cc94b83c8cf0f5ba",headSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",commitBodyDigest:"b4fc759a49765fd8c0b3d0f5d1c333c2a4bf28d324e83eedabb12f9530df3738",changedPathsDigest:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",qaDigest:"f1100775e21f5d0d990f77303a2a06d936908f016983e32a63316d81aee6b9fc",reviewDigest:"50400bbcddb6f02408837cf99077de5d3af8c84822ab23a8b5499c338af7103a"}),"P174.03.685003":Object.freeze({baseSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",headSha:"272a7fee89e4b9324d35701df1c83b671fa96299",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",commitBodyDigest:"e97966e26ce3ba31d5951b9fdac67808c88c1fd8be7ec1e73982f3f1cc7ffd81",changedPathsDigest:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",qaDigest:"7439329a93321f39fb6b0de0a41c22e58373a399f9048e362dff4ffa6f1a7d89",reviewDigest:"1b2d12262e84acf9da7d06149a0effb11274ebdc986affbfd47635b855ec7135"}),"P174.03.029264":Object.freeze({baseSha:"272a7fee89e4b9324d35701df1c83b671fa96299",headSha:"339141be7339a0edf55710cbccb6e6558f514792",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",commitBodyDigest:"0f269a00dcd168a6f548ff10dfa667b193c948ac9c7211f5cb11a0561757c371",changedPathsDigest:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",qaDigest:"ef0fd2c6e216557825cd8521ccb2f9960a3af48f18e7a5ada441bee8bfda400b",reviewDigest:"372d0f4a2f32978c8b39f20167637b3917187edb75d49875e93200c4c5a19d0d"}),"P174.03.913359":Object.freeze({baseSha:"339141be7339a0edf55710cbccb6e6558f514792",headSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",commitBodyDigest:"89a6653197509e75246a758d2706876b337770571a1cac47d9d85ec96c196459",changedPathsDigest:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",qaDigest:"c7d3762ad30e4f9356243df17a1dd7123cbf1b660808d68176f44d1cd5da6449",reviewDigest:"e4ecf577e174fd66f31aa4a0113ab672ced16b12ee531f6831aa533795145ba1"}),"P174.03.724350":Object.freeze({baseSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",headSha:"568e9464fb086304146b9eb4594281f91302aef1",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",commitBodyDigest:"b3032338bfcd6c9dc460e9426220a1966dedeff9968c4064fdd36a315560721b",changedPathsDigest:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",qaDigest:"91f2f5b00935b1b04bb5d400df500cbc97c412072078b713c6e5ba8fda669bd0",reviewDigest:"9bc92069d3b3a76cc8b02d339d432690258be1376464b69e152ed8fd3d682f05"}),"P174.03.011976":Object.freeze({baseSha:"568e9464fb086304146b9eb4594281f91302aef1",headSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",commitBodyDigest:"b8a28392fac663dd614b695a49c894b7cab116d45722a42850e3b24e2aaf36f4",changedPathsDigest:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",qaDigest:"6eb4459a7d80c4a268fc931297e8156ed2a320584f8775f0787d91b42c0929d4",reviewDigest:"98b21de29f7cceeec73da19000c6c144395cce6eb699c6a82dfab505d4ab7b44"}),"P174.03.686659":Object.freeze({baseSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",headSha:"0db3681a5dad4e25ce37d967c636eb9d54915556",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",commitBodyDigest:"143257f4018ad773afc0c7280bd8aab8786851a9c20b65f8110881ff54656839",changedPathsDigest:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",qaDigest:"6303dbf473e2815a3671aeb2c25528d8daba484b92a5a40d1eea5215e1f6763e",reviewDigest:"1bd6695846ed9340c8677cfa9b573880532187aeee487efaaa70577a0c94e7f2"})}),Ie="neocortex-yoloop-runtime.json",Mi="runtime.lock",ke=new WeakMap,Xe=new WeakMap,Ce=new WeakSet;async function Ft(i,e){return(await Fi(i,{headSha:e.headSha,graphRevisions:[e.graphRevision],...e.nowIso!==void 0?{nowIso:e.nowIso}:{},...e.anchoredWorkspace!==void 0?{anchoredWorkspace:e.anchoredWorkspace}:{}})).get(e.graphRevision)}async function Fi(i,e){const t=[...new Set(e.graphRevisions)];if(!S(e.headSha)||t.length===0||t.some(x=>!p(x)))throw new Error("p205-transient-binding-invalid");const r=e.anchoredWorkspace;if(r&&v(i)!==D(v(r.parent),r.name))throw new Error("p205-transient-anchor-binding-invalid");const n=async x=>r?(await qi(r.parent,r.name,r.identity,x)).toString("utf8"):String((await T("git",[...x],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout),a=async()=>r?JSON.parse((await Ze(r.parent,r.name,r.identity,["-e","const fs=require('node:fs');process.stdout.write(JSON.stringify({manifest:fs.readFileSync('config/release-gates.v2.json','utf8'),runner:fs.readFileSync('scripts/test-root.mjs','utf8')}));"])).toString("utf8")):{manifest:await Z(D(i,"config","release-gates.v2.json"),"utf8"),runner:await Z(D(i,"scripts","test-root.mjs"),"utf8")};if((await n(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-mismatch");const{manifest:o,runner:g}=await a(),[c,f]=await Promise.all([n(["show",`${e.headSha}:config/release-gates.v2.json`]),n(["show",`${e.headSha}:scripts/test-root.mjs`])]);if(o!==c||g!==f)throw new Error("p205-transient-producer-dirty");const h=JSON.parse(o),u=Array.isArray(h.requiredCompleteClasses)?h.requiredCompleteClasses.filter(x=>typeof x=="string"&&/^[a-z0-9-]+$/.test(x)):[];if(h.contract!=="P205-CI-02"||u.length===0)throw new Error("p205-transient-manifest-invalid");const l={...process.env};delete l.NEOCORTEX_PROFILE_DIR;const m=r?(await Ze(r.parent,r.name,r.identity,["scripts/test-root.mjs","--gate","complete"])).toString("utf8"):String((await T(process.execPath,["scripts/test-root.mjs","--gate","complete"],{cwd:i,encoding:"utf8",maxBuffer:64*1024*1024,env:l})).stdout),{manifest:R,runner:C}=await a();if(R!==o||C!==g)throw new Error("p205-transient-producer-raced");if((await n(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-raced");const W=b("sha256").update(o).digest("hex"),y=b("sha256").update(m).digest("hex"),w=se(e.nowIso??new Date().toISOString()),M=new Map,U=Object.freeze(u);for(const x of t){const O=b("sha256").update(["p205-transient-execution-v1",F,e.headSha,x,W,u.join(","),y,w].join("\0")).digest("hex"),te=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:F,executionHeadSha:e.headSha,graphRevision:x,manifestDigest:W,gateIds:U,resultDigest:y,executedAt:w,executionEvidenceDigest:O}),$=Object.freeze(Object.create(null));ke.set($,te),M.set(x,$)}return M}async function Oe(i,e={}){const t=await rt(i);return pi(t,e)}function ei(i,e={}){let t;try{const r=G("git",["rev-parse","--git-common-dir"],{cwd:i,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=Ee(i),a=he(r)?v(r):v(n,r),s=Ee(a);if(s!==a)throw new Error("git-lifecycle-common-dir-symlink");dt(s);const o=D(s,ye),g=D(o,we);if(Y(o)&&(mi(o,"directory"),Ee(o)!==o))throw new Error("git-lifecycle-runtime-directory-symlink");t=Y(g)?g:D(s,Ie)}catch{if(e.required)throw new Error("git-lifecycle-common-dir-invalid");return ze()}if(!Y(t)){if(e.required)throw new Error("git-lifecycle-runtime-missing");return ze()}return mi(t,"file"),Ve(JSON.parse(xe(t,"utf8")))}async function Kt(i){try{await Oe(i,{required:!0});return}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-missing")throw e}try{await Be(i,()=>{},{expectedRevision:0})}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-revision-conflict")throw e;await Oe(i,{required:!0})}}function ii(i,e,t){if(!i||i.ownerStoryId!==e)return!1;const r=typeof i.sessionId=="string"?i.sessionId:"",n=Date.parse(String(i.expiresAt));return/^setup-[a-f0-9]{64}$/.test(r)&&i.idempotencyKey===r&&Number.isFinite(n)&&n>t}async function Yt(i,e,t=new Date().toISOString()){if(!It(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=D(v(i),".neocortex","state.json"),n=await Z(r,"utf8"),a=d(JSON.parse(n));if(!a)throw new Error("git-lifecycle-tracked-state-invalid");const s=await Oe(i),o=ti(a,s),g=d(d(o.epics)?.[e.epicId]),c=d(d(o.stories)?.[e.storyId]);if(!g)throw new Error("git-lifecycle-graph-authority-epic-invalid");if(!c||String(c.epic_id??e.storyId.split(".")[0])!==e.epicId)throw new Error("git-lifecycle-graph-authority-story-invalid");const f=Array.isArray(g.stories)?g.stories.filter(y=>typeof y=="string"):Object.keys(d(o.stories)??{}).filter(y=>{const w=d(d(o.stories)?.[y]);return String(w?.epic_id??y.split(".")[0])===e.epicId});if(Array.isArray(g.stories)&&!f.includes(e.storyId))throw new Error("git-lifecycle-graph-authority-story-invalid");const h=f.map(y=>{const w=d(d(o.stories)?.[y])??{};return{id:y,branch_name:typeof w.branch_name=="string"||w.branch_name===null?w.branch_name:void 0,pr_number:typeof w.pr_number=="number"||w.pr_number===null?w.pr_number:void 0,steps_completed:Array.isArray(w.steps_completed)?w.steps_completed.filter(M=>typeof M=="string"):[],checkpoint:d(w.checkpoint)}}),u=Ni({...g,id:e.epicId},h);if(u.mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-invalid");if(u.executionBranch!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-mismatch");if(u.originBranch!==void 0&&u.originBranch!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");const l=typeof d(s.epics[e.epicId])?.origin_branch=="string"?String(d(s.epics[e.epicId]).origin_branch):void 0;if(l!==void 0&&l!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");if(u.originBranch===void 0&&l===void 0){const{stdout:y}=await T("git",["branch","--show-current"],{cwd:i,encoding:"utf8",maxBuffer:1048576});if(String(y).trim()!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-physical-mismatch")}const m=typeof g.graph_revision=="string"?g.graph_revision:void 0,R=typeof d(s.epics[e.epicId])?.graph_revision=="string"?String(d(s.epics[e.epicId]).graph_revision):void 0;if(m!==void 0&&!p(m))throw new Error("git-lifecycle-graph-revision-invalid");if(m===e.graphRevision&&R===e.graphRevision&&u.originBranch===e.originBranch&&l===e.originBranch)return{applied:!1,reused:!0,revision:s.revision,graphRevision:e.graphRevision};const C=Date.parse(t);if(!Number.isFinite(C))throw new Error("git-lifecycle-graph-authority-time-invalid");const _=d(g.branch_lease);if(_&&Number.isFinite(Date.parse(String(_.expiresAt)))&&Date.parse(String(_.expiresAt))>C&&!ii(_,e.storyId,C))throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await Be(i,y=>{const w=ni(y,e.epicId);if(w.branch_mode!==void 0&&w.branch_mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-raced");const M=w.execution_branch;if(M!==void 0&&M!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const U=w.origin_branch;if(U!==void 0&&U!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-raced");const x=w.graph_revision;if(x!==void 0&&x!==m)throw new Error("git-lifecycle-graph-authority-epoch-raced");const O=d(w.branch_lease);if(O&&Number.isFinite(Date.parse(String(O.expiresAt)))&&Date.parse(String(O.expiresAt))>C&&!ii(O,e.storyId,C))throw new Error("git-lifecycle-graph-authority-writer-active");w.branch_mode="epic",w.execution_branch=e.executionBranch,w.origin_branch=e.originBranch,w.graph_revision=e.graphRevision},{expectedRevision:s.revision,preCommit:async()=>{if(await Z(r,"utf8")!==n)throw new Error("git-lifecycle-graph-authority-tracked-state-raced")}})).document.revision,graphRevision:e.graphRevision}}async function Be(i,e,t={}){const r=await Ne(i),n=await li(r),a=D(n,Mi),s=await Ct(a);try{const o=D(n,we),g=D(r,Ie),c=await pi(Y(o)?o:g);if(t.expectedRevision!==void 0&&t.expectedRevision!==c.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const f=structuredClone(c),h=e(f);if(c.schemaVersion===2&&t.nextSchemaVersion!==void 0&&t.nextSchemaVersion!==2)throw new Error("git-lifecycle-runtime-schema-downgrade");const u=Ve({...f,schemaVersion:t.nextSchemaVersion??c.schemaVersion,revision:c.revision+1});return await t.preCommit?.(u),await J(n,"directory"),await ot(o),await zi(n,we,`${JSON.stringify(u,null,2)}
2
+ `),await J(o,"file"),await Ki(n),{document:u,value:h}}finally{await Ot(a,s).catch(()=>{})}}async function Ki(i){let e;try{e=await ki(i,"r")}catch(t){if(process.platform==="win32"&&(H(t,"EPERM")||H(t,"EISDIR")||H(t,"EINVAL")))return;throw t}try{await e.sync()}finally{await e.close()}}function ti(i,e){const t=structuredClone(i),r=ri(t,"epics"),n=ri(t,"stories");for(const[a,s]of Object.entries(e.epics))r[a]={...d(r[a])??{},...structuredClone(s)};for(const[a,s]of Object.entries(e.stories)){const o=d(n[a])??{},g=o.steps_completed,c=s.steps_completed;s.status==="branch-ready"&&s.last_step===Ae&&Array.isArray(c)&&c.length===1&&c[0]===Ae&&s.checkpoint===void 0&&Array.isArray(g)&&g.includes(Ae)||(n[a]={...o,...structuredClone(s)})}return t}function ri(i,e){const t=i[e];if(t===void 0){const a={};return i[e]=a,a}const r=d(t);if(r)return r;if(!Array.isArray(t))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of t){const s=d(a),o=typeof s?.id=="string"?s.id.trim():"";if(!o||n[o]!==void 0)throw new Error(`git-lifecycle-tracked-${e}-ambiguous`);n[o]=s}return i[e]=n,n}function ni(i,e){return i.epics[e]??(i.epics[e]={})}function Jt(i,e){return i.stories[e]??(i.stories[e]={})}function ai(i,e,t,r){const n=d(i);return!!(n&&n.epicId===t&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&yi(n,e))}async function Qt(i,e,t,r,n,a,s=[]){return ci(i,e,t,r,n,a,s).verdict==="verified"}function ci(i,e,t,r,n,a,s=[],o=new Date().toISOString(),g=a===void 0?"scheduling":"integration"){const c=()=>fi({storyId:t,epicId:r,executionBranch:n,value:e,verifiedAt:o,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!ai(e,t,r,n))return c();const f=d(e),h=d(f.qaReceipt),u=d(f.reviewReceipt),l=String(f.headSha),m=String(f.baseSha),R=He(i,t,l,u.reviewArtifactDigest===void 0),C=u.reviewArtifactDigest===void 0&&!tt(i,t,l);if(u.reviewArtifactDigest!==void 0&&u.reviewArtifactDigest!==R?.digest)return c();const _=E(i,["rev-parse",`refs/heads/${n}`]).trim();if(G("git",["merge-base","--is-ancestor",l,_],{cwd:i,stdio:"ignore"}),!C&&R?.verdict!=="approved"){if(u.reviewArtifactDigest!==void 0||!it(i,f,u,h,t,r,_))return c()}else if(f.reviewReconciliation!==void 0)return c();const y=E(i,["show","--no-patch","--format=%H%n%P%n%B",l]),w=E(i,["rev-parse",`${l}^`]).trim(),M=E(i,["rev-list","--count",`${m}..${l}`]).trim();if(w!==m||M!=="1")return c();const U=new Set(y.split(`
3
+ `).map(q=>q.trim())),x=y.split(`
4
+ `).map(q=>q.trim()).filter(q=>q.startsWith("Neocortex-Review-Artifact-Digest: "));if(x.length>0&&(x.length!==1||x[0]!==`Neocortex-Review-Artifact-Digest: ${R?.digest}`||u.reviewArtifactDigest!==R?.digest))return c();const te=[`Neocortex-Story: ${t}`,`Neocortex-Epic: ${r}`,`Neocortex-Execution-Branch: ${n}`,`Neocortex-Bundle-Digest: ${String(f.bundleDigest)}`,`Neocortex-Graph-Revision: ${String(f.graphRevision)}`,...f.dispatchId?[`Neocortex-Dispatch: ${String(f.dispatchId)}`]:[],...f.bundleId?[`Neocortex-Bundle: ${String(f.bundleId)}`]:[],...f.claimRevision?[`Neocortex-Claim-Revision: ${String(f.claimRevision)}`]:[]].every(q=>U.has(q));if(te){const Me=[...U].find(Ai=>Ai.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(Me))return c();G("git",["merge-base","--is-ancestor",Me,l],{cwd:i,stdio:"ignore"})}const N=E(i,["diff-tree","--no-commit-id","--name-only","-r","-z",l]).split("\0").filter(Boolean);if(N.length===0||N.some(q=>!fe(q)))return c();const j=b("sha256").update(y).digest("hex"),me=b("sha256").update([...N].sort().join("\0")).digest("hex"),V=oi({projectRoot:i,checkpoint:f,storyId:t,epicId:r,executionBranch:n,baseSha:m,headSha:l,commitBodyDigest:j,changedPathsDigest:me,changedPaths:N,authorizedWriteSet:s.length>0?s:Zi(i,t)});if(!V||h.receiptRef!==`story-qa:${String(h.sourceEvidenceDigest)}`)return c();const Te=Ui({storyId:t,baseSha:m,headSha:l,bundleDigest:String(f.bundleDigest),graphRevision:String(f.graphRevision),commitBody:y,changedPaths:N}),je=h.evidenceVersion==="p205-execution-v2"&&h.contract==="P205-CI-02"&&h.command===F&&p(h.manifestDigest)&&z(h.gateIds,32,!0)&&p(h.resultDigest)&&h.sourceEvidenceDigest===Xi({gitEvidenceDigest:Te,headSha:l,graphRevision:String(f.graphRevision),manifestDigest:String(h.manifestDigest),gateIds:h.gateIds,resultDigest:String(h.resultDigest)}),_i=h.evidenceVersion==="git-immutable-v1"&&h.sourceEvidenceDigest===Te,xi=h.evidenceVersion===void 0&&V.mode==="legacy-migration"&&V.binding?.qaDigest===h.sourceEvidenceDigest,Se=Ji(a,_,String(f.graphRevision))&&(je||V.mode==="legacy-migration"&&(_i||xi)),De=g==="scheduling"&&a===void 0&&je;if(!Se&&!De)return c();const Ge=u.reviewArtifactDigest!==void 0,We=b("sha256").update([Ge?"root-commit-range-review-v2":"root-commit-range-review-v1",t,m,l,String(f.bundleDigest),String(f.graphRevision),String(h.receiptRef),b("sha256").update(y).digest("hex"),[...N].sort().join(","),...Ge?[R.digest]:[]].join("\0")).digest("hex");if(u.sourceEvidenceDigest!==We||u.receiptRef!==`story-review:${We}`||V.mode==="legacy-migration"&&V.binding?.reviewDigest!==void 0&&V.binding.reviewDigest!==u.sourceEvidenceDigest||!te&&(Ue[t]!==l||!Array.isArray(f.receiptRefs)||!f.receiptRefs.some(q=>typeof q=="string"&&q.startsWith("legacy-direct-yolo:"))))return c();const Ei=b("sha256").update(["checkpoint-p205-transient-v1",t,r,n,m,l,String(f.bundleDigest),j,me,V.mode,V.effectiveClaimRevision,String(h.sourceEvidenceDigest),String(u.sourceEvidenceDigest),...f.reviewReconciliation?[String(d(f.reviewReconciliation)?.sourceEvidenceDigest)]:[],ue(a)?.executionEvidenceDigest??(De?"scheduling-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),ce=Se?ue(a):void 0;return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:t,epicId:r,branch:n,baseSha:m,headSha:l,aggregateHeadSha:ce?.executionHeadSha??l,commitBodyDigest:j,changedPathsDigest:me,claimVerification:V.mode,effectiveClaimRevision:V.effectiveClaimRevision,sourceEvidenceDigest:Ei,command:F,manifestDigest:ce?.manifestDigest??"0".repeat(64),gateIds:ce?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:ce?.resultDigest??"0".repeat(64),graphRevision:String(f.graphRevision),executionEvidenceDigest:ce?.executionEvidenceDigest??"0".repeat(64),verifiedAt:ce?.executedAt??se(o),verdict:"verified",reasonCodes:Object.freeze([Se?"checkpoint-p205-transient-verified":De?"checkpoint-git-scheduling-verified":"checkpoint-legacy-bounded-verified",...V.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return c()}}function Yi(i,e,t,r,n,a,s=[],o=new Date().toISOString()){const g=a?"integration":"scheduling",c=ci(i,e,t,r,n,a,s,o,g);return c.verdict!=="verified"?{kind:"rejected",verification:c}:g==="integration"?{kind:"integration-authorized",verification:c}:c.reasonCodes.includes("checkpoint-git-scheduling-verified")?{kind:"scheduling-only",evidence:Object.freeze({schemaVersion:1,kind:"story_scheduling_checkpoint_evidence",producer:"client-git-physical-v1",storyId:t,epicId:r,branch:n,baseSha:c.baseSha,headSha:c.headSha,graphRevision:c.graphRevision,effectiveClaimRevision:c.effectiveClaimRevision,sourceEvidenceDigest:c.sourceEvidenceDigest,verifiedAt:c.verifiedAt,reasonCodes:Object.freeze(["checkpoint-git-scheduling-verified"]),integrationAuthorized:!1,publicSafe:!0})}:{kind:"rejected",verification:fi({storyId:t,epicId:r,executionBranch:n,value:e,verifiedAt:o,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"})}}function Ji(i,e,t){const r=ue(i);return!!(r&&r.schemaVersion===1&&r.kind==="p205_transient_execution_authority"&&r.contract==="P205-CI-02"&&r.command===F&&r.graphRevision===t&&p(r.resultDigest)&&p(r.executionEvidenceDigest)&&r.executionHeadSha===e&&S(e))}function ue(i){return i&&typeof i=="object"?ke.get(i):void 0}function Zt(i){const e=ue(i);return e?Object.freeze({executionHeadSha:e.executionHeadSha,graphRevision:e.graphRevision,manifestDigest:e.manifestDigest,gateIds:Object.freeze([...e.gateIds]),resultDigest:e.resultDigest,executedAt:e.executedAt,executionEvidenceDigest:e.executionEvidenceDigest}):void 0}function Ut(i,e,t){const r=ue(i);return!!(r&&r.executionHeadSha===e&&r.graphRevision===t&&r.command===F)}async function Xt(i,e,t,r=new Date().toISOString()){const n=JSON.parse(xe(D(i,".neocortex","state.json"),"utf8")),a=ei(i,{required:!0}),s=ti(n,a),o=d(s.epics),g=d(s.stories),c=d(o?.[e.epicId]),f=d(c?.origin_binding),h=d(c?.aggregate_qa_receipt);if(!c||!g||c.branch_mode!=="epic"||c.execution_branch!==e.executionBranch||c.origin_branch!==e.originBranch||c.graph_revision!==e.graphRevision||!f||f.originHeadSha!==e.originHeadSha||f.originBranch!==e.originBranch||f.executionBranch!==e.executionBranch||!h||h.receiptRef!==t.receiptRef||h.executionHeadSha!==t.executionHeadSha||h.graphRevision!==t.graphRevision||h.manifestDigest!==t.manifestDigest||h.resultDigest!==t.resultDigest)throw new Error("epic-head-reconciliation-state-drift");const u=E(i,["symbolic-ref","--quiet","--short","HEAD"]).trim(),l=E(i,["rev-parse","HEAD"]).trim();if(u!==e.executionBranch||l!==e.executionHeadSha)throw new Error("epic-head-reconciliation-head-raced");G("git",["cat-file","-e",`${e.originHeadSha}^{commit}`],{cwd:i,stdio:"ignore"}),G("git",["merge-base","--is-ancestor",e.originHeadSha,l],{cwd:i,stdio:"ignore"});const m=Array.isArray(c.stories)?c.stories.filter($=>typeof $=="string"):Object.keys(g).filter($=>$.startsWith(`${e.epicId}.`)),R=[],C=new Set;for(const $ of m){const N=d(g[$]),j=d(N?.checkpoint);if(!N||!j)throw new Error("epic-head-reconciliation-checkpoint-drift");if(Yi(i,j,$,e.epicId,e.executionBranch,void 0,Pe($,N,j),r).kind!=="scheduling-only")throw new Error("epic-head-reconciliation-checkpoint-drift");R.push(String(j.headSha));for(const V of Pe($,N,j))C.add(V)}const _=R.at(-1);if(!_||_!==e.lastAcceptedCheckpointHeadSha)throw new Error("epic-head-reconciliation-checkpoint-drift");G("git",["merge-base","--is-ancestor",_,l],{cwd:i,stdio:"ignore"});const W=E(i,["rev-list","--first-parent","--reverse",`${_}..${l}`]).trim().split(`
5
+ `).filter(Boolean),y=E(i,["diff","--name-only","-z",`${_}..${l}`]).split("\0").filter(Boolean).sort(),w=[...C].sort(),M=Object.freeze({...e,revalidatedAt:se(r),inputDigest:void 0}),{inputDigest:U,...x}=M,O=Object.freeze({...x,inputDigest:Ke(x)});if(!ae(m,O.acceptedCheckpointIds)||!ae(R,O.acceptedCheckpointHeads)||!ae(W,O.reconciliationCommitShas)||!ae(y,O.changedPaths)||!ae(w,O.allowedWriteSet)||!Li(O,{epicId:e.epicId,executionBranch:e.executionBranch,originBranch:e.originBranch,graphRevision:e.graphRevision,originHeadSha:e.originHeadSha,executionHeadSha:l,acceptedCheckpointIds:m,acceptedCheckpointHeads:R,aggregateQaReceipt:t,nowIso:r}))throw new Error("epic-head-reconciliation-physical-invalid");await Be(i,$=>{const N=ni($,e.epicId),j=N.head_reconciliation_receipt;if(!j||j.inputDigest!==e.inputDigest)throw new Error("epic-head-reconciliation-cas-conflict");N.head_reconciliation_receipt=O},{expectedRevision:a.revision,preCommit:async()=>{if(E(i,["rev-parse","HEAD"]).trim()!==l||E(i,["symbolic-ref","--quiet","--short","HEAD"]).trim()!==u)throw new Error("epic-head-reconciliation-head-raced")}});const te=Object.freeze(Object.create(null));return Xe.set(te,Object.freeze({executionHeadSha:l,graphRevision:e.graphRevision,aggregateReceiptRef:t.receiptRef,reconciliationInputDigest:O.inputDigest})),Object.freeze({authority:te,receipt:O})}function er(i,e){if(!i||typeof i!="object"||Ce.has(i))return!1;const t=ke.get(i),r=Xe.get(i);return t&&t.executionHeadSha===e.executionHeadSha&&t.graphRevision===e.graphRevision&&t.manifestDigest===e.aggregateQaReceipt.manifestDigest&&t.resultDigest===e.aggregateQaReceipt.resultDigest&&t.executedAt===e.aggregateQaReceipt.checkedAt?(Ce.add(i),!0):!(r&&e.headReconciliationReceipt&&r.executionHeadSha===e.executionHeadSha&&r.graphRevision===e.graphRevision&&r.aggregateReceiptRef===e.aggregateQaReceipt.receiptRef&&r.reconciliationInputDigest===e.headReconciliationReceipt.inputDigest)?!1:(Ce.add(i),!0)}function oi(i){const e=Wi[i.storyId],t=typeof i.checkpoint.claimRevision=="string"?i.checkpoint.claimRevision:void 0,r=i.storyId==="P174.03.811759"||i.storyId==="P174.03.685003",n=Qi(i.authorizedWriteSet);let a=[];if(i.checkpoint.rootMemoryEffect!==void 0){if(e)return;try{a=$i(i.projectRoot,i.checkpoint.rootMemoryEffect,{storyId:i.storyId,executionBranch:i.executionBranch,baseSha:i.baseSha,headRef:i.headSha,childPaths:n}).files.map(o=>o.path)}catch{return}}const s=n.length>0&&n.length===i.authorizedWriteSet.length&&i.changedPaths.every(o=>n.some(g=>di(g,o))||a.includes(o));if(e&&i.epicId==="P174"&&i.executionBranch==="epic/P174"&&i.baseSha===e.baseSha&&i.headSha===e.headSha&&i.checkpoint.graphRevision===e.graphRevision&&i.commitBodyDigest===e.commitBodyDigest&&i.changedPathsDigest===e.changedPathsDigest&&(r?t===void 0:t===e.effectiveClaimRevision))return i.authorizedWriteSet.length>0&&(!s||!si(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(t!==void 0&&!(!t||!p(t))&&!(!s||!si(t,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:t})}function Qi(i){const e=i.map(t=>t.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(t=>!fe(t))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function Zi(i,e){try{const t=JSON.parse(xe(D(i,".neocortex","state.json"),"utf8")),r=d(t.stories),n=d(r?.[e]),a=ei(i),s=d(a.stories[e]?.checkpoint)??d(n?.checkpoint);return Pe(e,n,s)}catch{return[]}}function Pe(i,e,t){const r=Array.isArray(e?.files_to_modify)?e.files_to_modify.filter(n=>typeof n=="string"):[];if(!t?.dispatchId||!t.bundleId)return r;try{return Pi({...e,id:i,files_to_modify:r})}catch{return[]}}function si(i,e){return i===b("sha256").update(e.join("\0")).digest("hex")||i===b("sha256").update(JSON.stringify(e)).digest("hex")}function di(i,e){return i===e||i.endsWith("/")&&e.startsWith(i)}function ir(i,e,t,r,n,a){try{if(!ai(e,t,r,n))return!1;const s=d(e),o=d(s.qaReceipt),g=d(s.reviewReceipt),c=String(s.headSha),f=String(s.baseSha),h=E(i,["rev-parse",`refs/heads/${n}`]).trim();if(G("git",["merge-base","--is-ancestor",c,h],{cwd:i,stdio:"ignore"}),E(i,["rev-parse",`${c}^`]).trim()!==f||E(i,["rev-list","--count",`${f}..${c}`]).trim()!=="1")return!1;const u=E(i,["show","--no-patch","--format=%H%n%P%n%B",c]),l=E(i,["diff-tree","--no-commit-id","--name-only","-r","-z",c]).split("\0").filter(Boolean);if(l.length===0||l.some(R=>!fe(R)))return!1;const m=oi({projectRoot:i,checkpoint:s,storyId:t,epicId:r,executionBranch:n,baseSha:f,headSha:c,changedPaths:l,authorizedWriteSet:a,commitBodyDigest:b("sha256").update(u).digest("hex"),changedPathsDigest:b("sha256").update([...l].sort().join("\0")).digest("hex")});return!(m?.mode!=="legacy-migration"||!m.binding||o.sourceEvidenceDigest!==m.binding.qaDigest||o.receiptRef!==`story-qa:${m.binding.qaDigest}`||g.sourceEvidenceDigest!==m.binding.reviewDigest||g.receiptRef!==`story-review:${m.binding.reviewDigest}`||g.qaReceiptRef!==o.receiptRef)}catch{return!1}}function Ui(i){return b("sha256").update(["local-yolo-tdd-git-immutable-v1",i.storyId,i.baseSha,i.headSha,i.bundleDigest,i.graphRevision,b("sha256").update(i.commitBody).digest("hex"),b("sha256").update([...i.changedPaths].sort().join("\0")).digest("hex")].join("\0")).digest("hex")}function Xi(i){return b("sha256").update(["local-yolo-tdd-p205-execution-v2",F,i.gitEvidenceDigest,i.headSha,i.graphRevision,i.manifestDigest,i.gateIds.join(","),i.resultDigest].join("\0")).digest("hex")}function fi(i){const e=d(i.value);return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:i.storyId,epicId:i.epicId,branch:i.executionBranch,baseSha:S(e?.baseSha)?String(e?.baseSha):"0".repeat(40),headSha:S(e?.headSha)?String(e?.headSha):"0".repeat(40),aggregateHeadSha:"0".repeat(40),commitBodyDigest:"0".repeat(64),changedPathsDigest:"0".repeat(64),claimVerification:"canonical",effectiveClaimRevision:"0".repeat(64),command:F,manifestDigest:"0".repeat(64),gateIds:Object.freeze([]),resultDigest:"0".repeat(64),graphRevision:"0".repeat(64),executionEvidenceDigest:"0".repeat(64),sourceEvidenceDigest:"0".repeat(64),verifiedAt:se(i.verifiedAt),verdict:i.verdict,reasonCodes:Object.freeze([i.reasonCode]),publicSafe:!0})}function E(i,e){return G("git",[...e],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})}function He(i,e,t,r=!1){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(e)||t!==":"&&!/^[a-f0-9]{40,64}$/i.test(t))return;const n=`.neocortex/stories/${e}/review.md`;let a;try{a=G("git",["show",`${t===":"?":":`${t}:`}${n}`],{cwd:i,maxBuffer:128*1024,stdio:["ignore","pipe","ignore"]})}catch{return}if(a.length===0||a.length>64*1024||a.includes(0))return;let s;try{s=new TextDecoder("utf-8",{fatal:!0}).decode(a)}catch{return}const o=s.replace(/\r\n/g,`
5
6
  `).split(`
6
- `),u=new RegExp(`^#\\s+${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?=\\s|$|[:\u2014-])`);if(!o.some(g=>u.test(g)))return;const c=o.filter(g=>/^Verdict\s*:/i.test(g));if(o.some(g=>/^Status\s*:\s*(pending|changes-requested|rejected)\b/i.test(g)))return;const d=o.filter(g=>/^Decision\s*:/i.test(g));if(c.length===0&&r&&d.length===1&&/^Decision\s*:\s*APPROVED\b/i.test(d[0]))return Object.freeze({verdict:"approved",digest:w("sha256").update(a).digest("hex")});if(c.length!==1)return;const l=/^Verdict\s*:\s*(approved|pending|changes-requested)(?=\s|$|[;,.])/i.exec(c[0])?.[1]?.toLowerCase();if(!(l!=="approved"&&l!=="pending"&&l!=="changes-requested"))return Object.freeze({verdict:l,digest:w("sha256").update(a).digest("hex")})}function Ti(i){return w("sha256").update(["root-historical-review-reconciliation-v1",i.storyId,i.epicId,i.checkpointHeadSha,i.approvalCommitSha,i.approvalArtifactDigest,i.qaReceiptRef,i.reviewReceiptRef,w("sha256").update(i.approvalCommitBody).digest("hex")].join("\0")).digest("hex")}function Mi(i,e,t,r,n,a,s){const o=f(e.reviewReconciliation);if(!o||!oi(o,e))return!1;const u=String(o.approvalCommitSha),c=String(e.headSha);if(u===c)return!1;try{if(M("git",["merge-base","--is-ancestor",c,u],{cwd:i,stdio:"ignore"}),M("git",["merge-base","--is-ancestor",u,s],{cwd:i,stdio:"ignore"}),!$(i,["rev-list","--first-parent",s]).split(`
7
- `).includes(u))return!1;const d=$(i,["show","--no-patch","--format=%P",u]).trim().split(/\s+/);if(d.length!==1||!D(d[0]))return!1;const l=$(i,["show","--no-patch","--format=%H%n%P%n%B",u]),g=new Set(l.split(`
8
- `).map(G=>G.trim()));if(!g.has(`Neocortex-Review-Reconciliation: ${n}`)||!g.has(`Neocortex-Original-Checkpoint: ${c}`)||!g.has(`Neocortex-Original-Review-Receipt: ${String(t.receiptRef)}`))return!1;const h=`.neocortex/stories/${n}/review.md`,m=$(i,["diff-tree","--no-commit-id","--name-only","-r","-z",u]).split("\0").filter(Boolean);if(!m.includes(h)||m.some(G=>!fe(G)))return!1;const R=Ae(i,n,u);if(R?.verdict!=="approved"||R.digest!==o.approvalArtifactDigest)return!1;const k=Ae(i,n,s);if(k?.verdict!=="approved"||k.digest!==R.digest)return!1;const E=Ti({storyId:n,epicId:a,checkpointHeadSha:c,approvalCommitSha:u,approvalArtifactDigest:R.digest,qaReceiptRef:String(r.receiptRef),reviewReceiptRef:String(t.receiptRef),approvalCommitBody:l});return o.sourceEvidenceDigest===E&&o.receiptRef===`story-review-reconciliation:${E}`}catch{return!1}}function Fi(i,e,t){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(e)||!/^[a-f0-9]{40,64}$/i.test(t))return!1;try{return M("git",["cat-file","-e",`${t}:.neocortex/stories/${e}/review.md`],{cwd:i,stdio:"ignore",maxBuffer:1024}),!0}catch{return!1}}function oe(i){return Number.isFinite(Date.parse(i))?new Date(Date.parse(i)).toISOString():new Date().toISOString()}async function jt(i,e){if(Me[e.storyId]!==e.headSha)return;const t=[".neocortex/state.json",`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,`.neocortex/stories/${e.storyId}/review.md`,`docs/stories/${e.storyId}.story.md`];try{const r=(await V("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:i,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await V("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:i}),(await V("git",["rev-parse",`${e.headSha}^`],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await V("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(w("sha256").update(a).digest("hex")!==e.bundleDigest)return;const s=String((await V("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await V("git",["show","--no-patch","--format=%s",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const c=String((await V("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!t.every(y=>c.includes(y))||c.some(y=>!fe(y)))return;const d=await Promise.all(t.map(async y=>String((await V("git",["show",`${e.headSha}:${y}`],{cwd:i,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),l=JSON.parse(d[0]),g=f(l.stories),h=f(l.epics),m=f(g?.[e.storyId]),R=f(h?.[e.epicId]),k=Array.isArray(m?.steps_completed)?m.steps_completed:[],E=JSON.parse(d[1]);return m?.status!=="done"||!k.includes(Ii)||!k.includes(Ai)||R?.branch_mode!=="epic"||R.execution_branch!==e.executionBranch||E.storyId!==e.storyId||E.status!=="qa-passed"||E.safeToContinueYoloop!==!0||!Array.isArray(E.blockingChecks)||E.blockingChecks.length!==0||!d[2].includes(e.storyId)||!/P205[\s\S]{0,80}(pass|aprov)/i.test(d[2])||!d[3].includes(e.storyId)||!/approved|aprovado/i.test(d[3])||!d[4].includes(e.storyId)?void 0:`legacy-direct-yolo:${w("sha256").update(["legacy-direct-yolo-recovery-v1",e.storyId,e.epicId,e.executionBranch,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,w("sha256").update(s).digest("hex"),w("sha256").update([...c].sort().join("\0")).digest("hex"),...d.map(y=>w("sha256").update(y).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function Wi(i){const e=await Ce(i),t=S(e,le),r=S(t,he);if(H(t)&&(await j(t,"directory"),await X(t)!==t))throw new Error("git-lifecycle-runtime-directory-symlink");return H(r)?r:S(e,xe)}async function ei(i){return ri(await Ce(i))}async function Ki(i,e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)||e.includes(".."))throw new Error("git-lifecycle-private-child-invalid");const t=v(i);await Y(t);const r=v(t,e);return ne(t,r),H(r)||await Ge(t,e),await Y(r,t),await Y(t),r}async function _(i,e){const t=v(e),r=v(i);ne(t,r),await Y(t),await Y(r,t)}async function Gt(i,e){await J(i,e)}async function ee(i,e,t){const r=v(e),n=v(i);ne(r,n);try{await _(n,r)}catch(s){if(P(s,"ENOENT"))return!1;throw s}const a=v(r,`${n.slice(r.length+1)}.remove.${process.pid}.${Date.now()}.${De(4).toString("hex")}`);return ne(r,a),await re(r,C(n),C(a)),await _(a,r),t&&!await t(a)?(await se(a,n,r).catch(()=>{}),!1):(await xi(r,C(a)),!0)}async function se(i,e,t){await _(i,t);try{await Re(e);return}catch(r){if(!P(r,"ENOENT"))throw r}await re(t,C(i),C(e)),await _(e,t)}async function B(i){try{await _(i,K(i));const e=S(i,"owner.json");await J(e,i);const t=await F(e);return await J(e,i),w("sha256").update(t).digest("hex")}catch{return}}async function Tt(i,e){const t=await ei(i),r=await Ki(t,"leases"),n=S(r,"integration"),a=`${n}.recovery`;if(H(a)){await _(a,r);const c=await ii(a),d=await B(a);if(c===void 0||me(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!d||!await ee(a,r,async l=>await B(l)===d))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const s=oe(e.createdAt??new Date().toISOString()),o=Object.freeze({schemaVersion:1,kind:e.kind,storyId:e.storyId,sessionId:e.sessionId,idempotencyKey:e.idempotencyKey,pid:process.pid,createdAt:s,expiresAt:oe(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??De(16).toString("hex")});if(Date.parse(o.expiresAt)<=Date.parse(o.createdAt))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const u=async()=>{await Y(r,t);try{return await je(r,C(n),`${JSON.stringify(o)}
9
- `),await _(n,r),await J(S(n,"owner.json"),n),!0}catch(c){throw P(c,"EEXIST")||await ee(n,r).catch(()=>{}),c}};try{return await u(),{ok:!0,owner:o,path:n}}catch(c){if(!P(c,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const c=await de(n),d=c?void 0:await ii(n);if(c&&ti(c,o))return{ok:!0,owner:c,path:n};if(c&&Date.parse(c.expiresAt)>Date.now()&&(c.persistent||me(c.pid))||d!==void 0&&me(d)||!c&&d===void 0&&await di(n))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};const g=await B(n);if(!g)return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const h=`${n}.stale.${process.pid}.${Date.now()}`;await re(r,C(n),C(h));try{if(await _(h,r),await B(h)!==g)return await se(h,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await u()}finally{await ee(h,r,async m=>await B(m)===g).catch(()=>{})}return{ok:!0,owner:o,path:n}}catch(c){return{ok:!1,reasonCode:P(c,"EEXIST")||P(c,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function Mt(i,e){const t=await de(i);return!!(t&&ke(t,e)&&Date.parse(t.expiresAt)>Date.now())}async function Yi(i,e){try{const t=K(i);await _(i,t);const r=await de(i);if(!r||!ke(r,e))return!1;const n=await B(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await re(t,C(i),C(a)),await _(a,t);const s=await de(a);return!s||!ke(s,e)||await B(a)!==n?(await se(a,i,t).catch(()=>{}),!1):ee(a,t,async o=>await B(o)===n)}catch(t){if(P(t,"ENOENT"))return!1;throw t}}function Ji(i){return w("sha256").update(["git-lifecycle-physical-owner-v1",i.kind,i.storyId,i.sessionId,i.idempotencyKey,String(i.pid),i.createdAt,i.expiresAt,i.persistent?"persistent":"ephemeral",i.ownerNonce].join("\0")).digest("hex")}async function Ft(i,e){if(!Q(e.storyId)||!O(e.idempotencyKey)||!p(e.ownerDigest))return"foreign";const t=await ei(i),r=S(t,"leases"),n=S(r,"integration");if(!H(n))return"absent";try{await _(r,t),await _(n,r);const a=await de(n);return!a||a.kind!=="direct"||a.storyId!==e.storyId||a.sessionId!==e.idempotencyKey||a.idempotencyKey!==e.idempotencyKey||a.persistent!==!0||Ji(a)!==e.ownerDigest?"foreign":await Yi(n,a)?"released":"foreign"}catch{return"foreign"}}async function de(i){try{await _(i,K(i));const e=S(i,"owner.json");await J(e,i);const t=JSON.parse(await F(e,"utf8"));return t.schemaVersion!==1||t.kind!=="direct"&&t.kind!=="continuous"||!Q(t.storyId)||!O(t.sessionId)||!O(t.idempotencyKey)||!Number.isSafeInteger(t.pid)||Number(t.pid)<=0||!A(t.createdAt)||!A(t.expiresAt)||typeof t.persistent!="boolean"||typeof t.ownerNonce!="string"||!/^[a-f0-9]{32}$/.test(t.ownerNonce)?void 0:t}catch{return}}async function ii(i){try{await _(i,K(i));const e=S(i,"owner.json");await J(e,i);const t=JSON.parse(await F(e,"utf8"));return Number.isSafeInteger(t.pid)&&Number(t.pid)>0?Number(t.pid):void 0}catch{return}}function ti(i,e){return i.kind===e.kind&&i.storyId===e.storyId&&i.sessionId===e.sessionId&&i.idempotencyKey===e.idempotencyKey&&i.expiresAt===e.expiresAt&&i.persistent===e.persistent}function ke(i,e){return ti(i,e)&&i.schemaVersion===e.schemaVersion&&i.pid===e.pid&&i.createdAt===e.createdAt&&i.ownerNonce===e.ownerNonce}async function Ce(i){const e=await X(i),r=(await V("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim(),n=ae(r)?v(r):v(e,r),a=await X(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await Zi(a);const o=(await V("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((ae(o)?v(o):v(e,o))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function ri(i){const e=S(i,le);if(H(e)||await Ge(i,le),await j(e,"directory"),await X(e)!==e)throw new Error("git-lifecycle-runtime-directory-symlink");return e}async function ni(i,e={}){try{return await j(i,"file"),Oe(JSON.parse(await F(i,"utf8")))}catch(t){if(P(t,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Pe()}throw t}}async function Qi(i){try{await j(i,"file")}catch(e){if(P(e,"ENOENT"))return;throw e}}async function j(i,e){const t=await Re(i);if(t.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!t.isFile():!t.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(pe()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(pe()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function ne(i,e){const t=v(i),r=v(e),n=bi(t,r);if(!n||n.startsWith("..")||ae(n)||K(r)!==t)throw new Error("git-lifecycle-private-path-escape")}async function Y(i,e){const t=v(i);if(e&&ne(v(e),t),await j(t,"directory"),v(await X(t))!==t)throw new Error("git-lifecycle-directory-substituted");if(e){const r=v(e);if(await j(r,"directory"),v(await X(r))!==r)throw new Error("git-lifecycle-directory-parent-substituted")}}async function J(i,e){const t=v(i);if(ne(v(e),t),await Y(v(e)),await j(t,"file"),v(await X(t))!==t)throw new Error("git-lifecycle-file-substituted")}function ai(i,e){const t=ze(i);if(t.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!t.isFile():!t.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(pe()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(pe()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function Zi(i){const e=await Re(i);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function Ui(i){const e=ze(i);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function pe(i=process.platform){return i!=="win32"&&typeof process.getuid=="function"}function Oe(i){if(!i||typeof i!="object"||Array.isArray(i))throw new Error("git-lifecycle-runtime-invalid");const e=i;I(e,["schemaVersion","revision","epics","stories"],"git-lifecycle-runtime-unknown-field");const t=f(e.epics),r=f(e.stories);if(e.schemaVersion!==1||!Number.isSafeInteger(e.revision)||Number(e.revision)<0||!t||!r||Object.values(t).some(n=>!f(n))||Object.values(r).some(n=>!f(n)))throw new Error("git-lifecycle-runtime-invalid");for(const[n,a]of Object.entries(t))if(!Q(n)||!it(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!Q(n)||!n.includes(".")||!tt(a,n))throw new Error("git-lifecycle-runtime-story-invalid");return e}const Xi=["branch_mode","execution_branch","origin_branch","branch_lease","origin_binding","graph_revision","aggregate_qa_receipt","terminal_git_receipt","physicalMergeStatus","pr_number","git_reconciliation_receipts","git_reconciliation_debt"],et=["checkpoint","status","last_step","steps_completed"];function it(i){return I(i,Xi,"git-lifecycle-runtime-epic-unknown-field"),(i.branch_mode===void 0||i.branch_mode==="epic")&&(i.execution_branch===void 0||W(i.execution_branch))&&(i.origin_branch===void 0||W(i.origin_branch))&&(i.branch_lease===void 0||i.branch_lease===null||rt(i.branch_lease))&&(i.origin_binding===void 0||i.origin_binding===null||ct(i.origin_binding))&&(i.graph_revision===void 0||p(i.graph_revision))&&(i.aggregate_qa_receipt===void 0||i.aggregate_qa_receipt===null||ot(i.aggregate_qa_receipt))&&(i.terminal_git_receipt===void 0||i.terminal_git_receipt===null||st(i.terminal_git_receipt))&&(i.physicalMergeStatus===void 0||["merged","pushed","denied_external_gate","blocked_local_or_repo","not_attempted"].includes(String(i.physicalMergeStatus)))&&(i.pr_number===void 0||i.pr_number===null||Number.isSafeInteger(i.pr_number)&&Number(i.pr_number)>0)&&(i.git_reconciliation_receipts===void 0||lt(i.git_reconciliation_receipts))&&(i.git_reconciliation_debt===void 0||ht(i.git_reconciliation_debt))}function tt(i,e){return I(i,et,"git-lifecycle-runtime-story-unknown-field"),(i.checkpoint===void 0||i.checkpoint===null||ci(i.checkpoint,e))&&(i.status===void 0||O(i.status))&&(i.last_step===void 0||i.last_step===null||O(i.last_step))&&(i.steps_completed===void 0||z(i.steps_completed,128))}function rt(i){const e=f(i);return e?(I(e,["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt","handoffGrant","handoffConsumption","setupHeadSha"],"git-lifecycle-runtime-lease-unknown-field"),e.schemaVersion===1&&Q(e.ownerStoryId)&&O(e.sessionId)&&O(e.idempotencyKey)&&A(e.acquiredAt)&&A(e.expiresAt)&&Date.parse(String(e.expiresAt))>Date.parse(String(e.acquiredAt))&&(e.setupHeadSha===void 0||D(e.setupHeadSha))&&(e.handoffGrant===void 0||nt(e.handoffGrant,e))&&(e.handoffConsumption===void 0||at(e.handoffConsumption,e))):!1}function nt(i,e){const t=f(i);return t?(I(t,["schemaVersion","kind","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","expiresAt"],"git-lifecycle-runtime-handoff-grant-unknown-field"),t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff"&&t.storyId===e.ownerStoryId&&t.fromSessionId===e.sessionId&&p(t.tokenDigest)&&p(t.bundleDigest)&&p(t.claimRevision)&&A(t.expiresAt)&&Date.parse(String(t.expiresAt))<=Date.parse(String(e.expiresAt))):!1}function at(i,e){const t=f(i);return t?(I(t,["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","consumedBySessionId","consumedAt"],"git-lifecycle-runtime-handoff-consumption-unknown-field"),t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff-consumption"&&t.state==="consumed"&&t.storyId===e.ownerStoryId&&O(t.fromSessionId)&&p(t.tokenDigest)&&p(t.bundleDigest)&&p(t.claimRevision)&&t.consumedBySessionId===e.sessionId&&A(t.consumedAt)):!1}function ct(i){const e=f(i);return e?(I(e,["schemaVersion","originBranch","originHeadSha","executionBranch","capturedFromCurrentCheckout","capturedAt"],"git-lifecycle-runtime-origin-unknown-field"),e.schemaVersion===1&&W(e.originBranch)&&W(e.executionBranch)&&e.originBranch!==e.executionBranch&&D(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&A(e.capturedAt)):!1}function ot(i){const e=f(i);if(!e)return!1;I(e,["schemaVersion","evidenceVersion","producer","contract","command","verdict","executionHeadSha","graphRevision","manifestDigest","resultDigest","checkedAt","receiptRef","gateIds"],"git-lifecycle-runtime-aggregate-qa-unknown-field");const t=e.evidenceVersion==="p205-execution-v2"&&e.producer==="local-yolo-tdd"&&e.contract==="P205-CI-02"&&e.command===q&&p(e.manifestDigest)&&p(e.resultDigest),r=e.evidenceVersion===void 0&&e.producer===void 0&&e.contract===void 0&&e.command===void 0&&e.manifestDigest===void 0&&e.resultDigest===void 0;return e.schemaVersion===1&&(t||r)&&e.verdict==="passed"&&D(e.executionHeadSha)&&p(e.graphRevision)&&A(e.checkedAt)&&ue(e.receiptRef)&&z(e.gateIds,128,!0)}function st(i){const e=f(i);return e?(I(e,["schemaVersion","epicId","executionBranch","originBranch","baseSha","executionHeadSha","mergeSha","pushedSha","strategy","prNumber","physicalStatus","localGateReceiptRefs","idempotencyKey","attemptStartedAt","completedAt","retryEligible","reasonCodes","publicSafe","candidateQa","providerGuard"],"git-lifecycle-runtime-terminal-receipt-unknown-field"),e.schemaVersion===1&&Q(e.epicId)&&W(e.executionBranch)&&W(e.originBranch)&&D(e.baseSha)&&D(e.executionHeadSha)&&(e.mergeSha===void 0||D(e.mergeSha))&&(e.pushedSha===void 0||D(e.pushedSha))&&(e.strategy==="direct"||e.strategy==="single_pr")&&(e.candidateQa===void 0||ft(e.candidateQa,e))&&(e.providerGuard===void 0||dt(e.providerGuard,e))&&(e.prNumber===void 0||Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0)&&["prepared","merged","pushed","denied_external_gate","blocked_local_or_repo"].includes(String(e.physicalStatus))&&z(e.localGateReceiptRefs,128,!0)&&O(e.idempotencyKey)&&A(e.attemptStartedAt)&&(e.completedAt===void 0||A(e.completedAt))&&typeof e.retryEligible=="boolean"&&z(e.reasonCodes,128)&&e.publicSafe===!0):!1}function dt(i,e){const t=f(i);if(!t)return!1;I(t,["schemaVersion","provider","mode","source","prHeadSha","originHeadSha","checkedAt","publicSafe"],"git-lifecycle-runtime-provider-guard-unknown-field");const r=t.mode==="recovered_exact_tree"?t.source==="physical_recovery":t.mode==="strict_up_to_date_expected_head"&&["branch_protection","ruleset","branch_protection_and_ruleset"].includes(String(t.source));return t.schemaVersion===1&&t.provider==="github"&&r&&e.strategy==="single_pr"&&e.physicalStatus==="pushed"&&Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0&&D(t.prHeadSha)&&t.prHeadSha===e.mergeSha&&D(t.originHeadSha)&&t.originHeadSha===e.baseSha&&A(t.checkedAt)&&t.publicSafe===!0}function ft(i,e){const t=f(i);return t?(I(t,["schemaVersion","kind","contract","command","originHeadSha","executionHeadSha","mergeSha","treeSha","graphRevision","manifestDigest","resultDigest","gateIds","checkedAt","receiptRef"],"git-lifecycle-runtime-merge-candidate-unknown-field"),t.schemaVersion===1&&t.kind==="epic_merge_candidate_qa"&&t.contract==="P205-CI-02"&&t.command===q&&D(t.originHeadSha)&&t.originHeadSha===e.baseSha&&D(t.executionHeadSha)&&t.executionHeadSha===e.executionHeadSha&&D(t.mergeSha)&&t.mergeSha===e.mergeSha&&D(t.treeSha)&&p(t.graphRevision)&&p(t.manifestDigest)&&p(t.resultDigest)&&z(t.gateIds,128,!0)&&A(t.checkedAt)&&ue(t.receiptRef)):!1}function ci(i,e){const t=f(i);if(!t)return!1;I(t,["schemaVersion","storyId","epicId","branch","baseSha","headSha","commits","idempotencyKey","dispatchId","bundleId","bundleDigest","graphRevision","claimRevision","receiptRefs","qaVerdict","reviewVerdict","qaReceipt","reviewReceipt","reviewReconciliation","recordedAt","rootMemoryEffect"],"git-lifecycle-runtime-checkpoint-unknown-field");const r=String(e).split(".")[0];return t.schemaVersion===1&&t.storyId===e&&t.epicId===r&&W(t.branch)&&D(t.baseSha)&&D(t.headSha)&&t.baseSha!==t.headSha&&mt(t.commits)&&t.commits.length===1&&t.commits[0]===t.headSha&&O(t.idempotencyKey)&&(t.dispatchId===void 0||p(t.dispatchId))&&(t.bundleId===void 0||p(t.bundleId))&&p(t.bundleDigest)&&p(t.graphRevision)&&(t.claimRevision===void 0||p(t.claimRevision))&&(t.rootMemoryEffect===void 0||Si(t.rootMemoryEffect)&&t.rootMemoryEffect.storyId===e&&t.rootMemoryEffect.executionBranch===t.branch&&t.rootMemoryEffect.sourceHeadSha===t.baseSha&&t.rootMemoryEffect.childClaimRevision===t.claimRevision)&&z(t.receiptRefs,256,!0)&&(t.qaVerdict==="passed"||t.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(t.reviewVerdict))&&ut(t.qaReceipt,t)&&(t.reviewVerdict==="pending"?t.reviewReceipt===void 0:gt(t.reviewReceipt,t))&&(t.reviewReconciliation===void 0||oi(t.reviewReconciliation,t))&&A(t.recordedAt)}function oi(i,e){const t=f(i),r=f(e.qaReceipt),n=f(e.reviewReceipt);return!t||!r||!n?!1:(I(t,["schemaVersion","kind","storyId","epicId","checkpointHeadSha","approvalCommitSha","approvalArtifactDigest","qaReceiptRef","reviewReceiptRef","sourceEvidenceDigest","reviewedAt","receiptRef"],"git-lifecycle-runtime-review-reconciliation-unknown-field"),t.schemaVersion===1&&t.kind==="historical_review_reconciliation"&&t.storyId===e.storyId&&t.epicId===e.epicId&&t.checkpointHeadSha===e.headSha&&D(t.approvalCommitSha)&&p(t.approvalArtifactDigest)&&t.qaReceiptRef===r.receiptRef&&t.reviewReceiptRef===n.receiptRef&&p(t.sourceEvidenceDigest)&&A(t.reviewedAt)&&Date.parse(String(t.reviewedAt))>=Date.parse(String(r.checkedAt))&&ue(t.receiptRef)&&Array.isArray(e.receiptRefs)&&e.receiptRefs.includes(t.receiptRef))}function ut(i,e){const t=f(i);return t?(I(t,["schemaVersion","kind","producer","evidenceVersion","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","contract","command","manifestDigest","gateIds","resultDigest","sourceEvidenceDigest","verdict","checkedAt","receiptRef"],"git-lifecycle-runtime-story-qa-unknown-field"),t.schemaVersion===1&&t.kind==="story_qa_evidence"&&t.producer==="local-yolo-tdd"&&(t.evidenceVersion===void 0||t.evidenceVersion==="git-immutable-v1"||t.evidenceVersion==="p205-execution-v2"&&t.contract==="P205-CI-02"&&t.command===q&&p(t.manifestDigest)&&z(t.gateIds,32,!0)&&p(t.resultDigest))&&si(t,e)&&p(t.sourceEvidenceDigest)&&t.verdict===e.qaVerdict&&(t.verdict==="passed"||t.verdict==="blocked")&&A(t.checkedAt)&&ue(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef)):!1}function gt(i,e){const t=f(i),r=f(e.qaReceipt);return!t||!r?!1:(I(t,["schemaVersion","kind","producer","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","sourceEvidenceDigest","reviewArtifactDigest","qaReceiptRef","verdict","reviewedAt","receiptRef"],"git-lifecycle-runtime-story-review-unknown-field"),t.schemaVersion===1&&t.kind==="story_review_evidence"&&t.producer==="root-commit-range-review"&&si(t,e)&&p(t.sourceEvidenceDigest)&&(t.reviewArtifactDigest===void 0||p(t.reviewArtifactDigest))&&t.qaReceiptRef===r.receiptRef&&t.receiptRef!==r.receiptRef&&(t.verdict==="approved"||t.verdict==="changes-requested")&&(t.verdict==="approved"?e.reviewVerdict==="approved":e.reviewVerdict==="changes-requested")&&A(t.reviewedAt)&&Date.parse(String(t.reviewedAt))>=Date.parse(String(r.checkedAt))&&ue(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef))}function si(i,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(t=>i[t]===e[t])}function lt(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=f(e);return t?(I(t,["schemaVersion","resourceId","action","outcome","idempotencyKey","reasonCodes","recordedAt","publicSafe"],"git-lifecycle-runtime-reconciliation-receipt-unknown-field"),t.schemaVersion===1&&O(t.resourceId)&&["no_op","delete_local_branch","delete_remote_branch","close_pull_request"].includes(String(t.action))&&["applied","already_absent","dry_run","failed"].includes(String(t.outcome))&&O(t.idempotencyKey)&&z(t.reasonCodes,128)&&A(t.recordedAt)&&t.publicSafe===!0):!1})}function ht(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=f(e);return t?(I(t,["schemaVersion","resourceId","action","managed","reasonCodes","evidence","publicSafe"],"git-lifecycle-runtime-reconciliation-debt-unknown-field"),t.schemaVersion===1&&O(t.resourceId)&&t.action==="preserve"&&typeof t.managed=="boolean"&&z(t.reasonCodes,128)&&z(t.evidence,16)&&t.publicSafe===!0):!1})}function I(i,e,t){const r=new Set(e);if(Object.keys(i).some(n=>!r.has(n)))throw new Error(t)}function Q(i){return typeof i=="string"&&/^P[1-9][0-9]*(?:\.[0-9]+)*$/.test(i)}function pt(i){const e=f(i);return e?Object.keys(e).length===10&&e.schemaVersion===1&&e.kind==="git_lifecycle_graph_authority"&&e.producer==="server-continuous-yoloop-v1"&&(e.source==="yolo"||e.source==="yoloop")&&Q(e.epicId)&&Q(e.storyId)&&String(e.storyId).startsWith(`${String(e.epicId)}.`)&&W(e.executionBranch)&&W(e.originBranch)&&e.originBranch!==e.executionBranch&&typeof e.graphRevision=="string"&&/^[a-f0-9]{64}$/.test(e.graphRevision)&&e.publicSafe===!0:!1}function W(i){return typeof i=="string"&&/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(i)&&!i.includes("..")&&!i.includes("//")&&!i.includes("@{")&&!i.endsWith("/")&&!i.endsWith(".")&&!i.split("/").some(e=>!e||e.startsWith(".")||e.endsWith(".lock"))}function fe(i){return i.length>0&&i.length<=1024&&!ae(i)&&!i.includes("\0")&&!i.replaceAll("\\","/").split("/").includes("..")}function O(i){return typeof i=="string"&&i.length>0&&i.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(i)&&!i.includes("..")}function ue(i){return O(i)}function D(i){return typeof i=="string"&&/^[a-f0-9]{40,64}$/i.test(i)}function p(i){return typeof i=="string"&&/^[a-f0-9]{64}$/i.test(i)}function A(i){return typeof i=="string"&&i.length<=64&&Number.isFinite(Date.parse(i))}function z(i,e,t=!1){return Array.isArray(i)&&i.length<=e&&(!t||i.length>0)&&i.every(O)}function mt(i){return Array.isArray(i)&&i.length>0&&i.length<=256&&i.every(D)}function Pe(){return{schemaVersion:1,revision:0,epics:{},stories:{}}}async function yt(i){const e=K(i),t={pid:process.pid,nonce:De(16).toString("hex")},r=async()=>{await Y(e),await je(e,C(i),JSON.stringify(t));try{await _(i,e),await J(S(i,"owner.json"),i)}catch(n){throw await ee(i,e).catch(()=>{}),n}};try{await r()}catch(n){if(!P(n,"EEXIST"))throw n;await j(i,"directory");const a=await $e(i);if(a!==void 0&&me(a.pid))throw new Error("git-lifecycle-runtime-lock-active");if(a===void 0&&await di(i))throw new Error("git-lifecycle-runtime-lock-active");const s=await B(i);if(!s)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const o=`${i}.stale.${process.pid}.${Date.now()}`;await re(e,C(i),C(o));try{if(await _(o,e),await B(o)!==s)throw await se(o,i,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await ee(o,e,async u=>await B(u)===s).catch(()=>{})}}return t}async function bt(i,e){const t=K(i);try{await _(i,t);const r=await $e(i);if(!r||!fi(r,e))return!1;const n=await B(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await re(t,C(i),C(a)),await _(a,t);const s=await $e(a);return!s||!fi(s,e)||await B(a)!==n?(await se(a,i,t).catch(()=>{}),!1):ee(a,t,async o=>await B(o)===n)}catch(r){if(P(r,"ENOENT"))return!1;throw r}}async function di(i){try{return Date.now()-(await yi(i)).mtimeMs<3e4}catch{return!0}}async function $e(i){try{await _(i,K(i));const e=S(i,"owner.json");await J(e,i);const t=JSON.parse(await F(e,"utf8"));return Number.isSafeInteger(t.pid)&&Number(t.pid)>0&&(t.nonce===void 0||typeof t.nonce=="string"&&/^[a-f0-9]{32}$/.test(t.nonce))?{pid:Number(t.pid),...typeof t.nonce=="string"?{nonce:t.nonce}:{}}:void 0}catch{return}}function fi(i,e){return i.pid===e.pid&&i.nonce!==void 0&&i.nonce===e.nonce}function me(i){try{return process.kill(i,0),!0}catch(e){return P(e,"EPERM")}}function f(i){return i&&typeof i=="object"&&!Array.isArray(i)?i:void 0}function P(i,e){return i instanceof Error&&"code"in i&&i.code===e}export{le as GIT_LIFECYCLE_RUNTIME_DIRECTORY,he as GIT_LIFECYCLE_RUNTIME_FILE,Me as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,ki as LEGACY_P174_CHECKPOINT_MIGRATIONS,q as P205_COMPLETE_COMMAND,Tt as acquireGitLifecyclePhysicalIntegrationLock,Bi as applyGitLifecycleRuntimeOverlay,_ as assertGitLifecyclePrivateDirectory,Gt as assertGitLifecyclePrivateFile,Lt as classifyGitLifecycleStoryCheckpointProjectionSync,Ji as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,Ti as computeHistoricalReviewReconciliationDigest,ji as computeImmutableStoryQaEvidenceDigest,jt as computeLegacyDirectYoloRecoveryReceiptRef,Gi as computeP205StoryQaEvidenceDigest,Ki as ensureGitLifecyclePrivateChildDirectory,$t as ensureGitLifecycleRuntimeInitialized,Ni as ensureRuntimeEpic,Nt as ensureRuntimeStory,Oi as executeP205TransientAuthorities,Pt as executeP205TransientAuthority,ei as gitLifecycleRuntimeDirectory,zi as gitLifecycleStoryWriteSet,Je as isAcceptedGitLifecycleStoryCheckpoint,Ke as mutateGitLifecycleRuntime,zt as p205TransientAuthorityMatchesAggregate,Bt as persistGitLifecycleGraphAuthority,pe as posixSecurityAvailable,qt as projectP205TransientExecutionEvidence,Ae as publicStoryReviewArtifactFromGit,Ie as readGitLifecycleRuntime,Pi as readGitLifecycleRuntimeSync,Yi as releaseGitLifecyclePhysicalIntegrationLock,Ft as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,ee as removeGitLifecyclePrivateDirectory,Vt as verifyAcceptedGitLifecycleStoryCheckpoint,Qe as verifyAcceptedGitLifecycleStoryCheckpointSync,Mt as verifyGitLifecyclePhysicalIntegrationLock,Ht as verifyLegacyCheckpointMigrationCandidateSync};
7
+ `),g=new RegExp(`^#\\s+${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?=\\s|$|[:\u2014-])`);if(!o.some(u=>g.test(u)))return;const c=o.filter(u=>/^Verdict\s*:/i.test(u));if(o.some(u=>/^Status\s*:\s*(pending|changes-requested|rejected)\b/i.test(u)))return;const f=o.filter(u=>/^Decision\s*:/i.test(u));if(c.length===0&&r&&f.length===1&&/^Decision\s*:\s*APPROVED\b/i.test(f[0]))return Object.freeze({verdict:"approved",digest:b("sha256").update(a).digest("hex")});if(c.length!==1)return;const h=/^Verdict\s*:\s*(approved|pending|changes-requested)(?=\s|$|[;,.])/i.exec(c[0])?.[1]?.toLowerCase();if(!(h!=="approved"&&h!=="pending"&&h!=="changes-requested"))return Object.freeze({verdict:h,digest:b("sha256").update(a).digest("hex")})}function et(i){return b("sha256").update(["root-historical-review-reconciliation-v1",i.storyId,i.epicId,i.checkpointHeadSha,i.approvalCommitSha,i.approvalArtifactDigest,i.qaReceiptRef,i.reviewReceiptRef,b("sha256").update(i.approvalCommitBody).digest("hex")].join("\0")).digest("hex")}function it(i,e,t,r,n,a,s){const o=d(e.reviewReconciliation);if(!o||!wi(o,e))return!1;const g=String(o.approvalCommitSha),c=String(e.headSha);if(g===c)return!1;try{if(G("git",["merge-base","--is-ancestor",c,g],{cwd:i,stdio:"ignore"}),G("git",["merge-base","--is-ancestor",g,s],{cwd:i,stdio:"ignore"}),!E(i,["rev-list","--first-parent",s]).split(`
8
+ `).includes(g))return!1;const f=E(i,["show","--no-patch","--format=%P",g]).trim().split(/\s+/);if(f.length!==1||!S(f[0]))return!1;const h=E(i,["show","--no-patch","--format=%H%n%P%n%B",g]),u=new Set(h.split(`
9
+ `).map(W=>W.trim()));if(!u.has(`Neocortex-Review-Reconciliation: ${n}`)||!u.has(`Neocortex-Original-Checkpoint: ${c}`)||!u.has(`Neocortex-Original-Review-Receipt: ${String(t.receiptRef)}`))return!1;const l=`.neocortex/stories/${n}/review.md`,m=E(i,["diff-tree","--no-commit-id","--name-only","-r","-z",g]).split("\0").filter(Boolean);if(!m.includes(l)||m.some(W=>!fe(W)))return!1;const R=He(i,n,g);if(R?.verdict!=="approved"||R.digest!==o.approvalArtifactDigest)return!1;const C=He(i,n,s);if(C?.verdict!=="approved"||C.digest!==R.digest)return!1;const _=et({storyId:n,epicId:a,checkpointHeadSha:c,approvalCommitSha:g,approvalArtifactDigest:R.digest,qaReceiptRef:String(r.receiptRef),reviewReceiptRef:String(t.receiptRef),approvalCommitBody:h});return o.sourceEvidenceDigest===_&&o.receiptRef===`story-review-reconciliation:${_}`}catch{return!1}}function tt(i,e,t){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(e)||!/^[a-f0-9]{40,64}$/i.test(t))return!1;try{return G("git",["cat-file","-e",`${t}:.neocortex/stories/${e}/review.md`],{cwd:i,stdio:"ignore",maxBuffer:1024}),!0}catch{return!1}}function se(i){return Number.isFinite(Date.parse(i))?new Date(Date.parse(i)).toISOString():new Date().toISOString()}async function tr(i,e){if(Ue[e.storyId]!==e.headSha)return;const t=[".neocortex/state.json",`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,`.neocortex/stories/${e.storyId}/review.md`,`docs/stories/${e.storyId}.story.md`];try{const r=(await T("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:i,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await T("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:i}),(await T("git",["rev-parse",`${e.headSha}^`],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await T("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(b("sha256").update(a).digest("hex")!==e.bundleDigest)return;const s=String((await T("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await T("git",["show","--no-patch","--format=%s",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const c=String((await T("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!t.every(y=>c.includes(y))||c.some(y=>!fe(y)))return;const f=await Promise.all(t.map(async y=>String((await T("git",["show",`${e.headSha}:${y}`],{cwd:i,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),h=JSON.parse(f[0]),u=d(h.stories),l=d(h.epics),m=d(u?.[e.storyId]),R=d(l?.[e.epicId]),C=Array.isArray(m?.steps_completed)?m.steps_completed:[],_=JSON.parse(f[1]);return m?.status!=="done"||!C.includes(ji)||!C.includes(Gi)||R?.branch_mode!=="epic"||R.execution_branch!==e.executionBranch||_.storyId!==e.storyId||_.status!=="qa-passed"||_.safeToContinueYoloop!==!0||!Array.isArray(_.blockingChecks)||_.blockingChecks.length!==0||!f[2].includes(e.storyId)||!/P205[\s\S]{0,80}(pass|aprov)/i.test(f[2])||!f[3].includes(e.storyId)||!/approved|aprovado/i.test(f[3])||!f[4].includes(e.storyId)?void 0:`legacy-direct-yolo:${b("sha256").update(["legacy-direct-yolo-recovery-v1",e.storyId,e.epicId,e.executionBranch,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,b("sha256").update(s).digest("hex"),b("sha256").update([...c].sort().join("\0")).digest("hex"),...f.map(y=>b("sha256").update(y).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function rt(i){const e=await Ne(i),t=D(e,ye),r=D(t,we);if(Y(t)&&(await J(t,"directory"),await re(t)!==t))throw new Error("git-lifecycle-runtime-directory-symlink");return Y(r)?r:D(e,Ie)}async function gi(i){return li(await Ne(i))}async function nt(i,e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)||e.includes(".."))throw new Error("git-lifecycle-private-child-invalid");const t=v(i);await ee(t);const r=v(t,e);return de(t,r),Y(r)||await Qe(t,e),await ee(r,t),await ee(t),r}async function A(i,e){const t=v(e),r=v(i);de(t,r),await ee(t),await ee(r,t)}async function rr(i,e){await ie(i,e)}async function ne(i,e,t){const r=v(e),n=v(i);de(r,n);try{await A(n,r)}catch(s){if(H(s,"ENOENT"))return!1;throw s}const a=v(r,`${n.slice(r.length+1)}.remove.${process.pid}.${Date.now()}.${Re(4).toString("hex")}`);return de(r,a),await oe(r,P(n),P(a)),await A(a,r),t&&!await t(a)?(await le(a,n,r).catch(()=>{}),!1):(await Ti(r,P(a)),!0)}async function le(i,e,t){await A(i,t);try{await _e(e);return}catch(r){if(!H(r,"ENOENT"))throw r}await oe(t,P(i),P(e)),await A(e,t)}async function L(i){try{await A(i,X(i));const e=D(i,"owner.json");await ie(e,i);const t=await Z(e);return await ie(e,i),b("sha256").update(t).digest("hex")}catch{return}}async function nr(i,e){const t=await gi(i),r=await nt(t,"leases"),n=D(r,"integration"),a=`${n}.recovery`;if(Y(a)){await A(a,r);const c=await hi(a),f=await L(a);if(c===void 0||ve(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!f||!await ne(a,r,async h=>await L(h)===f))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const s=se(e.createdAt??new Date().toISOString()),o=Object.freeze({schemaVersion:1,kind:e.kind,storyId:e.storyId,sessionId:e.sessionId,idempotencyKey:e.idempotencyKey,pid:process.pid,createdAt:s,expiresAt:se(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??Re(16).toString("hex")});if(Date.parse(o.expiresAt)<=Date.parse(o.createdAt))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const g=async()=>{await ee(r,t);try{return await Je(r,P(n),`${JSON.stringify(o)}
10
+ `),await A(n,r),await ie(D(n,"owner.json"),n),!0}catch(c){throw H(c,"EEXIST")||await ne(n,r).catch(()=>{}),c}};try{return await g(),{ok:!0,owner:o,path:n}}catch(c){if(!H(c,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const c=await pe(n),f=c?void 0:await hi(n);if(c&&ui(c,o))return{ok:!0,owner:c,path:n};if(c&&Date.parse(c.expiresAt)>Date.now()&&(c.persistent||ve(c.pid))||f!==void 0&&ve(f)||!c&&f===void 0&&await Di(n))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};const u=await L(n);if(!u)return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const l=`${n}.stale.${process.pid}.${Date.now()}`;await oe(r,P(n),P(l));try{if(await A(l,r),await L(l)!==u)return await le(l,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await g()}finally{await ne(l,r,async m=>await L(m)===u).catch(()=>{})}return{ok:!0,owner:o,path:n}}catch(c){return{ok:!1,reasonCode:H(c,"EEXIST")||H(c,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function ar(i,e){const t=await pe(i);return!!(t&&$e(t,e)&&Date.parse(t.expiresAt)>Date.now())}async function at(i,e){try{const t=X(i);await A(i,t);const r=await pe(i);if(!r||!$e(r,e))return!1;const n=await L(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await oe(t,P(i),P(a)),await A(a,t);const s=await pe(a);return!s||!$e(s,e)||await L(a)!==n?(await le(a,i,t).catch(()=>{}),!1):ne(a,t,async o=>await L(o)===n)}catch(t){if(H(t,"ENOENT"))return!1;throw t}}function ct(i){return b("sha256").update(["git-lifecycle-physical-owner-v1",i.kind,i.storyId,i.sessionId,i.idempotencyKey,String(i.pid),i.createdAt,i.expiresAt,i.persistent?"persistent":"ephemeral",i.ownerNonce].join("\0")).digest("hex")}async function cr(i,e){if(!Q(e.storyId)||!B(e.idempotencyKey)||!p(e.ownerDigest))return"foreign";const t=await gi(i),r=D(t,"leases"),n=D(r,"integration");if(!Y(n))return"absent";try{await A(r,t),await A(n,r);const a=await pe(n);return!a||a.kind!=="direct"||a.storyId!==e.storyId||a.sessionId!==e.idempotencyKey||a.idempotencyKey!==e.idempotencyKey||a.persistent!==!0||ct(a)!==e.ownerDigest?"foreign":await at(n,a)?"released":"foreign"}catch{return"foreign"}}async function pe(i){try{await A(i,X(i));const e=D(i,"owner.json");await ie(e,i);const t=JSON.parse(await Z(e,"utf8"));return t.schemaVersion!==1||t.kind!=="direct"&&t.kind!=="continuous"||!Q(t.storyId)||!B(t.sessionId)||!B(t.idempotencyKey)||!Number.isSafeInteger(t.pid)||Number(t.pid)<=0||!k(t.createdAt)||!k(t.expiresAt)||typeof t.persistent!="boolean"||typeof t.ownerNonce!="string"||!/^[a-f0-9]{32}$/.test(t.ownerNonce)?void 0:t}catch{return}}async function hi(i){try{await A(i,X(i));const e=D(i,"owner.json");await ie(e,i);const t=JSON.parse(await Z(e,"utf8"));return Number.isSafeInteger(t.pid)&&Number(t.pid)>0?Number(t.pid):void 0}catch{return}}function ui(i,e){return i.kind===e.kind&&i.storyId===e.storyId&&i.sessionId===e.sessionId&&i.idempotencyKey===e.idempotencyKey&&i.expiresAt===e.expiresAt&&i.persistent===e.persistent}function $e(i,e){return ui(i,e)&&i.schemaVersion===e.schemaVersion&&i.pid===e.pid&&i.createdAt===e.createdAt&&i.ownerNonce===e.ownerNonce}async function Ne(i){const e=await re(i),r=(await T("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim(),n=he(r)?v(r):v(e,r),a=await re(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await st(a);const o=(await T("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((he(o)?v(o):v(e,o))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function li(i){const e=D(i,ye);if(Y(e)||await Qe(i,ye),await J(e,"directory"),await re(e)!==e)throw new Error("git-lifecycle-runtime-directory-symlink");return e}async function pi(i,e={}){try{return await J(i,"file"),Ve(JSON.parse(await Z(i,"utf8")))}catch(t){if(H(t,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return ze()}throw t}}async function ot(i){try{await J(i,"file")}catch(e){if(H(e,"ENOENT"))return;throw e}}async function J(i,e){const t=await _e(i);if(t.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!t.isFile():!t.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(be()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(be()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function de(i,e){const t=v(i),r=v(e),n=Oi(t,r);if(!n||n.startsWith("..")||he(n)||X(r)!==t)throw new Error("git-lifecycle-private-path-escape")}async function ee(i,e){const t=v(i);if(e&&de(v(e),t),await J(t,"directory"),v(await re(t))!==t)throw new Error("git-lifecycle-directory-substituted");if(e){const r=v(e);if(await J(r,"directory"),v(await re(r))!==r)throw new Error("git-lifecycle-directory-parent-substituted")}}async function ie(i,e){const t=v(i);if(de(v(e),t),await ee(v(e)),await J(t,"file"),v(await re(t))!==t)throw new Error("git-lifecycle-file-substituted")}function mi(i,e){const t=Fe(i);if(t.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!t.isFile():!t.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(be()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(be()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function st(i){const e=await _e(i);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function dt(i){const e=Fe(i);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function be(i=process.platform){return i!=="win32"&&typeof process.getuid=="function"}function Ve(i){if(!i||typeof i!="object"||Array.isArray(i))throw new Error("git-lifecycle-runtime-invalid");const e=i,t=e.schemaVersion;I(e,t===2?["schemaVersion","revision","epics","stories","operational"]:["schemaVersion","revision","epics","stories"],"git-lifecycle-runtime-unknown-field");const r=d(e.epics),n=d(e.stories);if(t!==1&&t!==2||!Number.isSafeInteger(e.revision)||Number(e.revision)<0||!r||!n||Object.values(r).some(a=>!d(a))||Object.values(n).some(a=>!d(a))||t===2&&!ft(e.operational))throw new Error("git-lifecycle-runtime-invalid");for(const[a,s]of Object.entries(r))if(!Q(a)||!ut(s))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[a,s]of Object.entries(n))if(!Q(a)||!a.includes(".")||!lt(s,a))throw new Error("git-lifecycle-runtime-story-invalid");return e}function ft(i){const e=d(i);if(!e)return!1;I(e,["schemaVersion","repositoryFingerprint","writerEpoch","capabilities","identities","yoloop","projectionBindings","activeJournal","backfillReceipts","reconciliationReceipts","rollbackReceipts"],"git-lifecycle-runtime-operational-unknown-field");const t=d(e.identities),r=d(e.yoloop),n=d(e.projectionBindings);return e.schemaVersion==="EpicOperationalState/1.0"&&p(e.repositoryFingerprint)&&Number.isSafeInteger(e.writerEpoch)&&Number(e.writerEpoch)>=1&&Array.isArray(e.capabilities)&&e.capabilities.length<=16&&e.capabilities.every(a=>B(a))&&!!t&&Object.keys(t).length<=2048&&!!r&&r.schemaVersion==="CommonYoloopAuthority/1.0"&&!!n&&(e.activeJournal===null||!!d(e.activeJournal))&&Le(e.backfillReceipts,64)&&Le(e.reconciliationReceipts,64)&&Le(e.rollbackReceipts,64)}function Le(i,e){return Array.isArray(i)&&i.length<=e&&i.every(t=>!!d(t))}const gt=["branch_mode","execution_branch","origin_branch","branch_lease","origin_binding","graph_revision","aggregate_qa_receipt","head_reconciliation_receipt","terminal_git_receipt","physicalMergeStatus","pr_number","git_reconciliation_receipts","git_reconciliation_debt"],ht=["checkpoint","status","last_step","steps_completed"];function ut(i){return I(i,gt,"git-lifecycle-runtime-epic-unknown-field"),(i.branch_mode===void 0||i.branch_mode==="epic")&&(i.execution_branch===void 0||K(i.execution_branch))&&(i.origin_branch===void 0||K(i.origin_branch))&&(i.branch_lease===void 0||i.branch_lease===null||pt(i.branch_lease))&&(i.origin_binding===void 0||i.origin_binding===null||wt(i.origin_binding))&&(i.graph_revision===void 0||p(i.graph_revision))&&(i.aggregate_qa_receipt===void 0||i.aggregate_qa_receipt===null||bt(i.aggregate_qa_receipt))&&(i.head_reconciliation_receipt===void 0||i.head_reconciliation_receipt===null||vt(i.head_reconciliation_receipt))&&(i.terminal_git_receipt===void 0||i.terminal_git_receipt===null||St(i.terminal_git_receipt))&&(i.physicalMergeStatus===void 0||["merged","pushed","denied_external_gate","blocked_local_or_repo","not_attempted"].includes(String(i.physicalMergeStatus)))&&(i.pr_number===void 0||i.pr_number===null||Number.isSafeInteger(i.pr_number)&&Number(i.pr_number)>0)&&(i.git_reconciliation_receipts===void 0||Et(i.git_reconciliation_receipts))&&(i.git_reconciliation_debt===void 0||At(i.git_reconciliation_debt))}function lt(i,e){return I(i,ht,"git-lifecycle-runtime-story-unknown-field"),(i.checkpoint===void 0||i.checkpoint===null||yi(i.checkpoint,e))&&(i.status===void 0||B(i.status))&&(i.last_step===void 0||i.last_step===null||B(i.last_step))&&(i.steps_completed===void 0||z(i.steps_completed,128))}function pt(i){const e=d(i);return e?(I(e,["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt","handoffGrant","handoffConsumption","setupHeadSha"],"git-lifecycle-runtime-lease-unknown-field"),e.schemaVersion===1&&Q(e.ownerStoryId)&&B(e.sessionId)&&B(e.idempotencyKey)&&k(e.acquiredAt)&&k(e.expiresAt)&&Date.parse(String(e.expiresAt))>Date.parse(String(e.acquiredAt))&&(e.setupHeadSha===void 0||S(e.setupHeadSha))&&(e.handoffGrant===void 0||mt(e.handoffGrant,e))&&(e.handoffConsumption===void 0||yt(e.handoffConsumption,e))):!1}function mt(i,e){const t=d(i);return t?(I(t,["schemaVersion","kind","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","expiresAt"],"git-lifecycle-runtime-handoff-grant-unknown-field"),t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff"&&t.storyId===e.ownerStoryId&&t.fromSessionId===e.sessionId&&p(t.tokenDigest)&&p(t.bundleDigest)&&p(t.claimRevision)&&k(t.expiresAt)&&Date.parse(String(t.expiresAt))<=Date.parse(String(e.expiresAt))):!1}function yt(i,e){const t=d(i);return t?(I(t,["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","consumedBySessionId","consumedAt"],"git-lifecycle-runtime-handoff-consumption-unknown-field"),t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff-consumption"&&t.state==="consumed"&&t.storyId===e.ownerStoryId&&B(t.fromSessionId)&&p(t.tokenDigest)&&p(t.bundleDigest)&&p(t.claimRevision)&&t.consumedBySessionId===e.sessionId&&k(t.consumedAt)):!1}function wt(i){const e=d(i);return e?(I(e,["schemaVersion","originBranch","originHeadSha","executionBranch","capturedFromCurrentCheckout","capturedAt"],"git-lifecycle-runtime-origin-unknown-field"),e.schemaVersion===1&&K(e.originBranch)&&K(e.executionBranch)&&e.originBranch!==e.executionBranch&&S(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&k(e.capturedAt)):!1}function bt(i){const e=d(i);if(!e)return!1;I(e,["schemaVersion","evidenceVersion","producer","contract","command","verdict","executionHeadSha","graphRevision","manifestDigest","resultDigest","checkedAt","receiptRef","gateIds"],"git-lifecycle-runtime-aggregate-qa-unknown-field");const t=e.evidenceVersion==="p205-execution-v2"&&e.producer==="local-yolo-tdd"&&e.contract==="P205-CI-02"&&e.command===F&&p(e.manifestDigest)&&p(e.resultDigest),r=e.evidenceVersion===void 0&&e.producer===void 0&&e.contract===void 0&&e.command===void 0&&e.manifestDigest===void 0&&e.resultDigest===void 0;return e.schemaVersion===1&&(t||r)&&e.verdict==="passed"&&S(e.executionHeadSha)&&p(e.graphRevision)&&k(e.checkedAt)&&ge(e.receiptRef)&&z(e.gateIds,128,!0)}function vt(i){const e=d(i);if(!e)return!1;I(e,["schemaVersion","kind","producer","epicId","executionBranch","originBranch","graphRevision","originHeadSha","lastAcceptedCheckpointHeadSha","executionHeadSha","acceptedCheckpointIds","acceptedCheckpointHeads","reconciliationCommitShas","commitRangeDigest","changedPaths","changedPathsDigest","allowedWriteSet","allowedWriteSetDigest","aggregateReceiptRef","aggregateManifestDigest","aggregateResultDigest","producedAt","revalidatedAt","inputDigest","publicSafe"],"git-lifecycle-runtime-head-reconciliation-unknown-field");const t=z(e.acceptedCheckpointIds,2048,!0)?e.acceptedCheckpointIds:[],r=z(e.acceptedCheckpointHeads,2048,!0)?e.acceptedCheckpointHeads:[],n=z(e.reconciliationCommitShas,2048)?e.reconciliationCommitShas:[],a=Si(e.changedPaths,2048)?e.changedPaths:[],s=Si(e.allowedWriteSet,2048,!0)?e.allowedWriteSet:[];if(e.schemaVersion!==1||e.kind!=="epic_head_reconciliation"||e.producer!=="client-p205-head-reconciliation-v1"||e.publicSafe!==!0||!Q(e.epicId)||!K(e.executionBranch)||!K(e.originBranch)||e.executionBranch===e.originBranch||!p(e.graphRevision)||!S(e.originHeadSha)||!S(e.lastAcceptedCheckpointHeadSha)||!S(e.executionHeadSha)||t.length===0||t.length!==r.length||t.some(g=>!Q(g)||!g.startsWith(`${String(e.epicId)}.`))||r.some(g=>!S(g))||n.some(g=>!S(g))||s.length===0||e.lastAcceptedCheckpointHeadSha!==e.executionHeadSha&&(n.length===0||a.length===0)||e.lastAcceptedCheckpointHeadSha===e.executionHeadSha&&(n.length!==0||a.length!==0)||!ae(a,[...new Set(a)].sort())||!ae(s,[...new Set(s)].sort())||a.some(g=>!fe(g))||s.some(g=>!vi(g))||a.some(g=>!s.some(c=>di(c,g)))||!p(e.commitRangeDigest)||!p(e.changedPathsDigest)||!p(e.allowedWriteSetDigest)||!ge(e.aggregateReceiptRef)||!p(e.aggregateManifestDigest)||!p(e.aggregateResultDigest)||!k(e.producedAt)||!k(e.revalidatedAt)||Date.parse(String(e.revalidatedAt))<Date.parse(String(e.producedAt))||!p(e.inputDigest))return!1;const o=e;return o.commitRangeDigest===Vi(o.lastAcceptedCheckpointHeadSha,o.executionHeadSha,o.reconciliationCommitShas)&&o.changedPathsDigest===Ye(o.changedPaths)&&o.allowedWriteSetDigest===Ye(o.allowedWriteSet)&&o.inputDigest===Ke(o)}function St(i){const e=d(i);return e?(I(e,["schemaVersion","epicId","executionBranch","originBranch","baseSha","executionHeadSha","mergeSha","pushedSha","strategy","prNumber","physicalStatus","localGateReceiptRefs","idempotencyKey","attemptStartedAt","completedAt","retryEligible","reasonCodes","publicSafe","candidateQa","providerGuard"],"git-lifecycle-runtime-terminal-receipt-unknown-field"),e.schemaVersion===1&&Q(e.epicId)&&K(e.executionBranch)&&K(e.originBranch)&&S(e.baseSha)&&S(e.executionHeadSha)&&(e.mergeSha===void 0||S(e.mergeSha))&&(e.pushedSha===void 0||S(e.pushedSha))&&(e.strategy==="direct"||e.strategy==="single_pr")&&(e.candidateQa===void 0||Rt(e.candidateQa,e))&&(e.providerGuard===void 0||Dt(e.providerGuard,e))&&(e.prNumber===void 0||Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0)&&["prepared","merged","pushed","denied_external_gate","blocked_local_or_repo"].includes(String(e.physicalStatus))&&z(e.localGateReceiptRefs,128,!0)&&B(e.idempotencyKey)&&k(e.attemptStartedAt)&&(e.completedAt===void 0||k(e.completedAt))&&typeof e.retryEligible=="boolean"&&z(e.reasonCodes,128)&&e.publicSafe===!0):!1}function Dt(i,e){const t=d(i);if(!t)return!1;I(t,["schemaVersion","provider","mode","source","prHeadSha","originHeadSha","checkedAt","publicSafe"],"git-lifecycle-runtime-provider-guard-unknown-field");const r=t.mode==="recovered_exact_tree"?t.source==="physical_recovery":t.mode==="strict_up_to_date_expected_head"&&["branch_protection","ruleset","branch_protection_and_ruleset"].includes(String(t.source));return t.schemaVersion===1&&t.provider==="github"&&r&&e.strategy==="single_pr"&&e.physicalStatus==="pushed"&&Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0&&S(t.prHeadSha)&&t.prHeadSha===e.mergeSha&&S(t.originHeadSha)&&t.originHeadSha===e.baseSha&&k(t.checkedAt)&&t.publicSafe===!0}function Rt(i,e){const t=d(i);return t?(I(t,["schemaVersion","kind","contract","command","originHeadSha","executionHeadSha","mergeSha","treeSha","graphRevision","manifestDigest","resultDigest","gateIds","checkedAt","receiptRef"],"git-lifecycle-runtime-merge-candidate-unknown-field"),t.schemaVersion===1&&t.kind==="epic_merge_candidate_qa"&&t.contract==="P205-CI-02"&&t.command===F&&S(t.originHeadSha)&&t.originHeadSha===e.baseSha&&S(t.executionHeadSha)&&t.executionHeadSha===e.executionHeadSha&&S(t.mergeSha)&&t.mergeSha===e.mergeSha&&S(t.treeSha)&&p(t.graphRevision)&&p(t.manifestDigest)&&p(t.resultDigest)&&z(t.gateIds,128,!0)&&k(t.checkedAt)&&ge(t.receiptRef)):!1}function yi(i,e){const t=d(i);if(!t)return!1;I(t,["schemaVersion","storyId","epicId","branch","baseSha","headSha","commits","idempotencyKey","dispatchId","bundleId","bundleDigest","graphRevision","claimRevision","receiptRefs","qaVerdict","reviewVerdict","qaReceipt","reviewReceipt","reviewReconciliation","recordedAt","rootMemoryEffect"],"git-lifecycle-runtime-checkpoint-unknown-field");const r=String(e).split(".")[0];return t.schemaVersion===1&&t.storyId===e&&t.epicId===r&&K(t.branch)&&S(t.baseSha)&&S(t.headSha)&&t.baseSha!==t.headSha&&kt(t.commits)&&t.commits.length===1&&t.commits[0]===t.headSha&&B(t.idempotencyKey)&&(t.dispatchId===void 0||p(t.dispatchId))&&(t.bundleId===void 0||p(t.bundleId))&&p(t.bundleDigest)&&p(t.graphRevision)&&(t.claimRevision===void 0||p(t.claimRevision))&&(t.rootMemoryEffect===void 0||Hi(t.rootMemoryEffect)&&t.rootMemoryEffect.storyId===e&&t.rootMemoryEffect.executionBranch===t.branch&&t.rootMemoryEffect.sourceHeadSha===t.baseSha&&t.rootMemoryEffect.childClaimRevision===t.claimRevision)&&z(t.receiptRefs,256,!0)&&(t.qaVerdict==="passed"||t.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(t.reviewVerdict))&&_t(t.qaReceipt,t)&&(t.reviewVerdict==="pending"?t.reviewReceipt===void 0:xt(t.reviewReceipt,t))&&(t.reviewReconciliation===void 0||wi(t.reviewReconciliation,t))&&k(t.recordedAt)}function wi(i,e){const t=d(i),r=d(e.qaReceipt),n=d(e.reviewReceipt);return!t||!r||!n?!1:(I(t,["schemaVersion","kind","storyId","epicId","checkpointHeadSha","approvalCommitSha","approvalArtifactDigest","qaReceiptRef","reviewReceiptRef","sourceEvidenceDigest","reviewedAt","receiptRef"],"git-lifecycle-runtime-review-reconciliation-unknown-field"),t.schemaVersion===1&&t.kind==="historical_review_reconciliation"&&t.storyId===e.storyId&&t.epicId===e.epicId&&t.checkpointHeadSha===e.headSha&&S(t.approvalCommitSha)&&p(t.approvalArtifactDigest)&&t.qaReceiptRef===r.receiptRef&&t.reviewReceiptRef===n.receiptRef&&p(t.sourceEvidenceDigest)&&k(t.reviewedAt)&&Date.parse(String(t.reviewedAt))>=Date.parse(String(r.checkedAt))&&ge(t.receiptRef)&&Array.isArray(e.receiptRefs)&&e.receiptRefs.includes(t.receiptRef))}function _t(i,e){const t=d(i);return t?(I(t,["schemaVersion","kind","producer","evidenceVersion","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","contract","command","manifestDigest","gateIds","resultDigest","sourceEvidenceDigest","verdict","checkedAt","receiptRef"],"git-lifecycle-runtime-story-qa-unknown-field"),t.schemaVersion===1&&t.kind==="story_qa_evidence"&&t.producer==="local-yolo-tdd"&&(t.evidenceVersion===void 0||t.evidenceVersion==="git-immutable-v1"||t.evidenceVersion==="p205-execution-v2"&&t.contract==="P205-CI-02"&&t.command===F&&p(t.manifestDigest)&&z(t.gateIds,32,!0)&&p(t.resultDigest))&&bi(t,e)&&p(t.sourceEvidenceDigest)&&t.verdict===e.qaVerdict&&(t.verdict==="passed"||t.verdict==="blocked")&&k(t.checkedAt)&&ge(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef)):!1}function xt(i,e){const t=d(i),r=d(e.qaReceipt);return!t||!r?!1:(I(t,["schemaVersion","kind","producer","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","sourceEvidenceDigest","reviewArtifactDigest","qaReceiptRef","verdict","reviewedAt","receiptRef"],"git-lifecycle-runtime-story-review-unknown-field"),t.schemaVersion===1&&t.kind==="story_review_evidence"&&t.producer==="root-commit-range-review"&&bi(t,e)&&p(t.sourceEvidenceDigest)&&(t.reviewArtifactDigest===void 0||p(t.reviewArtifactDigest))&&t.qaReceiptRef===r.receiptRef&&t.receiptRef!==r.receiptRef&&(t.verdict==="approved"||t.verdict==="changes-requested")&&(t.verdict==="approved"?e.reviewVerdict==="approved":e.reviewVerdict==="changes-requested")&&k(t.reviewedAt)&&Date.parse(String(t.reviewedAt))>=Date.parse(String(r.checkedAt))&&ge(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef))}function bi(i,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(t=>i[t]===e[t])}function Et(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=d(e);return t?(I(t,["schemaVersion","resourceId","action","outcome","idempotencyKey","reasonCodes","recordedAt","publicSafe"],"git-lifecycle-runtime-reconciliation-receipt-unknown-field"),t.schemaVersion===1&&B(t.resourceId)&&["no_op","delete_local_branch","delete_remote_branch","close_pull_request"].includes(String(t.action))&&["applied","already_absent","dry_run","failed"].includes(String(t.outcome))&&B(t.idempotencyKey)&&z(t.reasonCodes,128)&&k(t.recordedAt)&&t.publicSafe===!0):!1})}function At(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=d(e);return t?(I(t,["schemaVersion","resourceId","action","managed","reasonCodes","evidence","publicSafe"],"git-lifecycle-runtime-reconciliation-debt-unknown-field"),t.schemaVersion===1&&B(t.resourceId)&&t.action==="preserve"&&typeof t.managed=="boolean"&&z(t.reasonCodes,128)&&z(t.evidence,16)&&t.publicSafe===!0):!1})}function I(i,e,t){const r=new Set(e);if(Object.keys(i).some(n=>!r.has(n)))throw new Error(t)}function Q(i){return typeof i=="string"&&/^P[1-9][0-9]*(?:\.[0-9]+)*$/.test(i)}function It(i){const e=d(i);return e?Object.keys(e).length===10&&e.schemaVersion===1&&e.kind==="git_lifecycle_graph_authority"&&e.producer==="server-continuous-yoloop-v1"&&(e.source==="yolo"||e.source==="yoloop")&&Q(e.epicId)&&Q(e.storyId)&&String(e.storyId).startsWith(`${String(e.epicId)}.`)&&K(e.executionBranch)&&K(e.originBranch)&&e.originBranch!==e.executionBranch&&typeof e.graphRevision=="string"&&/^[a-f0-9]{64}$/.test(e.graphRevision)&&e.publicSafe===!0:!1}function K(i){return typeof i=="string"&&/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(i)&&!i.includes("..")&&!i.includes("//")&&!i.includes("@{")&&!i.endsWith("/")&&!i.endsWith(".")&&!i.split("/").some(e=>!e||e.startsWith(".")||e.endsWith(".lock"))}function fe(i){return vi(i)&&!i.endsWith("/")}function vi(i){return i.length>0&&i.length<=1024&&!he(i)&&!/^[A-Za-z]:[\\/]/.test(i)&&!i.includes("\0")&&!i.includes("\\")&&!i.includes("//")&&!i.replace(/\/$/,"").split("/").some(e=>!e||e==="."||e==="..")&&i.replace(/\/$/,"").split("/")[0]!==".git"}function B(i){return typeof i=="string"&&i.length>0&&i.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(i)&&!i.includes("..")}function ge(i){return B(i)}function S(i){return typeof i=="string"&&/^[a-f0-9]{40,64}$/i.test(i)}function p(i){return typeof i=="string"&&/^[a-f0-9]{64}$/i.test(i)}function k(i){return typeof i=="string"&&i.length<=64&&Number.isFinite(Date.parse(i))}function z(i,e,t=!1){return Array.isArray(i)&&i.length<=e&&(!t||i.length>0)&&i.every(B)}function Si(i,e,t=!1){return Array.isArray(i)&&i.length<=e&&(!t||i.length>0)&&i.every(r=>typeof r=="string"&&r.length>0&&r.length<=1024)}function ae(i,e){return i.length===e.length&&i.every((t,r)=>t===e[r])}function kt(i){return Array.isArray(i)&&i.length>0&&i.length<=256&&i.every(S)}function ze(){return{schemaVersion:1,revision:0,epics:{},stories:{}}}async function Ct(i){const e=X(i),t={pid:process.pid,nonce:Re(16).toString("hex")},r=async()=>{await ee(e),await Je(e,P(i),JSON.stringify(t));try{await A(i,e),await ie(D(i,"owner.json"),i)}catch(n){throw await ne(i,e).catch(()=>{}),n}};try{await r()}catch(n){if(!H(n,"EEXIST"))throw n;await J(i,"directory");const a=await qe(i);if(a!==void 0&&ve(a.pid))throw new Error("git-lifecycle-runtime-lock-active");if(a===void 0&&await Di(i))throw new Error("git-lifecycle-runtime-lock-active");const s=await L(i);if(!s)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const o=`${i}.stale.${process.pid}.${Date.now()}`;await oe(e,P(i),P(o));try{if(await A(o,e),await L(o)!==s)throw await le(o,i,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await ne(o,e,async g=>await L(g)===s).catch(()=>{})}}return t}async function Ot(i,e){const t=X(i);try{await A(i,t);const r=await qe(i);if(!r||!Ri(r,e))return!1;const n=await L(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await oe(t,P(i),P(a)),await A(a,t);const s=await qe(a);return!s||!Ri(s,e)||await L(a)!==n?(await le(a,i,t).catch(()=>{}),!1):ne(a,t,async o=>await L(o)===n)}catch(r){if(H(r,"ENOENT"))return!1;throw r}}async function Di(i){try{return Date.now()-(await Ci(i)).mtimeMs<3e4}catch{return!0}}async function qe(i){try{await A(i,X(i));const e=D(i,"owner.json");await ie(e,i);const t=JSON.parse(await Z(e,"utf8"));return Number.isSafeInteger(t.pid)&&Number(t.pid)>0&&(t.nonce===void 0||typeof t.nonce=="string"&&/^[a-f0-9]{32}$/.test(t.nonce))?{pid:Number(t.pid),...typeof t.nonce=="string"?{nonce:t.nonce}:{}}:void 0}catch{return}}function Ri(i,e){return i.pid===e.pid&&i.nonce!==void 0&&i.nonce===e.nonce}function ve(i){try{return process.kill(i,0),!0}catch(e){return H(e,"EPERM")}}function d(i){return i&&typeof i=="object"&&!Array.isArray(i)?i:void 0}function H(i,e){return i instanceof Error&&"code"in i&&i.code===e}export{ye as GIT_LIFECYCLE_RUNTIME_DIRECTORY,we as GIT_LIFECYCLE_RUNTIME_FILE,Ue as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,Wi as LEGACY_P174_CHECKPOINT_MIGRATIONS,F as P205_COMPLETE_COMMAND,nr as acquireGitLifecyclePhysicalIntegrationLock,ti as applyGitLifecycleRuntimeOverlay,A as assertGitLifecyclePrivateDirectory,rr as assertGitLifecyclePrivateFile,Yi as classifyGitLifecycleStoryCheckpointProjectionSync,ct as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,et as computeHistoricalReviewReconciliationDigest,Ui as computeImmutableStoryQaEvidenceDigest,tr as computeLegacyDirectYoloRecoveryReceiptRef,Xi as computeP205StoryQaEvidenceDigest,er as consumeEpicTerminalReleaseAuthority,nt as ensureGitLifecyclePrivateChildDirectory,Kt as ensureGitLifecycleRuntimeInitialized,ni as ensureRuntimeEpic,Jt as ensureRuntimeStory,Fi as executeP205TransientAuthorities,Ft as executeP205TransientAuthority,gi as gitLifecycleRuntimeDirectory,Pe as gitLifecycleStoryWriteSet,ai as isAcceptedGitLifecycleStoryCheckpoint,Be as mutateGitLifecycleRuntime,Ut as p205TransientAuthorityMatchesAggregate,Yt as persistGitLifecycleGraphAuthority,be as posixSecurityAvailable,Zt as projectP205TransientExecutionEvidence,He as publicStoryReviewArtifactFromGit,Oe as readGitLifecycleRuntime,ei as readGitLifecycleRuntimeSync,at as releaseGitLifecyclePhysicalIntegrationLock,cr as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,ne as removeGitLifecyclePrivateDirectory,Xt as revalidateEpicHeadReconciliationAuthority,Qt as verifyAcceptedGitLifecycleStoryCheckpoint,ci as verifyAcceptedGitLifecycleStoryCheckpointSync,ar as verifyGitLifecyclePhysicalIntegrationLock,ir as verifyLegacyCheckpointMigrationCandidateSync};
@@ -0,0 +1,97 @@
1
+ import { type ContinuitySqliteAdapter, type ContinuitySqliteAdapterLoadResult } from '../continuity/sqlite-store.js';
2
+ import { type EpicLifecycleBackfillReceiptV1, type EpicOperationalIdentityV1, type EpicOperationalRollbackReceiptV1 } from '../git/epic-operational-state.js';
3
+ export type EpicLifecycleBackfillSourceKind = 'common-runtime' | 'tracked-state' | 'legacy-yoloop-state' | 'legacy-yoloop-lock' | 'sqlite-projection';
4
+ export interface EpicLifecycleBackfillSourceV1 {
5
+ readonly schemaVersion: 'EpicLifecycleBackfillSource/1.0';
6
+ readonly kind: EpicLifecycleBackfillSourceKind;
7
+ readonly sourceFingerprint: string;
8
+ readonly presence: 'missing' | 'present' | 'corrupt' | 'unsafe' | 'unsupported' | 'unavailable';
9
+ readonly byteLength: number | null;
10
+ readonly byteDigest: string | null;
11
+ readonly canonicalDigest: string | null;
12
+ readonly sourceSchema: string | null;
13
+ readonly status: 'candidate' | 'projection' | 'activity' | 'blocked' | 'absent';
14
+ readonly role: 'authority-candidate' | 'projection' | 'activity-signal';
15
+ readonly reasonCodes: readonly string[];
16
+ readonly publicSafe: true;
17
+ }
18
+ export interface EpicLifecycleManagedClientFenceV1 {
19
+ readonly clientId: string;
20
+ readonly writerEpoch: number;
21
+ readonly capabilities: readonly string[];
22
+ readonly activeWriter: boolean;
23
+ }
24
+ export interface EpicLifecycleBackfillPlanV1 {
25
+ readonly schemaVersion: 'EpicLifecycleBackfillPlan/1.0';
26
+ readonly operationId: string;
27
+ readonly idempotencyKey: string;
28
+ readonly repositoryFingerprint: string;
29
+ readonly identity: EpicOperationalIdentityV1;
30
+ readonly expectedRuntimeSchema: 0 | 1 | 2;
31
+ readonly expectedRevision: number;
32
+ readonly expectedWriterEpoch: number;
33
+ readonly nextWriterEpoch: number;
34
+ readonly sourceInventory: readonly EpicLifecycleBackfillSourceV1[];
35
+ readonly sourceInventoryDigest: string;
36
+ readonly requiredSourceDigest: string;
37
+ readonly checkoutCount: number;
38
+ readonly checkoutSetDigest: string;
39
+ readonly managedClientFenceDigest: string;
40
+ readonly selectedYoloopSourceFingerprint: string | null;
41
+ readonly selectedYoloopCanonicalDigest: string;
42
+ readonly trackedStateMigration: {
43
+ readonly outcome: 'migrate' | 'unchanged';
44
+ readonly operationId: string | null;
45
+ readonly sourceByteDigest: string;
46
+ readonly targetByteDigest: string;
47
+ readonly sourceCanonicalHash: string | null;
48
+ readonly targetCanonicalHash: string | null;
49
+ };
50
+ readonly conflicts: readonly string[];
51
+ readonly blockers: readonly string[];
52
+ readonly proposedEffects: readonly string[];
53
+ readonly rollbackPreconditions: readonly string[];
54
+ readonly authorityPostimageDigest: string;
55
+ readonly planDigest: string;
56
+ readonly publicSafe: true;
57
+ }
58
+ /** Opaque and process-local. JSON/spread/structural mocks cannot authorize. */
59
+ export interface EpicLifecycleBackfillApproval {
60
+ readonly __epicLifecycleBackfillApproval: never;
61
+ }
62
+ export interface EpicLifecycleBackfillHooks {
63
+ readonly afterBackup?: () => void | Promise<void>;
64
+ readonly afterPrepared?: () => void | Promise<void>;
65
+ readonly afterAuthorityApplied?: () => void | Promise<void>;
66
+ readonly afterTrackedProjection?: () => void | Promise<void>;
67
+ readonly afterProjectionsApplied?: () => void | Promise<void>;
68
+ }
69
+ export interface EpicLifecycleBackfillOptions {
70
+ readonly epicId: string;
71
+ readonly executionBranch: string;
72
+ readonly graphRevision: string;
73
+ readonly originBindingDigest: string;
74
+ readonly managedClients?: readonly EpicLifecycleManagedClientFenceV1[];
75
+ readonly nowIso?: string;
76
+ readonly sqliteAdapter?: ContinuitySqliteAdapter;
77
+ readonly sqliteAdapterLoader?: () => Promise<ContinuitySqliteAdapterLoadResult>;
78
+ }
79
+ export interface EpicLifecycleBackfillApplyResult {
80
+ readonly applied: boolean;
81
+ readonly replay: boolean;
82
+ readonly receipt: EpicLifecycleBackfillReceiptV1;
83
+ readonly revision: number;
84
+ readonly writerEpoch: number;
85
+ }
86
+ export declare function previewEpicLifecycleBackfill(projectRoot: string, options: EpicLifecycleBackfillOptions): Promise<EpicLifecycleBackfillPlanV1>;
87
+ export declare function approveEpicLifecycleBackfill(plan: EpicLifecycleBackfillPlanV1): EpicLifecycleBackfillApproval;
88
+ export declare function applyEpicLifecycleBackfill(projectRoot: string, plan: EpicLifecycleBackfillPlanV1, approval?: EpicLifecycleBackfillApproval, hooks?: EpicLifecycleBackfillHooks): Promise<EpicLifecycleBackfillApplyResult>;
89
+ export declare function rollbackEpicLifecycleBackfill(input: {
90
+ readonly projectRoot: string;
91
+ readonly targetOperationId: string;
92
+ readonly expectedRevision: number;
93
+ readonly expectedWriterEpoch: number;
94
+ }): Promise<{
95
+ readonly receipt: EpicOperationalRollbackReceiptV1;
96
+ readonly revision: number;
97
+ }>;
@@ -0,0 +1,3 @@
1
+ import{execFileSync as P}from"node:child_process";import{createHash as we}from"node:crypto";import{closeSync as Y,existsSync as D,fsyncSync as U,lstatSync as j,mkdirSync as ve,openSync as G,readFileSync as _,realpathSync as O,writeFileSync as Ee}from"node:fs";import{isAbsolute as De,join as k,relative as Se,resolve as S}from"node:path";import{inspectEpicOperationalSqliteBinding as Z}from"../continuity/sqlite-store.js";import{GIT_LIFECYCLE_RUNTIME_DIRECTORY as H,GIT_LIFECYCLE_RUNTIME_FILE as Ie,mutateGitLifecycleRuntime as Re,readGitLifecycleRuntimeSync as Q}from"../git/git-lifecycle-store.js";import{EPIC_OPERATIONAL_PAYLOAD_LIMIT_BYTES as xe,EPIC_OPERATIONAL_RECEIPT_CAP as M,assertEpicOperationalState as T,createEpicOperationalIdentity as Be,createInitialEpicOperationalState as Ae,epicOperationalCanonicalJson as Oe,epicOperationalHash as f,mutateEpicOperationalState as I,readEpicOperationalState as je}from"../git/epic-operational-state.js";import{createDefaultCounters as Ce}from"../yoloop/yoloop-client-state-store.js";import{applyStateMigration as Le,previewStateMigration as Pe,readStateMigrationSourceSnapshot as C,restoreStateMigrationPreimage as _e,STATE_MIGRATION_INPUT_LIMIT_BYTES as He}from"./state-json.js";const X=32,gt=1024,R=/^[a-f0-9]{64}$/,ee=/^[A-Za-z0-9._:-]{1,128}$/,te="EpicLifecycleBackfillBackup/1.0",Me=Object.freeze(["rollover-session-v1","successor-transition-v1","continuation-replan-v1","cross-epic-continuation-reconcile-v1"]),ie=new WeakMap,re=new WeakMap;async function ht(e,t){et(t);const i=await Te(e,t),o=Fe(i);if(Buffer.byteLength(Oe(o),"utf8")>xe)throw new Error("epic-operational-plan-oversized");const r=ye(o);return ie.set(r,i),r}function yt(e){const t=ie.get(e);if(!t||e.blockers.length>0||e.conflicts.length>0||N(e)!==e.planDigest)throw new Error("epic-operational-approval-invalid");const i=Object.freeze(Object.create(null));return re.set(i,{plan:e,preview:t}),i}async function mt(e,t,i,o={}){he(t);const r=O(S(e)),n=Q(r);if(n.schemaVersion===2&&n.operational!==void 0){T(n.operational);const p=n.operational.backfillReceipts.find(l=>l.operationId===t.operationId||l.idempotencyKey===t.idempotencyKey);if(p){if(p.planDigest!==t.planDigest||p.sourceInventoryDigest!==t.sourceInventoryDigest)throw new Error("epic-operational-replay-conflict");return{applied:!1,replay:!0,receipt:p,revision:n.revision,writerEpoch:n.operational.writerEpoch}}}let a,s=n,u=n.schemaVersion===2&&n.operational!==void 0?n.operational:null;const d=u?.activeJournal;if(d){if(d.kind!=="backfill"||d.operationId!==t.operationId||d.idempotencyKey!==t.idempotencyKey||d.payloadHash!==t.planDigest)throw new Error("epic-operational-journal-conflict");if(d.phase==="aborted-before-authority")throw new Error("epic-operational-source-raced");a=oe(r,d.backupManifestRef,d.preimageDigest,t)}else{const p=i?re.get(i):void 0;if(!p||p.plan!==t||p.preview.projectRoot!==r||N(t)!==t.planDigest)throw new Error("epic-operational-approval-invalid");if(s.schemaVersion!==t.expectedRuntimeSchema&&!(t.expectedRuntimeSchema===0&&s.revision===0))throw new Error("epic-operational-revision-conflict");if(s.revision!==t.expectedRevision)throw new Error("epic-operational-revision-conflict");F(p.preview.sourceBindings,p.preview.tracked.byteDigest),J(r,p.preview.physicalBranch),a=Je(p.preview,t),await o.afterBackup?.();const l=qe(t,a,"prepared"),c={...p.preview.initialOperational,activeJournal:l};s=(await Re(r,b=>{if(b.schemaVersion!==s.schemaVersion||b.revision!==t.expectedRevision)throw new Error("epic-operational-revision-conflict");b.operational=c},{expectedRevision:t.expectedRevision,nextSchemaVersion:2,preCommit:async()=>{F(p.preview.sourceBindings,p.preview.tracked.byteDigest),J(r,p.preview.physicalBranch)}})).document,u=s.operational,await o.afterPrepared?.()}if(!u)throw new Error("epic-operational-store-missing");try{u.activeJournal?.phase==="prepared"&&(ae(a,a.plan.trackedStateMigration.sourceByteDigest),J(r,a.physicalBranch),s=(await I(r,{identityHash:t.identity.identityHash,expectedRevision:s.revision,expectedWriterEpoch:t.nextWriterEpoch},l=>{l.activeJournal={...l.activeJournal,phase:"authority-applied"}})).document,u=s.operational,await o.afterAuthorityApplied?.())}catch(p){throw u.activeJournal?.phase==="prepared"&&it(p)&&await $e(r,s,u,t),p}let h=a.plan.trackedStateMigration.targetByteDigest;if(u.activeJournal?.phase==="authority-applied"){if(Ve(a,a.trackedMigration?[a.plan.trackedStateMigration.sourceByteDigest,h]:[h]),a.trackedMigration){const m=C(r).byteDigest;Le(r,{operationId:a.trackedMigration.operationId,sourceCanonicalHash:a.trackedMigration.sourceCanonicalHash,targetCanonicalHash:a.trackedMigration.targetCanonicalHash,...m===a.plan.trackedStateMigration.sourceByteDigest?{sourceByteDigest:a.plan.trackedStateMigration.sourceByteDigest}:{}})}if(h=C(r).byteDigest,h!==a.plan.trackedStateMigration.targetByteDigest)throw new Error("epic-operational-projection-conflict");await o.afterTrackedProjection?.();const l=await Z({projectRoot:r,authorityRevision:s.revision,sourceDigest:t.authorityPostimageDigest});s=(await I(r,{identityHash:t.identity.identityHash,expectedRevision:s.revision,expectedWriterEpoch:t.nextWriterEpoch},m=>{m.projectionBindings={...m.projectionBindings,trackedState:{status:"bound",sourceDigest:h,authorityRevision:s.revision,reasonCodes:["epic-operational-tracked-state-bound"]},sqlite:{status:l.status,sourceDigest:l.sourceDigest,authorityRevision:s.revision,reasonCodes:l.reasonCodes}},m.activeJournal={...m.activeJournal,phase:"projections-applied",projectionStatuses:{trackedState:"applied",sqlite:l.status==="bound"?"applied":"unavailable"}}})).document,u=s.operational,await o.afterProjectionsApplied?.()}if(u.activeJournal?.phase!=="projections-applied")throw new Error("epic-operational-journal-corrupt");ae(a,h);const w=Ne(t,a,h,s.revision+1),g=await I(r,{identityHash:t.identity.identityHash,expectedRevision:s.revision,expectedWriterEpoch:t.nextWriterEpoch},p=>{if(p.backfillReceipts.length>=M)throw new Error("epic-operational-receipt-capacity");p.backfillReceipts=[...p.backfillReceipts,w],p.activeJournal=null}),v=g.document.operational;return{applied:!0,replay:!1,receipt:w,revision:g.document.revision,writerEpoch:v.writerEpoch}}async function bt(e){const t=O(S(e.projectRoot));let{document:i,operational:o}=je(t,{expectedRevision:e.expectedRevision,expectedWriterEpoch:e.expectedWriterEpoch});if(o.activeJournal)throw new Error("epic-operational-journal-conflict");const r=o.backfillReceipts.find(c=>c.operationId===e.targetOperationId);if(!r)throw new Error("epic-operational-rollback-target-missing");const n=o.rollbackReceipts.find(c=>c.targetOperationId===e.targetOperationId);if(n)return{receipt:n,revision:i.revision};if(o.rollbackReceipts.length>=M)throw new Error("epic-operational-receipt-capacity");const a=`backups/${e.targetOperationId}.backfill.json`,s=oe(t,a,r.backupManifestDigest,void 0);if(C(t).byteDigest!==r.postimageDigest)throw new Error("epic-operational-rollback-postimage-conflict");const d=`elrb_${f("p224-backfill-rollback-id-v1",{targetOperationId:e.targetOperationId,expectedRevision:e.expectedRevision,expectedWriterEpoch:e.expectedWriterEpoch}).slice(0,32)}`,h=f("p224-backfill-rollback-v1",{operationId:d,targetOperationId:e.targetOperationId,expectedRevision:e.expectedRevision,expectedWriterEpoch:e.expectedWriterEpoch,postimageDigest:r.postimageDigest,preimageDigest:r.preimageDigest}),w={schemaVersion:"EpicOperationalJournal/1.0",kind:"rollback",operationId:d,idempotencyKey:d,payloadHash:h,identityHash:r.identityHash,expectedRevision:e.expectedRevision,expectedWriterEpoch:e.expectedWriterEpoch,preimageDigest:r.postimageDigest,backupManifestRef:a,phase:"prepared",projectionStatuses:{trackedState:"pending",sqlite:"not-applicable"},reasonCodes:["epic-operational-backup-verified"]};let g=await I(t,{identityHash:r.identityHash,expectedRevision:i.revision,expectedWriterEpoch:o.writerEpoch},c=>{c.activeJournal=w});if(i=g.document,o=i.operational,g=await I(t,{identityHash:r.identityHash,expectedRevision:i.revision,expectedWriterEpoch:o.writerEpoch},c=>{c.writerEpoch=c.writerEpoch+1,c.activeJournal={...c.activeJournal,phase:"authority-applied"}}),i=g.document,o=i.operational,s.trackedMigration)_e({projectRoot:t,operationId:s.trackedMigration.operationId,expectedCurrentDigest:r.postimageDigest,expectedBackupDigest:r.preimageDigest});else if(r.preimageDigest!==r.postimageDigest)throw new Error("epic-operational-rollback-backup-invalid");const v=C(t);if(v.byteDigest!==r.preimageDigest)throw new Error("epic-operational-rollback-readback-failed");g=await I(t,{identityHash:r.identityHash,expectedRevision:i.revision,expectedWriterEpoch:o.writerEpoch},c=>{c.projectionBindings={...c.projectionBindings,trackedState:{status:"bound",sourceDigest:v.byteDigest,authorityRevision:i.revision,reasonCodes:["epic-operational-rollback-projection-restored"]}},c.activeJournal={...c.activeJournal,phase:"projections-applied",projectionStatuses:{trackedState:"applied",sqlite:"not-applicable"}}}),i=g.document,o=i.operational;const p={schemaVersion:"EpicOperationalRollbackReceipt/1.0",operationId:d,targetOperationId:e.targetOperationId,expectedPostimageDigest:r.postimageDigest,restoredPreimageDigest:r.preimageDigest,reasonCodes:["epic-operational-rollback-verified"],publicSafe:!0},l=await I(t,{identityHash:r.identityHash,expectedRevision:i.revision,expectedWriterEpoch:o.writerEpoch},c=>{c.rollbackReceipts=[...c.rollbackReceipts,p],c.activeJournal=null});return{receipt:p,revision:l.document.revision}}async function Te(e,t){const i=O(S(e)),o=W(i),r=Ue(o),n=D(r)?A(r).raw:null,a=Q(i),s=C(i),u=Pe(i),d=u?`${JSON.stringify(u.targetState,null,2)}
2
+ `:s.raw,h=V(d),w=Be(i,t),g=t.nowIso??new Date().toISOString();if(!Number.isFinite(Date.parse(g)))throw new Error("epic-operational-time-invalid");const v=Ye(i,o),p=[],l=[];p.push(se("common-runtime",o,n,"authority-candidate")),p.push(se("tracked-state",i,s.raw,"projection")),l.push({path:k(i,".neocortex","state.json"),presence:"present",digest:s.byteDigest,kind:"tracked-state"});const c=[];let m=null;const b=[];for(const x of v){const be=k(x.path,".neocortex","yoloop-state.json"),ke=k(x.path,".neocortex","yoloop.lock"),E=ce(be,"legacy-yoloop-state",x.fingerprint,ze);p.push(E.source),l.push(E.binding),E.parsed&&c.push({fingerprint:x.fingerprint,parsed:E.parsed,digest:E.source.canonicalDigest}),(E.source.presence==="corrupt"||E.source.presence==="unsafe"||E.source.presence==="unsupported")&&b.push(...E.source.reasonCodes);const B=ce(ke,"legacy-yoloop-lock",x.fingerprint,Ke);p.push(B.source),l.push(B.binding),B.parsed&&(m=B.parsed),B.source.presence!=="missing"&&(B.parsed?b.push("epic-operational-writer-active"):b.push(...B.source.reasonCodes))}[...new Set(c.map(x=>x.digest))].length>1&&b.push("epic-operational-source-conflict");const $=c[0];!$&&Xe(s.state)&&b.push("epic-operational-progress-source-missing");const z=$?.parsed??Ce(g),K=Ae({identity:w,yoloop:{lock:null,state:z,capabilities:Me},trackedStateDigest:s.byteDigest,sqliteStatus:"unavailable",sqliteReasonCodes:["epic-operational-projection-unavailable"]}),L=await Z({projectRoot:i,authorityRevision:a.revision,sourceDigest:f("p224-backfill-authority-v1",K),...t.sqliteAdapter?{adapter:t.sqliteAdapter}:{},...t.sqliteAdapterLoader?{adapterLoader:t.sqliteAdapterLoader}:{}});p.push({schemaVersion:"EpicLifecycleBackfillSource/1.0",kind:"sqlite-projection",sourceFingerprint:f("p224-backfill-source-v1",{kind:"sqlite-projection",repository:w.repositoryFingerprint}),presence:L.status==="unavailable"?"unavailable":"present",byteLength:null,byteDigest:L.sourceDigest,canonicalDigest:L.sourceDigest,sourceSchema:"continuity-state_snapshots",status:"projection",role:"projection",reasonCodes:L.reasonCodes,publicSafe:!0});const me=P("git",["branch","--show-current"],{cwd:i,encoding:"utf8"}).trim();return{projectRoot:i,commonDir:o,runtimePath:r,runtimeRaw:n,runtime:a,tracked:s,trackedMigration:u,trackedTargetRaw:d,trackedTargetDigest:h,selectedYoloop:z,selectedYoloopLock:m,initialOperational:K,sourceBindings:l,publicSources:p.sort(tt),collectionBlockers:b,physicalBranch:me,options:{epicId:t.epicId,executionBranch:t.executionBranch,graphRevision:t.graphRevision,originBindingDigest:t.originBindingDigest,managedClients:t.managedClients??[],nowIso:g,...t.sqliteAdapter?{sqliteAdapter:t.sqliteAdapter}:{},...t.sqliteAdapterLoader?{sqliteAdapterLoader:t.sqliteAdapterLoader}:{}}}}function Fe(e){const t=e.collectionBlockers,i=We(e),o=[...t];e.physicalBranch!==e.options.executionBranch&&o.push("epic-operational-branch-mismatch");const r=Qe(e.tracked.state,e.options.epicId),n=y(e.runtime.epics[e.options.epicId]);r||o.push("epic-operational-epic-missing"),r&&r.branch_mode!==void 0&&r.branch_mode!=="epic"&&o.push("epic-operational-branch-mode-conflict"),r&&typeof r.execution_branch=="string"&&r.execution_branch!==e.options.executionBranch&&o.push("epic-operational-branch-mismatch"),r&&typeof r.graph_revision=="string"&&r.graph_revision!==e.options.graphRevision&&o.push("epic-operational-graph-mismatch"),n&&typeof n.execution_branch=="string"&&n.execution_branch!==e.options.executionBranch&&o.push("epic-operational-branch-mismatch"),n&&typeof n.graph_revision=="string"&&n.graph_revision!==e.options.graphRevision&&o.push("epic-operational-graph-mismatch"),(de(r?.branch_lease,e.options.nowIso)||de(n?.branch_lease,e.options.nowIso))&&o.push("epic-operational-writer-active");const a=e.runtime.schemaVersion===2&&e.runtime.operational?Number(e.runtime.operational.writerEpoch):0;for(const c of e.options.managedClients)c.activeWriter&&o.push("epic-operational-writer-active"),(c.writerEpoch!==a||!c.capabilities.includes("epic-operational-state-v1"))&&o.push("epic-operational-legacy-writer-unfenced");if(e.runtime.schemaVersion===2)try{T(e.runtime.operational);const c=e.runtime.operational;o.push("epic-operational-already-adopted"),c.activeJournal&&o.push("epic-operational-journal-conflict"),c.backfillReceipts.length>=M&&o.push("epic-operational-receipt-capacity")}catch{o.push("epic-operational-store-corrupt")}const s=i.filter(c=>c.kind!=="sqlite-projection"),u=f("p224-backfill-source-inventory-v1",i),d=f("p224-backfill-required-sources-v1",s),h=[...new Set(i.filter(c=>c.kind==="legacy-yoloop-state").map(c=>c.sourceFingerprint))].sort(),w=f("p224-managed-client-fence-v1",e.options.managedClients),g=e.trackedMigration,v={schemaVersion:"EpicLifecycleBackfillPlan/1.0",repositoryFingerprint:e.initialOperational.repositoryFingerprint,identity:Object.values(e.initialOperational.identities)[0],expectedRuntimeSchema:e.runtimeRaw===null?0:e.runtime.schemaVersion,expectedRevision:e.runtime.revision,expectedWriterEpoch:a,nextWriterEpoch:Math.max(1,a+1),sourceInventory:i,sourceInventoryDigest:u,requiredSourceDigest:d,checkoutCount:h.length,checkoutSetDigest:f("p224-backfill-checkout-set-v1",h),managedClientFenceDigest:w,selectedYoloopSourceFingerprint:i.find(c=>c.kind==="legacy-yoloop-state"&&c.presence==="present")?.sourceFingerprint??null,selectedYoloopCanonicalDigest:f("p224-backfill-yoloop-v1",e.selectedYoloop),trackedStateMigration:{outcome:g?"migrate":"unchanged",operationId:g?.operationId??null,sourceByteDigest:e.tracked.byteDigest,targetByteDigest:e.trackedTargetDigest,sourceCanonicalHash:g?.sourceCanonicalHash??null,targetCanonicalHash:g?.targetCanonicalHash??null},conflicts:[...new Set(o.filter(c=>c==="epic-operational-source-conflict"))].sort(),blockers:[...new Set(o)].sort(),proposedEffects:["promote-common-runtime-v2","install-common-yoloop-authority",...g?["migrate-owned-tracked-state"]:[],"record-explicit-sqlite-binding","append-backfill-receipt"],rollbackPreconditions:["exact-runtime-revision-and-writer-epoch","exact-tracked-postimage","verified-private-backup","quiescent-writers"],authorityPostimageDigest:f("p224-backfill-authority-v1",e.initialOperational),publicSafe:!0},p=`elbf_${f("p224-backfill-operation-id-v1",v).slice(0,32)}`,l={...v,operationId:p,idempotencyKey:p};return{...l,planDigest:f("p224-backfill-plan-v1",l)}}function We(e){return e.publicSources}function Je(e,t){const i=k(e.commonDir,H);fe(i,e.commonDir);const o=k(i,"backups");fe(o,i);const r={schemaVersion:te,operationId:t.operationId,plan:t,runtimeRaw:e.runtimeRaw,trackedSourceRaw:e.tracked.raw,trackedTargetRaw:e.trackedTargetRaw,trackedMigration:e.trackedMigration,initialOperational:e.initialOperational,sourceBindings:e.sourceBindings,physicalBranch:e.physicalBranch},n={...r,manifestDigest:f("p224-backfill-backup-v1",r)},a=k(o,`${t.operationId}.backfill.json`),s=`${JSON.stringify(n,null,2)}
3
+ `;if(D(a)){const d=ne(_(a,"utf8"));if(d.manifestDigest!==n.manifestDigest)throw new Error("epic-operational-backup-failed");return d}const u=G(a,"wx",384);try{Ee(u,s),U(u)}finally{Y(u)}return ge(o),n}function oe(e,t,i,o){if(!/^backups\/elbf_[a-f0-9]{32}\.backfill\.json$/.test(t)||!R.test(i))throw new Error("epic-operational-backup-failed");const r=W(e),n=k(r,H),a=k(n,t);q(n,"directory"),q(a,"file");const s=ne(_(a,"utf8"));if(s.manifestDigest!==i||o&&(s.plan.planDigest!==o.planDigest||s.operationId!==o.operationId))throw new Error("epic-operational-backup-failed");return s}function ne(e){let t;try{t=JSON.parse(e)}catch{throw new Error("epic-operational-backup-failed")}const i=y(t);if(!i||i.schemaVersion!==te||!ee.test(String(i.operationId))||!y(i.plan)||!y(i.initialOperational)||!Array.isArray(i.sourceBindings)||typeof i.trackedSourceRaw!="string"||typeof i.trackedTargetRaw!="string"||typeof i.physicalBranch!="string"||!R.test(String(i.manifestDigest)))throw new Error("epic-operational-backup-failed");const{manifestDigest:o,...r}=i;if(o!==f("p224-backfill-backup-v1",r))throw new Error("epic-operational-backup-failed");return he(i.plan),T(i.initialOperational),i}function qe(e,t,i){return{schemaVersion:"EpicOperationalJournal/1.0",kind:"backfill",operationId:e.operationId,idempotencyKey:e.idempotencyKey,payloadHash:e.planDigest,identityHash:e.identity.identityHash,expectedRevision:e.expectedRevision,expectedWriterEpoch:e.expectedWriterEpoch,preimageDigest:t.manifestDigest,backupManifestRef:`backups/${e.operationId}.backfill.json`,phase:i,projectionStatuses:{trackedState:"pending",sqlite:"pending"},reasonCodes:["epic-operational-backup-verified"]}}function Ne(e,t,i,o){return Object.freeze({schemaVersion:"EpicLifecycleBackfillReceipt/1.0",operationId:e.operationId,idempotencyKey:e.idempotencyKey,payloadHash:e.planDigest,planDigest:e.planDigest,sourceInventoryDigest:e.sourceInventoryDigest,preimageDigest:e.trackedStateMigration.sourceByteDigest,postimageDigest:i,authorityPostimageDigest:e.authorityPostimageDigest,backupManifestDigest:t.manifestDigest,identityHash:e.identity.identityHash,appliedRevision:o,writerEpoch:e.nextWriterEpoch,stateMigrationOperationId:e.trackedStateMigration.operationId,outcome:"applied",reasonCodes:["epic-operational-backfill-applied","epic-operational-backup-verified"],publicSafe:!0})}function ae(e,t){F(e.sourceBindings,t)}function Ve(e,t){for(const i of e.sourceBindings){if(i.kind==="tracked-state"){const o=A(i.path);if(!t.includes(o.digest))throw new Error("epic-operational-source-raced");continue}if(i.presence==="missing"){if(D(i.path))throw new Error("epic-operational-source-raced");continue}if(A(i.path).digest!==i.digest)throw new Error("epic-operational-source-raced")}}function F(e,t){for(const i of e){if(i.kind==="tracked-state"){if(A(i.path).digest!==t)throw new Error("epic-operational-source-raced");continue}if(i.presence==="missing"){if(D(i.path))throw new Error("epic-operational-source-raced");continue}if(A(i.path).digest!==i.digest)throw new Error("epic-operational-source-raced")}}async function $e(e,t,i,o){i.activeJournal?.phase==="prepared"&&await I(e,{identityHash:o.identity.identityHash,expectedRevision:t.revision,expectedWriterEpoch:o.nextWriterEpoch},r=>{r.activeJournal={...r.activeJournal,phase:"aborted-before-authority",reasonCodes:[...r.activeJournal.reasonCodes,"epic-operational-source-raced"]}})}function ce(e,t,i,o){const r=f("p224-backfill-source-v1",{kind:t,worktreeFingerprint:i});if(!D(e))return{source:le(t,r),binding:{path:e,presence:"missing",digest:null,kind:t},parsed:null};try{const n=A(e),a=o(JSON.parse(n.raw));return{source:pe(t,r,n.raw,a),binding:{path:e,presence:"present",digest:n.digest,kind:t},parsed:a}}catch(n){const a=n instanceof Error&&n.message.startsWith("epic-operational-")?n.message:"epic-operational-source-corrupt";return{source:ue(t,r,a.endsWith("unsafe")?"unsafe":"corrupt",a),binding:{path:e,presence:"present",digest:Ge(e),kind:t},parsed:null}}}function ze(e){const t=y(e);if(!t||!["1.1","1.2"].includes(String(t.version))||!Number.isFinite(t.storiesRunToday)||Number(t.storiesRunToday)<0||!Number.isFinite(t.iterationsToday)||Number(t.iterationsToday)<0||!Number.isFinite(t.tokensUsedToday)||Number(t.tokensUsedToday)<0||!Number.isFinite(t.totalRunsAllTime)||Number(t.totalRunsAllTime)<0||!Number.isFinite(t.totalStoriesAllTime)||Number(t.totalStoriesAllTime)<0||!(t.currentSession===null||y(t.currentSession))||!Array.isArray(t.pendingContinuationAuthorities??[]))throw new Error("epic-operational-source-corrupt");return t}function Ke(e){const t=y(e);if(!t||!Number.isSafeInteger(t.pid)||Number(t.pid)<0||typeof t.hostname!="string"||typeof t.startedAt!="string"||typeof t.sessionId!="string"||t.sessionId.length>128||!Array.isArray(t.epicQueue)||!t.epicQueue.every(i=>typeof i=="string")||typeof t.currentEpicId!="string"||typeof t.ttlExpiresAt!="string")throw new Error("epic-operational-source-corrupt");return t}function se(e,t,i,o){const r=Ze(t,e);if(i===null)return le(e,r);let n;try{n=JSON.parse(i)}catch{return ue(e,r,"corrupt","epic-operational-source-corrupt")}return{...pe(e,r,i,n),role:o,status:o==="projection"?"projection":"candidate"}}function pe(e,t,i,o){const r=y(o);return{schemaVersion:"EpicLifecycleBackfillSource/1.0",kind:e,sourceFingerprint:t,presence:"present",byteLength:Buffer.byteLength(i,"utf8"),byteDigest:V(i),canonicalDigest:f("p224-backfill-source-canonical-v1",o),sourceSchema:typeof r?.schemaVersion=="string"||typeof r?.schemaVersion=="number"?String(r.schemaVersion):typeof r?.version=="string"?r.version:"legacy",status:e.includes("lock")?"activity":e==="tracked-state"||e==="sqlite-projection"?"projection":"candidate",role:e.includes("lock")?"activity-signal":e==="tracked-state"||e==="sqlite-projection"?"projection":"authority-candidate",reasonCodes:["epic-operational-source-complete"],publicSafe:!0}}function le(e,t){return{schemaVersion:"EpicLifecycleBackfillSource/1.0",kind:e,sourceFingerprint:t,presence:"missing",byteLength:null,byteDigest:null,canonicalDigest:null,sourceSchema:null,status:"absent",role:e.includes("lock")?"activity-signal":e==="tracked-state"||e==="sqlite-projection"?"projection":"authority-candidate",reasonCodes:["epic-operational-source-missing"],publicSafe:!0}}function ue(e,t,i,o){return{schemaVersion:"EpicLifecycleBackfillSource/1.0",kind:e,sourceFingerprint:t,presence:i,byteLength:null,byteDigest:null,canonicalDigest:null,sourceSchema:null,status:"blocked",role:e.includes("lock")?"activity-signal":e==="tracked-state"?"projection":"authority-candidate",reasonCodes:[o],publicSafe:!0}}function Ye(e,t){const o=P("git",["worktree","list","--porcelain","-z"],{cwd:e,encoding:"utf8",maxBuffer:4194304}).split("\0").filter(r=>r.startsWith("worktree ")).map(r=>r.slice(9));if(o.length===0||o.length>X)throw new Error("epic-operational-checkout-capacity");return o.map(r=>{const n=O(r);if(W(n)!==t)throw new Error("epic-operational-foreign-common-dir");const s=j(n);if(!s.isDirectory()||s.isSymbolicLink())throw new Error("epic-operational-path-unsafe");return{path:n,fingerprint:f("p224-backfill-worktree-v1",{repository:f("p224-backfill-common-v1",t),dev:Number(s.dev),ino:Number(s.ino)})}}).sort((r,n)=>r.fingerprint.localeCompare(n.fingerprint))}function W(e){const t=P("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),i=De(t)?S(t):S(e,t),o=O(i),r=j(o);if(o!==i||!r.isDirectory()||r.isSymbolicLink())throw new Error("epic-operational-path-unsafe");return o}function Ue(e){const t=k(e,H,Ie);return D(t)?t:k(e,"neocortex-yoloop-runtime.json")}function A(e){const t=j(e);if(!t.isFile()||t.isSymbolicLink())throw new Error("epic-operational-path-unsafe");if(typeof process.getuid=="function"&&t.uid!==process.getuid())throw new Error("epic-operational-path-unsafe");if(t.size>He)throw new Error("epic-operational-source-oversized");const i=_(e,"utf8");if(Buffer.byteLength(i,"utf8")!==t.size)throw new Error("epic-operational-source-raced");return{raw:i,digest:V(i)}}function Ge(e){try{return A(e).digest}catch{return null}}function Ze(e,t){let i={presence:"missing"};if(D(e)){const o=j(e);i={dev:Number(o.dev),ino:Number(o.ino),type:o.isDirectory()?"directory":"file"}}return f("p224-backfill-source-v1",{kind:t,physical:i})}function Qe(e,t){const i=e.epics;return Array.isArray(i)?i.map(y).find(o=>o?.id===t):y(i)?.[t]}function Xe(e){const t=e.stories;return(Array.isArray(t)?t:Object.values(y(t)??{})).some(o=>{const r=y(o);return!!(r&&(Array.isArray(r.steps_completed)&&r.steps_completed.length>0||r.checkpoint||r.branch_name||typeof r.status=="string"&&!["backlog","planned"].includes(r.status)))})}function de(e,t){const i=y(e);if(!i)return!1;const o=Date.parse(String(i.expiresAt??""));return!Number.isFinite(o)||o>Date.parse(t)}function J(e,t){if(P("git",["branch","--show-current"],{cwd:e,encoding:"utf8"}).trim()!==t)throw new Error("epic-operational-source-raced")}function fe(e,t){if(D(e)||(ve(e,{mode:448}),ge(t)),q(e,"directory"),O(e)!==S(e)||Se(S(t),S(e)).startsWith(".."))throw new Error("epic-operational-path-unsafe")}function q(e,t){const i=j(e);if(i.isSymbolicLink()||(t==="file"?!i.isFile():!i.isDirectory())||typeof process.getuid=="function"&&i.uid!==process.getuid()||process.platform!=="win32"&&(i.mode&63)!==0)throw new Error("epic-operational-path-unsafe")}function ge(e){if(process.platform==="win32")return;const t=G(e,"r");try{U(t)}finally{Y(t)}}function et(e){if(!/^P[1-9][0-9]*$/.test(e.epicId)||!/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(e.executionBranch)||e.executionBranch.includes("..")||e.executionBranch.includes("//")||!R.test(e.graphRevision)||!R.test(e.originBindingDigest)||(e.managedClients?.length??0)>128||e.managedClients?.some(t=>!ee.test(t.clientId)||!Number.isSafeInteger(t.writerEpoch)||t.writerEpoch<0||t.capabilities.length>16))throw new Error("epic-operational-preview-input-invalid")}function he(e){if(e.schemaVersion!=="EpicLifecycleBackfillPlan/1.0"||!/^elbf_[a-f0-9]{32}$/.test(e.operationId)||e.idempotencyKey!==e.operationId||!R.test(e.repositoryFingerprint)||!R.test(e.planDigest)||!R.test(e.sourceInventoryDigest)||!R.test(e.requiredSourceDigest)||N(e)!==e.planDigest||e.sourceInventory.length>X*2+3||e.blockers.some(t=>!/^[a-z0-9][a-z0-9-]{0,79}$/.test(t)))throw new Error("epic-operational-plan-invalid")}function N(e){const{planDigest:t,...i}=e;return f("p224-backfill-plan-v1",i)}function tt(e,t){return`${e.kind}:${e.sourceFingerprint}`.localeCompare(`${t.kind}:${t.sourceFingerprint}`)}function it(e){return e instanceof Error&&["epic-operational-source-raced","epic-operational-branch-mismatch","epic-operational-writer-active","epic-operational-legacy-writer-unfenced"].includes(e.message)}function y(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function V(e){return we("sha256").update(e).digest("hex")}function ye(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(const t of Object.values(e))ye(t)}return e}export{mt as applyEpicLifecycleBackfill,yt as approveEpicLifecycleBackfill,ht as previewEpicLifecycleBackfill,bt as rollbackEpicLifecycleBackfill};
@@ -18,6 +18,13 @@ export interface StateMigrationAuthorityV1 {
18
18
  readonly plan: Omit<StateMigrationPlanV1, 'targetState'> | null;
19
19
  readonly publicSafe: true;
20
20
  }
21
+ /** Private, complete source used by the P224 brownfield planner. */
22
+ export interface StateMigrationSourceSnapshotV1 {
23
+ readonly state: Readonly<Record<string, unknown>>;
24
+ readonly raw: string;
25
+ readonly byteDigest: string;
26
+ readonly byteLength: number;
27
+ }
21
28
  export declare class StateMigrationApplyError extends Error {
22
29
  readonly reasonCode: string;
23
30
  readonly receipt?: StateMigrationReceiptV1 | undefined;
@@ -29,6 +36,21 @@ export interface StateMigrationApplyHooks {
29
36
  readonly afterReplace?: (statePath: string) => void;
30
37
  }
31
38
  export declare function collectStateMigrationAuthority(projectRoot: string): StateMigrationAuthorityV1;
39
+ export declare function readStateMigrationSourceSnapshot(projectRoot: string): StateMigrationSourceSnapshotV1;
40
+ /**
41
+ * Restore one migration preimage only while both current postimage and backup
42
+ * bytes remain exact. This is intentionally narrower than a general reset and
43
+ * never removes the backup or migration history.
44
+ */
45
+ export declare function restoreStateMigrationPreimage(input: {
46
+ readonly projectRoot: string;
47
+ readonly operationId: string;
48
+ readonly expectedCurrentDigest: string;
49
+ readonly expectedBackupDigest: string;
50
+ }): {
51
+ readonly restoredDigest: string;
52
+ readonly backupPreserved: true;
53
+ };
32
54
  export declare function previewStateMigration(projectRoot: string): StateMigrationPlanV1 | null;
33
55
  /** Apply one shared plan under a client-owned lock, byte CAS and durable backup. */
34
56
  export declare function applyStateMigration(projectRoot: string, expectedPlan?: Pick<StateMigrationPlanV1, 'operationId' | 'sourceCanonicalHash' | 'targetCanonicalHash'> & {