@ornexus/neocortex 4.60.28 → 4.60.30

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.
@@ -984,7 +984,7 @@
984
984
  "version": "1.26.0"
985
985
  },
986
986
  {
987
- "bom-ref": "@neocortex/client@4.60.28",
987
+ "bom-ref": "@neocortex/client@4.60.30",
988
988
  "group": "@neocortex",
989
989
  "name": "client",
990
990
  "properties": [
@@ -993,9 +993,9 @@
993
993
  "value": "node_modules/@neocortex/client"
994
994
  }
995
995
  ],
996
- "purl": "pkg:npm/%40neocortex/client@4.60.28",
996
+ "purl": "pkg:npm/%40neocortex/client@4.60.30",
997
997
  "type": "library",
998
- "version": "4.60.28"
998
+ "version": "4.60.30"
999
999
  },
1000
1000
  {
1001
1001
  "bom-ref": "@neocortex/core@0.1.0",
@@ -1012,7 +1012,7 @@
1012
1012
  "version": "0.1.0"
1013
1013
  },
1014
1014
  {
1015
- "bom-ref": "@neocortex/server@4.60.28",
1015
+ "bom-ref": "@neocortex/server@4.60.30",
1016
1016
  "group": "@neocortex",
1017
1017
  "name": "server",
1018
1018
  "properties": [
@@ -1021,12 +1021,12 @@
1021
1021
  "value": "node_modules/@neocortex/server"
1022
1022
  }
1023
1023
  ],
1024
- "purl": "pkg:npm/%40neocortex/server@4.60.28",
1024
+ "purl": "pkg:npm/%40neocortex/server@4.60.30",
1025
1025
  "type": "library",
1026
- "version": "4.60.28"
1026
+ "version": "4.60.30"
1027
1027
  },
1028
1028
  {
1029
- "bom-ref": "@neocortex/shared@4.60.28",
1029
+ "bom-ref": "@neocortex/shared@4.60.30",
1030
1030
  "group": "@neocortex",
1031
1031
  "name": "shared",
1032
1032
  "properties": [
@@ -1035,9 +1035,9 @@
1035
1035
  "value": "node_modules/@neocortex/shared"
1036
1036
  }
1037
1037
  ],
1038
- "purl": "pkg:npm/%40neocortex/shared@4.60.28",
1038
+ "purl": "pkg:npm/%40neocortex/shared@4.60.30",
1039
1039
  "type": "library",
1040
- "version": "4.60.28"
1040
+ "version": "4.60.30"
1041
1041
  },
1042
1042
  {
1043
1043
  "bom-ref": "@opentelemetry/api-logs@0.214.0",
@@ -9405,17 +9405,17 @@
9405
9405
  "dependsOn": [
9406
9406
  "@clack/prompts@1.0.1",
9407
9407
  "@modelcontextprotocol/sdk@1.26.0",
9408
- "@neocortex/client@4.60.28",
9408
+ "@neocortex/client@4.60.30",
9409
9409
  "@neocortex/core@0.1.0",
9410
- "@neocortex/server@4.60.28",
9411
- "@neocortex/shared@4.60.28",
9410
+ "@neocortex/server@4.60.30",
9411
+ "@neocortex/shared@4.60.30",
9412
9412
  "better-sqlite3@12.11.1",
9413
9413
  "execa@9.6.1",
9414
9414
  "node-cache@5.1.2",
9415
9415
  "picocolors@1.1.1",
9416
9416
  "zod@4.4.3"
9417
9417
  ],
9418
- "ref": "@ornexus/neocortex@4.60.28"
9418
+ "ref": "@ornexus/neocortex@4.60.30"
9419
9419
  },
9420
9420
  {
9421
9421
  "dependsOn": [
@@ -9456,7 +9456,7 @@
9456
9456
  "@fastify/jwt@10.2.2",
9457
9457
  "@fastify/rate-limit@10.3.0",
9458
9458
  "@fastify/static@10.1.3",
9459
- "@neocortex/shared@4.60.28",
9459
+ "@neocortex/shared@4.60.30",
9460
9460
  "@sentry/node@10.62.0",
9461
9461
  "bcryptjs@3.0.3",
9462
9462
  "drizzle-orm@0.45.2",
@@ -9469,7 +9469,7 @@
9469
9469
  "stripe@20.4.1",
9470
9470
  "yaml@2.9.0"
9471
9471
  ],
9472
- "ref": "@neocortex/server@4.60.28"
9472
+ "ref": "@neocortex/server@4.60.30"
9473
9473
  },
9474
9474
  {
9475
9475
  "dependsOn": [
@@ -9590,16 +9590,16 @@
9590
9590
  },
9591
9591
  {
9592
9592
  "dependsOn": [
9593
- "@neocortex/shared@4.60.28",
9593
+ "@neocortex/shared@4.60.30",
9594
9594
  "better-sqlite3@12.11.1",
9595
9595
  "jose@6.2.2",
9596
9596
  "keytar@7.9.0"
9597
9597
  ],
9598
- "ref": "@neocortex/client@4.60.28"
9598
+ "ref": "@neocortex/client@4.60.30"
9599
9599
  },
9600
9600
  {
9601
9601
  "dependsOn": [
9602
- "@neocortex/shared@4.60.28"
9602
+ "@neocortex/shared@4.60.30"
9603
9603
  ],
9604
9604
  "ref": "@neocortex/core@0.1.0"
9605
9605
  },
@@ -10653,7 +10653,7 @@
10653
10653
  "ref": "@lukeed/ms@2.0.2"
10654
10654
  },
10655
10655
  {
10656
- "ref": "@neocortex/shared@4.60.28"
10656
+ "ref": "@neocortex/shared@4.60.30"
10657
10657
  },
