@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.
- package/dist/release-source.json +1 -1
- package/dist/sbom.cdx.json +1217 -1211
- package/install.ps1 +1 -1
- package/install.sh +1 -1
- package/package.json +2 -2
- package/packages/client/dist/commands/invoke.js +66 -66
- package/packages/client/dist/continuity/sqlite-store.d.ts +22 -1
- package/packages/client/dist/continuity/sqlite-store.js +60 -60
- package/packages/client/dist/git/epic-operational-state.d.ts +198 -0
- package/packages/client/dist/git/epic-operational-state.js +2 -0
- package/packages/client/dist/git/git-lifecycle-store.d.ts +32 -1
- package/packages/client/dist/git/git-lifecycle-store.js +9 -8
- package/packages/client/dist/migrations/epic-lifecycle-backfill.d.ts +97 -0
- package/packages/client/dist/migrations/epic-lifecycle-backfill.js +3 -0
- package/packages/client/dist/migrations/state-json.d.ts +22 -0
- package/packages/client/dist/migrations/state-json.js +4 -4
- package/packages/client/dist/runner/headless/epic-merge-candidate-qa.d.ts +1 -1
- package/packages/client/dist/runner/headless/epic-merge-candidate-qa.js +2 -2
- package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.d.ts +2 -0
- package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.js +10 -8
- package/packages/client/dist/runner/headless/epic-terminal-git-runner.d.ts +18 -2
- package/packages/client/dist/runner/headless/epic-terminal-git-runner.js +2 -2
- package/packages/client/dist/runner/headless/run-yolo.js +1 -1
- package/packages/client/dist/runner/headless/run-yoloop.d.ts +1 -0
- package/packages/client/dist/runner/headless/run-yoloop.js +2 -2
- package/packages/client/dist/runner/headless/types.js +2 -2
- package/packages/client/dist/state/project-state-snapshot.d.ts +8 -0
- package/packages/client/dist/state/project-state-snapshot.js +1 -1
- package/packages/client/dist/yolo/spec-envelope-collector.js +3 -3
- package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +65 -1
- package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +8 -0
- package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -1
- package/packages/shared/dist/yolo/change-evidence.js +1 -1
- package/packages/shared/dist/yolo/spec-envelope.js +3 -6
- package/packages/shared/dist/yoloop/epic-terminal-git.js +144 -2
- package/targets-stubs/antigravity/gemini.md +1 -1
- package/targets-stubs/antigravity/skill/SKILL.md +1 -1
- package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex-root.md +2 -2
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +2 -2
- package/targets-stubs/codex/AGENTS.md +1 -1
- package/targets-stubs/cursor/agent.md +2 -2
- package/targets-stubs/gemini-cli/agent.md +2 -2
- package/targets-stubs/opencode/neocortex-root.md +1 -1
- 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
|
|
3
|
-
`).map(
|
|
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
|
-
`),
|
|
7
|
-
`).includes(
|
|
8
|
-
`).map(
|
|
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'> & {
|