@ornexus/neocortex 4.60.65 → 4.60.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/release-source.json +1 -1
  2. package/dist/sbom.cdx.json +23 -23
  3. package/install.ps1 +1 -1
  4. package/install.sh +1 -1
  5. package/package.json +9 -2
  6. package/packages/client/dist/commands/architecture-root-binding.js +1 -1
  7. package/packages/client/dist/commands/invoke.d.ts +1 -1
  8. package/packages/client/dist/commands/invoke.js +79 -78
  9. package/packages/client/dist/commands/story-checkpoint.d.ts +3 -1
  10. package/packages/client/dist/commands/story-checkpoint.js +1 -1
  11. package/packages/client/dist/git/direct-yolo-c01-retry.d.ts +21 -0
  12. package/packages/client/dist/git/direct-yolo-c01-retry.js +4 -0
  13. package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +1 -5
  14. package/packages/client/dist/git/direct-yolo-checkpoint.js +4 -4
  15. package/packages/client/dist/git/git-lifecycle-store.d.ts +0 -2
  16. package/packages/client/dist/git/git-lifecycle-store.js +8 -9
  17. package/packages/client/dist/private-execution/clean-baseline.d.ts +2 -3
  18. package/packages/client/dist/private-execution/clean-baseline.js +2 -2
  19. package/packages/client/dist/private-execution/isolated-admission.d.ts +2 -0
  20. package/packages/client/dist/private-execution/isolated-admission.js +16 -11
  21. package/packages/client/dist/yolo/invoke-envelope-capability.d.ts +16 -0
  22. package/packages/client/dist/yolo/invoke-envelope-capability.js +1 -0
  23. package/packages/client/dist/yolo/spec-envelope-collector.d.ts +7 -0
  24. package/packages/client/dist/yolo/spec-envelope-collector.js +3 -3
  25. package/packages/shared/dist/architecture-non-ui-scope.js +22 -0
  26. package/packages/shared/dist/architecture-public-topology.js +11 -0
  27. package/packages/shared/dist/invocation/index.js +4 -2
  28. package/packages/shared/dist/private-qa-structural-admission.js +14 -0
  29. package/packages/shared/dist/private-yolo-predecessor-decision.js +32 -0
  30. package/packages/shared/dist/project-validation-commands.js +74 -0
  31. package/packages/shared/dist/yolo/spec-envelope.js +2 -0
  32. package/targets-stubs/antigravity/gemini.md +1 -1
  33. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  34. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  35. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  36. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  37. package/targets-stubs/claude-code/neocortex.md +2 -2
  38. package/targets-stubs/codex/AGENTS.md +1 -1
  39. package/targets-stubs/cursor/agent.md +2 -2
  40. package/targets-stubs/gemini-cli/agent.md +2 -2
  41. package/targets-stubs/opencode/neocortex-root.md +1 -1
  42. package/targets-stubs/vscode/neocortex.agent.md +2 -2
