@ornexus/neocortex 4.60.63 → 4.60.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/release-source.json +1 -1
  2. package/dist/sbom.cdx.json +31 -38
  3. package/install.js +1 -0
  4. package/install.ps1 +34 -3
  5. package/install.sh +35 -3
  6. package/package.json +5 -3
  7. package/packages/client/dist/cli.js +8 -3
  8. package/packages/client/dist/commands/activate.js +8 -8
  9. package/packages/client/dist/commands/architecture-memory-terminal.js +4 -2
  10. package/packages/client/dist/commands/architecture-non-ui-continuation.d.ts +3 -0
  11. package/packages/client/dist/commands/architecture-non-ui-continuation.js +1 -0
  12. package/packages/client/dist/commands/invoke.d.ts +19 -16
  13. package/packages/client/dist/commands/invoke.js +80 -75
  14. package/packages/client/dist/commands/mutation-qa-run.js +2 -2
  15. package/packages/client/dist/commands/planning-generation.js +1 -1
  16. package/packages/client/dist/commands/planning-memory.d.ts +1 -0
  17. package/packages/client/dist/commands/planning-memory.js +1 -0
  18. package/packages/client/dist/commands/private-session.d.ts +1 -0
  19. package/packages/client/dist/commands/private-session.js +1 -0
  20. package/packages/client/dist/commands/qa-control.d.ts +4 -0
  21. package/packages/client/dist/commands/qa-control.js +1 -0
  22. package/packages/client/dist/commands/qa-scan-browser-launch.d.ts +8 -0
  23. package/packages/client/dist/commands/qa-scan-browser-launch.js +1 -0
  24. package/packages/client/dist/commands/qa-scan-browser-route.d.ts +3 -0
  25. package/packages/client/dist/commands/qa-scan-browser-route.js +1 -0
  26. package/packages/client/dist/commands/qa-scan-capture.d.ts +43 -0
  27. package/packages/client/dist/commands/qa-scan-capture.js +5 -5
  28. package/packages/client/dist/commands/qa-scan-discovery.d.ts +7 -0
  29. package/packages/client/dist/commands/qa-scan-discovery.js +3 -3
  30. package/packages/client/dist/commands/qa-scan-review.d.ts +8 -1
  31. package/packages/client/dist/commands/qa-scan-review.js +5 -5
  32. package/packages/client/dist/commands/qa-synthetic-backend-capture.d.ts +62 -0
  33. package/packages/client/dist/commands/qa-synthetic-backend-capture.js +1 -0
  34. package/packages/client/dist/commands/qa-synthetic-backend-review.d.ts +104 -0
  35. package/packages/client/dist/commands/qa-synthetic-backend-review.js +1 -0
  36. package/packages/client/dist/commands/qa-synthetic-backend.d.ts +52 -0
  37. package/packages/client/dist/commands/qa-synthetic-backend.js +7 -0
  38. package/packages/client/dist/commands/qa-synthetic-broker-port.d.ts +30 -0
  39. package/packages/client/dist/commands/qa-synthetic-broker-port.js +1 -0
  40. package/packages/client/dist/commands/qa-synthetic-browser.d.ts +1 -0
  41. package/packages/client/dist/commands/qa-synthetic-browser.js +1 -0
  42. package/packages/client/dist/commands/refactor-characterization.d.ts +4 -2
  43. package/packages/client/dist/commands/refactor-characterization.js +21 -12
  44. package/packages/client/dist/commands/refactor-control.d.ts +9 -0
  45. package/packages/client/dist/commands/refactor-control.js +3 -0
  46. package/packages/client/dist/commands/refactor-cpp-assertions.d.ts +4 -0
  47. package/packages/client/dist/commands/refactor-cpp-assertions.js +3 -0
  48. package/packages/client/dist/commands/refactor-review.js +5 -5
  49. package/packages/client/dist/commands/refactor-root.d.ts +8 -1
  50. package/packages/client/dist/commands/refactor-root.js +7 -7
  51. package/packages/client/dist/commands/refresh-memory.d.ts +1 -0
  52. package/packages/client/dist/commands/refresh-memory.js +3 -3
  53. package/packages/client/dist/commands/shared-architecture-non-ui.d.ts +18 -0
  54. package/packages/client/dist/commands/shared-architecture-non-ui.js +1 -0
  55. package/packages/client/dist/errors/error-messages.js +1 -1
  56. package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +5 -1
  57. package/packages/client/dist/git/direct-yolo-checkpoint.js +4 -4
  58. package/packages/client/dist/git/git-lifecycle-store.d.ts +2 -0
  59. package/packages/client/dist/git/git-lifecycle-store.js +9 -8
  60. package/packages/client/dist/license/license-client.d.ts +3 -1
  61. package/packages/client/dist/license/license-client.js +1 -1
  62. package/packages/client/dist/memory/project-memory-path-scope.d.ts +4 -0
  63. package/packages/client/dist/memory/project-memory-path-scope.js +1 -0
  64. package/packages/client/dist/memory/project-memory-writer.d.ts +4 -1
  65. package/packages/client/dist/memory/project-memory-writer.js +16 -16
  66. package/packages/client/dist/private-execution/codex-executor.d.ts +24 -4
  67. package/packages/client/dist/private-execution/codex-executor.js +4 -2
  68. package/packages/client/dist/private-execution/codex-host-runtime.d.ts +10 -0
  69. package/packages/client/dist/private-execution/codex-host-runtime.js +1 -0
  70. package/packages/client/dist/private-execution/codex-lifecycle-guard.d.ts +4 -0
  71. package/packages/client/dist/private-execution/codex-lifecycle-guard.js +1 -0
  72. package/packages/client/dist/private-execution/codex-scoped-permissions.d.ts +8 -0
  73. package/packages/client/dist/private-execution/codex-scoped-permissions.js +1 -0
  74. package/packages/client/dist/private-execution/delivery.d.ts +17 -1
  75. package/packages/client/dist/private-execution/delivery.js +11 -3
  76. package/packages/client/dist/private-execution/diagnosis-root-review.d.ts +112 -0
  77. package/packages/client/dist/private-execution/diagnosis-root-review.js +2 -0
  78. package/packages/client/dist/private-execution/frozen-handoff.d.ts +2 -0
  79. package/packages/client/dist/private-execution/frozen-handoff.js +6 -0
  80. package/packages/client/dist/private-execution/implementation-validation.d.ts +15 -0
  81. package/packages/client/dist/private-execution/implementation-validation.js +2 -0
  82. package/packages/client/dist/private-execution/isolated-admission.d.ts +11 -7
  83. package/packages/client/dist/private-execution/isolated-admission.js +17 -10
  84. package/packages/client/dist/private-execution/isolated-session.d.ts +68 -0
  85. package/packages/client/dist/private-execution/isolated-session.js +5 -2
  86. package/packages/client/dist/private-execution/pact-test-source.d.ts +1 -1
  87. package/packages/client/dist/private-execution/pact-test-source.js +1 -1
  88. package/packages/client/dist/private-execution/planning-diagnosis-checkpoint.d.ts +2 -0
  89. package/packages/client/dist/private-execution/planning-diagnosis-checkpoint.js +5 -5
  90. package/packages/client/dist/private-execution/planning-generation-checkpoint.d.ts +13 -0
  91. package/packages/client/dist/private-execution/planning-generation-checkpoint.js +4 -3
  92. package/packages/client/dist/private-execution/planning-memory-checkpoint.d.ts +32 -0
  93. package/packages/client/dist/private-execution/planning-memory-checkpoint.js +3 -0
  94. package/packages/client/dist/private-execution/planning-research-checkpoint.js +4 -4
  95. package/packages/client/dist/private-execution/root-checkpoint.js +1 -1
  96. package/packages/client/dist/private-execution/root-memory-git-evidence.d.ts +30 -0
  97. package/packages/client/dist/private-execution/root-memory-git-evidence.js +3 -0
  98. package/packages/client/dist/private-execution/root-memory-recovery.d.ts +16 -0
  99. package/packages/client/dist/private-execution/root-memory-recovery.js +1 -0
  100. package/packages/client/dist/private-execution/root-memory-request.d.ts +28 -0
  101. package/packages/client/dist/private-execution/root-memory-request.js +1 -0
  102. package/packages/client/dist/private-execution/root-memory-scope.d.ts +28 -0
  103. package/packages/client/dist/private-execution/root-memory-scope.js +1 -0
  104. package/packages/client/dist/private-execution/root-memory-writer.d.ts +22 -0
  105. package/packages/client/dist/private-execution/root-memory-writer.js +1 -0
  106. package/packages/client/dist/private-execution/session-lease.d.ts +19 -0
  107. package/packages/client/dist/private-execution/session-lease.js +1 -0
  108. package/packages/client/dist/private-execution/shared-private-admission-types.d.ts +34 -0
  109. package/packages/client/dist/private-execution/shared-private-admission-types.js +1 -0
  110. package/packages/client/dist/private-execution/shared-project-validation.d.ts +17 -0
  111. package/packages/client/dist/private-execution/shared-project-validation.js +1 -0
  112. package/packages/client/dist/private-execution/shared-root-memory-types.d.ts +37 -0
  113. package/packages/client/dist/private-execution/shared-root-memory-types.js +1 -0
  114. package/packages/client/dist/runner/binary.d.ts +1 -1
  115. package/packages/client/dist/runner/binary.js +1 -1
  116. package/packages/client/dist/runner/headless/opencode-adapter.js +2 -2
  117. package/packages/client/dist/yolo/change-evidence-collector.d.ts +2 -2
  118. package/packages/client/dist/yolo/change-evidence-collector.js +1 -1
  119. package/packages/client/dist/yolo/spec-envelope-collector.js +2 -2
  120. package/packages/shared/dist/planning/diagnosis-state.js +5 -2
  121. package/packages/shared/dist/project-memory-targets.js +243 -0
  122. package/packages/shared/dist/yolo/change-evidence.js +35 -0
  123. package/packages/shared/dist/yoloop/branch-unit.js +10 -1
  124. package/packages/shared/dist/yoloop/root-memory-effect.js +57 -0
  125. package/targets-stubs/antigravity/gemini.md +1 -1
  126. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  127. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  128. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  129. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  130. package/targets-stubs/claude-code/neocortex.md +2 -2
  131. package/targets-stubs/codex/AGENTS.md +1 -1
  132. package/targets-stubs/cursor/agent.md +2 -2
  133. package/targets-stubs/deepseek-harness/SKILL.md +64 -0
  134. package/targets-stubs/gemini-cli/agent.md +2 -2
  135. package/targets-stubs/opencode/neocortex-root.md +1 -1
  136. package/targets-stubs/vscode/neocortex.agent.md +2 -2
