@ornexus/neocortex 4.60.26 → 4.60.28

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.
@@ -1,4 +1,4 @@
1
- type StoryCheckpointAction = 'handoff' | 'begin' | 'finalize' | 'recover';
1
+ type StoryCheckpointAction = 'setup' | 'handoff' | 'begin' | 'finalize' | 'recover';
2
2
  interface StoryCheckpointCliOptions {
3
3
  readonly action: StoryCheckpointAction;
4
4
  readonly storyId: string;
@@ -1 +1 @@
1
- import{readFile as m}from"node:fs/promises";import{resolve as u}from"node:path";import{beginDirectYoloStoryCommit as k,finalizeDirectYoloStoryCheckpoint as w,issueDirectYoloSetupLeaseHandoff as y,recoverLegacyDirectYoloStoryCheckpoint as g}from"../git/direct-yolo-checkpoint.js";function v(a){const e=a[0];if(e!=="handoff"&&e!=="begin"&&e!=="finalize"&&e!=="recover")throw new Error("story-checkpoint-action-invalid");let i="",t=process.cwd(),r,h="origin",f=!1,d="plain",l,c;for(let p=1;p<a.length;p++){const o=a[p],n=()=>a[++p]??"";if(o==="--story")i=n();else if(o.startsWith("--story="))i=o.slice(8);else if(o==="--project-root")t=n()||t;else if(o.startsWith("--project-root="))t=o.slice(15);else if(o==="--commit")r=n();else if(o.startsWith("--commit="))r=o.slice(9);else if(o==="--remote")h=n();else if(o.startsWith("--remote="))h=o.slice(9);else if(o==="--push"||o==="--require-remote")f=!0;else if(o==="--setup-handoff-session")l=n();else if(o.startsWith("--setup-handoff-session="))l=o.slice(24);else if(o==="--setup-handoff-token-file")c=n();else if(o.startsWith("--setup-handoff-token-file="))c=o.slice(27);else if(o==="--format"){const s=n();if(s!=="json"&&s!=="plain")throw new Error("story-checkpoint-format-invalid");d=s}else if(o.startsWith("--format=")){const s=o.slice(9);if(s!=="json"&&s!=="plain")throw new Error("story-checkpoint-format-invalid");d=s}else throw new Error("story-checkpoint-argument-invalid")}if(!i)throw new Error("story-checkpoint-story-required");if(e==="recover"&&!r)throw new Error("story-checkpoint-commit-required");if(e==="recover"&&!f)throw new Error("story-checkpoint-remote-proof-required");if(e==="finalize"&&!f)throw new Error("story-checkpoint-push-required");if(e==="begin"&&(r||f||h!=="origin"))throw new Error("story-checkpoint-option-invalid");if(e==="handoff"&&(r||f||h!=="origin"))throw new Error("story-checkpoint-option-invalid");if(e==="finalize"&&r)throw new Error("story-checkpoint-option-invalid");if(l===void 0!=(c===void 0))throw new Error("story-checkpoint-setup-handoff-incomplete");if(e!=="begin"&&(l||c))throw new Error("story-checkpoint-option-invalid");return{action:e,storyId:i,projectRoot:u(t),commitSha:r,remote:h,push:f,format:d,...l?{setupHandoffSessionId:l}:{},...c?{setupHandoffTokenFile:u(c)}:{}}}async function j(a){let e;try{e=v(a)}catch(r){return console.error(r instanceof Error?r.message:"story-checkpoint-arguments-invalid"),1}let i;if(e.setupHandoffSessionId&&e.setupHandoffTokenFile)try{i={sessionId:e.setupHandoffSessionId,token:(await m(e.setupHandoffTokenFile,"utf8")).trim()}}catch{return console.error("story-checkpoint-setup-handoff-read-failed"),1}const t=e.action==="handoff"?await y(e):e.action==="begin"?await k({...e,...i?{setupLeaseHandoff:i}:{}}):e.action==="finalize"?await w(e):await g({...e,commitSha:e.commitSha});if(e.format==="json")console.log(JSON.stringify({action:e.action,...t},null,2));else if(t.ok)if(console.log(`story-checkpoint ${e.action}: ok`),e.action==="begin"&&"trailers"in t.value)for(const r of t.value.trailers)console.log(r);else"headSha"in t.value&&console.log(`head=${t.value.headSha}`);else console.error(`story-checkpoint ${e.action}: ${t.reasonCode}`);return t.ok?0:1}export{v as parseStoryCheckpointArgs,j as storyCheckpointCliHandler};
1
+ import{readFile as m}from"node:fs/promises";import{resolve as u}from"node:path";import{beginDirectYoloStoryCommit as w,finalizeDirectYoloStoryCheckpoint as k,issueDirectYoloSetupLeaseHandoff as y,prepareDirectYoloSetup as g,recoverLegacyDirectYoloStoryCheckpoint as v}from"../git/direct-yolo-checkpoint.js";function S(a){const e=a[0];if(e!=="setup"&&e!=="handoff"&&e!=="begin"&&e!=="finalize"&&e!=="recover")throw new Error("story-checkpoint-action-invalid");let i="",t=process.cwd(),r,h="origin",c=!1,d="plain",f,l;for(let p=1;p<a.length;p++){const o=a[p],n=()=>a[++p]??"";if(o==="--story")i=n();else if(o.startsWith("--story="))i=o.slice(8);else if(o==="--project-root")t=n()||t;else if(o.startsWith("--project-root="))t=o.slice(15);else if(o==="--commit")r=n();else if(o.startsWith("--commit="))r=o.slice(9);else if(o==="--remote")h=n();else if(o.startsWith("--remote="))h=o.slice(9);else if(o==="--push"||o==="--require-remote")c=!0;else if(o==="--setup-handoff-session")f=n();else if(o.startsWith("--setup-handoff-session="))f=o.slice(24);else if(o==="--setup-handoff-token-file")l=n();else if(o.startsWith("--setup-handoff-token-file="))l=o.slice(27);else if(o==="--format"){const s=n();if(s!=="json"&&s!=="plain")throw new Error("story-checkpoint-format-invalid");d=s}else if(o.startsWith("--format=")){const s=o.slice(9);if(s!=="json"&&s!=="plain")throw new Error("story-checkpoint-format-invalid");d=s}else throw new Error("story-checkpoint-argument-invalid")}if(!i)throw new Error("story-checkpoint-story-required");if(e==="recover"&&!r)throw new Error("story-checkpoint-commit-required");if(e==="recover"&&!c)throw new Error("story-checkpoint-remote-proof-required");if(e==="finalize"&&!c)throw new Error("story-checkpoint-push-required");if(e==="begin"&&(r||c||h!=="origin"))throw new Error("story-checkpoint-option-invalid");if((e==="setup"||e==="handoff")&&(r||c||h!=="origin"))throw new Error("story-checkpoint-option-invalid");if(e==="finalize"&&r)throw new Error("story-checkpoint-option-invalid");if(f===void 0!=(l===void 0))throw new Error("story-checkpoint-setup-handoff-incomplete");if(e!=="begin"&&(f||l))throw new Error("story-checkpoint-option-invalid");return{action:e,storyId:i,projectRoot:u(t),commitSha:r,remote:h,push:c,format:d,...f?{setupHandoffSessionId:f}:{},...l?{setupHandoffTokenFile:u(l)}:{}}}async function C(a){let e;try{e=S(a)}catch(r){return console.error(r instanceof Error?r.message:"story-checkpoint-arguments-invalid"),1}let i;if(e.setupHandoffSessionId&&e.setupHandoffTokenFile)try{i={sessionId:e.setupHandoffSessionId,token:(await m(e.setupHandoffTokenFile,"utf8")).trim()}}catch{return console.error("story-checkpoint-setup-handoff-read-failed"),1}const t=e.action==="setup"?await g(e):e.action==="handoff"?await y(e):e.action==="begin"?await w({...e,...i?{setupLeaseHandoff:i}:{}}):e.action==="finalize"?await k(e):await v({...e,commitSha:e.commitSha});if(e.format==="json")console.log(JSON.stringify({action:e.action,...t},null,2));else if(t.ok)if(console.log(`story-checkpoint ${e.action}: ok`),e.action==="begin"&&"trailers"in t.value)for(const r of t.value.trailers)console.log(r);else"headSha"in t.value&&console.log(`head=${t.value.headSha}`);else console.error(`story-checkpoint ${e.action}: ${t.reasonCode}`);return t.ok?0:1}export{S as parseStoryCheckpointArgs,C as storyCheckpointCliHandler};
@@ -31,6 +31,18 @@ export interface DirectYoloSetupHandoffReceipt {
31
31
  readonly reused: boolean;
32
32
  readonly publicSafe: true;
33
33
  }
34
+ export interface DirectYoloSetupReceipt {
35
+ readonly schemaVersion: 1;
36
+ readonly kind: 'direct-yolo-setup-receipt';
37
+ readonly storyId: string;
38
+ readonly epicId: string;
39
+ readonly executionBranch: string;
40
+ readonly originBranch: string;
41
+ readonly originHeadSha: string;
42
+ readonly leaseExpiresAt: string;
43
+ readonly reused: boolean;
44
+ readonly publicSafe: true;
45
+ }
34
46
  export interface DirectYoloCheckpointOptions {
35
47
  readonly projectRoot: string;
36
48
  readonly storyId: string;
@@ -55,6 +67,12 @@ export interface DirectYoloCheckpointOptions {
55
67
  /** Test seam for crash-window reproduction after durable CAS and before release. */
56
68
  readonly afterCheckpointPersist?: () => Promise<void>;
57
69
  }
70
+ /**
71
+ * Productive P207 setup boundary. It owns only the current checkout and the
72
+ * epic branch; it never creates, removes or repositions a worktree. Existing
73
+ * staged and unstaged bytes must remain identical across the branch switch.
74
+ */
75
+ export declare function prepareDirectYoloSetup(options: Pick<DirectYoloCheckpointOptions, 'projectRoot' | 'storyId' | 'nowIso'>): Promise<DirectYoloCheckpointResult<DirectYoloSetupReceipt>>;
58
76
  /**
59
77
  * Productive setup-owner handoff emitter used immediately before C08. The
60
78
  * one-time token never crosses stdout; only a public receipt is returned.
@@ -1,3 +1,4 @@
1
- import{execFile as we}from"node:child_process";import{createHash as Ie,randomBytes as Re,timingSafeEqual as ve}from"node:crypto";import{readFile as re}from"node:fs/promises";import{join as oe,resolve as Se}from"node:path";import{promisify as ke}from"node:util";import{acquireGitLifecyclePhysicalIntegrationLock as H,applyGitLifecycleRuntimeOverlay as De,computeImmutableStoryQaEvidenceDigest as xe,computeGitLifecyclePhysicalIntegrationLockOwnerDigest as ie,computeP205StoryQaEvidenceDigest as be,computeLegacyDirectYoloRecoveryReceiptRef as Ae,ensureRuntimeEpic as C,ensureRuntimeStory as je,ensureGitLifecyclePrivateChildDirectory as Ee,executeP205TransientAuthority as Le,projectP205TransientExecutionEvidence as _e,LEGACY_DIRECT_YOLO_RECOVERY_COMMITS as Be,mutateGitLifecycleRuntime as O,P205_COMPLETE_COMMAND as $e,readGitLifecycleRuntime as q,gitLifecycleRuntimeDirectory as qe,assertGitLifecyclePrivateFile as ne,releaseGitLifecyclePhysicalIntegrationLock as N,releaseGitLifecyclePhysicalIntegrationLockForCheckpoint as ze,verifyGitLifecyclePhysicalIntegrationLock as F,verifyAcceptedGitLifecycleStoryCheckpoint as se}from"./git-lifecycle-store.js";import{anchoredAtomicWriteFile as Ce}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as Oe,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as ae}from"./git-lifecycle-step-ids.js";const Y=ke(we);async function Xe(e){try{const t=await K(e.projectRoot,e.storyId),i=$(await E(t.projectRoot,["diff","--cached","--name-only","-z"])),r=G(i,t.authorizedWriteSet,e.storyId);if(!r.ok)return y(r.reasonCode);if($(await E(t.projectRoot,["diff","--name-only","-z"])).some(w=>i.includes(w)))return y("direct-yolo-user-overlap");const s=await E(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!s)return y("direct-yolo-staged-diff-empty");const f=v(s),a=v([...t.authorizedWriteSet].sort().join("\0")),c=W(e.nowIso),n=await q(t.projectRoot,{required:!0}),d=I(n.epics[t.epicId]?.branch_lease);if(!ye(d,e.storyId,c))return y("direct-yolo-setup-handoff-owner-invalid");const h=String(d.sessionId),R=String(d.expiresAt),m=new Date(Math.min(Date.parse(R),Date.parse(c)+300*1e3)).toISOString(),l=await P(t.projectRoot,e.storyId),S=l?.state==="issued"&&l.fromSessionId===h&&l.bundleDigest===f&&l.claimRevision===a&&Date.parse(l.expiresAt)>Date.parse(c),A=S?l.expiresAt:m,j=S?l.token:Re(32).toString("base64url"),x=v(j),u=Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff",storyId:e.storyId,fromSessionId:h,tokenDigest:x,bundleDigest:f,claimRevision:a,expiresAt:A}),k=v(JSON.stringify(u)),p=await H(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:h,idempotencyKey:h,expiresAt:A,persistent:!1,createdAt:c});if(!p.ok)return y(p.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{await M(t.projectRoot,{schemaVersion:1,kind:"direct-yolo-setup-handoff-token",state:"issued",storyId:e.storyId,fromSessionId:h,token:j,tokenDigest:x,bundleDigest:f,claimRevision:a,grantDigest:k,expiresAt:A}),await O(t.projectRoot,w=>{const g=I(C(w,t.epicId).branch_lease);if(!ye(g,e.storyId,c)||g?.sessionId!==h||g.idempotencyKey!==h)throw new Error("direct-yolo-setup-handoff-owner-raced");g.handoffGrant=u},{expectedRevision:n.revision,preCommit:async()=>{if(!await F(p.path,p.owner))throw new Error("direct-yolo-integration-lock-raced");const w=await P(t.projectRoot,e.storyId);if(!w||w.state!=="issued"||w.grantDigest!==k||w.tokenDigest!==x)throw new Error("direct-yolo-setup-handoff-token-raced")}})}finally{await N(p.path,p.owner).catch(()=>{})}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff-receipt",storyId:e.storyId,sessionId:h,bundleDigest:f,claimRevision:a,grantDigest:k,expiresAt:A,reused:S,publicSafe:!0})}}catch(t){return y(t instanceof Error&&/^direct-yolo-/.test(t.message)?t.message:"direct-yolo-setup-handoff-failed")}}async function et(e){try{const t=await K(e.projectRoot,e.storyId),i=await b(t.projectRoot,["rev-parse","HEAD"]),r=$(await E(t.projectRoot,["diff","--cached","--name-only","-z"])),o=G(r,t.authorizedWriteSet,e.storyId);if(!o.ok)return y(o.reasonCode);if($(await E(t.projectRoot,["diff","--name-only","-z"])).some(u=>r.includes(u)))return y("direct-yolo-user-overlap");const f=await E(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!f)return y("direct-yolo-staged-diff-empty");const a=v(f),c=v([...t.authorizedWriteSet].sort().join("\0")),n=v(["direct-yolo-commit-v1",e.storyId,t.epicId,t.executionBranch,i,a,t.graphRevision,c].join("\0")),d=W(e.nowIso);let h=e.setupLeaseHandoff??await Pe(t.projectRoot,e.storyId,a,c,d);const R=await q(t.projectRoot,{required:!0}),m=I(R.epics[t.epicId]?.branch_lease),l=m?.ownerStoryId===e.storyId&&m.sessionId===n&&m.idempotencyKey===n&&typeof m.expiresAt=="string"&&Date.parse(m.expiresAt)>Date.parse(d)?m:void 0;if(l&&e.setupLeaseHandoff)return y("direct-yolo-setup-handoff-replayed");const S=I(l?.handoffConsumption);if(S){const u=await P(t.projectRoot,e.storyId);if(!u||!["consuming","consumed"].includes(u.state)||u.fromSessionId!==S.fromSessionId||u.tokenDigest!==S.tokenDigest||u.bundleDigest!==a||u.claimRevision!==c||S.bundleDigest!==a||S.claimRevision!==c||u.consumedBySessionId!==n||S.consumedBySessionId!==n)return y("direct-yolo-setup-handoff-consume-invalid");if(u.state==="consuming"){if(!u.token||v(u.token)!==u.tokenDigest)return y("direct-yolo-setup-handoff-consume-invalid");h={sessionId:u.fromSessionId,token:u.token}}}const A=l?String(l.expiresAt):new Date(Date.parse(d)+1800*1e3).toISOString(),j=await H(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:n,idempotencyKey:n,expiresAt:A,persistent:!0,createdAt:l&&typeof l.acquiredAt=="string"?l.acquiredAt:d});if(!j.ok)return y(j.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{h&&e.setupLeaseHandoff===void 0&&(await He(t.projectRoot,e.storyId,h.sessionId,h.token,n,d),await e.setupHandoffFault?.("after-consuming-persisted")),await O(t.projectRoot,u=>{const k=C(u,t.epicId),p=I(k.branch_lease),w=p&&Date.parse(String(p.expiresAt))>Date.parse(d),g=p?.ownerStoryId===e.storyId&&p.sessionId===n&&p.idempotencyKey===n,D=p?.ownerStoryId===e.storyId&&p.sessionId===p.idempotencyKey&&typeof p.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(p.idempotencyKey),L=w&&D&&Ge({current:p,handoff:h,storyId:e.storyId,bundleDigest:a,claimRevision:c,nowIso:d});if(h&&w&&!g&&!L)throw new Error("direct-yolo-setup-handoff-invalid");if(w&&!g&&!L)throw new Error("direct-yolo-writer-active");const _=L?I(p?.handoffGrant):void 0,B=_?{schemaVersion:1,kind:"direct-yolo-setup-handoff-consumption",state:"consumed",storyId:e.storyId,fromSessionId:String(p?.sessionId),tokenDigest:String(_.tokenDigest),bundleDigest:a,claimRevision:c,consumedBySessionId:n,consumedAt:d}:void 0;k.branch_mode="epic",k.execution_branch=t.executionBranch,k.origin_branch=t.originBranch,k.graph_revision=t.graphRevision,k.branch_lease=w&&g?p:{schemaVersion:1,ownerStoryId:e.storyId,sessionId:n,idempotencyKey:n,acquiredAt:d,expiresAt:A,...B?{handoffConsumption:B}:{}}},{expectedRevision:R.revision,preCommit:async()=>{if(!await F(j.path,j.owner))throw new Error("direct-yolo-integration-lock-raced")}})}catch(u){throw await N(j.path,j.owner).catch(()=>{}),u}h&&e.setupLeaseHandoff===void 0&&(await e.setupHandoffFault?.("before-consumed-persist"),await Ne(t.projectRoot,t.epicId,e.storyId,h.sessionId,h.token,a,c,n,d));const x=Object.freeze([`Neocortex-Story: ${e.storyId}`,`Neocortex-Epic: ${t.epicId}`,`Neocortex-Execution-Branch: ${t.executionBranch}`,`Neocortex-Prepared-Base: ${i}`,`Neocortex-Bundle-Digest: ${a}`,`Neocortex-Graph-Revision: ${t.graphRevision}`,`Neocortex-Claim-Revision: ${c}`]);return{ok:!0,value:Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:i,bundleDigest:a,graphRevision:t.graphRevision,claimRevision:c,idempotencyKey:n,changedPaths:Object.freeze(r),trailers:x})}}catch(t){return y(X(t,"direct-yolo-begin-failed"))}}async function tt(e){let t,i,r;try{const o=await K(e.projectRoot,e.storyId);t=o;const s=await b(o.projectRoot,["rev-parse","HEAD"]);let f=await q(o.projectRoot,{required:!0});const a=I(f.stories[e.storyId]?.checkpoint);if(a){const D=typeof a.headSha=="string"?a.headSha:"",L=typeof a.graphRevision=="string"?a.graphRevision:"",_=/^[a-f0-9]{40,64}$/.test(D)?$(await E(o.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",D])):[],B=G(_,o.authorizedWriteSet,e.storyId);if(!(/^[a-f0-9]{40,64}$/.test(D)&&await z(o.projectRoot,["merge-base","--is-ancestor",D,s]))||!/^[a-f0-9]{64}$/.test(L)||!B.ok)return y("direct-yolo-replay-invalid");const ge=await Q(e,o.projectRoot,s,L);if(!await se(o.projectRoot,a,e.storyId,o.epicId,o.executionBranch,ge.transientAuthority,o.authorizedWriteSet))return y("direct-yolo-replay-invalid");if(!await U(o.projectRoot,o.executionBranch,s,_))return y("direct-yolo-replay-head-raced");if(e.push&&!await fe(o.projectRoot,e.remote??"origin",o.executionBranch,D))return y("direct-yolo-remote-head-mismatch");const ee=Array.isArray(a.receiptRefs)?a.receiptRefs.find(te=>typeof te=="string"&&/^physical-lock-owner:[a-f0-9]{64}$/.test(te)):void 0;return ee&&typeof a.idempotencyKey=="string"&&await ze(o.projectRoot,{storyId:e.storyId,idempotencyKey:a.idempotencyKey,ownerDigest:ee.slice(20)}),{ok:!0,value:a}}const c=s,n=await b(o.projectRoot,["rev-parse",`${c}^`]),d=await E(o.projectRoot,["show","--no-patch","--format=%B",c]),h=$(await E(o.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",c])),R=G(h,o.authorizedWriteSet,e.storyId);if(!R.ok)return y(R.reasonCode);const m=T(d,"Neocortex-Bundle-Digest"),l=T(d,"Neocortex-Graph-Revision"),S=T(d,"Neocortex-Claim-Revision"),A=new Map([["Neocortex-Story",e.storyId],["Neocortex-Epic",o.epicId],["Neocortex-Execution-Branch",o.executionBranch],["Neocortex-Prepared-Base",n],["Neocortex-Graph-Revision",o.graphRevision],["Neocortex-Claim-Revision",v([...o.authorizedWriteSet].sort().join("\0"))]]);if(!m||!/^[a-f0-9]{64}$/.test(m)||!l||!S||[...A].some(([D,L])=>T(d,D)!==L))return y("direct-yolo-trailers-invalid");const j=v(await E(o.projectRoot,["diff","--binary","--full-index",`${n}..${c}`]));if(m!==j)return y("direct-yolo-bundle-digest-mismatch");const x=v(["direct-yolo-commit-v1",e.storyId,o.epicId,o.executionBranch,n,m,l,S].join("\0")),u=I(f.epics[o.epicId]?.branch_lease),k=W(e.nowIso),p=u?.ownerStoryId===e.storyId&&u.idempotencyKey===x&&u.sessionId===x&&Date.parse(String(u.expiresAt))>Date.now()?u:void 0;if(u&&Date.parse(String(u.expiresAt))>Date.now()&&!p)return y("direct-yolo-writer-active");const w=p??{schemaVersion:1,ownerStoryId:e.storyId,sessionId:x,idempotencyKey:x,acquiredAt:k,expiresAt:new Date(Date.parse(k)+1800*1e3).toISOString()},g=await H(o.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:x,idempotencyKey:x,expiresAt:String(w.expiresAt),persistent:!0,createdAt:String(w.acquiredAt)});if(!g.ok)return y(g.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");r=g,p||(f=(await O(o.projectRoot,L=>{const _=C(L,o.epicId),B=I(_.branch_lease);if(B&&Date.parse(String(B.expiresAt))>Date.parse(k))throw new Error("direct-yolo-writer-active");if(_.graph_revision!==o.graphRevision)throw new Error("direct-yolo-graph-revision-raced");_.branch_lease=w},{expectedRevision:f.revision})).document),i=w;{const D=await Q(e,o.projectRoot,c,o.graphRevision);if(!await U(o.projectRoot,o.executionBranch,c,h))return y("direct-yolo-head-raced");if(e.push){const B=V(e.remote??"origin");if(await b(o.projectRoot,["push",B,o.executionBranch]),!await ue(o.projectRoot,B,o.executionBranch,c))return y("direct-yolo-remote-head-mismatch")}const L=await ce({projectRoot:o.projectRoot,storyId:e.storyId,epicId:o.epicId,executionBranch:o.executionBranch,baseSha:n,headSha:c,bundleDigest:m,graphRevision:l,claimRevision:S,idempotencyKey:x,qaExecution:D,physicalLockOwnerDigest:ie(g.owner),nowIso:W(e.nowIso),legacyReceiptRef:void 0});return await e.beforeCheckpointPersist?.(),await de({projectRoot:o.projectRoot,checkpoint:L,remote:e.push?e.remote??"origin":void 0,expectedRevision:f.revision,expectedLease:w,expectedGraphRevision:o.graphRevision,physicalLockPath:g.path,physicalLockOwner:g.owner,transientAuthority:D.transientAuthority,authorizedWriteSet:o.authorizedWriteSet})?(await e.afterCheckpointPersist?.(),{ok:!0,value:L}):y("direct-yolo-checkpoint-persist-failed")}}catch(o){return y(X(o,"direct-yolo-finalize-failed"))}finally{r&&await N(r.path,r.owner).catch(()=>{}),t&&i?await J(t.projectRoot,t.epicId,i).catch(()=>{}):t&&await Ke(t,e.storyId).catch(()=>{})}}async function rt(e){try{const t=await K(e.projectRoot,e.storyId);if(!/^[a-f0-9]{40,64}$/.test(e.commitSha))return y("direct-yolo-recovery-commit-invalid");const i=await b(t.projectRoot,["rev-parse",e.commitSha]);if(Be[e.storyId]!==i)return y("direct-yolo-recovery-not-allowlisted");if(await b(t.projectRoot,["rev-parse","HEAD"])!==i)return y("direct-yolo-recovery-head-mismatch");await b(t.projectRoot,["merge-base","--is-ancestor",i,`refs/heads/${t.executionBranch}`]);const r=await b(t.projectRoot,["rev-parse",`${i}^`]),o=await E(t.projectRoot,["diff","--binary","--full-index",`${r}..${i}`]),s=$(await E(t.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",i]));if(!G(s,t.authorizedWriteSet.length>0?t.authorizedWriteSet:s,e.storyId).ok)return y("direct-yolo-recovery-write-set-invalid");const a=v(o),c=v([...s].sort().join("\0")),n=v(["legacy-direct-yolo-recovery-v1",e.storyId,i].join("\0")),d=W(e.nowIso),h=new Date(Date.parse(d)+1800*1e3).toISOString(),R=await q(t.projectRoot,{required:!0}),m=await H(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:n,idempotencyKey:n,expiresAt:h,persistent:!0,createdAt:d});if(!m.ok)return y(m.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-recovery-integration-backpressure":"direct-yolo-recovery-integration-lock-failed");const l={schemaVersion:1,ownerStoryId:e.storyId,sessionId:n,idempotencyKey:n,acquiredAt:d,expiresAt:h};let S=!1;try{const A=await O(t.projectRoot,w=>{const g=C(w,t.epicId),D=I(g.branch_lease);if(D&&Date.parse(String(D.expiresAt))>Date.parse(d)&&!Z(D,l))throw new Error("direct-yolo-recovery-writer-active");if(g.graph_revision!==t.graphRevision)throw new Error("direct-yolo-recovery-graph-raced");g.branch_mode="epic",g.execution_branch=t.executionBranch,g.origin_branch=t.originBranch,g.branch_lease=l},{expectedRevision:R.revision});S=!0;const j=await Q(e,t.projectRoot,i,t.graphRevision);if(!await U(t.projectRoot,t.executionBranch,i,s))return y("direct-yolo-recovery-head-raced");if(e.push){const w=V(e.remote??"origin"),g=(await b(t.projectRoot,["ls-remote","--heads",w,`refs/heads/${t.executionBranch}`])).split(/\s+/)[0];if(!g||!await z(t.projectRoot,["merge-base","--is-ancestor",i,g]))return y("direct-yolo-recovery-remote-proof-missing")}const x=await ce({projectRoot:t.projectRoot,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:r,headSha:i,bundleDigest:a,graphRevision:t.graphRevision,claimRevision:c,idempotencyKey:n,qaExecution:j,physicalLockOwnerDigest:ie(m.owner),nowIso:d,legacyReceiptRef:void 0}),u=await Ae(t.projectRoot,{storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:r,headSha:i,bundleDigest:a,graphRevision:t.graphRevision});if(!u)return y("direct-yolo-recovery-evidence-invalid");const k=Object.freeze({...x,receiptRefs:Object.freeze([...x.receiptRefs,u])});return await de({projectRoot:t.projectRoot,checkpoint:k,remote:e.push?e.remote??"origin":void 0,remotePolicy:"ancestor-recovery",expectedRevision:A.document.revision,expectedLease:l,expectedGraphRevision:t.graphRevision,physicalLockPath:m.path,physicalLockOwner:m.owner,transientAuthority:j.transientAuthority,authorizedWriteSet:t.authorizedWriteSet})?{ok:!0,value:k}:y("direct-yolo-recovery-persist-failed")}finally{await N(m.path,m.owner).catch(()=>{}),S&&await J(t.projectRoot,t.epicId,l).catch(()=>{})}}catch(t){return y(X(t,"direct-yolo-recovery-failed"))}}async function K(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 i=Se(e),r=I(JSON.parse(await re(oe(i,".neocortex/state.json"),"utf8"))),o=await q(i,{required:!0}),s=De(r,o),f=I(s.stories),a=I(s.epics),c=I(f?.[t]),n=String(c?.epic_id??t.split(".")[0]),d=I(a?.[n]),h=String(d?.execution_branch??""),R=String(d?.origin_branch??""),m=String(d?.graph_revision??""),l=Array.isArray(c?.files_to_modify)?[...new Set(c.files_to_modify.filter(A=>typeof A=="string"&&le(A)))].sort():[],S=await b(i,["symbolic-ref","--quiet","--short","HEAD"]);if(!c||d?.branch_mode!=="epic"||!me(h)||!me(R)||!await z(i,["check-ref-format","--branch",h])||!await z(i,["check-ref-format","--branch",R])||!/^[a-f0-9]{64}$/.test(m)||S!==h)throw new Error("direct-yolo-epic-authority-invalid");return{projectRoot:i,story:c,epicId:n,executionBranch:h,originBranch:R,graphRevision:m,authorizedWriteSet:l}}async function ce(e){const t=e.nowIso,i=await E(e.projectRoot,["show","--no-patch","--format=%H%n%P%n%B",e.headSha]),r=$(await E(e.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha])),o=xe({storyId:e.storyId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,commitBody:i,changedPaths:r}),s=be({gitEvidenceDigest:o,headSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest}),f=`story-qa:${s}`,a=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:s,verdict:"passed",checkedAt:t,receiptRef:f}),c=v(["root-commit-range-review-v1",e.storyId,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,f,v(i),[...r].sort().join(",")].join("\0")),n=`story-review:${c}`,d=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:c,qaReceiptRef:f,verdict:"approved",reviewedAt:t,receiptRef:n}),h=[`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,f,n,...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(h),qaVerdict:"passed",reviewVerdict:"approved",qaReceipt:a,reviewReceipt:d,recordedAt:t})}async function de(e){const{projectRoot:t,checkpoint:i,remote:r}=e;let o=!1;return await O(t,s=>{const f=C(s,i.epicId);if(e.expectedLease){const d=I(f.branch_lease);if(!Z(d,e.expectedLease))throw new Error("direct-yolo-runtime-revision-conflict");if(Date.parse(String(d?.expiresAt))<=Date.now())throw new Error("direct-yolo-writer-lease-expired");if(f.graph_revision!==e.expectedGraphRevision||i.graphRevision!==e.expectedGraphRevision)throw new Error("direct-yolo-graph-revision-raced")}const a=je(s,i.storyId),c=I(a.checkpoint);if(c&&c.headSha!==i.headSha){o=!0;return}a.checkpoint=i,a.status="done",a.last_step=ae;const n=Array.isArray(a.steps_completed)?a.steps_completed.filter(d=>typeof d=="string"):[];a.steps_completed=[...new Set([...n,Oe,ae])],f.branch_lease=null},{expectedRevision:e.expectedRevision,preCommit:async()=>{if(o)throw new Error("direct-yolo-checkpoint-conflict");if(await b(t,["symbolic-ref","--quiet","--short","HEAD"])!==i.branch||await b(t,["rev-parse","HEAD"])!==i.headSha)throw new Error("direct-yolo-checkpoint-head-raced");if(!await se(t,i,i.storyId,i.epicId,i.branch,e.transientAuthority,e.authorizedWriteSet))throw new Error("direct-yolo-checkpoint-physical-invalid");if(e.physicalLockPath&&e.physicalLockOwner&&!await F(e.physicalLockPath,e.physicalLockOwner))throw new Error("direct-yolo-integration-lock-raced");if(r&&!(e.remotePolicy==="ancestor-recovery"?await fe(t,r,i.branch,i.headSha):await ue(t,r,i.branch,i.headSha)))throw new Error("direct-yolo-checkpoint-remote-raced")}}),!o}async function fe(e,t,i,r){const o=V(t),s=(await b(e,["ls-remote","--heads",o,`refs/heads/${i}`])).split(/\s+/)[0];return!!(s&&await z(e,["merge-base","--is-ancestor",r,s]))}function ye(e,t,i){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(i))}async function he(e,t){const i=await qe(e),r=await Ee(i,"handoffs"),o=`direct-${v(t)}.json`;return{parent:r,name:o,path:oe(r,o)}}async function M(e,t){const i=await he(e,t.storyId);await Ce(i.parent,i.name,`${JSON.stringify(t,null,2)}
2
- `),await ne(i.path,i.parent)}async function P(e,t){try{const i=await he(e,t);await ne(i.path,i.parent);const r=JSON.parse(await re(i.path,"utf8")),o=r.state==="issued"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt"]:r.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(r).sort().join("\0")!==[...o].sort().join("\0")||r.schemaVersion!==1||r.kind!=="direct-yolo-setup-handoff-token"||r.state!=="issued"&&r.state!=="consuming"&&r.state!=="consumed"||r.storyId!==t||typeof r.fromSessionId!="string"||!/^setup-[a-f0-9]{64}$/.test(r.fromSessionId)||![r.tokenDigest,r.bundleDigest,r.claimRevision,r.grantDigest].every(s=>typeof s=="string"&&/^[a-f0-9]{64}$/.test(s))||typeof r.expiresAt!="string"||!Number.isFinite(Date.parse(r.expiresAt))||(r.state==="issued"||r.state==="consuming")&&(typeof r.token!="string"||!/^[A-Za-z0-9_-]{32,256}$/.test(r.token))||r.state==="consuming"&&(typeof r.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(r.consumedBySessionId)||typeof r.consumeStartedAt!="string"||!Number.isFinite(Date.parse(r.consumeStartedAt)))||r.state==="consumed"&&(typeof r.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(r.consumedBySessionId)||typeof r.consumedAt!="string"||!Number.isFinite(Date.parse(r.consumedAt)))?void 0:r}catch{return}}async function Pe(e,t,i,r,o){const s=await P(e,t);if(!(!s||s.state==="consumed"||!s.token||s.bundleDigest!==i||s.claimRevision!==r||Date.parse(s.expiresAt)<=Date.parse(o)||v(s.token)!==s.tokenDigest))return{sessionId:s.fromSessionId,token:s.token}}async function He(e,t,i,r,o,s){const f=await P(e,t);if(!f||f.state==="consumed"||f.fromSessionId!==i||f.token!==r||f.tokenDigest!==v(r))throw new Error("direct-yolo-setup-handoff-consume-invalid");if(f.state==="consuming"){if(f.consumedBySessionId!==o)throw new Error("direct-yolo-setup-handoff-consume-raced");return}await M(e,{...f,state:"consuming",consumedBySessionId:o,consumeStartedAt:s})}async function Ne(e,t,i,r,o,s,f,a,c){const n=await P(e,i);if(n?.state==="consumed"&&n.fromSessionId===r&&n.consumedBySessionId===a)return;const d=await q(e,{required:!0}),h=I(d.epics[t]?.branch_lease),R=I(h?.handoffConsumption);if(!n||n.state!=="consuming"||n.fromSessionId!==r||n.token!==o||n.tokenDigest!==v(o)||n.bundleDigest!==s||n.claimRevision!==f||n.consumedBySessionId!==a||h?.ownerStoryId!==i||h.sessionId!==a||R?.kind!=="direct-yolo-setup-handoff-consumption"||R.state!=="consumed"||R.fromSessionId!==r||R.tokenDigest!==n.tokenDigest||R.bundleDigest!==s||R.claimRevision!==f||R.consumedBySessionId!==a)throw new Error("direct-yolo-setup-handoff-consume-invalid");try{await M(e,{schemaVersion:1,kind:n.kind,state:"consumed",storyId:i,fromSessionId:r,tokenDigest:n.tokenDigest,bundleDigest:n.bundleDigest,claimRevision:n.claimRevision,grantDigest:n.grantDigest,expiresAt:n.expiresAt,consumedBySessionId:a,consumedAt:c})}catch{throw new Error("direct-yolo-setup-handoff-consume-persist-failed")}}function Ge(e){const t=I(e.current?.handoffGrant),i=e.handoff?.token,r=typeof i=="string"&&/^[A-Za-z0-9_-]{32,256}$/.test(i)?v(i):void 0;return!!(t&&r&&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)&&We(t.tokenDigest,r))}function We(e,t){const i=Buffer.from(e,"hex"),r=Buffer.from(t,"hex");return i.length===32&&r.length===32&&ve(i,r)}function Z(e,t){return!!(e&&["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt"].every(i=>e[i]===t[i]))}async function J(e,t,i){await O(e,r=>{const o=C(r,t),s=I(o.branch_lease);Z(s,i)&&(o.branch_lease=null)})}async function Ke(e,t){const i=await q(e.projectRoot,{required:!0}),r=I(i.epics[e.epicId]?.branch_lease);if(!r||r.ownerStoryId!==t||!pe(r.sessionId)||!pe(r.idempotencyKey)||!Number.isFinite(Date.parse(String(r.acquiredAt)))||!Number.isFinite(Date.parse(String(r.expiresAt))))return;const o=await H(e.projectRoot,{kind:"direct",storyId:t,sessionId:String(r.sessionId),idempotencyKey:String(r.idempotencyKey),createdAt:String(r.acquiredAt),expiresAt:String(r.expiresAt),persistent:!0});if(!o.ok)return;await N(o.path,o.owner)&&await J(e.projectRoot,e.epicId,r)}async function Q(e,t,i,r){const o=await Le(t,{headSha:i,graphRevision:r,nowIso:e.nowIso});await e.qaRunner?.({projectRoot:t,storyId:e.storyId,headSha:i});const s=_e(o);if(!s)throw new Error("p205-transient-authority-invalid");return{contract:"P205-CI-02",command:$e,manifestDigest:s.manifestDigest,gateIds:s.gateIds,resultDigest:s.resultDigest,transientAuthority:o}}async function U(e,t,i,r){return await b(e,["rev-parse","HEAD"])!==i||await b(e,["symbolic-ref","--quiet","--short","HEAD"])!==t||!await z(e,["diff","--cached","--quiet"])?!1:z(e,["diff","--quiet","HEAD","--",...r])}async function ue(e,t,i,r){const o=V(t);return(await b(e,["ls-remote","--heads",o,`refs/heads/${i}`])).split(/\s+/)[0]===r}function G(e,t,i){if(e.length===0||e.some(o=>!le(o)))return{ok:!1,reasonCode:"direct-yolo-write-set-invalid"};const r=[".neocortex/state.json",`docs/stories/${i}.story.md`,`.neocortex/stories/${i}/qa-gate-result.json`,`.neocortex/stories/${i}/validation-evidence.md`,`.neocortex/stories/${i}/review.md`];return!r.every(o=>e.includes(o))||!r.every(o=>t.includes(o))?{ok:!1,reasonCode:"direct-yolo-write-set-invalid"}:e.some(o=>!t.includes(o))?{ok:!1,reasonCode:"direct-yolo-write-set-unauthorized"}:{ok:!0}}function le(e){return e.length>0&&e.length<=1024&&!e.startsWith("/")&&!e.includes("\\")&&!e.split("/").includes("..")&&!e.startsWith(".git/")&&!e.includes("\0")}function pe(e){return typeof e=="string"&&e.length>0&&e.length<=512&&/^[A-Za-z0-9._:@/+\-=]+$/.test(e)}function me(e){return e.length>0&&e.length<=240&&!e.startsWith("-")&&!/[\s~^:?*[\\]/.test(e)&&!e.includes("..")}function V(e){if(!/^[A-Za-z0-9._-]{1,128}$/.test(e))throw new Error("direct-yolo-remote-invalid");return e}function T(e,t){const i=`${t}: `,r=e.split(`
3
- `).map(o=>o.trim()).filter(o=>o.startsWith(i)).map(o=>o.slice(i.length));return r.length===1?r[0]:void 0}function v(e){return Ie("sha256").update(e).digest("hex")}function $(e){return e.split("\0").filter(Boolean)}function W(e){return e&&Number.isFinite(Date.parse(e))?new Date(Date.parse(e)).toISOString():new Date().toISOString()}function I(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function X(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 y(e){return{ok:!1,reasonCode:e}}async function b(e,t){return String((await Y("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout).trim()}async function E(e,t){return String((await Y("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout)}async function z(e,t){try{return await Y("git",[...t],{cwd:e,maxBuffer:8*1024*1024}),!0}catch{return!1}}export{et as beginDirectYoloStoryCommit,tt as finalizeDirectYoloStoryCheckpoint,Xe as issueDirectYoloSetupLeaseHandoff,rt as recoverLegacyDirectYoloStoryCheckpoint};
1
+ import{execFile as xe}from"node:child_process";import{createHash as De,randomBytes as oe,timingSafeEqual as be}from"node:crypto";import{readFile as ie}from"node:fs/promises";import{join as ne,resolve as ae}from"node:path";import{promisify as Ae}from"node:util";import{acquireGitLifecyclePhysicalIntegrationLock as N,applyGitLifecycleRuntimeOverlay as je,computeImmutableStoryQaEvidenceDigest as Ee,computeGitLifecyclePhysicalIntegrationLockOwnerDigest as se,computeP205StoryQaEvidenceDigest as Be,computeLegacyDirectYoloRecoveryReceiptRef as _e,ensureRuntimeEpic as z,ensureRuntimeStory as Le,ensureGitLifecyclePrivateChildDirectory as qe,executeP205TransientAuthority as $e,projectP205TransientExecutionEvidence as Ce,LEGACY_DIRECT_YOLO_RECOVERY_COMMITS as ze,mutateGitLifecycleRuntime as H,P205_COMPLETE_COMMAND as He,readGitLifecycleRuntime as q,gitLifecycleRuntimeDirectory as Oe,assertGitLifecyclePrivateFile as ce,releaseGitLifecyclePhysicalIntegrationLock as V,releaseGitLifecyclePhysicalIntegrationLockForCheckpoint as Pe,verifyGitLifecyclePhysicalIntegrationLock as Y,verifyAcceptedGitLifecycleStoryCheckpoint as de}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 fe}from"./git-lifecycle-step-ids.js";const M=Ae(xe);async function it(e){try{const t=await he(e.projectRoot,e.storyId),o=P(e.nowIso),r=Date.parse(o),i=await w(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),n=await w(t.projectRoot,["rev-parse","HEAD"]),u=await q(t.projectRoot,{required:!0}),s=R(u.epics[t.epicId]),d=R(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(g=>g.branch===t.executionBranch&&ae(g.path)!==t.projectRoot))return f("direct-yolo-execution-branch-checked-out-elsewhere");const p=await Se(t.projectRoot),h=`refs/heads/${t.executionBranch}`;if(await C(t.projectRoot,["show-ref","--verify","--quiet",h])){const g=await w(t.projectRoot,["rev-parse",h]);if(g!==n){if(!await C(t.projectRoot,["merge-base","--is-ancestor",g,n]))return f("direct-yolo-execution-branch-diverged");await w(t.projectRoot,["update-ref",h,n,g])}await w(t.projectRoot,["switch",t.executionBranch])}else await w(t.projectRoot,["switch","-c",t.executionBranch]);if(await Se(t.projectRoot)!==p)return f("direct-yolo-checkout-payload-raced")}const l=await w(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),S=await w(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:ve(t,c,String(d.expiresAt),!0)};const m=o,y=new Date(r+3600*1e3).toISOString(),k=`setup-${oe(32).toString("hex")}`,E=await q(t.projectRoot,{required:!0});return await H(t.projectRoot,A=>{const p=z(A,t.epicId),h=R(p.branch_lease);if(h&&Date.parse(String(h.expiresAt))>r&&h.ownerStoryId!==e.storyId)throw new Error("direct-yolo-writer-active");const g=Re(p.origin_binding,t.executionBranch,t.originBranch);if(p.origin_binding&&!g)throw new Error("direct-yolo-origin-binding-conflict");if(g&&JSON.stringify(g)!==JSON.stringify(c))throw new Error("direct-yolo-origin-binding-conflict");p.branch_mode="epic",p.execution_branch=t.executionBranch,p.origin_branch=t.originBranch,p.graph_revision=t.graphRevision,p.origin_binding=c,p.branch_lease={schemaVersion:1,ownerStoryId:e.storyId,sessionId:k,idempotencyKey:k,acquiredAt:m,expiresAt:y}},{expectedRevision:E.revision,preCommit:async()=>{if(await w(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==t.executionBranch||await w(t.projectRoot,["rev-parse","HEAD"])!==S)throw new Error("direct-yolo-setup-physical-state-raced")}}),{ok:!0,value:ve(t,c,y,!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=$(await b(t.projectRoot,["diff","--cached","--name-only","-z"])),r=W(o,t.authorizedWriteSet,e.storyId);if(!r.ok)return f(r.reasonCode);if($(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=R(a.epics[t.epicId]?.branch_lease);if(!pe(c,e.storyId,d))return f("direct-yolo-setup-handoff-owner-invalid");const l=String(c.sessionId),S=String(c.expiresAt),m=new Date(Math.min(Date.parse(S),Date.parse(d)+300*1e3)).toISOString(),y=await O(t.projectRoot,e.storyId),k=y?.state==="issued"&&y.fromSessionId===l&&y.bundleDigest===u&&y.claimRevision===s&&Date.parse(y.expiresAt)>Date.parse(d),E=k?y.expiresAt:m,A=k?y.token:oe(32).toString("base64url"),p=D(A),h=Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff",storyId:e.storyId,fromSessionId:l,tokenDigest:p,bundleDigest:u,claimRevision:s,expiresAt:E}),g=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 Z(t.projectRoot,{schemaVersion:1,kind:"direct-yolo-setup-handoff-token",state:"issued",storyId:e.storyId,fromSessionId:l,token:A,tokenDigest:p,bundleDigest:u,claimRevision:s,grantDigest:g,expiresAt:E}),await H(t.projectRoot,x=>{const v=R(z(x,t.epicId).branch_lease);if(!pe(v,e.storyId,d)||v?.sessionId!==l||v.idempotencyKey!==l)throw new Error("direct-yolo-setup-handoff-owner-raced");v.handoffGrant=h},{expectedRevision:a.revision,preCommit:async()=>{if(!await Y(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!==g||x.tokenDigest!==p)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:g,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 w(t.projectRoot,["rev-parse","HEAD"]),r=$(await b(t.projectRoot,["diff","--cached","--name-only","-z"])),i=W(r,t.authorizedWriteSet,e.storyId);if(!i.ok)return f(i.reasonCode);if($(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}),m=R(S.epics[t.epicId]?.branch_lease),y=m?.ownerStoryId===e.storyId&&m.sessionId===a&&m.idempotencyKey===a&&typeof m.expiresAt=="string"&&Date.parse(m.expiresAt)>Date.parse(c)?m:void 0;if(y&&e.setupLeaseHandoff)return f("direct-yolo-setup-handoff-replayed");const k=R(y?.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=y?String(y.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:y&&typeof y.acquiredAt=="string"?y.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 H(t.projectRoot,h=>{const g=z(h,t.epicId),I=R(g.branch_lease),x=I&&Date.parse(String(I.expiresAt))>Date.parse(c),v=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&&!v&&!B)throw new Error("direct-yolo-setup-handoff-invalid");if(x&&!v&&!B)throw new Error("direct-yolo-writer-active");const _=B?R(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;g.branch_mode="epic",g.execution_branch=t.executionBranch,g.origin_branch=t.originBranch,g.graph_revision=t.graphRevision,g.branch_lease=x&&v?I:{schemaVersion:1,ownerStoryId:e.storyId,sessionId:a,idempotencyKey:a,acquiredAt:c,expiresAt:E,...L?{handoffConsumption:L}:{}}},{expectedRevision:S.revision,preCommit:async()=>{if(!await Y(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 p=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:p})}}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 w(i.projectRoot,["rev-parse","HEAD"]);let u=await q(i.projectRoot,{required:!0});const s=R(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)?$(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 C(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 U(e,i.projectRoot,n,B);if(!await de(i.projectRoot,s,e.storyId,i.epicId,i.executionBranch,ke.transientAuthority,i.authorizedWriteSet))return f("direct-yolo-replay-invalid");if(!await X(i.projectRoot,i.executionBranch,n,_))return f("direct-yolo-replay-head-raced");if(e.push&&!await ye(i.projectRoot,e.remote??"origin",i.executionBranch,j))return f("direct-yolo-remote-head-mismatch");const te=Array.isArray(s.receiptRefs)?s.receiptRefs.find(re=>typeof re=="string"&&/^physical-lock-owner:[a-f0-9]{64}$/.test(re)):void 0;return te&&typeof s.idempotencyKey=="string"&&await Pe(i.projectRoot,{storyId:e.storyId,idempotencyKey:s.idempotencyKey,ownerDigest:te.slice(20)}),{ok:!0,value:s}}const d=n,a=await w(i.projectRoot,["rev-parse",`${d}^`]),c=await b(i.projectRoot,["show","--no-patch","--format=%B",d]),l=$(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 m=F(c,"Neocortex-Bundle-Digest"),y=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(!m||!/^[a-f0-9]{64}$/.test(m)||!y||!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(m!==A)return f("direct-yolo-bundle-digest-mismatch");const p=D(["direct-yolo-commit-v1",e.storyId,i.epicId,i.executionBranch,a,m,y,k].join("\0")),h=R(u.epics[i.epicId]?.branch_lease),g=P(e.nowIso),I=h?.ownerStoryId===e.storyId&&h.idempotencyKey===p&&h.sessionId===p&&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:p,idempotencyKey:p,acquiredAt:g,expiresAt:new Date(Date.parse(g)+1800*1e3).toISOString()},v=await N(i.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:p,idempotencyKey:p,expiresAt:String(x.expiresAt),persistent:!0,createdAt:String(x.acquiredAt)});if(!v.ok)return f(v.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");r=v,I||(u=(await H(i.projectRoot,B=>{const _=z(B,i.epicId),L=R(_.branch_lease);if(L&&Date.parse(String(L.expiresAt))>Date.parse(g))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 U(e,i.projectRoot,d,i.graphRevision);if(!await X(i.projectRoot,i.executionBranch,d,l))return f("direct-yolo-head-raced");if(e.push){const L=K(e.remote??"origin");if(await w(i.projectRoot,["push",L,i.executionBranch]),!await me(i.projectRoot,L,i.executionBranch,d))return f("direct-yolo-remote-head-mismatch")}const B=await ue({projectRoot:i.projectRoot,storyId:e.storyId,epicId:i.epicId,executionBranch:i.executionBranch,baseSha:a,headSha:d,bundleDigest:m,graphRevision:y,claimRevision:k,idempotencyKey:p,qaExecution:j,physicalLockOwnerDigest:se(v.owner),nowIso:P(e.nowIso),legacyReceiptRef:void 0});return await e.beforeCheckpointPersist?.(),await le({projectRoot:i.projectRoot,checkpoint:B,remote:e.push?e.remote??"origin":void 0,expectedRevision:u.revision,expectedLease:x,expectedGraphRevision:i.graphRevision,physicalLockPath:v.path,physicalLockOwner:v.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 Q(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 w(t.projectRoot,["rev-parse",e.commitSha]);if(ze[e.storyId]!==o)return f("direct-yolo-recovery-not-allowlisted");if(await w(t.projectRoot,["rev-parse","HEAD"])!==o)return f("direct-yolo-recovery-head-mismatch");await w(t.projectRoot,["merge-base","--is-ancestor",o,`refs/heads/${t.executionBranch}`]);const r=await w(t.projectRoot,["rev-parse",`${o}^`]),i=await b(t.projectRoot,["diff","--binary","--full-index",`${r}..${o}`]),n=$(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}),m=await N(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:a,idempotencyKey:a,expiresAt:l,persistent:!0,createdAt:c});if(!m.ok)return f(m.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-recovery-integration-backpressure":"direct-yolo-recovery-integration-lock-failed");const y={schemaVersion:1,ownerStoryId:e.storyId,sessionId:a,idempotencyKey:a,acquiredAt:c,expiresAt:l};let k=!1;try{const E=await H(t.projectRoot,x=>{const v=z(x,t.epicId),j=R(v.branch_lease);if(j&&Date.parse(String(j.expiresAt))>Date.parse(c)&&!J(j,y))throw new Error("direct-yolo-recovery-writer-active");if(v.graph_revision!==t.graphRevision)throw new Error("direct-yolo-recovery-graph-raced");v.branch_mode="epic",v.execution_branch=t.executionBranch,v.origin_branch=t.originBranch,v.branch_lease=y},{expectedRevision:S.revision});k=!0;const A=await U(e,t.projectRoot,o,t.graphRevision);if(!await X(t.projectRoot,t.executionBranch,o,n))return f("direct-yolo-recovery-head-raced");if(e.push){const x=K(e.remote??"origin"),v=(await w(t.projectRoot,["ls-remote","--heads",x,`refs/heads/${t.executionBranch}`])).split(/\s+/)[0];if(!v||!await C(t.projectRoot,["merge-base","--is-ancestor",o,v]))return f("direct-yolo-recovery-remote-proof-missing")}const p=await ue({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:se(m.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 g=Object.freeze({...p,receiptRefs:Object.freeze([...p.receiptRefs,h])});return await le({projectRoot:t.projectRoot,checkpoint:g,remote:e.push?e.remote??"origin":void 0,remotePolicy:"ancestor-recovery",expectedRevision:E.document.revision,expectedLease:y,expectedGraphRevision:t.graphRevision,physicalLockPath:m.path,physicalLockOwner:m.owner,transientAuthority:A.transientAuthority,authorizedWriteSet:t.authorizedWriteSet})?{ok:!0,value:g}:f("direct-yolo-recovery-persist-failed")}finally{await V(m.path,m.owner).catch(()=>{}),k&&await Q(t.projectRoot,t.epicId,y).catch(()=>{})}}catch(t){return f(T(t,"direct-yolo-recovery-failed"))}}async function he(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=ae(e),r=R(JSON.parse(await ie(ne(o,".neocortex/state.json"),"utf8"))),i=await q(o,{required:!0}),n=je(r,i),u=R(n.stories),s=R(n.epics),d=R(u?.[t]),a=String(d?.epic_id??t.split(".")[0]),c=R(s?.[a]),l=String(c?.execution_branch??""),S=String(c?.origin_branch??""),m=String(c?.graph_revision??""),y=Array.isArray(d?.files_to_modify)?[...new Set(d.files_to_modify.filter(k=>typeof k=="string"&&ee(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(!Ie(l)||!await C(o,["check-ref-format","--branch",l]))throw new Error("direct-yolo-execution-branch-invalid");if(!Ie(S)||!await C(o,["check-ref-format","--branch",S]))throw new Error("direct-yolo-origin-branch-invalid");if(!/^[a-f0-9]{64}$/.test(m))throw new Error("direct-yolo-graph-revision-invalid");return{projectRoot:o,storyId:t,story:d,epicId:a,executionBranch:l,originBranch:S,graphRevision:m,authorizedWriteSet:y}}async function G(e,t){const o=await he(e,t);if(await w(o.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==o.executionBranch)throw new Error("direct-yolo-current-branch-mismatch");return o}async function ue(e){const t=e.nowIso,o=await b(e.projectRoot,["show","--no-patch","--format=%H%n%P%n%B",e.headSha]),r=$(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 le(e){const{projectRoot:t,checkpoint:o,remote:r}=e;let i=!1;return await H(t,n=>{const u=z(n,o.epicId);if(e.expectedLease){const c=R(u.branch_lease);if(!J(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=R(s.checkpoint);if(d&&d.headSha!==o.headSha){i=!0;return}s.checkpoint=o,s.status="done",s.last_step=fe;const a=Array.isArray(s.steps_completed)?s.steps_completed.filter(c=>typeof c=="string"):[];s.steps_completed=[...new Set([...a,Ve,fe])],u.branch_lease=null},{expectedRevision:e.expectedRevision,preCommit:async()=>{if(i)throw new Error("direct-yolo-checkpoint-conflict");if(await w(t,["symbolic-ref","--quiet","--short","HEAD"])!==o.branch||await w(t,["rev-parse","HEAD"])!==o.headSha)throw new Error("direct-yolo-checkpoint-head-raced");if(!await de(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 Y(e.physicalLockPath,e.physicalLockOwner))throw new Error("direct-yolo-integration-lock-raced");if(r&&!(e.remotePolicy==="ancestor-recovery"?await ye(t,r,o.branch,o.headSha):await me(t,r,o.branch,o.headSha)))throw new Error("direct-yolo-checkpoint-remote-raced")}}),!i}async function ye(e,t,o,r){const i=K(t),n=(await w(e,["ls-remote","--heads",i,`refs/heads/${o}`])).split(/\s+/)[0];return!!(n&&await C(e,["merge-base","--is-ancestor",r,n]))}function pe(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 ge(e,t){const o=await Oe(e),r=await qe(o,"handoffs"),i=`direct-${D(t)}.json`;return{parent:r,name:i,path:ne(r,i)}}async function Z(e,t){const o=await ge(e,t.storyId);await Ne(o.parent,o.name,`${JSON.stringify(t,null,2)}
2
+ `),await ce(o.path,o.parent)}async function O(e,t){try{const o=await ge(e,t);await ce(o.path,o.parent);const r=JSON.parse(await ie(o.path,"utf8")),i=r.state==="issued"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt"]:r.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(r).sort().join("\0")!==[...i].sort().join("\0")||r.schemaVersion!==1||r.kind!=="direct-yolo-setup-handoff-token"||r.state!=="issued"&&r.state!=="consuming"&&r.state!=="consumed"||r.storyId!==t||typeof r.fromSessionId!="string"||!/^setup-[a-f0-9]{64}$/.test(r.fromSessionId)||![r.tokenDigest,r.bundleDigest,r.claimRevision,r.grantDigest].every(n=>typeof n=="string"&&/^[a-f0-9]{64}$/.test(n))||typeof r.expiresAt!="string"||!Number.isFinite(Date.parse(r.expiresAt))||(r.state==="issued"||r.state==="consuming")&&(typeof r.token!="string"||!/^[A-Za-z0-9_-]{32,256}$/.test(r.token))||r.state==="consuming"&&(typeof r.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(r.consumedBySessionId)||typeof r.consumeStartedAt!="string"||!Number.isFinite(Date.parse(r.consumeStartedAt)))||r.state==="consumed"&&(typeof r.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(r.consumedBySessionId)||typeof r.consumedAt!="string"||!Number.isFinite(Date.parse(r.consumedAt)))?void 0:r}catch{return}}async function We(e,t,o,r,i){const n=await O(e,t);if(!(!n||n.state==="consumed"||!n.token||n.bundleDigest!==o||n.claimRevision!==r||Date.parse(n.expiresAt)<=Date.parse(i)||D(n.token)!==n.tokenDigest))return{sessionId:n.fromSessionId,token:n.token}}async function Ge(e,t,o,r,i,n){const u=await O(e,t);if(!u||u.state==="consumed"||u.fromSessionId!==o||u.token!==r||u.tokenDigest!==D(r))throw new Error("direct-yolo-setup-handoff-consume-invalid");if(u.state==="consuming"){if(u.consumedBySessionId!==i)throw new Error("direct-yolo-setup-handoff-consume-raced");return}await Z(e,{...u,state:"consuming",consumedBySessionId:i,consumeStartedAt:n})}async function Ke(e,t,o,r,i,n,u,s,d){const a=await O(e,o);if(a?.state==="consumed"&&a.fromSessionId===r&&a.consumedBySessionId===s)return;const c=await q(e,{required:!0}),l=R(c.epics[t]?.branch_lease),S=R(l?.handoffConsumption);if(!a||a.state!=="consuming"||a.fromSessionId!==r||a.token!==i||a.tokenDigest!==D(i)||a.bundleDigest!==n||a.claimRevision!==u||a.consumedBySessionId!==s||l?.ownerStoryId!==o||l.sessionId!==s||S?.kind!=="direct-yolo-setup-handoff-consumption"||S.state!=="consumed"||S.fromSessionId!==r||S.tokenDigest!==a.tokenDigest||S.bundleDigest!==n||S.claimRevision!==u||S.consumedBySessionId!==s)throw new Error("direct-yolo-setup-handoff-consume-invalid");try{await Z(e,{schemaVersion:1,kind:a.kind,state:"consumed",storyId:o,fromSessionId:r,tokenDigest:a.tokenDigest,bundleDigest:a.bundleDigest,claimRevision:a.claimRevision,grantDigest:a.grantDigest,expiresAt:a.expiresAt,consumedBySessionId:s,consumedAt:d})}catch{throw new Error("direct-yolo-setup-handoff-consume-persist-failed")}}function Fe(e){const t=R(e.current?.handoffGrant),o=e.handoff?.token,r=typeof o=="string"&&/^[A-Za-z0-9_-]{32,256}$/.test(o)?D(o):void 0;return!!(t&&r&&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)&&Te(t.tokenDigest,r))}function Te(e,t){const o=Buffer.from(e,"hex"),r=Buffer.from(t,"hex");return o.length===32&&r.length===32&&be(o,r)}function J(e,t){return!!(e&&["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt"].every(o=>e[o]===t[o]))}async function Q(e,t,o){await H(e,r=>{const i=z(r,t),n=R(i.branch_lease);J(n,o)&&(i.branch_lease=null)})}async function Ye(e,t){const o=await q(e.projectRoot,{required:!0}),r=R(o.epics[e.epicId]?.branch_lease);if(!r||r.ownerStoryId!==t||!we(r.sessionId)||!we(r.idempotencyKey)||!Number.isFinite(Date.parse(String(r.acquiredAt)))||!Number.isFinite(Date.parse(String(r.expiresAt))))return;const i=await N(e.projectRoot,{kind:"direct",storyId:t,sessionId:String(r.sessionId),idempotencyKey:String(r.idempotencyKey),createdAt:String(r.acquiredAt),expiresAt:String(r.expiresAt),persistent:!0});if(!i.ok)return;await V(i.path,i.owner)&&await Q(e.projectRoot,e.epicId,r)}async function U(e,t,o,r){const i=await $e(t,{headSha:o,graphRevision:r,nowIso:e.nowIso});await e.qaRunner?.({projectRoot:t,storyId:e.storyId,headSha:o});const n=Ce(i);if(!n)throw new Error("p205-transient-authority-invalid");return{contract:"P205-CI-02",command:He,manifestDigest:n.manifestDigest,gateIds:n.gateIds,resultDigest:n.resultDigest,transientAuthority:i}}async function X(e,t,o,r){return await w(e,["rev-parse","HEAD"])!==o||await w(e,["symbolic-ref","--quiet","--short","HEAD"])!==t||!await C(e,["diff","--cached","--quiet"])?!1:C(e,["diff","--quiet","HEAD","--",...r])}async function me(e,t,o,r){const i=K(t);return(await w(e,["ls-remote","--heads",i,`refs/heads/${o}`])).split(/\s+/)[0]===r}function W(e,t,o){if(e.length===0||e.some(i=>!ee(i)))return{ok:!1,reasonCode:"direct-yolo-write-set-invalid"};const r=[".neocortex/state.json",`docs/stories/${o}.story.md`,`.neocortex/stories/${o}/qa-gate-result.json`,`.neocortex/stories/${o}/validation-evidence.md`,`.neocortex/stories/${o}/review.md`];return!r.every(i=>e.includes(i))||!r.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 ee(e){return e.length>0&&e.length<=1024&&!e.startsWith("/")&&!e.includes("\\")&&!e.split("/").includes("..")&&!e.startsWith(".git/")&&!e.includes("\0")}function we(e){return typeof e=="string"&&e.length>0&&e.length<=512&&/^[A-Za-z0-9._:@/+\-=]+$/.test(e)}function Ie(e){return e.length>0&&e.length<=240&&!e.startsWith("-")&&!/[\s~^:?*[\\]/.test(e)&&!e.includes("..")}function K(e){if(!/^[A-Za-z0-9._-]{1,128}$/.test(e))throw new Error("direct-yolo-remote-invalid");return e}function F(e,t){const o=`${t}: `,r=e.split(`
3
+ `).map(i=>i.trim()).filter(i=>i.startsWith(o)).map(i=>i.slice(o.length));return r.length===1?r[0]:void 0}function D(e){return De("sha256").update(e).digest("hex")}function $(e){return e.split("\0").filter(Boolean)}function P(e){return e&&Number.isFinite(Date.parse(e))?new Date(Date.parse(e)).toISOString():new Date().toISOString()}function R(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Re(e,t,o){const r=R(e);if(!(!r||r.schemaVersion!==1||r.originBranch!==o||r.executionBranch!==t||r.capturedFromCurrentCheckout!==!0||typeof r.originHeadSha!="string"||!/^[a-f0-9]{40,64}$/.test(r.originHeadSha)||typeof r.capturedAt!="string"||!Number.isFinite(Date.parse(r.capturedAt))))return r}function ve(e,t,o,r){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:o,reused:r,publicSafe:!0})}async function Se(e){const t=$(await b(e,["ls-files","--others","--exclude-standard","-z"])).sort(),o=await Promise.all(t.map(async r=>{if(!ee(r))throw new Error("direct-yolo-checkout-payload-invalid");return`${r}\0${await w(e,["hash-object","--no-filters","--",r])}`}));return D([await b(e,["diff","--cached","--binary","--full-index"]),await b(e,["diff","--binary","--full-index"]),await b(e,["status","--porcelain=v1","-z","--untracked-files=all"]),...o].join("\0"))}async function Me(e){const t=[];let o;for(const r of(await b(e,["worktree","list","--porcelain"])).split(`
4
+ `))r.startsWith("worktree ")?(o={path:r.slice(9)},t.push(o)):o&&r.startsWith("branch refs/heads/")&&(o.branch=r.slice(18));return t}function T(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 f(e){return{ok:!1,reasonCode:e}}async function w(e,t){return String((await M("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout).trim()}async function b(e,t){return String((await M("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout)}async function C(e,t){try{return await M("git",[...t],{cwd:e,maxBuffer:8*1024*1024}),!0}catch{return!1}}export{at as beginDirectYoloStoryCommit,st as finalizeDirectYoloStoryCheckpoint,nt as issueDirectYoloSetupLeaseHandoff,it as prepareDirectYoloSetup,ct as recoverLegacyDirectYoloStoryCheckpoint};
@@ -39,6 +39,12 @@ export interface GitLifecycleReadOptions {
39
39
  /** Epic-aware calls require the initialized sidecar; projectless calls opt out explicitly. */
40
40
  readonly required?: boolean;
41
41
  }
42
+ export interface GitLifecycleGraphAuthorityPersistenceResult {
43
+ readonly applied: boolean;
44
+ readonly reused: boolean;
45
+ readonly revision: number;
46
+ readonly graphRevision: string;
47
+ }
42
48
  export interface GitLifecycleCheckpointVerification {
43
49
  readonly schemaVersion: 1;
44
50
  readonly kind: 'story_checkpoint_physical_verification';
@@ -93,6 +99,13 @@ export declare function readGitLifecycleRuntimeSync(projectRoot: string, options
93
99
  * permission-unsafe paths continue to fail closed.
94
100
  */
95
101
  export declare function ensureGitLifecycleRuntimeInitialized(projectRoot: string): Promise<void>;
102
+ /**
103
+ * Close the server-plan -> client -> P207 sidecar handoff. The authority is
104
+ * accepted only for the exact tracked epic/story/branch projection that the
105
+ * server selected. Tracked-state drift and sidecar revision races fail closed;
106
+ * no tracked, staged or working-tree bytes are modified.
107
+ */
108
+ export declare function persistGitLifecycleGraphAuthority(projectRoot: string, authority: unknown, nowIso?: string): Promise<GitLifecycleGraphAuthorityPersistenceResult>;
96
109
  export declare function mutateGitLifecycleRuntime<T>(projectRoot: string, mutate: (document: GitLifecycleRuntimeDocument) => T, options?: GitLifecycleMutationOptions): Promise<GitLifecycleMutationResult<T>>;
97
110
  /** Merge the runtime overlay over tracked state without mutating either input. */
98
111
  export declare function applyGitLifecycleRuntimeOverlay(tracked: Record<string, unknown>, runtime: GitLifecycleRuntimeDocument): Record<string, unknown>;
@@ -1,4 +1,4 @@
1
- import{execFile as it,execFileSync as X}from"node:child_process";import{createHash as m,randomBytes as ye}from"node:crypto";import{lstat as be,open as rt,readFile as F,realpath as M,stat as nt}from"node:fs/promises";import{existsSync as L,lstatSync as ke,readFileSync as Oe,realpathSync as we}from"node:fs";import{basename as E,dirname as z,isAbsolute as ee,join as p,relative as at,resolve as h}from"node:path";import{promisify as ct}from"node:util";import{publicWriteSet as ot}from"../../../shared/dist/yoloop/public-story-write-set.js";import{anchoredAtomicWriteFile as st,anchoredCreateOwnedDirectory as Pe,anchoredEnsureDirectory as Ne,anchoredExecuteGit as dt,anchoredExecuteNode as $e,anchoredRemoveDirectory as ft,anchoredRenameDirectory as Q}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as ut,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as gt}from"./git-lifecycle-step-ids.js";const k=ct(it),ce="neocortex-yoloop",oe="runtime.json",O="node scripts/test-root.mjs --gate complete",Ve=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),lt=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",ht="runtime.lock",Le=new WeakMap;async function di(t,e){if(!w(e.headSha)||!g(e.graphRevision))throw new Error("p205-transient-binding-invalid");const i=e.anchoredWorkspace;if(i&&h(t)!==p(h(i.parent),i.name))throw new Error("p205-transient-anchor-binding-invalid");const r=async A=>i?(await dt(i.parent,i.name,i.identity,A)).toString("utf8"):String((await k("git",[...A],{cwd:t,encoding:"utf8",maxBuffer:8*1024*1024})).stdout),n=async()=>i?JSON.parse((await $e(i.parent,i.name,i.identity,["-e","const fs=require('node:fs');process.stdout.write(JSON.stringify({manifest:fs.readFileSync('config/release-gates.v2.json','utf8'),runner:fs.readFileSync('scripts/test-root.mjs','utf8')}));"])).toString("utf8")):{manifest:await F(p(t,"config","release-gates.v2.json"),"utf8"),runner:await F(p(t,"scripts","test-root.mjs"),"utf8")};if((await r(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-mismatch");const{manifest:o,runner:s}=await n(),[u,c]=await Promise.all([r(["show",`${e.headSha}:config/release-gates.v2.json`]),r(["show",`${e.headSha}:scripts/test-root.mjs`])]);if(o!==u||s!==c)throw new Error("p205-transient-producer-dirty");const d=JSON.parse(o),S=Array.isArray(d.requiredCompleteClasses)?d.requiredCompleteClasses.filter(A=>typeof A=="string"&&/^[a-z0-9-]+$/.test(A)):[];if(d.contract!=="P205-CI-02"||S.length===0)throw new Error("p205-transient-manifest-invalid");const l=i?(await $e(i.parent,i.name,i.identity,["scripts/test-root.mjs","--gate","complete"])).toString("utf8"):String((await k(process.execPath,["scripts/test-root.mjs","--gate","complete"],{cwd:t,encoding:"utf8",maxBuffer:64*1024*1024})).stdout),{manifest:y,runner:v}=await n();if(y!==o||v!==s)throw new Error("p205-transient-producer-raced");if((await r(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-raced");const G=m("sha256").update(o).digest("hex"),$=m("sha256").update(l).digest("hex"),Y=ie(e.nowIso??new Date().toISOString()),V=m("sha256").update(["p205-transient-execution-v1",O,e.headSha,e.graphRevision,G,S.join(","),$,Y].join("\0")).digest("hex"),ae=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:O,executionHeadSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:G,gateIds:Object.freeze(S),resultDigest:$,executedAt:Y,executionEvidenceDigest:V}),ge=Object.freeze(Object.create(null));return Le.set(ge,ae),ge}async function Be(t,e={}){const i=await Rt(t);return Ke(i,e)}function mt(t,e={}){let i;try{const r=X("git",["rev-parse","--git-common-dir"],{cwd:t,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=we(t),a=ee(r)?h(r):h(n,r),o=we(a);if(o!==a)throw new Error("git-lifecycle-common-dir-symlink");Nt(o);const s=p(o,ce),u=p(s,oe);if(L(s)&&(We(s,"directory"),we(s)!==s))throw new Error("git-lifecycle-runtime-directory-symlink");i=L(u)?u:p(o,Se)}catch{if(e.required)throw new Error("git-lifecycle-common-dir-invalid");return Ee()}if(!L(i)){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}return We(i,"file"),xe(JSON.parse(Oe(i,"utf8")))}async function fi(t){try{await Be(t,{required:!0});return}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-missing")throw e}try{await pt(t,()=>{},{expectedRevision:0})}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-revision-conflict")throw e;await Be(t,{required:!0})}}async function pt(t,e,i={}){const r=await De(t),n=await Me(r),a=p(n,ht),o=await Zt(a);try{const s=p(n,oe),u=p(r,Se),c=await Ke(L(s)?s:u);if(i.expectedRevision!==void 0&&i.expectedRevision!==c.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const d=structuredClone(c),S=e(d),l=xe({...d,schemaVersion:1,revision:c.revision+1});return await i.preCommit?.(l),await q(n,"directory"),await Ot(s),await st(n,oe,`${JSON.stringify(l,null,2)}
2
- `),await q(s,"file"),await yt(n),{document:l,value:S}}finally{await Ut(a,o).catch(()=>{})}}async function yt(t){let e;try{e=await rt(t,"r")}catch(i){if(process.platform==="win32"&&(I(i,"EPERM")||I(i,"EISDIR")||I(i,"EINVAL")))return;throw i}try{await e.sync()}finally{await e.close()}}function ui(t,e){const i=structuredClone(t),r=qe(i,"epics"),n=qe(i,"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))n[a]={...f(n[a])??{},...structuredClone(o)};return i}function qe(t,e){const i=t[e];if(i===void 0){const a={};return t[e]=a,a}const r=f(i);if(r)return r;if(!Array.isArray(i))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of i){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 t[e]=n,n}function gi(t,e){return t.epics[e]??(t.epics[e]={})}function li(t,e){return t.stories[e]??(t.stories[e]={})}function je(t,e,i,r){const n=f(t);return!!(n&&n.epicId===i&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&Ye(n,e))}async function hi(t,e,i,r,n,a,o=[]){return bt(t,e,i,r,n,a,o).verdict==="verified"}function bt(t,e,i,r,n,a,o=[],s=new Date().toISOString()){const u=()=>It({storyId:i,epicId:r,executionBranch:n,value:e,verifiedAt:s,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!je(e,i,r,n))return u();const c=f(e),d=f(c.qaReceipt),S=f(c.reviewReceipt),l=String(c.headSha),y=String(c.baseSha),v=B(t,["rev-parse",`refs/heads/${n}`]).trim();X("git",["merge-base","--is-ancestor",l,v],{cwd:t,stdio:"ignore"});const N=B(t,["show","--no-patch","--format=%H%n%P%n%B",l]),G=B(t,["rev-parse",`${l}^`]).trim(),$=B(t,["rev-list","--count",`${y}..${l}`]).trim();if(G!==y||$!=="1")return u();const Y=new Set(N.split(`
3
- `).map(j=>j.trim())),ae=[`Neocortex-Story: ${i}`,`Neocortex-Epic: ${r}`,`Neocortex-Execution-Branch: ${n}`,`Neocortex-Bundle-Digest: ${String(c.bundleDigest)}`,`Neocortex-Graph-Revision: ${String(c.graphRevision)}`,...c.dispatchId?[`Neocortex-Dispatch: ${String(c.dispatchId)}`]:[],...c.bundleId?[`Neocortex-Bundle: ${String(c.bundleId)}`]:[],...c.claimRevision?[`Neocortex-Claim-Revision: ${String(c.claimRevision)}`]:[]].every(j=>Y.has(j));if(ae){const Ce=[...Y].find(tt=>tt.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(Ce))return u();X("git",["merge-base","--is-ancestor",Ce,l],{cwd:t,stdio:"ignore"})}const A=B(t,["diff-tree","--no-commit-id","--name-only","-r","-z",l]).split("\0").filter(Boolean);if(A.length===0||A.some(j=>!de(j)))return u();const le=m("sha256").update(N).digest("hex"),he=m("sha256").update([...A].sort().join("\0")).digest("hex"),C=ze({checkpoint:c,storyId:i,epicId:r,executionBranch:n,baseSha:y,headSha:l,commitBodyDigest:le,changedPathsDigest:he,changedPaths:A,authorizedWriteSet:o.length>0?o:vt(t,i)});if(!C||d.receiptRef!==`story-qa:${String(d.sourceEvidenceDigest)}`)return u();const Ie=Et({storyId:i,baseSha:y,headSha:l,bundleDigest:String(c.bundleDigest),graphRevision:String(c.graphRevision),commitBody:N,changedPaths:A}),Re=d.evidenceVersion==="p205-execution-v2"&&d.contract==="P205-CI-02"&&d.command===O&&g(d.manifestDigest)&&P(d.gateIds,32,!0)&&g(d.resultDigest)&&d.sourceEvidenceDigest===_t({gitEvidenceDigest:Ie,headSha:l,graphRevision:String(c.graphRevision),manifestDigest:String(d.manifestDigest),gateIds:d.gateIds,resultDigest:String(d.resultDigest)}),Ue=d.evidenceVersion==="git-immutable-v1"&&d.sourceEvidenceDigest===Ie,Xe=d.evidenceVersion===void 0&&C.mode==="legacy-migration"&&C.binding?.qaDigest===d.sourceEvidenceDigest,me=wt(a,v,String(c.graphRevision))&&(Re||C.mode==="legacy-migration"&&(Ue||Xe)),pe=a===void 0&&Re;if(!me&&!pe)return u();const Ae=m("sha256").update(["root-commit-range-review-v1",i,y,l,String(c.bundleDigest),String(c.graphRevision),String(d.receiptRef),m("sha256").update(N).digest("hex"),[...A].sort().join(",")].join("\0")).digest("hex");if(S.sourceEvidenceDigest!==Ae||S.receiptRef!==`story-review:${Ae}`||C.mode==="legacy-migration"&&C.binding?.reviewDigest!==void 0&&C.binding.reviewDigest!==S.sourceEvidenceDigest||!ae&&(Ve[i]!==l||!Array.isArray(c.receiptRefs)||!c.receiptRefs.some(j=>typeof j=="string"&&j.startsWith("legacy-direct-yolo:"))))return u();const et=m("sha256").update(["checkpoint-p205-transient-v1",i,r,n,y,l,String(c.bundleDigest),le,he,C.mode,C.effectiveClaimRevision,String(d.sourceEvidenceDigest),String(S.sourceEvidenceDigest),te(a)?.executionEvidenceDigest??(pe?"maintenance-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),J=me?te(a):void 0;return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:i,epicId:r,branch:n,baseSha:y,headSha:l,aggregateHeadSha:J?.executionHeadSha??l,commitBodyDigest:le,changedPathsDigest:he,claimVerification:C.mode,effectiveClaimRevision:C.effectiveClaimRevision,sourceEvidenceDigest:et,command:O,manifestDigest:J?.manifestDigest??"0".repeat(64),gateIds:J?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:J?.resultDigest??"0".repeat(64),graphRevision:String(c.graphRevision),executionEvidenceDigest:J?.executionEvidenceDigest??"0".repeat(64),verifiedAt:J?.executedAt??ie(s),verdict:"verified",reasonCodes:Object.freeze([me?"checkpoint-p205-transient-verified":pe?"checkpoint-git-maintenance-verified":"checkpoint-legacy-bounded-verified",...C.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return u()}}function wt(t,e,i){const r=te(t);return!!(r&&r.schemaVersion===1&&r.kind==="p205_transient_execution_authority"&&r.contract==="P205-CI-02"&&r.command===O&&r.graphRevision===i&&g(r.resultDigest)&&g(r.executionEvidenceDigest)&&r.executionHeadSha===e&&w(e))}function te(t){return t&&typeof t=="object"?Le.get(t):void 0}function mi(t){const e=te(t);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 pi(t,e,i){const r=te(t);return!!(r&&r.executionHeadSha===e&&r.graphRevision===i&&r.command===O)}function ze(t){const e=lt[t.storyId],i=typeof t.checkpoint.claimRevision=="string"?t.checkpoint.claimRevision:void 0,r=t.storyId==="P174.03.811759"||t.storyId==="P174.03.685003",n=St(t.authorizedWriteSet),a=n.length>0&&n.length===t.authorizedWriteSet.length&&t.changedPaths.every(o=>n.some(s=>xt(s,o)));if(e&&t.epicId==="P174"&&t.executionBranch==="epic/P174"&&t.baseSha===e.baseSha&&t.headSha===e.headSha&&t.checkpoint.graphRevision===e.graphRevision&&t.commitBodyDigest===e.commitBodyDigest&&t.changedPathsDigest===e.changedPathsDigest&&(r?i===void 0:i===e.effectiveClaimRevision))return t.authorizedWriteSet.length>0&&(!a||!He(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(i!==void 0&&!(!i||!g(i))&&!(!a||!He(i,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:i})}function St(t){const e=t.map(i=>i.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(i=>!de(i))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function vt(t,e){try{const i=JSON.parse(Oe(p(t,".neocortex","state.json"),"utf8")),r=f(i.stories),n=f(r?.[e]),a=mt(t),o=f(a.stories[e]?.checkpoint)??f(n?.checkpoint);return Dt(e,n,o)}catch{return[]}}function Dt(t,e,i){const r=Array.isArray(e?.files_to_modify)?e.files_to_modify.filter(n=>typeof n=="string"):[];if(!i?.dispatchId||!i.bundleId)return r;try{return ot({...e,id:t,files_to_modify:r})}catch{return[]}}function He(t,e){return t===m("sha256").update(e.join("\0")).digest("hex")||t===m("sha256").update(JSON.stringify(e)).digest("hex")}function xt(t,e){return t===e||t.endsWith("/")&&e.startsWith(t)}function yi(t,e,i,r,n,a){try{if(!je(e,i,r,n))return!1;const o=f(e),s=f(o.qaReceipt),u=f(o.reviewReceipt),c=String(o.headSha),d=String(o.baseSha),S=B(t,["rev-parse",`refs/heads/${n}`]).trim();if(X("git",["merge-base","--is-ancestor",c,S],{cwd:t,stdio:"ignore"}),B(t,["rev-parse",`${c}^`]).trim()!==d||B(t,["rev-list","--count",`${d}..${c}`]).trim()!=="1")return!1;const l=B(t,["show","--no-patch","--format=%H%n%P%n%B",c]),y=B(t,["diff-tree","--no-commit-id","--name-only","-r","-z",c]).split("\0").filter(Boolean);if(y.length===0||y.some(N=>!de(N)))return!1;const v=ze({checkpoint:o,storyId:i,epicId:r,executionBranch:n,baseSha:d,headSha:c,changedPaths:y,authorizedWriteSet:a,commitBodyDigest:m("sha256").update(l).digest("hex"),changedPathsDigest:m("sha256").update([...y].sort().join("\0")).digest("hex")});return!(v?.mode!=="legacy-migration"||!v.binding||s.sourceEvidenceDigest!==v.binding.qaDigest||s.receiptRef!==`story-qa:${v.binding.qaDigest}`||u.sourceEvidenceDigest!==v.binding.reviewDigest||u.receiptRef!==`story-review:${v.binding.reviewDigest}`||u.qaReceiptRef!==s.receiptRef)}catch{return!1}}function Et(t){return m("sha256").update(["local-yolo-tdd-git-immutable-v1",t.storyId,t.baseSha,t.headSha,t.bundleDigest,t.graphRevision,m("sha256").update(t.commitBody).digest("hex"),m("sha256").update([...t.changedPaths].sort().join("\0")).digest("hex")].join("\0")).digest("hex")}function _t(t){return m("sha256").update(["local-yolo-tdd-p205-execution-v2",O,t.gitEvidenceDigest,t.headSha,t.graphRevision,t.manifestDigest,t.gateIds.join(","),t.resultDigest].join("\0")).digest("hex")}function It(t){const e=f(t.value);return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:t.storyId,epicId:t.epicId,branch:t.executionBranch,baseSha:w(e?.baseSha)?String(e?.baseSha):"0".repeat(40),headSha:w(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:O,manifestDigest:"0".repeat(64),gateIds:Object.freeze([]),resultDigest:"0".repeat(64),graphRevision:"0".repeat(64),executionEvidenceDigest:"0".repeat(64),sourceEvidenceDigest:"0".repeat(64),verifiedAt:ie(t.verifiedAt),verdict:t.verdict,reasonCodes:Object.freeze([t.reasonCode]),publicSafe:!0})}function B(t,e){return X("git",[...e],{cwd:t,encoding:"utf8",maxBuffer:32*1024*1024})}function ie(t){return Number.isFinite(Date.parse(t))?new Date(Date.parse(t)).toISOString():new Date().toISOString()}async function bi(t,e){if(Ve[e.storyId]!==e.headSha)return;const i=[".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 k("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:t,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await k("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:t}),(await k("git",["rev-parse",`${e.headSha}^`],{cwd:t,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await k("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:t,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(m("sha256").update(a).digest("hex")!==e.bundleDigest)return;const o=String((await k("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await k("git",["show","--no-patch","--format=%s",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const c=String((await k("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!i.every(V=>c.includes(V))||c.some(V=>!de(V)))return;const d=await Promise.all(i.map(async V=>String((await k("git",["show",`${e.headSha}:${V}`],{cwd:t,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),S=JSON.parse(d[0]),l=f(S.stories),y=f(S.epics),v=f(l?.[e.storyId]),N=f(y?.[e.epicId]),G=Array.isArray(v?.steps_completed)?v.steps_completed:[],$=JSON.parse(d[1]);return v?.status!=="done"||!G.includes(ut)||!G.includes(gt)||N?.branch_mode!=="epic"||N.execution_branch!==e.executionBranch||$.storyId!==e.storyId||$.status!=="qa-passed"||$.safeToContinueYoloop!==!0||!Array.isArray($.blockingChecks)||$.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:${m("sha256").update(["legacy-direct-yolo-recovery-v1",e.storyId,e.epicId,e.executionBranch,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,m("sha256").update(o).digest("hex"),m("sha256").update([...c].sort().join("\0")).digest("hex"),...d.map(V=>m("sha256").update(V).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function Rt(t){const e=await De(t),i=p(e,ce),r=p(i,oe);if(L(i)&&(await q(i,"directory"),await M(i)!==i))throw new Error("git-lifecycle-runtime-directory-symlink");return L(r)?r:p(e,Se)}async function Te(t){return Me(await De(t))}async function At(t,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 i=h(t);await H(i);const r=h(i,e);return Z(i,r),L(r)||await Ne(i,e),await H(r,i),await H(i),r}async function b(t,e){const i=h(e),r=h(t);Z(i,r),await H(i),await H(r,i)}async function wi(t,e){await T(t,e)}async function K(t,e,i){const r=h(e),n=h(t);Z(r,n);try{await b(n,r)}catch(o){if(I(o,"ENOENT"))return!1;throw o}const a=h(r,`${n.slice(r.length+1)}.remove.${process.pid}.${Date.now()}.${ye(4).toString("hex")}`);return Z(r,a),await Q(r,E(n),E(a)),await b(a,r),i&&!await i(a)?(await re(a,n,r).catch(()=>{}),!1):(await ft(r,E(a)),!0)}async function re(t,e,i){await b(t,i);try{await be(e);return}catch(r){if(!I(r,"ENOENT"))throw r}await Q(i,E(t),E(e)),await b(e,i)}async function R(t){try{await b(t,z(t));const e=p(t,"owner.json");await T(e,t);const i=await F(e);return await T(e,t),m("sha256").update(i).digest("hex")}catch{return}}async function Si(t,e){const i=await Te(t),r=await At(i,"leases"),n=p(r,"integration"),a=`${n}.recovery`;if(L(a)){await b(a,r);const c=await Ge(a),d=await R(a);if(c===void 0||ue(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!d||!await K(a,r,async S=>await R(S)===d))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const o=ie(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:ie(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??ye(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 H(r,i);try{return await Pe(r,E(n),`${JSON.stringify(s)}
4
- `),await b(n,r),await T(p(n,"owner.json"),n),!0}catch(c){throw I(c,"EEXIST")||await K(n,r).catch(()=>{}),c}};try{return await u(),{ok:!0,owner:s,path:n}}catch(c){if(!I(c,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const c=await ne(n),d=c?void 0:await Ge(n);if(c&&Fe(c,s))return{ok:!0,owner:c,path:n};if(c&&Date.parse(c.expiresAt)>Date.now()&&(c.persistent||ue(c.pid))||d!==void 0&&ue(d)||!c&&d===void 0&&await Qe(n))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};const l=await R(n);if(!l)return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const y=`${n}.stale.${process.pid}.${Date.now()}`;await Q(r,E(n),E(y));try{if(await b(y,r),await R(y)!==l)return await re(y,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await u()}finally{await K(y,r,async v=>await R(v)===l).catch(()=>{})}return{ok:!0,owner:s,path:n}}catch(c){return{ok:!1,reasonCode:I(c,"EEXIST")||I(c,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function vi(t,e){const i=await ne(t);return!!(i&&ve(i,e)&&Date.parse(i.expiresAt)>Date.now())}async function Ct(t,e){try{const i=z(t);await b(t,i);const r=await ne(t);if(!r||!ve(r,e))return!1;const n=await R(t);if(!n)return!1;const a=`${t}.release.${process.pid}.${Date.now()}`;await Q(i,E(t),E(a)),await b(a,i);const o=await ne(a);return!o||!ve(o,e)||await R(a)!==n?(await re(a,t,i).catch(()=>{}),!1):K(a,i,async s=>await R(s)===n)}catch(i){if(I(i,"ENOENT"))return!1;throw i}}function kt(t){return m("sha256").update(["git-lifecycle-physical-owner-v1",t.kind,t.storyId,t.sessionId,t.idempotencyKey,String(t.pid),t.createdAt,t.expiresAt,t.persistent?"persistent":"ephemeral",t.ownerNonce].join("\0")).digest("hex")}async function Di(t,e){if(!U(e.storyId)||!_(e.idempotencyKey)||!g(e.ownerDigest))return"foreign";const i=await Te(t),r=p(i,"leases"),n=p(r,"integration");if(!L(n))return"absent";try{await b(r,i),await b(n,r);const a=await ne(n);return!a||a.kind!=="direct"||a.storyId!==e.storyId||a.sessionId!==e.idempotencyKey||a.idempotencyKey!==e.idempotencyKey||a.persistent!==!0||kt(a)!==e.ownerDigest?"foreign":await Ct(n,a)?"released":"foreign"}catch{return"foreign"}}async function ne(t){try{await b(t,z(t));const e=p(t,"owner.json");await T(e,t);const i=JSON.parse(await F(e,"utf8"));return i.schemaVersion!==1||i.kind!=="direct"&&i.kind!=="continuous"||!U(i.storyId)||!_(i.sessionId)||!_(i.idempotencyKey)||!Number.isSafeInteger(i.pid)||Number(i.pid)<=0||!x(i.createdAt)||!x(i.expiresAt)||typeof i.persistent!="boolean"||typeof i.ownerNonce!="string"||!/^[a-f0-9]{32}$/.test(i.ownerNonce)?void 0:i}catch{return}}async function Ge(t){try{await b(t,z(t));const e=p(t,"owner.json");await T(e,t);const i=JSON.parse(await F(e,"utf8"));return Number.isSafeInteger(i.pid)&&Number(i.pid)>0?Number(i.pid):void 0}catch{return}}function Fe(t,e){return t.kind===e.kind&&t.storyId===e.storyId&&t.sessionId===e.sessionId&&t.idempotencyKey===e.idempotencyKey&&t.expiresAt===e.expiresAt&&t.persistent===e.persistent}function ve(t,e){return Fe(t,e)&&t.schemaVersion===e.schemaVersion&&t.pid===e.pid&&t.createdAt===e.createdAt&&t.ownerNonce===e.ownerNonce}async function De(t){const e=await M(t),r=(await k("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim(),n=ee(r)?h(r):h(e,r),a=await M(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await Pt(a);const s=(await k("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((ee(s)?h(s):h(e,s))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function Me(t){const e=p(t,ce);if(L(e)||await Ne(t,ce),await q(e,"directory"),await M(e)!==e)throw new Error("git-lifecycle-runtime-directory-symlink");return e}async function Ke(t,e={}){try{return await q(t,"file"),xe(JSON.parse(await F(t,"utf8")))}catch(i){if(I(i,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}throw i}}async function Ot(t){try{await q(t,"file")}catch(e){if(I(e,"ENOENT"))return;throw e}}async function q(t,e){const i=await be(t);if(i.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!i.isFile():!i.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(se()&&i.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(se()&&(i.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function Z(t,e){const i=h(t),r=h(e),n=at(i,r);if(!n||n.startsWith("..")||ee(n)||z(r)!==i)throw new Error("git-lifecycle-private-path-escape")}async function H(t,e){const i=h(t);if(e&&Z(h(e),i),await q(i,"directory"),h(await M(i))!==i)throw new Error("git-lifecycle-directory-substituted");if(e){const r=h(e);if(await q(r,"directory"),h(await M(r))!==r)throw new Error("git-lifecycle-directory-parent-substituted")}}async function T(t,e){const i=h(t);if(Z(h(e),i),await H(h(e)),await q(i,"file"),h(await M(i))!==i)throw new Error("git-lifecycle-file-substituted")}function We(t,e){const i=ke(t);if(i.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!i.isFile():!i.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(se()&&i.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(se()&&(i.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function Pt(t){const e=await be(t);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function Nt(t){const e=ke(t);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function se(t=process.platform){return t!=="win32"&&typeof process.getuid=="function"}function xe(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("git-lifecycle-runtime-invalid");const e=t;D(e,["schemaVersion","revision","epics","stories"],"git-lifecycle-runtime-unknown-field");const i=f(e.epics),r=f(e.stories);if(e.schemaVersion!==1||!Number.isSafeInteger(e.revision)||Number(e.revision)<0||!i||!r||Object.values(i).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(i))if(!U(n)||!Lt(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!U(n)||!n.includes(".")||!Bt(a,n))throw new Error("git-lifecycle-runtime-story-invalid");return e}const $t=["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"],Vt=["checkpoint","status","last_step","steps_completed"];function Lt(t){return D(t,$t,"git-lifecycle-runtime-epic-unknown-field"),(t.branch_mode===void 0||t.branch_mode==="epic")&&(t.execution_branch===void 0||W(t.execution_branch))&&(t.origin_branch===void 0||W(t.origin_branch))&&(t.branch_lease===void 0||t.branch_lease===null||qt(t.branch_lease))&&(t.origin_binding===void 0||t.origin_binding===null||Ht(t.origin_binding))&&(t.graph_revision===void 0||g(t.graph_revision))&&(t.aggregate_qa_receipt===void 0||t.aggregate_qa_receipt===null||Tt(t.aggregate_qa_receipt))&&(t.terminal_git_receipt===void 0||t.terminal_git_receipt===null||Gt(t.terminal_git_receipt))&&(t.physicalMergeStatus===void 0||["merged","pushed","denied_external_gate","blocked_local_or_repo","not_attempted"].includes(String(t.physicalMergeStatus)))&&(t.pr_number===void 0||t.pr_number===null||Number.isSafeInteger(t.pr_number)&&Number(t.pr_number)>0)&&(t.git_reconciliation_receipts===void 0||Yt(t.git_reconciliation_receipts))&&(t.git_reconciliation_debt===void 0||Jt(t.git_reconciliation_debt))}function Bt(t,e){return D(t,Vt,"git-lifecycle-runtime-story-unknown-field"),(t.checkpoint===void 0||t.checkpoint===null||Ye(t.checkpoint,e))&&(t.status===void 0||_(t.status))&&(t.last_step===void 0||t.last_step===null||_(t.last_step))&&(t.steps_completed===void 0||P(t.steps_completed,128))}function qt(t){const e=f(t);return e?(D(e,["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt","handoffGrant","handoffConsumption"],"git-lifecycle-runtime-lease-unknown-field"),e.schemaVersion===1&&U(e.ownerStoryId)&&_(e.sessionId)&&_(e.idempotencyKey)&&x(e.acquiredAt)&&x(e.expiresAt)&&Date.parse(String(e.expiresAt))>Date.parse(String(e.acquiredAt))&&(e.handoffGrant===void 0||jt(e.handoffGrant,e))&&(e.handoffConsumption===void 0||zt(e.handoffConsumption,e))):!1}function jt(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","expiresAt"],"git-lifecycle-runtime-handoff-grant-unknown-field"),i.schemaVersion===1&&i.kind==="direct-yolo-setup-handoff"&&i.storyId===e.ownerStoryId&&i.fromSessionId===e.sessionId&&g(i.tokenDigest)&&g(i.bundleDigest)&&g(i.claimRevision)&&x(i.expiresAt)&&Date.parse(String(i.expiresAt))<=Date.parse(String(e.expiresAt))):!1}function zt(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","consumedBySessionId","consumedAt"],"git-lifecycle-runtime-handoff-consumption-unknown-field"),i.schemaVersion===1&&i.kind==="direct-yolo-setup-handoff-consumption"&&i.state==="consumed"&&i.storyId===e.ownerStoryId&&_(i.fromSessionId)&&g(i.tokenDigest)&&g(i.bundleDigest)&&g(i.claimRevision)&&i.consumedBySessionId===e.sessionId&&x(i.consumedAt)):!1}function Ht(t){const e=f(t);return e?(D(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&&w(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&x(e.capturedAt)):!1}function Tt(t){const e=f(t);if(!e)return!1;D(e,["schemaVersion","evidenceVersion","producer","contract","command","verdict","executionHeadSha","graphRevision","manifestDigest","resultDigest","checkedAt","receiptRef","gateIds"],"git-lifecycle-runtime-aggregate-qa-unknown-field");const i=e.evidenceVersion==="p205-execution-v2"&&e.producer==="local-yolo-tdd"&&e.contract==="P205-CI-02"&&e.command===O&&g(e.manifestDigest)&&g(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&&(i||r)&&e.verdict==="passed"&&w(e.executionHeadSha)&&g(e.graphRevision)&&x(e.checkedAt)&&fe(e.receiptRef)&&P(e.gateIds,128,!0)}function Gt(t){const e=f(t);return e?(D(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&&U(e.epicId)&&W(e.executionBranch)&&W(e.originBranch)&&w(e.baseSha)&&w(e.executionHeadSha)&&(e.mergeSha===void 0||w(e.mergeSha))&&(e.pushedSha===void 0||w(e.pushedSha))&&(e.strategy==="direct"||e.strategy==="single_pr")&&(e.candidateQa===void 0||Mt(e.candidateQa,e))&&(e.providerGuard===void 0||Ft(e.providerGuard,e))&&(e.prNumber===void 0||Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0)&&["prepared","merged","pushed","denied_external_gate","blocked_local_or_repo"].includes(String(e.physicalStatus))&&P(e.localGateReceiptRefs,128,!0)&&_(e.idempotencyKey)&&x(e.attemptStartedAt)&&(e.completedAt===void 0||x(e.completedAt))&&typeof e.retryEligible=="boolean"&&P(e.reasonCodes,128)&&e.publicSafe===!0):!1}function Ft(t,e){const i=f(t);if(!i)return!1;D(i,["schemaVersion","provider","mode","source","prHeadSha","originHeadSha","checkedAt","publicSafe"],"git-lifecycle-runtime-provider-guard-unknown-field");const r=i.mode==="recovered_exact_tree"?i.source==="physical_recovery":i.mode==="strict_up_to_date_expected_head"&&["branch_protection","ruleset","branch_protection_and_ruleset"].includes(String(i.source));return i.schemaVersion===1&&i.provider==="github"&&r&&e.strategy==="single_pr"&&e.physicalStatus==="pushed"&&Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0&&w(i.prHeadSha)&&i.prHeadSha===e.mergeSha&&w(i.originHeadSha)&&i.originHeadSha===e.baseSha&&x(i.checkedAt)&&i.publicSafe===!0}function Mt(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","contract","command","originHeadSha","executionHeadSha","mergeSha","treeSha","graphRevision","manifestDigest","resultDigest","gateIds","checkedAt","receiptRef"],"git-lifecycle-runtime-merge-candidate-unknown-field"),i.schemaVersion===1&&i.kind==="epic_merge_candidate_qa"&&i.contract==="P205-CI-02"&&i.command===O&&w(i.originHeadSha)&&i.originHeadSha===e.baseSha&&w(i.executionHeadSha)&&i.executionHeadSha===e.executionHeadSha&&w(i.mergeSha)&&i.mergeSha===e.mergeSha&&w(i.treeSha)&&g(i.graphRevision)&&g(i.manifestDigest)&&g(i.resultDigest)&&P(i.gateIds,128,!0)&&x(i.checkedAt)&&fe(i.receiptRef)):!1}function Ye(t,e){const i=f(t);if(!i)return!1;D(i,["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 i.schemaVersion===1&&i.storyId===e&&i.epicId===r&&W(i.branch)&&w(i.baseSha)&&w(i.headSha)&&i.baseSha!==i.headSha&&Qt(i.commits)&&i.commits.length===1&&i.commits[0]===i.headSha&&_(i.idempotencyKey)&&(i.dispatchId===void 0||g(i.dispatchId))&&(i.bundleId===void 0||g(i.bundleId))&&g(i.bundleDigest)&&g(i.graphRevision)&&(i.claimRevision===void 0||g(i.claimRevision))&&P(i.receiptRefs,256,!0)&&(i.qaVerdict==="passed"||i.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(i.reviewVerdict))&&Kt(i.qaReceipt,i)&&(i.reviewVerdict==="pending"?i.reviewReceipt===void 0:Wt(i.reviewReceipt,i))&&x(i.recordedAt)}function Kt(t,e){const i=f(t);return i?(D(i,["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"),i.schemaVersion===1&&i.kind==="story_qa_evidence"&&i.producer==="local-yolo-tdd"&&(i.evidenceVersion===void 0||i.evidenceVersion==="git-immutable-v1"||i.evidenceVersion==="p205-execution-v2"&&i.contract==="P205-CI-02"&&i.command===O&&g(i.manifestDigest)&&P(i.gateIds,32,!0)&&g(i.resultDigest))&&Je(i,e)&&g(i.sourceEvidenceDigest)&&i.verdict===e.qaVerdict&&(i.verdict==="passed"||i.verdict==="blocked")&&x(i.checkedAt)&&fe(i.receiptRef)&&e.receiptRefs.includes(i.receiptRef)):!1}function Wt(t,e){const i=f(t),r=f(e.qaReceipt);return!i||!r?!1:(D(i,["schemaVersion","kind","producer","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","sourceEvidenceDigest","qaReceiptRef","verdict","reviewedAt","receiptRef"],"git-lifecycle-runtime-story-review-unknown-field"),i.schemaVersion===1&&i.kind==="story_review_evidence"&&i.producer==="root-commit-range-review"&&Je(i,e)&&g(i.sourceEvidenceDigest)&&i.qaReceiptRef===r.receiptRef&&i.receiptRef!==r.receiptRef&&(i.verdict==="approved"||i.verdict==="changes-requested")&&(i.verdict==="approved"?e.reviewVerdict==="approved":e.reviewVerdict==="changes-requested")&&x(i.reviewedAt)&&Date.parse(String(i.reviewedAt))>=Date.parse(String(r.checkedAt))&&fe(i.receiptRef)&&e.receiptRefs.includes(i.receiptRef))}function Je(t,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(i=>t[i]===e[i])}function Yt(t){return!Array.isArray(t)||t.length>1024?!1:t.every(e=>{const i=f(e);return i?(D(i,["schemaVersion","resourceId","action","outcome","idempotencyKey","reasonCodes","recordedAt","publicSafe"],"git-lifecycle-runtime-reconciliation-receipt-unknown-field"),i.schemaVersion===1&&_(i.resourceId)&&["no_op","delete_local_branch","delete_remote_branch","close_pull_request"].includes(String(i.action))&&["applied","already_absent","dry_run","failed"].includes(String(i.outcome))&&_(i.idempotencyKey)&&P(i.reasonCodes,128)&&x(i.recordedAt)&&i.publicSafe===!0):!1})}function Jt(t){return!Array.isArray(t)||t.length>1024?!1:t.every(e=>{const i=f(e);return i?(D(i,["schemaVersion","resourceId","action","managed","reasonCodes","evidence","publicSafe"],"git-lifecycle-runtime-reconciliation-debt-unknown-field"),i.schemaVersion===1&&_(i.resourceId)&&i.action==="preserve"&&typeof i.managed=="boolean"&&P(i.reasonCodes,128)&&P(i.evidence,16)&&i.publicSafe===!0):!1})}function D(t,e,i){const r=new Set(e);if(Object.keys(t).some(n=>!r.has(n)))throw new Error(i)}function U(t){return typeof t=="string"&&/^P[1-9][0-9]*(?:\.[0-9]+)*$/.test(t)}function W(t){return typeof t=="string"&&/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(t)&&!t.includes("..")&&!t.includes("//")&&!t.includes("@{")&&!t.endsWith("/")&&!t.endsWith(".")&&!t.split("/").some(e=>!e||e.startsWith(".")||e.endsWith(".lock"))}function de(t){return t.length>0&&t.length<=1024&&!ee(t)&&!t.includes("\0")&&!t.replaceAll("\\","/").split("/").includes("..")}function _(t){return typeof t=="string"&&t.length>0&&t.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(t)&&!t.includes("..")}function fe(t){return _(t)}function w(t){return typeof t=="string"&&/^[a-f0-9]{40,64}$/i.test(t)}function g(t){return typeof t=="string"&&/^[a-f0-9]{64}$/i.test(t)}function x(t){return typeof t=="string"&&t.length<=64&&Number.isFinite(Date.parse(t))}function P(t,e,i=!1){return Array.isArray(t)&&t.length<=e&&(!i||t.length>0)&&t.every(_)}function Qt(t){return Array.isArray(t)&&t.length>0&&t.length<=256&&t.every(w)}function Ee(){return{schemaVersion:1,revision:0,epics:{},stories:{}}}async function Zt(t){const e=z(t),i={pid:process.pid,nonce:ye(16).toString("hex")},r=async()=>{await H(e),await Pe(e,E(t),JSON.stringify(i));try{await b(t,e),await T(p(t,"owner.json"),t)}catch(n){throw await K(t,e).catch(()=>{}),n}};try{await r()}catch(n){if(!I(n,"EEXIST"))throw n;await q(t,"directory");const a=await _e(t);if(a!==void 0&&ue(a.pid))throw new Error("git-lifecycle-runtime-lock-active");if(a===void 0&&await Qe(t))throw new Error("git-lifecycle-runtime-lock-active");const o=await R(t);if(!o)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const s=`${t}.stale.${process.pid}.${Date.now()}`;await Q(e,E(t),E(s));try{if(await b(s,e),await R(s)!==o)throw await re(s,t,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await K(s,e,async u=>await R(u)===o).catch(()=>{})}}return i}async function Ut(t,e){const i=z(t);try{await b(t,i);const r=await _e(t);if(!r||!Ze(r,e))return!1;const n=await R(t);if(!n)return!1;const a=`${t}.release.${process.pid}.${Date.now()}`;await Q(i,E(t),E(a)),await b(a,i);const o=await _e(a);return!o||!Ze(o,e)||await R(a)!==n?(await re(a,t,i).catch(()=>{}),!1):K(a,i,async s=>await R(s)===n)}catch(r){if(I(r,"ENOENT"))return!1;throw r}}async function Qe(t){try{return Date.now()-(await nt(t)).mtimeMs<3e4}catch{return!0}}async function _e(t){try{await b(t,z(t));const e=p(t,"owner.json");await T(e,t);const i=JSON.parse(await F(e,"utf8"));return Number.isSafeInteger(i.pid)&&Number(i.pid)>0&&(i.nonce===void 0||typeof i.nonce=="string"&&/^[a-f0-9]{32}$/.test(i.nonce))?{pid:Number(i.pid),...typeof i.nonce=="string"?{nonce:i.nonce}:{}}:void 0}catch{return}}function Ze(t,e){return t.pid===e.pid&&t.nonce!==void 0&&t.nonce===e.nonce}function ue(t){try{return process.kill(t,0),!0}catch(e){return I(e,"EPERM")}}function f(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function I(t,e){return t instanceof Error&&"code"in t&&t.code===e}export{ce as GIT_LIFECYCLE_RUNTIME_DIRECTORY,oe as GIT_LIFECYCLE_RUNTIME_FILE,Ve as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,lt as LEGACY_P174_CHECKPOINT_MIGRATIONS,O as P205_COMPLETE_COMMAND,Si as acquireGitLifecyclePhysicalIntegrationLock,ui as applyGitLifecycleRuntimeOverlay,b as assertGitLifecyclePrivateDirectory,wi as assertGitLifecyclePrivateFile,kt as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,Et as computeImmutableStoryQaEvidenceDigest,bi as computeLegacyDirectYoloRecoveryReceiptRef,_t as computeP205StoryQaEvidenceDigest,At as ensureGitLifecyclePrivateChildDirectory,fi as ensureGitLifecycleRuntimeInitialized,gi as ensureRuntimeEpic,li as ensureRuntimeStory,di as executeP205TransientAuthority,Te as gitLifecycleRuntimeDirectory,Dt as gitLifecycleStoryWriteSet,je as isAcceptedGitLifecycleStoryCheckpoint,pt as mutateGitLifecycleRuntime,pi as p205TransientAuthorityMatchesAggregate,se as posixSecurityAvailable,mi as projectP205TransientExecutionEvidence,Be as readGitLifecycleRuntime,mt as readGitLifecycleRuntimeSync,Ct as releaseGitLifecyclePhysicalIntegrationLock,Di as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,K as removeGitLifecyclePrivateDirectory,hi as verifyAcceptedGitLifecycleStoryCheckpoint,bt as verifyAcceptedGitLifecycleStoryCheckpointSync,vi as verifyGitLifecyclePhysicalIntegrationLock,yi as verifyLegacyCheckpointMigrationCandidateSync};
1
+ import{execFile as rt,execFileSync as X}from"node:child_process";import{createHash as y,randomBytes as ye}from"node:crypto";import{lstat as be,open as nt,readFile as H,realpath as Y,stat as at}from"node:fs/promises";import{existsSync as L,lstatSync as Oe,readFileSync as Pe,realpathSync as we}from"node:fs";import{basename as _,dirname as T,isAbsolute as ee,join as p,relative as ct,resolve as h}from"node:path";import{promisify as ot}from"node:util";import{publicWriteSet as st}from"../../../shared/dist/yoloop/public-story-write-set.js";import{anchoredAtomicWriteFile as dt,anchoredCreateOwnedDirectory as Ne,anchoredEnsureDirectory as $e,anchoredExecuteGit as ft,anchoredExecuteNode as Ve,anchoredRemoveDirectory as ut,anchoredRenameDirectory as Z}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as gt,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as lt}from"./git-lifecycle-step-ids.js";const $=ot(rt),ce="neocortex-yoloop",oe="runtime.json",V="node scripts/test-root.mjs --gate complete",Be=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),ht=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",mt="runtime.lock",Le=new WeakMap;async function gi(t,e){if(!S(e.headSha)||!l(e.graphRevision))throw new Error("p205-transient-binding-invalid");const i=e.anchoredWorkspace;if(i&&h(t)!==p(h(i.parent),i.name))throw new Error("p205-transient-anchor-binding-invalid");const r=async P=>i?(await ft(i.parent,i.name,i.identity,P)).toString("utf8"):String((await $("git",[...P],{cwd:t,encoding:"utf8",maxBuffer:8*1024*1024})).stdout),n=async()=>i?JSON.parse((await Ve(i.parent,i.name,i.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 H(p(t,"config","release-gates.v2.json"),"utf8"),runner:await H(p(t,"scripts","test-root.mjs"),"utf8")};if((await r(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-mismatch");const{manifest:o,runner:s}=await n(),[u,c]=await Promise.all([r(["show",`${e.headSha}:config/release-gates.v2.json`]),r(["show",`${e.headSha}:scripts/test-root.mjs`])]);if(o!==u||s!==c)throw new Error("p205-transient-producer-dirty");const d=JSON.parse(o),b=Array.isArray(d.requiredCompleteClasses)?d.requiredCompleteClasses.filter(P=>typeof P=="string"&&/^[a-z0-9-]+$/.test(P)):[];if(d.contract!=="P205-CI-02"||b.length===0)throw new Error("p205-transient-manifest-invalid");const g=i?(await Ve(i.parent,i.name,i.identity,["scripts/test-root.mjs","--gate","complete"])).toString("utf8"):String((await $(process.execPath,["scripts/test-root.mjs","--gate","complete"],{cwd:t,encoding:"utf8",maxBuffer:64*1024*1024})).stdout),{manifest:m,runner:v}=await n();if(m!==o||v!==s)throw new Error("p205-transient-producer-raced");if((await r(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-raced");const O=y("sha256").update(o).digest("hex"),k=y("sha256").update(g).digest("hex"),z=ie(e.nowIso??new Date().toISOString()),R=y("sha256").update(["p205-transient-execution-v1",V,e.headSha,e.graphRevision,O,b.join(","),k,z].join("\0")).digest("hex"),ae=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:V,executionHeadSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:O,gateIds:Object.freeze(b),resultDigest:k,executedAt:z,executionEvidenceDigest:R}),ge=Object.freeze(Object.create(null));return Le.set(ge,ae),ge}async function ve(t,e={}){const i=await kt(t);return We(i,e)}function pt(t,e={}){let i;try{const r=X("git",["rev-parse","--git-common-dir"],{cwd:t,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=we(t),a=ee(r)?h(r):h(n,r),o=we(a);if(o!==a)throw new Error("git-lifecycle-common-dir-symlink");Vt(o);const s=p(o,ce),u=p(s,oe);if(L(s)&&(Ye(s,"directory"),we(s)!==s))throw new Error("git-lifecycle-runtime-directory-symlink");i=L(u)?u:p(o,Se)}catch{if(e.required)throw new Error("git-lifecycle-common-dir-invalid");return Ee()}if(!L(i)){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}return Ye(i,"file"),_e(JSON.parse(Pe(i,"utf8")))}async function li(t){try{await ve(t,{required:!0});return}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-missing")throw e}try{await qe(t,()=>{},{expectedRevision:0})}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-revision-conflict")throw e;await ve(t,{required:!0})}}async function hi(t,e,i=new Date().toISOString()){if(!Ut(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=p(h(t),".neocortex","state.json"),n=await H(r,"utf8"),a=f(JSON.parse(n));if(!a)throw new Error("git-lifecycle-tracked-state-invalid");const o=await ve(t,{required:!0}),s=bt(a,o),u=f(f(s.epics)?.[e.epicId]),c=f(f(s.stories)?.[e.storyId]);if(!u||u.branch_mode!=="epic")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");if(u.execution_branch!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-mismatch");const d=typeof u.graph_revision=="string"?u.graph_revision:void 0,b=typeof f(o.epics[e.epicId])?.graph_revision=="string"?String(f(o.epics[e.epicId]).graph_revision):void 0;if(d!==void 0&&!l(d))throw new Error("git-lifecycle-graph-revision-invalid");if(d===e.graphRevision&&b===e.graphRevision)return{applied:!1,reused:!0,revision:o.revision,graphRevision:e.graphRevision};const g=Date.parse(i);if(!Number.isFinite(g))throw new Error("git-lifecycle-graph-authority-time-invalid");const m=f(u.branch_lease);if(m&&Number.isFinite(Date.parse(String(m.expiresAt)))&&Date.parse(String(m.expiresAt))>g)throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await qe(t,C=>{const O=wt(C,e.epicId),k=O.execution_branch;if(k!==void 0&&k!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const z=O.graph_revision;if(z!==void 0&&z!==d)throw new Error("git-lifecycle-graph-authority-epoch-raced");const R=f(O.branch_lease);if(R&&Number.isFinite(Date.parse(String(R.expiresAt)))&&Date.parse(String(R.expiresAt))>g)throw new Error("git-lifecycle-graph-authority-writer-active");O.graph_revision=e.graphRevision},{expectedRevision:o.revision,preCommit:async()=>{if(await H(r,"utf8")!==n)throw new Error("git-lifecycle-graph-authority-tracked-state-raced")}})).document.revision,graphRevision:e.graphRevision}}async function qe(t,e,i={}){const r=await xe(t),n=await Ke(r),a=p(n,mt),o=await ei(a);try{const s=p(n,oe),u=p(r,Se),c=await We(L(s)?s:u);if(i.expectedRevision!==void 0&&i.expectedRevision!==c.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const d=structuredClone(c),b=e(d),g=_e({...d,schemaVersion:1,revision:c.revision+1});return await i.preCommit?.(g),await j(n,"directory"),await Nt(s),await dt(n,oe,`${JSON.stringify(g,null,2)}
2
+ `),await j(s,"file"),await yt(n),{document:g,value:b}}finally{await ti(a,o).catch(()=>{})}}async function yt(t){let e;try{e=await nt(t,"r")}catch(i){if(process.platform==="win32"&&(I(i,"EPERM")||I(i,"EISDIR")||I(i,"EINVAL")))return;throw i}try{await e.sync()}finally{await e.close()}}function bt(t,e){const i=structuredClone(t),r=je(i,"epics"),n=je(i,"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))n[a]={...f(n[a])??{},...structuredClone(o)};return i}function je(t,e){const i=t[e];if(i===void 0){const a={};return t[e]=a,a}const r=f(i);if(r)return r;if(!Array.isArray(i))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of i){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 t[e]=n,n}function wt(t,e){return t.epics[e]??(t.epics[e]={})}function mi(t,e){return t.stories[e]??(t.stories[e]={})}function ze(t,e,i,r){const n=f(t);return!!(n&&n.epicId===i&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&Je(n,e))}async function pi(t,e,i,r,n,a,o=[]){return St(t,e,i,r,n,a,o).verdict==="verified"}function St(t,e,i,r,n,a,o=[],s=new Date().toISOString()){const u=()=>At({storyId:i,epicId:r,executionBranch:n,value:e,verifiedAt:s,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!ze(e,i,r,n))return u();const c=f(e),d=f(c.qaReceipt),b=f(c.reviewReceipt),g=String(c.headSha),m=String(c.baseSha),v=q(t,["rev-parse",`refs/heads/${n}`]).trim();X("git",["merge-base","--is-ancestor",g,v],{cwd:t,stdio:"ignore"});const C=q(t,["show","--no-patch","--format=%H%n%P%n%B",g]),O=q(t,["rev-parse",`${g}^`]).trim(),k=q(t,["rev-list","--count",`${m}..${g}`]).trim();if(O!==m||k!=="1")return u();const z=new Set(C.split(`
3
+ `).map(G=>G.trim())),ae=[`Neocortex-Story: ${i}`,`Neocortex-Epic: ${r}`,`Neocortex-Execution-Branch: ${n}`,`Neocortex-Bundle-Digest: ${String(c.bundleDigest)}`,`Neocortex-Graph-Revision: ${String(c.graphRevision)}`,...c.dispatchId?[`Neocortex-Dispatch: ${String(c.dispatchId)}`]:[],...c.bundleId?[`Neocortex-Bundle: ${String(c.bundleId)}`]:[],...c.claimRevision?[`Neocortex-Claim-Revision: ${String(c.claimRevision)}`]:[]].every(G=>z.has(G));if(ae){const Ce=[...z].find(it=>it.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(Ce))return u();X("git",["merge-base","--is-ancestor",Ce,g],{cwd:t,stdio:"ignore"})}const P=q(t,["diff-tree","--no-commit-id","--name-only","-r","-z",g]).split("\0").filter(Boolean);if(P.length===0||P.some(G=>!de(G)))return u();const le=y("sha256").update(C).digest("hex"),he=y("sha256").update([...P].sort().join("\0")).digest("hex"),N=Ge({checkpoint:c,storyId:i,epicId:r,executionBranch:n,baseSha:m,headSha:g,commitBodyDigest:le,changedPathsDigest:he,changedPaths:P,authorizedWriteSet:o.length>0?o:xt(t,i)});if(!N||d.receiptRef!==`story-qa:${String(d.sourceEvidenceDigest)}`)return u();const Re=It({storyId:i,baseSha:m,headSha:g,bundleDigest:String(c.bundleDigest),graphRevision:String(c.graphRevision),commitBody:C,changedPaths:P}),Ae=d.evidenceVersion==="p205-execution-v2"&&d.contract==="P205-CI-02"&&d.command===V&&l(d.manifestDigest)&&B(d.gateIds,32,!0)&&l(d.resultDigest)&&d.sourceEvidenceDigest===Rt({gitEvidenceDigest:Re,headSha:g,graphRevision:String(c.graphRevision),manifestDigest:String(d.manifestDigest),gateIds:d.gateIds,resultDigest:String(d.resultDigest)}),Xe=d.evidenceVersion==="git-immutable-v1"&&d.sourceEvidenceDigest===Re,et=d.evidenceVersion===void 0&&N.mode==="legacy-migration"&&N.binding?.qaDigest===d.sourceEvidenceDigest,me=vt(a,v,String(c.graphRevision))&&(Ae||N.mode==="legacy-migration"&&(Xe||et)),pe=a===void 0&&Ae;if(!me&&!pe)return u();const ke=y("sha256").update(["root-commit-range-review-v1",i,m,g,String(c.bundleDigest),String(c.graphRevision),String(d.receiptRef),y("sha256").update(C).digest("hex"),[...P].sort().join(",")].join("\0")).digest("hex");if(b.sourceEvidenceDigest!==ke||b.receiptRef!==`story-review:${ke}`||N.mode==="legacy-migration"&&N.binding?.reviewDigest!==void 0&&N.binding.reviewDigest!==b.sourceEvidenceDigest||!ae&&(Be[i]!==g||!Array.isArray(c.receiptRefs)||!c.receiptRefs.some(G=>typeof G=="string"&&G.startsWith("legacy-direct-yolo:"))))return u();const tt=y("sha256").update(["checkpoint-p205-transient-v1",i,r,n,m,g,String(c.bundleDigest),le,he,N.mode,N.effectiveClaimRevision,String(d.sourceEvidenceDigest),String(b.sourceEvidenceDigest),te(a)?.executionEvidenceDigest??(pe?"maintenance-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),Q=me?te(a):void 0;return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:i,epicId:r,branch:n,baseSha:m,headSha:g,aggregateHeadSha:Q?.executionHeadSha??g,commitBodyDigest:le,changedPathsDigest:he,claimVerification:N.mode,effectiveClaimRevision:N.effectiveClaimRevision,sourceEvidenceDigest:tt,command:V,manifestDigest:Q?.manifestDigest??"0".repeat(64),gateIds:Q?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:Q?.resultDigest??"0".repeat(64),graphRevision:String(c.graphRevision),executionEvidenceDigest:Q?.executionEvidenceDigest??"0".repeat(64),verifiedAt:Q?.executedAt??ie(s),verdict:"verified",reasonCodes:Object.freeze([me?"checkpoint-p205-transient-verified":pe?"checkpoint-git-maintenance-verified":"checkpoint-legacy-bounded-verified",...N.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return u()}}function vt(t,e,i){const r=te(t);return!!(r&&r.schemaVersion===1&&r.kind==="p205_transient_execution_authority"&&r.contract==="P205-CI-02"&&r.command===V&&r.graphRevision===i&&l(r.resultDigest)&&l(r.executionEvidenceDigest)&&r.executionHeadSha===e&&S(e))}function te(t){return t&&typeof t=="object"?Le.get(t):void 0}function yi(t){const e=te(t);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 bi(t,e,i){const r=te(t);return!!(r&&r.executionHeadSha===e&&r.graphRevision===i&&r.command===V)}function Ge(t){const e=ht[t.storyId],i=typeof t.checkpoint.claimRevision=="string"?t.checkpoint.claimRevision:void 0,r=t.storyId==="P174.03.811759"||t.storyId==="P174.03.685003",n=Dt(t.authorizedWriteSet),a=n.length>0&&n.length===t.authorizedWriteSet.length&&t.changedPaths.every(o=>n.some(s=>Et(s,o)));if(e&&t.epicId==="P174"&&t.executionBranch==="epic/P174"&&t.baseSha===e.baseSha&&t.headSha===e.headSha&&t.checkpoint.graphRevision===e.graphRevision&&t.commitBodyDigest===e.commitBodyDigest&&t.changedPathsDigest===e.changedPathsDigest&&(r?i===void 0:i===e.effectiveClaimRevision))return t.authorizedWriteSet.length>0&&(!a||!He(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(i!==void 0&&!(!i||!l(i))&&!(!a||!He(i,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:i})}function Dt(t){const e=t.map(i=>i.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(i=>!de(i))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function xt(t,e){try{const i=JSON.parse(Pe(p(t,".neocortex","state.json"),"utf8")),r=f(i.stories),n=f(r?.[e]),a=pt(t),o=f(a.stories[e]?.checkpoint)??f(n?.checkpoint);return _t(e,n,o)}catch{return[]}}function _t(t,e,i){const r=Array.isArray(e?.files_to_modify)?e.files_to_modify.filter(n=>typeof n=="string"):[];if(!i?.dispatchId||!i.bundleId)return r;try{return st({...e,id:t,files_to_modify:r})}catch{return[]}}function He(t,e){return t===y("sha256").update(e.join("\0")).digest("hex")||t===y("sha256").update(JSON.stringify(e)).digest("hex")}function Et(t,e){return t===e||t.endsWith("/")&&e.startsWith(t)}function wi(t,e,i,r,n,a){try{if(!ze(e,i,r,n))return!1;const o=f(e),s=f(o.qaReceipt),u=f(o.reviewReceipt),c=String(o.headSha),d=String(o.baseSha),b=q(t,["rev-parse",`refs/heads/${n}`]).trim();if(X("git",["merge-base","--is-ancestor",c,b],{cwd:t,stdio:"ignore"}),q(t,["rev-parse",`${c}^`]).trim()!==d||q(t,["rev-list","--count",`${d}..${c}`]).trim()!=="1")return!1;const g=q(t,["show","--no-patch","--format=%H%n%P%n%B",c]),m=q(t,["diff-tree","--no-commit-id","--name-only","-r","-z",c]).split("\0").filter(Boolean);if(m.length===0||m.some(C=>!de(C)))return!1;const v=Ge({checkpoint:o,storyId:i,epicId:r,executionBranch:n,baseSha:d,headSha:c,changedPaths:m,authorizedWriteSet:a,commitBodyDigest:y("sha256").update(g).digest("hex"),changedPathsDigest:y("sha256").update([...m].sort().join("\0")).digest("hex")});return!(v?.mode!=="legacy-migration"||!v.binding||s.sourceEvidenceDigest!==v.binding.qaDigest||s.receiptRef!==`story-qa:${v.binding.qaDigest}`||u.sourceEvidenceDigest!==v.binding.reviewDigest||u.receiptRef!==`story-review:${v.binding.reviewDigest}`||u.qaReceiptRef!==s.receiptRef)}catch{return!1}}function It(t){return y("sha256").update(["local-yolo-tdd-git-immutable-v1",t.storyId,t.baseSha,t.headSha,t.bundleDigest,t.graphRevision,y("sha256").update(t.commitBody).digest("hex"),y("sha256").update([...t.changedPaths].sort().join("\0")).digest("hex")].join("\0")).digest("hex")}function Rt(t){return y("sha256").update(["local-yolo-tdd-p205-execution-v2",V,t.gitEvidenceDigest,t.headSha,t.graphRevision,t.manifestDigest,t.gateIds.join(","),t.resultDigest].join("\0")).digest("hex")}function At(t){const e=f(t.value);return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:t.storyId,epicId:t.epicId,branch:t.executionBranch,baseSha:S(e?.baseSha)?String(e?.baseSha):"0".repeat(40),headSha:S(e?.headSha)?String(e?.headSha):"0".repeat(40),aggregateHeadSha:"0".repeat(40),commitBodyDigest:"0".repeat(64),changedPathsDigest:"0".repeat(64),claimVerification:"canonical",effectiveClaimRevision:"0".repeat(64),command:V,manifestDigest:"0".repeat(64),gateIds:Object.freeze([]),resultDigest:"0".repeat(64),graphRevision:"0".repeat(64),executionEvidenceDigest:"0".repeat(64),sourceEvidenceDigest:"0".repeat(64),verifiedAt:ie(t.verifiedAt),verdict:t.verdict,reasonCodes:Object.freeze([t.reasonCode]),publicSafe:!0})}function q(t,e){return X("git",[...e],{cwd:t,encoding:"utf8",maxBuffer:32*1024*1024})}function ie(t){return Number.isFinite(Date.parse(t))?new Date(Date.parse(t)).toISOString():new Date().toISOString()}async function Si(t,e){if(Be[e.storyId]!==e.headSha)return;const i=[".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 $("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:t,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await $("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:t}),(await $("git",["rev-parse",`${e.headSha}^`],{cwd:t,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await $("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:t,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(y("sha256").update(a).digest("hex")!==e.bundleDigest)return;const o=String((await $("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await $("git",["show","--no-patch","--format=%s",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const c=String((await $("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!i.every(R=>c.includes(R))||c.some(R=>!de(R)))return;const d=await Promise.all(i.map(async R=>String((await $("git",["show",`${e.headSha}:${R}`],{cwd:t,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),b=JSON.parse(d[0]),g=f(b.stories),m=f(b.epics),v=f(g?.[e.storyId]),C=f(m?.[e.epicId]),O=Array.isArray(v?.steps_completed)?v.steps_completed:[],k=JSON.parse(d[1]);return v?.status!=="done"||!O.includes(gt)||!O.includes(lt)||C?.branch_mode!=="epic"||C.execution_branch!==e.executionBranch||k.storyId!==e.storyId||k.status!=="qa-passed"||k.safeToContinueYoloop!==!0||!Array.isArray(k.blockingChecks)||k.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:${y("sha256").update(["legacy-direct-yolo-recovery-v1",e.storyId,e.epicId,e.executionBranch,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,y("sha256").update(o).digest("hex"),y("sha256").update([...c].sort().join("\0")).digest("hex"),...d.map(R=>y("sha256").update(R).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function kt(t){const e=await xe(t),i=p(e,ce),r=p(i,oe);if(L(i)&&(await j(i,"directory"),await Y(i)!==i))throw new Error("git-lifecycle-runtime-directory-symlink");return L(r)?r:p(e,Se)}async function Te(t){return Ke(await xe(t))}async function Ct(t,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 i=h(t);await F(i);const r=h(i,e);return U(i,r),L(r)||await $e(i,e),await F(r,i),await F(i),r}async function w(t,e){const i=h(e),r=h(t);U(i,r),await F(i),await F(r,i)}async function vi(t,e){await M(t,e)}async function J(t,e,i){const r=h(e),n=h(t);U(r,n);try{await w(n,r)}catch(o){if(I(o,"ENOENT"))return!1;throw o}const a=h(r,`${n.slice(r.length+1)}.remove.${process.pid}.${Date.now()}.${ye(4).toString("hex")}`);return U(r,a),await Z(r,_(n),_(a)),await w(a,r),i&&!await i(a)?(await re(a,n,r).catch(()=>{}),!1):(await ut(r,_(a)),!0)}async function re(t,e,i){await w(t,i);try{await be(e);return}catch(r){if(!I(r,"ENOENT"))throw r}await Z(i,_(t),_(e)),await w(e,i)}async function A(t){try{await w(t,T(t));const e=p(t,"owner.json");await M(e,t);const i=await H(e);return await M(e,t),y("sha256").update(i).digest("hex")}catch{return}}async function Di(t,e){const i=await Te(t),r=await Ct(i,"leases"),n=p(r,"integration"),a=`${n}.recovery`;if(L(a)){await w(a,r);const c=await Fe(a),d=await A(a);if(c===void 0||ue(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!d||!await J(a,r,async b=>await A(b)===d))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const o=ie(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:ie(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??ye(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 F(r,i);try{return await Ne(r,_(n),`${JSON.stringify(s)}
4
+ `),await w(n,r),await M(p(n,"owner.json"),n),!0}catch(c){throw I(c,"EEXIST")||await J(n,r).catch(()=>{}),c}};try{return await u(),{ok:!0,owner:s,path:n}}catch(c){if(!I(c,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const c=await ne(n),d=c?void 0:await Fe(n);if(c&&Me(c,s))return{ok:!0,owner:c,path:n};if(c&&Date.parse(c.expiresAt)>Date.now()&&(c.persistent||ue(c.pid))||d!==void 0&&ue(d)||!c&&d===void 0&&await Ze(n))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};const g=await A(n);if(!g)return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const m=`${n}.stale.${process.pid}.${Date.now()}`;await Z(r,_(n),_(m));try{if(await w(m,r),await A(m)!==g)return await re(m,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await u()}finally{await J(m,r,async v=>await A(v)===g).catch(()=>{})}return{ok:!0,owner:s,path:n}}catch(c){return{ok:!1,reasonCode:I(c,"EEXIST")||I(c,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function xi(t,e){const i=await ne(t);return!!(i&&De(i,e)&&Date.parse(i.expiresAt)>Date.now())}async function Ot(t,e){try{const i=T(t);await w(t,i);const r=await ne(t);if(!r||!De(r,e))return!1;const n=await A(t);if(!n)return!1;const a=`${t}.release.${process.pid}.${Date.now()}`;await Z(i,_(t),_(a)),await w(a,i);const o=await ne(a);return!o||!De(o,e)||await A(a)!==n?(await re(a,t,i).catch(()=>{}),!1):J(a,i,async s=>await A(s)===n)}catch(i){if(I(i,"ENOENT"))return!1;throw i}}function Pt(t){return y("sha256").update(["git-lifecycle-physical-owner-v1",t.kind,t.storyId,t.sessionId,t.idempotencyKey,String(t.pid),t.createdAt,t.expiresAt,t.persistent?"persistent":"ephemeral",t.ownerNonce].join("\0")).digest("hex")}async function _i(t,e){if(!K(e.storyId)||!E(e.idempotencyKey)||!l(e.ownerDigest))return"foreign";const i=await Te(t),r=p(i,"leases"),n=p(r,"integration");if(!L(n))return"absent";try{await w(r,i),await w(n,r);const a=await ne(n);return!a||a.kind!=="direct"||a.storyId!==e.storyId||a.sessionId!==e.idempotencyKey||a.idempotencyKey!==e.idempotencyKey||a.persistent!==!0||Pt(a)!==e.ownerDigest?"foreign":await Ot(n,a)?"released":"foreign"}catch{return"foreign"}}async function ne(t){try{await w(t,T(t));const e=p(t,"owner.json");await M(e,t);const i=JSON.parse(await H(e,"utf8"));return i.schemaVersion!==1||i.kind!=="direct"&&i.kind!=="continuous"||!K(i.storyId)||!E(i.sessionId)||!E(i.idempotencyKey)||!Number.isSafeInteger(i.pid)||Number(i.pid)<=0||!x(i.createdAt)||!x(i.expiresAt)||typeof i.persistent!="boolean"||typeof i.ownerNonce!="string"||!/^[a-f0-9]{32}$/.test(i.ownerNonce)?void 0:i}catch{return}}async function Fe(t){try{await w(t,T(t));const e=p(t,"owner.json");await M(e,t);const i=JSON.parse(await H(e,"utf8"));return Number.isSafeInteger(i.pid)&&Number(i.pid)>0?Number(i.pid):void 0}catch{return}}function Me(t,e){return t.kind===e.kind&&t.storyId===e.storyId&&t.sessionId===e.sessionId&&t.idempotencyKey===e.idempotencyKey&&t.expiresAt===e.expiresAt&&t.persistent===e.persistent}function De(t,e){return Me(t,e)&&t.schemaVersion===e.schemaVersion&&t.pid===e.pid&&t.createdAt===e.createdAt&&t.ownerNonce===e.ownerNonce}async function xe(t){const e=await Y(t),r=(await $("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim(),n=ee(r)?h(r):h(e,r),a=await Y(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await $t(a);const s=(await $("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((ee(s)?h(s):h(e,s))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function Ke(t){const e=p(t,ce);if(L(e)||await $e(t,ce),await j(e,"directory"),await Y(e)!==e)throw new Error("git-lifecycle-runtime-directory-symlink");return e}async function We(t,e={}){try{return await j(t,"file"),_e(JSON.parse(await H(t,"utf8")))}catch(i){if(I(i,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}throw i}}async function Nt(t){try{await j(t,"file")}catch(e){if(I(e,"ENOENT"))return;throw e}}async function j(t,e){const i=await be(t);if(i.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!i.isFile():!i.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(se()&&i.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(se()&&(i.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function U(t,e){const i=h(t),r=h(e),n=ct(i,r);if(!n||n.startsWith("..")||ee(n)||T(r)!==i)throw new Error("git-lifecycle-private-path-escape")}async function F(t,e){const i=h(t);if(e&&U(h(e),i),await j(i,"directory"),h(await Y(i))!==i)throw new Error("git-lifecycle-directory-substituted");if(e){const r=h(e);if(await j(r,"directory"),h(await Y(r))!==r)throw new Error("git-lifecycle-directory-parent-substituted")}}async function M(t,e){const i=h(t);if(U(h(e),i),await F(h(e)),await j(i,"file"),h(await Y(i))!==i)throw new Error("git-lifecycle-file-substituted")}function Ye(t,e){const i=Oe(t);if(i.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!i.isFile():!i.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(se()&&i.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(se()&&(i.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function $t(t){const e=await be(t);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function Vt(t){const e=Oe(t);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function se(t=process.platform){return t!=="win32"&&typeof process.getuid=="function"}function _e(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("git-lifecycle-runtime-invalid");const e=t;D(e,["schemaVersion","revision","epics","stories"],"git-lifecycle-runtime-unknown-field");const i=f(e.epics),r=f(e.stories);if(e.schemaVersion!==1||!Number.isSafeInteger(e.revision)||Number(e.revision)<0||!i||!r||Object.values(i).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(i))if(!K(n)||!qt(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!K(n)||!n.includes(".")||!jt(a,n))throw new Error("git-lifecycle-runtime-story-invalid");return e}const Bt=["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"],Lt=["checkpoint","status","last_step","steps_completed"];function qt(t){return D(t,Bt,"git-lifecycle-runtime-epic-unknown-field"),(t.branch_mode===void 0||t.branch_mode==="epic")&&(t.execution_branch===void 0||W(t.execution_branch))&&(t.origin_branch===void 0||W(t.origin_branch))&&(t.branch_lease===void 0||t.branch_lease===null||zt(t.branch_lease))&&(t.origin_binding===void 0||t.origin_binding===null||Tt(t.origin_binding))&&(t.graph_revision===void 0||l(t.graph_revision))&&(t.aggregate_qa_receipt===void 0||t.aggregate_qa_receipt===null||Ft(t.aggregate_qa_receipt))&&(t.terminal_git_receipt===void 0||t.terminal_git_receipt===null||Mt(t.terminal_git_receipt))&&(t.physicalMergeStatus===void 0||["merged","pushed","denied_external_gate","blocked_local_or_repo","not_attempted"].includes(String(t.physicalMergeStatus)))&&(t.pr_number===void 0||t.pr_number===null||Number.isSafeInteger(t.pr_number)&&Number(t.pr_number)>0)&&(t.git_reconciliation_receipts===void 0||Qt(t.git_reconciliation_receipts))&&(t.git_reconciliation_debt===void 0||Zt(t.git_reconciliation_debt))}function jt(t,e){return D(t,Lt,"git-lifecycle-runtime-story-unknown-field"),(t.checkpoint===void 0||t.checkpoint===null||Je(t.checkpoint,e))&&(t.status===void 0||E(t.status))&&(t.last_step===void 0||t.last_step===null||E(t.last_step))&&(t.steps_completed===void 0||B(t.steps_completed,128))}function zt(t){const e=f(t);return e?(D(e,["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt","handoffGrant","handoffConsumption"],"git-lifecycle-runtime-lease-unknown-field"),e.schemaVersion===1&&K(e.ownerStoryId)&&E(e.sessionId)&&E(e.idempotencyKey)&&x(e.acquiredAt)&&x(e.expiresAt)&&Date.parse(String(e.expiresAt))>Date.parse(String(e.acquiredAt))&&(e.handoffGrant===void 0||Gt(e.handoffGrant,e))&&(e.handoffConsumption===void 0||Ht(e.handoffConsumption,e))):!1}function Gt(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","expiresAt"],"git-lifecycle-runtime-handoff-grant-unknown-field"),i.schemaVersion===1&&i.kind==="direct-yolo-setup-handoff"&&i.storyId===e.ownerStoryId&&i.fromSessionId===e.sessionId&&l(i.tokenDigest)&&l(i.bundleDigest)&&l(i.claimRevision)&&x(i.expiresAt)&&Date.parse(String(i.expiresAt))<=Date.parse(String(e.expiresAt))):!1}function Ht(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","consumedBySessionId","consumedAt"],"git-lifecycle-runtime-handoff-consumption-unknown-field"),i.schemaVersion===1&&i.kind==="direct-yolo-setup-handoff-consumption"&&i.state==="consumed"&&i.storyId===e.ownerStoryId&&E(i.fromSessionId)&&l(i.tokenDigest)&&l(i.bundleDigest)&&l(i.claimRevision)&&i.consumedBySessionId===e.sessionId&&x(i.consumedAt)):!1}function Tt(t){const e=f(t);return e?(D(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&&S(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&x(e.capturedAt)):!1}function Ft(t){const e=f(t);if(!e)return!1;D(e,["schemaVersion","evidenceVersion","producer","contract","command","verdict","executionHeadSha","graphRevision","manifestDigest","resultDigest","checkedAt","receiptRef","gateIds"],"git-lifecycle-runtime-aggregate-qa-unknown-field");const i=e.evidenceVersion==="p205-execution-v2"&&e.producer==="local-yolo-tdd"&&e.contract==="P205-CI-02"&&e.command===V&&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&&(i||r)&&e.verdict==="passed"&&S(e.executionHeadSha)&&l(e.graphRevision)&&x(e.checkedAt)&&fe(e.receiptRef)&&B(e.gateIds,128,!0)}function Mt(t){const e=f(t);return e?(D(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&&K(e.epicId)&&W(e.executionBranch)&&W(e.originBranch)&&S(e.baseSha)&&S(e.executionHeadSha)&&(e.mergeSha===void 0||S(e.mergeSha))&&(e.pushedSha===void 0||S(e.pushedSha))&&(e.strategy==="direct"||e.strategy==="single_pr")&&(e.candidateQa===void 0||Wt(e.candidateQa,e))&&(e.providerGuard===void 0||Kt(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))&&B(e.localGateReceiptRefs,128,!0)&&E(e.idempotencyKey)&&x(e.attemptStartedAt)&&(e.completedAt===void 0||x(e.completedAt))&&typeof e.retryEligible=="boolean"&&B(e.reasonCodes,128)&&e.publicSafe===!0):!1}function Kt(t,e){const i=f(t);if(!i)return!1;D(i,["schemaVersion","provider","mode","source","prHeadSha","originHeadSha","checkedAt","publicSafe"],"git-lifecycle-runtime-provider-guard-unknown-field");const r=i.mode==="recovered_exact_tree"?i.source==="physical_recovery":i.mode==="strict_up_to_date_expected_head"&&["branch_protection","ruleset","branch_protection_and_ruleset"].includes(String(i.source));return i.schemaVersion===1&&i.provider==="github"&&r&&e.strategy==="single_pr"&&e.physicalStatus==="pushed"&&Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0&&S(i.prHeadSha)&&i.prHeadSha===e.mergeSha&&S(i.originHeadSha)&&i.originHeadSha===e.baseSha&&x(i.checkedAt)&&i.publicSafe===!0}function Wt(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","contract","command","originHeadSha","executionHeadSha","mergeSha","treeSha","graphRevision","manifestDigest","resultDigest","gateIds","checkedAt","receiptRef"],"git-lifecycle-runtime-merge-candidate-unknown-field"),i.schemaVersion===1&&i.kind==="epic_merge_candidate_qa"&&i.contract==="P205-CI-02"&&i.command===V&&S(i.originHeadSha)&&i.originHeadSha===e.baseSha&&S(i.executionHeadSha)&&i.executionHeadSha===e.executionHeadSha&&S(i.mergeSha)&&i.mergeSha===e.mergeSha&&S(i.treeSha)&&l(i.graphRevision)&&l(i.manifestDigest)&&l(i.resultDigest)&&B(i.gateIds,128,!0)&&x(i.checkedAt)&&fe(i.receiptRef)):!1}function Je(t,e){const i=f(t);if(!i)return!1;D(i,["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 i.schemaVersion===1&&i.storyId===e&&i.epicId===r&&W(i.branch)&&S(i.baseSha)&&S(i.headSha)&&i.baseSha!==i.headSha&&Xt(i.commits)&&i.commits.length===1&&i.commits[0]===i.headSha&&E(i.idempotencyKey)&&(i.dispatchId===void 0||l(i.dispatchId))&&(i.bundleId===void 0||l(i.bundleId))&&l(i.bundleDigest)&&l(i.graphRevision)&&(i.claimRevision===void 0||l(i.claimRevision))&&B(i.receiptRefs,256,!0)&&(i.qaVerdict==="passed"||i.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(i.reviewVerdict))&&Yt(i.qaReceipt,i)&&(i.reviewVerdict==="pending"?i.reviewReceipt===void 0:Jt(i.reviewReceipt,i))&&x(i.recordedAt)}function Yt(t,e){const i=f(t);return i?(D(i,["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"),i.schemaVersion===1&&i.kind==="story_qa_evidence"&&i.producer==="local-yolo-tdd"&&(i.evidenceVersion===void 0||i.evidenceVersion==="git-immutable-v1"||i.evidenceVersion==="p205-execution-v2"&&i.contract==="P205-CI-02"&&i.command===V&&l(i.manifestDigest)&&B(i.gateIds,32,!0)&&l(i.resultDigest))&&Qe(i,e)&&l(i.sourceEvidenceDigest)&&i.verdict===e.qaVerdict&&(i.verdict==="passed"||i.verdict==="blocked")&&x(i.checkedAt)&&fe(i.receiptRef)&&e.receiptRefs.includes(i.receiptRef)):!1}function Jt(t,e){const i=f(t),r=f(e.qaReceipt);return!i||!r?!1:(D(i,["schemaVersion","kind","producer","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","sourceEvidenceDigest","qaReceiptRef","verdict","reviewedAt","receiptRef"],"git-lifecycle-runtime-story-review-unknown-field"),i.schemaVersion===1&&i.kind==="story_review_evidence"&&i.producer==="root-commit-range-review"&&Qe(i,e)&&l(i.sourceEvidenceDigest)&&i.qaReceiptRef===r.receiptRef&&i.receiptRef!==r.receiptRef&&(i.verdict==="approved"||i.verdict==="changes-requested")&&(i.verdict==="approved"?e.reviewVerdict==="approved":e.reviewVerdict==="changes-requested")&&x(i.reviewedAt)&&Date.parse(String(i.reviewedAt))>=Date.parse(String(r.checkedAt))&&fe(i.receiptRef)&&e.receiptRefs.includes(i.receiptRef))}function Qe(t,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(i=>t[i]===e[i])}function Qt(t){return!Array.isArray(t)||t.length>1024?!1:t.every(e=>{const i=f(e);return i?(D(i,["schemaVersion","resourceId","action","outcome","idempotencyKey","reasonCodes","recordedAt","publicSafe"],"git-lifecycle-runtime-reconciliation-receipt-unknown-field"),i.schemaVersion===1&&E(i.resourceId)&&["no_op","delete_local_branch","delete_remote_branch","close_pull_request"].includes(String(i.action))&&["applied","already_absent","dry_run","failed"].includes(String(i.outcome))&&E(i.idempotencyKey)&&B(i.reasonCodes,128)&&x(i.recordedAt)&&i.publicSafe===!0):!1})}function Zt(t){return!Array.isArray(t)||t.length>1024?!1:t.every(e=>{const i=f(e);return i?(D(i,["schemaVersion","resourceId","action","managed","reasonCodes","evidence","publicSafe"],"git-lifecycle-runtime-reconciliation-debt-unknown-field"),i.schemaVersion===1&&E(i.resourceId)&&i.action==="preserve"&&typeof i.managed=="boolean"&&B(i.reasonCodes,128)&&B(i.evidence,16)&&i.publicSafe===!0):!1})}function D(t,e,i){const r=new Set(e);if(Object.keys(t).some(n=>!r.has(n)))throw new Error(i)}function K(t){return typeof t=="string"&&/^P[1-9][0-9]*(?:\.[0-9]+)*$/.test(t)}function Ut(t){const e=f(t);return e?Object.keys(e).length===9&&e.schemaVersion===1&&e.kind==="git_lifecycle_graph_authority"&&e.producer==="server-continuous-yoloop-v1"&&(e.source==="yolo"||e.source==="yoloop")&&K(e.epicId)&&K(e.storyId)&&String(e.storyId).startsWith(`${String(e.epicId)}.`)&&W(e.executionBranch)&&typeof e.graphRevision=="string"&&/^[a-f0-9]{64}$/.test(e.graphRevision)&&e.publicSafe===!0:!1}function W(t){return typeof t=="string"&&/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(t)&&!t.includes("..")&&!t.includes("//")&&!t.includes("@{")&&!t.endsWith("/")&&!t.endsWith(".")&&!t.split("/").some(e=>!e||e.startsWith(".")||e.endsWith(".lock"))}function de(t){return t.length>0&&t.length<=1024&&!ee(t)&&!t.includes("\0")&&!t.replaceAll("\\","/").split("/").includes("..")}function E(t){return typeof t=="string"&&t.length>0&&t.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(t)&&!t.includes("..")}function fe(t){return E(t)}function S(t){return typeof t=="string"&&/^[a-f0-9]{40,64}$/i.test(t)}function l(t){return typeof t=="string"&&/^[a-f0-9]{64}$/i.test(t)}function x(t){return typeof t=="string"&&t.length<=64&&Number.isFinite(Date.parse(t))}function B(t,e,i=!1){return Array.isArray(t)&&t.length<=e&&(!i||t.length>0)&&t.every(E)}function Xt(t){return Array.isArray(t)&&t.length>0&&t.length<=256&&t.every(S)}function Ee(){return{schemaVersion:1,revision:0,epics:{},stories:{}}}async function ei(t){const e=T(t),i={pid:process.pid,nonce:ye(16).toString("hex")},r=async()=>{await F(e),await Ne(e,_(t),JSON.stringify(i));try{await w(t,e),await M(p(t,"owner.json"),t)}catch(n){throw await J(t,e).catch(()=>{}),n}};try{await r()}catch(n){if(!I(n,"EEXIST"))throw n;await j(t,"directory");const a=await Ie(t);if(a!==void 0&&ue(a.pid))throw new Error("git-lifecycle-runtime-lock-active");if(a===void 0&&await Ze(t))throw new Error("git-lifecycle-runtime-lock-active");const o=await A(t);if(!o)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const s=`${t}.stale.${process.pid}.${Date.now()}`;await Z(e,_(t),_(s));try{if(await w(s,e),await A(s)!==o)throw await re(s,t,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await J(s,e,async u=>await A(u)===o).catch(()=>{})}}return i}async function ti(t,e){const i=T(t);try{await w(t,i);const r=await Ie(t);if(!r||!Ue(r,e))return!1;const n=await A(t);if(!n)return!1;const a=`${t}.release.${process.pid}.${Date.now()}`;await Z(i,_(t),_(a)),await w(a,i);const o=await Ie(a);return!o||!Ue(o,e)||await A(a)!==n?(await re(a,t,i).catch(()=>{}),!1):J(a,i,async s=>await A(s)===n)}catch(r){if(I(r,"ENOENT"))return!1;throw r}}async function Ze(t){try{return Date.now()-(await at(t)).mtimeMs<3e4}catch{return!0}}async function Ie(t){try{await w(t,T(t));const e=p(t,"owner.json");await M(e,t);const i=JSON.parse(await H(e,"utf8"));return Number.isSafeInteger(i.pid)&&Number(i.pid)>0&&(i.nonce===void 0||typeof i.nonce=="string"&&/^[a-f0-9]{32}$/.test(i.nonce))?{pid:Number(i.pid),...typeof i.nonce=="string"?{nonce:i.nonce}:{}}:void 0}catch{return}}function Ue(t,e){return t.pid===e.pid&&t.nonce!==void 0&&t.nonce===e.nonce}function ue(t){try{return process.kill(t,0),!0}catch(e){return I(e,"EPERM")}}function f(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function I(t,e){return t instanceof Error&&"code"in t&&t.code===e}export{ce as GIT_LIFECYCLE_RUNTIME_DIRECTORY,oe as GIT_LIFECYCLE_RUNTIME_FILE,Be as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,ht as LEGACY_P174_CHECKPOINT_MIGRATIONS,V as P205_COMPLETE_COMMAND,Di as acquireGitLifecyclePhysicalIntegrationLock,bt as applyGitLifecycleRuntimeOverlay,w as assertGitLifecyclePrivateDirectory,vi as assertGitLifecyclePrivateFile,Pt as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,It as computeImmutableStoryQaEvidenceDigest,Si as computeLegacyDirectYoloRecoveryReceiptRef,Rt as computeP205StoryQaEvidenceDigest,Ct as ensureGitLifecyclePrivateChildDirectory,li as ensureGitLifecycleRuntimeInitialized,wt as ensureRuntimeEpic,mi as ensureRuntimeStory,gi as executeP205TransientAuthority,Te as gitLifecycleRuntimeDirectory,_t as gitLifecycleStoryWriteSet,ze as isAcceptedGitLifecycleStoryCheckpoint,qe as mutateGitLifecycleRuntime,bi as p205TransientAuthorityMatchesAggregate,hi as persistGitLifecycleGraphAuthority,se as posixSecurityAvailable,yi as projectP205TransientExecutionEvidence,ve as readGitLifecycleRuntime,pt as readGitLifecycleRuntimeSync,Ot as releaseGitLifecyclePhysicalIntegrationLock,_i as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,J as removeGitLifecyclePrivateDirectory,pi as verifyAcceptedGitLifecycleStoryCheckpoint,St as verifyAcceptedGitLifecycleStoryCheckpointSync,xi as verifyGitLifecyclePhysicalIntegrationLock,wi as verifyLegacyCheckpointMigrationCandidateSync};
@@ -54,7 +54,7 @@ export { getCacheStatus, formatCacheStatus, type CacheStatusInfo, type CacheStat
54
54
  export { getSubagentApprovalPolicy, ensureManagedSubagentApprovalPolicy, setSubagentApprovalMode, resetSubagentApprovalMode, ApprovalPolicyConfigError, type ApprovalPolicyConfigOptions, type ApprovalPolicyConfigResult, } from './config.js';
55
55
  export { configCliHandler, type ConfigCliDependencies, } from './commands/config.js';
56
56
  export { storyCheckpointCliHandler, parseStoryCheckpointArgs, } from './commands/story-checkpoint.js';
57
- export { beginDirectYoloStoryCommit, finalizeDirectYoloStoryCheckpoint, issueDirectYoloSetupLeaseHandoff, recoverLegacyDirectYoloStoryCheckpoint, type DirectYoloCheckpointOptions, type DirectYoloCheckpointResult, type DirectYoloCommitPlan, type DirectYoloSetupHandoffReceipt, } from './git/direct-yolo-checkpoint.js';
57
+ export { beginDirectYoloStoryCommit, finalizeDirectYoloStoryCheckpoint, issueDirectYoloSetupLeaseHandoff, prepareDirectYoloSetup, recoverLegacyDirectYoloStoryCheckpoint, type DirectYoloCheckpointOptions, type DirectYoloCheckpointResult, type DirectYoloCommitPlan, type DirectYoloSetupReceipt, type DirectYoloSetupHandoffReceipt, } from './git/direct-yolo-checkpoint.js';
58
58
  export { FRONTMATTER_DIAGNOSTIC_CATEGORIES, FRONTMATTER_DIAGNOSTIC_REASON_CODES, getFrontmatterDiagnostic, formatFrontmatterDiagnostic, type FrontmatterDiagnosticCategory, type FrontmatterDiagnosticReasonCode, type PublicFrontmatterDiagnostic, } from './errors/frontmatter-diagnostics.js';
59
59
  export { invoke, invokeCliHandler, collectStateSnapshot, type InvokeOptions, type InvokeResult, } from './commands/invoke.js';
60
60
  export { TierAwareClient, type TierAwareClientOptions, type PreFlightResult, type QuotaSnapshot, } from './tier/index.js';
@@ -1 +1 @@
1
- import{ResolverMode as o,NoOpCache as t}from"./types/index.js";import{LocalResolver as i}from"./resolvers/local-resolver.js";import{RemoteResolver as p,RemoteResolverError as l}from"./resolvers/remote-resolver.js";import{EncryptedCache as m}from"./cache/index.js";import{createResolver as f,selectResolver as d}from"./config/resolver-selection.js";import{collectContext as g}from"./context/context-collector.js";import{sanitizeValue as A,sanitizeRecord as y,sanitizeObject as S}from"./context/context-sanitizer.js";import{getMachineFingerprint as u}from"./machine/index.js";import{LicenseClient as T}from"./license/index.js";import{ClaudeCodeAdapter as M,CursorAdapter as h,VSCodeAdapter as E,GeminiAdapter as O,CodexAdapter as k,AntigravityAdapter as F,AdapterRegistry as P,UnknownTargetError as b,createDefaultRegistry as I,detectPlatform as N,isValidTargetId as j}from"./adapters/index.js";import{ClientCircuitBreaker as _,DegradationManager as w,DegradationLevel as z,FreshnessIndicator as G,RecoveryDetector as H}from"./resilience/index.js";import{OfflineTelemetryQueue as V}from"./telemetry/index.js";import{getCacheStatus as Q,formatCacheStatus as U}from"./commands/cache-status.js";import{getSubagentApprovalPolicy as J,ensureManagedSubagentApprovalPolicy as K,setSubagentApprovalMode as W,resetSubagentApprovalMode as X,ApprovalPolicyConfigError as Z}from"./config.js";import{configCliHandler as ee}from"./commands/config.js";import{storyCheckpointCliHandler as oe,parseStoryCheckpointArgs as te}from"./commands/story-checkpoint.js";import{beginDirectYoloStoryCommit as ie,finalizeDirectYoloStoryCheckpoint as ne,issueDirectYoloSetupLeaseHandoff as pe,recoverLegacyDirectYoloStoryCheckpoint as le}from"./git/direct-yolo-checkpoint.js";import{FRONTMATTER_DIAGNOSTIC_CATEGORIES as me,FRONTMATTER_DIAGNOSTIC_REASON_CODES as se,getFrontmatterDiagnostic as fe,formatFrontmatterDiagnostic as de}from"./errors/frontmatter-diagnostics.js";import{invoke as ge,invokeCliHandler as xe,collectStateSnapshot as Ae}from"./commands/invoke.js";import{TierAwareClient as Se}from"./tier/index.js";import{buildProjectMemoryContent as ue,createNodeProjectMemoryFs as ve,writeProjectMemory as Te,writeProjectMemoryTargetFiles as De}from"./memory/project-memory-writer.js";export{P as AdapterRegistry,F as AntigravityAdapter,Z as ApprovalPolicyConfigError,M as ClaudeCodeAdapter,_ as ClientCircuitBreaker,k as CodexAdapter,h as CursorAdapter,z as DegradationLevel,w as DegradationManager,m as EncryptedCache,me as FRONTMATTER_DIAGNOSTIC_CATEGORIES,se as FRONTMATTER_DIAGNOSTIC_REASON_CODES,G as FreshnessIndicator,O as GeminiAdapter,T as LicenseClient,i as LocalResolver,t as NoOpCache,V as OfflineTelemetryQueue,H as RecoveryDetector,p as RemoteResolver,l as RemoteResolverError,o as ResolverMode,Se as TierAwareClient,b as UnknownTargetError,E as VSCodeAdapter,ie as beginDirectYoloStoryCommit,ue as buildProjectMemoryContent,g as collectContext,Ae as collectStateSnapshot,ee as configCliHandler,I as createDefaultRegistry,ve as createNodeProjectMemoryFs,f as createResolver,N as detectPlatform,K as ensureManagedSubagentApprovalPolicy,ne as finalizeDirectYoloStoryCheckpoint,U as formatCacheStatus,de as formatFrontmatterDiagnostic,Q as getCacheStatus,fe as getFrontmatterDiagnostic,u as getMachineFingerprint,J as getSubagentApprovalPolicy,ge as invoke,xe as invokeCliHandler,j as isValidTargetId,pe as issueDirectYoloSetupLeaseHandoff,te as parseStoryCheckpointArgs,le as recoverLegacyDirectYoloStoryCheckpoint,X as resetSubagentApprovalMode,S as sanitizeObject,y as sanitizeRecord,A as sanitizeValue,d as selectResolver,W as setSubagentApprovalMode,oe as storyCheckpointCliHandler,Te as writeProjectMemory,De as writeProjectMemoryTargetFiles};
1
+ import{ResolverMode as o,NoOpCache as t}from"./types/index.js";import{LocalResolver as i}from"./resolvers/local-resolver.js";import{RemoteResolver as n,RemoteResolverError as l}from"./resolvers/remote-resolver.js";import{EncryptedCache as m}from"./cache/index.js";import{createResolver as f,selectResolver as d}from"./config/resolver-selection.js";import{collectContext as g}from"./context/context-collector.js";import{sanitizeValue as A,sanitizeRecord as S,sanitizeObject as y}from"./context/context-sanitizer.js";import{getMachineFingerprint as R}from"./machine/index.js";import{LicenseClient as D}from"./license/index.js";import{ClaudeCodeAdapter as M,CursorAdapter as h,VSCodeAdapter as E,GeminiAdapter as O,CodexAdapter as k,AntigravityAdapter as F,AdapterRegistry as P,UnknownTargetError as b,createDefaultRegistry as I,detectPlatform as N,isValidTargetId as j}from"./adapters/index.js";import{ClientCircuitBreaker as Y,DegradationManager as _,DegradationLevel as w,FreshnessIndicator as z,RecoveryDetector as G}from"./resilience/index.js";import{OfflineTelemetryQueue as V}from"./telemetry/index.js";import{getCacheStatus as Q,formatCacheStatus as U}from"./commands/cache-status.js";import{getSubagentApprovalPolicy as J,ensureManagedSubagentApprovalPolicy as K,setSubagentApprovalMode as W,resetSubagentApprovalMode as X,ApprovalPolicyConfigError as Z}from"./config.js";import{configCliHandler as ee}from"./commands/config.js";import{storyCheckpointCliHandler as oe,parseStoryCheckpointArgs as te}from"./commands/story-checkpoint.js";import{beginDirectYoloStoryCommit as ie,finalizeDirectYoloStoryCheckpoint as pe,issueDirectYoloSetupLeaseHandoff as ne,prepareDirectYoloSetup as le,recoverLegacyDirectYoloStoryCheckpoint as ce}from"./git/direct-yolo-checkpoint.js";import{FRONTMATTER_DIAGNOSTIC_CATEGORIES as se,FRONTMATTER_DIAGNOSTIC_REASON_CODES as fe,getFrontmatterDiagnostic as de,formatFrontmatterDiagnostic as Ce}from"./errors/frontmatter-diagnostics.js";import{invoke as xe,invokeCliHandler as Ae,collectStateSnapshot as Se}from"./commands/invoke.js";import{TierAwareClient as ue}from"./tier/index.js";import{buildProjectMemoryContent as ve,createNodeProjectMemoryFs as De,writeProjectMemory as Te,writeProjectMemoryTargetFiles as Me}from"./memory/project-memory-writer.js";export{P as AdapterRegistry,F as AntigravityAdapter,Z as ApprovalPolicyConfigError,M as ClaudeCodeAdapter,Y as ClientCircuitBreaker,k as CodexAdapter,h as CursorAdapter,w as DegradationLevel,_ as DegradationManager,m as EncryptedCache,se as FRONTMATTER_DIAGNOSTIC_CATEGORIES,fe as FRONTMATTER_DIAGNOSTIC_REASON_CODES,z as FreshnessIndicator,O as GeminiAdapter,D as LicenseClient,i as LocalResolver,t as NoOpCache,V as OfflineTelemetryQueue,G as RecoveryDetector,n as RemoteResolver,l as RemoteResolverError,o as ResolverMode,ue as TierAwareClient,b as UnknownTargetError,E as VSCodeAdapter,ie as beginDirectYoloStoryCommit,ve as buildProjectMemoryContent,g as collectContext,Se as collectStateSnapshot,ee as configCliHandler,I as createDefaultRegistry,De as createNodeProjectMemoryFs,f as createResolver,N as detectPlatform,K as ensureManagedSubagentApprovalPolicy,pe as finalizeDirectYoloStoryCheckpoint,U as formatCacheStatus,Ce as formatFrontmatterDiagnostic,Q as getCacheStatus,de as getFrontmatterDiagnostic,R as getMachineFingerprint,J as getSubagentApprovalPolicy,xe as invoke,Ae as invokeCliHandler,j as isValidTargetId,ne as issueDirectYoloSetupLeaseHandoff,te as parseStoryCheckpointArgs,le as prepareDirectYoloSetup,ce as recoverLegacyDirectYoloStoryCheckpoint,X as resetSubagentApprovalMode,y as sanitizeObject,S as sanitizeRecord,A as sanitizeValue,d as selectResolver,W as setSubagentApprovalMode,oe as storyCheckpointCliHandler,Te as writeProjectMemory,Me as writeProjectMemoryTargetFiles};