10658
10658
  {
10659
10659
  "ref": "@opentelemetry/api@1.9.1"
@@ -11136,8 +11136,8 @@
11136
11136
  "metadata": {
11137
11137
  "component": {
11138
11138
  "author": "OrNexus Team",
11139
- "bom-ref": "@ornexus/neocortex@4.60.28",
11140
- "description": "Neocortex v4.60.28 - Orquestrador de Desenvolvimento de Epics & Stories para Claude Code",
11139
+ "bom-ref": "@ornexus/neocortex@4.60.30",
11140
+ "description": "Neocortex v4.60.30 - Orquestrador de Desenvolvimento de Epics & Stories para Claude Code",
11141
11141
  "externalReferences": [
11142
11142
  {
11143
11143
  "comment": "as detected from PackageJson property \"bugs.url\"",
@@ -11170,9 +11170,9 @@
11170
11170
  "value": ""
11171
11171
  }
11172
11172
  ],
11173
- "purl": "pkg:npm/%40ornexus/neocortex@4.60.28?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2FOrNexus-AI%2Fneocortex.git",
11173
+ "purl": "pkg:npm/%40ornexus/neocortex@4.60.30?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2FOrNexus-AI%2Fneocortex.git",
11174
11174
  "type": "application",
11175
- "version": "4.60.28"
11175
+ "version": "4.60.30"
11176
11176
  },
11177
11177
  "tools": {
11178
11178
  "components": [
package/install.ps1 CHANGED
@@ -17,7 +17,7 @@ param(
17
17
  [string]$ServerUrl = ('https://{0}.{1}.{2}' -f 'api','neocortex','sh')
18
18
  )
19
19
 
20
- $VERSION = "4.60.28"
20
+ $VERSION = "4.60.30"
21
21
 
22
22
  # =============================================================================
23
23
  # CONFIGURACOES
package/install.sh CHANGED
@@ -4,7 +4,7 @@
4
4
  # Development Orchestrator
5
5
 
6
6
  # Versao do instalador
7
- VERSION="4.60.28"
7
+ VERSION="4.60.30"
8
8
 
9
9
  # Flags
10
10
  MIGRATION_DETECTED=false
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ornexus/neocortex",
3
- "version": "4.60.28",
4
- "description": "Neocortex v4.60.28 - Orquestrador de Desenvolvimento de Epics & Stories para Claude Code",
3
+ "version": "4.60.30",
4
+ "description": "Neocortex v4.60.30 - Orquestrador de Desenvolvimento de Epics & Stories para Claude Code",
5
5
  "keywords": [
6
6
  "claude",
7
7
  "claude-code",
@@ -67,6 +67,7 @@
67
67
  "!packages/shared/dist/**/__tests__/**",
68
68
  "packages/shared/dist/generated/command-registry.generated.js",
69
69
  "packages/shared/dist/generated/invocation-schema.generated.js",
70
+ "packages/shared/dist/yoloop/branch-unit.js",
70
71
  "packages/shared/dist/yoloop/epic-terminal-git.js",
71
72
  "packages/shared/dist/yoloop/wave-decision-receipt.js",
72
73
  "packages/shared/dist/yoloop/planning-graph.js",
File without changes
@@ -53,7 +53,9 @@ ${t}
53
53
  `),process.stderr.write(` After updating, re-run your command.
54
54
  `),process.stderr.write(`==================================================
55
55
 
56
- `),{success:!1,error:`UPGRADE_REQUIRED: Client version ${_e} is below minimum ${v}. Run: ${c}`,exitCode:3}}if(!T.ok||!T.data){const a=T.status===401?2:(T.status===429||T.status>=500,1);try{const c=T.errorBody?.error_code??(T.status===429?"RATE_LIMITED":T.status>=500?"SERVER_ERROR":void 0);if(c){const v=At(),re=Ct(c,v);re&&process.stderr.write(St(re,v))}}catch{}return{success:!1,error:q(T.error??"Unknown error from server",me),exitCode:a}}if(!y&&T.data.metadata?.mode==="menu"&&b&&await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"auth-cache",operation:"update"},()=>Xr(b,T.data.instructions,T.data.metadata),async()=>{}).catch(()=>{}),T.data.metadata&&await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"tier-cache",operation:"update"},()=>E.tierClient.updateQuotaFromResponse(T.data.metadata),async()=>{}).catch(()=>{}),T.data.metadata?.gitLifecycleGraphAuthority)try{await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"state-writeback",operation:"update"},()=>gr(i,T.data.metadata.gitLifecycleGraphAuthority),async()=>{throw new Error("git-lifecycle-graph-authority-effect-skipped")})}catch(a){const c=a instanceof Error&&/^git-lifecycle-/.test(a.message)?a.message:"git-lifecycle-graph-authority-persist-failed";return process.stderr.write(`[Neocortex] ${c}. Graph authority was not persisted; no YOLO checkpoint instruction was released.
56
+ `),{success:!1,error:`UPGRADE_REQUIRED: Client version ${_e} is below minimum ${v}. Run: ${c}`,exitCode:3}}if(!T.ok||!T.data){const a=T.status===401?2:(T.status===429||T.status>=500,1);try{const c=T.errorBody?.error_code??(T.status===429?"RATE_LIMITED":T.status>=500?"SERVER_ERROR":void 0);if(c){const v=At(),re=Ct(c,v);re&&process.stderr.write(St(re,v))}}catch{}return{success:!1,error:q(T.error??"Unknown error from server",me),exitCode:a}}if(!y&&T.data.metadata?.mode==="menu"&&b&&await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"auth-cache",operation:"update"},()=>Xr(b,T.data.instructions,T.data.metadata),async()=>{}).catch(()=>{}),T.data.metadata&&await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"tier-cache",operation:"update"},()=>E.tierClient.updateQuotaFromResponse(T.data.metadata),async()=>{}).catch(()=>{}),T.data.metadata?.stateMutated===!0)try{const a=await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"state-writeback",operation:"update"},async()=>{const{persistMigratedStateFromResponse:c}=await import("../yoloop/invoke-hooks.js");return c(T.data.metadata,i)},async()=>({applied:!1,blocking:!1,reasonCode:"state-writeback-effect-skipped"}));if(a.blocking){const c=`STATE_WRITEBACK_BLOCKED: ${a.reasonCode}. Canonical state was not replaced.`;return process.stderr.write(`${c}
57
+ `),{success:!1,error:c,errorCode:"STATE_WRITEBACK_BLOCKED",exitCode:1}}}catch(a){if(T.data.metadata?.stateMutationReason==="inline-yolo-materialized-synthetic-story"){const c=a instanceof Error?a.message:String(a),v=`STATE_WRITEBACK_BLOCKED: inline-yolo persistence failed (${q(c,me)}).`;return process.stderr.write(`${v}
58
+ `),{success:!1,error:v,errorCode:"STATE_WRITEBACK_BLOCKED",exitCode:1}}}if(T.data.metadata?.gitLifecycleGraphAuthority)try{await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"state-writeback",operation:"update"},()=>gr(i,T.data.metadata.gitLifecycleGraphAuthority),async()=>{throw new Error("git-lifecycle-graph-authority-effect-skipped")})}catch(a){const c=a instanceof Error&&/^git-lifecycle-/.test(a.message)?a.message:"git-lifecycle-graph-authority-persist-failed";return process.stderr.write(`[Neocortex] ${c}. Graph authority was not persisted; no YOLO checkpoint instruction was released.
57
59
  `),{success:!1,error:c,errorCode:"GIT_LIFECYCLE_GRAPH_AUTHORITY_INVALID",exitCode:1}}if(T.data.metadata?.mode==="error"&&T.data.metadata?.errorCode==="CLIENT_UPGRADE_REQUIRED")return process.stderr.write(`
58
60
  `),process.stderr.write(`==================================================
59
61
  `),process.stderr.write(` YOLOOP CLIENT UPGRADE REQUIRED
@@ -71,9 +73,7 @@ ${t}
71
73
 
72
74
  `),{success:!1,error:"CLIENT_UPGRADE_REQUIRED: This client does not support yoloop client-side persistence. Run: npm install -g @ornexus/neocortex@latest",exitCode:3};if(T.data.metadata?.yoloopStateUpdate)try{await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"state-writeback",operation:"update"},async()=>{const{persistYoloopFromResponse:a}=await import("../yoloop/invoke-hooks.js");await a(T.data.metadata,i)},async()=>{})}catch{}if(T.data.metadata?.continuityStateUpdate)try{const a=await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"continuity-store",operation:"update"},async()=>{const{persistContinuityFromResponse:c}=await import("../continuity/invoke-hooks.js");return c(T.data.metadata,i)},async()=>({ok:!0,reasonCodes:[]}));if(!a.ok){const c=a.reasonCodes.join(",");return process.stderr.write(`[Neocortex] continuity persistence failed: ${c}. No continuity mutation was committed.
73
75
  `),{success:!1,error:`CONTINUITY_PERSISTENCE_FAILED: ${c}`,errorCode:"CONTINUITY_PERSISTENCE_FAILED",exitCode:1}}}catch(a){const c=a instanceof Error?a.message:String(a);return process.stderr.write(`[Neocortex] continuity persistence hook failed: ${c}. No continuity mutation was committed.
74
- `),{success:!1,error:`CONTINUITY_PERSISTENCE_FAILED: ${q(c,me)}`,errorCode:"CONTINUITY_PERSISTENCE_FAILED",exitCode:1}}if(T.data.metadata?.stateMutated===!0)try{const a=await g.executeAsync({phase:"client-writeback",domain:"client-persistence",category:"state-writeback",operation:"update"},async()=>{const{persistMigratedStateFromResponse:c}=await import("../yoloop/invoke-hooks.js");return c(T.data.metadata,i)},async()=>({applied:!1,blocking:!1,reasonCode:"state-writeback-effect-skipped"}));if(a.blocking){const c=`STATE_WRITEBACK_BLOCKED: ${a.reasonCode}. Canonical state was not replaced.`;return process.stderr.write(`${c}
75
- `),{success:!1,error:c,errorCode:"STATE_WRITEBACK_BLOCKED",exitCode:1}}}catch(a){if(T.data.metadata?.stateMutationReason==="inline-yolo-materialized-synthetic-story"){const c=a instanceof Error?a.message:String(a),v=`STATE_WRITEBACK_BLOCKED: inline-yolo persistence failed (${q(c,me)}).`;return process.stderr.write(`${v}
76
- `),{success:!1,error:v,errorCode:"STATE_WRITEBACK_BLOCKED",exitCode:1}}}if(T.data.metadata?.tier_changed){const a=T.data.metadata.current_tier;try{await E.client.forceRefresh()?(await E.tierClient.invalidateTierCache(),process.stderr.write(`[Neocortex] Token atualizado automaticamente para tier ${a}
76
+ `),{success:!1,error:`CONTINUITY_PERSISTENCE_FAILED: ${q(c,me)}`,errorCode:"CONTINUITY_PERSISTENCE_FAILED",exitCode:1}}if(T.data.metadata?.tier_changed){const a=T.data.metadata.current_tier;try{await E.client.forceRefresh()?(await E.tierClient.invalidateTierCache(),process.stderr.write(`[Neocortex] Token atualizado automaticamente para tier ${a}
77
77
  `)):process.stderr.write(`[Neocortex] Seu tier foi atualizado para ${a}! Execute "neocortex activate" para obter um token atualizado.
78
78
  `)}catch{process.stderr.write(`[Neocortex] Seu tier foi atualizado para ${a}! Execute "neocortex activate" para obter um token atualizado.
79
79
  `)}}const gt=tt(T.data.instructions,T.data.metadata);if(j&&T.data.metadata?.mode!=="error")try{const a=T.data.metadata?.epicClaim;if(!a||typeof a!="object"||Array.isArray(a))throw new Error("EPIC_CLAIM_INTEGRITY_FAILURE");const c=a;if(c.outcome!=="reserved"||typeof c.claimId!="string"||typeof c.epicId!="string")throw new Error("EPIC_CLAIM_INTEGRITY_FAILURE");g.execute({phase:"client-writeback",domain:"client-persistence",category:"pending-claim",operation:"update"},()=>Or(i,j.fingerprint,c.claimId,c.epicId),()=>{})}catch{}return g.complete(Ie),{success:!0,instructions:gt.instructions,metadata:gt.metadata,exitCode:0}}function Qo(e){const[t]=e.trim().split(/\s+/,1);return t?/^@?epic-[a-z0-9][a-z0-9._-]*$/i.test(t)?"epic":_t(t):null}const Sn="Provide exactly one invoke input source: --args <string>, --stdin, or --args-file <path>.",Zo=`
@@ -102,8 +102,11 @@ export declare function ensureGitLifecycleRuntimeInitialized(projectRoot: string
102
102
  /**
103
103
  * Close the server-plan -> client -> P207 sidecar handoff. The authority is
104
104
  * accepted only for the exact tracked epic/story/branch projection that the
105
- * server selected. Tracked-state drift and sidecar revision races fail closed;
106
- * no tracked, staged or working-tree bytes are modified.
105
+ * server selected. A genuinely new epic may bootstrap its deterministic
106
+ * `epic/<ID>` unit into the private sidecar after the complete tracked topology
107
+ * proves there is no legacy story Git progress. Tracked-state drift, explicit
108
+ * lifecycle conflicts and sidecar revision races fail closed; no tracked,
109
+ * staged or working-tree bytes are modified.
107
110
  */
108
111
  export declare function persistGitLifecycleGraphAuthority(projectRoot: string, authority: unknown, nowIso?: string): Promise<GitLifecycleGraphAuthorityPersistenceResult>;
109
112
  export declare function mutateGitLifecycleRuntime<T>(projectRoot: string, mutate: (document: GitLifecycleRuntimeDocument) => T, options?: GitLifecycleMutationOptions): Promise<GitLifecycleMutationResult<T>>;
@@ -1,4 +1,4 @@
1
- import{execFile as rt,execFileSync as X}from"node:child_process";import{createHash as y,randomBytes as ye}from"node:crypto";import{lstat as be,open as nt,readFile as H,realpath as Y,stat as at}from"node:fs/promises";import{existsSync as L,lstatSync as Oe,readFileSync as Pe,realpathSync as we}from"node:fs";import{basename as _,dirname as T,isAbsolute as ee,join as p,relative as ct,resolve as h}from"node:path";import{promisify as ot}from"node:util";import{publicWriteSet as st}from"../../../shared/dist/yoloop/public-story-write-set.js";import{anchoredAtomicWriteFile as dt,anchoredCreateOwnedDirectory as Ne,anchoredEnsureDirectory as $e,anchoredExecuteGit as ft,anchoredExecuteNode as Ve,anchoredRemoveDirectory as ut,anchoredRenameDirectory as Z}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as gt,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as lt}from"./git-lifecycle-step-ids.js";const $=ot(rt),ce="neocortex-yoloop",oe="runtime.json",V="node scripts/test-root.mjs --gate complete",Be=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),ht=Object.freeze({"P174.03.811759":Object.freeze({baseSha:"749c8fc732deaf26c81a8e08cc94b83c8cf0f5ba",headSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",commitBodyDigest:"b4fc759a49765fd8c0b3d0f5d1c333c2a4bf28d324e83eedabb12f9530df3738",changedPathsDigest:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",qaDigest:"f1100775e21f5d0d990f77303a2a06d936908f016983e32a63316d81aee6b9fc",reviewDigest:"50400bbcddb6f02408837cf99077de5d3af8c84822ab23a8b5499c338af7103a"}),"P174.03.685003":Object.freeze({baseSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",headSha:"272a7fee89e4b9324d35701df1c83b671fa96299",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",commitBodyDigest:"e97966e26ce3ba31d5951b9fdac67808c88c1fd8be7ec1e73982f3f1cc7ffd81",changedPathsDigest:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",qaDigest:"7439329a93321f39fb6b0de0a41c22e58373a399f9048e362dff4ffa6f1a7d89",reviewDigest:"1b2d12262e84acf9da7d06149a0effb11274ebdc986affbfd47635b855ec7135"}),"P174.03.029264":Object.freeze({baseSha:"272a7fee89e4b9324d35701df1c83b671fa96299",headSha:"339141be7339a0edf55710cbccb6e6558f514792",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",commitBodyDigest:"0f269a00dcd168a6f548ff10dfa667b193c948ac9c7211f5cb11a0561757c371",changedPathsDigest:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",qaDigest:"ef0fd2c6e216557825cd8521ccb2f9960a3af48f18e7a5ada441bee8bfda400b",reviewDigest:"372d0f4a2f32978c8b39f20167637b3917187edb75d49875e93200c4c5a19d0d"}),"P174.03.913359":Object.freeze({baseSha:"339141be7339a0edf55710cbccb6e6558f514792",headSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",commitBodyDigest:"89a6653197509e75246a758d2706876b337770571a1cac47d9d85ec96c196459",changedPathsDigest:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",qaDigest:"c7d3762ad30e4f9356243df17a1dd7123cbf1b660808d68176f44d1cd5da6449",reviewDigest:"e4ecf577e174fd66f31aa4a0113ab672ced16b12ee531f6831aa533795145ba1"}),"P174.03.724350":Object.freeze({baseSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",headSha:"568e9464fb086304146b9eb4594281f91302aef1",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",commitBodyDigest:"b3032338bfcd6c9dc460e9426220a1966dedeff9968c4064fdd36a315560721b",changedPathsDigest:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",qaDigest:"91f2f5b00935b1b04bb5d400df500cbc97c412072078b713c6e5ba8fda669bd0",reviewDigest:"9bc92069d3b3a76cc8b02d339d432690258be1376464b69e152ed8fd3d682f05"}),"P174.03.011976":Object.freeze({baseSha:"568e9464fb086304146b9eb4594281f91302aef1",headSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",commitBodyDigest:"b8a28392fac663dd614b695a49c894b7cab116d45722a42850e3b24e2aaf36f4",changedPathsDigest:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",qaDigest:"6eb4459a7d80c4a268fc931297e8156ed2a320584f8775f0787d91b42c0929d4",reviewDigest:"98b21de29f7cceeec73da19000c6c144395cce6eb699c6a82dfab505d4ab7b44"}),"P174.03.686659":Object.freeze({baseSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",headSha:"0db3681a5dad4e25ce37d967c636eb9d54915556",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",commitBodyDigest:"143257f4018ad773afc0c7280bd8aab8786851a9c20b65f8110881ff54656839",changedPathsDigest:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",qaDigest:"6303dbf473e2815a3671aeb2c25528d8daba484b92a5a40d1eea5215e1f6763e",reviewDigest:"1bd6695846ed9340c8677cfa9b573880532187aeee487efaaa70577a0c94e7f2"})}),Se="neocortex-yoloop-runtime.json",mt="runtime.lock",Le=new WeakMap;async function gi(t,e){if(!S(e.headSha)||!l(e.graphRevision))throw new Error("p205-transient-binding-invalid");const i=e.anchoredWorkspace;if(i&&h(t)!==p(h(i.parent),i.name))throw new Error("p205-transient-anchor-binding-invalid");const r=async P=>i?(await ft(i.parent,i.name,i.identity,P)).toString("utf8"):String((await $("git",[...P],{cwd:t,encoding:"utf8",maxBuffer:8*1024*1024})).stdout),n=async()=>i?JSON.parse((await Ve(i.parent,i.name,i.identity,["-e","const fs=require('node:fs');process.stdout.write(JSON.stringify({manifest:fs.readFileSync('config/release-gates.v2.json','utf8'),runner:fs.readFileSync('scripts/test-root.mjs','utf8')}));"])).toString("utf8")):{manifest:await H(p(t,"config","release-gates.v2.json"),"utf8"),runner:await H(p(t,"scripts","test-root.mjs"),"utf8")};if((await r(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-mismatch");const{manifest:o,runner:s}=await n(),[u,c]=await Promise.all([r(["show",`${e.headSha}:config/release-gates.v2.json`]),r(["show",`${e.headSha}:scripts/test-root.mjs`])]);if(o!==u||s!==c)throw new Error("p205-transient-producer-dirty");const d=JSON.parse(o),b=Array.isArray(d.requiredCompleteClasses)?d.requiredCompleteClasses.filter(P=>typeof P=="string"&&/^[a-z0-9-]+$/.test(P)):[];if(d.contract!=="P205-CI-02"||b.length===0)throw new Error("p205-transient-manifest-invalid");const g=i?(await Ve(i.parent,i.name,i.identity,["scripts/test-root.mjs","--gate","complete"])).toString("utf8"):String((await $(process.execPath,["scripts/test-root.mjs","--gate","complete"],{cwd:t,encoding:"utf8",maxBuffer:64*1024*1024})).stdout),{manifest:m,runner:v}=await n();if(m!==o||v!==s)throw new Error("p205-transient-producer-raced");if((await r(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-raced");const O=y("sha256").update(o).digest("hex"),k=y("sha256").update(g).digest("hex"),z=ie(e.nowIso??new Date().toISOString()),R=y("sha256").update(["p205-transient-execution-v1",V,e.headSha,e.graphRevision,O,b.join(","),k,z].join("\0")).digest("hex"),ae=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:V,executionHeadSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:O,gateIds:Object.freeze(b),resultDigest:k,executedAt:z,executionEvidenceDigest:R}),ge=Object.freeze(Object.create(null));return Le.set(ge,ae),ge}async function ve(t,e={}){const i=await kt(t);return We(i,e)}function pt(t,e={}){let i;try{const r=X("git",["rev-parse","--git-common-dir"],{cwd:t,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=we(t),a=ee(r)?h(r):h(n,r),o=we(a);if(o!==a)throw new Error("git-lifecycle-common-dir-symlink");Vt(o);const s=p(o,ce),u=p(s,oe);if(L(s)&&(Ye(s,"directory"),we(s)!==s))throw new Error("git-lifecycle-runtime-directory-symlink");i=L(u)?u:p(o,Se)}catch{if(e.required)throw new Error("git-lifecycle-common-dir-invalid");return Ee()}if(!L(i)){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}return Ye(i,"file"),_e(JSON.parse(Pe(i,"utf8")))}async function li(t){try{await ve(t,{required:!0});return}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-missing")throw e}try{await qe(t,()=>{},{expectedRevision:0})}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-revision-conflict")throw e;await ve(t,{required:!0})}}async function hi(t,e,i=new Date().toISOString()){if(!Ut(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=p(h(t),".neocortex","state.json"),n=await H(r,"utf8"),a=f(JSON.parse(n));if(!a)throw new Error("git-lifecycle-tracked-state-invalid");const o=await ve(t,{required:!0}),s=bt(a,o),u=f(f(s.epics)?.[e.epicId]),c=f(f(s.stories)?.[e.storyId]);if(!u||u.branch_mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-invalid");if(!c||String(c.epic_id??e.storyId.split(".")[0])!==e.epicId)throw new Error("git-lifecycle-graph-authority-story-invalid");if(u.execution_branch!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-mismatch");const d=typeof u.graph_revision=="string"?u.graph_revision:void 0,b=typeof f(o.epics[e.epicId])?.graph_revision=="string"?String(f(o.epics[e.epicId]).graph_revision):void 0;if(d!==void 0&&!l(d))throw new Error("git-lifecycle-graph-revision-invalid");if(d===e.graphRevision&&b===e.graphRevision)return{applied:!1,reused:!0,revision:o.revision,graphRevision:e.graphRevision};const g=Date.parse(i);if(!Number.isFinite(g))throw new Error("git-lifecycle-graph-authority-time-invalid");const m=f(u.branch_lease);if(m&&Number.isFinite(Date.parse(String(m.expiresAt)))&&Date.parse(String(m.expiresAt))>g)throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await qe(t,C=>{const O=wt(C,e.epicId),k=O.execution_branch;if(k!==void 0&&k!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const z=O.graph_revision;if(z!==void 0&&z!==d)throw new Error("git-lifecycle-graph-authority-epoch-raced");const R=f(O.branch_lease);if(R&&Number.isFinite(Date.parse(String(R.expiresAt)))&&Date.parse(String(R.expiresAt))>g)throw new Error("git-lifecycle-graph-authority-writer-active");O.graph_revision=e.graphRevision},{expectedRevision:o.revision,preCommit:async()=>{if(await H(r,"utf8")!==n)throw new Error("git-lifecycle-graph-authority-tracked-state-raced")}})).document.revision,graphRevision:e.graphRevision}}async function qe(t,e,i={}){const r=await xe(t),n=await Ke(r),a=p(n,mt),o=await ei(a);try{const s=p(n,oe),u=p(r,Se),c=await We(L(s)?s:u);if(i.expectedRevision!==void 0&&i.expectedRevision!==c.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const d=structuredClone(c),b=e(d),g=_e({...d,schemaVersion:1,revision:c.revision+1});return await i.preCommit?.(g),await j(n,"directory"),await Nt(s),await dt(n,oe,`${JSON.stringify(g,null,2)}
2
- `),await j(s,"file"),await yt(n),{document:g,value:b}}finally{await ti(a,o).catch(()=>{})}}async function yt(t){let e;try{e=await nt(t,"r")}catch(i){if(process.platform==="win32"&&(I(i,"EPERM")||I(i,"EISDIR")||I(i,"EINVAL")))return;throw i}try{await e.sync()}finally{await e.close()}}function bt(t,e){const i=structuredClone(t),r=je(i,"epics"),n=je(i,"stories");for(const[a,o]of Object.entries(e.epics))r[a]={...f(r[a])??{},...structuredClone(o)};for(const[a,o]of Object.entries(e.stories))n[a]={...f(n[a])??{},...structuredClone(o)};return i}function je(t,e){const i=t[e];if(i===void 0){const a={};return t[e]=a,a}const r=f(i);if(r)return r;if(!Array.isArray(i))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of i){const o=f(a),s=typeof o?.id=="string"?o.id.trim():"";if(!s||n[s]!==void 0)throw new Error(`git-lifecycle-tracked-${e}-ambiguous`);n[s]=o}return t[e]=n,n}function wt(t,e){return t.epics[e]??(t.epics[e]={})}function mi(t,e){return t.stories[e]??(t.stories[e]={})}function ze(t,e,i,r){const n=f(t);return!!(n&&n.epicId===i&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&Je(n,e))}async function pi(t,e,i,r,n,a,o=[]){return St(t,e,i,r,n,a,o).verdict==="verified"}function St(t,e,i,r,n,a,o=[],s=new Date().toISOString()){const u=()=>At({storyId:i,epicId:r,executionBranch:n,value:e,verifiedAt:s,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!ze(e,i,r,n))return u();const c=f(e),d=f(c.qaReceipt),b=f(c.reviewReceipt),g=String(c.headSha),m=String(c.baseSha),v=q(t,["rev-parse",`refs/heads/${n}`]).trim();X("git",["merge-base","--is-ancestor",g,v],{cwd:t,stdio:"ignore"});const C=q(t,["show","--no-patch","--format=%H%n%P%n%B",g]),O=q(t,["rev-parse",`${g}^`]).trim(),k=q(t,["rev-list","--count",`${m}..${g}`]).trim();if(O!==m||k!=="1")return u();const z=new Set(C.split(`
3
- `).map(G=>G.trim())),ae=[`Neocortex-Story: ${i}`,`Neocortex-Epic: ${r}`,`Neocortex-Execution-Branch: ${n}`,`Neocortex-Bundle-Digest: ${String(c.bundleDigest)}`,`Neocortex-Graph-Revision: ${String(c.graphRevision)}`,...c.dispatchId?[`Neocortex-Dispatch: ${String(c.dispatchId)}`]:[],...c.bundleId?[`Neocortex-Bundle: ${String(c.bundleId)}`]:[],...c.claimRevision?[`Neocortex-Claim-Revision: ${String(c.claimRevision)}`]:[]].every(G=>z.has(G));if(ae){const Ce=[...z].find(it=>it.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(Ce))return u();X("git",["merge-base","--is-ancestor",Ce,g],{cwd:t,stdio:"ignore"})}const P=q(t,["diff-tree","--no-commit-id","--name-only","-r","-z",g]).split("\0").filter(Boolean);if(P.length===0||P.some(G=>!de(G)))return u();const le=y("sha256").update(C).digest("hex"),he=y("sha256").update([...P].sort().join("\0")).digest("hex"),N=Ge({checkpoint:c,storyId:i,epicId:r,executionBranch:n,baseSha:m,headSha:g,commitBodyDigest:le,changedPathsDigest:he,changedPaths:P,authorizedWriteSet:o.length>0?o:xt(t,i)});if(!N||d.receiptRef!==`story-qa:${String(d.sourceEvidenceDigest)}`)return u();const Re=It({storyId:i,baseSha:m,headSha:g,bundleDigest:String(c.bundleDigest),graphRevision:String(c.graphRevision),commitBody:C,changedPaths:P}),Ae=d.evidenceVersion==="p205-execution-v2"&&d.contract==="P205-CI-02"&&d.command===V&&l(d.manifestDigest)&&B(d.gateIds,32,!0)&&l(d.resultDigest)&&d.sourceEvidenceDigest===Rt({gitEvidenceDigest:Re,headSha:g,graphRevision:String(c.graphRevision),manifestDigest:String(d.manifestDigest),gateIds:d.gateIds,resultDigest:String(d.resultDigest)}),Xe=d.evidenceVersion==="git-immutable-v1"&&d.sourceEvidenceDigest===Re,et=d.evidenceVersion===void 0&&N.mode==="legacy-migration"&&N.binding?.qaDigest===d.sourceEvidenceDigest,me=vt(a,v,String(c.graphRevision))&&(Ae||N.mode==="legacy-migration"&&(Xe||et)),pe=a===void 0&&Ae;if(!me&&!pe)return u();const ke=y("sha256").update(["root-commit-range-review-v1",i,m,g,String(c.bundleDigest),String(c.graphRevision),String(d.receiptRef),y("sha256").update(C).digest("hex"),[...P].sort().join(",")].join("\0")).digest("hex");if(b.sourceEvidenceDigest!==ke||b.receiptRef!==`story-review:${ke}`||N.mode==="legacy-migration"&&N.binding?.reviewDigest!==void 0&&N.binding.reviewDigest!==b.sourceEvidenceDigest||!ae&&(Be[i]!==g||!Array.isArray(c.receiptRefs)||!c.receiptRefs.some(G=>typeof G=="string"&&G.startsWith("legacy-direct-yolo:"))))return u();const tt=y("sha256").update(["checkpoint-p205-transient-v1",i,r,n,m,g,String(c.bundleDigest),le,he,N.mode,N.effectiveClaimRevision,String(d.sourceEvidenceDigest),String(b.sourceEvidenceDigest),te(a)?.executionEvidenceDigest??(pe?"maintenance-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),Q=me?te(a):void 0;return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:i,epicId:r,branch:n,baseSha:m,headSha:g,aggregateHeadSha:Q?.executionHeadSha??g,commitBodyDigest:le,changedPathsDigest:he,claimVerification:N.mode,effectiveClaimRevision:N.effectiveClaimRevision,sourceEvidenceDigest:tt,command:V,manifestDigest:Q?.manifestDigest??"0".repeat(64),gateIds:Q?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:Q?.resultDigest??"0".repeat(64),graphRevision:String(c.graphRevision),executionEvidenceDigest:Q?.executionEvidenceDigest??"0".repeat(64),verifiedAt:Q?.executedAt??ie(s),verdict:"verified",reasonCodes:Object.freeze([me?"checkpoint-p205-transient-verified":pe?"checkpoint-git-maintenance-verified":"checkpoint-legacy-bounded-verified",...N.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return u()}}function vt(t,e,i){const r=te(t);return!!(r&&r.schemaVersion===1&&r.kind==="p205_transient_execution_authority"&&r.contract==="P205-CI-02"&&r.command===V&&r.graphRevision===i&&l(r.resultDigest)&&l(r.executionEvidenceDigest)&&r.executionHeadSha===e&&S(e))}function te(t){return t&&typeof t=="object"?Le.get(t):void 0}function yi(t){const e=te(t);return e?Object.freeze({executionHeadSha:e.executionHeadSha,graphRevision:e.graphRevision,manifestDigest:e.manifestDigest,gateIds:Object.freeze([...e.gateIds]),resultDigest:e.resultDigest,executedAt:e.executedAt,executionEvidenceDigest:e.executionEvidenceDigest}):void 0}function bi(t,e,i){const r=te(t);return!!(r&&r.executionHeadSha===e&&r.graphRevision===i&&r.command===V)}function Ge(t){const e=ht[t.storyId],i=typeof t.checkpoint.claimRevision=="string"?t.checkpoint.claimRevision:void 0,r=t.storyId==="P174.03.811759"||t.storyId==="P174.03.685003",n=Dt(t.authorizedWriteSet),a=n.length>0&&n.length===t.authorizedWriteSet.length&&t.changedPaths.every(o=>n.some(s=>Et(s,o)));if(e&&t.epicId==="P174"&&t.executionBranch==="epic/P174"&&t.baseSha===e.baseSha&&t.headSha===e.headSha&&t.checkpoint.graphRevision===e.graphRevision&&t.commitBodyDigest===e.commitBodyDigest&&t.changedPathsDigest===e.changedPathsDigest&&(r?i===void 0:i===e.effectiveClaimRevision))return t.authorizedWriteSet.length>0&&(!a||!He(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(i!==void 0&&!(!i||!l(i))&&!(!a||!He(i,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:i})}function Dt(t){const e=t.map(i=>i.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(i=>!de(i))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function xt(t,e){try{const i=JSON.parse(Pe(p(t,".neocortex","state.json"),"utf8")),r=f(i.stories),n=f(r?.[e]),a=pt(t),o=f(a.stories[e]?.checkpoint)??f(n?.checkpoint);return _t(e,n,o)}catch{return[]}}function _t(t,e,i){const r=Array.isArray(e?.files_to_modify)?e.files_to_modify.filter(n=>typeof n=="string"):[];if(!i?.dispatchId||!i.bundleId)return r;try{return st({...e,id:t,files_to_modify:r})}catch{return[]}}function He(t,e){return t===y("sha256").update(e.join("\0")).digest("hex")||t===y("sha256").update(JSON.stringify(e)).digest("hex")}function Et(t,e){return t===e||t.endsWith("/")&&e.startsWith(t)}function wi(t,e,i,r,n,a){try{if(!ze(e,i,r,n))return!1;const o=f(e),s=f(o.qaReceipt),u=f(o.reviewReceipt),c=String(o.headSha),d=String(o.baseSha),b=q(t,["rev-parse",`refs/heads/${n}`]).trim();if(X("git",["merge-base","--is-ancestor",c,b],{cwd:t,stdio:"ignore"}),q(t,["rev-parse",`${c}^`]).trim()!==d||q(t,["rev-list","--count",`${d}..${c}`]).trim()!=="1")return!1;const g=q(t,["show","--no-patch","--format=%H%n%P%n%B",c]),m=q(t,["diff-tree","--no-commit-id","--name-only","-r","-z",c]).split("\0").filter(Boolean);if(m.length===0||m.some(C=>!de(C)))return!1;const v=Ge({checkpoint:o,storyId:i,epicId:r,executionBranch:n,baseSha:d,headSha:c,changedPaths:m,authorizedWriteSet:a,commitBodyDigest:y("sha256").update(g).digest("hex"),changedPathsDigest:y("sha256").update([...m].sort().join("\0")).digest("hex")});return!(v?.mode!=="legacy-migration"||!v.binding||s.sourceEvidenceDigest!==v.binding.qaDigest||s.receiptRef!==`story-qa:${v.binding.qaDigest}`||u.sourceEvidenceDigest!==v.binding.reviewDigest||u.receiptRef!==`story-review:${v.binding.reviewDigest}`||u.qaReceiptRef!==s.receiptRef)}catch{return!1}}function It(t){return y("sha256").update(["local-yolo-tdd-git-immutable-v1",t.storyId,t.baseSha,t.headSha,t.bundleDigest,t.graphRevision,y("sha256").update(t.commitBody).digest("hex"),y("sha256").update([...t.changedPaths].sort().join("\0")).digest("hex")].join("\0")).digest("hex")}function Rt(t){return y("sha256").update(["local-yolo-tdd-p205-execution-v2",V,t.gitEvidenceDigest,t.headSha,t.graphRevision,t.manifestDigest,t.gateIds.join(","),t.resultDigest].join("\0")).digest("hex")}function At(t){const e=f(t.value);return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:t.storyId,epicId:t.epicId,branch:t.executionBranch,baseSha:S(e?.baseSha)?String(e?.baseSha):"0".repeat(40),headSha:S(e?.headSha)?String(e?.headSha):"0".repeat(40),aggregateHeadSha:"0".repeat(40),commitBodyDigest:"0".repeat(64),changedPathsDigest:"0".repeat(64),claimVerification:"canonical",effectiveClaimRevision:"0".repeat(64),command:V,manifestDigest:"0".repeat(64),gateIds:Object.freeze([]),resultDigest:"0".repeat(64),graphRevision:"0".repeat(64),executionEvidenceDigest:"0".repeat(64),sourceEvidenceDigest:"0".repeat(64),verifiedAt:ie(t.verifiedAt),verdict:t.verdict,reasonCodes:Object.freeze([t.reasonCode]),publicSafe:!0})}function q(t,e){return X("git",[...e],{cwd:t,encoding:"utf8",maxBuffer:32*1024*1024})}function ie(t){return Number.isFinite(Date.parse(t))?new Date(Date.parse(t)).toISOString():new Date().toISOString()}async function Si(t,e){if(Be[e.storyId]!==e.headSha)return;const i=[".neocortex/state.json",`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,`.neocortex/stories/${e.storyId}/review.md`,`docs/stories/${e.storyId}.story.md`];try{const r=(await $("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:t,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await $("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:t}),(await $("git",["rev-parse",`${e.headSha}^`],{cwd:t,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await $("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:t,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(y("sha256").update(a).digest("hex")!==e.bundleDigest)return;const o=String((await $("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await $("git",["show","--no-patch","--format=%s",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const c=String((await $("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!i.every(R=>c.includes(R))||c.some(R=>!de(R)))return;const d=await Promise.all(i.map(async R=>String((await $("git",["show",`${e.headSha}:${R}`],{cwd:t,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),b=JSON.parse(d[0]),g=f(b.stories),m=f(b.epics),v=f(g?.[e.storyId]),C=f(m?.[e.epicId]),O=Array.isArray(v?.steps_completed)?v.steps_completed:[],k=JSON.parse(d[1]);return v?.status!=="done"||!O.includes(gt)||!O.includes(lt)||C?.branch_mode!=="epic"||C.execution_branch!==e.executionBranch||k.storyId!==e.storyId||k.status!=="qa-passed"||k.safeToContinueYoloop!==!0||!Array.isArray(k.blockingChecks)||k.blockingChecks.length!==0||!d[2].includes(e.storyId)||!/P205[\s\S]{0,80}(pass|aprov)/i.test(d[2])||!d[3].includes(e.storyId)||!/approved|aprovado/i.test(d[3])||!d[4].includes(e.storyId)?void 0:`legacy-direct-yolo:${y("sha256").update(["legacy-direct-yolo-recovery-v1",e.storyId,e.epicId,e.executionBranch,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,y("sha256").update(o).digest("hex"),y("sha256").update([...c].sort().join("\0")).digest("hex"),...d.map(R=>y("sha256").update(R).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function kt(t){const e=await xe(t),i=p(e,ce),r=p(i,oe);if(L(i)&&(await j(i,"directory"),await Y(i)!==i))throw new Error("git-lifecycle-runtime-directory-symlink");return L(r)?r:p(e,Se)}async function Te(t){return Ke(await xe(t))}async function Ct(t,e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)||e.includes(".."))throw new Error("git-lifecycle-private-child-invalid");const i=h(t);await F(i);const r=h(i,e);return U(i,r),L(r)||await $e(i,e),await F(r,i),await F(i),r}async function w(t,e){const i=h(e),r=h(t);U(i,r),await F(i),await F(r,i)}async function vi(t,e){await M(t,e)}async function J(t,e,i){const r=h(e),n=h(t);U(r,n);try{await w(n,r)}catch(o){if(I(o,"ENOENT"))return!1;throw o}const a=h(r,`${n.slice(r.length+1)}.remove.${process.pid}.${Date.now()}.${ye(4).toString("hex")}`);return U(r,a),await Z(r,_(n),_(a)),await w(a,r),i&&!await i(a)?(await re(a,n,r).catch(()=>{}),!1):(await ut(r,_(a)),!0)}async function re(t,e,i){await w(t,i);try{await be(e);return}catch(r){if(!I(r,"ENOENT"))throw r}await Z(i,_(t),_(e)),await w(e,i)}async function A(t){try{await w(t,T(t));const e=p(t,"owner.json");await M(e,t);const i=await H(e);return await M(e,t),y("sha256").update(i).digest("hex")}catch{return}}async function Di(t,e){const i=await Te(t),r=await Ct(i,"leases"),n=p(r,"integration"),a=`${n}.recovery`;if(L(a)){await w(a,r);const c=await Fe(a),d=await A(a);if(c===void 0||ue(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!d||!await J(a,r,async b=>await A(b)===d))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const o=ie(e.createdAt??new Date().toISOString()),s=Object.freeze({schemaVersion:1,kind:e.kind,storyId:e.storyId,sessionId:e.sessionId,idempotencyKey:e.idempotencyKey,pid:process.pid,createdAt:o,expiresAt:ie(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??ye(16).toString("hex")});if(Date.parse(s.expiresAt)<=Date.parse(s.createdAt))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const u=async()=>{await F(r,i);try{return await Ne(r,_(n),`${JSON.stringify(s)}
4
- `),await w(n,r),await M(p(n,"owner.json"),n),!0}catch(c){throw I(c,"EEXIST")||await J(n,r).catch(()=>{}),c}};try{return await u(),{ok:!0,owner:s,path:n}}catch(c){if(!I(c,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const c=await ne(n),d=c?void 0:await Fe(n);if(c&&Me(c,s))return{ok:!0,owner:c,path:n};if(c&&Date.parse(c.expiresAt)>Date.now()&&(c.persistent||ue(c.pid))||d!==void 0&&ue(d)||!c&&d===void 0&&await Ze(n))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};const g=await A(n);if(!g)return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const m=`${n}.stale.${process.pid}.${Date.now()}`;await Z(r,_(n),_(m));try{if(await w(m,r),await A(m)!==g)return await re(m,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await u()}finally{await J(m,r,async v=>await A(v)===g).catch(()=>{})}return{ok:!0,owner:s,path:n}}catch(c){return{ok:!1,reasonCode:I(c,"EEXIST")||I(c,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function xi(t,e){const i=await ne(t);return!!(i&&De(i,e)&&Date.parse(i.expiresAt)>Date.now())}async function Ot(t,e){try{const i=T(t);await w(t,i);const r=await ne(t);if(!r||!De(r,e))return!1;const n=await A(t);if(!n)return!1;const a=`${t}.release.${process.pid}.${Date.now()}`;await Z(i,_(t),_(a)),await w(a,i);const o=await ne(a);return!o||!De(o,e)||await A(a)!==n?(await re(a,t,i).catch(()=>{}),!1):J(a,i,async s=>await A(s)===n)}catch(i){if(I(i,"ENOENT"))return!1;throw i}}function Pt(t){return y("sha256").update(["git-lifecycle-physical-owner-v1",t.kind,t.storyId,t.sessionId,t.idempotencyKey,String(t.pid),t.createdAt,t.expiresAt,t.persistent?"persistent":"ephemeral",t.ownerNonce].join("\0")).digest("hex")}async function _i(t,e){if(!K(e.storyId)||!E(e.idempotencyKey)||!l(e.ownerDigest))return"foreign";const i=await Te(t),r=p(i,"leases"),n=p(r,"integration");if(!L(n))return"absent";try{await w(r,i),await w(n,r);const a=await ne(n);return!a||a.kind!=="direct"||a.storyId!==e.storyId||a.sessionId!==e.idempotencyKey||a.idempotencyKey!==e.idempotencyKey||a.persistent!==!0||Pt(a)!==e.ownerDigest?"foreign":await Ot(n,a)?"released":"foreign"}catch{return"foreign"}}async function ne(t){try{await w(t,T(t));const e=p(t,"owner.json");await M(e,t);const i=JSON.parse(await H(e,"utf8"));return i.schemaVersion!==1||i.kind!=="direct"&&i.kind!=="continuous"||!K(i.storyId)||!E(i.sessionId)||!E(i.idempotencyKey)||!Number.isSafeInteger(i.pid)||Number(i.pid)<=0||!x(i.createdAt)||!x(i.expiresAt)||typeof i.persistent!="boolean"||typeof i.ownerNonce!="string"||!/^[a-f0-9]{32}$/.test(i.ownerNonce)?void 0:i}catch{return}}async function Fe(t){try{await w(t,T(t));const e=p(t,"owner.json");await M(e,t);const i=JSON.parse(await H(e,"utf8"));return Number.isSafeInteger(i.pid)&&Number(i.pid)>0?Number(i.pid):void 0}catch{return}}function Me(t,e){return t.kind===e.kind&&t.storyId===e.storyId&&t.sessionId===e.sessionId&&t.idempotencyKey===e.idempotencyKey&&t.expiresAt===e.expiresAt&&t.persistent===e.persistent}function De(t,e){return Me(t,e)&&t.schemaVersion===e.schemaVersion&&t.pid===e.pid&&t.createdAt===e.createdAt&&t.ownerNonce===e.ownerNonce}async function xe(t){const e=await Y(t),r=(await $("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim(),n=ee(r)?h(r):h(e,r),a=await Y(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await $t(a);const s=(await $("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((ee(s)?h(s):h(e,s))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function Ke(t){const e=p(t,ce);if(L(e)||await $e(t,ce),await j(e,"directory"),await Y(e)!==e)throw new Error("git-lifecycle-runtime-directory-symlink");return e}async function We(t,e={}){try{return await j(t,"file"),_e(JSON.parse(await H(t,"utf8")))}catch(i){if(I(i,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}throw i}}async function Nt(t){try{await j(t,"file")}catch(e){if(I(e,"ENOENT"))return;throw e}}async function j(t,e){const i=await be(t);if(i.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!i.isFile():!i.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(se()&&i.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(se()&&(i.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function U(t,e){const i=h(t),r=h(e),n=ct(i,r);if(!n||n.startsWith("..")||ee(n)||T(r)!==i)throw new Error("git-lifecycle-private-path-escape")}async function F(t,e){const i=h(t);if(e&&U(h(e),i),await j(i,"directory"),h(await Y(i))!==i)throw new Error("git-lifecycle-directory-substituted");if(e){const r=h(e);if(await j(r,"directory"),h(await Y(r))!==r)throw new Error("git-lifecycle-directory-parent-substituted")}}async function M(t,e){const i=h(t);if(U(h(e),i),await F(h(e)),await j(i,"file"),h(await Y(i))!==i)throw new Error("git-lifecycle-file-substituted")}function Ye(t,e){const i=Oe(t);if(i.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!i.isFile():!i.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(se()&&i.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(se()&&(i.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function $t(t){const e=await be(t);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function Vt(t){const e=Oe(t);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function se(t=process.platform){return t!=="win32"&&typeof process.getuid=="function"}function _e(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("git-lifecycle-runtime-invalid");const e=t;D(e,["schemaVersion","revision","epics","stories"],"git-lifecycle-runtime-unknown-field");const i=f(e.epics),r=f(e.stories);if(e.schemaVersion!==1||!Number.isSafeInteger(e.revision)||Number(e.revision)<0||!i||!r||Object.values(i).some(n=>!f(n))||Object.values(r).some(n=>!f(n)))throw new Error("git-lifecycle-runtime-invalid");for(const[n,a]of Object.entries(i))if(!K(n)||!qt(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!K(n)||!n.includes(".")||!jt(a,n))throw new Error("git-lifecycle-runtime-story-invalid");return e}const Bt=["branch_mode","execution_branch","origin_branch","branch_lease","origin_binding","graph_revision","aggregate_qa_receipt","terminal_git_receipt","physicalMergeStatus","pr_number","git_reconciliation_receipts","git_reconciliation_debt"],Lt=["checkpoint","status","last_step","steps_completed"];function qt(t){return D(t,Bt,"git-lifecycle-runtime-epic-unknown-field"),(t.branch_mode===void 0||t.branch_mode==="epic")&&(t.execution_branch===void 0||W(t.execution_branch))&&(t.origin_branch===void 0||W(t.origin_branch))&&(t.branch_lease===void 0||t.branch_lease===null||zt(t.branch_lease))&&(t.origin_binding===void 0||t.origin_binding===null||Tt(t.origin_binding))&&(t.graph_revision===void 0||l(t.graph_revision))&&(t.aggregate_qa_receipt===void 0||t.aggregate_qa_receipt===null||Ft(t.aggregate_qa_receipt))&&(t.terminal_git_receipt===void 0||t.terminal_git_receipt===null||Mt(t.terminal_git_receipt))&&(t.physicalMergeStatus===void 0||["merged","pushed","denied_external_gate","blocked_local_or_repo","not_attempted"].includes(String(t.physicalMergeStatus)))&&(t.pr_number===void 0||t.pr_number===null||Number.isSafeInteger(t.pr_number)&&Number(t.pr_number)>0)&&(t.git_reconciliation_receipts===void 0||Qt(t.git_reconciliation_receipts))&&(t.git_reconciliation_debt===void 0||Zt(t.git_reconciliation_debt))}function jt(t,e){return D(t,Lt,"git-lifecycle-runtime-story-unknown-field"),(t.checkpoint===void 0||t.checkpoint===null||Je(t.checkpoint,e))&&(t.status===void 0||E(t.status))&&(t.last_step===void 0||t.last_step===null||E(t.last_step))&&(t.steps_completed===void 0||B(t.steps_completed,128))}function zt(t){const e=f(t);return e?(D(e,["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt","handoffGrant","handoffConsumption"],"git-lifecycle-runtime-lease-unknown-field"),e.schemaVersion===1&&K(e.ownerStoryId)&&E(e.sessionId)&&E(e.idempotencyKey)&&x(e.acquiredAt)&&x(e.expiresAt)&&Date.parse(String(e.expiresAt))>Date.parse(String(e.acquiredAt))&&(e.handoffGrant===void 0||Gt(e.handoffGrant,e))&&(e.handoffConsumption===void 0||Ht(e.handoffConsumption,e))):!1}function Gt(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","expiresAt"],"git-lifecycle-runtime-handoff-grant-unknown-field"),i.schemaVersion===1&&i.kind==="direct-yolo-setup-handoff"&&i.storyId===e.ownerStoryId&&i.fromSessionId===e.sessionId&&l(i.tokenDigest)&&l(i.bundleDigest)&&l(i.claimRevision)&&x(i.expiresAt)&&Date.parse(String(i.expiresAt))<=Date.parse(String(e.expiresAt))):!1}function Ht(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","consumedBySessionId","consumedAt"],"git-lifecycle-runtime-handoff-consumption-unknown-field"),i.schemaVersion===1&&i.kind==="direct-yolo-setup-handoff-consumption"&&i.state==="consumed"&&i.storyId===e.ownerStoryId&&E(i.fromSessionId)&&l(i.tokenDigest)&&l(i.bundleDigest)&&l(i.claimRevision)&&i.consumedBySessionId===e.sessionId&&x(i.consumedAt)):!1}function Tt(t){const e=f(t);return e?(D(e,["schemaVersion","originBranch","originHeadSha","executionBranch","capturedFromCurrentCheckout","capturedAt"],"git-lifecycle-runtime-origin-unknown-field"),e.schemaVersion===1&&W(e.originBranch)&&W(e.executionBranch)&&e.originBranch!==e.executionBranch&&S(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&x(e.capturedAt)):!1}function Ft(t){const e=f(t);if(!e)return!1;D(e,["schemaVersion","evidenceVersion","producer","contract","command","verdict","executionHeadSha","graphRevision","manifestDigest","resultDigest","checkedAt","receiptRef","gateIds"],"git-lifecycle-runtime-aggregate-qa-unknown-field");const i=e.evidenceVersion==="p205-execution-v2"&&e.producer==="local-yolo-tdd"&&e.contract==="P205-CI-02"&&e.command===V&&l(e.manifestDigest)&&l(e.resultDigest),r=e.evidenceVersion===void 0&&e.producer===void 0&&e.contract===void 0&&e.command===void 0&&e.manifestDigest===void 0&&e.resultDigest===void 0;return e.schemaVersion===1&&(i||r)&&e.verdict==="passed"&&S(e.executionHeadSha)&&l(e.graphRevision)&&x(e.checkedAt)&&fe(e.receiptRef)&&B(e.gateIds,128,!0)}function Mt(t){const e=f(t);return e?(D(e,["schemaVersion","epicId","executionBranch","originBranch","baseSha","executionHeadSha","mergeSha","pushedSha","strategy","prNumber","physicalStatus","localGateReceiptRefs","idempotencyKey","attemptStartedAt","completedAt","retryEligible","reasonCodes","publicSafe","candidateQa","providerGuard"],"git-lifecycle-runtime-terminal-receipt-unknown-field"),e.schemaVersion===1&&K(e.epicId)&&W(e.executionBranch)&&W(e.originBranch)&&S(e.baseSha)&&S(e.executionHeadSha)&&(e.mergeSha===void 0||S(e.mergeSha))&&(e.pushedSha===void 0||S(e.pushedSha))&&(e.strategy==="direct"||e.strategy==="single_pr")&&(e.candidateQa===void 0||Wt(e.candidateQa,e))&&(e.providerGuard===void 0||Kt(e.providerGuard,e))&&(e.prNumber===void 0||Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0)&&["prepared","merged","pushed","denied_external_gate","blocked_local_or_repo"].includes(String(e.physicalStatus))&&B(e.localGateReceiptRefs,128,!0)&&E(e.idempotencyKey)&&x(e.attemptStartedAt)&&(e.completedAt===void 0||x(e.completedAt))&&typeof e.retryEligible=="boolean"&&B(e.reasonCodes,128)&&e.publicSafe===!0):!1}function Kt(t,e){const i=f(t);if(!i)return!1;D(i,["schemaVersion","provider","mode","source","prHeadSha","originHeadSha","checkedAt","publicSafe"],"git-lifecycle-runtime-provider-guard-unknown-field");const r=i.mode==="recovered_exact_tree"?i.source==="physical_recovery":i.mode==="strict_up_to_date_expected_head"&&["branch_protection","ruleset","branch_protection_and_ruleset"].includes(String(i.source));return i.schemaVersion===1&&i.provider==="github"&&r&&e.strategy==="single_pr"&&e.physicalStatus==="pushed"&&Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0&&S(i.prHeadSha)&&i.prHeadSha===e.mergeSha&&S(i.originHeadSha)&&i.originHeadSha===e.baseSha&&x(i.checkedAt)&&i.publicSafe===!0}function Wt(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","contract","command","originHeadSha","executionHeadSha","mergeSha","treeSha","graphRevision","manifestDigest","resultDigest","gateIds","checkedAt","receiptRef"],"git-lifecycle-runtime-merge-candidate-unknown-field"),i.schemaVersion===1&&i.kind==="epic_merge_candidate_qa"&&i.contract==="P205-CI-02"&&i.command===V&&S(i.originHeadSha)&&i.originHeadSha===e.baseSha&&S(i.executionHeadSha)&&i.executionHeadSha===e.executionHeadSha&&S(i.mergeSha)&&i.mergeSha===e.mergeSha&&S(i.treeSha)&&l(i.graphRevision)&&l(i.manifestDigest)&&l(i.resultDigest)&&B(i.gateIds,128,!0)&&x(i.checkedAt)&&fe(i.receiptRef)):!1}function Je(t,e){const i=f(t);if(!i)return!1;D(i,["schemaVersion","storyId","epicId","branch","baseSha","headSha","commits","idempotencyKey","dispatchId","bundleId","bundleDigest","graphRevision","claimRevision","receiptRefs","qaVerdict","reviewVerdict","qaReceipt","reviewReceipt","recordedAt"],"git-lifecycle-runtime-checkpoint-unknown-field");const r=String(e).split(".")[0];return i.schemaVersion===1&&i.storyId===e&&i.epicId===r&&W(i.branch)&&S(i.baseSha)&&S(i.headSha)&&i.baseSha!==i.headSha&&Xt(i.commits)&&i.commits.length===1&&i.commits[0]===i.headSha&&E(i.idempotencyKey)&&(i.dispatchId===void 0||l(i.dispatchId))&&(i.bundleId===void 0||l(i.bundleId))&&l(i.bundleDigest)&&l(i.graphRevision)&&(i.claimRevision===void 0||l(i.claimRevision))&&B(i.receiptRefs,256,!0)&&(i.qaVerdict==="passed"||i.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(i.reviewVerdict))&&Yt(i.qaReceipt,i)&&(i.reviewVerdict==="pending"?i.reviewReceipt===void 0:Jt(i.reviewReceipt,i))&&x(i.recordedAt)}function Yt(t,e){const i=f(t);return i?(D(i,["schemaVersion","kind","producer","evidenceVersion","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","contract","command","manifestDigest","gateIds","resultDigest","sourceEvidenceDigest","verdict","checkedAt","receiptRef"],"git-lifecycle-runtime-story-qa-unknown-field"),i.schemaVersion===1&&i.kind==="story_qa_evidence"&&i.producer==="local-yolo-tdd"&&(i.evidenceVersion===void 0||i.evidenceVersion==="git-immutable-v1"||i.evidenceVersion==="p205-execution-v2"&&i.contract==="P205-CI-02"&&i.command===V&&l(i.manifestDigest)&&B(i.gateIds,32,!0)&&l(i.resultDigest))&&Qe(i,e)&&l(i.sourceEvidenceDigest)&&i.verdict===e.qaVerdict&&(i.verdict==="passed"||i.verdict==="blocked")&&x(i.checkedAt)&&fe(i.receiptRef)&&e.receiptRefs.includes(i.receiptRef)):!1}function Jt(t,e){const i=f(t),r=f(e.qaReceipt);return!i||!r?!1:(D(i,["schemaVersion","kind","producer","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","sourceEvidenceDigest","qaReceiptRef","verdict","reviewedAt","receiptRef"],"git-lifecycle-runtime-story-review-unknown-field"),i.schemaVersion===1&&i.kind==="story_review_evidence"&&i.producer==="root-commit-range-review"&&Qe(i,e)&&l(i.sourceEvidenceDigest)&&i.qaReceiptRef===r.receiptRef&&i.receiptRef!==r.receiptRef&&(i.verdict==="approved"||i.verdict==="changes-requested")&&(i.verdict==="approved"?e.reviewVerdict==="approved":e.reviewVerdict==="changes-requested")&&x(i.reviewedAt)&&Date.parse(String(i.reviewedAt))>=Date.parse(String(r.checkedAt))&&fe(i.receiptRef)&&e.receiptRefs.includes(i.receiptRef))}function Qe(t,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(i=>t[i]===e[i])}function Qt(t){return!Array.isArray(t)||t.length>1024?!1:t.every(e=>{const i=f(e);return i?(D(i,["schemaVersion","resourceId","action","outcome","idempotencyKey","reasonCodes","recordedAt","publicSafe"],"git-lifecycle-runtime-reconciliation-receipt-unknown-field"),i.schemaVersion===1&&E(i.resourceId)&&["no_op","delete_local_branch","delete_remote_branch","close_pull_request"].includes(String(i.action))&&["applied","already_absent","dry_run","failed"].includes(String(i.outcome))&&E(i.idempotencyKey)&&B(i.reasonCodes,128)&&x(i.recordedAt)&&i.publicSafe===!0):!1})}function Zt(t){return!Array.isArray(t)||t.length>1024?!1:t.every(e=>{const i=f(e);return i?(D(i,["schemaVersion","resourceId","action","managed","reasonCodes","evidence","publicSafe"],"git-lifecycle-runtime-reconciliation-debt-unknown-field"),i.schemaVersion===1&&E(i.resourceId)&&i.action==="preserve"&&typeof i.managed=="boolean"&&B(i.reasonCodes,128)&&B(i.evidence,16)&&i.publicSafe===!0):!1})}function D(t,e,i){const r=new Set(e);if(Object.keys(t).some(n=>!r.has(n)))throw new Error(i)}function K(t){return typeof t=="string"&&/^P[1-9][0-9]*(?:\.[0-9]+)*$/.test(t)}function Ut(t){const e=f(t);return e?Object.keys(e).length===9&&e.schemaVersion===1&&e.kind==="git_lifecycle_graph_authority"&&e.producer==="server-continuous-yoloop-v1"&&(e.source==="yolo"||e.source==="yoloop")&&K(e.epicId)&&K(e.storyId)&&String(e.storyId).startsWith(`${String(e.epicId)}.`)&&W(e.executionBranch)&&typeof e.graphRevision=="string"&&/^[a-f0-9]{64}$/.test(e.graphRevision)&&e.publicSafe===!0:!1}function W(t){return typeof t=="string"&&/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(t)&&!t.includes("..")&&!t.includes("//")&&!t.includes("@{")&&!t.endsWith("/")&&!t.endsWith(".")&&!t.split("/").some(e=>!e||e.startsWith(".")||e.endsWith(".lock"))}function de(t){return t.length>0&&t.length<=1024&&!ee(t)&&!t.includes("\0")&&!t.replaceAll("\\","/").split("/").includes("..")}function E(t){return typeof t=="string"&&t.length>0&&t.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(t)&&!t.includes("..")}function fe(t){return E(t)}function S(t){return typeof t=="string"&&/^[a-f0-9]{40,64}$/i.test(t)}function l(t){return typeof t=="string"&&/^[a-f0-9]{64}$/i.test(t)}function x(t){return typeof t=="string"&&t.length<=64&&Number.isFinite(Date.parse(t))}function B(t,e,i=!1){return Array.isArray(t)&&t.length<=e&&(!i||t.length>0)&&t.every(E)}function Xt(t){return Array.isArray(t)&&t.length>0&&t.length<=256&&t.every(S)}function Ee(){return{schemaVersion:1,revision:0,epics:{},stories:{}}}async function ei(t){const e=T(t),i={pid:process.pid,nonce:ye(16).toString("hex")},r=async()=>{await F(e),await Ne(e,_(t),JSON.stringify(i));try{await w(t,e),await M(p(t,"owner.json"),t)}catch(n){throw await J(t,e).catch(()=>{}),n}};try{await r()}catch(n){if(!I(n,"EEXIST"))throw n;await j(t,"directory");const a=await Ie(t);if(a!==void 0&&ue(a.pid))throw new Error("git-lifecycle-runtime-lock-active");if(a===void 0&&await Ze(t))throw new Error("git-lifecycle-runtime-lock-active");const o=await A(t);if(!o)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const s=`${t}.stale.${process.pid}.${Date.now()}`;await Z(e,_(t),_(s));try{if(await w(s,e),await A(s)!==o)throw await re(s,t,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await J(s,e,async u=>await A(u)===o).catch(()=>{})}}return i}async function ti(t,e){const i=T(t);try{await w(t,i);const r=await Ie(t);if(!r||!Ue(r,e))return!1;const n=await A(t);if(!n)return!1;const a=`${t}.release.${process.pid}.${Date.now()}`;await Z(i,_(t),_(a)),await w(a,i);const o=await Ie(a);return!o||!Ue(o,e)||await A(a)!==n?(await re(a,t,i).catch(()=>{}),!1):J(a,i,async s=>await A(s)===n)}catch(r){if(I(r,"ENOENT"))return!1;throw r}}async function Ze(t){try{return Date.now()-(await at(t)).mtimeMs<3e4}catch{return!0}}async function Ie(t){try{await w(t,T(t));const e=p(t,"owner.json");await M(e,t);const i=JSON.parse(await H(e,"utf8"));return Number.isSafeInteger(i.pid)&&Number(i.pid)>0&&(i.nonce===void 0||typeof i.nonce=="string"&&/^[a-f0-9]{32}$/.test(i.nonce))?{pid:Number(i.pid),...typeof i.nonce=="string"?{nonce:i.nonce}:{}}:void 0}catch{return}}function Ue(t,e){return t.pid===e.pid&&t.nonce!==void 0&&t.nonce===e.nonce}function ue(t){try{return process.kill(t,0),!0}catch(e){return I(e,"EPERM")}}function f(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function I(t,e){return t instanceof Error&&"code"in t&&t.code===e}export{ce as GIT_LIFECYCLE_RUNTIME_DIRECTORY,oe as GIT_LIFECYCLE_RUNTIME_FILE,Be as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,ht as LEGACY_P174_CHECKPOINT_MIGRATIONS,V as P205_COMPLETE_COMMAND,Di as acquireGitLifecyclePhysicalIntegrationLock,bt as applyGitLifecycleRuntimeOverlay,w as assertGitLifecyclePrivateDirectory,vi as assertGitLifecyclePrivateFile,Pt as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,It as computeImmutableStoryQaEvidenceDigest,Si as computeLegacyDirectYoloRecoveryReceiptRef,Rt as computeP205StoryQaEvidenceDigest,Ct as ensureGitLifecyclePrivateChildDirectory,li as ensureGitLifecycleRuntimeInitialized,wt as ensureRuntimeEpic,mi as ensureRuntimeStory,gi as executeP205TransientAuthority,Te as gitLifecycleRuntimeDirectory,_t as gitLifecycleStoryWriteSet,ze as isAcceptedGitLifecycleStoryCheckpoint,qe as mutateGitLifecycleRuntime,bi as p205TransientAuthorityMatchesAggregate,hi as persistGitLifecycleGraphAuthority,se as posixSecurityAvailable,yi as projectP205TransientExecutionEvidence,ve as readGitLifecycleRuntime,pt as readGitLifecycleRuntimeSync,Ot as releaseGitLifecyclePhysicalIntegrationLock,_i as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,J as removeGitLifecyclePrivateDirectory,pi as verifyAcceptedGitLifecycleStoryCheckpoint,St as verifyAcceptedGitLifecycleStoryCheckpointSync,xi as verifyGitLifecyclePhysicalIntegrationLock,wi as verifyLegacyCheckpointMigrationCandidateSync};
1
+ import{execFile as rt,execFileSync as te}from"node:child_process";import{createHash as b,randomBytes as ye}from"node:crypto";import{lstat as be,open as nt,readFile as T,realpath as J,stat as at}from"node:fs/promises";import{existsSync as q,lstatSync as Oe,readFileSync as Pe,realpathSync as we}from"node:fs";import{basename as R,dirname as F,isAbsolute as ie,join as y,relative as ct,resolve as p}from"node:path";import{promisify as ot}from"node:util";import{publicWriteSet as st}from"../../../shared/dist/yoloop/public-story-write-set.js";import{resolveBranchUnit as dt}from"../../../shared/dist/yoloop/branch-unit.js";import{anchoredAtomicWriteFile as ft,anchoredCreateOwnedDirectory as Ne,anchoredEnsureDirectory as $e,anchoredExecuteGit as ut,anchoredExecuteNode as Ve,anchoredRemoveDirectory as gt,anchoredRenameDirectory as X}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as lt,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as ht}from"./git-lifecycle-step-ids.js";const N=ot(rt),oe="neocortex-yoloop",se="runtime.json",B="node scripts/test-root.mjs --gate complete",Be=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),mt=Object.freeze({"P174.03.811759":Object.freeze({baseSha:"749c8fc732deaf26c81a8e08cc94b83c8cf0f5ba",headSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",commitBodyDigest:"b4fc759a49765fd8c0b3d0f5d1c333c2a4bf28d324e83eedabb12f9530df3738",changedPathsDigest:"11f54704f5007f6139159419cfd7781f908b1502e117365c6d84011384579ed2",qaDigest:"f1100775e21f5d0d990f77303a2a06d936908f016983e32a63316d81aee6b9fc",reviewDigest:"50400bbcddb6f02408837cf99077de5d3af8c84822ab23a8b5499c338af7103a"}),"P174.03.685003":Object.freeze({baseSha:"84162456d9cbe5000ffd0ed3eb3d0e88cfeba499",headSha:"272a7fee89e4b9324d35701df1c83b671fa96299",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",commitBodyDigest:"e97966e26ce3ba31d5951b9fdac67808c88c1fd8be7ec1e73982f3f1cc7ffd81",changedPathsDigest:"6cc3c9033f1c4711dcbe3c676d1d7f9906614c7d6e95228e843d1c63cefbc641",qaDigest:"7439329a93321f39fb6b0de0a41c22e58373a399f9048e362dff4ffa6f1a7d89",reviewDigest:"1b2d12262e84acf9da7d06149a0effb11274ebdc986affbfd47635b855ec7135"}),"P174.03.029264":Object.freeze({baseSha:"272a7fee89e4b9324d35701df1c83b671fa96299",headSha:"339141be7339a0edf55710cbccb6e6558f514792",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",commitBodyDigest:"0f269a00dcd168a6f548ff10dfa667b193c948ac9c7211f5cb11a0561757c371",changedPathsDigest:"1053bb2baf487e38fa28d7e8cfb872c5c4da66802534ee226bbc2c7455a6a5ab",qaDigest:"ef0fd2c6e216557825cd8521ccb2f9960a3af48f18e7a5ada441bee8bfda400b",reviewDigest:"372d0f4a2f32978c8b39f20167637b3917187edb75d49875e93200c4c5a19d0d"}),"P174.03.913359":Object.freeze({baseSha:"339141be7339a0edf55710cbccb6e6558f514792",headSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",commitBodyDigest:"89a6653197509e75246a758d2706876b337770571a1cac47d9d85ec96c196459",changedPathsDigest:"12b5cfba2667e8064309807776c1b323561dc8d853f9afe5f676007b8494b2b5",qaDigest:"c7d3762ad30e4f9356243df17a1dd7123cbf1b660808d68176f44d1cd5da6449",reviewDigest:"e4ecf577e174fd66f31aa4a0113ab672ced16b12ee531f6831aa533795145ba1"}),"P174.03.724350":Object.freeze({baseSha:"4ccc90b85c49b27f718090bf25bc452f1b84e5e3",headSha:"568e9464fb086304146b9eb4594281f91302aef1",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",commitBodyDigest:"b3032338bfcd6c9dc460e9426220a1966dedeff9968c4064fdd36a315560721b",changedPathsDigest:"c8b8b6b96edf9cea78925e2f961bd74069d77af03783a5368b8ac8025bf1fefe",qaDigest:"91f2f5b00935b1b04bb5d400df500cbc97c412072078b713c6e5ba8fda669bd0",reviewDigest:"9bc92069d3b3a76cc8b02d339d432690258be1376464b69e152ed8fd3d682f05"}),"P174.03.011976":Object.freeze({baseSha:"568e9464fb086304146b9eb4594281f91302aef1",headSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",commitBodyDigest:"b8a28392fac663dd614b695a49c894b7cab116d45722a42850e3b24e2aaf36f4",changedPathsDigest:"49b7f2a0a967b2ba4249615c6d08834445a60df95045352838808eb4d6743b21",qaDigest:"6eb4459a7d80c4a268fc931297e8156ed2a320584f8775f0787d91b42c0929d4",reviewDigest:"98b21de29f7cceeec73da19000c6c144395cce6eb699c6a82dfab505d4ab7b44"}),"P174.03.686659":Object.freeze({baseSha:"195599b1a99a99a8416c4c26c9ab9990847338a4",headSha:"0db3681a5dad4e25ce37d967c636eb9d54915556",graphRevision:"60b343b4b810e6d5abc3159275012b9ab9ab517f9d780e7550fa5b49be740445",effectiveClaimRevision:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",commitBodyDigest:"143257f4018ad773afc0c7280bd8aab8786851a9c20b65f8110881ff54656839",changedPathsDigest:"5c0fdbf820d677c288981b6f73f7d2d9a04ce7f4713687f12a2e984705244b8e",qaDigest:"6303dbf473e2815a3671aeb2c25528d8daba484b92a5a40d1eea5215e1f6763e",reviewDigest:"1bd6695846ed9340c8677cfa9b573880532187aeee487efaaa70577a0c94e7f2"})}),Se="neocortex-yoloop-runtime.json",pt="runtime.lock",Le=new WeakMap;async function hi(t,e){if(!D(e.headSha)||!h(e.graphRevision))throw new Error("p205-transient-binding-invalid");const i=e.anchoredWorkspace;if(i&&p(t)!==y(p(i.parent),i.name))throw new Error("p205-transient-anchor-binding-invalid");const r=async x=>i?(await ut(i.parent,i.name,i.identity,x)).toString("utf8"):String((await N("git",[...x],{cwd:t,encoding:"utf8",maxBuffer:8*1024*1024})).stdout),n=async()=>i?JSON.parse((await Ve(i.parent,i.name,i.identity,["-e","const fs=require('node:fs');process.stdout.write(JSON.stringify({manifest:fs.readFileSync('config/release-gates.v2.json','utf8'),runner:fs.readFileSync('scripts/test-root.mjs','utf8')}));"])).toString("utf8")):{manifest:await T(y(t,"config","release-gates.v2.json"),"utf8"),runner:await T(y(t,"scripts","test-root.mjs"),"utf8")};if((await r(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-mismatch");const{manifest:o,runner:s}=await n(),[u,c]=await Promise.all([r(["show",`${e.headSha}:config/release-gates.v2.json`]),r(["show",`${e.headSha}:scripts/test-root.mjs`])]);if(o!==u||s!==c)throw new Error("p205-transient-producer-dirty");const f=JSON.parse(o),w=Array.isArray(f.requiredCompleteClasses)?f.requiredCompleteClasses.filter(x=>typeof x=="string"&&/^[a-z0-9-]+$/.test(x)):[];if(f.contract!=="P205-CI-02"||w.length===0)throw new Error("p205-transient-manifest-invalid");const g=i?(await Ve(i.parent,i.name,i.identity,["scripts/test-root.mjs","--gate","complete"])).toString("utf8"):String((await N(process.execPath,["scripts/test-root.mjs","--gate","complete"],{cwd:t,encoding:"utf8",maxBuffer:64*1024*1024})).stdout),{manifest:m,runner:S}=await n();if(m!==o||S!==s)throw new Error("p205-transient-producer-raced");if((await r(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-raced");const $=b("sha256").update(o).digest("hex"),V=b("sha256").update(g).digest("hex"),_=ne(e.nowIso??new Date().toISOString()),l=b("sha256").update(["p205-transient-execution-v1",B,e.headSha,e.graphRevision,$,w.join(","),V,_].join("\0")).digest("hex"),G=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:B,executionHeadSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:$,gateIds:Object.freeze(w),resultDigest:V,executedAt:_,executionEvidenceDigest:l}),U=Object.freeze(Object.create(null));return Le.set(U,G),U}async function ve(t,e={}){const i=await Ct(t);return We(i,e)}function yt(t,e={}){let i;try{const r=te("git",["rev-parse","--git-common-dir"],{cwd:t,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=we(t),a=ie(r)?p(r):p(n,r),o=we(a);if(o!==a)throw new Error("git-lifecycle-common-dir-symlink");Bt(o);const s=y(o,oe),u=y(s,se);if(q(s)&&(Ye(s,"directory"),we(s)!==s))throw new Error("git-lifecycle-runtime-directory-symlink");i=q(u)?u:y(o,Se)}catch{if(e.required)throw new Error("git-lifecycle-common-dir-invalid");return Ee()}if(!q(i)){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}return Ye(i,"file"),xe(JSON.parse(Pe(i,"utf8")))}async function mi(t){try{await ve(t,{required:!0});return}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-missing")throw e}try{await qe(t,()=>{},{expectedRevision:0})}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-revision-conflict")throw e;await ve(t,{required:!0})}}async function pi(t,e,i=new Date().toISOString()){if(!Xt(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=y(p(t),".neocortex","state.json"),n=await T(r,"utf8"),a=d(JSON.parse(n));if(!a)throw new Error("git-lifecycle-tracked-state-invalid");const o=await ve(t),s=wt(a,o),u=d(d(s.epics)?.[e.epicId]),c=d(d(s.stories)?.[e.storyId]);if(!u)throw new Error("git-lifecycle-graph-authority-epic-invalid");if(!c||String(c.epic_id??e.storyId.split(".")[0])!==e.epicId)throw new Error("git-lifecycle-graph-authority-story-invalid");const f=Array.isArray(u.stories)?u.stories.filter(_=>typeof _=="string"):Object.keys(d(s.stories)??{}).filter(_=>{const l=d(d(s.stories)?.[_]);return String(l?.epic_id??_.split(".")[0])===e.epicId});if(Array.isArray(u.stories)&&!f.includes(e.storyId))throw new Error("git-lifecycle-graph-authority-story-invalid");const w=f.map(_=>{const l=d(d(s.stories)?.[_])??{};return{id:_,branch_name:typeof l.branch_name=="string"||l.branch_name===null?l.branch_name:void 0,pr_number:typeof l.pr_number=="number"||l.pr_number===null?l.pr_number:void 0,steps_completed:Array.isArray(l.steps_completed)?l.steps_completed.filter(G=>typeof G=="string"):[],checkpoint:d(l.checkpoint)}}),g=dt({...u,id:e.epicId},w);if(g.mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-invalid");if(g.executionBranch!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-mismatch");const m=typeof u.graph_revision=="string"?u.graph_revision:void 0,S=typeof d(o.epics[e.epicId])?.graph_revision=="string"?String(d(o.epics[e.epicId]).graph_revision):void 0;if(m!==void 0&&!h(m))throw new Error("git-lifecycle-graph-revision-invalid");if(m===e.graphRevision&&S===e.graphRevision)return{applied:!1,reused:!0,revision:o.revision,graphRevision:e.graphRevision};const C=Date.parse(i);if(!Number.isFinite(C))throw new Error("git-lifecycle-graph-authority-time-invalid");const $=d(u.branch_lease);if($&&Number.isFinite(Date.parse(String($.expiresAt)))&&Date.parse(String($.expiresAt))>C)throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await qe(t,_=>{const l=St(_,e.epicId);if(l.branch_mode!==void 0&&l.branch_mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-raced");const G=l.execution_branch;if(G!==void 0&&G!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const U=l.graph_revision;if(U!==void 0&&U!==m)throw new Error("git-lifecycle-graph-authority-epoch-raced");const x=d(l.branch_lease);if(x&&Number.isFinite(Date.parse(String(x.expiresAt)))&&Date.parse(String(x.expiresAt))>C)throw new Error("git-lifecycle-graph-authority-writer-active");l.branch_mode="epic",l.execution_branch=e.executionBranch,l.graph_revision=e.graphRevision},{expectedRevision:o.revision,preCommit:async()=>{if(await T(r,"utf8")!==n)throw new Error("git-lifecycle-graph-authority-tracked-state-raced")}})).document.revision,graphRevision:e.graphRevision}}async function qe(t,e,i={}){const r=await _e(t),n=await Ke(r),a=y(n,pt),o=await ti(a);try{const s=y(n,se),u=y(r,Se),c=await We(q(s)?s:u);if(i.expectedRevision!==void 0&&i.expectedRevision!==c.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const f=structuredClone(c),w=e(f),g=xe({...f,schemaVersion:1,revision:c.revision+1});return await i.preCommit?.(g),await z(n,"directory"),await $t(s),await ft(n,se,`${JSON.stringify(g,null,2)}
2
+ `),await z(s,"file"),await bt(n),{document:g,value:w}}finally{await ii(a,o).catch(()=>{})}}async function bt(t){let e;try{e=await nt(t,"r")}catch(i){if(process.platform==="win32"&&(k(i,"EPERM")||k(i,"EISDIR")||k(i,"EINVAL")))return;throw i}try{await e.sync()}finally{await e.close()}}function wt(t,e){const i=structuredClone(t),r=je(i,"epics"),n=je(i,"stories");for(const[a,o]of Object.entries(e.epics))r[a]={...d(r[a])??{},...structuredClone(o)};for(const[a,o]of Object.entries(e.stories))n[a]={...d(n[a])??{},...structuredClone(o)};return i}function je(t,e){const i=t[e];if(i===void 0){const a={};return t[e]=a,a}const r=d(i);if(r)return r;if(!Array.isArray(i))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of i){const o=d(a),s=typeof o?.id=="string"?o.id.trim():"";if(!s||n[s]!==void 0)throw new Error(`git-lifecycle-tracked-${e}-ambiguous`);n[s]=o}return t[e]=n,n}function St(t,e){return t.epics[e]??(t.epics[e]={})}function yi(t,e){return t.stories[e]??(t.stories[e]={})}function ze(t,e,i,r){const n=d(t);return!!(n&&n.epicId===i&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&Je(n,e))}async function bi(t,e,i,r,n,a,o=[]){return vt(t,e,i,r,n,a,o).verdict==="verified"}function vt(t,e,i,r,n,a,o=[],s=new Date().toISOString()){const u=()=>kt({storyId:i,epicId:r,executionBranch:n,value:e,verifiedAt:s,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!ze(e,i,r,n))return u();const c=d(e),f=d(c.qaReceipt),w=d(c.reviewReceipt),g=String(c.headSha),m=String(c.baseSha),S=j(t,["rev-parse",`refs/heads/${n}`]).trim();te("git",["merge-base","--is-ancestor",g,S],{cwd:t,stdio:"ignore"});const C=j(t,["show","--no-patch","--format=%H%n%P%n%B",g]),$=j(t,["rev-parse",`${g}^`]).trim(),V=j(t,["rev-list","--count",`${m}..${g}`]).trim();if($!==m||V!=="1")return u();const _=new Set(C.split(`
3
+ `).map(H=>H.trim())),G=[`Neocortex-Story: ${i}`,`Neocortex-Epic: ${r}`,`Neocortex-Execution-Branch: ${n}`,`Neocortex-Bundle-Digest: ${String(c.bundleDigest)}`,`Neocortex-Graph-Revision: ${String(c.graphRevision)}`,...c.dispatchId?[`Neocortex-Dispatch: ${String(c.dispatchId)}`]:[],...c.bundleId?[`Neocortex-Bundle: ${String(c.bundleId)}`]:[],...c.claimRevision?[`Neocortex-Claim-Revision: ${String(c.claimRevision)}`]:[]].every(H=>_.has(H));if(G){const Ce=[..._].find(it=>it.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(Ce))return u();te("git",["merge-base","--is-ancestor",Ce,g],{cwd:t,stdio:"ignore"})}const x=j(t,["diff-tree","--no-commit-id","--name-only","-r","-z",g]).split("\0").filter(Boolean);if(x.length===0||x.some(H=>!fe(H)))return u();const le=b("sha256").update(C).digest("hex"),he=b("sha256").update([...x].sort().join("\0")).digest("hex"),P=Ge({checkpoint:c,storyId:i,epicId:r,executionBranch:n,baseSha:m,headSha:g,commitBodyDigest:le,changedPathsDigest:he,changedPaths:x,authorizedWriteSet:o.length>0?o:xt(t,i)});if(!P||f.receiptRef!==`story-qa:${String(f.sourceEvidenceDigest)}`)return u();const Re=Rt({storyId:i,baseSha:m,headSha:g,bundleDigest:String(c.bundleDigest),graphRevision:String(c.graphRevision),commitBody:C,changedPaths:x}),Ae=f.evidenceVersion==="p205-execution-v2"&&f.contract==="P205-CI-02"&&f.command===B&&h(f.manifestDigest)&&L(f.gateIds,32,!0)&&h(f.resultDigest)&&f.sourceEvidenceDigest===At({gitEvidenceDigest:Re,headSha:g,graphRevision:String(c.graphRevision),manifestDigest:String(f.manifestDigest),gateIds:f.gateIds,resultDigest:String(f.resultDigest)}),Xe=f.evidenceVersion==="git-immutable-v1"&&f.sourceEvidenceDigest===Re,et=f.evidenceVersion===void 0&&P.mode==="legacy-migration"&&P.binding?.qaDigest===f.sourceEvidenceDigest,me=Dt(a,S,String(c.graphRevision))&&(Ae||P.mode==="legacy-migration"&&(Xe||et)),pe=a===void 0&&Ae;if(!me&&!pe)return u();const ke=b("sha256").update(["root-commit-range-review-v1",i,m,g,String(c.bundleDigest),String(c.graphRevision),String(f.receiptRef),b("sha256").update(C).digest("hex"),[...x].sort().join(",")].join("\0")).digest("hex");if(w.sourceEvidenceDigest!==ke||w.receiptRef!==`story-review:${ke}`||P.mode==="legacy-migration"&&P.binding?.reviewDigest!==void 0&&P.binding.reviewDigest!==w.sourceEvidenceDigest||!G&&(Be[i]!==g||!Array.isArray(c.receiptRefs)||!c.receiptRefs.some(H=>typeof H=="string"&&H.startsWith("legacy-direct-yolo:"))))return u();const tt=b("sha256").update(["checkpoint-p205-transient-v1",i,r,n,m,g,String(c.bundleDigest),le,he,P.mode,P.effectiveClaimRevision,String(f.sourceEvidenceDigest),String(w.sourceEvidenceDigest),re(a)?.executionEvidenceDigest??(pe?"maintenance-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),Z=me?re(a):void 0;return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:i,epicId:r,branch:n,baseSha:m,headSha:g,aggregateHeadSha:Z?.executionHeadSha??g,commitBodyDigest:le,changedPathsDigest:he,claimVerification:P.mode,effectiveClaimRevision:P.effectiveClaimRevision,sourceEvidenceDigest:tt,command:B,manifestDigest:Z?.manifestDigest??"0".repeat(64),gateIds:Z?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:Z?.resultDigest??"0".repeat(64),graphRevision:String(c.graphRevision),executionEvidenceDigest:Z?.executionEvidenceDigest??"0".repeat(64),verifiedAt:Z?.executedAt??ne(s),verdict:"verified",reasonCodes:Object.freeze([me?"checkpoint-p205-transient-verified":pe?"checkpoint-git-maintenance-verified":"checkpoint-legacy-bounded-verified",...P.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return u()}}function Dt(t,e,i){const r=re(t);return!!(r&&r.schemaVersion===1&&r.kind==="p205_transient_execution_authority"&&r.contract==="P205-CI-02"&&r.command===B&&r.graphRevision===i&&h(r.resultDigest)&&h(r.executionEvidenceDigest)&&r.executionHeadSha===e&&D(e))}function re(t){return t&&typeof t=="object"?Le.get(t):void 0}function wi(t){const e=re(t);return e?Object.freeze({executionHeadSha:e.executionHeadSha,graphRevision:e.graphRevision,manifestDigest:e.manifestDigest,gateIds:Object.freeze([...e.gateIds]),resultDigest:e.resultDigest,executedAt:e.executedAt,executionEvidenceDigest:e.executionEvidenceDigest}):void 0}function Si(t,e,i){const r=re(t);return!!(r&&r.executionHeadSha===e&&r.graphRevision===i&&r.command===B)}function Ge(t){const e=mt[t.storyId],i=typeof t.checkpoint.claimRevision=="string"?t.checkpoint.claimRevision:void 0,r=t.storyId==="P174.03.811759"||t.storyId==="P174.03.685003",n=_t(t.authorizedWriteSet),a=n.length>0&&n.length===t.authorizedWriteSet.length&&t.changedPaths.every(o=>n.some(s=>It(s,o)));if(e&&t.epicId==="P174"&&t.executionBranch==="epic/P174"&&t.baseSha===e.baseSha&&t.headSha===e.headSha&&t.checkpoint.graphRevision===e.graphRevision&&t.commitBodyDigest===e.commitBodyDigest&&t.changedPathsDigest===e.changedPathsDigest&&(r?i===void 0:i===e.effectiveClaimRevision))return t.authorizedWriteSet.length>0&&(!a||!He(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(i!==void 0&&!(!i||!h(i))&&!(!a||!He(i,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:i})}function _t(t){const e=t.map(i=>i.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(i=>!fe(i))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function xt(t,e){try{const i=JSON.parse(Pe(y(t,".neocortex","state.json"),"utf8")),r=d(i.stories),n=d(r?.[e]),a=yt(t),o=d(a.stories[e]?.checkpoint)??d(n?.checkpoint);return Et(e,n,o)}catch{return[]}}function Et(t,e,i){const r=Array.isArray(e?.files_to_modify)?e.files_to_modify.filter(n=>typeof n=="string"):[];if(!i?.dispatchId||!i.bundleId)return r;try{return st({...e,id:t,files_to_modify:r})}catch{return[]}}function He(t,e){return t===b("sha256").update(e.join("\0")).digest("hex")||t===b("sha256").update(JSON.stringify(e)).digest("hex")}function It(t,e){return t===e||t.endsWith("/")&&e.startsWith(t)}function vi(t,e,i,r,n,a){try{if(!ze(e,i,r,n))return!1;const o=d(e),s=d(o.qaReceipt),u=d(o.reviewReceipt),c=String(o.headSha),f=String(o.baseSha),w=j(t,["rev-parse",`refs/heads/${n}`]).trim();if(te("git",["merge-base","--is-ancestor",c,w],{cwd:t,stdio:"ignore"}),j(t,["rev-parse",`${c}^`]).trim()!==f||j(t,["rev-list","--count",`${f}..${c}`]).trim()!=="1")return!1;const g=j(t,["show","--no-patch","--format=%H%n%P%n%B",c]),m=j(t,["diff-tree","--no-commit-id","--name-only","-r","-z",c]).split("\0").filter(Boolean);if(m.length===0||m.some(C=>!fe(C)))return!1;const S=Ge({checkpoint:o,storyId:i,epicId:r,executionBranch:n,baseSha:f,headSha:c,changedPaths:m,authorizedWriteSet:a,commitBodyDigest:b("sha256").update(g).digest("hex"),changedPathsDigest:b("sha256").update([...m].sort().join("\0")).digest("hex")});return!(S?.mode!=="legacy-migration"||!S.binding||s.sourceEvidenceDigest!==S.binding.qaDigest||s.receiptRef!==`story-qa:${S.binding.qaDigest}`||u.sourceEvidenceDigest!==S.binding.reviewDigest||u.receiptRef!==`story-review:${S.binding.reviewDigest}`||u.qaReceiptRef!==s.receiptRef)}catch{return!1}}function Rt(t){return b("sha256").update(["local-yolo-tdd-git-immutable-v1",t.storyId,t.baseSha,t.headSha,t.bundleDigest,t.graphRevision,b("sha256").update(t.commitBody).digest("hex"),b("sha256").update([...t.changedPaths].sort().join("\0")).digest("hex")].join("\0")).digest("hex")}function At(t){return b("sha256").update(["local-yolo-tdd-p205-execution-v2",B,t.gitEvidenceDigest,t.headSha,t.graphRevision,t.manifestDigest,t.gateIds.join(","),t.resultDigest].join("\0")).digest("hex")}function kt(t){const e=d(t.value);return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:t.storyId,epicId:t.epicId,branch:t.executionBranch,baseSha:D(e?.baseSha)?String(e?.baseSha):"0".repeat(40),headSha:D(e?.headSha)?String(e?.headSha):"0".repeat(40),aggregateHeadSha:"0".repeat(40),commitBodyDigest:"0".repeat(64),changedPathsDigest:"0".repeat(64),claimVerification:"canonical",effectiveClaimRevision:"0".repeat(64),command:B,manifestDigest:"0".repeat(64),gateIds:Object.freeze([]),resultDigest:"0".repeat(64),graphRevision:"0".repeat(64),executionEvidenceDigest:"0".repeat(64),sourceEvidenceDigest:"0".repeat(64),verifiedAt:ne(t.verifiedAt),verdict:t.verdict,reasonCodes:Object.freeze([t.reasonCode]),publicSafe:!0})}function j(t,e){return te("git",[...e],{cwd:t,encoding:"utf8",maxBuffer:32*1024*1024})}function ne(t){return Number.isFinite(Date.parse(t))?new Date(Date.parse(t)).toISOString():new Date().toISOString()}async function Di(t,e){if(Be[e.storyId]!==e.headSha)return;const i=[".neocortex/state.json",`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,`.neocortex/stories/${e.storyId}/review.md`,`docs/stories/${e.storyId}.story.md`];try{const r=(await N("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:t,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await N("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:t}),(await N("git",["rev-parse",`${e.headSha}^`],{cwd:t,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await N("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:t,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(b("sha256").update(a).digest("hex")!==e.bundleDigest)return;const o=String((await N("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await N("git",["show","--no-patch","--format=%s",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const c=String((await N("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:t,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!i.every(l=>c.includes(l))||c.some(l=>!fe(l)))return;const f=await Promise.all(i.map(async l=>String((await N("git",["show",`${e.headSha}:${l}`],{cwd:t,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),w=JSON.parse(f[0]),g=d(w.stories),m=d(w.epics),S=d(g?.[e.storyId]),C=d(m?.[e.epicId]),$=Array.isArray(S?.steps_completed)?S.steps_completed:[],V=JSON.parse(f[1]);return S?.status!=="done"||!$.includes(lt)||!$.includes(ht)||C?.branch_mode!=="epic"||C.execution_branch!==e.executionBranch||V.storyId!==e.storyId||V.status!=="qa-passed"||V.safeToContinueYoloop!==!0||!Array.isArray(V.blockingChecks)||V.blockingChecks.length!==0||!f[2].includes(e.storyId)||!/P205[\s\S]{0,80}(pass|aprov)/i.test(f[2])||!f[3].includes(e.storyId)||!/approved|aprovado/i.test(f[3])||!f[4].includes(e.storyId)?void 0:`legacy-direct-yolo:${b("sha256").update(["legacy-direct-yolo-recovery-v1",e.storyId,e.epicId,e.executionBranch,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,b("sha256").update(o).digest("hex"),b("sha256").update([...c].sort().join("\0")).digest("hex"),...f.map(l=>b("sha256").update(l).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function Ct(t){const e=await _e(t),i=y(e,oe),r=y(i,se);if(q(i)&&(await z(i,"directory"),await J(i)!==i))throw new Error("git-lifecycle-runtime-directory-symlink");return q(r)?r:y(e,Se)}async function Te(t){return Ke(await _e(t))}async function Ot(t,e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)||e.includes(".."))throw new Error("git-lifecycle-private-child-invalid");const i=p(t);await M(i);const r=p(i,e);return ee(i,r),q(r)||await $e(i,e),await M(r,i),await M(i),r}async function v(t,e){const i=p(e),r=p(t);ee(i,r),await M(i),await M(r,i)}async function _i(t,e){await K(t,e)}async function Q(t,e,i){const r=p(e),n=p(t);ee(r,n);try{await v(n,r)}catch(o){if(k(o,"ENOENT"))return!1;throw o}const a=p(r,`${n.slice(r.length+1)}.remove.${process.pid}.${Date.now()}.${ye(4).toString("hex")}`);return ee(r,a),await X(r,R(n),R(a)),await v(a,r),i&&!await i(a)?(await ae(a,n,r).catch(()=>{}),!1):(await gt(r,R(a)),!0)}async function ae(t,e,i){await v(t,i);try{await be(e);return}catch(r){if(!k(r,"ENOENT"))throw r}await X(i,R(t),R(e)),await v(e,i)}async function O(t){try{await v(t,F(t));const e=y(t,"owner.json");await K(e,t);const i=await T(e);return await K(e,t),b("sha256").update(i).digest("hex")}catch{return}}async function xi(t,e){const i=await Te(t),r=await Ot(i,"leases"),n=y(r,"integration"),a=`${n}.recovery`;if(q(a)){await v(a,r);const c=await Fe(a),f=await O(a);if(c===void 0||ge(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!f||!await Q(a,r,async w=>await O(w)===f))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const o=ne(e.createdAt??new Date().toISOString()),s=Object.freeze({schemaVersion:1,kind:e.kind,storyId:e.storyId,sessionId:e.sessionId,idempotencyKey:e.idempotencyKey,pid:process.pid,createdAt:o,expiresAt:ne(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??ye(16).toString("hex")});if(Date.parse(s.expiresAt)<=Date.parse(s.createdAt))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const u=async()=>{await M(r,i);try{return await Ne(r,R(n),`${JSON.stringify(s)}
4
+ `),await v(n,r),await K(y(n,"owner.json"),n),!0}catch(c){throw k(c,"EEXIST")||await Q(n,r).catch(()=>{}),c}};try{return await u(),{ok:!0,owner:s,path:n}}catch(c){if(!k(c,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const c=await ce(n),f=c?void 0:await Fe(n);if(c&&Me(c,s))return{ok:!0,owner:c,path:n};if(c&&Date.parse(c.expiresAt)>Date.now()&&(c.persistent||ge(c.pid))||f!==void 0&&ge(f)||!c&&f===void 0&&await Ue(n))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};const g=await O(n);if(!g)return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const m=`${n}.stale.${process.pid}.${Date.now()}`;await X(r,R(n),R(m));try{if(await v(m,r),await O(m)!==g)return await ae(m,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await u()}finally{await Q(m,r,async S=>await O(S)===g).catch(()=>{})}return{ok:!0,owner:s,path:n}}catch(c){return{ok:!1,reasonCode:k(c,"EEXIST")||k(c,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function Ei(t,e){const i=await ce(t);return!!(i&&De(i,e)&&Date.parse(i.expiresAt)>Date.now())}async function Pt(t,e){try{const i=F(t);await v(t,i);const r=await ce(t);if(!r||!De(r,e))return!1;const n=await O(t);if(!n)return!1;const a=`${t}.release.${process.pid}.${Date.now()}`;await X(i,R(t),R(a)),await v(a,i);const o=await ce(a);return!o||!De(o,e)||await O(a)!==n?(await ae(a,t,i).catch(()=>{}),!1):Q(a,i,async s=>await O(s)===n)}catch(i){if(k(i,"ENOENT"))return!1;throw i}}function Nt(t){return b("sha256").update(["git-lifecycle-physical-owner-v1",t.kind,t.storyId,t.sessionId,t.idempotencyKey,String(t.pid),t.createdAt,t.expiresAt,t.persistent?"persistent":"ephemeral",t.ownerNonce].join("\0")).digest("hex")}async function Ii(t,e){if(!W(e.storyId)||!A(e.idempotencyKey)||!h(e.ownerDigest))return"foreign";const i=await Te(t),r=y(i,"leases"),n=y(r,"integration");if(!q(n))return"absent";try{await v(r,i),await v(n,r);const a=await ce(n);return!a||a.kind!=="direct"||a.storyId!==e.storyId||a.sessionId!==e.idempotencyKey||a.idempotencyKey!==e.idempotencyKey||a.persistent!==!0||Nt(a)!==e.ownerDigest?"foreign":await Pt(n,a)?"released":"foreign"}catch{return"foreign"}}async function ce(t){try{await v(t,F(t));const e=y(t,"owner.json");await K(e,t);const i=JSON.parse(await T(e,"utf8"));return i.schemaVersion!==1||i.kind!=="direct"&&i.kind!=="continuous"||!W(i.storyId)||!A(i.sessionId)||!A(i.idempotencyKey)||!Number.isSafeInteger(i.pid)||Number(i.pid)<=0||!I(i.createdAt)||!I(i.expiresAt)||typeof i.persistent!="boolean"||typeof i.ownerNonce!="string"||!/^[a-f0-9]{32}$/.test(i.ownerNonce)?void 0:i}catch{return}}async function Fe(t){try{await v(t,F(t));const e=y(t,"owner.json");await K(e,t);const i=JSON.parse(await T(e,"utf8"));return Number.isSafeInteger(i.pid)&&Number(i.pid)>0?Number(i.pid):void 0}catch{return}}function Me(t,e){return t.kind===e.kind&&t.storyId===e.storyId&&t.sessionId===e.sessionId&&t.idempotencyKey===e.idempotencyKey&&t.expiresAt===e.expiresAt&&t.persistent===e.persistent}function De(t,e){return Me(t,e)&&t.schemaVersion===e.schemaVersion&&t.pid===e.pid&&t.createdAt===e.createdAt&&t.ownerNonce===e.ownerNonce}async function _e(t){const e=await J(t),r=(await N("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim(),n=ie(r)?p(r):p(e,r),a=await J(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await Vt(a);const s=(await N("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((ie(s)?p(s):p(e,s))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function Ke(t){const e=y(t,oe);if(q(e)||await $e(t,oe),await z(e,"directory"),await J(e)!==e)throw new Error("git-lifecycle-runtime-directory-symlink");return e}async function We(t,e={}){try{return await z(t,"file"),xe(JSON.parse(await T(t,"utf8")))}catch(i){if(k(i,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}throw i}}async function $t(t){try{await z(t,"file")}catch(e){if(k(e,"ENOENT"))return;throw e}}async function z(t,e){const i=await be(t);if(i.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!i.isFile():!i.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(de()&&i.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(de()&&(i.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function ee(t,e){const i=p(t),r=p(e),n=ct(i,r);if(!n||n.startsWith("..")||ie(n)||F(r)!==i)throw new Error("git-lifecycle-private-path-escape")}async function M(t,e){const i=p(t);if(e&&ee(p(e),i),await z(i,"directory"),p(await J(i))!==i)throw new Error("git-lifecycle-directory-substituted");if(e){const r=p(e);if(await z(r,"directory"),p(await J(r))!==r)throw new Error("git-lifecycle-directory-parent-substituted")}}async function K(t,e){const i=p(t);if(ee(p(e),i),await M(p(e)),await z(i,"file"),p(await J(i))!==i)throw new Error("git-lifecycle-file-substituted")}function Ye(t,e){const i=Oe(t);if(i.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!i.isFile():!i.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(de()&&i.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(de()&&(i.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function Vt(t){const e=await be(t);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function Bt(t){const e=Oe(t);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function de(t=process.platform){return t!=="win32"&&typeof process.getuid=="function"}function xe(t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("git-lifecycle-runtime-invalid");const e=t;E(e,["schemaVersion","revision","epics","stories"],"git-lifecycle-runtime-unknown-field");const i=d(e.epics),r=d(e.stories);if(e.schemaVersion!==1||!Number.isSafeInteger(e.revision)||Number(e.revision)<0||!i||!r||Object.values(i).some(n=>!d(n))||Object.values(r).some(n=>!d(n)))throw new Error("git-lifecycle-runtime-invalid");for(const[n,a]of Object.entries(i))if(!W(n)||!jt(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!W(n)||!n.includes(".")||!zt(a,n))throw new Error("git-lifecycle-runtime-story-invalid");return e}const Lt=["branch_mode","execution_branch","origin_branch","branch_lease","origin_binding","graph_revision","aggregate_qa_receipt","terminal_git_receipt","physicalMergeStatus","pr_number","git_reconciliation_receipts","git_reconciliation_debt"],qt=["checkpoint","status","last_step","steps_completed"];function jt(t){return E(t,Lt,"git-lifecycle-runtime-epic-unknown-field"),(t.branch_mode===void 0||t.branch_mode==="epic")&&(t.execution_branch===void 0||Y(t.execution_branch))&&(t.origin_branch===void 0||Y(t.origin_branch))&&(t.branch_lease===void 0||t.branch_lease===null||Gt(t.branch_lease))&&(t.origin_binding===void 0||t.origin_binding===null||Ft(t.origin_binding))&&(t.graph_revision===void 0||h(t.graph_revision))&&(t.aggregate_qa_receipt===void 0||t.aggregate_qa_receipt===null||Mt(t.aggregate_qa_receipt))&&(t.terminal_git_receipt===void 0||t.terminal_git_receipt===null||Kt(t.terminal_git_receipt))&&(t.physicalMergeStatus===void 0||["merged","pushed","denied_external_gate","blocked_local_or_repo","not_attempted"].includes(String(t.physicalMergeStatus)))&&(t.pr_number===void 0||t.pr_number===null||Number.isSafeInteger(t.pr_number)&&Number(t.pr_number)>0)&&(t.git_reconciliation_receipts===void 0||Ut(t.git_reconciliation_receipts))&&(t.git_reconciliation_debt===void 0||Zt(t.git_reconciliation_debt))}function zt(t,e){return E(t,qt,"git-lifecycle-runtime-story-unknown-field"),(t.checkpoint===void 0||t.checkpoint===null||Je(t.checkpoint,e))&&(t.status===void 0||A(t.status))&&(t.last_step===void 0||t.last_step===null||A(t.last_step))&&(t.steps_completed===void 0||L(t.steps_completed,128))}function Gt(t){const e=d(t);return e?(E(e,["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt","handoffGrant","handoffConsumption"],"git-lifecycle-runtime-lease-unknown-field"),e.schemaVersion===1&&W(e.ownerStoryId)&&A(e.sessionId)&&A(e.idempotencyKey)&&I(e.acquiredAt)&&I(e.expiresAt)&&Date.parse(String(e.expiresAt))>Date.parse(String(e.acquiredAt))&&(e.handoffGrant===void 0||Ht(e.handoffGrant,e))&&(e.handoffConsumption===void 0||Tt(e.handoffConsumption,e))):!1}function Ht(t,e){const i=d(t);return i?(E(i,["schemaVersion","kind","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","expiresAt"],"git-lifecycle-runtime-handoff-grant-unknown-field"),i.schemaVersion===1&&i.kind==="direct-yolo-setup-handoff"&&i.storyId===e.ownerStoryId&&i.fromSessionId===e.sessionId&&h(i.tokenDigest)&&h(i.bundleDigest)&&h(i.claimRevision)&&I(i.expiresAt)&&Date.parse(String(i.expiresAt))<=Date.parse(String(e.expiresAt))):!1}function Tt(t,e){const i=d(t);return i?(E(i,["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","consumedBySessionId","consumedAt"],"git-lifecycle-runtime-handoff-consumption-unknown-field"),i.schemaVersion===1&&i.kind==="direct-yolo-setup-handoff-consumption"&&i.state==="consumed"&&i.storyId===e.ownerStoryId&&A(i.fromSessionId)&&h(i.tokenDigest)&&h(i.bundleDigest)&&h(i.claimRevision)&&i.consumedBySessionId===e.sessionId&&I(i.consumedAt)):!1}function Ft(t){const e=d(t);return e?(E(e,["schemaVersion","originBranch","originHeadSha","executionBranch","capturedFromCurrentCheckout","capturedAt"],"git-lifecycle-runtime-origin-unknown-field"),e.schemaVersion===1&&Y(e.originBranch)&&Y(e.executionBranch)&&e.originBranch!==e.executionBranch&&D(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&I(e.capturedAt)):!1}function Mt(t){const e=d(t);if(!e)return!1;E(e,["schemaVersion","evidenceVersion","producer","contract","command","verdict","executionHeadSha","graphRevision","manifestDigest","resultDigest","checkedAt","receiptRef","gateIds"],"git-lifecycle-runtime-aggregate-qa-unknown-field");const i=e.evidenceVersion==="p205-execution-v2"&&e.producer==="local-yolo-tdd"&&e.contract==="P205-CI-02"&&e.command===B&&h(e.manifestDigest)&&h(e.resultDigest),r=e.evidenceVersion===void 0&&e.producer===void 0&&e.contract===void 0&&e.command===void 0&&e.manifestDigest===void 0&&e.resultDigest===void 0;return e.schemaVersion===1&&(i||r)&&e.verdict==="passed"&&D(e.executionHeadSha)&&h(e.graphRevision)&&I(e.checkedAt)&&ue(e.receiptRef)&&L(e.gateIds,128,!0)}function Kt(t){const e=d(t);return e?(E(e,["schemaVersion","epicId","executionBranch","originBranch","baseSha","executionHeadSha","mergeSha","pushedSha","strategy","prNumber","physicalStatus","localGateReceiptRefs","idempotencyKey","attemptStartedAt","completedAt","retryEligible","reasonCodes","publicSafe","candidateQa","providerGuard"],"git-lifecycle-runtime-terminal-receipt-unknown-field"),e.schemaVersion===1&&W(e.epicId)&&Y(e.executionBranch)&&Y(e.originBranch)&&D(e.baseSha)&&D(e.executionHeadSha)&&(e.mergeSha===void 0||D(e.mergeSha))&&(e.pushedSha===void 0||D(e.pushedSha))&&(e.strategy==="direct"||e.strategy==="single_pr")&&(e.candidateQa===void 0||Yt(e.candidateQa,e))&&(e.providerGuard===void 0||Wt(e.providerGuard,e))&&(e.prNumber===void 0||Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0)&&["prepared","merged","pushed","denied_external_gate","blocked_local_or_repo"].includes(String(e.physicalStatus))&&L(e.localGateReceiptRefs,128,!0)&&A(e.idempotencyKey)&&I(e.attemptStartedAt)&&(e.completedAt===void 0||I(e.completedAt))&&typeof e.retryEligible=="boolean"&&L(e.reasonCodes,128)&&e.publicSafe===!0):!1}function Wt(t,e){const i=d(t);if(!i)return!1;E(i,["schemaVersion","provider","mode","source","prHeadSha","originHeadSha","checkedAt","publicSafe"],"git-lifecycle-runtime-provider-guard-unknown-field");const r=i.mode==="recovered_exact_tree"?i.source==="physical_recovery":i.mode==="strict_up_to_date_expected_head"&&["branch_protection","ruleset","branch_protection_and_ruleset"].includes(String(i.source));return i.schemaVersion===1&&i.provider==="github"&&r&&e.strategy==="single_pr"&&e.physicalStatus==="pushed"&&Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0&&D(i.prHeadSha)&&i.prHeadSha===e.mergeSha&&D(i.originHeadSha)&&i.originHeadSha===e.baseSha&&I(i.checkedAt)&&i.publicSafe===!0}function Yt(t,e){const i=d(t);return i?(E(i,["schemaVersion","kind","contract","command","originHeadSha","executionHeadSha","mergeSha","treeSha","graphRevision","manifestDigest","resultDigest","gateIds","checkedAt","receiptRef"],"git-lifecycle-runtime-merge-candidate-unknown-field"),i.schemaVersion===1&&i.kind==="epic_merge_candidate_qa"&&i.contract==="P205-CI-02"&&i.command===B&&D(i.originHeadSha)&&i.originHeadSha===e.baseSha&&D(i.executionHeadSha)&&i.executionHeadSha===e.executionHeadSha&&D(i.mergeSha)&&i.mergeSha===e.mergeSha&&D(i.treeSha)&&h(i.graphRevision)&&h(i.manifestDigest)&&h(i.resultDigest)&&L(i.gateIds,128,!0)&&I(i.checkedAt)&&ue(i.receiptRef)):!1}function Je(t,e){const i=d(t);if(!i)return!1;E(i,["schemaVersion","storyId","epicId","branch","baseSha","headSha","commits","idempotencyKey","dispatchId","bundleId","bundleDigest","graphRevision","claimRevision","receiptRefs","qaVerdict","reviewVerdict","qaReceipt","reviewReceipt","recordedAt"],"git-lifecycle-runtime-checkpoint-unknown-field");const r=String(e).split(".")[0];return i.schemaVersion===1&&i.storyId===e&&i.epicId===r&&Y(i.branch)&&D(i.baseSha)&&D(i.headSha)&&i.baseSha!==i.headSha&&ei(i.commits)&&i.commits.length===1&&i.commits[0]===i.headSha&&A(i.idempotencyKey)&&(i.dispatchId===void 0||h(i.dispatchId))&&(i.bundleId===void 0||h(i.bundleId))&&h(i.bundleDigest)&&h(i.graphRevision)&&(i.claimRevision===void 0||h(i.claimRevision))&&L(i.receiptRefs,256,!0)&&(i.qaVerdict==="passed"||i.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(i.reviewVerdict))&&Jt(i.qaReceipt,i)&&(i.reviewVerdict==="pending"?i.reviewReceipt===void 0:Qt(i.reviewReceipt,i))&&I(i.recordedAt)}function Jt(t,e){const i=d(t);return i?(E(i,["schemaVersion","kind","producer","evidenceVersion","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","contract","command","manifestDigest","gateIds","resultDigest","sourceEvidenceDigest","verdict","checkedAt","receiptRef"],"git-lifecycle-runtime-story-qa-unknown-field"),i.schemaVersion===1&&i.kind==="story_qa_evidence"&&i.producer==="local-yolo-tdd"&&(i.evidenceVersion===void 0||i.evidenceVersion==="git-immutable-v1"||i.evidenceVersion==="p205-execution-v2"&&i.contract==="P205-CI-02"&&i.command===B&&h(i.manifestDigest)&&L(i.gateIds,32,!0)&&h(i.resultDigest))&&Qe(i,e)&&h(i.sourceEvidenceDigest)&&i.verdict===e.qaVerdict&&(i.verdict==="passed"||i.verdict==="blocked")&&I(i.checkedAt)&&ue(i.receiptRef)&&e.receiptRefs.includes(i.receiptRef)):!1}function Qt(t,e){const i=d(t),r=d(e.qaReceipt);return!i||!r?!1:(E(i,["schemaVersion","kind","producer","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","sourceEvidenceDigest","qaReceiptRef","verdict","reviewedAt","receiptRef"],"git-lifecycle-runtime-story-review-unknown-field"),i.schemaVersion===1&&i.kind==="story_review_evidence"&&i.producer==="root-commit-range-review"&&Qe(i,e)&&h(i.sourceEvidenceDigest)&&i.qaReceiptRef===r.receiptRef&&i.receiptRef!==r.receiptRef&&(i.verdict==="approved"||i.verdict==="changes-requested")&&(i.verdict==="approved"?e.reviewVerdict==="approved":e.reviewVerdict==="changes-requested")&&I(i.reviewedAt)&&Date.parse(String(i.reviewedAt))>=Date.parse(String(r.checkedAt))&&ue(i.receiptRef)&&e.receiptRefs.includes(i.receiptRef))}function Qe(t,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(i=>t[i]===e[i])}function Ut(t){return!Array.isArray(t)||t.length>1024?!1:t.every(e=>{const i=d(e);return i?(E(i,["schemaVersion","resourceId","action","outcome","idempotencyKey","reasonCodes","recordedAt","publicSafe"],"git-lifecycle-runtime-reconciliation-receipt-unknown-field"),i.schemaVersion===1&&A(i.resourceId)&&["no_op","delete_local_branch","delete_remote_branch","close_pull_request"].includes(String(i.action))&&["applied","already_absent","dry_run","failed"].includes(String(i.outcome))&&A(i.idempotencyKey)&&L(i.reasonCodes,128)&&I(i.recordedAt)&&i.publicSafe===!0):!1})}function Zt(t){return!Array.isArray(t)||t.length>1024?!1:t.every(e=>{const i=d(e);return i?(E(i,["schemaVersion","resourceId","action","managed","reasonCodes","evidence","publicSafe"],"git-lifecycle-runtime-reconciliation-debt-unknown-field"),i.schemaVersion===1&&A(i.resourceId)&&i.action==="preserve"&&typeof i.managed=="boolean"&&L(i.reasonCodes,128)&&L(i.evidence,16)&&i.publicSafe===!0):!1})}function E(t,e,i){const r=new Set(e);if(Object.keys(t).some(n=>!r.has(n)))throw new Error(i)}function W(t){return typeof t=="string"&&/^P[1-9][0-9]*(?:\.[0-9]+)*$/.test(t)}function Xt(t){const e=d(t);return e?Object.keys(e).length===9&&e.schemaVersion===1&&e.kind==="git_lifecycle_graph_authority"&&e.producer==="server-continuous-yoloop-v1"&&(e.source==="yolo"||e.source==="yoloop")&&W(e.epicId)&&W(e.storyId)&&String(e.storyId).startsWith(`${String(e.epicId)}.`)&&Y(e.executionBranch)&&typeof e.graphRevision=="string"&&/^[a-f0-9]{64}$/.test(e.graphRevision)&&e.publicSafe===!0:!1}function Y(t){return typeof t=="string"&&/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(t)&&!t.includes("..")&&!t.includes("//")&&!t.includes("@{")&&!t.endsWith("/")&&!t.endsWith(".")&&!t.split("/").some(e=>!e||e.startsWith(".")||e.endsWith(".lock"))}function fe(t){return t.length>0&&t.length<=1024&&!ie(t)&&!t.includes("\0")&&!t.replaceAll("\\","/").split("/").includes("..")}function A(t){return typeof t=="string"&&t.length>0&&t.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(t)&&!t.includes("..")}function ue(t){return A(t)}function D(t){return typeof t=="string"&&/^[a-f0-9]{40,64}$/i.test(t)}function h(t){return typeof t=="string"&&/^[a-f0-9]{64}$/i.test(t)}function I(t){return typeof t=="string"&&t.length<=64&&Number.isFinite(Date.parse(t))}function L(t,e,i=!1){return Array.isArray(t)&&t.length<=e&&(!i||t.length>0)&&t.every(A)}function ei(t){return Array.isArray(t)&&t.length>0&&t.length<=256&&t.every(D)}function Ee(){return{schemaVersion:1,revision:0,epics:{},stories:{}}}async function ti(t){const e=F(t),i={pid:process.pid,nonce:ye(16).toString("hex")},r=async()=>{await M(e),await Ne(e,R(t),JSON.stringify(i));try{await v(t,e),await K(y(t,"owner.json"),t)}catch(n){throw await Q(t,e).catch(()=>{}),n}};try{await r()}catch(n){if(!k(n,"EEXIST"))throw n;await z(t,"directory");const a=await Ie(t);if(a!==void 0&&ge(a.pid))throw new Error("git-lifecycle-runtime-lock-active");if(a===void 0&&await Ue(t))throw new Error("git-lifecycle-runtime-lock-active");const o=await O(t);if(!o)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const s=`${t}.stale.${process.pid}.${Date.now()}`;await X(e,R(t),R(s));try{if(await v(s,e),await O(s)!==o)throw await ae(s,t,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await Q(s,e,async u=>await O(u)===o).catch(()=>{})}}return i}async function ii(t,e){const i=F(t);try{await v(t,i);const r=await Ie(t);if(!r||!Ze(r,e))return!1;const n=await O(t);if(!n)return!1;const a=`${t}.release.${process.pid}.${Date.now()}`;await X(i,R(t),R(a)),await v(a,i);const o=await Ie(a);return!o||!Ze(o,e)||await O(a)!==n?(await ae(a,t,i).catch(()=>{}),!1):Q(a,i,async s=>await O(s)===n)}catch(r){if(k(r,"ENOENT"))return!1;throw r}}async function Ue(t){try{return Date.now()-(await at(t)).mtimeMs<3e4}catch{return!0}}async function Ie(t){try{await v(t,F(t));const e=y(t,"owner.json");await K(e,t);const i=JSON.parse(await T(e,"utf8"));return Number.isSafeInteger(i.pid)&&Number(i.pid)>0&&(i.nonce===void 0||typeof i.nonce=="string"&&/^[a-f0-9]{32}$/.test(i.nonce))?{pid:Number(i.pid),...typeof i.nonce=="string"?{nonce:i.nonce}:{}}:void 0}catch{return}}function Ze(t,e){return t.pid===e.pid&&t.nonce!==void 0&&t.nonce===e.nonce}function ge(t){try{return process.kill(t,0),!0}catch(e){return k(e,"EPERM")}}function d(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function k(t,e){return t instanceof Error&&"code"in t&&t.code===e}export{oe as GIT_LIFECYCLE_RUNTIME_DIRECTORY,se as GIT_LIFECYCLE_RUNTIME_FILE,Be as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,mt as LEGACY_P174_CHECKPOINT_MIGRATIONS,B as P205_COMPLETE_COMMAND,xi as acquireGitLifecyclePhysicalIntegrationLock,wt as applyGitLifecycleRuntimeOverlay,v as assertGitLifecyclePrivateDirectory,_i as assertGitLifecyclePrivateFile,Nt as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,Rt as computeImmutableStoryQaEvidenceDigest,Di as computeLegacyDirectYoloRecoveryReceiptRef,At as computeP205StoryQaEvidenceDigest,Ot as ensureGitLifecyclePrivateChildDirectory,mi as ensureGitLifecycleRuntimeInitialized,St as ensureRuntimeEpic,yi as ensureRuntimeStory,hi as executeP205TransientAuthority,Te as gitLifecycleRuntimeDirectory,Et as gitLifecycleStoryWriteSet,ze as isAcceptedGitLifecycleStoryCheckpoint,qe as mutateGitLifecycleRuntime,Si as p205TransientAuthorityMatchesAggregate,pi as persistGitLifecycleGraphAuthority,de as posixSecurityAvailable,wi as projectP205TransientExecutionEvidence,ve as readGitLifecycleRuntime,yt as readGitLifecycleRuntimeSync,Pt as releaseGitLifecyclePhysicalIntegrationLock,Ii as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,Q as removeGitLifecyclePrivateDirectory,bi as verifyAcceptedGitLifecycleStoryCheckpoint,vt as verifyAcceptedGitLifecycleStoryCheckpointSync,Ei as verifyGitLifecyclePhysicalIntegrationLock,vi as verifyLegacyCheckpointMigrationCandidateSync};
File without changes
@@ -0,0 +1,343 @@
1
+ /**
2
+ * Public, deterministic branch-unit contract for epic-owned YOLO/YOLOOP runs.
3
+ * Pure data/functions only: callers own Git and filesystem effects.
4
+ */
5
+ export const BRANCH_UNIT_MODES = Object.freeze(['epic', 'story']);
6
+ const LEGACY_INTEGRATION_STEPS = new Set([
7
+ 'step-c-09-sync-main',
8
+ 'step-c-10-create-pr',
9
+ 'step-c-11-review-pr',
10
+ 'step-c-12-merge-pr',
11
+ ]);
12
+ /** Resolve once from persisted state. Existing Git progress always wins. */
13
+ export function resolveBranchUnit(epic, stories) {
14
+ const legacyProgress = stories.some(hasLegacyStoryGitProgress);
15
+ if (epic.branch_mode === 'story') {
16
+ return resolution('story', 'recorded', true, epic, ['branch-mode-recorded-story']);
17
+ }
18
+ if (epic.branch_mode === 'epic') {
19
+ const conflictingEvidence = classifyRecordedEpicStoryGitEvidence(epic, stories);
20
+ if (conflictingEvidence === 'strong') {
21
+ return resolution('story', 'legacy-progress', true, epic, [
22
+ 'branch-mode-conflict-legacy-progress-preserved',
23
+ 'branch-mode-recorded-epic-not-applied',
24
+ ]);
25
+ }
26
+ if (conflictingEvidence === 'ambiguous') {
27
+ return resolution('story', 'legacy-progress', true, epic, [
28
+ 'branch-mode-conflict-legacy-progress-preserved',
29
+ 'branch-mode-conflict-ambiguous-story-git-evidence',
30
+ 'branch-mode-recorded-epic-not-applied',
31
+ ]);
32
+ }
33
+ return resolution('epic', 'recorded', hasEpicGitProgress(epic, stories), epic, ['branch-mode-recorded-epic']);
34
+ }
35
+ if (legacyProgress || stories.some(hasAnyStoryProgress)) {
36
+ return resolution('story', 'legacy-progress', true, epic, ['legacy-story-git-progress-detected']);
37
+ }
38
+ if (nonEmpty(epic.execution_branch)) {
39
+ return resolution('epic', 'epic-boundary', hasEpicGitProgress(epic, stories), epic, ['epic-execution-branch-declared']);
40
+ }
41
+ return resolution('epic', 'new-epic-default', false, {
42
+ ...epic,
43
+ execution_branch: `epic/${epic.id}`,
44
+ // Setup records the real current branch before switching. Pure planning
45
+ // must not invent a default origin.
46
+ origin_branch: epic.origin_branch,
47
+ }, ['missing-branch-mode-new-epic-default']);
48
+ }
49
+ /** Retry-safe checkpoint persistence decision; same key may never change range. */
50
+ export function reconcileStoryCheckpoint(current, requested) {
51
+ if (!current)
52
+ return { kind: 'accepted', checkpoint: requested };
53
+ if (current.idempotencyKey !== requested.idempotencyKey)
54
+ return { kind: 'accepted', checkpoint: requested };
55
+ if (current.storyId === requested.storyId &&
56
+ current.epicId === requested.epicId &&
57
+ current.branch === requested.branch &&
58
+ current.baseSha === requested.baseSha &&
59
+ current.headSha === requested.headSha &&
60
+ sameStrings(current.commits, requested.commits) &&
61
+ current.dispatchId === requested.dispatchId &&
62
+ current.bundleId === requested.bundleId &&
63
+ current.bundleDigest === requested.bundleDigest &&
64
+ current.graphRevision === requested.graphRevision &&
65
+ current.claimRevision === requested.claimRevision &&
66
+ sameEvidenceReceipt(current.qaReceipt, requested.qaReceipt) &&
67
+ sameEvidenceReceipt(current.reviewReceipt, requested.reviewReceipt))
68
+ return { kind: 'reused', checkpoint: current };
69
+ return { kind: 'blocked', reasonCode: 'checkpoint-idempotency-conflict' };
70
+ }
71
+ /** Plan a rollback that reverts only the selected story and protects later ranges. */
72
+ export function buildStoryRollbackPlan(target, later) {
73
+ const protectedLaterCommits = [...new Set(later.flatMap((item) => item.commits))];
74
+ if (target.commits.some((sha) => protectedLaterCommits.includes(sha))) {
75
+ return { blocked: true, reasonCode: 'overlapping-story-checkpoints' };
76
+ }
77
+ return Object.freeze({
78
+ schemaVersion: 1,
79
+ storyId: target.storyId,
80
+ epicId: target.epicId,
81
+ strategy: 'additive-revert',
82
+ targetCommitsNewestFirst: Object.freeze([...target.commits].reverse()),
83
+ protectedLaterCommits: Object.freeze(protectedLaterCommits),
84
+ historyRewrite: false,
85
+ });
86
+ }
87
+ export function acquireEpicBranchLease(current, requested, nowIso) {
88
+ if (!current || current.expiresAt <= nowIso)
89
+ return { kind: 'acquired', lease: requested };
90
+ if (current.ownerStoryId === requested.ownerStoryId &&
91
+ current.sessionId === requested.sessionId &&
92
+ current.idempotencyKey === requested.idempotencyKey)
93
+ return { kind: 'reused', lease: current };
94
+ return {
95
+ kind: 'blocked',
96
+ reasonCode: 'epic-worktree-writer-active',
97
+ canonicalReasonCode: 'epic-checkout-writer-active',
98
+ holderStoryId: current.ownerStoryId,
99
+ };
100
+ }
101
+ export function validateStoryCheckpoint(checkpoint, resolution) {
102
+ const errors = [];
103
+ if (resolution.mode !== 'epic')
104
+ errors.push('checkpoint-requires-epic-branch-mode');
105
+ if (checkpoint.schemaVersion !== 1)
106
+ errors.push('checkpoint-schema-version-invalid');
107
+ if (checkpoint.epicId !== resolution.epicId)
108
+ errors.push('checkpoint-epic-mismatch');
109
+ if (!nonEmpty(checkpoint.storyId) || !checkpoint.storyId.startsWith(`${checkpoint.epicId}.`))
110
+ errors.push('checkpoint-story-mismatch');
111
+ if (!isSha(checkpoint.baseSha) || !isSha(checkpoint.headSha))
112
+ errors.push('checkpoint-invalid-sha');
113
+ if (checkpoint.baseSha === checkpoint.headSha)
114
+ errors.push('checkpoint-empty-range');
115
+ if (!Array.isArray(checkpoint.commits) || checkpoint.commits.length === 0 || checkpoint.commits.some((sha) => !isSha(sha))) {
116
+ errors.push('checkpoint-invalid-commits');
117
+ }
118
+ else {
119
+ if (!checkpoint.commits.includes(checkpoint.headSha))
120
+ errors.push('checkpoint-head-not-in-commits');
121
+ if (new Set(checkpoint.commits).size !== checkpoint.commits.length)
122
+ errors.push('checkpoint-duplicate-commits');
123
+ }
124
+ if (!nonEmpty(checkpoint.branch))
125
+ errors.push('checkpoint-branch-missing');
126
+ if (resolution.executionBranch && checkpoint.branch !== resolution.executionBranch)
127
+ errors.push('checkpoint-branch-mismatch');
128
+ if (!nonEmpty(checkpoint.idempotencyKey))
129
+ errors.push('checkpoint-idempotency-key-missing');
130
+ if (checkpoint.dispatchId !== undefined && !isHash(checkpoint.dispatchId))
131
+ errors.push('checkpoint-dispatch-invalid');
132
+ if (checkpoint.bundleId !== undefined && !isHash(checkpoint.bundleId))
133
+ errors.push('checkpoint-bundle-id-invalid');
134
+ if (checkpoint.bundleDigest !== undefined && !isHash(checkpoint.bundleDigest))
135
+ errors.push('checkpoint-bundle-digest-invalid');
136
+ if (checkpoint.graphRevision !== undefined && !isHash(checkpoint.graphRevision))
137
+ errors.push('checkpoint-graph-revision-invalid');
138
+ if (checkpoint.claimRevision === undefined)
139
+ errors.push('checkpoint-claim-revision-required');
140
+ else if (!isHash(checkpoint.claimRevision))
141
+ errors.push('checkpoint-claim-revision-invalid');
142
+ if (!Array.isArray(checkpoint.receiptRefs) || checkpoint.receiptRefs.length === 0 || checkpoint.receiptRefs.some((ref) => !nonEmpty(ref))) {
143
+ errors.push('checkpoint-receipts-missing');
144
+ }
145
+ if (checkpoint.qaVerdict !== 'passed' && checkpoint.qaVerdict !== 'blocked')
146
+ errors.push('checkpoint-qa-verdict-invalid');
147
+ if (!['approved', 'changes-requested', 'pending'].includes(checkpoint.reviewVerdict))
148
+ errors.push('checkpoint-review-verdict-invalid');
149
+ if (!nonEmpty(checkpoint.recordedAt) || !Number.isFinite(Date.parse(checkpoint.recordedAt)))
150
+ errors.push('checkpoint-recorded-at-invalid');
151
+ if (checkpoint.reviewVerdict === 'approved' && checkpoint.qaVerdict !== 'passed')
152
+ errors.push('checkpoint-review-without-qa');
153
+ errors.push(...validateCheckpointEvidence(checkpoint));
154
+ return Object.freeze([...new Set(errors)]);
155
+ }
156
+ function validateCheckpointEvidence(checkpoint) {
157
+ const errors = [];
158
+ const qa = checkpoint.qaReceipt;
159
+ const review = checkpoint.reviewReceipt;
160
+ if (!qa)
161
+ errors.push('checkpoint-qa-evidence-required');
162
+ else {
163
+ if (qa.schemaVersion !== 1 || qa.kind !== 'story_qa_evidence' || qa.producer !== 'local-yolo-tdd'
164
+ || (qa.evidenceVersion !== undefined && qa.evidenceVersion !== 'git-immutable-v1'
165
+ && qa.evidenceVersion !== 'p205-execution-v2')
166
+ || qa.verdict !== checkpoint.qaVerdict || !evidenceBindingMatches(checkpoint, qa)
167
+ || !isHash(qa.sourceEvidenceDigest) || !nonEmpty(qa.receiptRef)
168
+ || qa.receiptRef !== `story-qa:${qa.sourceEvidenceDigest}`
169
+ || !Number.isFinite(Date.parse(qa.checkedAt))) {
170
+ errors.push('checkpoint-qa-evidence-invalid');
171
+ }
172
+ else if (qa.evidenceVersion === 'p205-execution-v2' && (qa.contract !== 'P205-CI-02'
173
+ || qa.command !== 'node scripts/test-root.mjs --gate complete'
174
+ || typeof qa.manifestDigest !== 'string' || !isHash(qa.manifestDigest)
175
+ || !Array.isArray(qa.gateIds) || qa.gateIds.length === 0 || qa.gateIds.some((gateId) => !nonEmpty(gateId))
176
+ || typeof qa.resultDigest !== 'string' || !isHash(qa.resultDigest))) {
177
+ errors.push('checkpoint-qa-execution-evidence-invalid');
178
+ }
179
+ }
180
+ if (checkpoint.reviewVerdict !== 'pending') {
181
+ if (!review)
182
+ errors.push('checkpoint-review-evidence-required');
183
+ else if (review.schemaVersion !== 1 || review.kind !== 'story_review_evidence'
184
+ || review.producer !== 'root-commit-range-review' || review.verdict !== checkpoint.reviewVerdict
185
+ || !evidenceBindingMatches(checkpoint, review) || !isHash(review.sourceEvidenceDigest)
186
+ || !nonEmpty(review.receiptRef) || review.receiptRef !== `story-review:${review.sourceEvidenceDigest}`
187
+ || !Number.isFinite(Date.parse(review.reviewedAt))) {
188
+ errors.push('checkpoint-review-evidence-invalid');
189
+ }
190
+ }
191
+ else if (review) {
192
+ errors.push('checkpoint-review-evidence-unexpected');
193
+ }
194
+ if (qa && review) {
195
+ if (qa.receiptRef === review.receiptRef || review.qaReceiptRef !== qa.receiptRef) {
196
+ errors.push('checkpoint-evidence-not-independent');
197
+ }
198
+ if (!checkpoint.receiptRefs.includes(qa.receiptRef) || !checkpoint.receiptRefs.includes(review.receiptRef)) {
199
+ errors.push('checkpoint-evidence-refs-unbound');
200
+ }
201
+ if (Date.parse(review.reviewedAt) < Date.parse(qa.checkedAt))
202
+ errors.push('checkpoint-review-before-qa');
203
+ }
204
+ return errors;
205
+ }
206
+ function evidenceBindingMatches(checkpoint, evidence) {
207
+ return evidence.storyId === checkpoint.storyId
208
+ && evidence.epicId === checkpoint.epicId
209
+ && evidence.baseSha === checkpoint.baseSha
210
+ && evidence.headSha === checkpoint.headSha
211
+ && Boolean(checkpoint.bundleDigest) && evidence.bundleDigest === checkpoint.bundleDigest
212
+ && Boolean(checkpoint.graphRevision) && evidence.graphRevision === checkpoint.graphRevision;
213
+ }
214
+ function sameEvidenceReceipt(left, right) {
215
+ return JSON.stringify(left ?? null) === JSON.stringify(right ?? null);
216
+ }
217
+ export function toStoryReviewRequest(checkpoint) {
218
+ return Object.freeze({
219
+ schemaVersion: 1,
220
+ kind: 'commit-range-review',
221
+ storyId: checkpoint.storyId,
222
+ epicId: checkpoint.epicId,
223
+ baseSha: checkpoint.baseSha,
224
+ headSha: checkpoint.headSha,
225
+ receiptRefs: checkpoint.receiptRefs,
226
+ gitPullRequest: false,
227
+ });
228
+ }
229
+ export function validateStoryRollback(receipt) {
230
+ const errors = [];
231
+ if (!isSha(receipt.originalBaseSha) || !isSha(receipt.originalHeadSha))
232
+ errors.push('rollback-invalid-original-range');
233
+ if (receipt.revertCommits.length === 0 || receipt.revertCommits.some((sha) => !isSha(sha)))
234
+ errors.push('rollback-revert-commits-required');
235
+ if (receipt.preservesLaterCommits !== true)
236
+ errors.push('rollback-must-preserve-later-commits');
237
+ if (receipt.historyRewrite !== false)
238
+ errors.push('rollback-history-rewrite-forbidden');
239
+ return Object.freeze([...new Set(errors)]);
240
+ }
241
+ export function assessEpicIntegrationReadiness(resolution, expectedStoryIds, checkpoints) {
242
+ const reasons = [];
243
+ if (resolution.mode !== 'epic')
244
+ reasons.push('epic-integration-not-applicable-to-story-mode');
245
+ if (!nonEmpty(resolution.executionBranch) || !nonEmpty(resolution.originBranch))
246
+ reasons.push('epic-branch-boundary-incomplete');
247
+ const byStory = new Map();
248
+ for (const checkpoint of checkpoints) {
249
+ if (!expectedStoryIds.includes(checkpoint.storyId))
250
+ reasons.push(`unexpected-story-checkpoint:${checkpoint.storyId}`);
251
+ if (byStory.has(checkpoint.storyId))
252
+ reasons.push(`duplicate-story-checkpoint:${checkpoint.storyId}`);
253
+ else
254
+ byStory.set(checkpoint.storyId, checkpoint);
255
+ }
256
+ for (const storyId of expectedStoryIds) {
257
+ const checkpoint = byStory.get(storyId);
258
+ if (!checkpoint)
259
+ reasons.push(`missing-story-checkpoint:${storyId}`);
260
+ else {
261
+ const validationErrors = validateStoryCheckpoint(checkpoint, resolution);
262
+ if (validationErrors.length > 0)
263
+ reasons.push(`invalid-story-checkpoint:${storyId}:${validationErrors.join(',')}`);
264
+ else if (checkpoint.qaVerdict !== 'passed' || checkpoint.reviewVerdict !== 'approved')
265
+ reasons.push(`unaccepted-story-checkpoint:${storyId}`);
266
+ }
267
+ }
268
+ return Object.freeze({
269
+ ready: reasons.length === 0,
270
+ gitPullRequestOwner: 'epic',
271
+ reasonCodes: Object.freeze(reasons),
272
+ checkpointStoryIds: Object.freeze(checkpoints.map((item) => item.storyId)),
273
+ });
274
+ }
275
+ function hasLegacyStoryGitProgress(story) {
276
+ return nonEmpty(story.branch_name) ||
277
+ (typeof story.pr_number === 'number' && story.pr_number > 0) ||
278
+ (story.steps_completed ?? []).some((step) => LEGACY_INTEGRATION_STEPS.has(step) && !(step === 'step-c-11-review-pr' && story.checkpoint));
279
+ }
280
+ /**
281
+ * An explicit epic boundary may coexist with steps written by older runners.
282
+ * Those step labels are not physical proof of a story-owned branch or PR. Only
283
+ * a distinct branch/ref, a positive story PR, C12, or a checkpoint bound to a
284
+ * different branch can override the immutable epic boundary. Malformed PR
285
+ * metadata at a PR-producing step remains fail-closed and publicly diagnosable.
286
+ */
287
+ function classifyRecordedEpicStoryGitEvidence(epic, stories) {
288
+ let result = 'none';
289
+ const executionBranch = nonEmpty(epic.execution_branch) ? epic.execution_branch.trim() : null;
290
+ for (const story of stories) {
291
+ const storyBranch = nonEmpty(story.branch_name) ? story.branch_name.trim() : null;
292
+ const checkpointBranch = nonEmpty(story.checkpoint?.branch) ? story.checkpoint.branch.trim() : null;
293
+ const steps = new Set(story.steps_completed ?? []);
294
+ if ((storyBranch && storyBranch !== executionBranch) ||
295
+ (checkpointBranch && checkpointBranch !== executionBranch) ||
296
+ (typeof story.pr_number === 'number' && story.pr_number > 0) ||
297
+ steps.has('step-c-12-merge-pr')) {
298
+ return 'strong';
299
+ }
300
+ const hasPrProducingStep = steps.has('step-c-10-create-pr');
301
+ const hasMalformedPrMarker = story.pr_number !== null && story.pr_number !== undefined &&
302
+ !(typeof story.pr_number === 'number' && story.pr_number > 0);
303
+ if (hasPrProducingStep && hasMalformedPrMarker)
304
+ result = 'ambiguous';
305
+ }
306
+ return result;
307
+ }
308
+ function hasAnyStoryProgress(story) {
309
+ return nonEmpty(story.branch_name) ||
310
+ (typeof story.pr_number === 'number' && story.pr_number > 0) ||
311
+ (story.steps_completed ?? []).length > 0 ||
312
+ Boolean(story.checkpoint);
313
+ }
314
+ function hasEpicGitProgress(epic, stories) {
315
+ return nonEmpty(epic.execution_branch) ||
316
+ Boolean(epic.branch_lease) ||
317
+ (typeof epic.pr_number === 'number' && epic.pr_number > 0) ||
318
+ stories.some((story) => Boolean(story.checkpoint));
319
+ }
320
+ function resolution(mode, source, immutable, epic, reasonCodes) {
321
+ return Object.freeze({
322
+ schemaVersion: 1,
323
+ epicId: epic.id,
324
+ mode,
325
+ source,
326
+ immutable,
327
+ ...(nonEmpty(epic.execution_branch) ? { executionBranch: epic.execution_branch } : {}),
328
+ ...(nonEmpty(epic.origin_branch) ? { originBranch: epic.origin_branch } : {}),
329
+ reasonCodes: Object.freeze([...reasonCodes]),
330
+ });
331
+ }
332
+ function nonEmpty(value) {
333
+ return typeof value === 'string' && value.trim().length > 0;
334
+ }
335
+ function isSha(value) {
336
+ return /^[0-9a-f]{7,64}$/i.test(value);
337
+ }
338
+ function isHash(value) {
339
+ return /^[0-9a-f]{64}$/i.test(value);
340
+ }
341
+ function sameStrings(left, right) {
342
+ return left.length === right.length && left.every((value, index) => value === right[index]);
343
+ }
@@ -1,4 +1,4 @@
1
- # 🧠 Neocortex v4.60.28 | OrNexus Team
1
+ # 🧠 Neocortex v4.60.30 | OrNexus Team
2
2
 
3
3
  This project uses Neocortex, a Development Orchestrator.
4
4
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.28 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.30 | OrNexus Team"
4
4
  ---
5
5
 
6
6
  <!--
@@ -4,7 +4,7 @@ agent:
4
4
  name: 'Neocortex Root Agent'
5
5
  title: 'Development Orchestrator (Root)'
6
6
  icon: '>'
7
- version: '4.60.28'
7
+ version: '4.60.30'
8
8
  architecture: 'thin-client'
9
9
  module: stand-alone
10
10
  hasSidecar: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex-root
3
- description: "🧠 Neocortex Root Agent v4.60.28 | OrNexus Team"
3
+ description: "🧠 Neocortex Root Agent v4.60.30 | OrNexus Team"
4
4
  model: opus
5
5
  color: blue
6
6
  tools:
@@ -108,7 +108,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
108
108
  ┌────────────────────────────────────────────────────────────┐
109
109
  │ │
110
110
  │ ####### N E O C O R T E X │
111
- │ ### ######## v4.60.28
111
+ │ ### ######## v4.60.30
112
112
  │ ######### ##### │
113
113
  │ ## ############## Development Orchestrator │
114
114
  │ ## ### ###### ## OrNexus Team │
@@ -4,7 +4,7 @@ agent:
4
4
  name: 'Neocortex'
5
5
  title: 'Development Orchestrator'
6
6
  icon: '>'
7
- version: '4.60.28'
7
+ version: '4.60.30'
8
8
  architecture: 'thin-client'
9
9
  module: stand-alone
10
10
  hasSidecar: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.28 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.30 | OrNexus Team"
4
4
  model: opus
5
5
  color: blue
6
6
  permissionMode: bypassPermissions
@@ -104,7 +104,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
104
104
  ┌────────────────────────────────────────────────────────────┐
105
105
  │ │
106
106
  │ ####### N E O C O R T E X │
107
- │ ### ######## v4.60.28
107
+ │ ### ######## v4.60.30
108
108
  │ ######### ##### │
109
109
  │ ## ############## Development Orchestrator │
110
110
  │ ## ### ###### ## OrNexus Team │
@@ -28,7 +28,7 @@ Codex built-in commands or actions.
28
28
 
29
29
  <!-- END: Plugin Conflict Prevention -->
30
30
 
31
- # Neocortex v4.60.28 | OrNexus Team
31
+ # Neocortex v4.60.30 | OrNexus Team
32
32
 
33
33
  You are a Development Orchestrator. All orchestration logic is delivered by the remote Neocortex server.
34
34
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.28 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.30 | OrNexus Team"
4
4
  model: inherit
5
5
  readonly: false
6
6
  is_background: false
@@ -64,7 +64,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
64
64
  ┌────────────────────────────────────────────────────────────┐
65
65
  │ │
66
66
  │ ####### N E O C O R T E X │
67
- │ ### ######## v4.60.28
67
+ │ ### ######## v4.60.30
68
68
  │ ######### ##### │
69
69
  │ ## ############## Development Orchestrator │
70
70
  │ ## ### ###### ## OrNexus Team │
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex-root
3
- description: "🧠 Neocortex v4.60.28 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.30 | OrNexus Team"
4
4
  kind: local
5
5
  tools:
6
6
  # File operations (Gemini CLI built-ins)
@@ -62,7 +62,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
62
62
  ┌────────────────────────────────────────────────────────────┐
63
63
  │ │
64
64
  │ ####### N E O C O R T E X │
65
- │ ### ######## v4.60.28
65
+ │ ### ######## v4.60.30
66
66
  │ ######### ##### │
67
67
  │ ## ############## Development Orchestrator │
68
68
  │ ## ### ###### ## OrNexus Team │
@@ -58,7 +58,7 @@ explicit server opt-in rather than a local assumption.
58
58
  ┌────────────────────────────────────────────────────────────┐
59
59
  │ │
60
60
  │ ####### N E O C O R T E X │
61
- │ ### ######## v4.60.28
61
+ │ ### ######## v4.60.30
62
62
  │ ######### ##### │
63
63
  │ ## ############## Development Orchestrator │
64
64
  │ ## ### ###### ## OrNexus Team │
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: "neocortex"
3
- description: "Neocortex v4.60.28 | OrNexus Team"
3
+ description: "Neocortex v4.60.30 | OrNexus Team"
4
4
  tools:
5
5
  # Read / Edit (built-in tool sets)
6
6
  - read
@@ -68,7 +68,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
68
68
  ┌────────────────────────────────────────────────────────────┐
69
69
  │ │
70
70
  │ ####### N E O C O R T E X │
71
- │ ### ######## v4.60.28
71
+ │ ### ######## v4.60.30
72
72
  │ ######### ##### │
73
73
  │ ## ############## Development Orchestrator │
74
74
  │ ## ### ###### ## OrNexus Team │