@@ -1,4 +1,4 @@
1
- type StoryCheckpointAction = 'setup' | 'accept-setup' | 'handoff' | 'begin' | 'finalize' | 'recover';
1
+ type StoryCheckpointAction = 'setup' | 'accept-setup' | 'handoff' | 'begin' | 'finalize' | 'recover' | 'retry-c01';
2
2
  interface StoryCheckpointCliOptions {
3
3
  readonly action: StoryCheckpointAction;
4
4
  readonly storyId: string;
@@ -9,6 +9,8 @@ interface StoryCheckpointCliOptions {
9
9
  readonly format: 'json' | 'plain';
10
10
  readonly setupHandoffSessionId?: string;
11
11
  readonly setupHandoffTokenFile?: string;
12
+ readonly expectedHeadSha?: string;
13
+ readonly apply?: boolean;
12
14
  }
13
15
  export declare function parseStoryCheckpointArgs(args: readonly string[]): StoryCheckpointCliOptions;
14
16
  export declare function storyCheckpointCliHandler(args: readonly string[]): Promise<number>;
@@ -1 +1 @@
1
- import{readFile as m}from"node:fs/promises";import{resolve as d}from"node:path";import{acceptDirectYoloSetupCheckpoint as w,beginDirectYoloStoryCommit as k,finalizeDirectYoloStoryCheckpoint as y,issueDirectYoloSetupLeaseHandoff as g,prepareDirectYoloSetup as v,recoverLegacyDirectYoloStoryCheckpoint as S}from"../git/direct-yolo-checkpoint.js";function E(a){const e=a[0];if(e!=="setup"&&e!=="accept-setup"&&e!=="handoff"&&e!=="begin"&&e!=="finalize"&&e!=="recover")throw new Error("story-checkpoint-action-invalid");let r="",t=process.cwd(),i,p="origin",c=!1,u="plain",l,f;for(let h=1;h<a.length;h++){const o=a[h],n=()=>a[++h]??"";if(o==="--story")r=n();else if(o.startsWith("--story="))r=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")i=n();else if(o.startsWith("--commit="))i=o.slice(9);else if(o==="--remote")p=n();else if(o.startsWith("--remote="))p=o.slice(9);else if(o==="--push"||o==="--require-remote")c=!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")f=n();else if(o.startsWith("--setup-handoff-token-file="))f=o.slice(27);else if(o==="--format"){const s=n();if(s!=="json"&&s!=="plain")throw new Error("story-checkpoint-format-invalid");u=s}else if(o.startsWith("--format=")){const s=o.slice(9);if(s!=="json"&&s!=="plain")throw new Error("story-checkpoint-format-invalid");u=s}else throw new Error("story-checkpoint-argument-invalid")}if(!r)throw new Error("story-checkpoint-story-required");if(e==="recover"&&!i)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"&&(i||c||p!=="origin"))throw new Error("story-checkpoint-option-invalid");if((e==="setup"||e==="accept-setup"||e==="handoff")&&(i||c||p!=="origin"))throw new Error("story-checkpoint-option-invalid");if(e==="finalize"&&i)throw new Error("story-checkpoint-option-invalid");if(l===void 0!=(f===void 0))throw new Error("story-checkpoint-setup-handoff-incomplete");if(e!=="begin"&&(l||f))throw new Error("story-checkpoint-option-invalid");return{action:e,storyId:r,projectRoot:d(t),commitSha:i,remote:p,push:c,format:u,...l?{setupHandoffSessionId:l}:{},...f?{setupHandoffTokenFile:d(f)}:{}}}async function W(a){let e;try{e=E(a)}catch(i){return console.error(i instanceof Error?i.message:"story-checkpoint-arguments-invalid"),1}let r;if(e.setupHandoffSessionId&&e.setupHandoffTokenFile)try{r={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 v(e):e.action==="accept-setup"?await w(e):e.action==="handoff"?await g(e):e.action==="begin"?await k({...e,...r?{setupLeaseHandoff:r}:{}}):e.action==="finalize"?await y(e):await S({...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 i of t.value.trailers)console.log(i);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{E as parseStoryCheckpointArgs,W as storyCheckpointCliHandler};
1
+ import{readFile as w}from"node:fs/promises";import{resolve as m}from"node:path";import{acceptDirectYoloSetupCheckpoint as k,beginDirectYoloStoryCommit as g,finalizeDirectYoloStoryCheckpoint as v,issueDirectYoloSetupLeaseHandoff as S,prepareDirectYoloSetup as E,recoverLegacyDirectYoloStoryCheckpoint as H}from"../git/direct-yolo-checkpoint.js";import{applyDirectYoloC01Retry as j,inspectDirectYoloC01Retry as C}from"../git/direct-yolo-c01-retry.js";function x(a){const e=a[0];if(e!=="setup"&&e!=="accept-setup"&&e!=="handoff"&&e!=="begin"&&e!=="finalize"&&e!=="recover"&&e!=="retry-c01")throw new Error("story-checkpoint-action-invalid");let i="",r=process.cwd(),t,l="origin",s=!1,y="plain",f,p,h,d=!1;for(let u=1;u<a.length;u++){const o=a[u],n=()=>a[++u]??"";if(o==="--story")i=n();else if(o.startsWith("--story="))i=o.slice(8);else if(o==="--project-root")r=n()||r;else if(o.startsWith("--project-root="))r=o.slice(15);else if(o==="--commit")t=n();else if(o.startsWith("--commit="))t=o.slice(9);else if(o==="--remote")l=n();else if(o.startsWith("--remote="))l=o.slice(9);else if(o==="--push"||o==="--require-remote")s=!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")p=n();else if(o.startsWith("--setup-handoff-token-file="))p=o.slice(27);else if(o==="--expected-head")h=n();else if(o.startsWith("--expected-head="))h=o.slice(16);else if(o==="--apply")d=!0;else if(o==="--format"){const c=n();if(c!=="json"&&c!=="plain")throw new Error("story-checkpoint-format-invalid");y=c}else if(o.startsWith("--format=")){const c=o.slice(9);if(c!=="json"&&c!=="plain")throw new Error("story-checkpoint-format-invalid");y=c}else throw new Error("story-checkpoint-argument-invalid")}if(!i)throw new Error("story-checkpoint-story-required");if(e==="recover"&&!t)throw new Error("story-checkpoint-commit-required");if(e==="recover"&&!s)throw new Error("story-checkpoint-remote-proof-required");if(e==="finalize"&&!s)throw new Error("story-checkpoint-push-required");if(e==="begin"&&(t||s||l!=="origin"))throw new Error("story-checkpoint-option-invalid");if((e==="setup"||e==="accept-setup"||e==="handoff")&&(t||s||l!=="origin"))throw new Error("story-checkpoint-option-invalid");if(e==="finalize"&&t)throw new Error("story-checkpoint-option-invalid");if(f===void 0!=(p===void 0))throw new Error("story-checkpoint-setup-handoff-incomplete");if(e!=="begin"&&(f||p))throw new Error("story-checkpoint-option-invalid");if(e!=="retry-c01"&&(h||d))throw new Error("story-checkpoint-option-invalid");if(e==="retry-c01"&&(t||s||l!=="origin"||d&&!/^[a-f0-9]{40,64}$/.test(h??"")))throw new Error("story-checkpoint-option-invalid");return{action:e,storyId:i,projectRoot:m(r),commitSha:t,remote:l,push:s,format:y,...h?{expectedHeadSha:h}:{},...d?{apply:d}:{},...f?{setupHandoffSessionId:f}:{},...p?{setupHandoffTokenFile:m(p)}:{}}}async function I(a){let e;try{e=x(a)}catch(t){return console.error(t instanceof Error?t.message:"story-checkpoint-arguments-invalid"),1}if(e.action==="retry-c01")try{const t=e.apply?await j(e.projectRoot,e.storyId,e.expectedHeadSha):await C(e.projectRoot,e.storyId);return console.log(e.format==="json"?JSON.stringify(t,null,2):`story-checkpoint retry-c01: ${e.apply?"committed":"eligible"}`),0}catch(t){return console.error(t instanceof Error?t.message:"direct-yolo-retry-unverified"),1}let i;if(e.setupHandoffSessionId&&e.setupHandoffTokenFile)try{i={sessionId:e.setupHandoffSessionId,token:(await w(e.setupHandoffTokenFile,"utf8")).trim()}}catch{return console.error("story-checkpoint-setup-handoff-read-failed"),1}const r=e.action==="setup"?await E(e):e.action==="accept-setup"?await k(e):e.action==="handoff"?await S(e):e.action==="begin"?await g({...e,...i?{setupLeaseHandoff:i}:{}}):e.action==="finalize"?await v(e):await H({...e,commitSha:e.commitSha});if(e.format==="json")console.log(JSON.stringify({action:e.action,...r},null,2));else if(r.ok)if(console.log(`story-checkpoint ${e.action}: ok`),e.action==="begin"&&"trailers"in r.value)for(const t of r.value.trailers)console.log(t);else"headSha"in r.value&&console.log(`head=${r.value.headSha}`);else console.error(`story-checkpoint ${e.action}: ${r.reasonCode}`);return r.ok?0:1}export{x as parseStoryCheckpointArgs,I as storyCheckpointCliHandler};
@@ -0,0 +1,21 @@
1
+ export interface DirectYoloC01RetryPlan {
2
+ readonly schemaVersion: 1;
3
+ readonly kind: 'direct-yolo-c01-retry-plan';
4
+ readonly storyId: string;
5
+ readonly epicId: string;
6
+ readonly executionBranch: string;
7
+ readonly previousHeadSha: string;
8
+ readonly previousStateSha256: string;
9
+ readonly runtimeRevision: number;
10
+ readonly previousStatus: 'create-tasks';
11
+ readonly previousStepsCompleted: readonly string[];
12
+ readonly auditPath: string;
13
+ readonly publicSafe: true;
14
+ }
15
+ /** No mutation: require missing private session, expired lease, clean Git, and exact C01-C05 progress. */
16
+ export declare function inspectDirectYoloC01Retry(projectRoot: string, storyId: string): Promise<DirectYoloC01RetryPlan>;
17
+ /** Commit a new C01 attempt; the prior progress stays reachable in the parent commit. */
18
+ export declare function applyDirectYoloC01Retry(projectRoot: string, storyId: string, expectedHeadSha: string): Promise<{
19
+ readonly plan: DirectYoloC01RetryPlan;
20
+ readonly newHeadSha: string;
21
+ }>;
@@ -0,0 +1,4 @@
1
+ import{execFileSync as H}from"node:child_process";import{createHash as P,randomBytes as R}from"node:crypto";import{existsSync as k,readFileSync as E,writeFileSync as D}from"node:fs";import{join as u,resolve as O}from"node:path";import{acquireGitLifecyclePhysicalIntegrationLock as C,assertGitLifecyclePrivateFile as j,ensureGitLifecyclePrivateChildDirectory as L,gitLifecycleRuntimeDirectory as G,readGitLifecycleRuntime as N,releaseGitLifecyclePhysicalIntegrationLock as T}from"./git-lifecycle-store.js";const _=["809db253d486b5d2620d318666219e8a2b4df05016174ba3c8a33fa17b65802a","50224b193dae7ba2a066e54f7091d2656302b849ea7a145a3a4c556d85f3fe3c","f757f6bf1182f23e5d7acbe47cbce9f0fa12f211d290b486892c6722bc42b4e8","9cd927d02ff5979b5077e75b09cb34be275eca0e1c955403235b9ba0fb7a55eb","a3f880e8d5bca9158a88c46f88754c0948237a3e8516c83a762ba1ee22c27d46"];function i(n,r){const o={...process.env};for(const e of["GIT_DIR","GIT_WORK_TREE","GIT_INDEX_FILE","GIT_COMMON_DIR","GIT_NAMESPACE"])delete o[e];return H("git",[...r],{cwd:n,env:o,encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:3e4,maxBuffer:16*1024*1024}).trim()}function y(n){return P("sha256").update(n).digest("hex")}function c(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}async function $(n,r){const o=O(n);if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(r))throw new Error("direct-yolo-retry-story-invalid");const e=r.split(".")[0],f=i(o,["rev-parse","HEAD"]),s=i(o,["symbolic-ref","--quiet","--short","HEAD"]);if(i(o,["status","--porcelain=v1","--untracked-files=all"]))throw new Error("direct-yolo-retry-checkout-dirty");const t=E(u(o,".neocortex/state.json"),"utf8"),m=c(JSON.parse(t)),a=c(c(m?.stories)?.[r]),d=c(c(m?.epics)?.[e]);if(!a||!d||a.epic_id!==e||d.branch_mode!=="epic"||d.execution_branch!==s||s!==`epic/${e}`)throw new Error("direct-yolo-retry-story-binding-invalid");const p=a.steps_completed;if(a.status!=="create-tasks"||typeof a.last_step!="string"||y(a.last_step)!==_.at(-1)||a.branch_name!==s||!Array.isArray(p)||p.length!==_.length||p.some((S,v)=>typeof S!="string"||y(S)!==_[v])||a.checkpoint||a.pr_number)throw new Error("direct-yolo-retry-progress-ineligible");const h=await N(o,{required:!0}),w=c(h.epics[e]),b=c(w?.branch_lease),l=c(w?.origin_binding);if(c(h.stories[r])&&Object.keys(c(h.stories[r])).length>0||!l||l.executionBranch!==s||typeof l.originHeadSha!="string"||!/^[a-f0-9]{40,64}$/.test(l.originHeadSha)||b&&(!Number.isFinite(Date.parse(String(b.expiresAt)))||Date.parse(String(b.expiresAt))>Date.now()))throw new Error("direct-yolo-retry-runtime-active");i(o,["merge-base","--is-ancestor",String(l.originHeadSha),f]);const g=await L(await G(o),"private-execution"),A=y(r);for(const S of[`session-${A}.json`,`baseline-${A}.json`]){const v=u(g,S);if(k(v))throw await j(v,g),new Error("direct-yolo-retry-private-evidence-present")}const x=`.neocortex/recovery/${r}-c01-${y(`${f}\0${y(t)}`).slice(0,16)}.json`;if(k(u(o,x)))throw new Error("direct-yolo-retry-already-recorded");if(i(o,["rev-parse","HEAD"])!==f||E(u(o,".neocortex/state.json"),"utf8")!==t)throw new Error("direct-yolo-retry-preflight-raced");return Object.freeze({schemaVersion:1,kind:"direct-yolo-c01-retry-plan",storyId:r,epicId:e,executionBranch:s,previousHeadSha:f,previousStateSha256:y(t),runtimeRevision:h.revision,previousStatus:"create-tasks",previousStepsCompleted:[...p],auditPath:x,publicSafe:!0})}async function q(n,r,o){const e=O(n),f=`retry-${R(16).toString("hex")}`,s=await C(e,{kind:"direct",storyId:r,sessionId:f,idempotencyKey:f,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!s.ok)throw new Error(s.reasonCode);try{const t=await $(e,r);if(t.previousHeadSha!==o)throw new Error("direct-yolo-retry-head-mismatch");const m=u(e,".neocortex/state.json"),a=JSON.parse(E(m,"utf8")),d=a.stories[r];d.status="backlog",d.steps_completed=[],d.last_step=null,d.branch_name=null;const p={...t,recordedAt:new Date().toISOString(),reason:"private-session-lost",newAttemptStatus:"backlog",oldProgressAcceptedForNewAttempt:!1};d.last_updated=p.recordedAt;const h=await $(e,r);if(JSON.stringify(h)!==JSON.stringify(t))throw new Error("direct-yolo-retry-apply-raced");if(i(e,["rev-parse","HEAD"])!==o||y(E(m,"utf8"))!==t.previousStateSha256||i(e,["status","--porcelain=v1","--untracked-files=all"]))throw new Error("direct-yolo-retry-apply-raced");const{mkdirSync:w}=await import("node:fs");if(w(u(e,".neocortex/recovery"),{recursive:!0}),D(u(e,t.auditPath),`${JSON.stringify(p,null,2)}
2
+ `,{flag:"wx"}),D(m,`${JSON.stringify(a,null,2)}
3
+ `),(await N(e,{required:!0})).revision!==t.runtimeRevision)throw new Error("direct-yolo-retry-runtime-raced");i(e,["add","--",".neocortex/state.json",t.auditPath]),i(e,["commit","-m",`chore(${r}): begin audited C01 retry`,"-m",`Neocortex-C01-Retry-From: ${t.previousHeadSha}`,"-m",`Neocortex-C01-Retry-Audit: ${t.auditPath}`]);const l=i(e,["rev-parse","HEAD"]),g=i(e,["diff-tree","--no-commit-id","--name-only","-r",l]).split(`
4
+ `).filter(Boolean).sort();if(i(e,["rev-parse",`${l}^`])!==t.previousHeadSha||JSON.stringify(g)!==JSON.stringify([".neocortex/state.json",t.auditPath].sort())||i(e,["status","--porcelain=v1","--untracked-files=all"]))throw new Error("direct-yolo-retry-postcommit-unverified");return{plan:t,newHeadSha:l}}finally{await T(s.path,s.owner).catch(()=>{})}}export{q as applyDirectYoloC01Retry,$ as inspectDirectYoloC01Retry};
@@ -73,10 +73,6 @@ export interface DirectYoloCheckpointOptions {
73
73
  readonly beforeCheckpointPersist?: () => Promise<void>;
74
74
  /** Test seam for crash-window reproduction after durable CAS and before release. */
75
75
  readonly afterCheckpointPersist?: () => Promise<void>;
76
- /** Test-only timing seam; production callers use the fixed 30-minute lease. */
77
- readonly writerLeaseDurationMs?: number;
78
- /** Test-only timing seam; production callers renew every five minutes. */
79
- readonly writerLeaseHeartbeatIntervalMs?: number;
80
76
  }
81
77
  /**
82
78
  * Productive P207 setup boundary. It owns only the current checkout and the
@@ -91,7 +87,7 @@ export declare function acceptDirectYoloSetupCheckpoint(options: Pick<DirectYolo
91
87
  * one-time token never crosses stdout; only a public receipt is returned.
92
88
  */
93
89
  export declare function issueDirectYoloSetupLeaseHandoff(options: Pick<DirectYoloCheckpointOptions, 'projectRoot' | 'storyId' | 'nowIso'>): Promise<DirectYoloCheckpointResult<DirectYoloSetupHandoffReceipt>>;
94
- export declare function beginDirectYoloStoryCommit(options: Pick<DirectYoloCheckpointOptions, 'projectRoot' | 'storyId' | 'nowIso' | 'setupLeaseHandoff' | 'setupHandoffFault' | 'writerLeaseDurationMs'>): Promise<DirectYoloCheckpointResult<DirectYoloCommitPlan>>;
90
+ export declare function beginDirectYoloStoryCommit(options: Pick<DirectYoloCheckpointOptions, 'projectRoot' | 'storyId' | 'nowIso' | 'setupLeaseHandoff' | 'setupHandoffFault'>): Promise<DirectYoloCheckpointResult<DirectYoloCommitPlan>>;
95
91
  export declare function finalizeDirectYoloStoryCheckpoint(options: DirectYoloCheckpointOptions): Promise<DirectYoloCheckpointResult<StoryCommitCheckpoint>>;
96
92
  export declare function recoverLegacyDirectYoloStoryCheckpoint(options: DirectYoloCheckpointOptions & {
97
93
  readonly commitSha: string;
@@ -1,4 +1,4 @@
1
- import{execFile as $e}from"node:child_process";import{createHash as ze,randomBytes as Re,timingSafeEqual as Ne}from"node:crypto";import{readFile as oe}from"node:fs/promises";import{join as he,resolve as ie}from"node:path";import{promisify as Me}from"node:util";import{readRootMemoryEffectForCheckpoint as We}from"../private-execution/root-memory-scope.js";import{rootMemoryEffectDigest as Ge,verifyRootMemoryPhysicalWriteSet as fe}from"../private-execution/root-memory-git-evidence.js";import{acquireGitLifecyclePhysicalIntegrationLock as V,applyGitLifecycleRuntimeOverlay as Te,computeImmutableStoryQaEvidenceDigest as Ke,computeGitLifecyclePhysicalIntegrationLockOwnerDigest as Se,computeP205StoryQaEvidenceDigest as Ve,computeLegacyDirectYoloRecoveryReceiptRef as Fe,ensureRuntimeEpic as W,ensureRuntimeStory as xe,ensureGitLifecyclePrivateChildDirectory as Ye,executeP205TransientAuthority as Je,projectP205TransientExecutionEvidence as Ze,publicStoryReviewArtifactFromGit as ne,LEGACY_DIRECT_YOLO_RECOVERY_COMMITS as Qe,mutateGitLifecycleRuntime as P,P205_COMPLETE_COMMAND as Ue,readGitLifecycleRuntime as q,gitLifecycleRuntimeDirectory as Xe,assertGitLifecyclePrivateFile as De,releaseGitLifecyclePhysicalIntegrationLock as G,releaseGitLifecyclePhysicalIntegrationLockForCheckpoint as et,renewGitLifecyclePhysicalIntegrationLock as tt,verifyGitLifecyclePhysicalIntegrationLock as J,verifyAcceptedGitLifecycleStoryCheckpoint as be}from"./git-lifecycle-store.js";import{anchoredAtomicWriteFile as rt}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as ot,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as ke,GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID as ae}from"./git-lifecycle-step-ids.js";const le=Me($e),it=1800*1e3,nt=300*1e3;async function Dt(e){try{const t=await je(e.projectRoot,e.storyId),r=T(e.nowIso),o=Date.parse(r),i=await p(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),n=await p(t.projectRoot,["rev-parse","HEAD"]),l=await q(t.projectRoot,{required:!0}),c=w(l.epics[t.epicId]),d=w(c?.branch_lease),a=d&&Number.isFinite(Date.parse(String(d.expiresAt)))&&Date.parse(String(d.expiresAt))>o;if(a&&d?.ownerStoryId!==e.storyId)return s("direct-yolo-writer-active");let h=Ie(c?.origin_binding,t.executionBranch,t.originBranch);if(i===t.executionBranch){if(!h)return s("direct-yolo-origin-binding-invalid")}else{if(i!==t.originBranch)return s("direct-yolo-current-branch-mismatch");if(h&&h.originHeadSha!==n)return s("direct-yolo-origin-binding-conflict");if(h??={schemaVersion:1,originBranch:t.originBranch,originHeadSha:n,executionBranch:t.executionBranch,capturedFromCurrentCheckout:!0,capturedAt:r},(await Pe(t.projectRoot)).some(m=>m.branch===t.executionBranch&&ie(m.path)!==t.projectRoot))return s("direct-yolo-execution-branch-checked-out-elsewhere");const S=await X(t.projectRoot),x=`refs/heads/${t.executionBranch}`;if(await C(t.projectRoot,["show-ref","--verify","--quiet",x])){const m=await p(t.projectRoot,["rev-parse",x]);if(m!==n){if(!await C(t.projectRoot,["merge-base","--is-ancestor",m,n]))return s("direct-yolo-execution-branch-diverged");await p(t.projectRoot,["update-ref",x,n,m])}await p(t.projectRoot,["switch",t.executionBranch])}else await p(t.projectRoot,["switch","-c",t.executionBranch]);if(await X(t.projectRoot)!==S)return s("direct-yolo-checkout-payload-raced")}const u=await p(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),f=await p(t.projectRoot,["rev-parse","HEAD"]);if(u!==t.executionBranch)return s("direct-yolo-current-branch-mismatch");if(a&&d?.ownerStoryId===e.storyId)return d.setupHeadSha!==f?s("direct-yolo-setup-lease-head-unbound"):{ok:!0,value:ve(t,h,String(d.expiresAt),!0)};const v=r,b=new Date(o+3600*1e3).toISOString(),I=`setup-${Re(32).toString("hex")}`,R=await q(t.projectRoot,{required:!0});return await P(t.projectRoot,k=>{const S=W(k,t.epicId),x=w(S.branch_lease);if(x&&Date.parse(String(x.expiresAt))>o&&x.ownerStoryId!==e.storyId)throw new Error("direct-yolo-writer-active");const m=Ie(S.origin_binding,t.executionBranch,t.originBranch);if(S.origin_binding&&!m)throw new Error("direct-yolo-origin-binding-conflict");if(m&&JSON.stringify(m)!==JSON.stringify(h))throw new Error("direct-yolo-origin-binding-conflict");S.branch_mode="epic",S.execution_branch=t.executionBranch,S.origin_branch=t.originBranch,S.graph_revision=t.graphRevision,S.origin_binding=h,S.branch_lease={schemaVersion:1,ownerStoryId:e.storyId,sessionId:I,idempotencyKey:I,acquiredAt:v,expiresAt:b,setupHeadSha:f}},{expectedRevision:R.revision,preCommit:async()=>{if(await p(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==t.executionBranch||await p(t.projectRoot,["rev-parse","HEAD"])!==f)throw new Error("direct-yolo-setup-physical-state-raced")}}),{ok:!0,value:ve(t,h,b,!1)}}catch(t){return s(ee(t,"direct-yolo-setup-failed"))}}async function bt(e){let t;try{const r=await Z(e.projectRoot,e.storyId),o=T(e.nowIso),i=he(r.projectRoot,".neocortex/state.json"),n=await oe(i,"utf8"),l=await X(r.projectRoot),c=await p(r.projectRoot,["rev-parse","HEAD"]),d=`refs/heads/${r.executionBranch}`,a=await q(r.projectRoot,{required:!0}),h=w(a.epics[r.epicId]),u=Ie(h?.origin_binding,r.executionBranch,r.originBranch),f=w(h?.branch_lease);if(!u)return s("direct-yolo-origin-binding-invalid");if(!f||!ue(f,e.storyId,o)||f?.sessionId!==f?.idempotencyKey)return s("direct-yolo-setup-lease-invalid");const v=await V(r.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:String(f.sessionId),idempotencyKey:String(f.idempotencyKey),expiresAt:new Date(Date.now()+300*1e3).toISOString(),persistent:!1});if(!v.ok)return s(v.reasonCode);if(t=v,c!==f.setupHeadSha||!await C(r.projectRoot,["merge-base","--is-ancestor",u.originHeadSha,c])||await p(r.projectRoot,["rev-parse",d])!==c)return s("direct-yolo-setup-head-mismatch");if((await Pe(r.projectRoot)).some(m=>m.branch===r.executionBranch&&ie(m.path)!==r.projectRoot))return s("direct-yolo-execution-branch-checked-out-elsewhere");const I=w(JSON.parse(n)),R=w(w(I?.stories)?.[e.storyId]),k=w(a.stories[e.storyId]);if(!R||!["backlog","ready_to_start"].includes(String(R.status))||R.steps_completed!==void 0&&(!Array.isArray(R.steps_completed)||R.steps_completed.length>0)||R.branch_name||R.checkpoint)return s("direct-yolo-setup-story-progress-conflict");const S=k?.status==="branch-ready"&&k.last_step===ae&&Array.isArray(k.steps_completed)&&k.steps_completed.length===1&&k.steps_completed[0]===ae&&Object.keys(k).sort().join(",")==="last_step,status,steps_completed";if(k&&Object.keys(k).length>0&&!S)return s("direct-yolo-setup-story-progress-conflict");const x=async()=>{if(Date.parse(String(f.expiresAt))<=(e.nowIso?Date.parse(o):Date.now())||!t||!await J(t.path,t.owner)||await oe(i,"utf8")!==n||await X(r.projectRoot)!==l||await p(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch||await p(r.projectRoot,["rev-parse","HEAD"])!==c||!await C(r.projectRoot,["merge-base","--is-ancestor",u.originHeadSha,c])||await p(r.projectRoot,["rev-parse",d])!==c)throw new Error("direct-yolo-setup-physical-state-raced")};return S?await x():await P(r.projectRoot,m=>{const g=w(m.epics[r.epicId]),D=xe(m,e.storyId);if(JSON.stringify(g?.branch_lease)!==JSON.stringify(f)||JSON.stringify(g?.origin_binding)!==JSON.stringify(u)||g?.graph_revision!==r.graphRevision||Object.keys(D).length>0)throw new Error("direct-yolo-setup-runtime-raced");D.status="branch-ready",D.last_step=ae,D.steps_completed=[ae]},{expectedRevision:a.revision,preCommit:x}),{ok:!0,value:Object.freeze({...ve(r,u,String(f.expiresAt),S),checkpointAccepted:!0,graphRevision:r.graphRevision,headSha:c})}}catch(r){return s(ee(r,"direct-yolo-setup-acceptance-failed"))}finally{t&&await G(t.path,t.owner).catch(()=>{})}}async function kt(e){try{const t=await Z(e.projectRoot,e.storyId),r=$(await E(t.projectRoot,["diff","--cached","--name-only","-z"])),o=Q(r,t.authorizedWriteSet,e.storyId,t.rootMemoryEffect);if(!o.ok)return s(o.reasonCode);if(t.rootMemoryEffect&&fe(t.projectRoot,t.rootMemoryEffect,{storyId:e.storyId,executionBranch:t.executionBranch,baseSha:await p(t.projectRoot,["rev-parse","HEAD"]),headRef:":",childPaths:t.authorizedWriteSet}),ne(t.projectRoot,e.storyId,":")?.verdict!=="approved")return s("direct-yolo-review-artifact-not-approved");if($(await E(t.projectRoot,["diff","--name-only","-z"])).some(y=>r.includes(y)))return s("direct-yolo-user-overlap");const l=await E(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!l)return s("direct-yolo-staged-diff-empty");const c=j(l),d=j([...t.authorizedWriteSet].sort().join("\0")),a=T(e.nowIso),h=await q(t.projectRoot,{required:!0}),u=w(h.epics[t.epicId]?.branch_lease);if(!ue(u,e.storyId,a))return s("direct-yolo-setup-handoff-owner-invalid");const f=String(u.sessionId),v=String(u.expiresAt),b=new Date(Math.min(Date.parse(v),Date.parse(a)+300*1e3)).toISOString(),I=await F(t.projectRoot,e.storyId),R=I?.state==="issued"&&I.fromSessionId===f&&I.bundleDigest===c&&I.claimRevision===d&&Date.parse(I.expiresAt)>Date.parse(a),k=R?I.expiresAt:b,S=R?I.token:Re(32).toString("base64url"),x=j(S),m=Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff",storyId:e.storyId,fromSessionId:f,tokenDigest:x,bundleDigest:c,claimRevision:d,expiresAt:k}),g=j(JSON.stringify(m)),D=await V(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:f,idempotencyKey:f,expiresAt:k,persistent:!1,createdAt:a});if(!D.ok)return s(D.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{await ye(t.projectRoot,{schemaVersion:1,kind:"direct-yolo-setup-handoff-token",state:"issued",storyId:e.storyId,fromSessionId:f,token:S,tokenDigest:x,bundleDigest:c,claimRevision:d,grantDigest:g,expiresAt:k}),await P(t.projectRoot,y=>{const A=w(W(y,t.epicId).branch_lease);if(!ue(A,e.storyId,a)||A?.sessionId!==f||A.idempotencyKey!==f)throw new Error("direct-yolo-setup-handoff-owner-raced");A.handoffGrant=m},{expectedRevision:h.revision,preCommit:async()=>{if(!await J(D.path,D.owner))throw new Error("direct-yolo-integration-lock-raced");const y=await F(t.projectRoot,e.storyId);if(!y||y.state!=="issued"||y.grantDigest!==g||y.tokenDigest!==x)throw new Error("direct-yolo-setup-handoff-token-raced")}})}finally{await G(D.path,D.owner).catch(()=>{})}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff-receipt",storyId:e.storyId,sessionId:f,bundleDigest:c,claimRevision:d,grantDigest:g,expiresAt:k,reused:R,publicSafe:!0})}}catch(t){return s(t instanceof Error&&/^direct-yolo-/.test(t.message)?t.message:"direct-yolo-setup-handoff-failed")}}async function jt(e){try{const t=await Z(e.projectRoot,e.storyId),r=await p(t.projectRoot,["rev-parse","HEAD"]),o=$(await E(t.projectRoot,["diff","--cached","--name-only","-z"])),i=Q(o,t.authorizedWriteSet,e.storyId,t.rootMemoryEffect);if(!i.ok)return s(i.reasonCode);t.rootMemoryEffect&&fe(t.projectRoot,t.rootMemoryEffect,{storyId:e.storyId,executionBranch:t.executionBranch,baseSha:r,headRef:":",childPaths:t.authorizedWriteSet});const n=ne(t.projectRoot,e.storyId,":");if(n?.verdict!=="approved")return s("direct-yolo-review-artifact-not-approved");if($(await E(t.projectRoot,["diff","--name-only","-z"])).some(g=>o.includes(g)))return s("direct-yolo-user-overlap");const c=await E(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!c)return s("direct-yolo-staged-diff-empty");const d=j(c),a=j([...t.authorizedWriteSet].sort().join("\0")),h=j(["direct-yolo-commit-v1",e.storyId,t.epicId,t.executionBranch,r,d,t.graphRevision,a].join("\0")),u=T(e.nowIso);let f=e.setupLeaseHandoff??await at(t.projectRoot,e.storyId,d,a,u);const v=await q(t.projectRoot,{required:!0}),b=w(v.epics[t.epicId]?.branch_lease),I=b?.ownerStoryId===e.storyId&&b.sessionId===h&&b.idempotencyKey===h&&typeof b.expiresAt=="string"&&Date.parse(b.expiresAt)>Date.parse(u)?b:void 0;if(I&&e.setupLeaseHandoff)return s("direct-yolo-setup-handoff-replayed");const R=w(I?.handoffConsumption);if(R){const g=await F(t.projectRoot,e.storyId);if(!g||!["consuming","consumed"].includes(g.state)||g.fromSessionId!==R.fromSessionId||g.tokenDigest!==R.tokenDigest||g.bundleDigest!==d||g.claimRevision!==a||R.bundleDigest!==d||R.claimRevision!==a||g.consumedBySessionId!==h||R.consumedBySessionId!==h)return s("direct-yolo-setup-handoff-consume-invalid");if(g.state==="consuming"){if(!g.token||j(g.token)!==g.tokenDigest)return s("direct-yolo-setup-handoff-consume-invalid");f={sessionId:g.fromSessionId,token:g.token}}}const k=Le(e.writerLeaseDurationMs),S=I?String(I.expiresAt):new Date(Date.parse(u)+k).toISOString(),x=await V(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:h,idempotencyKey:h,expiresAt:S,persistent:!0,createdAt:I&&typeof I.acquiredAt=="string"?I.acquiredAt:u});if(!x.ok)return s(x.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{f&&e.setupLeaseHandoff===void 0&&(await ct(t.projectRoot,e.storyId,f.sessionId,f.token,h,u),await e.setupHandoffFault?.("after-consuming-persisted")),await P(t.projectRoot,g=>{const D=W(g,t.epicId),y=w(D.branch_lease),A=y&&Date.parse(String(y.expiresAt))>Date.parse(u),Y=y?.ownerStoryId===e.storyId&&y.sessionId===h&&y.idempotencyKey===h,K=y?.ownerStoryId===e.storyId&&y.sessionId===y.idempotencyKey&&typeof y.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(y.idempotencyKey),z=A&&K&&dt({current:y,handoff:f,storyId:e.storyId,bundleDigest:d,claimRevision:a,nowIso:u});if(f&&A&&!Y&&!z)throw new Error("direct-yolo-setup-handoff-invalid");if(A&&!Y&&!z)throw new Error("direct-yolo-writer-active");const B=z?w(y?.handoffGrant):void 0,H=B?{schemaVersion:1,kind:"direct-yolo-setup-handoff-consumption",state:"consumed",storyId:e.storyId,fromSessionId:String(y?.sessionId),tokenDigest:String(B.tokenDigest),bundleDigest:d,claimRevision:a,consumedBySessionId:h,consumedAt:u}:void 0;D.branch_mode="epic",D.execution_branch=t.executionBranch,D.origin_branch=t.originBranch,D.graph_revision=t.graphRevision,D.branch_lease=A&&Y?y:{schemaVersion:1,ownerStoryId:e.storyId,sessionId:h,idempotencyKey:h,acquiredAt:u,expiresAt:S,...H?{handoffConsumption:H}:{}}},{expectedRevision:v.revision,preCommit:async()=>{if(!await J(x.path,x.owner))throw new Error("direct-yolo-integration-lock-raced")}})}catch(g){throw await G(x.path,x.owner).catch(()=>{}),g}f&&e.setupLeaseHandoff===void 0&&(await e.setupHandoffFault?.("before-consumed-persist"),await st(t.projectRoot,t.epicId,e.storyId,f.sessionId,f.token,d,a,h,u));const m=Object.freeze([`Neocortex-Story: ${e.storyId}`,`Neocortex-Epic: ${t.epicId}`,`Neocortex-Execution-Branch: ${t.executionBranch}`,`Neocortex-Prepared-Base: ${r}`,`Neocortex-Bundle-Digest: ${d}`,`Neocortex-Review-Artifact-Digest: ${n.digest}`,`Neocortex-Graph-Revision: ${t.graphRevision}`,`Neocortex-Claim-Revision: ${a}`,...t.rootMemoryEffect?[`Neocortex-Root-Memory-Effect: ${Ge(t.rootMemoryEffect)}`]:[]]);return{ok:!0,value:Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:r,bundleDigest:d,reviewArtifactDigest:n.digest,graphRevision:t.graphRevision,claimRevision:a,idempotencyKey:h,changedPaths:Object.freeze(o),trailers:m})}}catch(t){return s(ee(t,"direct-yolo-begin-failed"))}}async function Et(e){let t,r,o;try{const i=await Z(e.projectRoot,e.storyId);t=i;const n=await p(i.projectRoot,["rev-parse","HEAD"]);let l=await q(i.projectRoot,{required:!0});const c=w(l.stories[e.storyId]?.checkpoint);if(c){const L=typeof c.headSha=="string"?c.headSha:"",N=typeof c.graphRevision=="string"?c.graphRevision:"",O=/^[a-f0-9]{40,64}$/.test(L)?$(await E(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",L])):[],M=Q(O,i.authorizedWriteSet,e.storyId,i.rootMemoryEffect);if(!(/^[a-f0-9]{40,64}$/.test(L)&&await C(i.projectRoot,["merge-base","--is-ancestor",L,n]))||!/^[a-f0-9]{64}$/.test(N)||!M.ok)return s("direct-yolo-replay-invalid");const re=await ge(e,i.projectRoot,n,N);if(!await be(i.projectRoot,c,e.storyId,i.epicId,i.executionBranch,re.transientAuthority,i.authorizedWriteSet))return s("direct-yolo-replay-invalid");if(!await we(i.projectRoot,i.executionBranch,n,O))return s("direct-yolo-replay-head-raced");if(e.push&&!await Be(i.projectRoot,e.remote??"origin",i.executionBranch,L))return s("direct-yolo-remote-head-mismatch");const de=Array.isArray(c.receiptRefs)?c.receiptRefs.find(_=>typeof _=="string"&&/^physical-lock-owner:[a-f0-9]{64}$/.test(_)):void 0;return de&&typeof c.idempotencyKey=="string"&&await et(i.projectRoot,{storyId:e.storyId,idempotencyKey:c.idempotencyKey,ownerDigest:de.slice(20)}),{ok:!0,value:c}}const d=n,a=await p(i.projectRoot,["rev-parse",`${d}^`]),h=await E(i.projectRoot,["show","--no-patch","--format=%B",d]),u=$(await E(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",d])),f=Q(u,i.authorizedWriteSet,e.storyId,i.rootMemoryEffect);if(!f.ok)return s(f.reasonCode);i.rootMemoryEffect&&fe(i.projectRoot,i.rootMemoryEffect,{storyId:e.storyId,executionBranch:i.executionBranch,baseSha:a,headRef:d,childPaths:i.authorizedWriteSet});const v=U(h,"Neocortex-Bundle-Digest"),b=U(h,"Neocortex-Graph-Revision"),I=U(h,"Neocortex-Claim-Revision"),R=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",j([...i.authorizedWriteSet].sort().join("\0"))]]);if(!v||!/^[a-f0-9]{64}$/.test(v)||!b||!I||[...R].some(([L,N])=>U(h,L)!==N))return s("direct-yolo-trailers-invalid");const k=ne(i.projectRoot,e.storyId,d);if(k?.verdict!=="approved")return s("direct-yolo-review-artifact-not-approved");const S=U(h,"Neocortex-Review-Artifact-Digest");if(S!==void 0&&S!==k.digest)return s("direct-yolo-review-artifact-digest-mismatch");const x=j(await E(i.projectRoot,["diff","--binary","--full-index",`${a}..${d}`]));if(v!==x)return s("direct-yolo-bundle-digest-mismatch");const m=j(["direct-yolo-commit-v1",e.storyId,i.epicId,i.executionBranch,a,v,b,I].join("\0")),g=w(l.epics[i.epicId]?.branch_lease),D=T(e.nowIso),y=g?.ownerStoryId===e.storyId&&g.idempotencyKey===m&&g.sessionId===m&&Date.parse(String(g.expiresAt))>Date.now()?g:void 0;if(g&&Date.parse(String(g.expiresAt))>Date.now()&&!y)return s("direct-yolo-writer-active");const A=Le(e.writerLeaseDurationMs),Y=ft(e.writerLeaseHeartbeatIntervalMs,A),K=y??{schemaVersion:1,ownerStoryId:e.storyId,sessionId:m,idempotencyKey:m,acquiredAt:D,expiresAt:new Date(Date.parse(D)+A).toISOString()},z=await V(i.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:m,idempotencyKey:m,expiresAt:String(K.expiresAt),persistent:!0,createdAt:String(K.acquiredAt)});if(!z.ok)return s(z.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");let B={path:z.path,owner:z.owner};o=B,y||(l=(await P(i.projectRoot,N=>{const O=W(N,i.epicId),M=w(O.branch_lease);if(M&&Date.parse(String(M.expiresAt))>Date.parse(D))throw new Error("direct-yolo-writer-active");if(O.graph_revision!==i.graphRevision)throw new Error("direct-yolo-graph-revision-raced");O.branch_lease=K},{expectedRevision:l.revision})).document);let H=K;r=H;{const L=await He({projectRoot:i.projectRoot,epicId:i.epicId,storyId:e.storyId,graphRevision:i.graphRevision,leaseDurationMs:A,state:{runtime:l,lease:H,physical:B}});l=L.runtime,H=L.lease,B=L.physical,r=H,o=B;const N=lt({projectRoot:i.projectRoot,epicId:i.epicId,storyId:e.storyId,graphRevision:i.graphRevision,leaseDurationMs:A,heartbeatIntervalMs:Y,state:{runtime:l,lease:H,physical:B},onRenewed:_=>{l=_.runtime,H=_.lease,B=_.physical,r=H,o=B}});let O,M;try{O=await ge(e,i.projectRoot,d,i.graphRevision)}catch(_){M=_}let te;try{await N.stop()}catch(_){te=_}if(M)throw M;if(te)throw te;if(!O)throw new Error("direct-yolo-qa-evidence-missing");if(!await we(i.projectRoot,i.executionBranch,d,u))return s("direct-yolo-head-raced");if(e.push){const _=se(e.remote??"origin");if(await p(i.projectRoot,["push",_,i.executionBranch]),!await Oe(i.projectRoot,_,i.executionBranch,d))return s("direct-yolo-remote-head-mismatch")}const re=await Ee({projectRoot:i.projectRoot,storyId:e.storyId,epicId:i.epicId,executionBranch:i.executionBranch,baseSha:a,headSha:d,bundleDigest:v,graphRevision:b,claimRevision:I,idempotencyKey:m,qaExecution:O,physicalLockOwnerDigest:Se(B.owner),nowIso:T(e.nowIso),legacyReceiptRef:void 0,rootMemoryEffect:i.rootMemoryEffect});return await e.beforeCheckpointPersist?.(),await Ae({projectRoot:i.projectRoot,checkpoint:re,remote:e.push?e.remote??"origin":void 0,expectedRevision:l.revision,expectedLease:H,expectedGraphRevision:i.graphRevision,physicalLockPath:B.path,physicalLockOwner:B.owner,transientAuthority:O.transientAuthority,authorizedWriteSet:i.authorizedWriteSet})?(await e.afterCheckpointPersist?.(),{ok:!0,value:re}):s("direct-yolo-checkpoint-persist-failed")}}catch(i){return s(ee(i,"direct-yolo-finalize-failed"))}finally{o&&await G(o.path,o.owner).catch(()=>{}),t&&r?await pe(t.projectRoot,t.epicId,r).catch(()=>{}):t&&await ut(t,e.storyId).catch(()=>{})}}async function At(e){try{const t=await Z(e.projectRoot,e.storyId);if(!/^[a-f0-9]{40,64}$/.test(e.commitSha))return s("direct-yolo-recovery-commit-invalid");const r=await p(t.projectRoot,["rev-parse",e.commitSha]);if(Qe[e.storyId]!==r)return s("direct-yolo-recovery-not-allowlisted");if(await p(t.projectRoot,["rev-parse","HEAD"])!==r)return s("direct-yolo-recovery-head-mismatch");await p(t.projectRoot,["merge-base","--is-ancestor",r,`refs/heads/${t.executionBranch}`]);const o=await p(t.projectRoot,["rev-parse",`${r}^`]),i=await E(t.projectRoot,["diff","--binary","--full-index",`${o}..${r}`]),n=$(await E(t.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",r]));if(!Q(n,t.authorizedWriteSet.length>0?t.authorizedWriteSet:n,e.storyId).ok)return s("direct-yolo-recovery-write-set-invalid");const c=j(i),d=j([...n].sort().join("\0")),a=j(["legacy-direct-yolo-recovery-v1",e.storyId,r].join("\0")),h=T(e.nowIso),u=new Date(Date.parse(h)+1800*1e3).toISOString(),f=await q(t.projectRoot,{required:!0}),v=await V(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:a,idempotencyKey:a,expiresAt:u,persistent:!0,createdAt:h});if(!v.ok)return s(v.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-recovery-integration-backpressure":"direct-yolo-recovery-integration-lock-failed");const b={schemaVersion:1,ownerStoryId:e.storyId,sessionId:a,idempotencyKey:a,acquiredAt:h,expiresAt:u};let I=!1;try{const R=await P(t.projectRoot,D=>{const y=W(D,t.epicId),A=w(y.branch_lease);if(A&&Date.parse(String(A.expiresAt))>Date.parse(h)&&!ce(A,b))throw new Error("direct-yolo-recovery-writer-active");if(y.graph_revision!==t.graphRevision)throw new Error("direct-yolo-recovery-graph-raced");y.branch_mode="epic",y.execution_branch=t.executionBranch,y.origin_branch=t.originBranch,y.branch_lease=b},{expectedRevision:f.revision});I=!0;const k=await ge(e,t.projectRoot,r,t.graphRevision);if(!await we(t.projectRoot,t.executionBranch,r,n))return s("direct-yolo-recovery-head-raced");if(e.push){const D=se(e.remote??"origin"),y=(await p(t.projectRoot,["ls-remote","--heads",D,`refs/heads/${t.executionBranch}`])).split(/\s+/)[0];if(!y||!await C(t.projectRoot,["merge-base","--is-ancestor",r,y]))return s("direct-yolo-recovery-remote-proof-missing")}const S=await Ee({projectRoot:t.projectRoot,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:c,graphRevision:t.graphRevision,claimRevision:d,idempotencyKey:a,qaExecution:k,physicalLockOwnerDigest:Se(v.owner),nowIso:h,legacyReceiptRef:void 0}),x=await Fe(t.projectRoot,{storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:c,graphRevision:t.graphRevision});if(!x)return s("direct-yolo-recovery-evidence-invalid");const m=Object.freeze({...S,receiptRefs:Object.freeze([...S.receiptRefs,x])});return await Ae({projectRoot:t.projectRoot,checkpoint:m,remote:e.push?e.remote??"origin":void 0,remotePolicy:"ancestor-recovery",expectedRevision:R.document.revision,expectedLease:b,expectedGraphRevision:t.graphRevision,physicalLockPath:v.path,physicalLockOwner:v.owner,transientAuthority:k.transientAuthority,authorizedWriteSet:t.authorizedWriteSet})?{ok:!0,value:m}:s("direct-yolo-recovery-persist-failed")}finally{await G(v.path,v.owner).catch(()=>{}),I&&await pe(t.projectRoot,t.epicId,b).catch(()=>{})}}catch(t){return s(ee(t,"direct-yolo-recovery-failed"))}}async function je(e,t){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t))throw new Error("direct-yolo-story-id-invalid");const r=ie(e),o=w(JSON.parse(await oe(he(r,".neocortex/state.json"),"utf8"))),i=await q(r,{required:!0}),n=Te(o,i),l=w(n.stories),c=w(n.epics),d=w(l?.[t]),a=String(d?.epic_id??t.split(".")[0]),h=w(c?.[a]),u=String(h?.execution_branch??""),f=String(h?.origin_branch??""),v=String(h?.graph_revision??""),b=Array.isArray(d?.files_to_modify)?[...new Set(d.files_to_modify.filter(R=>typeof R=="string"&&me(R)))].sort():[];if(!d)throw new Error("direct-yolo-story-state-missing");if(h?.branch_mode!=="epic")throw new Error("direct-yolo-branch-mode-invalid");if(!qe(u)||!await C(r,["check-ref-format","--branch",u]))throw new Error("direct-yolo-execution-branch-invalid");if(!qe(f)||!await C(r,["check-ref-format","--branch",f]))throw new Error("direct-yolo-origin-branch-invalid");if(!/^[a-f0-9]{64}$/.test(v))throw new Error("direct-yolo-graph-revision-invalid");const I=await We({projectRoot:r,storyId:t,graphRevision:v,executionBranch:u,childPaths:b});return{projectRoot:r,storyId:t,story:d,epicId:a,executionBranch:u,originBranch:f,graphRevision:v,authorizedWriteSet:b,rootMemoryEffect:I}}async function Z(e,t){const r=await je(e,t);if(await p(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch)throw new Error("direct-yolo-current-branch-mismatch");return r}async function Ee(e){const t=e.nowIso,r=await E(e.projectRoot,["show","--no-patch","--format=%H%n%P%n%B",e.headSha]),o=$(await E(e.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha])),i=Ke({storyId:e.storyId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,commitBody:r,changedPaths:o}),n=Ve({gitEvidenceDigest:i,headSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest}),l=`story-qa:${n}`,c=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:l}),d=ne(e.projectRoot,e.storyId,e.headSha);if(d?.verdict!=="approved")throw new Error("direct-yolo-review-artifact-not-approved");const a=j(["root-commit-range-review-v2",e.storyId,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,l,j(r),[...o].sort().join(","),d.digest].join("\0")),h=`story-review:${a}`,u=Object.freeze({schemaVersion:1,kind:"story_review_evidence",producer:"root-commit-range-review",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,sourceEvidenceDigest:a,reviewArtifactDigest:d.digest,qaReceiptRef:l,verdict:"approved",reviewedAt:t,receiptRef:h}),f=[`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,l,h,...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(f),qaVerdict:"passed",reviewVerdict:"approved",qaReceipt:c,reviewReceipt:u,recordedAt:t,...e.rootMemoryEffect?{rootMemoryEffect:e.rootMemoryEffect}:{}})}async function Ae(e){const{projectRoot:t,checkpoint:r,remote:o}=e;let i=!1;return await P(t,n=>{const l=W(n,r.epicId);if(e.expectedLease){const h=w(l.branch_lease);if(!ce(h,e.expectedLease))throw new Error("direct-yolo-runtime-revision-conflict");if(Date.parse(String(h?.expiresAt))<=Date.now())throw new Error("direct-yolo-writer-lease-expired");if(l.graph_revision!==e.expectedGraphRevision||r.graphRevision!==e.expectedGraphRevision)throw new Error("direct-yolo-graph-revision-raced")}const c=xe(n,r.storyId),d=w(c.checkpoint);if(d&&d.headSha!==r.headSha){i=!0;return}c.checkpoint=r,c.status="done",c.last_step=ke;const a=Array.isArray(c.steps_completed)?c.steps_completed.filter(h=>typeof h=="string"):[];c.steps_completed=[...new Set([...a,ot,ke])],l.branch_lease=null},{expectedRevision:e.expectedRevision,preCommit:async()=>{if(i)throw new Error("direct-yolo-checkpoint-conflict");if(await p(t,["symbolic-ref","--quiet","--short","HEAD"])!==r.branch||await p(t,["rev-parse","HEAD"])!==r.headSha)throw new Error("direct-yolo-checkpoint-head-raced");if(!await be(t,r,r.storyId,r.epicId,r.branch,e.transientAuthority,e.authorizedWriteSet))throw new Error("direct-yolo-checkpoint-physical-invalid");if(e.physicalLockPath&&e.physicalLockOwner&&!await J(e.physicalLockPath,e.physicalLockOwner))throw new Error("direct-yolo-integration-lock-raced");if(o&&!(e.remotePolicy==="ancestor-recovery"?await Be(t,o,r.branch,r.headSha):await Oe(t,o,r.branch,r.headSha)))throw new Error("direct-yolo-checkpoint-remote-raced")}}),!i}async function Be(e,t,r,o){const i=se(t),n=(await p(e,["ls-remote","--heads",i,`refs/heads/${r}`])).split(/\s+/)[0];return!!(n&&await C(e,["merge-base","--is-ancestor",o,n]))}function ue(e,t,r){return!!(e?.ownerStoryId===t&&e.sessionId===e.idempotencyKey&&typeof e.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(e.idempotencyKey)&&typeof e.expiresAt=="string"&&Date.parse(e.expiresAt)>Date.parse(r))}async function _e(e,t){const r=await Xe(e),o=await Ye(r,"handoffs"),i=`direct-${j(t)}.json`;return{parent:o,name:i,path:he(o,i)}}async function ye(e,t){const r=await _e(e,t.storyId);await rt(r.parent,r.name,`${JSON.stringify(t,null,2)}
2
- `),await De(r.path,r.parent)}async function F(e,t){try{const r=await _e(e,t);await De(r.path,r.parent);const o=JSON.parse(await oe(r.path,"utf8")),i=o.state==="issued"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt"]:o.state==="consuming"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt","consumedBySessionId","consumeStartedAt"]:["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt","consumedBySessionId","consumedAt"];return Object.keys(o).sort().join("\0")!==[...i].sort().join("\0")||o.schemaVersion!==1||o.kind!=="direct-yolo-setup-handoff-token"||o.state!=="issued"&&o.state!=="consuming"&&o.state!=="consumed"||o.storyId!==t||typeof o.fromSessionId!="string"||!/^setup-[a-f0-9]{64}$/.test(o.fromSessionId)||![o.tokenDigest,o.bundleDigest,o.claimRevision,o.grantDigest].every(n=>typeof n=="string"&&/^[a-f0-9]{64}$/.test(n))||typeof o.expiresAt!="string"||!Number.isFinite(Date.parse(o.expiresAt))||(o.state==="issued"||o.state==="consuming")&&(typeof o.token!="string"||!/^[A-Za-z0-9_-]{32,256}$/.test(o.token))||o.state==="consuming"&&(typeof o.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(o.consumedBySessionId)||typeof o.consumeStartedAt!="string"||!Number.isFinite(Date.parse(o.consumeStartedAt)))||o.state==="consumed"&&(typeof o.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(o.consumedBySessionId)||typeof o.consumedAt!="string"||!Number.isFinite(Date.parse(o.consumedAt)))?void 0:o}catch{return}}async function at(e,t,r,o,i){const n=await F(e,t);if(!(!n||n.state==="consumed"||!n.token||n.bundleDigest!==r||n.claimRevision!==o||Date.parse(n.expiresAt)<=Date.parse(i)||j(n.token)!==n.tokenDigest))return{sessionId:n.fromSessionId,token:n.token}}async function ct(e,t,r,o,i,n){const l=await F(e,t);if(!l||l.state==="consumed"||l.fromSessionId!==r||l.token!==o||l.tokenDigest!==j(o))throw new Error("direct-yolo-setup-handoff-consume-invalid");if(l.state==="consuming"){if(l.consumedBySessionId!==i)throw new Error("direct-yolo-setup-handoff-consume-raced");return}await ye(e,{...l,state:"consuming",consumedBySessionId:i,consumeStartedAt:n})}async function st(e,t,r,o,i,n,l,c,d){const a=await F(e,r);if(a?.state==="consumed"&&a.fromSessionId===o&&a.consumedBySessionId===c)return;const h=await q(e,{required:!0}),u=w(h.epics[t]?.branch_lease),f=w(u?.handoffConsumption);if(!a||a.state!=="consuming"||a.fromSessionId!==o||a.token!==i||a.tokenDigest!==j(i)||a.bundleDigest!==n||a.claimRevision!==l||a.consumedBySessionId!==c||u?.ownerStoryId!==r||u.sessionId!==c||f?.kind!=="direct-yolo-setup-handoff-consumption"||f.state!=="consumed"||f.fromSessionId!==o||f.tokenDigest!==a.tokenDigest||f.bundleDigest!==n||f.claimRevision!==l||f.consumedBySessionId!==c)throw new Error("direct-yolo-setup-handoff-consume-invalid");try{await ye(e,{schemaVersion:1,kind:a.kind,state:"consumed",storyId:r,fromSessionId:o,tokenDigest:a.tokenDigest,bundleDigest:a.bundleDigest,claimRevision:a.claimRevision,grantDigest:a.grantDigest,expiresAt:a.expiresAt,consumedBySessionId:c,consumedAt:d})}catch{throw new Error("direct-yolo-setup-handoff-consume-persist-failed")}}function dt(e){const t=w(e.current?.handoffGrant),r=e.handoff?.token,o=typeof r=="string"&&/^[A-Za-z0-9_-]{32,256}$/.test(r)?j(r):void 0;return!!(t&&o&&e.handoff&&e.handoff.sessionId===e.current?.sessionId&&t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff"&&t.storyId===e.storyId&&t.fromSessionId===e.current?.sessionId&&t.bundleDigest===e.bundleDigest&&t.claimRevision===e.claimRevision&&typeof t.expiresAt=="string"&&Date.parse(t.expiresAt)>Date.parse(e.nowIso)&&typeof t.tokenDigest=="string"&&/^[a-f0-9]{64}$/.test(t.tokenDigest)&&ht(t.tokenDigest,o))}function ht(e,t){const r=Buffer.from(e,"hex"),o=Buffer.from(t,"hex");return r.length===32&&o.length===32&&Ne(r,o)}function ce(e,t){return!!(e&&["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt"].every(r=>e[r]===t[r]))}function Le(e){const t=e??it;if(!Number.isSafeInteger(t)||t<100||t>14400*1e3)throw new Error("direct-yolo-writer-lease-duration-invalid");return t}function ft(e,t){const r=e??nt;if(!Number.isSafeInteger(r)||r<10||r*2>=t)throw new Error("direct-yolo-writer-heartbeat-interval-invalid");return r}async function He(e){const t=Date.parse(String(e.state.lease.expiresAt)),r=new Date(Math.max(Date.now()+e.leaseDurationMs,t+1)).toISOString(),o=await tt(e.state.physical.path,e.state.physical.owner,r);if(!o)throw new Error("direct-yolo-integration-lock-raced");const i={...e.state.lease,expiresAt:r};try{return{runtime:(await P(e.projectRoot,l=>{const c=W(l,e.epicId),d=w(c.branch_lease);if(!ce(d,e.state.lease))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(c.graph_revision!==e.graphRevision)throw new Error("direct-yolo-graph-revision-raced");c.branch_lease=i},{expectedRevision:e.state.runtime.revision,preCommit:async()=>{if(!await J(e.state.physical.path,o))throw new Error("direct-yolo-integration-lock-raced")}})).document,lease:i,physical:{path:e.state.physical.path,owner:o}}}catch(n){throw await G(e.state.physical.path,o).catch(()=>{}),n instanceof Error&&n.message==="git-lifecycle-runtime-revision-conflict"?new Error("direct-yolo-runtime-revision-conflict"):n instanceof Error&&/^direct-yolo-/.test(n.message)?n:new Error("direct-yolo-writer-heartbeat-failed")}}function lt(e){let t=e.state,r=!1,o,i,n=Promise.resolve();const l=()=>{r||o||(i=setTimeout(()=>{n=He({projectRoot:e.projectRoot,epicId:e.epicId,storyId:e.storyId,graphRevision:e.graphRevision,leaseDurationMs:e.leaseDurationMs,state:t}).then(c=>{t=c,e.onRenewed(c)}).catch(c=>{o=c}).finally(l)},e.heartbeatIntervalMs),i.unref())};return l(),{stop:async()=>{if(r=!0,i&&clearTimeout(i),await n,o)throw o}}}async function pe(e,t,r){await P(e,o=>{const i=W(o,t),n=w(i.branch_lease);ce(n,r)&&(i.branch_lease=null)})}async function ut(e,t){const r=await q(e.projectRoot,{required:!0}),o=w(r.epics[e.epicId]?.branch_lease);if(!o||o.ownerStoryId!==t||!Ce(o.sessionId)||!Ce(o.idempotencyKey)||!Number.isFinite(Date.parse(String(o.acquiredAt)))||!Number.isFinite(Date.parse(String(o.expiresAt))))return;const i=await V(e.projectRoot,{kind:"direct",storyId:t,sessionId:String(o.sessionId),idempotencyKey:String(o.idempotencyKey),createdAt:String(o.acquiredAt),expiresAt:String(o.expiresAt),persistent:!0});if(!i.ok)return;await G(i.path,i.owner)&&await pe(e.projectRoot,e.epicId,o)}async function ge(e,t,r,o){const i=await Je(t,{headSha:r,graphRevision:o,nowIso:e.nowIso});await e.qaRunner?.({projectRoot:t,storyId:e.storyId,headSha:r});const n=Ze(i);if(!n)throw new Error("p205-transient-authority-invalid");return{contract:"P205-CI-02",command:Ue,manifestDigest:n.manifestDigest,gateIds:n.gateIds,resultDigest:n.resultDigest,transientAuthority:i}}async function we(e,t,r,o){return await p(e,["rev-parse","HEAD"])!==r||await p(e,["symbolic-ref","--quiet","--short","HEAD"])!==t||!await C(e,["diff","--cached","--quiet"])?!1:C(e,["diff","--quiet","HEAD","--",...o])}async function Oe(e,t,r,o){const i=se(t);return(await p(e,["ls-remote","--heads",i,`refs/heads/${r}`])).split(/\s+/)[0]===o}function Q(e,t,r,o){if(e.length===0||e.some(n=>!me(n)))return{ok:!1,reasonCode:"direct-yolo-write-set-invalid"};const i=[".neocortex/state.json",`docs/stories/${r}.story.md`,`.neocortex/stories/${r}/qa-gate-result.json`,`.neocortex/stories/${r}/validation-evidence.md`,`.neocortex/stories/${r}/review.md`];return!i.every(n=>e.includes(n))||!i.every(n=>t.includes(n))?{ok:!1,reasonCode:"direct-yolo-write-set-invalid"}:o&&(o.storyId!==r||o.childClaimRevision!==j([...t].sort().join("\0")))?{ok:!1,reasonCode:"direct-yolo-root-memory-claim-mismatch"}:e.some(n=>!t.includes(n)&&!o?.files.some(l=>l.path===n))?{ok:!1,reasonCode:"direct-yolo-write-set-unauthorized"}:{ok:!0}}function me(e){return e.length>0&&e.length<=1024&&!e.startsWith("/")&&!e.includes("\\")&&!e.split("/").includes("..")&&!e.startsWith(".git/")&&!e.includes("\0")}function Ce(e){return typeof e=="string"&&e.length>0&&e.length<=512&&/^[A-Za-z0-9._:@/+\-=]+$/.test(e)}function qe(e){return e.length>0&&e.length<=240&&!e.startsWith("-")&&!/[\s~^:?*[\\]/.test(e)&&!e.includes("..")}function se(e){if(!/^[A-Za-z0-9._-]{1,128}$/.test(e))throw new Error("direct-yolo-remote-invalid");return e}function U(e,t){const r=`${t}: `,o=e.split(`
3
- `).map(i=>i.trim()).filter(i=>i.startsWith(r)).map(i=>i.slice(r.length));return o.length===1?o[0]:void 0}function j(e){return ze("sha256").update(e).digest("hex")}function $(e){return e.split("\0").filter(Boolean)}function T(e){return e&&Number.isFinite(Date.parse(e))?new Date(Date.parse(e)).toISOString():new Date().toISOString()}function w(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Ie(e,t,r){const o=w(e);if(!(!o||o.schemaVersion!==1||o.originBranch!==r||o.executionBranch!==t||o.capturedFromCurrentCheckout!==!0||typeof o.originHeadSha!="string"||!/^[a-f0-9]{40,64}$/.test(o.originHeadSha)||typeof o.capturedAt!="string"||!Number.isFinite(Date.parse(o.capturedAt))))return o}function ve(e,t,r,o){return Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-receipt",storyId:e.storyId,epicId:e.epicId,executionBranch:e.executionBranch,originBranch:e.originBranch,originHeadSha:t.originHeadSha,leaseExpiresAt:r,reused:o,publicSafe:!0})}async function X(e){const t=$(await E(e,["ls-files","--others","--exclude-standard","-z"])).sort(),r=await Promise.all(t.map(async o=>{if(!me(o))throw new Error("direct-yolo-checkout-payload-invalid");return`${o}\0${await p(e,["hash-object","--no-filters","--",o])}`}));return j([await E(e,["diff","--cached","--binary","--full-index"]),await E(e,["diff","--binary","--full-index"]),await E(e,["status","--porcelain=v1","-z","--untracked-files=all"]),...r].join("\0"))}async function Bt(e){const t=ie(e),r=await p(t,["rev-parse","HEAD"]),o=await p(t,["symbolic-ref","--quiet","--short","HEAD"]),i=await X(t);if(await p(t,["rev-parse","HEAD"])!==r||await p(t,["symbolic-ref","--quiet","--short","HEAD"])!==o)throw new Error("direct-yolo-checkout-observation-raced");return Object.freeze({headSha:r,branch:o,payloadDigest:i})}async function Pe(e){const t=[];let r;for(const o of(await E(e,["worktree","list","--porcelain"])).split(`
4
- `))o.startsWith("worktree ")?(r={path:o.slice(9)},t.push(r)):r&&o.startsWith("branch refs/heads/")&&(r.branch=o.slice(18));return t}function ee(e,t){return e instanceof Error&&e.message==="git-lifecycle-runtime-revision-conflict"?"direct-yolo-runtime-revision-conflict":e instanceof Error&&/^direct-yolo-[a-z0-9-]+$/.test(e.message)?e.message:t}function s(e){return{ok:!1,reasonCode:e}}async function p(e,t){return String((await le("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout).trim()}async function E(e,t){return String((await le("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout)}async function C(e,t){try{return await le("git",[...t],{cwd:e,maxBuffer:8*1024*1024}),!0}catch{return!1}}export{bt as acceptDirectYoloSetupCheckpoint,jt as beginDirectYoloStoryCommit,Bt as captureDirectYoloCheckoutEvidence,Et as finalizeDirectYoloStoryCheckpoint,kt as issueDirectYoloSetupLeaseHandoff,Dt as prepareDirectYoloSetup,At as recoverLegacyDirectYoloStoryCheckpoint};
1
+ import{execFile as _e}from"node:child_process";import{createHash as Le,randomBytes as le,timingSafeEqual as He}from"node:crypto";import{readFile as J}from"node:fs/promises";import{join as te,resolve as Z}from"node:path";import{promisify as Ce}from"node:util";import{readRootMemoryEffectForCheckpoint as qe}from"../private-execution/root-memory-scope.js";import{rootMemoryEffectDigest as Oe,verifyRootMemoryPhysicalWriteSet as re}from"../private-execution/root-memory-git-evidence.js";import{acquireGitLifecyclePhysicalIntegrationLock as W,applyGitLifecycleRuntimeOverlay as $e,computeImmutableStoryQaEvidenceDigest as ze,computeGitLifecyclePhysicalIntegrationLockOwnerDigest as ge,computeP205StoryQaEvidenceDigest as Pe,computeLegacyDirectYoloRecoveryReceiptRef as Ne,ensureRuntimeEpic as P,ensureRuntimeStory as me,ensureGitLifecyclePrivateChildDirectory as We,executeP205TransientAuthority as Ge,projectP205TransientExecutionEvidence as Me,publicStoryReviewArtifactFromGit as Q,LEGACY_DIRECT_YOLO_RECOVERY_COMMITS as Ke,mutateGitLifecycleRuntime as $,P205_COMPLETE_COMMAND as Ve,readGitLifecycleRuntime as C,gitLifecycleRuntimeDirectory as Fe,assertGitLifecyclePrivateFile as we,releaseGitLifecyclePhysicalIntegrationLock as G,releaseGitLifecyclePhysicalIntegrationLockForCheckpoint as Te,verifyGitLifecyclePhysicalIntegrationLock as U,verifyAcceptedGitLifecycleStoryCheckpoint as Ie}from"./git-lifecycle-store.js";import{anchoredAtomicWriteFile as Ye}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as Je,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as Re,GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID as X}from"./git-lifecycle-step-ids.js";const oe=Ce(_e);async function yt(e){try{const t=await ve(e.projectRoot,e.storyId),r=N(e.nowIso),o=Date.parse(r),i=await l(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),n=await l(t.projectRoot,["rev-parse","HEAD"]),y=await C(t.projectRoot,{required:!0}),h=m(y.epics[t.epicId]),d=m(h?.branch_lease),a=d&&Number.isFinite(Date.parse(String(d.expiresAt)))&&Date.parse(String(d.expiresAt))>o;if(a&&d?.ownerStoryId!==e.storyId)return c("direct-yolo-writer-active");let s=he(h?.origin_binding,t.executionBranch,t.originBranch);if(i===t.executionBranch){if(!s)return c("direct-yolo-origin-binding-invalid")}else{if(i!==t.originBranch)return c("direct-yolo-current-branch-mismatch");if(s&&s.originHeadSha!==n)return c("direct-yolo-origin-binding-conflict");if(s??={schemaVersion:1,originBranch:t.originBranch,originHeadSha:n,executionBranch:t.executionBranch,capturedFromCurrentCheckout:!0,capturedAt:r},(await Ee(t.projectRoot)).some(u=>u.branch===t.executionBranch&&Z(u.path)!==t.projectRoot))return c("direct-yolo-execution-branch-checked-out-elsewhere");const w=await T(t.projectRoot),j=`refs/heads/${t.executionBranch}`;if(await L(t.projectRoot,["show-ref","--verify","--quiet",j])){const u=await l(t.projectRoot,["rev-parse",j]);if(u!==n){if(!await L(t.projectRoot,["merge-base","--is-ancestor",u,n]))return c("direct-yolo-execution-branch-diverged");await l(t.projectRoot,["update-ref",j,n,u])}await l(t.projectRoot,["switch",t.executionBranch])}else await l(t.projectRoot,["switch","-c",t.executionBranch]);if(await T(t.projectRoot)!==w)return c("direct-yolo-checkout-payload-raced")}const p=await l(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),f=await l(t.projectRoot,["rev-parse","HEAD"]);if(p!==t.executionBranch)return c("direct-yolo-current-branch-mismatch");if(a&&d?.ownerStoryId===e.storyId)return d.setupHeadSha!==f?c("direct-yolo-setup-lease-head-unbound"):{ok:!0,value:ue(t,s,String(d.expiresAt),!0)};const R=r,k=new Date(o+3600*1e3).toISOString(),I=`setup-${le(32).toString("hex")}`,v=await C(t.projectRoot,{required:!0});return await $(t.projectRoot,x=>{const w=P(x,t.epicId),j=m(w.branch_lease);if(j&&Date.parse(String(j.expiresAt))>o&&j.ownerStoryId!==e.storyId)throw new Error("direct-yolo-writer-active");const u=he(w.origin_binding,t.executionBranch,t.originBranch);if(w.origin_binding&&!u)throw new Error("direct-yolo-origin-binding-conflict");if(u&&JSON.stringify(u)!==JSON.stringify(s))throw new Error("direct-yolo-origin-binding-conflict");w.branch_mode="epic",w.execution_branch=t.executionBranch,w.origin_branch=t.originBranch,w.graph_revision=t.graphRevision,w.origin_binding=s,w.branch_lease={schemaVersion:1,ownerStoryId:e.storyId,sessionId:I,idempotencyKey:I,acquiredAt:R,expiresAt:k,setupHeadSha:f}},{expectedRevision:v.revision,preCommit:async()=>{if(await l(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==t.executionBranch||await l(t.projectRoot,["rev-parse","HEAD"])!==f)throw new Error("direct-yolo-setup-physical-state-raced")}}),{ok:!0,value:ue(t,s,k,!1)}}catch(t){return c(Y(t,"direct-yolo-setup-failed"))}}async function pt(e){let t;try{const r=await K(e.projectRoot,e.storyId),o=N(e.nowIso),i=te(r.projectRoot,".neocortex/state.json"),n=await J(i,"utf8"),y=await T(r.projectRoot),h=await l(r.projectRoot,["rev-parse","HEAD"]),d=`refs/heads/${r.executionBranch}`,a=await C(r.projectRoot,{required:!0}),s=m(a.epics[r.epicId]),p=he(s?.origin_binding,r.executionBranch,r.originBranch),f=m(s?.branch_lease);if(!p)return c("direct-yolo-origin-binding-invalid");if(!f||!ie(f,e.storyId,o)||f?.sessionId!==f?.idempotencyKey)return c("direct-yolo-setup-lease-invalid");const R=await W(r.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:String(f.sessionId),idempotencyKey:String(f.idempotencyKey),expiresAt:new Date(Date.now()+300*1e3).toISOString(),persistent:!1});if(!R.ok)return c(R.reasonCode);if(t=R,h!==f.setupHeadSha||!await L(r.projectRoot,["merge-base","--is-ancestor",p.originHeadSha,h])||await l(r.projectRoot,["rev-parse",d])!==h)return c("direct-yolo-setup-head-mismatch");if((await Ee(r.projectRoot)).some(u=>u.branch===r.executionBranch&&Z(u.path)!==r.projectRoot))return c("direct-yolo-execution-branch-checked-out-elsewhere");const I=m(JSON.parse(n)),v=m(m(I?.stories)?.[e.storyId]),x=m(a.stories[e.storyId]);if(!v||!["backlog","ready_to_start"].includes(String(v.status))||v.steps_completed!==void 0&&(!Array.isArray(v.steps_completed)||v.steps_completed.length>0)||v.branch_name||v.checkpoint)return c("direct-yolo-setup-story-progress-conflict");const w=x?.status==="branch-ready"&&x.last_step===X&&Array.isArray(x.steps_completed)&&x.steps_completed.length===1&&x.steps_completed[0]===X&&Object.keys(x).sort().join(",")==="last_step,status,steps_completed";if(x&&Object.keys(x).length>0&&!w)return c("direct-yolo-setup-story-progress-conflict");const j=async()=>{if(Date.parse(String(f.expiresAt))<=(e.nowIso?Date.parse(o):Date.now())||!t||!await U(t.path,t.owner)||await J(i,"utf8")!==n||await T(r.projectRoot)!==y||await l(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch||await l(r.projectRoot,["rev-parse","HEAD"])!==h||!await L(r.projectRoot,["merge-base","--is-ancestor",p.originHeadSha,h])||await l(r.projectRoot,["rev-parse",d])!==h)throw new Error("direct-yolo-setup-physical-state-raced")};return w?await j():await $(r.projectRoot,u=>{const b=m(u.epics[r.epicId]),g=me(u,e.storyId);if(JSON.stringify(b?.branch_lease)!==JSON.stringify(f)||JSON.stringify(b?.origin_binding)!==JSON.stringify(p)||b?.graph_revision!==r.graphRevision||Object.keys(g).length>0)throw new Error("direct-yolo-setup-runtime-raced");g.status="branch-ready",g.last_step=X,g.steps_completed=[X]},{expectedRevision:a.revision,preCommit:j}),{ok:!0,value:Object.freeze({...ue(r,p,String(f.expiresAt),w),checkpointAccepted:!0,graphRevision:r.graphRevision,headSha:h})}}catch(r){return c(Y(r,"direct-yolo-setup-acceptance-failed"))}finally{t&&await G(t.path,t.owner).catch(()=>{})}}async function lt(e){try{const t=await K(e.projectRoot,e.storyId),r=q(await A(t.projectRoot,["diff","--cached","--name-only","-z"])),o=V(r,t.authorizedWriteSet,e.storyId,t.rootMemoryEffect);if(!o.ok)return c(o.reasonCode);if(t.rootMemoryEffect&&re(t.projectRoot,t.rootMemoryEffect,{storyId:e.storyId,executionBranch:t.executionBranch,baseSha:await l(t.projectRoot,["rev-parse","HEAD"]),headRef:":",childPaths:t.authorizedWriteSet}),Q(t.projectRoot,e.storyId,":")?.verdict!=="approved")return c("direct-yolo-review-artifact-not-approved");if(q(await A(t.projectRoot,["diff","--name-only","-z"])).some(S=>r.includes(S)))return c("direct-yolo-user-overlap");const y=await A(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!y)return c("direct-yolo-staged-diff-empty");const h=D(y),d=D([...t.authorizedWriteSet].sort().join("\0")),a=N(e.nowIso),s=await C(t.projectRoot,{required:!0}),p=m(s.epics[t.epicId]?.branch_lease);if(!ie(p,e.storyId,a))return c("direct-yolo-setup-handoff-owner-invalid");const f=String(p.sessionId),R=String(p.expiresAt),k=new Date(Math.min(Date.parse(R),Date.parse(a)+300*1e3)).toISOString(),I=await M(t.projectRoot,e.storyId),v=I?.state==="issued"&&I.fromSessionId===f&&I.bundleDigest===h&&I.claimRevision===d&&Date.parse(I.expiresAt)>Date.parse(a),x=v?I.expiresAt:k,w=v?I.token:le(32).toString("base64url"),j=D(w),u=Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff",storyId:e.storyId,fromSessionId:f,tokenDigest:j,bundleDigest:h,claimRevision:d,expiresAt:x}),b=D(JSON.stringify(u)),g=await W(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:f,idempotencyKey:f,expiresAt:x,persistent:!1,createdAt:a});if(!g.ok)return c(g.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{await ne(t.projectRoot,{schemaVersion:1,kind:"direct-yolo-setup-handoff-token",state:"issued",storyId:e.storyId,fromSessionId:f,token:w,tokenDigest:j,bundleDigest:h,claimRevision:d,grantDigest:b,expiresAt:x}),await $(t.projectRoot,S=>{const E=m(P(S,t.epicId).branch_lease);if(!ie(E,e.storyId,a)||E?.sessionId!==f||E.idempotencyKey!==f)throw new Error("direct-yolo-setup-handoff-owner-raced");E.handoffGrant=u},{expectedRevision:s.revision,preCommit:async()=>{if(!await U(g.path,g.owner))throw new Error("direct-yolo-integration-lock-raced");const S=await M(t.projectRoot,e.storyId);if(!S||S.state!=="issued"||S.grantDigest!==b||S.tokenDigest!==j)throw new Error("direct-yolo-setup-handoff-token-raced")}})}finally{await G(g.path,g.owner).catch(()=>{})}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff-receipt",storyId:e.storyId,sessionId:f,bundleDigest:h,claimRevision:d,grantDigest:b,expiresAt:x,reused:v,publicSafe:!0})}}catch(t){return c(t instanceof Error&&/^direct-yolo-/.test(t.message)?t.message:"direct-yolo-setup-handoff-failed")}}async function gt(e){try{const t=await K(e.projectRoot,e.storyId),r=await l(t.projectRoot,["rev-parse","HEAD"]),o=q(await A(t.projectRoot,["diff","--cached","--name-only","-z"])),i=V(o,t.authorizedWriteSet,e.storyId,t.rootMemoryEffect);if(!i.ok)return c(i.reasonCode);t.rootMemoryEffect&&re(t.projectRoot,t.rootMemoryEffect,{storyId:e.storyId,executionBranch:t.executionBranch,baseSha:r,headRef:":",childPaths:t.authorizedWriteSet});const n=Q(t.projectRoot,e.storyId,":");if(n?.verdict!=="approved")return c("direct-yolo-review-artifact-not-approved");if(q(await A(t.projectRoot,["diff","--name-only","-z"])).some(u=>o.includes(u)))return c("direct-yolo-user-overlap");const h=await A(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!h)return c("direct-yolo-staged-diff-empty");const d=D(h),a=D([...t.authorizedWriteSet].sort().join("\0")),s=D(["direct-yolo-commit-v1",e.storyId,t.epicId,t.executionBranch,r,d,t.graphRevision,a].join("\0")),p=N(e.nowIso);let f=e.setupLeaseHandoff??await Ze(t.projectRoot,e.storyId,d,a,p);const R=await C(t.projectRoot,{required:!0}),k=m(R.epics[t.epicId]?.branch_lease),I=k?.ownerStoryId===e.storyId&&k.sessionId===s&&k.idempotencyKey===s&&typeof k.expiresAt=="string"&&Date.parse(k.expiresAt)>Date.parse(p)?k:void 0;if(I&&e.setupLeaseHandoff)return c("direct-yolo-setup-handoff-replayed");const v=m(I?.handoffConsumption);if(v){const u=await M(t.projectRoot,e.storyId);if(!u||!["consuming","consumed"].includes(u.state)||u.fromSessionId!==v.fromSessionId||u.tokenDigest!==v.tokenDigest||u.bundleDigest!==d||u.claimRevision!==a||v.bundleDigest!==d||v.claimRevision!==a||u.consumedBySessionId!==s||v.consumedBySessionId!==s)return c("direct-yolo-setup-handoff-consume-invalid");if(u.state==="consuming"){if(!u.token||D(u.token)!==u.tokenDigest)return c("direct-yolo-setup-handoff-consume-invalid");f={sessionId:u.fromSessionId,token:u.token}}}const x=I?String(I.expiresAt):new Date(Date.parse(p)+1800*1e3).toISOString(),w=await W(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:s,idempotencyKey:s,expiresAt:x,persistent:!0,createdAt:I&&typeof I.acquiredAt=="string"?I.acquiredAt:p});if(!w.ok)return c(w.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{f&&e.setupLeaseHandoff===void 0&&(await Qe(t.projectRoot,e.storyId,f.sessionId,f.token,s,p),await e.setupHandoffFault?.("after-consuming-persisted")),await $(t.projectRoot,u=>{const b=P(u,t.epicId),g=m(b.branch_lease),S=g&&Date.parse(String(g.expiresAt))>Date.parse(p),E=g?.ownerStoryId===e.storyId&&g.sessionId===s&&g.idempotencyKey===s,O=g?.ownerStoryId===e.storyId&&g.sessionId===g.idempotencyKey&&typeof g.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(g.idempotencyKey),B=S&&O&&Xe({current:g,handoff:f,storyId:e.storyId,bundleDigest:d,claimRevision:a,nowIso:p});if(f&&S&&!E&&!B)throw new Error("direct-yolo-setup-handoff-invalid");if(S&&!E&&!B)throw new Error("direct-yolo-writer-active");const _=B?m(g?.handoffGrant):void 0,H=_?{schemaVersion:1,kind:"direct-yolo-setup-handoff-consumption",state:"consumed",storyId:e.storyId,fromSessionId:String(g?.sessionId),tokenDigest:String(_.tokenDigest),bundleDigest:d,claimRevision:a,consumedBySessionId:s,consumedAt:p}:void 0;b.branch_mode="epic",b.execution_branch=t.executionBranch,b.origin_branch=t.originBranch,b.graph_revision=t.graphRevision,b.branch_lease=S&&E?g:{schemaVersion:1,ownerStoryId:e.storyId,sessionId:s,idempotencyKey:s,acquiredAt:p,expiresAt:x,...H?{handoffConsumption:H}:{}}},{expectedRevision:R.revision,preCommit:async()=>{if(!await U(w.path,w.owner))throw new Error("direct-yolo-integration-lock-raced")}})}catch(u){throw await G(w.path,w.owner).catch(()=>{}),u}f&&e.setupLeaseHandoff===void 0&&(await e.setupHandoffFault?.("before-consumed-persist"),await Ue(t.projectRoot,t.epicId,e.storyId,f.sessionId,f.token,d,a,s,p));const j=Object.freeze([`Neocortex-Story: ${e.storyId}`,`Neocortex-Epic: ${t.epicId}`,`Neocortex-Execution-Branch: ${t.executionBranch}`,`Neocortex-Prepared-Base: ${r}`,`Neocortex-Bundle-Digest: ${d}`,`Neocortex-Review-Artifact-Digest: ${n.digest}`,`Neocortex-Graph-Revision: ${t.graphRevision}`,`Neocortex-Claim-Revision: ${a}`,...t.rootMemoryEffect?[`Neocortex-Root-Memory-Effect: ${Oe(t.rootMemoryEffect)}`]:[]]);return{ok:!0,value:Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:r,bundleDigest:d,reviewArtifactDigest:n.digest,graphRevision:t.graphRevision,claimRevision:a,idempotencyKey:s,changedPaths:Object.freeze(o),trailers:j})}}catch(t){return c(Y(t,"direct-yolo-begin-failed"))}}async function mt(e){let t,r,o;try{const i=await K(e.projectRoot,e.storyId);t=i;const n=await l(i.projectRoot,["rev-parse","HEAD"]);let y=await C(i.projectRoot,{required:!0});const h=m(y.stories[e.storyId]?.checkpoint);if(h){const B=typeof h.headSha=="string"?h.headSha:"",_=typeof h.graphRevision=="string"?h.graphRevision:"",H=/^[a-f0-9]{40,64}$/.test(B)?q(await A(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",B])):[],z=V(H,i.authorizedWriteSet,e.storyId,i.rootMemoryEffect);if(!(/^[a-f0-9]{40,64}$/.test(B)&&await L(i.projectRoot,["merge-base","--is-ancestor",B,n]))||!/^[a-f0-9]{64}$/.test(_)||!z.ok)return c("direct-yolo-replay-invalid");const Be=await se(e,i.projectRoot,n,_);if(!await Ie(i.projectRoot,h,e.storyId,i.epicId,i.executionBranch,Be.transientAuthority,i.authorizedWriteSet))return c("direct-yolo-replay-invalid");if(!await de(i.projectRoot,i.executionBranch,n,H))return c("direct-yolo-replay-head-raced");if(e.push&&!await ke(i.projectRoot,e.remote??"origin",i.executionBranch,B))return c("direct-yolo-remote-head-mismatch");const ye=Array.isArray(h.receiptRefs)?h.receiptRefs.find(pe=>typeof pe=="string"&&/^physical-lock-owner:[a-f0-9]{64}$/.test(pe)):void 0;return ye&&typeof h.idempotencyKey=="string"&&await Te(i.projectRoot,{storyId:e.storyId,idempotencyKey:h.idempotencyKey,ownerDigest:ye.slice(20)}),{ok:!0,value:h}}const d=n,a=await l(i.projectRoot,["rev-parse",`${d}^`]),s=await A(i.projectRoot,["show","--no-patch","--format=%B",d]),p=q(await A(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",d])),f=V(p,i.authorizedWriteSet,e.storyId,i.rootMemoryEffect);if(!f.ok)return c(f.reasonCode);i.rootMemoryEffect&&re(i.projectRoot,i.rootMemoryEffect,{storyId:e.storyId,executionBranch:i.executionBranch,baseSha:a,headRef:d,childPaths:i.authorizedWriteSet});const R=F(s,"Neocortex-Bundle-Digest"),k=F(s,"Neocortex-Graph-Revision"),I=F(s,"Neocortex-Claim-Revision"),v=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(!R||!/^[a-f0-9]{64}$/.test(R)||!k||!I||[...v].some(([B,_])=>F(s,B)!==_))return c("direct-yolo-trailers-invalid");const x=Q(i.projectRoot,e.storyId,d);if(x?.verdict!=="approved")return c("direct-yolo-review-artifact-not-approved");const w=F(s,"Neocortex-Review-Artifact-Digest");if(w!==void 0&&w!==x.digest)return c("direct-yolo-review-artifact-digest-mismatch");const j=D(await A(i.projectRoot,["diff","--binary","--full-index",`${a}..${d}`]));if(R!==j)return c("direct-yolo-bundle-digest-mismatch");const u=D(["direct-yolo-commit-v1",e.storyId,i.epicId,i.executionBranch,a,R,k,I].join("\0")),b=m(y.epics[i.epicId]?.branch_lease),g=N(e.nowIso),S=b?.ownerStoryId===e.storyId&&b.idempotencyKey===u&&b.sessionId===u&&Date.parse(String(b.expiresAt))>Date.now()?b:void 0;if(b&&Date.parse(String(b.expiresAt))>Date.now()&&!S)return c("direct-yolo-writer-active");const E=S??{schemaVersion:1,ownerStoryId:e.storyId,sessionId:u,idempotencyKey:u,acquiredAt:g,expiresAt:new Date(Date.parse(g)+1800*1e3).toISOString()},O=await W(i.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:u,idempotencyKey:u,expiresAt:String(E.expiresAt),persistent:!0,createdAt:String(E.acquiredAt)});if(!O.ok)return c(O.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");o=O,S||(y=(await $(i.projectRoot,_=>{const H=P(_,i.epicId),z=m(H.branch_lease);if(z&&Date.parse(String(z.expiresAt))>Date.parse(g))throw new Error("direct-yolo-writer-active");if(H.graph_revision!==i.graphRevision)throw new Error("direct-yolo-graph-revision-raced");H.branch_lease=E},{expectedRevision:y.revision})).document),r=E;{const B=await se(e,i.projectRoot,d,i.graphRevision);if(!await de(i.projectRoot,i.executionBranch,d,p))return c("direct-yolo-head-raced");if(e.push){const z=ee(e.remote??"origin");if(await l(i.projectRoot,["push",z,i.executionBranch]),!await De(i.projectRoot,z,i.executionBranch,d))return c("direct-yolo-remote-head-mismatch")}const _=await Se({projectRoot:i.projectRoot,storyId:e.storyId,epicId:i.epicId,executionBranch:i.executionBranch,baseSha:a,headSha:d,bundleDigest:R,graphRevision:k,claimRevision:I,idempotencyKey:u,qaExecution:B,physicalLockOwnerDigest:ge(O.owner),nowIso:N(e.nowIso),legacyReceiptRef:void 0,rootMemoryEffect:i.rootMemoryEffect});return await e.beforeCheckpointPersist?.(),await xe({projectRoot:i.projectRoot,checkpoint:_,remote:e.push?e.remote??"origin":void 0,expectedRevision:y.revision,expectedLease:E,expectedGraphRevision:i.graphRevision,physicalLockPath:O.path,physicalLockOwner:O.owner,transientAuthority:B.transientAuthority,authorizedWriteSet:i.authorizedWriteSet})?(await e.afterCheckpointPersist?.(),{ok:!0,value:_}):c("direct-yolo-checkpoint-persist-failed")}}catch(i){return c(Y(i,"direct-yolo-finalize-failed"))}finally{o&&await G(o.path,o.owner).catch(()=>{}),t&&r?await ce(t.projectRoot,t.epicId,r).catch(()=>{}):t&&await tt(t,e.storyId).catch(()=>{})}}async function wt(e){try{const t=await K(e.projectRoot,e.storyId);if(!/^[a-f0-9]{40,64}$/.test(e.commitSha))return c("direct-yolo-recovery-commit-invalid");const r=await l(t.projectRoot,["rev-parse",e.commitSha]);if(Ke[e.storyId]!==r)return c("direct-yolo-recovery-not-allowlisted");if(await l(t.projectRoot,["rev-parse","HEAD"])!==r)return c("direct-yolo-recovery-head-mismatch");await l(t.projectRoot,["merge-base","--is-ancestor",r,`refs/heads/${t.executionBranch}`]);const o=await l(t.projectRoot,["rev-parse",`${r}^`]),i=await A(t.projectRoot,["diff","--binary","--full-index",`${o}..${r}`]),n=q(await A(t.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",r]));if(!V(n,t.authorizedWriteSet.length>0?t.authorizedWriteSet:n,e.storyId).ok)return c("direct-yolo-recovery-write-set-invalid");const h=D(i),d=D([...n].sort().join("\0")),a=D(["legacy-direct-yolo-recovery-v1",e.storyId,r].join("\0")),s=N(e.nowIso),p=new Date(Date.parse(s)+1800*1e3).toISOString(),f=await C(t.projectRoot,{required:!0}),R=await W(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:a,idempotencyKey:a,expiresAt:p,persistent:!0,createdAt:s});if(!R.ok)return c(R.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-recovery-integration-backpressure":"direct-yolo-recovery-integration-lock-failed");const k={schemaVersion:1,ownerStoryId:e.storyId,sessionId:a,idempotencyKey:a,acquiredAt:s,expiresAt:p};let I=!1;try{const v=await $(t.projectRoot,g=>{const S=P(g,t.epicId),E=m(S.branch_lease);if(E&&Date.parse(String(E.expiresAt))>Date.parse(s)&&!ae(E,k))throw new Error("direct-yolo-recovery-writer-active");if(S.graph_revision!==t.graphRevision)throw new Error("direct-yolo-recovery-graph-raced");S.branch_mode="epic",S.execution_branch=t.executionBranch,S.origin_branch=t.originBranch,S.branch_lease=k},{expectedRevision:f.revision});I=!0;const x=await se(e,t.projectRoot,r,t.graphRevision);if(!await de(t.projectRoot,t.executionBranch,r,n))return c("direct-yolo-recovery-head-raced");if(e.push){const g=ee(e.remote??"origin"),S=(await l(t.projectRoot,["ls-remote","--heads",g,`refs/heads/${t.executionBranch}`])).split(/\s+/)[0];if(!S||!await L(t.projectRoot,["merge-base","--is-ancestor",r,S]))return c("direct-yolo-recovery-remote-proof-missing")}const w=await Se({projectRoot:t.projectRoot,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:h,graphRevision:t.graphRevision,claimRevision:d,idempotencyKey:a,qaExecution:x,physicalLockOwnerDigest:ge(R.owner),nowIso:s,legacyReceiptRef:void 0}),j=await Ne(t.projectRoot,{storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:h,graphRevision:t.graphRevision});if(!j)return c("direct-yolo-recovery-evidence-invalid");const u=Object.freeze({...w,receiptRefs:Object.freeze([...w.receiptRefs,j])});return await xe({projectRoot:t.projectRoot,checkpoint:u,remote:e.push?e.remote??"origin":void 0,remotePolicy:"ancestor-recovery",expectedRevision:v.document.revision,expectedLease:k,expectedGraphRevision:t.graphRevision,physicalLockPath:R.path,physicalLockOwner:R.owner,transientAuthority:x.transientAuthority,authorizedWriteSet:t.authorizedWriteSet})?{ok:!0,value:u}:c("direct-yolo-recovery-persist-failed")}finally{await G(R.path,R.owner).catch(()=>{}),I&&await ce(t.projectRoot,t.epicId,k).catch(()=>{})}}catch(t){return c(Y(t,"direct-yolo-recovery-failed"))}}async function ve(e,t){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t))throw new Error("direct-yolo-story-id-invalid");const r=Z(e),o=m(JSON.parse(await J(te(r,".neocortex/state.json"),"utf8"))),i=await C(r,{required:!0}),n=$e(o,i),y=m(n.stories),h=m(n.epics),d=m(y?.[t]),a=String(d?.epic_id??t.split(".")[0]),s=m(h?.[a]),p=String(s?.execution_branch??""),f=String(s?.origin_branch??""),R=String(s?.graph_revision??""),k=Array.isArray(d?.files_to_modify)?[...new Set(d.files_to_modify.filter(v=>typeof v=="string"&&fe(v)))].sort():[];if(!d)throw new Error("direct-yolo-story-state-missing");if(s?.branch_mode!=="epic")throw new Error("direct-yolo-branch-mode-invalid");if(!Ae(p)||!await L(r,["check-ref-format","--branch",p]))throw new Error("direct-yolo-execution-branch-invalid");if(!Ae(f)||!await L(r,["check-ref-format","--branch",f]))throw new Error("direct-yolo-origin-branch-invalid");if(!/^[a-f0-9]{64}$/.test(R))throw new Error("direct-yolo-graph-revision-invalid");const I=await qe({projectRoot:r,storyId:t,graphRevision:R,executionBranch:p,childPaths:k});return{projectRoot:r,storyId:t,story:d,epicId:a,executionBranch:p,originBranch:f,graphRevision:R,authorizedWriteSet:k,rootMemoryEffect:I}}async function K(e,t){const r=await ve(e,t);if(await l(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch)throw new Error("direct-yolo-current-branch-mismatch");return r}async function Se(e){const t=e.nowIso,r=await A(e.projectRoot,["show","--no-patch","--format=%H%n%P%n%B",e.headSha]),o=q(await A(e.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha])),i=ze({storyId:e.storyId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,commitBody:r,changedPaths:o}),n=Pe({gitEvidenceDigest:i,headSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest}),y=`story-qa:${n}`,h=Object.freeze({schemaVersion:1,kind:"story_qa_evidence",producer:"local-yolo-tdd",evidenceVersion:"p205-execution-v2",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,contract:e.qaExecution.contract,command:e.qaExecution.command,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest,sourceEvidenceDigest:n,verdict:"passed",checkedAt:t,receiptRef:y}),d=Q(e.projectRoot,e.storyId,e.headSha);if(d?.verdict!=="approved")throw new Error("direct-yolo-review-artifact-not-approved");const a=D(["root-commit-range-review-v2",e.storyId,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,y,D(r),[...o].sort().join(","),d.digest].join("\0")),s=`story-review:${a}`,p=Object.freeze({schemaVersion:1,kind:"story_review_evidence",producer:"root-commit-range-review",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,sourceEvidenceDigest:a,reviewArtifactDigest:d.digest,qaReceiptRef:y,verdict:"approved",reviewedAt:t,receiptRef:s}),f=[`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,y,s,...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(f),qaVerdict:"passed",reviewVerdict:"approved",qaReceipt:h,reviewReceipt:p,recordedAt:t,...e.rootMemoryEffect?{rootMemoryEffect:e.rootMemoryEffect}:{}})}async function xe(e){const{projectRoot:t,checkpoint:r,remote:o}=e;let i=!1;return await $(t,n=>{const y=P(n,r.epicId);if(e.expectedLease){const s=m(y.branch_lease);if(!ae(s,e.expectedLease))throw new Error("direct-yolo-runtime-revision-conflict");if(Date.parse(String(s?.expiresAt))<=Date.now())throw new Error("direct-yolo-writer-lease-expired");if(y.graph_revision!==e.expectedGraphRevision||r.graphRevision!==e.expectedGraphRevision)throw new Error("direct-yolo-graph-revision-raced")}const h=me(n,r.storyId),d=m(h.checkpoint);if(d&&d.headSha!==r.headSha){i=!0;return}h.checkpoint=r,h.status="done",h.last_step=Re;const a=Array.isArray(h.steps_completed)?h.steps_completed.filter(s=>typeof s=="string"):[];h.steps_completed=[...new Set([...a,Je,Re])],y.branch_lease=null},{expectedRevision:e.expectedRevision,preCommit:async()=>{if(i)throw new Error("direct-yolo-checkpoint-conflict");if(await l(t,["symbolic-ref","--quiet","--short","HEAD"])!==r.branch||await l(t,["rev-parse","HEAD"])!==r.headSha)throw new Error("direct-yolo-checkpoint-head-raced");if(!await Ie(t,r,r.storyId,r.epicId,r.branch,e.transientAuthority,e.authorizedWriteSet))throw new Error("direct-yolo-checkpoint-physical-invalid");if(e.physicalLockPath&&e.physicalLockOwner&&!await U(e.physicalLockPath,e.physicalLockOwner))throw new Error("direct-yolo-integration-lock-raced");if(o&&!(e.remotePolicy==="ancestor-recovery"?await ke(t,o,r.branch,r.headSha):await De(t,o,r.branch,r.headSha)))throw new Error("direct-yolo-checkpoint-remote-raced")}}),!i}async function ke(e,t,r,o){const i=ee(t),n=(await l(e,["ls-remote","--heads",i,`refs/heads/${r}`])).split(/\s+/)[0];return!!(n&&await L(e,["merge-base","--is-ancestor",o,n]))}function ie(e,t,r){return!!(e?.ownerStoryId===t&&e.sessionId===e.idempotencyKey&&typeof e.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(e.idempotencyKey)&&typeof e.expiresAt=="string"&&Date.parse(e.expiresAt)>Date.parse(r))}async function be(e,t){const r=await Fe(e),o=await We(r,"handoffs"),i=`direct-${D(t)}.json`;return{parent:o,name:i,path:te(o,i)}}async function ne(e,t){const r=await be(e,t.storyId);await Ye(r.parent,r.name,`${JSON.stringify(t,null,2)}
2
+ `),await we(r.path,r.parent)}async function M(e,t){try{const r=await be(e,t);await we(r.path,r.parent);const o=JSON.parse(await J(r.path,"utf8")),i=o.state==="issued"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt"]:o.state==="consuming"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt","consumedBySessionId","consumeStartedAt"]:["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt","consumedBySessionId","consumedAt"];return Object.keys(o).sort().join("\0")!==[...i].sort().join("\0")||o.schemaVersion!==1||o.kind!=="direct-yolo-setup-handoff-token"||o.state!=="issued"&&o.state!=="consuming"&&o.state!=="consumed"||o.storyId!==t||typeof o.fromSessionId!="string"||!/^setup-[a-f0-9]{64}$/.test(o.fromSessionId)||![o.tokenDigest,o.bundleDigest,o.claimRevision,o.grantDigest].every(n=>typeof n=="string"&&/^[a-f0-9]{64}$/.test(n))||typeof o.expiresAt!="string"||!Number.isFinite(Date.parse(o.expiresAt))||(o.state==="issued"||o.state==="consuming")&&(typeof o.token!="string"||!/^[A-Za-z0-9_-]{32,256}$/.test(o.token))||o.state==="consuming"&&(typeof o.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(o.consumedBySessionId)||typeof o.consumeStartedAt!="string"||!Number.isFinite(Date.parse(o.consumeStartedAt)))||o.state==="consumed"&&(typeof o.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(o.consumedBySessionId)||typeof o.consumedAt!="string"||!Number.isFinite(Date.parse(o.consumedAt)))?void 0:o}catch{return}}async function Ze(e,t,r,o,i){const n=await M(e,t);if(!(!n||n.state==="consumed"||!n.token||n.bundleDigest!==r||n.claimRevision!==o||Date.parse(n.expiresAt)<=Date.parse(i)||D(n.token)!==n.tokenDigest))return{sessionId:n.fromSessionId,token:n.token}}async function Qe(e,t,r,o,i,n){const y=await M(e,t);if(!y||y.state==="consumed"||y.fromSessionId!==r||y.token!==o||y.tokenDigest!==D(o))throw new Error("direct-yolo-setup-handoff-consume-invalid");if(y.state==="consuming"){if(y.consumedBySessionId!==i)throw new Error("direct-yolo-setup-handoff-consume-raced");return}await ne(e,{...y,state:"consuming",consumedBySessionId:i,consumeStartedAt:n})}async function Ue(e,t,r,o,i,n,y,h,d){const a=await M(e,r);if(a?.state==="consumed"&&a.fromSessionId===o&&a.consumedBySessionId===h)return;const s=await C(e,{required:!0}),p=m(s.epics[t]?.branch_lease),f=m(p?.handoffConsumption);if(!a||a.state!=="consuming"||a.fromSessionId!==o||a.token!==i||a.tokenDigest!==D(i)||a.bundleDigest!==n||a.claimRevision!==y||a.consumedBySessionId!==h||p?.ownerStoryId!==r||p.sessionId!==h||f?.kind!=="direct-yolo-setup-handoff-consumption"||f.state!=="consumed"||f.fromSessionId!==o||f.tokenDigest!==a.tokenDigest||f.bundleDigest!==n||f.claimRevision!==y||f.consumedBySessionId!==h)throw new Error("direct-yolo-setup-handoff-consume-invalid");try{await ne(e,{schemaVersion:1,kind:a.kind,state:"consumed",storyId:r,fromSessionId:o,tokenDigest:a.tokenDigest,bundleDigest:a.bundleDigest,claimRevision:a.claimRevision,grantDigest:a.grantDigest,expiresAt:a.expiresAt,consumedBySessionId:h,consumedAt:d})}catch{throw new Error("direct-yolo-setup-handoff-consume-persist-failed")}}function Xe(e){const t=m(e.current?.handoffGrant),r=e.handoff?.token,o=typeof r=="string"&&/^[A-Za-z0-9_-]{32,256}$/.test(r)?D(r):void 0;return!!(t&&o&&e.handoff&&e.handoff.sessionId===e.current?.sessionId&&t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff"&&t.storyId===e.storyId&&t.fromSessionId===e.current?.sessionId&&t.bundleDigest===e.bundleDigest&&t.claimRevision===e.claimRevision&&typeof t.expiresAt=="string"&&Date.parse(t.expiresAt)>Date.parse(e.nowIso)&&typeof t.tokenDigest=="string"&&/^[a-f0-9]{64}$/.test(t.tokenDigest)&&et(t.tokenDigest,o))}function et(e,t){const r=Buffer.from(e,"hex"),o=Buffer.from(t,"hex");return r.length===32&&o.length===32&&He(r,o)}function ae(e,t){return!!(e&&["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt"].every(r=>e[r]===t[r]))}async function ce(e,t,r){await $(e,o=>{const i=P(o,t),n=m(i.branch_lease);ae(n,r)&&(i.branch_lease=null)})}async function tt(e,t){const r=await C(e.projectRoot,{required:!0}),o=m(r.epics[e.epicId]?.branch_lease);if(!o||o.ownerStoryId!==t||!je(o.sessionId)||!je(o.idempotencyKey)||!Number.isFinite(Date.parse(String(o.acquiredAt)))||!Number.isFinite(Date.parse(String(o.expiresAt))))return;const i=await W(e.projectRoot,{kind:"direct",storyId:t,sessionId:String(o.sessionId),idempotencyKey:String(o.idempotencyKey),createdAt:String(o.acquiredAt),expiresAt:String(o.expiresAt),persistent:!0});if(!i.ok)return;await G(i.path,i.owner)&&await ce(e.projectRoot,e.epicId,o)}async function se(e,t,r,o){const i=await Ge(t,{headSha:r,graphRevision:o,nowIso:e.nowIso});await e.qaRunner?.({projectRoot:t,storyId:e.storyId,headSha:r});const n=Me(i);if(!n)throw new Error("p205-transient-authority-invalid");return{contract:"P205-CI-02",command:Ve,manifestDigest:n.manifestDigest,gateIds:n.gateIds,resultDigest:n.resultDigest,transientAuthority:i}}async function de(e,t,r,o){return await l(e,["rev-parse","HEAD"])!==r||await l(e,["symbolic-ref","--quiet","--short","HEAD"])!==t||!await L(e,["diff","--cached","--quiet"])?!1:L(e,["diff","--quiet","HEAD","--",...o])}async function De(e,t,r,o){const i=ee(t);return(await l(e,["ls-remote","--heads",i,`refs/heads/${r}`])).split(/\s+/)[0]===o}function V(e,t,r,o){if(e.length===0||e.some(n=>!fe(n)))return{ok:!1,reasonCode:"direct-yolo-write-set-invalid"};const i=[".neocortex/state.json",`docs/stories/${r}.story.md`,`.neocortex/stories/${r}/qa-gate-result.json`,`.neocortex/stories/${r}/validation-evidence.md`,`.neocortex/stories/${r}/review.md`];return!i.every(n=>e.includes(n))||!i.every(n=>t.includes(n))?{ok:!1,reasonCode:"direct-yolo-write-set-invalid"}:o&&(o.storyId!==r||o.childClaimRevision!==D([...t].sort().join("\0")))?{ok:!1,reasonCode:"direct-yolo-root-memory-claim-mismatch"}:e.some(n=>!t.includes(n)&&!o?.files.some(y=>y.path===n))?{ok:!1,reasonCode:"direct-yolo-write-set-unauthorized"}:{ok:!0}}function fe(e){return e.length>0&&e.length<=1024&&!e.startsWith("/")&&!e.includes("\\")&&!e.split("/").includes("..")&&!e.startsWith(".git/")&&!e.includes("\0")}function je(e){return typeof e=="string"&&e.length>0&&e.length<=512&&/^[A-Za-z0-9._:@/+\-=]+$/.test(e)}function Ae(e){return e.length>0&&e.length<=240&&!e.startsWith("-")&&!/[\s~^:?*[\\]/.test(e)&&!e.includes("..")}function ee(e){if(!/^[A-Za-z0-9._-]{1,128}$/.test(e))throw new Error("direct-yolo-remote-invalid");return e}function F(e,t){const r=`${t}: `,o=e.split(`
3
+ `).map(i=>i.trim()).filter(i=>i.startsWith(r)).map(i=>i.slice(r.length));return o.length===1?o[0]:void 0}function D(e){return Le("sha256").update(e).digest("hex")}function q(e){return e.split("\0").filter(Boolean)}function N(e){return e&&Number.isFinite(Date.parse(e))?new Date(Date.parse(e)).toISOString():new Date().toISOString()}function m(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function he(e,t,r){const o=m(e);if(!(!o||o.schemaVersion!==1||o.originBranch!==r||o.executionBranch!==t||o.capturedFromCurrentCheckout!==!0||typeof o.originHeadSha!="string"||!/^[a-f0-9]{40,64}$/.test(o.originHeadSha)||typeof o.capturedAt!="string"||!Number.isFinite(Date.parse(o.capturedAt))))return o}function ue(e,t,r,o){return Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-receipt",storyId:e.storyId,epicId:e.epicId,executionBranch:e.executionBranch,originBranch:e.originBranch,originHeadSha:t.originHeadSha,leaseExpiresAt:r,reused:o,publicSafe:!0})}async function T(e){const t=q(await A(e,["ls-files","--others","--exclude-standard","-z"])).sort(),r=await Promise.all(t.map(async o=>{if(!fe(o))throw new Error("direct-yolo-checkout-payload-invalid");return`${o}\0${await l(e,["hash-object","--no-filters","--",o])}`}));return D([await A(e,["diff","--cached","--binary","--full-index"]),await A(e,["diff","--binary","--full-index"]),await A(e,["status","--porcelain=v1","-z","--untracked-files=all"]),...r].join("\0"))}async function It(e){const t=Z(e),r=await l(t,["rev-parse","HEAD"]),o=await l(t,["symbolic-ref","--quiet","--short","HEAD"]),i=await T(t);if(await l(t,["rev-parse","HEAD"])!==r||await l(t,["symbolic-ref","--quiet","--short","HEAD"])!==o)throw new Error("direct-yolo-checkout-observation-raced");return Object.freeze({headSha:r,branch:o,payloadDigest:i})}async function Ee(e){const t=[];let r;for(const o of(await A(e,["worktree","list","--porcelain"])).split(`
4
+ `))o.startsWith("worktree ")?(r={path:o.slice(9)},t.push(r)):r&&o.startsWith("branch refs/heads/")&&(r.branch=o.slice(18));return t}function Y(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 c(e){return{ok:!1,reasonCode:e}}async function l(e,t){return String((await oe("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout).trim()}async function A(e,t){return String((await oe("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout)}async function L(e,t){try{return await oe("git",[...t],{cwd:e,maxBuffer:8*1024*1024}),!0}catch{return!1}}export{pt as acceptDirectYoloSetupCheckpoint,gt as beginDirectYoloStoryCommit,It as captureDirectYoloCheckoutEvidence,mt as finalizeDirectYoloStoryCheckpoint,lt as issueDirectYoloSetupLeaseHandoff,yt as prepareDirectYoloSetup,wt as recoverLegacyDirectYoloStoryCheckpoint};
@@ -277,8 +277,6 @@ export declare function acquireGitLifecyclePhysicalIntegrationLock(projectRoot:
277
277
  readonly ownerNonce?: string;
278
278
  }): Promise<GitLifecyclePhysicalIntegrationLockResult>;
279
279
  export declare function verifyGitLifecyclePhysicalIntegrationLock(path: string, expected: GitLifecyclePhysicalIntegrationLockOwner): Promise<boolean>;
280
- /** Extend only the exact live physical owner through an anchored file CAS. */
281
- export declare function renewGitLifecyclePhysicalIntegrationLock(path: string, expected: GitLifecyclePhysicalIntegrationLockOwner, expiresAtInput: string): Promise<GitLifecyclePhysicalIntegrationLockOwner | undefined>;
282
280
  export declare function releaseGitLifecyclePhysicalIntegrationLock(path: string, expected: GitLifecyclePhysicalIntegrationLockOwner): Promise<boolean>;
283
281
  export declare function computeGitLifecyclePhysicalIntegrationLockOwnerDigest(owner: GitLifecyclePhysicalIntegrationLockOwner): string;
284
282
  /** Recover only the exact persistent lock whose digest was bound to a checkpoint. */