@@ -1,9 +1,10 @@
1
- import{execFile as pi,execFileSync as F}from"node:child_process";import{createHash as b,randomBytes as De}from"node:crypto";import{lstat as Re,open as mi,readFile as W,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 wi,resolve as v}from"node:path";import{promisify as bi}from"node:util";import{publicWriteSet as vi}from"../../../shared/dist/yoloop/public-story-write-set.js";import{resolveBranchUnit as Si}from"../../../shared/dist/yoloop/branch-unit.js";import{anchoredAtomicWriteFile as Di,anchoredCreateOwnedDirectory as je,anchoredEnsureDirectory as Ge,anchoredExecuteGit as Ri,anchoredExecuteNode as Te,anchoredRemoveDirectory as _i,anchoredRenameDirectory as re}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as xi,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as Ei,GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID as xe}from"./git-lifecycle-step-ids.js";const V=bi(pi),le="neocortex-yoloop",he="runtime.json",q="node scripts/test-root.mjs --gate complete",Fe=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),Ii=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"})}),Ee="neocortex-yoloop-runtime.json",Ai="runtime.lock",We=new WeakMap;async function At(i,e){return(await ki(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 ki(i,e){const t=[...new Set(e.graphRevisions)];if(!D(e.headSha)||t.length===0||t.some(E=>!p(E)))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 E=>r?(await Ri(r.parent,r.name,r.identity,E)).toString("utf8"):String((await V("git",[...E],{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 W(S(i,"config","release-gates.v2.json"),"utf8"),runner:await W(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:s,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(s!==c||u!==d)throw new Error("p205-transient-producer-dirty");const l=JSON.parse(s),g=Array.isArray(l.requiredCompleteClasses)?l.requiredCompleteClasses.filter(E=>typeof E=="string"&&/^[a-z0-9-]+$/.test(E)):[];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!==s||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=b("sha256").update(s).digest("hex"),y=b("sha256").update(m).digest("hex"),w=se(e.nowIso??new Date().toISOString()),T=new Map,Z=Object.freeze(g);for(const E of t){const U=b("sha256").update(["p205-transient-execution-v1",q,e.headSha,E,G,g.join(","),y,w].join("\0")).digest("hex"),ge=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:q,executionHeadSha:e.headSha,graphRevision:E,manifestDigest:G,gateIds:Z,resultDigest:y,executedAt:w,executionEvidenceDigest:U}),ye=Object.freeze(Object.create(null));We.set(ye,ge),T.set(E,ye)}return T}async function Ie(i,e={}){const t=await Fi(i);return ni(t,e)}function Ci(i,e={}){let t;try{const r=F("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),o=_e(a);if(o!==a)throw new Error("git-lifecycle-common-dir-symlink");Qi(o);const s=S(o,le),u=S(s,he);if(H(s)&&(ai(s,"directory"),_e(s)!==s))throw new Error("git-lifecycle-runtime-directory-symlink");t=H(u)?u:S(o,Ee)}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 kt(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 Me(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 Ct(i,e,t=new Date().toISOString()){if(!lt(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=S(v(i),".neocortex","state.json"),n=await W(r,"utf8"),a=f(JSON.parse(n));if(!a)throw new Error("git-lifecycle-tracked-state-invalid");const o=await Ie(i),s=Pi(a,o),u=f(f(s.epics)?.[e.epicId]),c=f(f(s.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(s.stories)??{}).filter(y=>{const w=f(f(s.stories)?.[y]);return String(w?.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 w=f(f(s.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(T=>typeof T=="string"):[],checkpoint:f(w.checkpoint)}}),g=Si({...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(o.epics[e.epicId])?.origin_branch=="string"?String(f(o.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(o.epics[e.epicId])?.graph_revision=="string"?String(f(o.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:o.revision,graphRevision:e.graphRevision};const k=Date.parse(t);if(!Number.isFinite(k))throw new Error("git-lifecycle-graph-authority-time-invalid");const x=f(u.branch_lease);if(x&&Number.isFinite(Date.parse(String(x.expiresAt)))&&Date.parse(String(x.expiresAt))>k&&!Me(x,e.storyId,k))throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await Ke(i,y=>{const w=$i(y,e.epicId);if(w.branch_mode!==void 0&&w.branch_mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-raced");const T=w.execution_branch;if(T!==void 0&&T!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const Z=w.origin_branch;if(Z!==void 0&&Z!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-raced");const E=w.graph_revision;if(E!==void 0&&E!==m)throw new Error("git-lifecycle-graph-authority-epoch-raced");const U=f(w.branch_lease);if(U&&Number.isFinite(Date.parse(String(U.expiresAt)))&&Date.parse(String(U.expiresAt))>k&&!Me(U,e.storyId,k))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:o.revision,preCommit:async()=>{if(await W(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,Ai),o=await pt(a);try{const s=S(n,he),u=S(r,Ee),c=await ni(H(s)?s: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 Yi(s),await Di(n,he,`${JSON.stringify(g,null,2)}
2
- `),await j(s,"file"),await Oi(n),{document:g,value:l}}finally{await mt(a,o).catch(()=>{})}}async function Oi(i){let e;try{e=await mi(i,"r")}catch(t){if(process.platform==="win32"&&(P(t,"EPERM")||P(t,"EISDIR")||P(t,"EINVAL")))return;throw t}try{await e.sync()}finally{await e.close()}}function Pi(i,e){const t=structuredClone(i),r=Ye(t,"epics"),n=Ye(t,"stories");for(const[a,o]of Object.entries(e.epics))r[a]={...f(r[a])??{},...structuredClone(o)};for(const[a,o]of Object.entries(e.stories)){const s=f(n[a])??{},u=s.steps_completed,c=o.steps_completed;o.status==="branch-ready"&&o.last_step===xe&&Array.isArray(c)&&c.length===1&&c[0]===xe&&o.checkpoint===void 0&&Array.isArray(u)&&u.includes(xe)||(n[a]={...s,...structuredClone(o)})}return t}function Ye(i,e){const t=i[e];if(t===void 0){const a={};return i[e]=a,a}const r=f(t);if(r)return r;if(!Array.isArray(t))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of t){const o=f(a),s=typeof o?.id=="string"?o.id.trim():"";if(!s||n[s]!==void 0)throw new Error(`git-lifecycle-tracked-${e}-ambiguous`);n[s]=o}return i[e]=n,n}function $i(i,e){return i.epics[e]??(i.epics[e]={})}function Ot(i,e){return i.stories[e]??(i.stories[e]={})}function Je(i,e,t,r){const n=f(i);return!!(n&&n.epicId===t&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&ci(n,e))}async function Pt(i,e,t,r,n,a,o=[]){return Qe(i,e,t,r,n,a,o).verdict==="verified"}function Qe(i,e,t,r,n,a,o=[],s=new Date().toISOString(),u=a===void 0?"scheduling":"integration"){const c=()=>Xe({storyId:t,epicId:r,executionBranch:n,value:e,verifiedAt:s,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!Je(e,t,r,n))return c();const d=f(e),l=f(d.qaReceipt),g=f(d.reviewReceipt),h=String(d.headSha),m=String(d.baseSha),R=Ae(i,t,h,g.reviewArtifactDigest===void 0),k=g.reviewArtifactDigest===void 0&&!Ti(i,t,h);if(g.reviewArtifactDigest!==void 0&&g.reviewArtifactDigest!==R?.digest)return c();const x=$(i,["rev-parse",`refs/heads/${n}`]).trim();if(F("git",["merge-base","--is-ancestor",h,x],{cwd:i,stdio:"ignore"}),!k&&R?.verdict!=="approved"){if(g.reviewArtifactDigest!==void 0||!Gi(i,d,g,l,t,r,x))return c()}else if(d.reviewReconciliation!==void 0)return c();const y=$(i,["show","--no-patch","--format=%H%n%P%n%B",h]),w=$(i,["rev-parse",`${h}^`]).trim(),T=$(i,["rev-list","--count",`${m}..${h}`]).trim();if(w!==m||T!=="1")return c();const Z=new Set(y.split(`
3
- `).map(B=>B.trim())),E=y.split(`
4
- `).map(B=>B.trim()).filter(B=>B.startsWith("Neocortex-Review-Artifact-Digest: "));if(E.length>0&&(E.length!==1||E[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(B=>Z.has(B));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();F("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(B=>!fe(B)))return c();const we=b("sha256").update(y).digest("hex"),be=b("sha256").update([...ie].sort().join("\0")).digest("hex"),L=Ze({checkpoint:d,storyId:t,epicId:r,executionBranch:n,baseSha:m,headSha:h,commitBodyDigest:we,changedPathsDigest:be,changedPaths:ie,authorizedWriteSet:o.length>0?o:Vi(i,t)});if(!L||l.receiptRef!==`story-qa:${String(l.sourceEvidenceDigest)}`)return c();const Ne=zi({storyId:t,baseSha:m,headSha:h,bundleDigest:String(d.bundleDigest),graphRevision:String(d.graphRevision),commitBody:y,changedPaths:ie}),Be=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===Hi({gitEvidenceDigest:Ne,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===Ne,gi=l.evidenceVersion===void 0&&L.mode==="legacy-migration"&&L.binding?.qaDigest===l.sourceEvidenceDigest,ve=Ni(a,x,String(d.graphRevision))&&(Be||L.mode==="legacy-migration"&&(ui||gi)),Se=u==="scheduling"&&a===void 0&&Be;if(!ve&&!Se)return c();const Ve=g.reviewArtifactDigest!==void 0,Le=b("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),b("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&&(Fe[t]!==h||!Array.isArray(d.receiptRefs)||!d.receiptRefs.some(B=>typeof B=="string"&&B.startsWith("legacy-direct-yolo:"))))return c();const li=b("sha256").update(["checkpoint-p205-transient-v1",t,r,n,m,h,String(d.bundleDigest),we,be,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:we,changedPathsDigest:be,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??se(s),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 $t(i,e,t,r,n,a,o=[],s=new Date().toISOString()){const u=a?"integration":"scheduling",c=Qe(i,e,t,r,n,a,o,s,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:s,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"})}}function Ni(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"?We.get(i):void 0}function Nt(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 Bt(i,e,t){const r=ce(i);return!!(r&&r.executionHeadSha===e&&r.graphRevision===t&&r.command===q)}function Ze(i){const e=Ii[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=Bi(i.authorizedWriteSet),a=n.length>0&&n.length===i.authorizedWriteSet.length&&i.changedPaths.every(o=>n.some(s=>qi(s,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&&(!a||!Ue(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(t!==void 0&&!(!t||!p(t))&&!(!a||!Ue(t,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:t})}function Bi(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 Vi(i,e){try{const t=JSON.parse(He(S(i,".neocortex","state.json"),"utf8")),r=f(t.stories),n=f(r?.[e]),a=Ci(i),o=f(a.stories[e]?.checkpoint)??f(n?.checkpoint);return Li(e,n,o)}catch{return[]}}function Li(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===b("sha256").update(e.join("\0")).digest("hex")||i===b("sha256").update(JSON.stringify(e)).digest("hex")}function qi(i,e){return i===e||i.endsWith("/")&&e.startsWith(i)}function Vt(i,e,t,r,n,a){try{if(!Je(e,t,r,n))return!1;const o=f(e),s=f(o.qaReceipt),u=f(o.reviewReceipt),c=String(o.headSha),d=String(o.baseSha),l=$(i,["rev-parse",`refs/heads/${n}`]).trim();if(F("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({checkpoint:o,storyId:t,epicId:r,executionBranch:n,baseSha:d,headSha:c,changedPaths:h,authorizedWriteSet:a,commitBodyDigest:b("sha256").update(g).digest("hex"),changedPathsDigest:b("sha256").update([...h].sort().join("\0")).digest("hex")});return!(m?.mode!=="legacy-migration"||!m.binding||s.sourceEvidenceDigest!==m.binding.qaDigest||s.receiptRef!==`story-qa:${m.binding.qaDigest}`||u.sourceEvidenceDigest!==m.binding.reviewDigest||u.receiptRef!==`story-review:${m.binding.reviewDigest}`||u.qaReceiptRef!==s.receiptRef)}catch{return!1}}function zi(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 Hi(i){return b("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:se(i.verifiedAt),verdict:i.verdict,reasonCodes:Object.freeze([i.reasonCode]),publicSafe:!0})}function $(i,e){return F("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=F("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 o;try{o=new TextDecoder("utf-8",{fatal:!0}).decode(a)}catch{return}const s=o.replace(/\r\n/g,`
1
+ import{execFile as pi,execFileSync as F}from"node:child_process";import{createHash as b,randomBytes as Re}from"node:crypto";import{lstat as _e,open as mi,readFile as M,realpath as X,stat as yi}from"node:fs/promises";import{existsSync as H,lstatSync as ze,readFileSync as He,realpathSync as xe}from"node:fs";import{basename as C,dirname as W,isAbsolute as oe,join as S,relative as wi,resolve as v}from"node:path";import{promisify as bi}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,anchoredCompareAndSwapFile as xi,anchoredCreateOwnedDirectory as je,anchoredEnsureDirectory as Ge,anchoredExecuteGit as Ei,anchoredExecuteNode as Te,anchoredRemoveDirectory as Ii,anchoredRenameDirectory as ne}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as Ai,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as ki,GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID as Ee}from"./git-lifecycle-step-ids.js";const V=bi(pi),he="neocortex-yoloop",pe="runtime.json",q="node scripts/test-root.mjs --gate complete",Fe=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),Ci=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",Oi="runtime.lock",Me=new WeakMap;async function $t(i,e){return(await Pi(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 Pi(i,e){const t=[...new Set(e.graphRevisions)];if(!D(e.headSha)||t.length===0||t.some(E=>!p(E)))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 E=>r?(await Ei(r.parent,r.name,r.identity,E)).toString("utf8"):String((await V("git",[...E],{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 M(S(i,"config","release-gates.v2.json"),"utf8"),runner:await M(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:c,runner:u}=await a(),[o,d]=await Promise.all([n(["show",`${e.headSha}:config/release-gates.v2.json`]),n(["show",`${e.headSha}:scripts/test-root.mjs`])]);if(c!==o||u!==d)throw new Error("p205-transient-producer-dirty");const l=JSON.parse(c),g=Array.isArray(l.requiredCompleteClasses)?l.requiredCompleteClasses.filter(E=>typeof E=="string"&&/^[a-z0-9-]+$/.test(E)):[];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:_,runner:k}=await a();if(_!==c||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=b("sha256").update(c).digest("hex"),y=b("sha256").update(m).digest("hex"),w=ae(e.nowIso??new Date().toISOString()),T=new Map,Z=Object.freeze(g);for(const E of t){const U=b("sha256").update(["p205-transient-execution-v1",q,e.headSha,E,G,g.join(","),y,w].join("\0")).digest("hex"),le=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:q,executionHeadSha:e.headSha,graphRevision:E,manifestDigest:G,gateIds:Z,resultDigest:y,executedAt:w,executionEvidenceDigest:U}),we=Object.freeze(Object.create(null));Me.set(we,le),T.set(E,we)}return T}async function Ae(i,e={}){const t=await Ki(i);return ni(t,e)}function $i(i,e={}){let t;try{const r=F("git",["rev-parse","--git-common-dir"],{cwd:i,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=xe(i),a=oe(r)?v(r):v(n,r),s=xe(a);if(s!==a)throw new Error("git-lifecycle-common-dir-symlink");Xi(s);const c=S(s,he),u=S(c,pe);if(H(c)&&(ai(c,"directory"),xe(c)!==c))throw new Error("git-lifecycle-runtime-directory-symlink");t=H(u)?u:S(s,Ie)}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 Bt(i){try{await Ae(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 Ae(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 Nt(i,e,t=new Date().toISOString()){if(!mt(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=S(v(i),".neocortex","state.json"),n=await M(r,"utf8"),a=f(JSON.parse(n));if(!a)throw new Error("git-lifecycle-tracked-state-invalid");const s=await Ae(i),c=Ni(a,s),u=f(f(c.epics)?.[e.epicId]),o=f(f(c.stories)?.[e.storyId]);if(!u)throw new Error("git-lifecycle-graph-authority-epic-invalid");if(!o||String(o.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(c.stories)??{}).filter(y=>{const w=f(f(c.stories)?.[y]);return String(w?.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 w=f(f(c.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(T=>typeof T=="string"):[],checkpoint:f(w.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,_=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&&_===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 x=f(u.branch_lease);if(x&&Number.isFinite(Date.parse(String(x.expiresAt)))&&Date.parse(String(x.expiresAt))>k&&!We(x,e.storyId,k))throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await Ke(i,y=>{const w=Vi(y,e.epicId);if(w.branch_mode!==void 0&&w.branch_mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-raced");const T=w.execution_branch;if(T!==void 0&&T!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const Z=w.origin_branch;if(Z!==void 0&&Z!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-raced");const E=w.graph_revision;if(E!==void 0&&E!==m)throw new Error("git-lifecycle-graph-authority-epoch-raced");const U=f(w.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");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 M(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,Oi),s=await wt(a);try{const c=S(n,pe),u=S(r,Ie),o=await ni(H(c)?c:u);if(t.expectedRevision!==void 0&&t.expectedRevision!==o.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const d=structuredClone(o),l=e(d),g=Oe({...d,schemaVersion:1,revision:o.revision+1});return await t.preCommit?.(g),await j(n,"directory"),await Zi(c),await _i(n,pe,`${JSON.stringify(g,null,2)}
2
+ `),await j(c,"file"),await Bi(n),{document:g,value:l}}finally{await bt(a,s).catch(()=>{})}}async function Bi(i){let e;try{e=await mi(i,"r")}catch(t){if(process.platform==="win32"&&($(t,"EPERM")||$(t,"EISDIR")||$(t,"EINVAL")))return;throw t}try{await e.sync()}finally{await e.close()}}function Ni(i,e){const t=structuredClone(i),r=Ye(t,"epics"),n=Ye(t,"stories");for(const[a,s]of Object.entries(e.epics))r[a]={...f(r[a])??{},...structuredClone(s)};for(const[a,s]of Object.entries(e.stories)){const c=f(n[a])??{},u=c.steps_completed,o=s.steps_completed;s.status==="branch-ready"&&s.last_step===Ee&&Array.isArray(o)&&o.length===1&&o[0]===Ee&&s.checkpoint===void 0&&Array.isArray(u)&&u.includes(Ee)||(n[a]={...c,...structuredClone(s)})}return t}function Ye(i,e){const t=i[e];if(t===void 0){const a={};return i[e]=a,a}const r=f(t);if(r)return r;if(!Array.isArray(t))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of t){const s=f(a),c=typeof s?.id=="string"?s.id.trim():"";if(!c||n[c]!==void 0)throw new Error(`git-lifecycle-tracked-${e}-ambiguous`);n[c]=s}return i[e]=n,n}function Vi(i,e){return i.epics[e]??(i.epics[e]={})}function Vt(i,e){return i.stories[e]??(i.stories[e]={})}function Je(i,e,t,r){const n=f(i);return!!(n&&n.epicId===t&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&ci(n,e))}async function Lt(i,e,t,r,n,a,s=[]){return Qe(i,e,t,r,n,a,s).verdict==="verified"}function Qe(i,e,t,r,n,a,s=[],c=new Date().toISOString(),u=a===void 0?"scheduling":"integration"){const o=()=>Xe({storyId:t,epicId:r,executionBranch:n,value:e,verifiedAt:c,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!Je(e,t,r,n))return o();const d=f(e),l=f(d.qaReceipt),g=f(d.reviewReceipt),h=String(d.headSha),m=String(d.baseSha),_=ke(i,t,h,g.reviewArtifactDigest===void 0),k=g.reviewArtifactDigest===void 0&&!Wi(i,t,h);if(g.reviewArtifactDigest!==void 0&&g.reviewArtifactDigest!==_?.digest)return o();const x=B(i,["rev-parse",`refs/heads/${n}`]).trim();if(F("git",["merge-base","--is-ancestor",h,x],{cwd:i,stdio:"ignore"}),!k&&_?.verdict!=="approved"){if(g.reviewArtifactDigest!==void 0||!Mi(i,d,g,l,t,r,x))return o()}else if(d.reviewReconciliation!==void 0)return o();const y=B(i,["show","--no-patch","--format=%H%n%P%n%B",h]),w=B(i,["rev-parse",`${h}^`]).trim(),T=B(i,["rev-list","--count",`${m}..${h}`]).trim();if(w!==m||T!=="1")return o();const Z=new Set(y.split(`
3
+ `).map(N=>N.trim())),E=y.split(`
4
+ `).map(N=>N.trim()).filter(N=>N.startsWith("Neocortex-Review-Artifact-Digest: "));if(E.length>0&&(E.length!==1||E[0]!==`Neocortex-Review-Artifact-Digest: ${_?.digest}`||g.reviewArtifactDigest!==_?.digest))return o();const le=[`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(le){const qe=[...Z].find(hi=>hi.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(qe))return o();F("git",["merge-base","--is-ancestor",qe,h],{cwd:i,stdio:"ignore"})}const te=B(i,["diff-tree","--no-commit-id","--name-only","-r","-z",h]).split("\0").filter(Boolean);if(te.length===0||te.some(N=>!ue(N)))return o();const be=b("sha256").update(y).digest("hex"),ve=b("sha256").update([...te].sort().join("\0")).digest("hex"),L=Ze({projectRoot:i,checkpoint:d,storyId:t,epicId:r,executionBranch:n,baseSha:m,headSha:h,commitBodyDigest:be,changedPathsDigest:ve,changedPaths:te,authorizedWriteSet:s.length>0?s:zi(i,t)});if(!L||l.receiptRef!==`story-qa:${String(l.sourceEvidenceDigest)}`)return o();const Be=Gi({storyId:t,baseSha:m,headSha:h,bundleDigest:String(d.bundleDigest),graphRevision:String(d.graphRevision),commitBody:y,changedPaths:te}),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===Ti({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,Se=Li(a,x,String(d.graphRevision))&&(Ne||L.mode==="legacy-migration"&&(ui||gi)),De=u==="scheduling"&&a===void 0&&Ne;if(!Se&&!De)return o();const Ve=g.reviewArtifactDigest!==void 0,Le=b("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),b("sha256").update(y).digest("hex"),[...te].sort().join(","),...Ve?[_.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||!le&&(Fe[t]!==h||!Array.isArray(d.receiptRefs)||!d.receiptRefs.some(N=>typeof N=="string"&&N.startsWith("legacy-direct-yolo:"))))return o();const li=b("sha256").update(["checkpoint-p205-transient-v1",t,r,n,m,h,String(d.bundleDigest),be,ve,L.mode,L.effectiveClaimRevision,String(l.sourceEvidenceDigest),String(g.sourceEvidenceDigest),...d.reviewReconciliation?[String(f(d.reviewReconciliation)?.sourceEvidenceDigest)]:[],se(a)?.executionEvidenceDigest??(De?"scheduling-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),re=Se?se(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:re?.executionHeadSha??h,commitBodyDigest:be,changedPathsDigest:ve,claimVerification:L.mode,effectiveClaimRevision:L.effectiveClaimRevision,sourceEvidenceDigest:li,command:q,manifestDigest:re?.manifestDigest??"0".repeat(64),gateIds:re?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:re?.resultDigest??"0".repeat(64),graphRevision:String(d.graphRevision),executionEvidenceDigest:re?.executionEvidenceDigest??"0".repeat(64),verifiedAt:re?.executedAt??ae(c),verdict:"verified",reasonCodes:Object.freeze([Se?"checkpoint-p205-transient-verified":De?"checkpoint-git-scheduling-verified":"checkpoint-legacy-bounded-verified",...L.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return o()}}function qt(i,e,t,r,n,a,s=[],c=new Date().toISOString()){const u=a?"integration":"scheduling",o=Qe(i,e,t,r,n,a,s,c,u);return o.verdict!=="verified"?{kind:"rejected",verification:o}:u==="integration"?{kind:"integration-authorized",verification:o}:o.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:o.baseSha,headSha:o.headSha,graphRevision:o.graphRevision,effectiveClaimRevision:o.effectiveClaimRevision,sourceEvidenceDigest:o.sourceEvidenceDigest,verifiedAt:o.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:c,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"})}}function Li(i,e,t){const r=se(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 se(i){return i&&typeof i=="object"?Me.get(i):void 0}function zt(i){const e=se(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 Ht(i,e,t){const r=se(i);return!!(r&&r.executionHeadSha===e&&r.graphRevision===t&&r.command===q)}function Ze(i){const e=Ci[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=Di(i.projectRoot,i.checkpoint.rootMemoryEffect,{storyId:i.storyId,executionBranch:i.executionBranch,baseSha:i.baseSha,headRef:i.headSha,childPaths:n}).files.map(c=>c.path)}catch{return}}const s=n.length>0&&n.length===i.authorizedWriteSet.length&&i.changedPaths.every(c=>n.some(u=>ji(u,c))||a.includes(c));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 qi(i){const e=i.map(t=>t.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(t=>!ue(t))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function zi(i,e){try{const t=JSON.parse(He(S(i,".neocortex","state.json"),"utf8")),r=f(t.stories),n=f(r?.[e]),a=$i(i),s=f(a.stories[e]?.checkpoint)??f(n?.checkpoint);return Hi(e,n,s)}catch{return[]}}function Hi(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===b("sha256").update(e.join("\0")).digest("hex")||i===b("sha256").update(JSON.stringify(e)).digest("hex")}function ji(i,e){return i===e||i.endsWith("/")&&e.startsWith(i)}function jt(i,e,t,r,n,a){try{if(!Je(e,t,r,n))return!1;const s=f(e),c=f(s.qaReceipt),u=f(s.reviewReceipt),o=String(s.headSha),d=String(s.baseSha),l=B(i,["rev-parse",`refs/heads/${n}`]).trim();if(F("git",["merge-base","--is-ancestor",o,l],{cwd:i,stdio:"ignore"}),B(i,["rev-parse",`${o}^`]).trim()!==d||B(i,["rev-list","--count",`${d}..${o}`]).trim()!=="1")return!1;const g=B(i,["show","--no-patch","--format=%H%n%P%n%B",o]),h=B(i,["diff-tree","--no-commit-id","--name-only","-r","-z",o]).split("\0").filter(Boolean);if(h.length===0||h.some(_=>!ue(_)))return!1;const m=Ze({projectRoot:i,checkpoint:s,storyId:t,epicId:r,executionBranch:n,baseSha:d,headSha:o,changedPaths:h,authorizedWriteSet:a,commitBodyDigest:b("sha256").update(g).digest("hex"),changedPathsDigest:b("sha256").update([...h].sort().join("\0")).digest("hex")});return!(m?.mode!=="legacy-migration"||!m.binding||c.sourceEvidenceDigest!==m.binding.qaDigest||c.receiptRef!==`story-qa:${m.binding.qaDigest}`||u.sourceEvidenceDigest!==m.binding.reviewDigest||u.receiptRef!==`story-review:${m.binding.reviewDigest}`||u.qaReceiptRef!==c.receiptRef)}catch{return!1}}function Gi(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 Ti(i){return b("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:ae(i.verifiedAt),verdict:i.verdict,reasonCodes:Object.freeze([i.reasonCode]),publicSafe:!0})}function B(i,e){return F("git",[...e],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})}function ke(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=F("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 c=s.replace(/\r\n/g,`
5
5
  `).split(`
6
- `),u=new RegExp(`^#\\s+${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?=\\s|$|[:\u2014-])`);if(!s.some(g=>u.test(g)))return;const c=s.filter(g=>/^Verdict\s*:/i.test(g));if(s.some(g=>/^Status\s*:\s*(pending|changes-requested|rejected)\b/i.test(g)))return;const d=s.filter(g=>/^Decision\s*:/i.test(g));if(c.length===0&&r&&d.length===1&&/^Decision\s*:\s*APPROVED\b/i.test(d[0]))return Object.freeze({verdict:"approved",digest:b("sha256").update(a).digest("hex")});if(c.length!==1)return;const l=/^Verdict\s*:\s*(approved|pending|changes-requested)(?=\s|$|[;,.])/i.exec(c[0])?.[1]?.toLowerCase();if(!(l!=="approved"&&l!=="pending"&&l!=="changes-requested"))return Object.freeze({verdict:l,digest:b("sha256").update(a).digest("hex")})}function ji(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 Gi(i,e,t,r,n,a,o){const s=f(e.reviewReconciliation);if(!s||!si(s,e))return!1;const u=String(s.approvalCommitSha),c=String(e.headSha);if(u===c)return!1;try{if(F("git",["merge-base","--is-ancestor",c,u],{cwd:i,stdio:"ignore"}),F("git",["merge-base","--is-ancestor",u,o],{cwd:i,stdio:"ignore"}),!$(i,["rev-list","--first-parent",o]).split(`
7
- `).includes(u))return!1;const d=$(i,["show","--no-patch","--format=%P",u]).trim().split(/\s+/);if(d.length!==1||!D(d[0]))return!1;const l=$(i,["show","--no-patch","--format=%H%n%P%n%B",u]),g=new Set(l.split(`
8
- `).map(G=>G.trim()));if(!g.has(`Neocortex-Review-Reconciliation: ${n}`)||!g.has(`Neocortex-Original-Checkpoint: ${c}`)||!g.has(`Neocortex-Original-Review-Receipt: ${String(t.receiptRef)}`))return!1;const h=`.neocortex/stories/${n}/review.md`,m=$(i,["diff-tree","--no-commit-id","--name-only","-r","-z",u]).split("\0").filter(Boolean);if(!m.includes(h)||m.some(G=>!fe(G)))return!1;const R=Ae(i,n,u);if(R?.verdict!=="approved"||R.digest!==s.approvalArtifactDigest)return!1;const k=Ae(i,n,o);if(k?.verdict!=="approved"||k.digest!==R.digest)return!1;const x=ji({storyId:n,epicId:a,checkpointHeadSha:c,approvalCommitSha:u,approvalArtifactDigest:R.digest,qaReceiptRef:String(r.receiptRef),reviewReceiptRef:String(t.receiptRef),approvalCommitBody:l});return s.sourceEvidenceDigest===x&&s.receiptRef===`story-review-reconciliation:${x}`}catch{return!1}}function Ti(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 F("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 Lt(i,e){if(Fe[e.storyId]!==e.headSha)return;const t=[".neocortex/state.json",`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,`.neocortex/stories/${e.storyId}/review.md`,`docs/stories/${e.storyId}.story.md`];try{const r=(await V("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:i,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await V("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:i}),(await V("git",["rev-parse",`${e.headSha}^`],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await V("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(b("sha256").update(a).digest("hex")!==e.bundleDigest)return;const o=String((await V("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await V("git",["show","--no-patch","--format=%s",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const c=String((await V("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!t.every(y=>c.includes(y))||c.some(y=>!fe(y)))return;const d=await Promise.all(t.map(async y=>String((await V("git",["show",`${e.headSha}:${y}`],{cwd:i,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),l=JSON.parse(d[0]),g=f(l.stories),h=f(l.epics),m=f(g?.[e.storyId]),R=f(h?.[e.epicId]),k=Array.isArray(m?.steps_completed)?m.steps_completed:[],x=JSON.parse(d[1]);return m?.status!=="done"||!k.includes(xi)||!k.includes(Ei)||R?.branch_mode!=="epic"||R.execution_branch!==e.executionBranch||x.storyId!==e.storyId||x.status!=="qa-passed"||x.safeToContinueYoloop!==!0||!Array.isArray(x.blockingChecks)||x.blockingChecks.length!==0||!d[2].includes(e.storyId)||!/P205[\s\S]{0,80}(pass|aprov)/i.test(d[2])||!d[3].includes(e.storyId)||!/approved|aprovado/i.test(d[3])||!d[4].includes(e.storyId)?void 0:`legacy-direct-yolo:${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(o).digest("hex"),b("sha256").update([...c].sort().join("\0")).digest("hex"),...d.map(y=>b("sha256").update(y).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function Fi(i){const e=await Ce(i),t=S(e,le),r=S(t,he);if(H(t)&&(await j(t,"directory"),await X(t)!==t))throw new Error("git-lifecycle-runtime-directory-symlink");return H(r)?r:S(e,Ee)}async function ei(i){return ri(await Ce(i))}async function Wi(i,e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)||e.includes(".."))throw new Error("git-lifecycle-private-child-invalid");const t=v(i);await Y(t);const r=v(t,e);return ne(t,r),H(r)||await Ge(t,e),await Y(r,t),await Y(t),r}async function _(i,e){const t=v(e),r=v(i);ne(t,r),await Y(t),await Y(r,t)}async function qt(i,e){await J(i,e)}async function ee(i,e,t){const r=v(e),n=v(i);ne(r,n);try{await _(n,r)}catch(o){if(P(o,"ENOENT"))return!1;throw o}const a=v(r,`${n.slice(r.length+1)}.remove.${process.pid}.${Date.now()}.${De(4).toString("hex")}`);return ne(r,a),await re(r,C(n),C(a)),await _(a,r),t&&!await t(a)?(await oe(a,n,r).catch(()=>{}),!1):(await _i(r,C(a)),!0)}async function oe(i,e,t){await _(i,t);try{await Re(e);return}catch(r){if(!P(r,"ENOENT"))throw r}await re(t,C(i),C(e)),await _(e,t)}async function N(i){try{await _(i,K(i));const e=S(i,"owner.json");await J(e,i);const t=await W(e);return await J(e,i),b("sha256").update(t).digest("hex")}catch{return}}async function zt(i,e){const t=await ei(i),r=await Wi(t,"leases"),n=S(r,"integration"),a=`${n}.recovery`;if(H(a)){await _(a,r);const c=await ii(a),d=await N(a);if(c===void 0||me(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!d||!await ee(a,r,async l=>await N(l)===d))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const o=se(e.createdAt??new Date().toISOString()),s=Object.freeze({schemaVersion:1,kind:e.kind,storyId:e.storyId,sessionId:e.sessionId,idempotencyKey:e.idempotencyKey,pid:process.pid,createdAt:o,expiresAt:se(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??De(16).toString("hex")});if(Date.parse(s.expiresAt)<=Date.parse(s.createdAt))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const u=async()=>{await Y(r,t);try{return await je(r,C(n),`${JSON.stringify(s)}
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:s,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,s))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 N(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 N(h)!==g)return await oe(h,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await u()}finally{await ee(h,r,async m=>await N(m)===g).catch(()=>{})}return{ok:!0,owner:s,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 Ht(i,e){const t=await de(i);return!!(t&&ke(t,e)&&Date.parse(t.expiresAt)>Date.now())}async function Mi(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 N(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await re(t,C(i),C(a)),await _(a,t);const o=await de(a);return!o||!ke(o,e)||await N(a)!==n?(await oe(a,i,t).catch(()=>{}),!1):ee(a,t,async s=>await N(s)===n)}catch(t){if(P(t,"ENOENT"))return!1;throw t}}function Ki(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 jt(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||Ki(a)!==e.ownerDigest?"foreign":await Mi(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 W(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 W(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 Ji(a);const s=(await V("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((ae(s)?v(s):v(e,s))!==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 W(i,"utf8")))}catch(t){if(P(t,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Pe()}throw t}}async function Yi(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=wi(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 Ji(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 Qi(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)||!Xi(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!Q(n)||!n.includes(".")||!et(a,n))throw new Error("git-lifecycle-runtime-story-invalid");return e}const Zi=["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"],Ui=["checkpoint","status","last_step","steps_completed"];function Xi(i){return I(i,Zi,"git-lifecycle-runtime-epic-unknown-field"),(i.branch_mode===void 0||i.branch_mode==="epic")&&(i.execution_branch===void 0||M(i.execution_branch))&&(i.origin_branch===void 0||M(i.origin_branch))&&(i.branch_lease===void 0||i.branch_lease===null||it(i.branch_lease))&&(i.origin_binding===void 0||i.origin_binding===null||nt(i.origin_binding))&&(i.graph_revision===void 0||p(i.graph_revision))&&(i.aggregate_qa_receipt===void 0||i.aggregate_qa_receipt===null||at(i.aggregate_qa_receipt))&&(i.terminal_git_receipt===void 0||i.terminal_git_receipt===null||ct(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||ut(i.git_reconciliation_receipts))&&(i.git_reconciliation_debt===void 0||gt(i.git_reconciliation_debt))}function et(i,e){return I(i,Ui,"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 it(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||tt(e.handoffGrant,e))&&(e.handoffConsumption===void 0||rt(e.handoffConsumption,e))):!1}function tt(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 rt(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 nt(i){const e=f(i);return e?(I(e,["schemaVersion","originBranch","originHeadSha","executionBranch","capturedFromCurrentCheckout","capturedAt"],"git-lifecycle-runtime-origin-unknown-field"),e.schemaVersion===1&&M(e.originBranch)&&M(e.executionBranch)&&e.originBranch!==e.executionBranch&&D(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&A(e.capturedAt)):!1}function at(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 ct(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)&&M(e.executionBranch)&&M(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||ot(e.candidateQa,e))&&(e.providerGuard===void 0||st(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 st(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 ot(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"],"git-lifecycle-runtime-checkpoint-unknown-field");const r=String(e).split(".")[0];return t.schemaVersion===1&&t.storyId===e&&t.epicId===r&&M(t.branch)&&D(t.baseSha)&&D(t.headSha)&&t.baseSha!==t.headSha&&ht(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))&&z(t.receiptRefs,256,!0)&&(t.qaVerdict==="passed"||t.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(t.reviewVerdict))&&dt(t.qaReceipt,t)&&(t.reviewVerdict==="pending"?t.reviewReceipt===void 0:ft(t.reviewReceipt,t))&&(t.reviewReconciliation===void 0||si(t.reviewReconciliation,t))&&A(t.recordedAt)}function si(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 dt(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))&&oi(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 ft(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"&&oi(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 oi(i,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(t=>i[t]===e[t])}function ut(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 gt(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 lt(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)}.`)&&M(e.executionBranch)&&M(e.originBranch)&&e.originBranch!==e.executionBranch&&typeof e.graphRevision=="string"&&/^[a-f0-9]{64}$/.test(e.graphRevision)&&e.publicSafe===!0:!1}function M(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 ht(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 pt(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 o=await N(i);if(!o)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const s=`${i}.stale.${process.pid}.${Date.now()}`;await re(e,C(i),C(s));try{if(await _(s,e),await N(s)!==o)throw await oe(s,i,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await ee(s,e,async u=>await N(u)===o).catch(()=>{})}}return t}async function mt(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 N(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await re(t,C(i),C(a)),await _(a,t);const o=await $e(a);return!o||!fi(o,e)||await N(a)!==n?(await oe(a,i,t).catch(()=>{}),!1):ee(a,t,async s=>await N(s)===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 W(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,Fe as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,Ii as LEGACY_P174_CHECKPOINT_MIGRATIONS,q as P205_COMPLETE_COMMAND,zt as acquireGitLifecyclePhysicalIntegrationLock,Pi as applyGitLifecycleRuntimeOverlay,_ as assertGitLifecyclePrivateDirectory,qt as assertGitLifecyclePrivateFile,$t as classifyGitLifecycleStoryCheckpointProjectionSync,Ki as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,ji as computeHistoricalReviewReconciliationDigest,zi as computeImmutableStoryQaEvidenceDigest,Lt as computeLegacyDirectYoloRecoveryReceiptRef,Hi as computeP205StoryQaEvidenceDigest,Wi as ensureGitLifecyclePrivateChildDirectory,kt as ensureGitLifecycleRuntimeInitialized,$i as ensureRuntimeEpic,Ot as ensureRuntimeStory,ki as executeP205TransientAuthorities,At as executeP205TransientAuthority,ei as gitLifecycleRuntimeDirectory,Li as gitLifecycleStoryWriteSet,Je as isAcceptedGitLifecycleStoryCheckpoint,Ke as mutateGitLifecycleRuntime,Bt as p205TransientAuthorityMatchesAggregate,Ct as persistGitLifecycleGraphAuthority,pe as posixSecurityAvailable,Nt as projectP205TransientExecutionEvidence,Ae as publicStoryReviewArtifactFromGit,Ie as readGitLifecycleRuntime,Ci as readGitLifecycleRuntimeSync,Mi as releaseGitLifecyclePhysicalIntegrationLock,jt as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,ee as removeGitLifecyclePrivateDirectory,Pt as verifyAcceptedGitLifecycleStoryCheckpoint,Qe as verifyAcceptedGitLifecycleStoryCheckpointSync,Ht as verifyGitLifecyclePhysicalIntegrationLock,Vt as verifyLegacyCheckpointMigrationCandidateSync};
6
+ `),u=new RegExp(`^#\\s+${e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?=\\s|$|[:\u2014-])`);if(!c.some(g=>u.test(g)))return;const o=c.filter(g=>/^Verdict\s*:/i.test(g));if(c.some(g=>/^Status\s*:\s*(pending|changes-requested|rejected)\b/i.test(g)))return;const d=c.filter(g=>/^Decision\s*:/i.test(g));if(o.length===0&&r&&d.length===1&&/^Decision\s*:\s*APPROVED\b/i.test(d[0]))return Object.freeze({verdict:"approved",digest:b("sha256").update(a).digest("hex")});if(o.length!==1)return;const l=/^Verdict\s*:\s*(approved|pending|changes-requested)(?=\s|$|[;,.])/i.exec(o[0])?.[1]?.toLowerCase();if(!(l!=="approved"&&l!=="pending"&&l!=="changes-requested"))return Object.freeze({verdict:l,digest:b("sha256").update(a).digest("hex")})}function Fi(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 Mi(i,e,t,r,n,a,s){const c=f(e.reviewReconciliation);if(!c||!oi(c,e))return!1;const u=String(c.approvalCommitSha),o=String(e.headSha);if(u===o)return!1;try{if(F("git",["merge-base","--is-ancestor",o,u],{cwd:i,stdio:"ignore"}),F("git",["merge-base","--is-ancestor",u,s],{cwd:i,stdio:"ignore"}),!B(i,["rev-list","--first-parent",s]).split(`
7
+ `).includes(u))return!1;const d=B(i,["show","--no-patch","--format=%P",u]).trim().split(/\s+/);if(d.length!==1||!D(d[0]))return!1;const l=B(i,["show","--no-patch","--format=%H%n%P%n%B",u]),g=new Set(l.split(`
8
+ `).map(G=>G.trim()));if(!g.has(`Neocortex-Review-Reconciliation: ${n}`)||!g.has(`Neocortex-Original-Checkpoint: ${o}`)||!g.has(`Neocortex-Original-Review-Receipt: ${String(t.receiptRef)}`))return!1;const h=`.neocortex/stories/${n}/review.md`,m=B(i,["diff-tree","--no-commit-id","--name-only","-r","-z",u]).split("\0").filter(Boolean);if(!m.includes(h)||m.some(G=>!ue(G)))return!1;const _=ke(i,n,u);if(_?.verdict!=="approved"||_.digest!==c.approvalArtifactDigest)return!1;const k=ke(i,n,s);if(k?.verdict!=="approved"||k.digest!==_.digest)return!1;const x=Fi({storyId:n,epicId:a,checkpointHeadSha:o,approvalCommitSha:u,approvalArtifactDigest:_.digest,qaReceiptRef:String(r.receiptRef),reviewReceiptRef:String(t.receiptRef),approvalCommitBody:l});return c.sourceEvidenceDigest===x&&c.receiptRef===`story-review-reconciliation:${x}`}catch{return!1}}function Wi(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 F("git",["cat-file","-e",`${t}:.neocortex/stories/${e}/review.md`],{cwd:i,stdio:"ignore",maxBuffer:1024}),!0}catch{return!1}}function ae(i){return Number.isFinite(Date.parse(i))?new Date(Date.parse(i)).toISOString():new Date().toISOString()}async function Gt(i,e){if(Fe[e.storyId]!==e.headSha)return;const t=[".neocortex/state.json",`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,`.neocortex/stories/${e.storyId}/review.md`,`docs/stories/${e.storyId}.story.md`];try{const r=(await V("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:i,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await V("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:i}),(await V("git",["rev-parse",`${e.headSha}^`],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await V("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(b("sha256").update(a).digest("hex")!==e.bundleDigest)return;const s=String((await V("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await V("git",["show","--no-patch","--format=%s",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const o=String((await V("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!t.every(y=>o.includes(y))||o.some(y=>!ue(y)))return;const d=await Promise.all(t.map(async y=>String((await V("git",["show",`${e.headSha}:${y}`],{cwd:i,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),l=JSON.parse(d[0]),g=f(l.stories),h=f(l.epics),m=f(g?.[e.storyId]),_=f(h?.[e.epicId]),k=Array.isArray(m?.steps_completed)?m.steps_completed:[],x=JSON.parse(d[1]);return m?.status!=="done"||!k.includes(Ai)||!k.includes(ki)||_?.branch_mode!=="epic"||_.execution_branch!==e.executionBranch||x.storyId!==e.storyId||x.status!=="qa-passed"||x.safeToContinueYoloop!==!0||!Array.isArray(x.blockingChecks)||x.blockingChecks.length!==0||!d[2].includes(e.storyId)||!/P205[\s\S]{0,80}(pass|aprov)/i.test(d[2])||!d[3].includes(e.storyId)||!/approved|aprovado/i.test(d[3])||!d[4].includes(e.storyId)?void 0:`legacy-direct-yolo:${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([...o].sort().join("\0")).digest("hex"),...d.map(y=>b("sha256").update(y).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function Ki(i){const e=await Ce(i),t=S(e,he),r=S(t,pe);if(H(t)&&(await j(t,"directory"),await X(t)!==t))throw new Error("git-lifecycle-runtime-directory-symlink");return H(r)?r:S(e,Ie)}async function ei(i){return ri(await Ce(i))}async function Yi(i,e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)||e.includes(".."))throw new Error("git-lifecycle-private-child-invalid");const t=v(i);await Y(t);const r=v(t,e);return ce(t,r),H(r)||await Ge(t,e),await Y(r,t),await Y(t),r}async function R(i,e){const t=v(e),r=v(i);ce(t,r),await Y(t),await Y(r,t)}async function Tt(i,e){await J(i,e)}async function ee(i,e,t){const r=v(e),n=v(i);ce(r,n);try{await R(n,r)}catch(s){if($(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 ce(r,a),await ne(r,C(n),C(a)),await R(a,r),t&&!await t(a)?(await de(a,n,r).catch(()=>{}),!1):(await Ii(r,C(a)),!0)}async function de(i,e,t){await R(i,t);try{await _e(e);return}catch(r){if(!$(r,"ENOENT"))throw r}await ne(t,C(i),C(e)),await R(e,t)}async function O(i){try{await R(i,W(i));const e=S(i,"owner.json");await J(e,i);const t=await M(e);return await J(e,i),b("sha256").update(t).digest("hex")}catch{return}}async function Ft(i,e){const t=await ei(i),r=await Yi(t,"leases"),n=S(r,"integration"),a=`${n}.recovery`;if(H(a)){await R(a,r);const o=await ii(a),d=await O(a);if(o===void 0||ye(o))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!d||!await ee(a,r,async l=>await O(l)===d))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const s=ae(e.createdAt??new Date().toISOString()),c=Object.freeze({schemaVersion:1,kind:e.kind,storyId:e.storyId,sessionId:e.sessionId,idempotencyKey:e.idempotencyKey,pid:process.pid,createdAt:s,expiresAt:ae(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??Re(16).toString("hex")});if(Date.parse(c.expiresAt)<=Date.parse(c.createdAt))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const u=async()=>{await Y(r,t);try{return await je(r,C(n),`${JSON.stringify(c)}
9
+ `),await R(n,r),await J(S(n,"owner.json"),n),!0}catch(o){throw $(o,"EEXIST")||await ee(n,r).catch(()=>{}),o}};try{return await u(),{ok:!0,owner:c,path:n}}catch(o){if(!$(o,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const o=await ie(n),d=o?void 0:await ii(n);if(o&&ti(o,c))return{ok:!0,owner:o,path:n};if(o&&Date.parse(o.expiresAt)>Date.now()&&(o.persistent||ye(o.pid))||d!==void 0&&ye(d)||!o&&d===void 0&&await di(n))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};const g=await O(n);if(!g)return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const h=`${n}.stale.${process.pid}.${Date.now()}`;await ne(r,C(n),C(h));try{if(await R(h,r),await O(h)!==g)return await de(h,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await u()}finally{await ee(h,r,async m=>await O(m)===g).catch(()=>{})}return{ok:!0,owner:c,path:n}}catch(o){return{ok:!1,reasonCode:$(o,"EEXIST")||$(o,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function Mt(i,e){const t=await ie(i);return!!(t&&fe(t,e)&&Date.parse(t.expiresAt)>Date.now())}async function Wt(i,e,t){try{const r=W(i);await R(i,r);const n=await ie(i),a=ae(t);if(!n||!fe(n,e)||Date.parse(n.expiresAt)<=Date.now()||Date.parse(a)<=Date.parse(n.expiresAt))return;const s=await O(i);if(!s)return;const c=Object.freeze({...n,expiresAt:a});await xi(i,"owner.json",`${JSON.stringify(c)}
10
+ `,s);const u=await ie(i);return u&&fe(u,c)&&Date.parse(u.expiresAt)>Date.now()?u:void 0}catch{return}}async function Ji(i,e){try{const t=W(i);await R(i,t);const r=await ie(i);if(!r||!fe(r,e))return!1;const n=await O(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await ne(t,C(i),C(a)),await R(a,t);const s=await ie(a);return!s||!fe(s,e)||await O(a)!==n?(await de(a,i,t).catch(()=>{}),!1):ee(a,t,async c=>await O(c)===n)}catch(t){if($(t,"ENOENT"))return!1;throw t}}function Qi(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 Kt(i,e){if(!Q(e.storyId)||!P(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(r,t),await R(n,r);const a=await ie(n);return!a||a.kind!=="direct"||a.storyId!==e.storyId||a.sessionId!==e.idempotencyKey||a.idempotencyKey!==e.idempotencyKey||a.persistent!==!0||Qi(a)!==e.ownerDigest?"foreign":await Ji(n,a)?"released":"foreign"}catch{return"foreign"}}async function ie(i){try{await R(i,W(i));const e=S(i,"owner.json");await J(e,i);const t=JSON.parse(await M(e,"utf8"));return t.schemaVersion!==1||t.kind!=="direct"&&t.kind!=="continuous"||!Q(t.storyId)||!P(t.sessionId)||!P(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 R(i,W(i));const e=S(i,"owner.json");await J(e,i);const t=JSON.parse(await M(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 fe(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=oe(r)?v(r):v(e,r),a=await X(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await Ui(a);const c=(await V("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((oe(c)?v(c):v(e,c))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function ri(i){const e=S(i,he);if(H(e)||await Ge(i,he),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 M(i,"utf8")))}catch(t){if($(t,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Pe()}throw t}}async function Zi(i){try{await j(i,"file")}catch(e){if($(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(me()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(me()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function ce(i,e){const t=v(i),r=v(e),n=wi(t,r);if(!n||n.startsWith("..")||oe(n)||W(r)!==t)throw new Error("git-lifecycle-private-path-escape")}async function Y(i,e){const t=v(i);if(e&&ce(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(ce(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(me()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(me()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function Ui(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 Xi(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 me(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)||!tt(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!Q(n)||!n.includes(".")||!rt(a,n))throw new Error("git-lifecycle-runtime-story-invalid");return e}const et=["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"],it=["checkpoint","status","last_step","steps_completed"];function tt(i){return I(i,et,"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||nt(i.branch_lease))&&(i.origin_binding===void 0||i.origin_binding===null||ot(i.origin_binding))&&(i.graph_revision===void 0||p(i.graph_revision))&&(i.aggregate_qa_receipt===void 0||i.aggregate_qa_receipt===null||st(i.aggregate_qa_receipt))&&(i.terminal_git_receipt===void 0||i.terminal_git_receipt===null||dt(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||ht(i.git_reconciliation_receipts))&&(i.git_reconciliation_debt===void 0||pt(i.git_reconciliation_debt))}function rt(i,e){return I(i,it,"git-lifecycle-runtime-story-unknown-field"),(i.checkpoint===void 0||i.checkpoint===null||ci(i.checkpoint,e))&&(i.status===void 0||P(i.status))&&(i.last_step===void 0||i.last_step===null||P(i.last_step))&&(i.steps_completed===void 0||z(i.steps_completed,128))}function nt(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)&&P(e.sessionId)&&P(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||at(e.handoffGrant,e))&&(e.handoffConsumption===void 0||ct(e.handoffConsumption,e))):!1}function at(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 ct(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&&P(t.fromSessionId)&&p(t.tokenDigest)&&p(t.bundleDigest)&&p(t.claimRevision)&&t.consumedBySessionId===e.sessionId&&A(t.consumedAt)):!1}function ot(i){const e=f(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&&D(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&A(e.capturedAt)):!1}function st(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)&&ge(e.receiptRef)&&z(e.gateIds,128,!0)}function dt(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)&&K(e.executionBranch)&&K(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||ut(e.candidateQa,e))&&(e.providerGuard===void 0||ft(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)&&P(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 ft(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 ut(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)&&ge(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&&K(t.branch)&&D(t.baseSha)&&D(t.headSha)&&t.baseSha!==t.headSha&&yt(t.commits)&&t.commits.length===1&&t.commits[0]===t.headSha&&P(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))&&gt(t.qaReceipt,t)&&(t.reviewVerdict==="pending"?t.reviewReceipt===void 0:lt(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))&&ge(t.receiptRef)&&Array.isArray(e.receiptRefs)&&e.receiptRefs.includes(t.receiptRef))}function gt(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)&&ge(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef)):!1}function lt(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))&&ge(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 ht(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&&P(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))&&P(t.idempotencyKey)&&z(t.reasonCodes,128)&&A(t.recordedAt)&&t.publicSafe===!0):!1})}function pt(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&&P(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 mt(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)}.`)&&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 ue(i){return i.length>0&&i.length<=1024&&!oe(i)&&!i.includes("\0")&&!i.replaceAll("\\","/").split("/").includes("..")}function P(i){return typeof i=="string"&&i.length>0&&i.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(i)&&!i.includes("..")}function ge(i){return P(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(P)}function yt(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 wt(i){const e=W(i),t={pid:process.pid,nonce:Re(16).toString("hex")},r=async()=>{await Y(e),await je(e,C(i),JSON.stringify(t));try{await R(i,e),await J(S(i,"owner.json"),i)}catch(n){throw await ee(i,e).catch(()=>{}),n}};try{await r()}catch(n){if(!$(n,"EEXIST"))throw n;await j(i,"directory");const a=await $e(i);if(a!==void 0&&ye(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 O(i);if(!s)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const c=`${i}.stale.${process.pid}.${Date.now()}`;await ne(e,C(i),C(c));try{if(await R(c,e),await O(c)!==s)throw await de(c,i,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await ee(c,e,async u=>await O(u)===s).catch(()=>{})}}return t}async function bt(i,e){const t=W(i);try{await R(i,t);const r=await $e(i);if(!r||!fi(r,e))return!1;const n=await O(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await ne(t,C(i),C(a)),await R(a,t);const s=await $e(a);return!s||!fi(s,e)||await O(a)!==n?(await de(a,i,t).catch(()=>{}),!1):ee(a,t,async c=>await O(c)===n)}catch(r){if($(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 R(i,W(i));const e=S(i,"owner.json");await J(e,i);const t=JSON.parse(await M(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 ye(i){try{return process.kill(i,0),!0}catch(e){return $(e,"EPERM")}}function f(i){return i&&typeof i=="object"&&!Array.isArray(i)?i:void 0}function $(i,e){return i instanceof Error&&"code"in i&&i.code===e}export{he as GIT_LIFECYCLE_RUNTIME_DIRECTORY,pe as GIT_LIFECYCLE_RUNTIME_FILE,Fe as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,Ci as LEGACY_P174_CHECKPOINT_MIGRATIONS,q as P205_COMPLETE_COMMAND,Ft as acquireGitLifecyclePhysicalIntegrationLock,Ni as applyGitLifecycleRuntimeOverlay,R as assertGitLifecyclePrivateDirectory,Tt as assertGitLifecyclePrivateFile,qt as classifyGitLifecycleStoryCheckpointProjectionSync,Qi as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,Fi as computeHistoricalReviewReconciliationDigest,Gi as computeImmutableStoryQaEvidenceDigest,Gt as computeLegacyDirectYoloRecoveryReceiptRef,Ti as computeP205StoryQaEvidenceDigest,Yi as ensureGitLifecyclePrivateChildDirectory,Bt as ensureGitLifecycleRuntimeInitialized,Vi as ensureRuntimeEpic,Vt as ensureRuntimeStory,Pi as executeP205TransientAuthorities,$t as executeP205TransientAuthority,ei as gitLifecycleRuntimeDirectory,Hi as gitLifecycleStoryWriteSet,Je as isAcceptedGitLifecycleStoryCheckpoint,Ke as mutateGitLifecycleRuntime,Ht as p205TransientAuthorityMatchesAggregate,Nt as persistGitLifecycleGraphAuthority,me as posixSecurityAvailable,zt as projectP205TransientExecutionEvidence,ke as publicStoryReviewArtifactFromGit,Ae as readGitLifecycleRuntime,$i as readGitLifecycleRuntimeSync,Ji as releaseGitLifecyclePhysicalIntegrationLock,Kt as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,ee as removeGitLifecyclePrivateDirectory,Wt as renewGitLifecyclePhysicalIntegrationLock,Lt as verifyAcceptedGitLifecycleStoryCheckpoint,Qe as verifyAcceptedGitLifecycleStoryCheckpointSync,Mt as verifyGitLifecyclePhysicalIntegrationLock,jt as verifyLegacyCheckpointMigrationCandidateSync};
@@ -23,6 +23,8 @@ interface ActivationResult {
23
23
  readonly token: string;
24
24
  readonly expiresIn: number;
25
25
  readonly refreshToken?: string;
26
+ /** Server-authoritative tier; absent only for older activation contracts. */
27
+ readonly tier?: 'free' | 'pro' | 'enterprise';
26
28
  }
27
29
  export type LicenseTokenInspection = {
28
30
  readonly status: 'authenticated';
@@ -59,7 +61,7 @@ export declare class LicenseClient {
59
61
  /** Read-only authentication classification. It never refreshes, activates, clears or writes cache state. */
60
62
  inspectToken(): Promise<LicenseTokenInspection>;
61
63
  /**
62
- * Activate the license by calling POST /api/v1/license/activate.
64
+ * Activate through the endpoint matching the configured credential type.
63
65
  * Stores token and refresh_token in memory and cache on success.
64
66
  * NEVER throws - returns null on failure.
65
67
  */
@@ -1 +1 @@
1
- import{decodeJwt as h}from"jose";import{NoOpCache as c}from"../types/index.js";import{getMachineFingerprint as o}from"../machine/fingerprint.js";import{CLIENT_VERSION as l}from"../version.js";const i="neocortex:jwt:token",s="neocortex:jwt:refresh_token",u=300,a=10080*60*1e3;class T{serverUrl;licenseKey;cache;clientVersion;machineId;strictReadOnly;token=null;refreshToken=null;constructor(e){this.serverUrl=e.serverUrl.replace(/\/+$/,""),this.licenseKey=e.licenseKey,this.cache=e.cacheProvider??new c,this.clientVersion=e.clientVersion??l,this.strictReadOnly=e.strictReadOnly??!1,this.machineId=o({strictReadOnly:this.strictReadOnly})}async getToken(){try{if(this.strictReadOnly){const r=await this.inspectToken();return r.status==="authenticated"?r.token:null}if(this.token){const r=this.checkTokenValidity(this.token);if(r==="valid")return this.token;if(r==="needs-refresh")return this.strictReadOnly?this.token:(await this.refresh())?.token??this.token;this.token=null}const e=await this.loadFromCache();if(e){this.token=e;const r=this.checkTokenValidity(e);if(r==="valid")return e;if(r==="needs-refresh")return this.strictReadOnly?e:(await this.refresh())?.token??e;this.token=null}if(this.strictReadOnly)return null;if(this.refreshToken||(this.refreshToken=await this.loadRefreshTokenFromCache()),this.refreshToken){const r=await this.refresh();if(r?.token)return r.token}return(await this.activate())?.token??null}catch{return null}}async inspectToken(){try{const e=this.token??await this.loadFromCache();if(e){const t=this.checkTokenValidity(e);return t==="valid"?{status:"authenticated",token:e}:{status:"refresh-required",reason:t==="needs-refresh"?"near-expiry":"expired"}}return this.licenseKey?{status:"refresh-required",reason:"unavailable"}:{status:"not-configured"}}catch{return this.licenseKey?{status:"refresh-required",reason:"unavailable"}:{status:"not-configured"}}}async activate(){if(this.strictReadOnly)return null;try{const e=await fetch(`${this.serverUrl}/api/v1/license/activate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({license_key:this.licenseKey,machine_id:this.machineId,client_version:this.clientVersion})});if(!e.ok)return null;const t=await e.json();return this.token=t.token,this.refreshToken=t.refresh_token??null,await this.cache.set(i,t.token,t.expires_in*1e3).catch(()=>{}),t.refresh_token&&await this.cache.set(s,t.refresh_token,a).catch(()=>{}),{token:t.token,expiresIn:t.expires_in,refreshToken:t.refresh_token}}catch{return null}}async refresh(e){if(this.strictReadOnly)return null;try{const t=this.refreshToken??await this.loadRefreshTokenFromCache();if(!t)return null;const r=await fetch(`${this.serverUrl}/api/v1/license/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:t})});if(!r.ok)return this.refreshToken=null,await this.cache.set(s,"",1).catch(()=>{}),null;const n=await r.json();return this.token=n.token,this.refreshToken=n.refresh_token??null,await this.cache.set(i,n.token,n.expires_in*1e3).catch(()=>{}),n.refresh_token&&await this.cache.set(s,n.refresh_token,a).catch(()=>{}),{token:n.token,expiresIn:n.expires_in,refreshToken:n.refresh_token}}catch{return null}}async forceRefresh(){if(this.strictReadOnly)return null;try{const e=await this.refresh();return e?.token?e.token:(this.token=null,this.refreshToken=null,await this.cache.clear().catch(()=>{}),(await this.activate())?.token??null)}catch{return null}}checkTokenValidity(e){try{const t=h(e);if(!t.exp)return"expired";const r=Math.floor(Date.now()/1e3);return t.exp<=r?"expired":t.exp-r<=u?"needs-refresh":"valid"}catch{return"expired"}}async loadFromCache(){try{return await this.cache.get(i)}catch{return null}}async loadRefreshTokenFromCache(){try{const e=await this.cache.get(s);return e&&e.length>0?e:null}catch{return null}}}export{T as LicenseClient};
1
+ import{decodeJwt as h}from"jose";import{NoOpCache as o}from"../types/index.js";import{getMachineFingerprint as l}from"../machine/fingerprint.js";import{CLIENT_VERSION as u}from"../version.js";const a="neocortex:jwt:token",s="neocortex:jwt:refresh_token",f=300,c=10080*60*1e3;class w{serverUrl;licenseKey;cache;clientVersion;machineId;strictReadOnly;token=null;refreshToken=null;constructor(e){this.serverUrl=e.serverUrl.replace(/\/+$/,""),this.licenseKey=e.licenseKey,this.cache=e.cacheProvider??new o,this.clientVersion=e.clientVersion??u,this.strictReadOnly=e.strictReadOnly??!1,this.machineId=l({strictReadOnly:this.strictReadOnly})}async getToken(){try{if(this.strictReadOnly){const t=await this.inspectToken();return t.status==="authenticated"?t.token:null}if(this.token){const t=this.checkTokenValidity(this.token);if(t==="valid")return this.token;if(t==="needs-refresh")return this.strictReadOnly?this.token:(await this.refresh())?.token??this.token;this.token=null}const e=await this.loadFromCache();if(e){this.token=e;const t=this.checkTokenValidity(e);if(t==="valid")return e;if(t==="needs-refresh")return this.strictReadOnly?e:(await this.refresh())?.token??e;this.token=null}if(this.strictReadOnly)return null;if(this.refreshToken||(this.refreshToken=await this.loadRefreshTokenFromCache()),this.refreshToken){const t=await this.refresh();if(t?.token)return t.token}return(await this.activate())?.token??null}catch{return null}}async inspectToken(){try{const e=this.token??await this.loadFromCache();if(e){const i=this.checkTokenValidity(e);return i==="valid"?{status:"authenticated",token:e}:{status:"refresh-required",reason:i==="needs-refresh"?"near-expiry":"expired"}}return this.licenseKey?{status:"refresh-required",reason:"unavailable"}:{status:"not-configured"}}catch{return this.licenseKey?{status:"refresh-required",reason:"unavailable"}:{status:"not-configured"}}}async activate(){if(this.strictReadOnly)return null;try{const e=this.licenseKey.startsWith("nxk_"),i=e?"activate-key":"activate",t=e?{api_key:this.licenseKey}:{license_key:this.licenseKey},r=await fetch(`${this.serverUrl}/api/v1/license/${i}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,machine_id:this.machineId,client_version:this.clientVersion})});if(!r.ok)return null;const n=await r.json();return n.tier!==void 0&&n.tier!=="free"&&n.tier!=="pro"&&n.tier!=="enterprise"?null:(this.token=n.token,this.refreshToken=n.refresh_token??null,await this.cache.set(a,n.token,n.expires_in*1e3).catch(()=>{}),n.refresh_token&&await this.cache.set(s,n.refresh_token,c).catch(()=>{}),{token:n.token,expiresIn:n.expires_in,refreshToken:n.refresh_token,tier:n.tier})}catch{return null}}async refresh(e){if(this.strictReadOnly)return null;try{const i=this.refreshToken??await this.loadRefreshTokenFromCache();if(!i)return null;const t=await fetch(`${this.serverUrl}/api/v1/license/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:i})});if(!t.ok)return this.refreshToken=null,await this.cache.set(s,"",1).catch(()=>{}),null;const r=await t.json();return this.token=r.token,this.refreshToken=r.refresh_token??null,await this.cache.set(a,r.token,r.expires_in*1e3).catch(()=>{}),r.refresh_token&&await this.cache.set(s,r.refresh_token,c).catch(()=>{}),{token:r.token,expiresIn:r.expires_in,refreshToken:r.refresh_token}}catch{return null}}async forceRefresh(){if(this.strictReadOnly)return null;try{const e=await this.refresh();return e?.token?e.token:(this.token=null,this.refreshToken=null,await this.cache.clear().catch(()=>{}),(await this.activate())?.token??null)}catch{return null}}checkTokenValidity(e){try{const i=h(e);if(!i.exp)return"expired";const t=Math.floor(Date.now()/1e3);return i.exp<=t?"expired":i.exp-t<=f?"needs-refresh":"valid"}catch{return"expired"}}async loadFromCache(){try{return await this.cache.get(a)}catch{return null}}async loadRefreshTokenFromCache(){try{const e=await this.cache.get(s);return e&&e.length>0?e:null}catch{return null}}}export{w as LicenseClient};
@@ -0,0 +1,4 @@
1
+ export declare function invalidProjectMemoryPath(reason: 'invalid' | 'out-of-scope'): never;
2
+ export declare function isValidScopedRelativePath(path: unknown): path is string;
3
+ /** Reject unsafe paths before canonical content or any target is read or written. */
4
+ export declare function assertProjectMemoryPaths(projectRoot: string, relativeFiles: readonly string[]): void;
@@ -0,0 +1 @@
1
+ import{lstatSync as E,readlinkSync as P,realpathSync as S}from"node:fs";import{dirname as A,isAbsolute as u,join as m,relative as O,resolve as d,sep as R,win32 as g}from"node:path";import{CANONICAL_PROJECT_MEMORY_SOURCE as p}from"./shared-project-memory-types.js";function t(o){throw new Error(`project-memory-path-${o}`)}function j(o){return typeof o=="string"&&o.length>0&&!o.startsWith("~")&&!o.includes("\\")&&!o.includes("\0")&&!u(o)&&!g.isAbsolute(o)&&!/^[a-zA-Z]:/.test(o)&&!o.split("/").some(e=>e===""||e==="."||e==="..")}function N(o,e){let i;try{i=S(o)}catch{t("out-of-scope")}const y=m(i,p);for(const r of e){j(r)||t("invalid");const h=d(i,r),c=O(i,h);(c===""||c===".."||c.startsWith(`..${R}`)||u(c))&&t("out-of-scope");const s=r.split("/");for(let n=0;n<s.length;n++){const l=m(i,...s.slice(0,n+1));let f;try{f=E(l)}catch(v){if(v.code==="ENOENT")continue;t("out-of-scope")}if(!f.isSymbolicLink())continue;(n!==s.length-1||r===p)&&t("out-of-scope");let a;try{a=P(l)}catch{t("out-of-scope")}d(A(l),a)!==y&&t("out-of-scope")}}}export{N as assertProjectMemoryPaths,t as invalidProjectMemoryPath,j as isValidScopedRelativePath};
@@ -21,6 +21,8 @@ export interface WriteProjectMemoryOptions {
21
21
  readonly fs?: ProjectMemoryWriterFs;
22
22
  readonly symlinkCapability?: ProjectMemorySymlinkCapability;
23
23
  readonly dryRun?: boolean;
24
+ /** Root lifecycle backups stay outside the project write claim. */
25
+ readonly backupDirectory?: string;
24
26
  }
25
27
  export interface ProjectMemorySymlinkCapability {
26
28
  readonly os: NodeJS.Platform | string;
@@ -54,7 +56,7 @@ export interface WriteProjectMemoryTargetFilesResult {
54
56
  readonly files: readonly WriteProjectMemoryFileResult[];
55
57
  readonly changed: boolean;
56
58
  }
57
- export declare function createNodeProjectMemoryFs(): ProjectMemoryWriterFs;
59
+ export declare function createNodeProjectMemoryFs(backupDirectory?: string): ProjectMemoryWriterFs;
58
60
  export declare const PROJECT_MEMORY_LAYER_CATEGORIES: readonly ["skills-agents", "frontend", "backend", "api", "db", "schemas", "envs", "devops", "cyber-security", "testing-qa", "observability", "product-business", "docs-architecture", "platform-memory", "command-behavior", "generic"];
59
61
  export type ProjectMemoryLayerCategory = typeof PROJECT_MEMORY_LAYER_CATEGORIES[number];
60
62
  export type ProjectMemoryChangeKind = 'feature' | 'rule' | 'flag' | 'route' | 'api' | 'db-schema' | 'architecture' | 'debt' | 'decision' | 'generic';
@@ -68,6 +70,7 @@ export interface ClassifiedProjectMemoryUpdate {
68
70
  export declare function classifyProjectMemoryUpdate(value: string): ClassifiedProjectMemoryUpdate;
69
71
  export declare function createSafeProjectMemoryDiff(before: string | undefined, after: string): string;
70
72
  export declare function bootstrapArchitectureMemory(projectRoot: string): BootstrapArchitectureMemory;
73
+ export declare function shouldUseManagedWrapper(target: ProjectMemoryTarget, relativeFile: string): boolean;
71
74
  export declare function buildProjectMemoryContent(target: ProjectMemoryTarget, existingContent: string | undefined, memoryNotes?: readonly string[], architectureReferences?: readonly ArchitectureReference[], bootstrapArchitecture?: BootstrapArchitectureMemory): string;
72
75
  export declare function writeProjectMemory(options: WriteProjectMemoryOptions): WriteProjectMemoryResult;
73
76
  export declare function writeCanonicalProjectMemory(options: Omit<WriteProjectMemoryOptions, 'targetId'>): WriteProjectMemoryResult;