@ornexus/neocortex 4.60.59 → 4.60.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/sbom.cdx.json +241 -82
- package/install.ps1 +1 -1
- package/install.sh +1 -1
- package/package.json +6 -2
- package/packages/client/dist/cli.js +37 -4
- package/packages/client/dist/commands/architecture-answers.d.ts +26 -0
- package/packages/client/dist/commands/architecture-answers.js +7 -0
- package/packages/client/dist/commands/architecture-memory-terminal.d.ts +21 -0
- package/packages/client/dist/commands/architecture-memory-terminal.js +2 -0
- package/packages/client/dist/commands/architecture-root-binding.d.ts +2 -0
- package/packages/client/dist/commands/architecture-root-binding.js +1 -0
- package/packages/client/dist/commands/invoke.d.ts +43 -2
- package/packages/client/dist/commands/invoke.js +98 -70
- package/packages/client/dist/commands/legacy-story-branch.d.ts +10 -0
- package/packages/client/dist/commands/legacy-story-branch.js +1 -0
- package/packages/client/dist/commands/legacy-story-pr.d.ts +18 -0
- package/packages/client/dist/commands/legacy-story-pr.js +1 -0
- package/packages/client/dist/commands/planning-diagnosis.d.ts +4 -0
- package/packages/client/dist/commands/planning-diagnosis.js +1 -0
- package/packages/client/dist/commands/planning-generation.d.ts +2 -0
- package/packages/client/dist/commands/planning-generation.js +1 -0
- package/packages/client/dist/commands/planning-research.d.ts +3 -0
- package/packages/client/dist/commands/planning-research.js +1 -0
- package/packages/client/dist/commands/refresh-memory.d.ts +10 -0
- package/packages/client/dist/commands/refresh-memory.js +3 -1
- package/packages/client/dist/commands/story-checkpoint.d.ts +1 -1
- package/packages/client/dist/commands/story-checkpoint.js +1 -1
- package/packages/client/dist/config/profile-directory.d.ts +2 -0
- package/packages/client/dist/config/profile-directory.js +1 -0
- package/packages/client/dist/config/secure-config.js +5 -5
- package/packages/client/dist/continuity/runner-bootstrap-policy.d.ts +1 -1
- package/packages/client/dist/continuity/runner-bootstrap-policy.js +1 -1
- package/packages/client/dist/generated/command-registry.generated.d.ts +11 -11
- package/packages/client/dist/generated/command-registry.generated.js +1 -1
- package/packages/client/dist/generated/public-projections.generated.d.ts +20 -20
- package/packages/client/dist/generated/public-projections.generated.js +1 -1
- package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +9 -0
- package/packages/client/dist/git/direct-yolo-checkpoint.js +4 -4
- package/packages/client/dist/git/git-lifecycle-step-ids.d.ts +5 -0
- package/packages/client/dist/git/git-lifecycle-step-ids.js +1 -1
- package/packages/client/dist/git/git-lifecycle-store.d.ts +16 -0
- package/packages/client/dist/git/git-lifecycle-store.js +9 -4
- package/packages/client/dist/git/legacy-story-branch-checkpoint.d.ts +38 -0
- package/packages/client/dist/git/legacy-story-branch-checkpoint.js +9 -0
- package/packages/client/dist/git/legacy-story-branch-setup.d.ts +56 -0
- package/packages/client/dist/git/legacy-story-branch-setup.js +4 -0
- package/packages/client/dist/git/legacy-story-pr.d.ts +514 -0
- package/packages/client/dist/git/legacy-story-pr.js +62 -0
- package/packages/client/dist/git/secure-filesystem-boundary.d.ts +2 -0
- package/packages/client/dist/git/secure-filesystem-boundary.js +34 -7
- package/packages/client/dist/machine/fingerprint.js +2 -2
- package/packages/client/dist/memory/project-memory-writer.js +17 -17
- package/packages/client/dist/memory/shared-project-memory-types.d.ts +23 -13
- package/packages/client/dist/memory/shared-project-memory-types.js +2 -2
- package/packages/client/dist/migrations/state-json.d.ts +23 -1
- package/packages/client/dist/migrations/state-json.js +4 -4
- package/packages/client/dist/private-execution/delivery.d.ts +131 -3
- package/packages/client/dist/private-execution/delivery.js +2 -2
- package/packages/client/dist/private-execution/isolated-admission.d.ts +28 -1
- package/packages/client/dist/private-execution/isolated-admission.js +11 -2
- package/packages/client/dist/private-execution/isolated-session.js +2 -2
- package/packages/client/dist/private-execution/isolated-workspace.d.ts +8 -0
- package/packages/client/dist/private-execution/isolated-workspace.js +1 -1
- package/packages/client/dist/private-execution/pact-consumer-runtime.d.ts +19 -0
- package/packages/client/dist/private-execution/pact-consumer-runtime.js +3 -0
- package/packages/client/dist/private-execution/pact-test-source.d.ts +9 -0
- package/packages/client/dist/private-execution/pact-test-source.js +1 -0
- package/packages/client/dist/private-execution/pact-toolchain.d.ts +37 -0
- package/packages/client/dist/private-execution/pact-toolchain.js +3 -0
- package/packages/client/dist/private-execution/pact-write-set.d.ts +24 -0
- package/packages/client/dist/private-execution/pact-write-set.js +1 -0
- package/packages/client/dist/private-execution/planning-diagnosis-checkpoint.d.ts +38 -0
- package/packages/client/dist/private-execution/planning-diagnosis-checkpoint.js +5 -0
- package/packages/client/dist/private-execution/planning-generation-checkpoint.d.ts +34 -0
- package/packages/client/dist/private-execution/planning-generation-checkpoint.js +4 -0
- package/packages/client/dist/private-execution/planning-research-checkpoint.d.ts +38 -0
- package/packages/client/dist/private-execution/planning-research-checkpoint.js +4 -0
- package/packages/client/dist/private-execution/ux-source-validation.d.ts +2 -0
- package/packages/client/dist/private-execution/ux-source-validation.js +1 -0
- package/packages/client/dist/private-execution/ux-write-set.d.ts +30 -0
- package/packages/client/dist/private-execution/ux-write-set.js +2 -0
- package/packages/client/dist/resolvers/remote-resolver.d.ts +5 -22
- package/packages/client/dist/resolvers/remote-resolver.js +1 -1
- package/packages/client/dist/runner/project-identity.js +1 -1
- package/packages/client/dist/runner/scheduler.d.ts +20 -0
- package/packages/client/dist/runner/scheduler.js +7 -7
- package/packages/client/dist/state/project-state-snapshot.js +1 -1
- package/packages/client/dist/yolo/change-evidence-collector.d.ts +8 -0
- package/packages/client/dist/yolo/change-evidence-collector.js +1 -1
- package/packages/client/dist/yolo/spec-envelope-collector.d.ts +2 -0
- package/packages/client/dist/yolo/spec-envelope-collector.js +3 -3
- package/packages/client/dist/yoloop/invoke-hooks.js +7 -7
- package/packages/shared/dist/generated/command-registry.generated.js +12 -10
- package/packages/shared/dist/generated/invocation-schema.generated.js +14 -6
- package/packages/shared/dist/generated/public-projections.generated.js +18 -18
- package/packages/shared/dist/invocation/index.d.ts +1 -1
- package/packages/shared/dist/merge-readiness/c12-remote-observation.js +80 -0
- package/packages/shared/dist/planning/diagnosis-state.js +143 -0
- package/packages/shared/dist/yoloop/branch-unit.js +23 -1
- package/targets-stubs/antigravity/gemini.md +1 -1
- package/targets-stubs/antigravity/skill/SKILL.md +1 -1
- package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex-root.md +2 -2
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +2 -2
- package/targets-stubs/codex/AGENTS.md +1 -1
- package/targets-stubs/cursor/agent.md +2 -2
- package/targets-stubs/gemini-cli/agent.md +2 -2
- package/targets-stubs/opencode/neocortex-root.md +1 -1
- package/targets-stubs/vscode/neocortex.agent.md +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{execFile as xe}from"node:child_process";import{createHash as De,randomBytes as ne,timingSafeEqual as be}from"node:crypto";import{readFile as ae}from"node:fs/promises";import{join as se,resolve as Y}from"node:path";import{promisify as Ae}from"node:util";import{acquireGitLifecyclePhysicalIntegrationLock as N,applyGitLifecycleRuntimeOverlay as je,computeImmutableStoryQaEvidenceDigest as Ee,computeGitLifecyclePhysicalIntegrationLockOwnerDigest as ce,computeP205StoryQaEvidenceDigest as Be,computeLegacyDirectYoloRecoveryReceiptRef as _e,ensureRuntimeEpic as C,ensureRuntimeStory as Le,ensureGitLifecyclePrivateChildDirectory as qe,executeP205TransientAuthority as He,projectP205TransientExecutionEvidence as $e,LEGACY_DIRECT_YOLO_RECOVERY_COMMITS as Ce,mutateGitLifecycleRuntime as z,P205_COMPLETE_COMMAND as ze,readGitLifecycleRuntime as q,gitLifecycleRuntimeDirectory as Oe,assertGitLifecyclePrivateFile as de,releaseGitLifecyclePhysicalIntegrationLock as V,releaseGitLifecyclePhysicalIntegrationLockForCheckpoint as Pe,verifyGitLifecyclePhysicalIntegrationLock as M,verifyAcceptedGitLifecycleStoryCheckpoint as fe}from"./git-lifecycle-store.js";import{anchoredAtomicWriteFile as Ne}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as Ve,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as he}from"./git-lifecycle-step-ids.js";const Z=Ae(xe);async function it(e){try{const t=await ue(e.projectRoot,e.storyId),o=P(e.nowIso),r=Date.parse(o),i=await y(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),n=await y(t.projectRoot,["rev-parse","HEAD"]),u=await q(t.projectRoot,{required:!0}),s=v(u.epics[t.epicId]),d=v(s?.branch_lease),a=d&&Number.isFinite(Date.parse(String(d.expiresAt)))&&Date.parse(String(d.expiresAt))>r;if(a&&d?.ownerStoryId!==e.storyId)return f("direct-yolo-writer-active");let c=Re(s?.origin_binding,t.executionBranch,t.originBranch);if(i===t.executionBranch){if(!c)return f("direct-yolo-origin-binding-invalid")}else{if(i!==t.originBranch)return f("direct-yolo-current-branch-mismatch");if(c&&c.originHeadSha!==n)return f("direct-yolo-origin-binding-conflict");if(c??={schemaVersion:1,originBranch:t.originBranch,originHeadSha:n,executionBranch:t.executionBranch,capturedFromCurrentCheckout:!0,capturedAt:o},(await Me(t.projectRoot)).some(m=>m.branch===t.executionBranch&&Y(m.path)!==t.projectRoot))return f("direct-yolo-execution-branch-checked-out-elsewhere");const g=await re(t.projectRoot),h=`refs/heads/${t.executionBranch}`;if(await $(t.projectRoot,["show-ref","--verify","--quiet",h])){const m=await y(t.projectRoot,["rev-parse",h]);if(m!==n){if(!await $(t.projectRoot,["merge-base","--is-ancestor",m,n]))return f("direct-yolo-execution-branch-diverged");await y(t.projectRoot,["update-ref",h,n,m])}await y(t.projectRoot,["switch",t.executionBranch])}else await y(t.projectRoot,["switch","-c",t.executionBranch]);if(await re(t.projectRoot)!==g)return f("direct-yolo-checkout-payload-raced")}const l=await y(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),S=await y(t.projectRoot,["rev-parse","HEAD"]);if(l!==t.executionBranch)return f("direct-yolo-current-branch-mismatch");if(a&&d?.ownerStoryId===e.storyId)return{ok:!0,value:Se(t,c,String(d.expiresAt),!0)};const w=o,p=new Date(r+3600*1e3).toISOString(),k=`setup-${ne(32).toString("hex")}`,E=await q(t.projectRoot,{required:!0});return await z(t.projectRoot,A=>{const g=C(A,t.epicId),h=v(g.branch_lease);if(h&&Date.parse(String(h.expiresAt))>r&&h.ownerStoryId!==e.storyId)throw new Error("direct-yolo-writer-active");const m=Re(g.origin_binding,t.executionBranch,t.originBranch);if(g.origin_binding&&!m)throw new Error("direct-yolo-origin-binding-conflict");if(m&&JSON.stringify(m)!==JSON.stringify(c))throw new Error("direct-yolo-origin-binding-conflict");g.branch_mode="epic",g.execution_branch=t.executionBranch,g.origin_branch=t.originBranch,g.graph_revision=t.graphRevision,g.origin_binding=c,g.branch_lease={schemaVersion:1,ownerStoryId:e.storyId,sessionId:k,idempotencyKey:k,acquiredAt:w,expiresAt:p}},{expectedRevision:E.revision,preCommit:async()=>{if(await y(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==t.executionBranch||await y(t.projectRoot,["rev-parse","HEAD"])!==S)throw new Error("direct-yolo-setup-physical-state-raced")}}),{ok:!0,value:Se(t,c,p,!1)}}catch(t){return f(T(t,"direct-yolo-setup-failed"))}}async function nt(e){try{const t=await G(e.projectRoot,e.storyId),o=H(await b(t.projectRoot,["diff","--cached","--name-only","-z"])),r=W(o,t.authorizedWriteSet,e.storyId);if(!r.ok)return f(r.reasonCode);if(H(await b(t.projectRoot,["diff","--name-only","-z"])).some(x=>o.includes(x)))return f("direct-yolo-user-overlap");const n=await b(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!n)return f("direct-yolo-staged-diff-empty");const u=D(n),s=D([...t.authorizedWriteSet].sort().join("\0")),d=P(e.nowIso),a=await q(t.projectRoot,{required:!0}),c=v(a.epics[t.epicId]?.branch_lease);if(!ge(c,e.storyId,d))return f("direct-yolo-setup-handoff-owner-invalid");const l=String(c.sessionId),S=String(c.expiresAt),w=new Date(Math.min(Date.parse(S),Date.parse(d)+300*1e3)).toISOString(),p=await O(t.projectRoot,e.storyId),k=p?.state==="issued"&&p.fromSessionId===l&&p.bundleDigest===u&&p.claimRevision===s&&Date.parse(p.expiresAt)>Date.parse(d),E=k?p.expiresAt:w,A=k?p.token:ne(32).toString("base64url"),g=D(A),h=Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff",storyId:e.storyId,fromSessionId:l,tokenDigest:g,bundleDigest:u,claimRevision:s,expiresAt:E}),m=D(JSON.stringify(h)),I=await N(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:l,idempotencyKey:l,expiresAt:E,persistent:!1,createdAt:d});if(!I.ok)return f(I.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{await J(t.projectRoot,{schemaVersion:1,kind:"direct-yolo-setup-handoff-token",state:"issued",storyId:e.storyId,fromSessionId:l,token:A,tokenDigest:g,bundleDigest:u,claimRevision:s,grantDigest:m,expiresAt:E}),await z(t.projectRoot,x=>{const R=v(C(x,t.epicId).branch_lease);if(!ge(R,e.storyId,d)||R?.sessionId!==l||R.idempotencyKey!==l)throw new Error("direct-yolo-setup-handoff-owner-raced");R.handoffGrant=h},{expectedRevision:a.revision,preCommit:async()=>{if(!await M(I.path,I.owner))throw new Error("direct-yolo-integration-lock-raced");const x=await O(t.projectRoot,e.storyId);if(!x||x.state!=="issued"||x.grantDigest!==m||x.tokenDigest!==g)throw new Error("direct-yolo-setup-handoff-token-raced")}})}finally{await V(I.path,I.owner).catch(()=>{})}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff-receipt",storyId:e.storyId,sessionId:l,bundleDigest:u,claimRevision:s,grantDigest:m,expiresAt:E,reused:k,publicSafe:!0})}}catch(t){return f(t instanceof Error&&/^direct-yolo-/.test(t.message)?t.message:"direct-yolo-setup-handoff-failed")}}async function at(e){try{const t=await G(e.projectRoot,e.storyId),o=await y(t.projectRoot,["rev-parse","HEAD"]),r=H(await b(t.projectRoot,["diff","--cached","--name-only","-z"])),i=W(r,t.authorizedWriteSet,e.storyId);if(!i.ok)return f(i.reasonCode);if(H(await b(t.projectRoot,["diff","--name-only","-z"])).some(h=>r.includes(h)))return f("direct-yolo-user-overlap");const u=await b(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!u)return f("direct-yolo-staged-diff-empty");const s=D(u),d=D([...t.authorizedWriteSet].sort().join("\0")),a=D(["direct-yolo-commit-v1",e.storyId,t.epicId,t.executionBranch,o,s,t.graphRevision,d].join("\0")),c=P(e.nowIso);let l=e.setupLeaseHandoff??await We(t.projectRoot,e.storyId,s,d,c);const S=await q(t.projectRoot,{required:!0}),w=v(S.epics[t.epicId]?.branch_lease),p=w?.ownerStoryId===e.storyId&&w.sessionId===a&&w.idempotencyKey===a&&typeof w.expiresAt=="string"&&Date.parse(w.expiresAt)>Date.parse(c)?w:void 0;if(p&&e.setupLeaseHandoff)return f("direct-yolo-setup-handoff-replayed");const k=v(p?.handoffConsumption);if(k){const h=await O(t.projectRoot,e.storyId);if(!h||!["consuming","consumed"].includes(h.state)||h.fromSessionId!==k.fromSessionId||h.tokenDigest!==k.tokenDigest||h.bundleDigest!==s||h.claimRevision!==d||k.bundleDigest!==s||k.claimRevision!==d||h.consumedBySessionId!==a||k.consumedBySessionId!==a)return f("direct-yolo-setup-handoff-consume-invalid");if(h.state==="consuming"){if(!h.token||D(h.token)!==h.tokenDigest)return f("direct-yolo-setup-handoff-consume-invalid");l={sessionId:h.fromSessionId,token:h.token}}}const E=p?String(p.expiresAt):new Date(Date.parse(c)+1800*1e3).toISOString(),A=await N(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:a,idempotencyKey:a,expiresAt:E,persistent:!0,createdAt:p&&typeof p.acquiredAt=="string"?p.acquiredAt:c});if(!A.ok)return f(A.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{l&&e.setupLeaseHandoff===void 0&&(await Ge(t.projectRoot,e.storyId,l.sessionId,l.token,a,c),await e.setupHandoffFault?.("after-consuming-persisted")),await z(t.projectRoot,h=>{const m=C(h,t.epicId),I=v(m.branch_lease),x=I&&Date.parse(String(I.expiresAt))>Date.parse(c),R=I?.ownerStoryId===e.storyId&&I.sessionId===a&&I.idempotencyKey===a,j=I?.ownerStoryId===e.storyId&&I.sessionId===I.idempotencyKey&&typeof I.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(I.idempotencyKey),B=x&&j&&Fe({current:I,handoff:l,storyId:e.storyId,bundleDigest:s,claimRevision:d,nowIso:c});if(l&&x&&!R&&!B)throw new Error("direct-yolo-setup-handoff-invalid");if(x&&!R&&!B)throw new Error("direct-yolo-writer-active");const _=B?v(I?.handoffGrant):void 0,L=_?{schemaVersion:1,kind:"direct-yolo-setup-handoff-consumption",state:"consumed",storyId:e.storyId,fromSessionId:String(I?.sessionId),tokenDigest:String(_.tokenDigest),bundleDigest:s,claimRevision:d,consumedBySessionId:a,consumedAt:c}:void 0;m.branch_mode="epic",m.execution_branch=t.executionBranch,m.origin_branch=t.originBranch,m.graph_revision=t.graphRevision,m.branch_lease=x&&R?I:{schemaVersion:1,ownerStoryId:e.storyId,sessionId:a,idempotencyKey:a,acquiredAt:c,expiresAt:E,...L?{handoffConsumption:L}:{}}},{expectedRevision:S.revision,preCommit:async()=>{if(!await M(A.path,A.owner))throw new Error("direct-yolo-integration-lock-raced")}})}catch(h){throw await V(A.path,A.owner).catch(()=>{}),h}l&&e.setupLeaseHandoff===void 0&&(await e.setupHandoffFault?.("before-consumed-persist"),await Ke(t.projectRoot,t.epicId,e.storyId,l.sessionId,l.token,s,d,a,c));const g=Object.freeze([`Neocortex-Story: ${e.storyId}`,`Neocortex-Epic: ${t.epicId}`,`Neocortex-Execution-Branch: ${t.executionBranch}`,`Neocortex-Prepared-Base: ${o}`,`Neocortex-Bundle-Digest: ${s}`,`Neocortex-Graph-Revision: ${t.graphRevision}`,`Neocortex-Claim-Revision: ${d}`]);return{ok:!0,value:Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,bundleDigest:s,graphRevision:t.graphRevision,claimRevision:d,idempotencyKey:a,changedPaths:Object.freeze(r),trailers:g})}}catch(t){return f(T(t,"direct-yolo-begin-failed"))}}async function st(e){let t,o,r;try{const i=await G(e.projectRoot,e.storyId);t=i;const n=await y(i.projectRoot,["rev-parse","HEAD"]);let u=await q(i.projectRoot,{required:!0});const s=v(u.stories[e.storyId]?.checkpoint);if(s){const j=typeof s.headSha=="string"?s.headSha:"",B=typeof s.graphRevision=="string"?s.graphRevision:"",_=/^[a-f0-9]{40,64}$/.test(j)?H(await b(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",j])):[],L=W(_,i.authorizedWriteSet,e.storyId);if(!(/^[a-f0-9]{40,64}$/.test(j)&&await $(i.projectRoot,["merge-base","--is-ancestor",j,n]))||!/^[a-f0-9]{64}$/.test(B)||!L.ok)return f("direct-yolo-replay-invalid");const ke=await X(e,i.projectRoot,n,B);if(!await fe(i.projectRoot,s,e.storyId,i.epicId,i.executionBranch,ke.transientAuthority,i.authorizedWriteSet))return f("direct-yolo-replay-invalid");if(!await ee(i.projectRoot,i.executionBranch,n,_))return f("direct-yolo-replay-head-raced");if(e.push&&!await pe(i.projectRoot,e.remote??"origin",i.executionBranch,j))return f("direct-yolo-remote-head-mismatch");const oe=Array.isArray(s.receiptRefs)?s.receiptRefs.find(ie=>typeof ie=="string"&&/^physical-lock-owner:[a-f0-9]{64}$/.test(ie)):void 0;return oe&&typeof s.idempotencyKey=="string"&&await Pe(i.projectRoot,{storyId:e.storyId,idempotencyKey:s.idempotencyKey,ownerDigest:oe.slice(20)}),{ok:!0,value:s}}const d=n,a=await y(i.projectRoot,["rev-parse",`${d}^`]),c=await b(i.projectRoot,["show","--no-patch","--format=%B",d]),l=H(await b(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",d])),S=W(l,i.authorizedWriteSet,e.storyId);if(!S.ok)return f(S.reasonCode);const w=F(c,"Neocortex-Bundle-Digest"),p=F(c,"Neocortex-Graph-Revision"),k=F(c,"Neocortex-Claim-Revision"),E=new Map([["Neocortex-Story",e.storyId],["Neocortex-Epic",i.epicId],["Neocortex-Execution-Branch",i.executionBranch],["Neocortex-Prepared-Base",a],["Neocortex-Graph-Revision",i.graphRevision],["Neocortex-Claim-Revision",D([...i.authorizedWriteSet].sort().join("\0"))]]);if(!w||!/^[a-f0-9]{64}$/.test(w)||!p||!k||[...E].some(([j,B])=>F(c,j)!==B))return f("direct-yolo-trailers-invalid");const A=D(await b(i.projectRoot,["diff","--binary","--full-index",`${a}..${d}`]));if(w!==A)return f("direct-yolo-bundle-digest-mismatch");const g=D(["direct-yolo-commit-v1",e.storyId,i.epicId,i.executionBranch,a,w,p,k].join("\0")),h=v(u.epics[i.epicId]?.branch_lease),m=P(e.nowIso),I=h?.ownerStoryId===e.storyId&&h.idempotencyKey===g&&h.sessionId===g&&Date.parse(String(h.expiresAt))>Date.now()?h:void 0;if(h&&Date.parse(String(h.expiresAt))>Date.now()&&!I)return f("direct-yolo-writer-active");const x=I??{schemaVersion:1,ownerStoryId:e.storyId,sessionId:g,idempotencyKey:g,acquiredAt:m,expiresAt:new Date(Date.parse(m)+1800*1e3).toISOString()},R=await N(i.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:g,idempotencyKey:g,expiresAt:String(x.expiresAt),persistent:!0,createdAt:String(x.acquiredAt)});if(!R.ok)return f(R.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");r=R,I||(u=(await z(i.projectRoot,B=>{const _=C(B,i.epicId),L=v(_.branch_lease);if(L&&Date.parse(String(L.expiresAt))>Date.parse(m))throw new Error("direct-yolo-writer-active");if(_.graph_revision!==i.graphRevision)throw new Error("direct-yolo-graph-revision-raced");_.branch_lease=x},{expectedRevision:u.revision})).document),o=x;{const j=await X(e,i.projectRoot,d,i.graphRevision);if(!await ee(i.projectRoot,i.executionBranch,d,l))return f("direct-yolo-head-raced");if(e.push){const L=K(e.remote??"origin");if(await y(i.projectRoot,["push",L,i.executionBranch]),!await we(i.projectRoot,L,i.executionBranch,d))return f("direct-yolo-remote-head-mismatch")}const B=await le({projectRoot:i.projectRoot,storyId:e.storyId,epicId:i.epicId,executionBranch:i.executionBranch,baseSha:a,headSha:d,bundleDigest:w,graphRevision:p,claimRevision:k,idempotencyKey:g,qaExecution:j,physicalLockOwnerDigest:ce(R.owner),nowIso:P(e.nowIso),legacyReceiptRef:void 0});return await e.beforeCheckpointPersist?.(),await ye({projectRoot:i.projectRoot,checkpoint:B,remote:e.push?e.remote??"origin":void 0,expectedRevision:u.revision,expectedLease:x,expectedGraphRevision:i.graphRevision,physicalLockPath:R.path,physicalLockOwner:R.owner,transientAuthority:j.transientAuthority,authorizedWriteSet:i.authorizedWriteSet})?(await e.afterCheckpointPersist?.(),{ok:!0,value:B}):f("direct-yolo-checkpoint-persist-failed")}}catch(i){return f(T(i,"direct-yolo-finalize-failed"))}finally{r&&await V(r.path,r.owner).catch(()=>{}),t&&o?await U(t.projectRoot,t.epicId,o).catch(()=>{}):t&&await Ye(t,e.storyId).catch(()=>{})}}async function ct(e){try{const t=await G(e.projectRoot,e.storyId);if(!/^[a-f0-9]{40,64}$/.test(e.commitSha))return f("direct-yolo-recovery-commit-invalid");const o=await y(t.projectRoot,["rev-parse",e.commitSha]);if(Ce[e.storyId]!==o)return f("direct-yolo-recovery-not-allowlisted");if(await y(t.projectRoot,["rev-parse","HEAD"])!==o)return f("direct-yolo-recovery-head-mismatch");await y(t.projectRoot,["merge-base","--is-ancestor",o,`refs/heads/${t.executionBranch}`]);const r=await y(t.projectRoot,["rev-parse",`${o}^`]),i=await b(t.projectRoot,["diff","--binary","--full-index",`${r}..${o}`]),n=H(await b(t.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",o]));if(!W(n,t.authorizedWriteSet.length>0?t.authorizedWriteSet:n,e.storyId).ok)return f("direct-yolo-recovery-write-set-invalid");const s=D(i),d=D([...n].sort().join("\0")),a=D(["legacy-direct-yolo-recovery-v1",e.storyId,o].join("\0")),c=P(e.nowIso),l=new Date(Date.parse(c)+1800*1e3).toISOString(),S=await q(t.projectRoot,{required:!0}),w=await N(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:a,idempotencyKey:a,expiresAt:l,persistent:!0,createdAt:c});if(!w.ok)return f(w.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-recovery-integration-backpressure":"direct-yolo-recovery-integration-lock-failed");const p={schemaVersion:1,ownerStoryId:e.storyId,sessionId:a,idempotencyKey:a,acquiredAt:c,expiresAt:l};let k=!1;try{const E=await z(t.projectRoot,x=>{const R=C(x,t.epicId),j=v(R.branch_lease);if(j&&Date.parse(String(j.expiresAt))>Date.parse(c)&&!Q(j,p))throw new Error("direct-yolo-recovery-writer-active");if(R.graph_revision!==t.graphRevision)throw new Error("direct-yolo-recovery-graph-raced");R.branch_mode="epic",R.execution_branch=t.executionBranch,R.origin_branch=t.originBranch,R.branch_lease=p},{expectedRevision:S.revision});k=!0;const A=await X(e,t.projectRoot,o,t.graphRevision);if(!await ee(t.projectRoot,t.executionBranch,o,n))return f("direct-yolo-recovery-head-raced");if(e.push){const x=K(e.remote??"origin"),R=(await y(t.projectRoot,["ls-remote","--heads",x,`refs/heads/${t.executionBranch}`])).split(/\s+/)[0];if(!R||!await $(t.projectRoot,["merge-base","--is-ancestor",o,R]))return f("direct-yolo-recovery-remote-proof-missing")}const g=await le({projectRoot:t.projectRoot,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:r,headSha:o,bundleDigest:s,graphRevision:t.graphRevision,claimRevision:d,idempotencyKey:a,qaExecution:A,physicalLockOwnerDigest:ce(w.owner),nowIso:c,legacyReceiptRef:void 0}),h=await _e(t.projectRoot,{storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:r,headSha:o,bundleDigest:s,graphRevision:t.graphRevision});if(!h)return f("direct-yolo-recovery-evidence-invalid");const m=Object.freeze({...g,receiptRefs:Object.freeze([...g.receiptRefs,h])});return await ye({projectRoot:t.projectRoot,checkpoint:m,remote:e.push?e.remote??"origin":void 0,remotePolicy:"ancestor-recovery",expectedRevision:E.document.revision,expectedLease:p,expectedGraphRevision:t.graphRevision,physicalLockPath:w.path,physicalLockOwner:w.owner,transientAuthority:A.transientAuthority,authorizedWriteSet:t.authorizedWriteSet})?{ok:!0,value:m}:f("direct-yolo-recovery-persist-failed")}finally{await V(w.path,w.owner).catch(()=>{}),k&&await U(t.projectRoot,t.epicId,p).catch(()=>{})}}catch(t){return f(T(t,"direct-yolo-recovery-failed"))}}async function ue(e,t){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t))throw new Error("direct-yolo-story-id-invalid");const o=Y(e),r=v(JSON.parse(await ae(se(o,".neocortex/state.json"),"utf8"))),i=await q(o,{required:!0}),n=je(r,i),u=v(n.stories),s=v(n.epics),d=v(u?.[t]),a=String(d?.epic_id??t.split(".")[0]),c=v(s?.[a]),l=String(c?.execution_branch??""),S=String(c?.origin_branch??""),w=String(c?.graph_revision??""),p=Array.isArray(d?.files_to_modify)?[...new Set(d.files_to_modify.filter(k=>typeof k=="string"&&te(k)))].sort():[];if(!d)throw new Error("direct-yolo-story-state-missing");if(c?.branch_mode!=="epic")throw new Error("direct-yolo-branch-mode-invalid");if(!ve(l)||!await $(o,["check-ref-format","--branch",l]))throw new Error("direct-yolo-execution-branch-invalid");if(!ve(S)||!await $(o,["check-ref-format","--branch",S]))throw new Error("direct-yolo-origin-branch-invalid");if(!/^[a-f0-9]{64}$/.test(w))throw new Error("direct-yolo-graph-revision-invalid");return{projectRoot:o,storyId:t,story:d,epicId:a,executionBranch:l,originBranch:S,graphRevision:w,authorizedWriteSet:p}}async function G(e,t){const o=await ue(e,t);if(await y(o.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==o.executionBranch)throw new Error("direct-yolo-current-branch-mismatch");return o}async function le(e){const t=e.nowIso,o=await b(e.projectRoot,["show","--no-patch","--format=%H%n%P%n%B",e.headSha]),r=H(await b(e.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha])),i=Ee({storyId:e.storyId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,commitBody:o,changedPaths:r}),n=Be({gitEvidenceDigest:i,headSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest}),u=`story-qa:${n}`,s=Object.freeze({schemaVersion:1,kind:"story_qa_evidence",producer:"local-yolo-tdd",evidenceVersion:"p205-execution-v2",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,contract:e.qaExecution.contract,command:e.qaExecution.command,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest,sourceEvidenceDigest:n,verdict:"passed",checkedAt:t,receiptRef:u}),d=D(["root-commit-range-review-v1",e.storyId,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,u,D(o),[...r].sort().join(",")].join("\0")),a=`story-review:${d}`,c=Object.freeze({schemaVersion:1,kind:"story_review_evidence",producer:"root-commit-range-review",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,sourceEvidenceDigest:d,qaReceiptRef:u,verdict:"approved",reviewedAt:t,receiptRef:a}),l=[`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,u,a,...e.physicalLockOwnerDigest?[`physical-lock-owner:${e.physicalLockOwnerDigest}`]:[],...e.legacyReceiptRef?[e.legacyReceiptRef]:[]];return Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:e.epicId,branch:e.executionBranch,baseSha:e.baseSha,headSha:e.headSha,commits:Object.freeze([e.headSha]),idempotencyKey:e.idempotencyKey,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,claimRevision:e.claimRevision,receiptRefs:Object.freeze(l),qaVerdict:"passed",reviewVerdict:"approved",qaReceipt:s,reviewReceipt:c,recordedAt:t})}async function ye(e){const{projectRoot:t,checkpoint:o,remote:r}=e;let i=!1;return await z(t,n=>{const u=C(n,o.epicId);if(e.expectedLease){const c=v(u.branch_lease);if(!Q(c,e.expectedLease))throw new Error("direct-yolo-runtime-revision-conflict");if(Date.parse(String(c?.expiresAt))<=Date.now())throw new Error("direct-yolo-writer-lease-expired");if(u.graph_revision!==e.expectedGraphRevision||o.graphRevision!==e.expectedGraphRevision)throw new Error("direct-yolo-graph-revision-raced")}const s=Le(n,o.storyId),d=v(s.checkpoint);if(d&&d.headSha!==o.headSha){i=!0;return}s.checkpoint=o,s.status="done",s.last_step=he;const a=Array.isArray(s.steps_completed)?s.steps_completed.filter(c=>typeof c=="string"):[];s.steps_completed=[...new Set([...a,Ve,he])],u.branch_lease=null},{expectedRevision:e.expectedRevision,preCommit:async()=>{if(i)throw new Error("direct-yolo-checkpoint-conflict");if(await y(t,["symbolic-ref","--quiet","--short","HEAD"])!==o.branch||await y(t,["rev-parse","HEAD"])!==o.headSha)throw new Error("direct-yolo-checkpoint-head-raced");if(!await fe(t,o,o.storyId,o.epicId,o.branch,e.transientAuthority,e.authorizedWriteSet))throw new Error("direct-yolo-checkpoint-physical-invalid");if(e.physicalLockPath&&e.physicalLockOwner&&!await M(e.physicalLockPath,e.physicalLockOwner))throw new Error("direct-yolo-integration-lock-raced");if(r&&!(e.remotePolicy==="ancestor-recovery"?await pe(t,r,o.branch,o.headSha):await we(t,r,o.branch,o.headSha)))throw new Error("direct-yolo-checkpoint-remote-raced")}}),!i}async function pe(e,t,o,r){const i=K(t),n=(await y(e,["ls-remote","--heads",i,`refs/heads/${o}`])).split(/\s+/)[0];return!!(n&&await $(e,["merge-base","--is-ancestor",r,n]))}function ge(e,t,o){return!!(e?.ownerStoryId===t&&e.sessionId===e.idempotencyKey&&typeof e.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(e.idempotencyKey)&&typeof e.expiresAt=="string"&&Date.parse(e.expiresAt)>Date.parse(o))}async function me(e,t){const o=await Oe(e),r=await qe(o,"handoffs"),i=`direct-${D(t)}.json`;return{parent:r,name:i,path:se(r,i)}}async function J(e,t){const o=await me(e,t.storyId);await Ne(o.parent,o.name,`${JSON.stringify(t,null,2)}
|
|
2
|
-
`),await
|
|
3
|
-
`).map(i=>i.trim()).filter(i=>i.startsWith(
|
|
4
|
-
`))
|
|
1
|
+
import{execFile as Be}from"node:child_process";import{createHash as _e,randomBytes as le,timingSafeEqual as Le}from"node:crypto";import{readFile as M}from"node:fs/promises";import{join as te,resolve as Z}from"node:path";import{promisify as He}from"node:util";import{acquireGitLifecyclePhysicalIntegrationLock as G,applyGitLifecycleRuntimeOverlay as qe,computeImmutableStoryQaEvidenceDigest as Oe,computeGitLifecyclePhysicalIntegrationLockOwnerDigest as ye,computeP205StoryQaEvidenceDigest as Ce,computeLegacyDirectYoloRecoveryReceiptRef as $e,ensureRuntimeEpic as P,ensureRuntimeStory as ge,ensureGitLifecyclePrivateChildDirectory as ze,executeP205TransientAuthority as Pe,projectP205TransientExecutionEvidence as Ne,publicStoryReviewArtifactFromGit as Q,LEGACY_DIRECT_YOLO_RECOVERY_COMMITS as Ge,mutateGitLifecycleRuntime as $,P205_COMPLETE_COMMAND as Ke,readGitLifecycleRuntime as q,gitLifecycleRuntimeDirectory as Ve,assertGitLifecyclePrivateFile as we,releaseGitLifecyclePhysicalIntegrationLock as K,releaseGitLifecyclePhysicalIntegrationLockForCheckpoint as We,verifyGitLifecyclePhysicalIntegrationLock as U,verifyAcceptedGitLifecycleStoryCheckpoint as me}from"./git-lifecycle-store.js";import{anchoredAtomicWriteFile as Fe}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as Te,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as Ie,GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID as X}from"./git-lifecycle-step-ids.js";const re=He(Be);async function ct(e){try{const t=await ve(e.projectRoot,e.storyId),r=N(e.nowIso),o=Date.parse(r),i=await y(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),n=await y(t.projectRoot,["rev-parse","HEAD"]),p=await q(t.projectRoot,{required:!0}),h=w(p.epics[t.epicId]),d=w(h?.branch_lease),a=d&&Number.isFinite(Date.parse(String(d.expiresAt)))&&Date.parse(String(d.expiresAt))>o;if(a&&d?.ownerStoryId!==e.storyId)return s("direct-yolo-writer-active");let c=ue(h?.origin_binding,t.executionBranch,t.originBranch);if(i===t.executionBranch){if(!c)return s("direct-yolo-origin-binding-invalid")}else{if(i!==t.originBranch)return s("direct-yolo-current-branch-mismatch");if(c&&c.originHeadSha!==n)return s("direct-yolo-origin-binding-conflict");if(c??={schemaVersion:1,originBranch:t.originBranch,originHeadSha:n,executionBranch:t.executionBranch,capturedFromCurrentCheckout:!0,capturedAt:r},(await Ae(t.projectRoot)).some(f=>f.branch===t.executionBranch&&Z(f.path)!==t.projectRoot))return s("direct-yolo-execution-branch-checked-out-elsewhere");const m=await Y(t.projectRoot),j=`refs/heads/${t.executionBranch}`;if(await L(t.projectRoot,["show-ref","--verify","--quiet",j])){const f=await y(t.projectRoot,["rev-parse",j]);if(f!==n){if(!await L(t.projectRoot,["merge-base","--is-ancestor",f,n]))return s("direct-yolo-execution-branch-diverged");await y(t.projectRoot,["update-ref",j,n,f])}await y(t.projectRoot,["switch",t.executionBranch])}else await y(t.projectRoot,["switch","-c",t.executionBranch]);if(await Y(t.projectRoot)!==m)return s("direct-yolo-checkout-payload-raced")}const l=await y(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),u=await y(t.projectRoot,["rev-parse","HEAD"]);if(l!==t.executionBranch)return s("direct-yolo-current-branch-mismatch");if(a&&d?.ownerStoryId===e.storyId)return d.setupHeadSha!==u?s("direct-yolo-setup-lease-head-unbound"):{ok:!0,value:he(t,c,String(d.expiresAt),!0)};const v=r,x=new Date(o+3600*1e3).toISOString(),I=`setup-${le(32).toString("hex")}`,k=await q(t.projectRoot,{required:!0});return await $(t.projectRoot,S=>{const m=P(S,t.epicId),j=w(m.branch_lease);if(j&&Date.parse(String(j.expiresAt))>o&&j.ownerStoryId!==e.storyId)throw new Error("direct-yolo-writer-active");const f=ue(m.origin_binding,t.executionBranch,t.originBranch);if(m.origin_binding&&!f)throw new Error("direct-yolo-origin-binding-conflict");if(f&&JSON.stringify(f)!==JSON.stringify(c))throw new Error("direct-yolo-origin-binding-conflict");m.branch_mode="epic",m.execution_branch=t.executionBranch,m.origin_branch=t.originBranch,m.graph_revision=t.graphRevision,m.origin_binding=c,m.branch_lease={schemaVersion:1,ownerStoryId:e.storyId,sessionId:I,idempotencyKey:I,acquiredAt:v,expiresAt:x,setupHeadSha:u}},{expectedRevision:k.revision,preCommit:async()=>{if(await y(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==t.executionBranch||await y(t.projectRoot,["rev-parse","HEAD"])!==u)throw new Error("direct-yolo-setup-physical-state-raced")}}),{ok:!0,value:he(t,c,x,!1)}}catch(t){return s(J(t,"direct-yolo-setup-failed"))}}async function dt(e){let t;try{const r=await W(e.projectRoot,e.storyId),o=N(e.nowIso),i=te(r.projectRoot,".neocortex/state.json"),n=await M(i,"utf8"),p=await Y(r.projectRoot),h=await y(r.projectRoot,["rev-parse","HEAD"]),d=`refs/heads/${r.executionBranch}`,a=await q(r.projectRoot,{required:!0}),c=w(a.epics[r.epicId]),l=ue(c?.origin_binding,r.executionBranch,r.originBranch),u=w(c?.branch_lease);if(!l)return s("direct-yolo-origin-binding-invalid");if(!u||!oe(u,e.storyId,o)||u?.sessionId!==u?.idempotencyKey)return s("direct-yolo-setup-lease-invalid");const v=await G(r.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:String(u.sessionId),idempotencyKey:String(u.idempotencyKey),expiresAt:new Date(Date.now()+300*1e3).toISOString(),persistent:!1});if(!v.ok)return s(v.reasonCode);if(t=v,h!==u.setupHeadSha||!await L(r.projectRoot,["merge-base","--is-ancestor",l.originHeadSha,h])||await y(r.projectRoot,["rev-parse",d])!==h)return s("direct-yolo-setup-head-mismatch");if((await Ae(r.projectRoot)).some(f=>f.branch===r.executionBranch&&Z(f.path)!==r.projectRoot))return s("direct-yolo-execution-branch-checked-out-elsewhere");const I=w(JSON.parse(n)),k=w(w(I?.stories)?.[e.storyId]),S=w(a.stories[e.storyId]);if(!k||!["backlog","ready_to_start"].includes(String(k.status))||k.steps_completed!==void 0&&(!Array.isArray(k.steps_completed)||k.steps_completed.length>0)||k.branch_name||k.checkpoint)return s("direct-yolo-setup-story-progress-conflict");const m=S?.status==="branch-ready"&&S.last_step===X&&Array.isArray(S.steps_completed)&&S.steps_completed.length===1&&S.steps_completed[0]===X&&Object.keys(S).sort().join(",")==="last_step,status,steps_completed";if(S&&Object.keys(S).length>0&&!m)return s("direct-yolo-setup-story-progress-conflict");const j=async()=>{if(Date.parse(String(u.expiresAt))<=(e.nowIso?Date.parse(o):Date.now())||!t||!await U(t.path,t.owner)||await M(i,"utf8")!==n||await Y(r.projectRoot)!==p||await y(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch||await y(r.projectRoot,["rev-parse","HEAD"])!==h||!await L(r.projectRoot,["merge-base","--is-ancestor",l.originHeadSha,h])||await y(r.projectRoot,["rev-parse",d])!==h)throw new Error("direct-yolo-setup-physical-state-raced")};return m?await j():await $(r.projectRoot,f=>{const b=w(f.epics[r.epicId]),g=ge(f,e.storyId);if(JSON.stringify(b?.branch_lease)!==JSON.stringify(u)||JSON.stringify(b?.origin_binding)!==JSON.stringify(l)||b?.graph_revision!==r.graphRevision||Object.keys(g).length>0)throw new Error("direct-yolo-setup-runtime-raced");g.status="branch-ready",g.last_step=X,g.steps_completed=[X]},{expectedRevision:a.revision,preCommit:j}),{ok:!0,value:Object.freeze({...he(r,l,String(u.expiresAt),m),checkpointAccepted:!0,graphRevision:r.graphRevision,headSha:h})}}catch(r){return s(J(r,"direct-yolo-setup-acceptance-failed"))}finally{t&&await K(t.path,t.owner).catch(()=>{})}}async function ut(e){try{const t=await W(e.projectRoot,e.storyId),r=O(await A(t.projectRoot,["diff","--cached","--name-only","-z"])),o=F(r,t.authorizedWriteSet,e.storyId);if(!o.ok)return s(o.reasonCode);if(Q(t.projectRoot,e.storyId,":")?.verdict!=="approved")return s("direct-yolo-review-artifact-not-approved");if(O(await A(t.projectRoot,["diff","--name-only","-z"])).some(R=>r.includes(R)))return s("direct-yolo-user-overlap");const p=await A(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!p)return s("direct-yolo-staged-diff-empty");const h=D(p),d=D([...t.authorizedWriteSet].sort().join("\0")),a=N(e.nowIso),c=await q(t.projectRoot,{required:!0}),l=w(c.epics[t.epicId]?.branch_lease);if(!oe(l,e.storyId,a))return s("direct-yolo-setup-handoff-owner-invalid");const u=String(l.sessionId),v=String(l.expiresAt),x=new Date(Math.min(Date.parse(v),Date.parse(a)+300*1e3)).toISOString(),I=await V(t.projectRoot,e.storyId),k=I?.state==="issued"&&I.fromSessionId===u&&I.bundleDigest===h&&I.claimRevision===d&&Date.parse(I.expiresAt)>Date.parse(a),S=k?I.expiresAt:x,m=k?I.token:le(32).toString("base64url"),j=D(m),f=Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff",storyId:e.storyId,fromSessionId:u,tokenDigest:j,bundleDigest:h,claimRevision:d,expiresAt:S}),b=D(JSON.stringify(f)),g=await G(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:u,idempotencyKey:u,expiresAt:S,persistent:!1,createdAt:a});if(!g.ok)return s(g.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{await ie(t.projectRoot,{schemaVersion:1,kind:"direct-yolo-setup-handoff-token",state:"issued",storyId:e.storyId,fromSessionId:u,token:m,tokenDigest:j,bundleDigest:h,claimRevision:d,grantDigest:b,expiresAt:S}),await $(t.projectRoot,R=>{const E=w(P(R,t.epicId).branch_lease);if(!oe(E,e.storyId,a)||E?.sessionId!==u||E.idempotencyKey!==u)throw new Error("direct-yolo-setup-handoff-owner-raced");E.handoffGrant=f},{expectedRevision:c.revision,preCommit:async()=>{if(!await U(g.path,g.owner))throw new Error("direct-yolo-integration-lock-raced");const R=await V(t.projectRoot,e.storyId);if(!R||R.state!=="issued"||R.grantDigest!==b||R.tokenDigest!==j)throw new Error("direct-yolo-setup-handoff-token-raced")}})}finally{await K(g.path,g.owner).catch(()=>{})}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff-receipt",storyId:e.storyId,sessionId:u,bundleDigest:h,claimRevision:d,grantDigest:b,expiresAt:S,reused:k,publicSafe:!0})}}catch(t){return s(t instanceof Error&&/^direct-yolo-/.test(t.message)?t.message:"direct-yolo-setup-handoff-failed")}}async function ht(e){try{const t=await W(e.projectRoot,e.storyId),r=await y(t.projectRoot,["rev-parse","HEAD"]),o=O(await A(t.projectRoot,["diff","--cached","--name-only","-z"])),i=F(o,t.authorizedWriteSet,e.storyId);if(!i.ok)return s(i.reasonCode);const n=Q(t.projectRoot,e.storyId,":");if(n?.verdict!=="approved")return s("direct-yolo-review-artifact-not-approved");if(O(await A(t.projectRoot,["diff","--name-only","-z"])).some(f=>o.includes(f)))return s("direct-yolo-user-overlap");const h=await A(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!h)return s("direct-yolo-staged-diff-empty");const d=D(h),a=D([...t.authorizedWriteSet].sort().join("\0")),c=D(["direct-yolo-commit-v1",e.storyId,t.epicId,t.executionBranch,r,d,t.graphRevision,a].join("\0")),l=N(e.nowIso);let u=e.setupLeaseHandoff??await Ye(t.projectRoot,e.storyId,d,a,l);const v=await q(t.projectRoot,{required:!0}),x=w(v.epics[t.epicId]?.branch_lease),I=x?.ownerStoryId===e.storyId&&x.sessionId===c&&x.idempotencyKey===c&&typeof x.expiresAt=="string"&&Date.parse(x.expiresAt)>Date.parse(l)?x:void 0;if(I&&e.setupLeaseHandoff)return s("direct-yolo-setup-handoff-replayed");const k=w(I?.handoffConsumption);if(k){const f=await V(t.projectRoot,e.storyId);if(!f||!["consuming","consumed"].includes(f.state)||f.fromSessionId!==k.fromSessionId||f.tokenDigest!==k.tokenDigest||f.bundleDigest!==d||f.claimRevision!==a||k.bundleDigest!==d||k.claimRevision!==a||f.consumedBySessionId!==c||k.consumedBySessionId!==c)return s("direct-yolo-setup-handoff-consume-invalid");if(f.state==="consuming"){if(!f.token||D(f.token)!==f.tokenDigest)return s("direct-yolo-setup-handoff-consume-invalid");u={sessionId:f.fromSessionId,token:f.token}}}const S=I?String(I.expiresAt):new Date(Date.parse(l)+1800*1e3).toISOString(),m=await G(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:c,idempotencyKey:c,expiresAt:S,persistent:!0,createdAt:I&&typeof I.acquiredAt=="string"?I.acquiredAt:l});if(!m.ok)return s(m.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{u&&e.setupLeaseHandoff===void 0&&(await Je(t.projectRoot,e.storyId,u.sessionId,u.token,c,l),await e.setupHandoffFault?.("after-consuming-persisted")),await $(t.projectRoot,f=>{const b=P(f,t.epicId),g=w(b.branch_lease),R=g&&Date.parse(String(g.expiresAt))>Date.parse(l),E=g?.ownerStoryId===e.storyId&&g.sessionId===c&&g.idempotencyKey===c,C=g?.ownerStoryId===e.storyId&&g.sessionId===g.idempotencyKey&&typeof g.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(g.idempotencyKey),B=R&&C&&Ze({current:g,handoff:u,storyId:e.storyId,bundleDigest:d,claimRevision:a,nowIso:l});if(u&&R&&!E&&!B)throw new Error("direct-yolo-setup-handoff-invalid");if(R&&!E&&!B)throw new Error("direct-yolo-writer-active");const _=B?w(g?.handoffGrant):void 0,H=_?{schemaVersion:1,kind:"direct-yolo-setup-handoff-consumption",state:"consumed",storyId:e.storyId,fromSessionId:String(g?.sessionId),tokenDigest:String(_.tokenDigest),bundleDigest:d,claimRevision:a,consumedBySessionId:c,consumedAt:l}:void 0;b.branch_mode="epic",b.execution_branch=t.executionBranch,b.origin_branch=t.originBranch,b.graph_revision=t.graphRevision,b.branch_lease=R&&E?g:{schemaVersion:1,ownerStoryId:e.storyId,sessionId:c,idempotencyKey:c,acquiredAt:l,expiresAt:S,...H?{handoffConsumption:H}:{}}},{expectedRevision:v.revision,preCommit:async()=>{if(!await U(m.path,m.owner))throw new Error("direct-yolo-integration-lock-raced")}})}catch(f){throw await K(m.path,m.owner).catch(()=>{}),f}u&&e.setupLeaseHandoff===void 0&&(await e.setupHandoffFault?.("before-consumed-persist"),await Me(t.projectRoot,t.epicId,e.storyId,u.sessionId,u.token,d,a,c,l));const j=Object.freeze([`Neocortex-Story: ${e.storyId}`,`Neocortex-Epic: ${t.epicId}`,`Neocortex-Execution-Branch: ${t.executionBranch}`,`Neocortex-Prepared-Base: ${r}`,`Neocortex-Bundle-Digest: ${d}`,`Neocortex-Review-Artifact-Digest: ${n.digest}`,`Neocortex-Graph-Revision: ${t.graphRevision}`,`Neocortex-Claim-Revision: ${a}`]);return{ok:!0,value:Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:r,bundleDigest:d,reviewArtifactDigest:n.digest,graphRevision:t.graphRevision,claimRevision:a,idempotencyKey:c,changedPaths:Object.freeze(o),trailers:j})}}catch(t){return s(J(t,"direct-yolo-begin-failed"))}}async function ft(e){let t,r,o;try{const i=await W(e.projectRoot,e.storyId);t=i;const n=await y(i.projectRoot,["rev-parse","HEAD"]);let p=await q(i.projectRoot,{required:!0});const h=w(p.stories[e.storyId]?.checkpoint);if(h){const B=typeof h.headSha=="string"?h.headSha:"",_=typeof h.graphRevision=="string"?h.graphRevision:"",H=/^[a-f0-9]{40,64}$/.test(B)?O(await A(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",B])):[],z=F(H,i.authorizedWriteSet,e.storyId);if(!(/^[a-f0-9]{40,64}$/.test(B)&&await L(i.projectRoot,["merge-base","--is-ancestor",B,n]))||!/^[a-f0-9]{64}$/.test(_)||!z.ok)return s("direct-yolo-replay-invalid");const Ee=await se(e,i.projectRoot,n,_);if(!await me(i.projectRoot,h,e.storyId,i.epicId,i.executionBranch,Ee.transientAuthority,i.authorizedWriteSet))return s("direct-yolo-replay-invalid");if(!await ce(i.projectRoot,i.executionBranch,n,H))return s("direct-yolo-replay-head-raced");if(e.push&&!await ke(i.projectRoot,e.remote??"origin",i.executionBranch,B))return s("direct-yolo-remote-head-mismatch");const fe=Array.isArray(h.receiptRefs)?h.receiptRefs.find(pe=>typeof pe=="string"&&/^physical-lock-owner:[a-f0-9]{64}$/.test(pe)):void 0;return fe&&typeof h.idempotencyKey=="string"&&await We(i.projectRoot,{storyId:e.storyId,idempotencyKey:h.idempotencyKey,ownerDigest:fe.slice(20)}),{ok:!0,value:h}}const d=n,a=await y(i.projectRoot,["rev-parse",`${d}^`]),c=await A(i.projectRoot,["show","--no-patch","--format=%B",d]),l=O(await A(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",d])),u=F(l,i.authorizedWriteSet,e.storyId);if(!u.ok)return s(u.reasonCode);const v=T(c,"Neocortex-Bundle-Digest"),x=T(c,"Neocortex-Graph-Revision"),I=T(c,"Neocortex-Claim-Revision"),k=new Map([["Neocortex-Story",e.storyId],["Neocortex-Epic",i.epicId],["Neocortex-Execution-Branch",i.executionBranch],["Neocortex-Prepared-Base",a],["Neocortex-Graph-Revision",i.graphRevision],["Neocortex-Claim-Revision",D([...i.authorizedWriteSet].sort().join("\0"))]]);if(!v||!/^[a-f0-9]{64}$/.test(v)||!x||!I||[...k].some(([B,_])=>T(c,B)!==_))return s("direct-yolo-trailers-invalid");const S=Q(i.projectRoot,e.storyId,d);if(S?.verdict!=="approved")return s("direct-yolo-review-artifact-not-approved");const m=T(c,"Neocortex-Review-Artifact-Digest");if(m!==void 0&&m!==S.digest)return s("direct-yolo-review-artifact-digest-mismatch");const j=D(await A(i.projectRoot,["diff","--binary","--full-index",`${a}..${d}`]));if(v!==j)return s("direct-yolo-bundle-digest-mismatch");const f=D(["direct-yolo-commit-v1",e.storyId,i.epicId,i.executionBranch,a,v,x,I].join("\0")),b=w(p.epics[i.epicId]?.branch_lease),g=N(e.nowIso),R=b?.ownerStoryId===e.storyId&&b.idempotencyKey===f&&b.sessionId===f&&Date.parse(String(b.expiresAt))>Date.now()?b:void 0;if(b&&Date.parse(String(b.expiresAt))>Date.now()&&!R)return s("direct-yolo-writer-active");const E=R??{schemaVersion:1,ownerStoryId:e.storyId,sessionId:f,idempotencyKey:f,acquiredAt:g,expiresAt:new Date(Date.parse(g)+1800*1e3).toISOString()},C=await G(i.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:f,idempotencyKey:f,expiresAt:String(E.expiresAt),persistent:!0,createdAt:String(E.acquiredAt)});if(!C.ok)return s(C.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");o=C,R||(p=(await $(i.projectRoot,_=>{const H=P(_,i.epicId),z=w(H.branch_lease);if(z&&Date.parse(String(z.expiresAt))>Date.parse(g))throw new Error("direct-yolo-writer-active");if(H.graph_revision!==i.graphRevision)throw new Error("direct-yolo-graph-revision-raced");H.branch_lease=E},{expectedRevision:p.revision})).document),r=E;{const B=await se(e,i.projectRoot,d,i.graphRevision);if(!await ce(i.projectRoot,i.executionBranch,d,l))return s("direct-yolo-head-raced");if(e.push){const z=ee(e.remote??"origin");if(await y(i.projectRoot,["push",z,i.executionBranch]),!await be(i.projectRoot,z,i.executionBranch,d))return s("direct-yolo-remote-head-mismatch")}const _=await Re({projectRoot:i.projectRoot,storyId:e.storyId,epicId:i.epicId,executionBranch:i.executionBranch,baseSha:a,headSha:d,bundleDigest:v,graphRevision:x,claimRevision:I,idempotencyKey:f,qaExecution:B,physicalLockOwnerDigest:ye(C.owner),nowIso:N(e.nowIso),legacyReceiptRef:void 0});return await e.beforeCheckpointPersist?.(),await Se({projectRoot:i.projectRoot,checkpoint:_,remote:e.push?e.remote??"origin":void 0,expectedRevision:p.revision,expectedLease:E,expectedGraphRevision:i.graphRevision,physicalLockPath:C.path,physicalLockOwner:C.owner,transientAuthority:B.transientAuthority,authorizedWriteSet:i.authorizedWriteSet})?(await e.afterCheckpointPersist?.(),{ok:!0,value:_}):s("direct-yolo-checkpoint-persist-failed")}}catch(i){return s(J(i,"direct-yolo-finalize-failed"))}finally{o&&await K(o.path,o.owner).catch(()=>{}),t&&r?await ae(t.projectRoot,t.epicId,r).catch(()=>{}):t&&await Ue(t,e.storyId).catch(()=>{})}}async function pt(e){try{const t=await W(e.projectRoot,e.storyId);if(!/^[a-f0-9]{40,64}$/.test(e.commitSha))return s("direct-yolo-recovery-commit-invalid");const r=await y(t.projectRoot,["rev-parse",e.commitSha]);if(Ge[e.storyId]!==r)return s("direct-yolo-recovery-not-allowlisted");if(await y(t.projectRoot,["rev-parse","HEAD"])!==r)return s("direct-yolo-recovery-head-mismatch");await y(t.projectRoot,["merge-base","--is-ancestor",r,`refs/heads/${t.executionBranch}`]);const o=await y(t.projectRoot,["rev-parse",`${r}^`]),i=await A(t.projectRoot,["diff","--binary","--full-index",`${o}..${r}`]),n=O(await A(t.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",r]));if(!F(n,t.authorizedWriteSet.length>0?t.authorizedWriteSet:n,e.storyId).ok)return s("direct-yolo-recovery-write-set-invalid");const h=D(i),d=D([...n].sort().join("\0")),a=D(["legacy-direct-yolo-recovery-v1",e.storyId,r].join("\0")),c=N(e.nowIso),l=new Date(Date.parse(c)+1800*1e3).toISOString(),u=await q(t.projectRoot,{required:!0}),v=await G(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:a,idempotencyKey:a,expiresAt:l,persistent:!0,createdAt:c});if(!v.ok)return s(v.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-recovery-integration-backpressure":"direct-yolo-recovery-integration-lock-failed");const x={schemaVersion:1,ownerStoryId:e.storyId,sessionId:a,idempotencyKey:a,acquiredAt:c,expiresAt:l};let I=!1;try{const k=await $(t.projectRoot,g=>{const R=P(g,t.epicId),E=w(R.branch_lease);if(E&&Date.parse(String(E.expiresAt))>Date.parse(c)&&!ne(E,x))throw new Error("direct-yolo-recovery-writer-active");if(R.graph_revision!==t.graphRevision)throw new Error("direct-yolo-recovery-graph-raced");R.branch_mode="epic",R.execution_branch=t.executionBranch,R.origin_branch=t.originBranch,R.branch_lease=x},{expectedRevision:u.revision});I=!0;const S=await se(e,t.projectRoot,r,t.graphRevision);if(!await ce(t.projectRoot,t.executionBranch,r,n))return s("direct-yolo-recovery-head-raced");if(e.push){const g=ee(e.remote??"origin"),R=(await y(t.projectRoot,["ls-remote","--heads",g,`refs/heads/${t.executionBranch}`])).split(/\s+/)[0];if(!R||!await L(t.projectRoot,["merge-base","--is-ancestor",r,R]))return s("direct-yolo-recovery-remote-proof-missing")}const m=await Re({projectRoot:t.projectRoot,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:h,graphRevision:t.graphRevision,claimRevision:d,idempotencyKey:a,qaExecution:S,physicalLockOwnerDigest:ye(v.owner),nowIso:c,legacyReceiptRef:void 0}),j=await $e(t.projectRoot,{storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:h,graphRevision:t.graphRevision});if(!j)return s("direct-yolo-recovery-evidence-invalid");const f=Object.freeze({...m,receiptRefs:Object.freeze([...m.receiptRefs,j])});return await Se({projectRoot:t.projectRoot,checkpoint:f,remote:e.push?e.remote??"origin":void 0,remotePolicy:"ancestor-recovery",expectedRevision:k.document.revision,expectedLease:x,expectedGraphRevision:t.graphRevision,physicalLockPath:v.path,physicalLockOwner:v.owner,transientAuthority:S.transientAuthority,authorizedWriteSet:t.authorizedWriteSet})?{ok:!0,value:f}:s("direct-yolo-recovery-persist-failed")}finally{await K(v.path,v.owner).catch(()=>{}),I&&await ae(t.projectRoot,t.epicId,x).catch(()=>{})}}catch(t){return s(J(t,"direct-yolo-recovery-failed"))}}async function ve(e,t){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t))throw new Error("direct-yolo-story-id-invalid");const r=Z(e),o=w(JSON.parse(await M(te(r,".neocortex/state.json"),"utf8"))),i=await q(r,{required:!0}),n=qe(o,i),p=w(n.stories),h=w(n.epics),d=w(p?.[t]),a=String(d?.epic_id??t.split(".")[0]),c=w(h?.[a]),l=String(c?.execution_branch??""),u=String(c?.origin_branch??""),v=String(c?.graph_revision??""),x=Array.isArray(d?.files_to_modify)?[...new Set(d.files_to_modify.filter(I=>typeof I=="string"&&de(I)))].sort():[];if(!d)throw new Error("direct-yolo-story-state-missing");if(c?.branch_mode!=="epic")throw new Error("direct-yolo-branch-mode-invalid");if(!je(l)||!await L(r,["check-ref-format","--branch",l]))throw new Error("direct-yolo-execution-branch-invalid");if(!je(u)||!await L(r,["check-ref-format","--branch",u]))throw new Error("direct-yolo-origin-branch-invalid");if(!/^[a-f0-9]{64}$/.test(v))throw new Error("direct-yolo-graph-revision-invalid");return{projectRoot:r,storyId:t,story:d,epicId:a,executionBranch:l,originBranch:u,graphRevision:v,authorizedWriteSet:x}}async function W(e,t){const r=await ve(e,t);if(await y(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch)throw new Error("direct-yolo-current-branch-mismatch");return r}async function Re(e){const t=e.nowIso,r=await A(e.projectRoot,["show","--no-patch","--format=%H%n%P%n%B",e.headSha]),o=O(await A(e.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha])),i=Oe({storyId:e.storyId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,commitBody:r,changedPaths:o}),n=Ce({gitEvidenceDigest:i,headSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest}),p=`story-qa:${n}`,h=Object.freeze({schemaVersion:1,kind:"story_qa_evidence",producer:"local-yolo-tdd",evidenceVersion:"p205-execution-v2",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,contract:e.qaExecution.contract,command:e.qaExecution.command,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest,sourceEvidenceDigest:n,verdict:"passed",checkedAt:t,receiptRef:p}),d=Q(e.projectRoot,e.storyId,e.headSha);if(d?.verdict!=="approved")throw new Error("direct-yolo-review-artifact-not-approved");const a=D(["root-commit-range-review-v2",e.storyId,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,p,D(r),[...o].sort().join(","),d.digest].join("\0")),c=`story-review:${a}`,l=Object.freeze({schemaVersion:1,kind:"story_review_evidence",producer:"root-commit-range-review",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,sourceEvidenceDigest:a,reviewArtifactDigest:d.digest,qaReceiptRef:p,verdict:"approved",reviewedAt:t,receiptRef:c}),u=[`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,p,c,...e.physicalLockOwnerDigest?[`physical-lock-owner:${e.physicalLockOwnerDigest}`]:[],...e.legacyReceiptRef?[e.legacyReceiptRef]:[]];return Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:e.epicId,branch:e.executionBranch,baseSha:e.baseSha,headSha:e.headSha,commits:Object.freeze([e.headSha]),idempotencyKey:e.idempotencyKey,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,claimRevision:e.claimRevision,receiptRefs:Object.freeze(u),qaVerdict:"passed",reviewVerdict:"approved",qaReceipt:h,reviewReceipt:l,recordedAt:t})}async function Se(e){const{projectRoot:t,checkpoint:r,remote:o}=e;let i=!1;return await $(t,n=>{const p=P(n,r.epicId);if(e.expectedLease){const c=w(p.branch_lease);if(!ne(c,e.expectedLease))throw new Error("direct-yolo-runtime-revision-conflict");if(Date.parse(String(c?.expiresAt))<=Date.now())throw new Error("direct-yolo-writer-lease-expired");if(p.graph_revision!==e.expectedGraphRevision||r.graphRevision!==e.expectedGraphRevision)throw new Error("direct-yolo-graph-revision-raced")}const h=ge(n,r.storyId),d=w(h.checkpoint);if(d&&d.headSha!==r.headSha){i=!0;return}h.checkpoint=r,h.status="done",h.last_step=Ie;const a=Array.isArray(h.steps_completed)?h.steps_completed.filter(c=>typeof c=="string"):[];h.steps_completed=[...new Set([...a,Te,Ie])],p.branch_lease=null},{expectedRevision:e.expectedRevision,preCommit:async()=>{if(i)throw new Error("direct-yolo-checkpoint-conflict");if(await y(t,["symbolic-ref","--quiet","--short","HEAD"])!==r.branch||await y(t,["rev-parse","HEAD"])!==r.headSha)throw new Error("direct-yolo-checkpoint-head-raced");if(!await me(t,r,r.storyId,r.epicId,r.branch,e.transientAuthority,e.authorizedWriteSet))throw new Error("direct-yolo-checkpoint-physical-invalid");if(e.physicalLockPath&&e.physicalLockOwner&&!await U(e.physicalLockPath,e.physicalLockOwner))throw new Error("direct-yolo-integration-lock-raced");if(o&&!(e.remotePolicy==="ancestor-recovery"?await ke(t,o,r.branch,r.headSha):await be(t,o,r.branch,r.headSha)))throw new Error("direct-yolo-checkpoint-remote-raced")}}),!i}async function ke(e,t,r,o){const i=ee(t),n=(await y(e,["ls-remote","--heads",i,`refs/heads/${r}`])).split(/\s+/)[0];return!!(n&&await L(e,["merge-base","--is-ancestor",o,n]))}function oe(e,t,r){return!!(e?.ownerStoryId===t&&e.sessionId===e.idempotencyKey&&typeof e.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(e.idempotencyKey)&&typeof e.expiresAt=="string"&&Date.parse(e.expiresAt)>Date.parse(r))}async function xe(e,t){const r=await Ve(e),o=await ze(r,"handoffs"),i=`direct-${D(t)}.json`;return{parent:o,name:i,path:te(o,i)}}async function ie(e,t){const r=await xe(e,t.storyId);await Fe(r.parent,r.name,`${JSON.stringify(t,null,2)}
|
|
2
|
+
`),await we(r.path,r.parent)}async function V(e,t){try{const r=await xe(e,t);await we(r.path,r.parent);const o=JSON.parse(await M(r.path,"utf8")),i=o.state==="issued"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt"]:o.state==="consuming"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt","consumedBySessionId","consumeStartedAt"]:["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt","consumedBySessionId","consumedAt"];return Object.keys(o).sort().join("\0")!==[...i].sort().join("\0")||o.schemaVersion!==1||o.kind!=="direct-yolo-setup-handoff-token"||o.state!=="issued"&&o.state!=="consuming"&&o.state!=="consumed"||o.storyId!==t||typeof o.fromSessionId!="string"||!/^setup-[a-f0-9]{64}$/.test(o.fromSessionId)||![o.tokenDigest,o.bundleDigest,o.claimRevision,o.grantDigest].every(n=>typeof n=="string"&&/^[a-f0-9]{64}$/.test(n))||typeof o.expiresAt!="string"||!Number.isFinite(Date.parse(o.expiresAt))||(o.state==="issued"||o.state==="consuming")&&(typeof o.token!="string"||!/^[A-Za-z0-9_-]{32,256}$/.test(o.token))||o.state==="consuming"&&(typeof o.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(o.consumedBySessionId)||typeof o.consumeStartedAt!="string"||!Number.isFinite(Date.parse(o.consumeStartedAt)))||o.state==="consumed"&&(typeof o.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(o.consumedBySessionId)||typeof o.consumedAt!="string"||!Number.isFinite(Date.parse(o.consumedAt)))?void 0:o}catch{return}}async function Ye(e,t,r,o,i){const n=await V(e,t);if(!(!n||n.state==="consumed"||!n.token||n.bundleDigest!==r||n.claimRevision!==o||Date.parse(n.expiresAt)<=Date.parse(i)||D(n.token)!==n.tokenDigest))return{sessionId:n.fromSessionId,token:n.token}}async function Je(e,t,r,o,i,n){const p=await V(e,t);if(!p||p.state==="consumed"||p.fromSessionId!==r||p.token!==o||p.tokenDigest!==D(o))throw new Error("direct-yolo-setup-handoff-consume-invalid");if(p.state==="consuming"){if(p.consumedBySessionId!==i)throw new Error("direct-yolo-setup-handoff-consume-raced");return}await ie(e,{...p,state:"consuming",consumedBySessionId:i,consumeStartedAt:n})}async function Me(e,t,r,o,i,n,p,h,d){const a=await V(e,r);if(a?.state==="consumed"&&a.fromSessionId===o&&a.consumedBySessionId===h)return;const c=await q(e,{required:!0}),l=w(c.epics[t]?.branch_lease),u=w(l?.handoffConsumption);if(!a||a.state!=="consuming"||a.fromSessionId!==o||a.token!==i||a.tokenDigest!==D(i)||a.bundleDigest!==n||a.claimRevision!==p||a.consumedBySessionId!==h||l?.ownerStoryId!==r||l.sessionId!==h||u?.kind!=="direct-yolo-setup-handoff-consumption"||u.state!=="consumed"||u.fromSessionId!==o||u.tokenDigest!==a.tokenDigest||u.bundleDigest!==n||u.claimRevision!==p||u.consumedBySessionId!==h)throw new Error("direct-yolo-setup-handoff-consume-invalid");try{await ie(e,{schemaVersion:1,kind:a.kind,state:"consumed",storyId:r,fromSessionId:o,tokenDigest:a.tokenDigest,bundleDigest:a.bundleDigest,claimRevision:a.claimRevision,grantDigest:a.grantDigest,expiresAt:a.expiresAt,consumedBySessionId:h,consumedAt:d})}catch{throw new Error("direct-yolo-setup-handoff-consume-persist-failed")}}function Ze(e){const t=w(e.current?.handoffGrant),r=e.handoff?.token,o=typeof r=="string"&&/^[A-Za-z0-9_-]{32,256}$/.test(r)?D(r):void 0;return!!(t&&o&&e.handoff&&e.handoff.sessionId===e.current?.sessionId&&t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff"&&t.storyId===e.storyId&&t.fromSessionId===e.current?.sessionId&&t.bundleDigest===e.bundleDigest&&t.claimRevision===e.claimRevision&&typeof t.expiresAt=="string"&&Date.parse(t.expiresAt)>Date.parse(e.nowIso)&&typeof t.tokenDigest=="string"&&/^[a-f0-9]{64}$/.test(t.tokenDigest)&&Qe(t.tokenDigest,o))}function Qe(e,t){const r=Buffer.from(e,"hex"),o=Buffer.from(t,"hex");return r.length===32&&o.length===32&&Le(r,o)}function ne(e,t){return!!(e&&["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt"].every(r=>e[r]===t[r]))}async function ae(e,t,r){await $(e,o=>{const i=P(o,t),n=w(i.branch_lease);ne(n,r)&&(i.branch_lease=null)})}async function Ue(e,t){const r=await q(e.projectRoot,{required:!0}),o=w(r.epics[e.epicId]?.branch_lease);if(!o||o.ownerStoryId!==t||!De(o.sessionId)||!De(o.idempotencyKey)||!Number.isFinite(Date.parse(String(o.acquiredAt)))||!Number.isFinite(Date.parse(String(o.expiresAt))))return;const i=await G(e.projectRoot,{kind:"direct",storyId:t,sessionId:String(o.sessionId),idempotencyKey:String(o.idempotencyKey),createdAt:String(o.acquiredAt),expiresAt:String(o.expiresAt),persistent:!0});if(!i.ok)return;await K(i.path,i.owner)&&await ae(e.projectRoot,e.epicId,o)}async function se(e,t,r,o){const i=await Pe(t,{headSha:r,graphRevision:o,nowIso:e.nowIso});await e.qaRunner?.({projectRoot:t,storyId:e.storyId,headSha:r});const n=Ne(i);if(!n)throw new Error("p205-transient-authority-invalid");return{contract:"P205-CI-02",command:Ke,manifestDigest:n.manifestDigest,gateIds:n.gateIds,resultDigest:n.resultDigest,transientAuthority:i}}async function ce(e,t,r,o){return await y(e,["rev-parse","HEAD"])!==r||await y(e,["symbolic-ref","--quiet","--short","HEAD"])!==t||!await L(e,["diff","--cached","--quiet"])?!1:L(e,["diff","--quiet","HEAD","--",...o])}async function be(e,t,r,o){const i=ee(t);return(await y(e,["ls-remote","--heads",i,`refs/heads/${r}`])).split(/\s+/)[0]===o}function F(e,t,r){if(e.length===0||e.some(i=>!de(i)))return{ok:!1,reasonCode:"direct-yolo-write-set-invalid"};const o=[".neocortex/state.json",`docs/stories/${r}.story.md`,`.neocortex/stories/${r}/qa-gate-result.json`,`.neocortex/stories/${r}/validation-evidence.md`,`.neocortex/stories/${r}/review.md`];return!o.every(i=>e.includes(i))||!o.every(i=>t.includes(i))?{ok:!1,reasonCode:"direct-yolo-write-set-invalid"}:e.some(i=>!t.includes(i))?{ok:!1,reasonCode:"direct-yolo-write-set-unauthorized"}:{ok:!0}}function de(e){return e.length>0&&e.length<=1024&&!e.startsWith("/")&&!e.includes("\\")&&!e.split("/").includes("..")&&!e.startsWith(".git/")&&!e.includes("\0")}function De(e){return typeof e=="string"&&e.length>0&&e.length<=512&&/^[A-Za-z0-9._:@/+\-=]+$/.test(e)}function je(e){return e.length>0&&e.length<=240&&!e.startsWith("-")&&!/[\s~^:?*[\\]/.test(e)&&!e.includes("..")}function ee(e){if(!/^[A-Za-z0-9._-]{1,128}$/.test(e))throw new Error("direct-yolo-remote-invalid");return e}function T(e,t){const r=`${t}: `,o=e.split(`
|
|
3
|
+
`).map(i=>i.trim()).filter(i=>i.startsWith(r)).map(i=>i.slice(r.length));return o.length===1?o[0]:void 0}function D(e){return _e("sha256").update(e).digest("hex")}function O(e){return e.split("\0").filter(Boolean)}function N(e){return e&&Number.isFinite(Date.parse(e))?new Date(Date.parse(e)).toISOString():new Date().toISOString()}function w(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function ue(e,t,r){const o=w(e);if(!(!o||o.schemaVersion!==1||o.originBranch!==r||o.executionBranch!==t||o.capturedFromCurrentCheckout!==!0||typeof o.originHeadSha!="string"||!/^[a-f0-9]{40,64}$/.test(o.originHeadSha)||typeof o.capturedAt!="string"||!Number.isFinite(Date.parse(o.capturedAt))))return o}function he(e,t,r,o){return Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-receipt",storyId:e.storyId,epicId:e.epicId,executionBranch:e.executionBranch,originBranch:e.originBranch,originHeadSha:t.originHeadSha,leaseExpiresAt:r,reused:o,publicSafe:!0})}async function Y(e){const t=O(await A(e,["ls-files","--others","--exclude-standard","-z"])).sort(),r=await Promise.all(t.map(async o=>{if(!de(o))throw new Error("direct-yolo-checkout-payload-invalid");return`${o}\0${await y(e,["hash-object","--no-filters","--",o])}`}));return D([await A(e,["diff","--cached","--binary","--full-index"]),await A(e,["diff","--binary","--full-index"]),await A(e,["status","--porcelain=v1","-z","--untracked-files=all"]),...r].join("\0"))}async function lt(e){const t=Z(e),r=await y(t,["rev-parse","HEAD"]),o=await y(t,["symbolic-ref","--quiet","--short","HEAD"]),i=await Y(t);if(await y(t,["rev-parse","HEAD"])!==r||await y(t,["symbolic-ref","--quiet","--short","HEAD"])!==o)throw new Error("direct-yolo-checkout-observation-raced");return Object.freeze({headSha:r,branch:o,payloadDigest:i})}async function Ae(e){const t=[];let r;for(const o of(await A(e,["worktree","list","--porcelain"])).split(`
|
|
4
|
+
`))o.startsWith("worktree ")?(r={path:o.slice(9)},t.push(r)):r&&o.startsWith("branch refs/heads/")&&(r.branch=o.slice(18));return t}function J(e,t){return e instanceof Error&&e.message==="git-lifecycle-runtime-revision-conflict"?"direct-yolo-runtime-revision-conflict":e instanceof Error&&/^direct-yolo-[a-z0-9-]+$/.test(e.message)?e.message:t}function s(e){return{ok:!1,reasonCode:e}}async function y(e,t){return String((await re("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout).trim()}async function A(e,t){return String((await re("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout)}async function L(e,t){try{return await re("git",[...t],{cwd:e,maxBuffer:8*1024*1024}),!0}catch{return!1}}export{dt as acceptDirectYoloSetupCheckpoint,ht as beginDirectYoloStoryCommit,lt as captureDirectYoloCheckoutEvidence,ft as finalizeDirectYoloStoryCheckpoint,ut as issueDirectYoloSetupLeaseHandoff,ct as prepareDirectYoloSetup,pt as recoverLegacyDirectYoloStoryCheckpoint};
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
export declare const GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID: string;
|
|
2
|
+
export declare const GIT_LIFECYCLE_UPDATE_PROJECT_MEMORY_STEP_ID: string;
|
|
2
3
|
export declare const GIT_LIFECYCLE_REVIEW_PR_STEP_ID: string;
|
|
4
|
+
export declare const GIT_LIFECYCLE_MERGE_PR_STEP_ID: string;
|
|
5
|
+
export declare const GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID: string;
|
|
6
|
+
export declare const GIT_LIFECYCLE_SYNC_MAIN_STEP_ID: string;
|
|
7
|
+
export declare const GIT_LIFECYCLE_CREATE_PR_STEP_ID: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function _(
|
|
1
|
+
function _(E,I,t){return["step",E,I,...t].join("-")}const c=_("c","08",["commit","push"]),e=_("c","07",["update","project","memory"]),o=_("c","11",["review","pr"]),C=_("c","12",["merge","pr"]),T=_("c","01",["setup","branch"]),r=_("c","09",["sync","main"]),p=_("c","10",["create","pr"]);export{c as GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID,p as GIT_LIFECYCLE_CREATE_PR_STEP_ID,C as GIT_LIFECYCLE_MERGE_PR_STEP_ID,o as GIT_LIFECYCLE_REVIEW_PR_STEP_ID,T as GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID,r as GIT_LIFECYCLE_SYNC_MAIN_STEP_ID,e as GIT_LIFECYCLE_UPDATE_PROJECT_MEMORY_STEP_ID};
|
|
@@ -212,6 +212,22 @@ export declare function computeP205StoryQaEvidenceDigest(input: {
|
|
|
212
212
|
readonly gateIds: readonly string[];
|
|
213
213
|
readonly resultDigest: string;
|
|
214
214
|
}): string;
|
|
215
|
+
/** Read public review evidence from Git, never from the mutable worktree. */
|
|
216
|
+
export declare function publicStoryReviewArtifactFromGit(projectRoot: string, storyId: string, revision: ':' | string, allowLegacyDecision?: boolean): {
|
|
217
|
+
readonly verdict: 'approved' | 'pending' | 'changes-requested';
|
|
218
|
+
readonly digest: string;
|
|
219
|
+
} | undefined;
|
|
220
|
+
/** Binds a later root approval to the exact immutable range of a legacy checkpoint. */
|
|
221
|
+
export declare function computeHistoricalReviewReconciliationDigest(input: {
|
|
222
|
+
readonly storyId: string;
|
|
223
|
+
readonly epicId: string;
|
|
224
|
+
readonly checkpointHeadSha: string;
|
|
225
|
+
readonly approvalCommitSha: string;
|
|
226
|
+
readonly approvalArtifactDigest: string;
|
|
227
|
+
readonly qaReceiptRef: string;
|
|
228
|
+
readonly reviewReceiptRef: string;
|
|
229
|
+
readonly approvalCommitBody: string;
|
|
230
|
+
}): string;
|
|
215
231
|
/**
|
|
216
232
|
* Bounded migration evidence for direct-*yolo commits created before canonical
|
|
217
233
|
* trailers were mandatory. The receipt is derived only from immutable commit
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import{execFile as oi,execFileSync as ne}from"node:child_process";import{createHash as S,randomBytes as be}from"node:crypto";import{lstat as we,open as si,readFile as M,realpath as U,stat as di}from"node:fs/promises";import{existsSync as z,lstatSync as Pe,readFileSync as Ne,realpathSync as ve}from"node:fs";import{basename as A,dirname as K,isAbsolute as ae,join as v,relative as fi,resolve as y}from"node:path";import{promisify as ui}from"node:util";import{publicWriteSet as gi}from"../../../shared/dist/yoloop/public-story-write-set.js";import{resolveBranchUnit as hi}from"../../../shared/dist/yoloop/branch-unit.js";import{anchoredAtomicWriteFile as li,anchoredCreateOwnedDirectory as Be,anchoredEnsureDirectory as $e,anchoredExecuteGit as pi,anchoredExecuteNode as Ve,anchoredRemoveDirectory as mi,anchoredRenameDirectory as te}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as yi,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as bi}from"./git-lifecycle-step-ids.js";const N=ui(oi),fe="neocortex-yoloop",ue="runtime.json",L="node scripts/test-root.mjs --gate complete",Le=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),wi=Object.freeze({"P174.03.811759":Object.freeze({baseSha:"749c8fc732deaf26c81a8e08cc94b83c8cf0f5ba",headSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",commitBodyDigest:"b4fc759a49765fd8c0b3d0f5d1c333c2a4bf28d324e83eedabb12f9530df3738",changedPathsDigest:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",qaDigest:"f1100775e21f5d0d990f77303a2a06d936908f016983e32a63316d81aee6b9fc",reviewDigest:"50400bbcddb6f02408837cf99077de5d3af8c84822ab23a8b5499c338af7103a"}),"P174.03.685003":Object.freeze({baseSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",headSha:"272a7fee89e4b9324d35701df1c83b671fa96299",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",commitBodyDigest:"e97966e26ce3ba31d5951b9fdac67808c88c1fd8be7ec1e73982f3f1cc7ffd81",changedPathsDigest:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",qaDigest:"7439329a93321f39fb6b0de0a41c22e58373a399f9048e362dff4ffa6f1a7d89",reviewDigest:"1b2d12262e84acf9da7d06149a0effb11274ebdc986affbfd47635b855ec7135"}),"P174.03.029264":Object.freeze({baseSha:"272a7fee89e4b9324d35701df1c83b671fa96299",headSha:"339141be7339a0edf55710cbccb6e6558f514792",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",commitBodyDigest:"0f269a00dcd168a6f548ff10dfa667b193c948ac9c7211f5cb11a0561757c371",changedPathsDigest:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",qaDigest:"ef0fd2c6e216557825cd8521ccb2f9960a3af48f18e7a5ada441bee8bfda400b",reviewDigest:"372d0f4a2f32978c8b39f20167637b3917187edb75d49875e93200c4c5a19d0d"}),"P174.03.913359":Object.freeze({baseSha:"339141be7339a0edf55710cbccb6e6558f514792",headSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",commitBodyDigest:"89a6653197509e75246a758d2706876b337770571a1cac47d9d85ec96c196459",changedPathsDigest:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",qaDigest:"c7d3762ad30e4f9356243df17a1dd7123cbf1b660808d68176f44d1cd5da6449",reviewDigest:"e4ecf577e174fd66f31aa4a0113ab672ced16b12ee531f6831aa533795145ba1"}),"P174.03.724350":Object.freeze({baseSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",headSha:"568e9464fb086304146b9eb4594281f91302aef1",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",commitBodyDigest:"b3032338bfcd6c9dc460e9426220a1966dedeff9968c4064fdd36a315560721b",changedPathsDigest:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",qaDigest:"91f2f5b00935b1b04bb5d400df500cbc97c412072078b713c6e5ba8fda669bd0",reviewDigest:"9bc92069d3b3a76cc8b02d339d432690258be1376464b69e152ed8fd3d682f05"}),"P174.03.011976":Object.freeze({baseSha:"568e9464fb086304146b9eb4594281f91302aef1",headSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",commitBodyDigest:"b8a28392fac663dd614b695a49c894b7cab116d45722a42850e3b24e2aaf36f4",changedPathsDigest:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",qaDigest:"6eb4459a7d80c4a268fc931297e8156ed2a320584f8775f0787d91b42c0929d4",reviewDigest:"98b21de29f7cceeec73da19000c6c144395cce6eb699c6a82dfab505d4ab7b44"}),"P174.03.686659":Object.freeze({baseSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",headSha:"0db3681a5dad4e25ce37d967c636eb9d54915556",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",commitBodyDigest:"143257f4018ad773afc0c7280bd8aab8786851a9c20b65f8110881ff54656839",changedPathsDigest:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",qaDigest:"6303dbf473e2815a3671aeb2c25528d8daba484b92a5a40d1eea5215e1f6763e",reviewDigest:"1bd6695846ed9340c8677cfa9b573880532187aeee487efaaa70577a0c94e7f2"})}),Se="neocortex-yoloop-runtime.json",vi="runtime.lock",je=new WeakMap;async function yt(i,e){return(await Si(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 Si(i,e){const t=[...new Set(e.graphRevisions)];if(!_(e.headSha)||t.length===0||t.some(R=>!l(R)))throw new Error("p205-transient-binding-invalid");const r=e.anchoredWorkspace;if(r&&y(i)!==v(y(r.parent),r.name))throw new Error("p205-transient-anchor-binding-invalid");const n=async R=>r?(await pi(r.parent,r.name,r.identity,R)).toString("utf8"):String((await N("git",[...R],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout),a=async()=>r?JSON.parse((await Ve(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(v(i,"config","release-gates.v2.json"),"utf8"),runner:await M(v(i,"scripts","test-root.mjs"),"utf8")};if((await n(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-mismatch");const{manifest:o,runner:h}=await a(),[c,f]=await Promise.all([n(["show",`${e.headSha}:config/release-gates.v2.json`]),n(["show",`${e.headSha}:scripts/test-root.mjs`])]);if(o!==c||h!==f)throw new Error("p205-transient-producer-dirty");const u=JSON.parse(o),p=Array.isArray(u.requiredCompleteClasses)?u.requiredCompleteClasses.filter(R=>typeof R=="string"&&/^[a-z0-9-]+$/.test(R)):[];if(u.contract!=="P205-CI-02"||p.length===0)throw new Error("p205-transient-manifest-invalid");const g=r?(await Ve(r.parent,r.name,r.identity,["scripts/test-root.mjs","--gate","complete"])).toString("utf8"):String((await N(process.execPath,["scripts/test-root.mjs","--gate","complete"],{cwd:i,encoding:"utf8",maxBuffer:64*1024*1024})).stdout),{manifest:m,runner:$}=await a();if(m!==o||$!==h)throw new Error("p205-transient-producer-raced");if((await n(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-raced");const I=S("sha256").update(o).digest("hex"),X=S("sha256").update(g).digest("hex"),w=oe(e.nowIso??new Date().toISOString()),b=new Map,T=Object.freeze(p);for(const R of t){const V=S("sha256").update(["p205-transient-execution-v1",L,e.headSha,R,I,p.join(","),X,w].join("\0")).digest("hex"),q=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:L,executionHeadSha:e.headSha,graphRevision:R,manifestDigest:I,gateIds:T,resultDigest:X,executedAt:w,executionEvidenceDigest:V}),ee=Object.freeze(Object.create(null));je.set(ee,q),b.set(R,ee)}return b}async function De(i,e={}){const t=await Ni(i);return Ue(t,e)}function Di(i,e={}){let t;try{const r=ne("git",["rev-parse","--git-common-dir"],{cwd:i,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=ve(i),a=ae(r)?y(r):y(n,r),s=ve(a);if(s!==a)throw new Error("git-lifecycle-common-dir-symlink");qi(s);const o=v(s,fe),h=v(o,ue);if(z(o)&&(Ze(o,"directory"),ve(o)!==o))throw new Error("git-lifecycle-runtime-directory-symlink");t=z(h)?h:v(s,Se)}catch{if(e.required)throw new Error("git-lifecycle-common-dir-invalid");return Ie()}if(!z(t)){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ie()}return Ze(t,"file"),Ee(JSON.parse(Ne(t,"utf8")))}async function bt(i){try{await De(i,{required:!0});return}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-missing")throw e}try{await ze(i,()=>{},{expectedRevision:0})}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-revision-conflict")throw e;await De(i,{required:!0})}}function qe(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 wt(i,e,t=new Date().toISOString()){if(!tt(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=v(y(i),".neocortex","state.json"),n=await M(r,"utf8"),a=d(JSON.parse(n));if(!a)throw new Error("git-lifecycle-tracked-state-invalid");const s=await De(i),o=xi(a,s),h=d(d(o.epics)?.[e.epicId]),c=d(d(o.stories)?.[e.storyId]);if(!h)throw new Error("git-lifecycle-graph-authority-epic-invalid");if(!c||String(c.epic_id??e.storyId.split(".")[0])!==e.epicId)throw new Error("git-lifecycle-graph-authority-story-invalid");const f=Array.isArray(h.stories)?h.stories.filter(w=>typeof w=="string"):Object.keys(d(o.stories)??{}).filter(w=>{const b=d(d(o.stories)?.[w]);return String(b?.epic_id??w.split(".")[0])===e.epicId});if(Array.isArray(h.stories)&&!f.includes(e.storyId))throw new Error("git-lifecycle-graph-authority-story-invalid");const u=f.map(w=>{const b=d(d(o.stories)?.[w])??{};return{id:w,branch_name:typeof b.branch_name=="string"||b.branch_name===null?b.branch_name:void 0,pr_number:typeof b.pr_number=="number"||b.pr_number===null?b.pr_number:void 0,steps_completed:Array.isArray(b.steps_completed)?b.steps_completed.filter(T=>typeof T=="string"):[],checkpoint:d(b.checkpoint)}}),p=hi({...h,id:e.epicId},u);if(p.mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-invalid");if(p.executionBranch!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-mismatch");if(p.originBranch!==void 0&&p.originBranch!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");const g=typeof d(s.epics[e.epicId])?.origin_branch=="string"?String(d(s.epics[e.epicId]).origin_branch):void 0;if(g!==void 0&&g!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");if(p.originBranch===void 0&&g===void 0){const{stdout:w}=await N("git",["branch","--show-current"],{cwd:i,encoding:"utf8",maxBuffer:1048576});if(String(w).trim()!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-physical-mismatch")}const m=typeof h.graph_revision=="string"?h.graph_revision:void 0,$=typeof d(s.epics[e.epicId])?.graph_revision=="string"?String(d(s.epics[e.epicId]).graph_revision):void 0;if(m!==void 0&&!l(m))throw new Error("git-lifecycle-graph-revision-invalid");if(m===e.graphRevision&&$===e.graphRevision&&p.originBranch===e.originBranch&&g===e.originBranch)return{applied:!1,reused:!0,revision:s.revision,graphRevision:e.graphRevision};const O=Date.parse(t);if(!Number.isFinite(O))throw new Error("git-lifecycle-graph-authority-time-invalid");const I=d(h.branch_lease);if(I&&Number.isFinite(Date.parse(String(I.expiresAt)))&&Date.parse(String(I.expiresAt))>O&&!qe(I,e.storyId,O))throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await ze(i,w=>{const b=Ei(w,e.epicId);if(b.branch_mode!==void 0&&b.branch_mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-raced");const T=b.execution_branch;if(T!==void 0&&T!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const R=b.origin_branch;if(R!==void 0&&R!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-raced");const V=b.graph_revision;if(V!==void 0&&V!==m)throw new Error("git-lifecycle-graph-authority-epoch-raced");const q=d(b.branch_lease);if(q&&Number.isFinite(Date.parse(String(q.expiresAt)))&&Date.parse(String(q.expiresAt))>O&&!qe(q,e.storyId,O))throw new Error("git-lifecycle-graph-authority-writer-active");b.branch_mode="epic",b.execution_branch=e.executionBranch,b.origin_branch=e.originBranch,b.graph_revision=e.graphRevision},{expectedRevision:s.revision,preCommit:async()=>{if(await M(r,"utf8")!==n)throw new Error("git-lifecycle-graph-authority-tracked-state-raced")}})).document.revision,graphRevision:e.graphRevision}}async function ze(i,e,t={}){const r=await xe(i),n=await Qe(r),a=v(n,vi),s=await nt(a);try{const o=v(n,ue),h=v(r,Se),c=await Ue(z(o)?o:h);if(t.expectedRevision!==void 0&&t.expectedRevision!==c.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const f=structuredClone(c),u=e(f),p=Ee({...f,schemaVersion:1,revision:c.revision+1});return await t.preCommit?.(p),await H(n,"directory"),await Li(o),await li(n,ue,`${JSON.stringify(p,null,2)}
|
|
2
|
-
`),await
|
|
3
|
-
`).map(F=>F.trim())),T=[`Neocortex-Story: ${t}`,`Neocortex-Epic: ${r}`,`Neocortex-Execution-Branch: ${n}`,`Neocortex-Bundle-Digest: ${String(f.bundleDigest)}`,`Neocortex-Graph-Revision: ${String(f.graphRevision)}`,...f.dispatchId?[`Neocortex-Dispatch: ${String(f.dispatchId)}`]:[],...f.bundleId?[`Neocortex-Bundle: ${String(f.bundleId)}`]:[],...f.claimRevision?[`Neocortex-Claim-Revision: ${String(f.claimRevision)}`]:[]].every(F=>w.has(F));if(T){const Oe=[...w].find(ci=>ci.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(Oe))return c();ne("git",["merge-base","--is-ancestor",Oe,g],{cwd:i,stdio:"ignore"})}const V=G(i,["diff-tree","--no-commit-id","--name-only","-r","-z",g]).split("\0").filter(Boolean);if(V.length===0||V.some(F=>!he(F)))return c();const q=S("sha256").update(O).digest("hex"),ee=S("sha256").update([...V].sort().join("\0")).digest("hex"),B=Fe({checkpoint:f,storyId:t,epicId:r,executionBranch:n,baseSha:m,headSha:g,commitBodyDigest:q,changedPathsDigest:ee,changedPaths:V,authorizedWriteSet:s.length>0?s:Ai(i,t)});if(!B||u.receiptRef!==`story-qa:${String(u.sourceEvidenceDigest)}`)return c();const Ae=Oi({storyId:t,baseSha:m,headSha:g,bundleDigest:String(f.bundleDigest),graphRevision:String(f.graphRevision),commitBody:O,changedPaths:V}),ke=u.evidenceVersion==="p205-execution-v2"&&u.contract==="P205-CI-02"&&u.command===L&&l(u.manifestDigest)&&j(u.gateIds,32,!0)&&l(u.resultDigest)&&u.sourceEvidenceDigest===Pi({gitEvidenceDigest:Ae,headSha:g,graphRevision:String(f.graphRevision),manifestDigest:String(u.manifestDigest),gateIds:u.gateIds,resultDigest:String(u.resultDigest)}),ri=u.evidenceVersion==="git-immutable-v1"&&u.sourceEvidenceDigest===Ae,ni=u.evidenceVersion===void 0&&B.mode==="legacy-migration"&&B.binding?.qaDigest===u.sourceEvidenceDigest,me=Ii(a,$,String(f.graphRevision))&&(ke||B.mode==="legacy-migration"&&(ri||ni)),ye=h==="scheduling"&&a===void 0&&ke;if(!me&&!ye)return c();const Ce=S("sha256").update(["root-commit-range-review-v1",t,m,g,String(f.bundleDigest),String(f.graphRevision),String(u.receiptRef),S("sha256").update(O).digest("hex"),[...V].sort().join(",")].join("\0")).digest("hex");if(p.sourceEvidenceDigest!==Ce||p.receiptRef!==`story-review:${Ce}`||B.mode==="legacy-migration"&&B.binding?.reviewDigest!==void 0&&B.binding.reviewDigest!==p.sourceEvidenceDigest||!T&&(Le[t]!==g||!Array.isArray(f.receiptRefs)||!f.receiptRefs.some(F=>typeof F=="string"&&F.startsWith("legacy-direct-yolo:"))))return c();const ai=S("sha256").update(["checkpoint-p205-transient-v1",t,r,n,m,g,String(f.bundleDigest),q,ee,B.mode,B.effectiveClaimRevision,String(u.sourceEvidenceDigest),String(p.sourceEvidenceDigest),ce(a)?.executionEvidenceDigest??(ye?"scheduling-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),ie=me?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:g,aggregateHeadSha:ie?.executionHeadSha??g,commitBodyDigest:q,changedPathsDigest:ee,claimVerification:B.mode,effectiveClaimRevision:B.effectiveClaimRevision,sourceEvidenceDigest:ai,command:L,manifestDigest:ie?.manifestDigest??"0".repeat(64),gateIds:ie?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:ie?.resultDigest??"0".repeat(64),graphRevision:String(f.graphRevision),executionEvidenceDigest:ie?.executionEvidenceDigest??"0".repeat(64),verifiedAt:ie?.executedAt??oe(o),verdict:"verified",reasonCodes:Object.freeze([me?"checkpoint-p205-transient-verified":ye?"checkpoint-git-scheduling-verified":"checkpoint-legacy-bounded-verified",...B.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return c()}}function Dt(i,e,t,r,n,a,s=[],o=new Date().toISOString()){const h=a?"integration":"scheduling",c=Te(i,e,t,r,n,a,s,o,h);return c.verdict!=="verified"?{kind:"rejected",verification:c}:h==="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:We({storyId:t,epicId:r,executionBranch:n,value:e,verifiedAt:o,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"})}}function Ii(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===L&&r.graphRevision===t&&l(r.resultDigest)&&l(r.executionEvidenceDigest)&&r.executionHeadSha===e&&_(e))}function ce(i){return i&&typeof i=="object"?je.get(i):void 0}function _t(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 xt(i,e,t){const r=ce(i);return!!(r&&r.executionHeadSha===e&&r.graphRevision===t&&r.command===L)}function Fe(i){const e=wi[i.storyId],t=typeof i.checkpoint.claimRevision=="string"?i.checkpoint.claimRevision:void 0,r=i.storyId==="P174.03.811759"||i.storyId==="P174.03.685003",n=Ri(i.authorizedWriteSet),a=n.length>0&&n.length===i.authorizedWriteSet.length&&i.changedPaths.every(s=>n.some(o=>Ci(o,s)));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||!Me(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(t!==void 0&&!(!t||!l(t))&&!(!a||!Me(t,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:t})}function Ri(i){const e=i.map(t=>t.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(t=>!he(t))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function Ai(i,e){try{const t=JSON.parse(Ne(v(i,".neocortex","state.json"),"utf8")),r=d(t.stories),n=d(r?.[e]),a=Di(i),s=d(a.stories[e]?.checkpoint)??d(n?.checkpoint);return ki(e,n,s)}catch{return[]}}function ki(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 gi({...e,id:i,files_to_modify:r})}catch{return[]}}function Me(i,e){return i===S("sha256").update(e.join("\0")).digest("hex")||i===S("sha256").update(JSON.stringify(e)).digest("hex")}function Ci(i,e){return i===e||i.endsWith("/")&&e.startsWith(i)}function Et(i,e,t,r,n,a){try{if(!He(e,t,r,n))return!1;const s=d(e),o=d(s.qaReceipt),h=d(s.reviewReceipt),c=String(s.headSha),f=String(s.baseSha),u=G(i,["rev-parse",`refs/heads/${n}`]).trim();if(ne("git",["merge-base","--is-ancestor",c,u],{cwd:i,stdio:"ignore"}),G(i,["rev-parse",`${c}^`]).trim()!==f||G(i,["rev-list","--count",`${f}..${c}`]).trim()!=="1")return!1;const p=G(i,["show","--no-patch","--format=%H%n%P%n%B",c]),g=G(i,["diff-tree","--no-commit-id","--name-only","-r","-z",c]).split("\0").filter(Boolean);if(g.length===0||g.some($=>!he($)))return!1;const m=Fe({checkpoint:s,storyId:t,epicId:r,executionBranch:n,baseSha:f,headSha:c,changedPaths:g,authorizedWriteSet:a,commitBodyDigest:S("sha256").update(p).digest("hex"),changedPathsDigest:S("sha256").update([...g].sort().join("\0")).digest("hex")});return!(m?.mode!=="legacy-migration"||!m.binding||o.sourceEvidenceDigest!==m.binding.qaDigest||o.receiptRef!==`story-qa:${m.binding.qaDigest}`||h.sourceEvidenceDigest!==m.binding.reviewDigest||h.receiptRef!==`story-review:${m.binding.reviewDigest}`||h.qaReceiptRef!==o.receiptRef)}catch{return!1}}function Oi(i){return S("sha256").update(["local-yolo-tdd-git-immutable-v1",i.storyId,i.baseSha,i.headSha,i.bundleDigest,i.graphRevision,S("sha256").update(i.commitBody).digest("hex"),S("sha256").update([...i.changedPaths].sort().join("\0")).digest("hex")].join("\0")).digest("hex")}function Pi(i){return S("sha256").update(["local-yolo-tdd-p205-execution-v2",L,i.gitEvidenceDigest,i.headSha,i.graphRevision,i.manifestDigest,i.gateIds.join(","),i.resultDigest].join("\0")).digest("hex")}function We(i){const e=d(i.value);return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:i.storyId,epicId:i.epicId,branch:i.executionBranch,baseSha:_(e?.baseSha)?String(e?.baseSha):"0".repeat(40),headSha:_(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:L,manifestDigest:"0".repeat(64),gateIds:Object.freeze([]),resultDigest:"0".repeat(64),graphRevision:"0".repeat(64),executionEvidenceDigest:"0".repeat(64),sourceEvidenceDigest:"0".repeat(64),verifiedAt:oe(i.verifiedAt),verdict:i.verdict,reasonCodes:Object.freeze([i.reasonCode]),publicSafe:!0})}function G(i,e){return ne("git",[...e],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})}function oe(i){return Number.isFinite(Date.parse(i))?new Date(Date.parse(i)).toISOString():new Date().toISOString()}async function It(i,e){if(Le[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 N("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:i,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await N("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:i}),(await N("git",["rev-parse",`${e.headSha}^`],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await N("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(S("sha256").update(a).digest("hex")!==e.bundleDigest)return;const s=String((await N("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await N("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 N("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(w=>c.includes(w))||c.some(w=>!he(w)))return;const f=await Promise.all(t.map(async w=>String((await N("git",["show",`${e.headSha}:${w}`],{cwd:i,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),u=JSON.parse(f[0]),p=d(u.stories),g=d(u.epics),m=d(p?.[e.storyId]),$=d(g?.[e.epicId]),O=Array.isArray(m?.steps_completed)?m.steps_completed:[],I=JSON.parse(f[1]);return m?.status!=="done"||!O.includes(yi)||!O.includes(bi)||$?.branch_mode!=="epic"||$.execution_branch!==e.executionBranch||I.storyId!==e.storyId||I.status!=="qa-passed"||I.safeToContinueYoloop!==!0||!Array.isArray(I.blockingChecks)||I.blockingChecks.length!==0||!f[2].includes(e.storyId)||!/P205[\s\S]{0,80}(pass|aprov)/i.test(f[2])||!f[3].includes(e.storyId)||!/approved|aprovado/i.test(f[3])||!f[4].includes(e.storyId)?void 0:`legacy-direct-yolo:${S("sha256").update(["legacy-direct-yolo-recovery-v1",e.storyId,e.epicId,e.executionBranch,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,S("sha256").update(s).digest("hex"),S("sha256").update([...c].sort().join("\0")).digest("hex"),...f.map(w=>S("sha256").update(w).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function Ni(i){const e=await xe(i),t=v(e,fe),r=v(t,ue);if(z(t)&&(await H(t,"directory"),await U(t)!==t))throw new Error("git-lifecycle-runtime-directory-symlink");return z(r)?r:v(e,Se)}async function Ke(i){return Qe(await xe(i))}async function Bi(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=y(i);await Y(t);const r=y(t,e);return re(t,r),z(r)||await $e(t,e),await Y(r,t),await Y(t),r}async function D(i,e){const t=y(e),r=y(i);re(t,r),await Y(t),await Y(r,t)}async function Rt(i,e){await J(i,e)}async function Z(i,e,t){const r=y(e),n=y(i);re(r,n);try{await D(n,r)}catch(s){if(C(s,"ENOENT"))return!1;throw s}const a=y(r,`${n.slice(r.length+1)}.remove.${process.pid}.${Date.now()}.${be(4).toString("hex")}`);return re(r,a),await te(r,A(n),A(a)),await D(a,r),t&&!await t(a)?(await se(a,n,r).catch(()=>{}),!1):(await mi(r,A(a)),!0)}async function se(i,e,t){await D(i,t);try{await we(e);return}catch(r){if(!C(r,"ENOENT"))throw r}await te(t,A(i),A(e)),await D(e,t)}async function P(i){try{await D(i,K(i));const e=v(i,"owner.json");await J(e,i);const t=await M(e);return await J(e,i),S("sha256").update(t).digest("hex")}catch{return}}async function At(i,e){const t=await Ke(i),r=await Bi(t,"leases"),n=v(r,"integration"),a=`${n}.recovery`;if(z(a)){await D(a,r);const c=await Ye(a),f=await P(a);if(c===void 0||pe(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!f||!await Z(a,r,async u=>await P(u)===f))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const s=oe(e.createdAt??new Date().toISOString()),o=Object.freeze({schemaVersion:1,kind:e.kind,storyId:e.storyId,sessionId:e.sessionId,idempotencyKey:e.idempotencyKey,pid:process.pid,createdAt:s,expiresAt:oe(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??be(16).toString("hex")});if(Date.parse(o.expiresAt)<=Date.parse(o.createdAt))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const h=async()=>{await Y(r,t);try{return await Be(r,A(n),`${JSON.stringify(o)}
|
|
4
|
-
`),await D(n,r),await J(v(n,"owner.json"),n),!0}catch(c){throw C(c,"EEXIST")||await Z(n,r).catch(()=>{}),c}};try{return await h(),{ok:!0,owner:o,path:n}}catch(c){if(!C(c,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const c=await de(n),f=c?void 0:await Ye(n);if(c&&Je(c,o))return{ok:!0,owner:c,path:n};if(c&&Date.parse(c.expiresAt)>Date.now()&&(c.persistent||pe(c.pid))||f!==void 0&&pe(f)||!c&&f===void 0&&await ii(n))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};const p=await P(n);if(!p)return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const g=`${n}.stale.${process.pid}.${Date.now()}`;await te(r,A(n),A(g));try{if(await D(g,r),await P(g)!==p)return await se(g,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await h()}finally{await Z(g,r,async m=>await P(m)===p).catch(()=>{})}return{ok:!0,owner:o,path:n}}catch(c){return{ok:!1,reasonCode:C(c,"EEXIST")||C(c,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function kt(i,e){const t=await de(i);return!!(t&&_e(t,e)&&Date.parse(t.expiresAt)>Date.now())}async function $i(i,e){try{const t=K(i);await D(i,t);const r=await de(i);if(!r||!_e(r,e))return!1;const n=await P(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await te(t,A(i),A(a)),await D(a,t);const s=await de(a);return!s||!_e(s,e)||await P(a)!==n?(await se(a,i,t).catch(()=>{}),!1):Z(a,t,async o=>await P(o)===n)}catch(t){if(C(t,"ENOENT"))return!1;throw t}}function Vi(i){return S("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 Ct(i,e){if(!Q(e.storyId)||!k(e.idempotencyKey)||!l(e.ownerDigest))return"foreign";const t=await Ke(i),r=v(t,"leases"),n=v(r,"integration");if(!z(n))return"absent";try{await D(r,t),await D(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||Vi(a)!==e.ownerDigest?"foreign":await $i(n,a)?"released":"foreign"}catch{return"foreign"}}async function de(i){try{await D(i,K(i));const e=v(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)||!k(t.sessionId)||!k(t.idempotencyKey)||!Number.isSafeInteger(t.pid)||Number(t.pid)<=0||!E(t.createdAt)||!E(t.expiresAt)||typeof t.persistent!="boolean"||typeof t.ownerNonce!="string"||!/^[a-f0-9]{32}$/.test(t.ownerNonce)?void 0:t}catch{return}}async function Ye(i){try{await D(i,K(i));const e=v(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 Je(i,e){return i.kind===e.kind&&i.storyId===e.storyId&&i.sessionId===e.sessionId&&i.idempotencyKey===e.idempotencyKey&&i.expiresAt===e.expiresAt&&i.persistent===e.persistent}function _e(i,e){return Je(i,e)&&i.schemaVersion===e.schemaVersion&&i.pid===e.pid&&i.createdAt===e.createdAt&&i.ownerNonce===e.ownerNonce}async function xe(i){const e=await U(i),r=(await N("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim(),n=ae(r)?y(r):y(e,r),a=await U(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await ji(a);const o=(await N("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((ae(o)?y(o):y(e,o))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function Qe(i){const e=v(i,fe);if(z(e)||await $e(i,fe),await H(e,"directory"),await U(e)!==e)throw new Error("git-lifecycle-runtime-directory-symlink");return e}async function Ue(i,e={}){try{return await H(i,"file"),Ee(JSON.parse(await M(i,"utf8")))}catch(t){if(C(t,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ie()}throw t}}async function Li(i){try{await H(i,"file")}catch(e){if(C(e,"ENOENT"))return;throw e}}async function H(i,e){const t=await we(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(ge()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(ge()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function re(i,e){const t=y(i),r=y(e),n=fi(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=y(i);if(e&&re(y(e),t),await H(t,"directory"),y(await U(t))!==t)throw new Error("git-lifecycle-directory-substituted");if(e){const r=y(e);if(await H(r,"directory"),y(await U(r))!==r)throw new Error("git-lifecycle-directory-parent-substituted")}}async function J(i,e){const t=y(i);if(re(y(e),t),await Y(y(e)),await H(t,"file"),y(await U(t))!==t)throw new Error("git-lifecycle-file-substituted")}function Ze(i,e){const t=Pe(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(ge()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(ge()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function ji(i){const e=await we(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=Pe(i);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function ge(i=process.platform){return i!=="win32"&&typeof process.getuid=="function"}function Ee(i){if(!i||typeof i!="object"||Array.isArray(i))throw new Error("git-lifecycle-runtime-invalid");const e=i;x(e,["schemaVersion","revision","epics","stories"],"git-lifecycle-runtime-unknown-field");const t=d(e.epics),r=d(e.stories);if(e.schemaVersion!==1||!Number.isSafeInteger(e.revision)||Number(e.revision)<0||!t||!r||Object.values(t).some(n=>!d(n))||Object.values(r).some(n=>!d(n)))throw new Error("git-lifecycle-runtime-invalid");for(const[n,a]of Object.entries(t))if(!Q(n)||!Hi(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!Q(n)||!n.includes(".")||!Ti(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"],Gi=["checkpoint","status","last_step","steps_completed"];function Hi(i){return x(i,zi,"git-lifecycle-runtime-epic-unknown-field"),(i.branch_mode===void 0||i.branch_mode==="epic")&&(i.execution_branch===void 0||W(i.execution_branch))&&(i.origin_branch===void 0||W(i.origin_branch))&&(i.branch_lease===void 0||i.branch_lease===null||Fi(i.branch_lease))&&(i.origin_binding===void 0||i.origin_binding===null||Ki(i.origin_binding))&&(i.graph_revision===void 0||l(i.graph_revision))&&(i.aggregate_qa_receipt===void 0||i.aggregate_qa_receipt===null||Yi(i.aggregate_qa_receipt))&&(i.terminal_git_receipt===void 0||i.terminal_git_receipt===null||Ji(i.terminal_git_receipt))&&(i.physicalMergeStatus===void 0||["merged","pushed","denied_external_gate","blocked_local_or_repo","not_attempted"].includes(String(i.physicalMergeStatus)))&&(i.pr_number===void 0||i.pr_number===null||Number.isSafeInteger(i.pr_number)&&Number(i.pr_number)>0)&&(i.git_reconciliation_receipts===void 0||et(i.git_reconciliation_receipts))&&(i.git_reconciliation_debt===void 0||it(i.git_reconciliation_debt))}function Ti(i,e){return x(i,Gi,"git-lifecycle-runtime-story-unknown-field"),(i.checkpoint===void 0||i.checkpoint===null||Xe(i.checkpoint,e))&&(i.status===void 0||k(i.status))&&(i.last_step===void 0||i.last_step===null||k(i.last_step))&&(i.steps_completed===void 0||j(i.steps_completed,128))}function Fi(i){const e=d(i);return e?(x(e,["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt","handoffGrant","handoffConsumption"],"git-lifecycle-runtime-lease-unknown-field"),e.schemaVersion===1&&Q(e.ownerStoryId)&&k(e.sessionId)&&k(e.idempotencyKey)&&E(e.acquiredAt)&&E(e.expiresAt)&&Date.parse(String(e.expiresAt))>Date.parse(String(e.acquiredAt))&&(e.handoffGrant===void 0||Mi(e.handoffGrant,e))&&(e.handoffConsumption===void 0||Wi(e.handoffConsumption,e))):!1}function Mi(i,e){const t=d(i);return t?(x(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&&l(t.tokenDigest)&&l(t.bundleDigest)&&l(t.claimRevision)&&E(t.expiresAt)&&Date.parse(String(t.expiresAt))<=Date.parse(String(e.expiresAt))):!1}function Wi(i,e){const t=d(i);return t?(x(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&&k(t.fromSessionId)&&l(t.tokenDigest)&&l(t.bundleDigest)&&l(t.claimRevision)&&t.consumedBySessionId===e.sessionId&&E(t.consumedAt)):!1}function Ki(i){const e=d(i);return e?(x(e,["schemaVersion","originBranch","originHeadSha","executionBranch","capturedFromCurrentCheckout","capturedAt"],"git-lifecycle-runtime-origin-unknown-field"),e.schemaVersion===1&&W(e.originBranch)&&W(e.executionBranch)&&e.originBranch!==e.executionBranch&&_(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&E(e.capturedAt)):!1}function Yi(i){const e=d(i);if(!e)return!1;x(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===L&&l(e.manifestDigest)&&l(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"&&_(e.executionHeadSha)&&l(e.graphRevision)&&E(e.checkedAt)&&le(e.receiptRef)&&j(e.gateIds,128,!0)}function Ji(i){const e=d(i);return e?(x(e,["schemaVersion","epicId","executionBranch","originBranch","baseSha","executionHeadSha","mergeSha","pushedSha","strategy","prNumber","physicalStatus","localGateReceiptRefs","idempotencyKey","attemptStartedAt","completedAt","retryEligible","reasonCodes","publicSafe","candidateQa","providerGuard"],"git-lifecycle-runtime-terminal-receipt-unknown-field"),e.schemaVersion===1&&Q(e.epicId)&&W(e.executionBranch)&&W(e.originBranch)&&_(e.baseSha)&&_(e.executionHeadSha)&&(e.mergeSha===void 0||_(e.mergeSha))&&(e.pushedSha===void 0||_(e.pushedSha))&&(e.strategy==="direct"||e.strategy==="single_pr")&&(e.candidateQa===void 0||Ui(e.candidateQa,e))&&(e.providerGuard===void 0||Qi(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))&&j(e.localGateReceiptRefs,128,!0)&&k(e.idempotencyKey)&&E(e.attemptStartedAt)&&(e.completedAt===void 0||E(e.completedAt))&&typeof e.retryEligible=="boolean"&&j(e.reasonCodes,128)&&e.publicSafe===!0):!1}function Qi(i,e){const t=d(i);if(!t)return!1;x(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&&_(t.prHeadSha)&&t.prHeadSha===e.mergeSha&&_(t.originHeadSha)&&t.originHeadSha===e.baseSha&&E(t.checkedAt)&&t.publicSafe===!0}function Ui(i,e){const t=d(i);return t?(x(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===L&&_(t.originHeadSha)&&t.originHeadSha===e.baseSha&&_(t.executionHeadSha)&&t.executionHeadSha===e.executionHeadSha&&_(t.mergeSha)&&t.mergeSha===e.mergeSha&&_(t.treeSha)&&l(t.graphRevision)&&l(t.manifestDigest)&&l(t.resultDigest)&&j(t.gateIds,128,!0)&&E(t.checkedAt)&&le(t.receiptRef)):!1}function Xe(i,e){const t=d(i);if(!t)return!1;x(t,["schemaVersion","storyId","epicId","branch","baseSha","headSha","commits","idempotencyKey","dispatchId","bundleId","bundleDigest","graphRevision","claimRevision","receiptRefs","qaVerdict","reviewVerdict","qaReceipt","reviewReceipt","recordedAt"],"git-lifecycle-runtime-checkpoint-unknown-field");const r=String(e).split(".")[0];return t.schemaVersion===1&&t.storyId===e&&t.epicId===r&&W(t.branch)&&_(t.baseSha)&&_(t.headSha)&&t.baseSha!==t.headSha&&rt(t.commits)&&t.commits.length===1&&t.commits[0]===t.headSha&&k(t.idempotencyKey)&&(t.dispatchId===void 0||l(t.dispatchId))&&(t.bundleId===void 0||l(t.bundleId))&&l(t.bundleDigest)&&l(t.graphRevision)&&(t.claimRevision===void 0||l(t.claimRevision))&&j(t.receiptRefs,256,!0)&&(t.qaVerdict==="passed"||t.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(t.reviewVerdict))&&Zi(t.qaReceipt,t)&&(t.reviewVerdict==="pending"?t.reviewReceipt===void 0:Xi(t.reviewReceipt,t))&&E(t.recordedAt)}function Zi(i,e){const t=d(i);return t?(x(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===L&&l(t.manifestDigest)&&j(t.gateIds,32,!0)&&l(t.resultDigest))&&ei(t,e)&&l(t.sourceEvidenceDigest)&&t.verdict===e.qaVerdict&&(t.verdict==="passed"||t.verdict==="blocked")&&E(t.checkedAt)&&le(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef)):!1}function Xi(i,e){const t=d(i),r=d(e.qaReceipt);return!t||!r?!1:(x(t,["schemaVersion","kind","producer","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","sourceEvidenceDigest","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"&&ei(t,e)&&l(t.sourceEvidenceDigest)&&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")&&E(t.reviewedAt)&&Date.parse(String(t.reviewedAt))>=Date.parse(String(r.checkedAt))&&le(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef))}function ei(i,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(t=>i[t]===e[t])}function et(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=d(e);return t?(x(t,["schemaVersion","resourceId","action","outcome","idempotencyKey","reasonCodes","recordedAt","publicSafe"],"git-lifecycle-runtime-reconciliation-receipt-unknown-field"),t.schemaVersion===1&&k(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))&&k(t.idempotencyKey)&&j(t.reasonCodes,128)&&E(t.recordedAt)&&t.publicSafe===!0):!1})}function it(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=d(e);return t?(x(t,["schemaVersion","resourceId","action","managed","reasonCodes","evidence","publicSafe"],"git-lifecycle-runtime-reconciliation-debt-unknown-field"),t.schemaVersion===1&&k(t.resourceId)&&t.action==="preserve"&&typeof t.managed=="boolean"&&j(t.reasonCodes,128)&&j(t.evidence,16)&&t.publicSafe===!0):!1})}function x(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 tt(i){const e=d(i);return e?Object.keys(e).length===10&&e.schemaVersion===1&&e.kind==="git_lifecycle_graph_authority"&&e.producer==="server-continuous-yoloop-v1"&&(e.source==="yolo"||e.source==="yoloop")&&Q(e.epicId)&&Q(e.storyId)&&String(e.storyId).startsWith(`${String(e.epicId)}.`)&&W(e.executionBranch)&&W(e.originBranch)&&e.originBranch!==e.executionBranch&&typeof e.graphRevision=="string"&&/^[a-f0-9]{64}$/.test(e.graphRevision)&&e.publicSafe===!0:!1}function W(i){return typeof i=="string"&&/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(i)&&!i.includes("..")&&!i.includes("//")&&!i.includes("@{")&&!i.endsWith("/")&&!i.endsWith(".")&&!i.split("/").some(e=>!e||e.startsWith(".")||e.endsWith(".lock"))}function he(i){return i.length>0&&i.length<=1024&&!ae(i)&&!i.includes("\0")&&!i.replaceAll("\\","/").split("/").includes("..")}function k(i){return typeof i=="string"&&i.length>0&&i.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(i)&&!i.includes("..")}function le(i){return k(i)}function _(i){return typeof i=="string"&&/^[a-f0-9]{40,64}$/i.test(i)}function l(i){return typeof i=="string"&&/^[a-f0-9]{64}$/i.test(i)}function E(i){return typeof i=="string"&&i.length<=64&&Number.isFinite(Date.parse(i))}function j(i,e,t=!1){return Array.isArray(i)&&i.length<=e&&(!t||i.length>0)&&i.every(k)}function rt(i){return Array.isArray(i)&&i.length>0&&i.length<=256&&i.every(_)}function Ie(){return{schemaVersion:1,revision:0,epics:{},stories:{}}}async function nt(i){const e=K(i),t={pid:process.pid,nonce:be(16).toString("hex")},r=async()=>{await Y(e),await Be(e,A(i),JSON.stringify(t));try{await D(i,e),await J(v(i,"owner.json"),i)}catch(n){throw await Z(i,e).catch(()=>{}),n}};try{await r()}catch(n){if(!C(n,"EEXIST"))throw n;await H(i,"directory");const a=await Re(i);if(a!==void 0&&pe(a.pid))throw new Error("git-lifecycle-runtime-lock-active");if(a===void 0&&await ii(i))throw new Error("git-lifecycle-runtime-lock-active");const s=await P(i);if(!s)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const o=`${i}.stale.${process.pid}.${Date.now()}`;await te(e,A(i),A(o));try{if(await D(o,e),await P(o)!==s)throw await se(o,i,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await Z(o,e,async h=>await P(h)===s).catch(()=>{})}}return t}async function at(i,e){const t=K(i);try{await D(i,t);const r=await Re(i);if(!r||!ti(r,e))return!1;const n=await P(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await te(t,A(i),A(a)),await D(a,t);const s=await Re(a);return!s||!ti(s,e)||await P(a)!==n?(await se(a,i,t).catch(()=>{}),!1):Z(a,t,async o=>await P(o)===n)}catch(r){if(C(r,"ENOENT"))return!1;throw r}}async function ii(i){try{return Date.now()-(await di(i)).mtimeMs<3e4}catch{return!0}}async function Re(i){try{await D(i,K(i));const e=v(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 ti(i,e){return i.pid===e.pid&&i.nonce!==void 0&&i.nonce===e.nonce}function pe(i){try{return process.kill(i,0),!0}catch(e){return C(e,"EPERM")}}function d(i){return i&&typeof i=="object"&&!Array.isArray(i)?i:void 0}function C(i,e){return i instanceof Error&&"code"in i&&i.code===e}export{fe as GIT_LIFECYCLE_RUNTIME_DIRECTORY,ue as GIT_LIFECYCLE_RUNTIME_FILE,Le as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,wi as LEGACY_P174_CHECKPOINT_MIGRATIONS,L as P205_COMPLETE_COMMAND,At as acquireGitLifecyclePhysicalIntegrationLock,xi as applyGitLifecycleRuntimeOverlay,D as assertGitLifecyclePrivateDirectory,Rt as assertGitLifecyclePrivateFile,Dt as classifyGitLifecycleStoryCheckpointProjectionSync,Vi as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,Oi as computeImmutableStoryQaEvidenceDigest,It as computeLegacyDirectYoloRecoveryReceiptRef,Pi as computeP205StoryQaEvidenceDigest,Bi as ensureGitLifecyclePrivateChildDirectory,bt as ensureGitLifecycleRuntimeInitialized,Ei as ensureRuntimeEpic,vt as ensureRuntimeStory,Si as executeP205TransientAuthorities,yt as executeP205TransientAuthority,Ke as gitLifecycleRuntimeDirectory,ki as gitLifecycleStoryWriteSet,He as isAcceptedGitLifecycleStoryCheckpoint,ze as mutateGitLifecycleRuntime,xt as p205TransientAuthorityMatchesAggregate,wt as persistGitLifecycleGraphAuthority,ge as posixSecurityAvailable,_t as projectP205TransientExecutionEvidence,De as readGitLifecycleRuntime,Di as readGitLifecycleRuntimeSync,$i as releaseGitLifecyclePhysicalIntegrationLock,Ct as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,Z as removeGitLifecyclePrivateDirectory,St as verifyAcceptedGitLifecycleStoryCheckpoint,Te as verifyAcceptedGitLifecycleStoryCheckpointSync,kt as verifyGitLifecyclePhysicalIntegrationLock,Et as verifyLegacyCheckpointMigrationCandidateSync};
|
|
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,`
|
|
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};
|