@ornexus/neocortex 4.60.41 → 4.60.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/sbom.cdx.json +31 -31
  2. package/install.ps1 +1 -1
  3. package/install.sh +1 -1
  4. package/package.json +14 -2
  5. package/packages/client/dist/commands/invoke.js +39 -38
  6. package/packages/client/dist/generated/command-registry.generated.d.ts +66 -23
  7. package/packages/client/dist/generated/command-registry.generated.js +1 -1
  8. package/packages/client/dist/generated/public-projections.generated.d.ts +100 -0
  9. package/packages/client/dist/generated/public-projections.generated.js +1 -0
  10. package/packages/client/dist/git/git-lifecycle-store.d.ts +17 -0
  11. package/packages/client/dist/git/git-lifecycle-store.js +4 -4
  12. package/packages/client/dist/index.d.ts +1 -0
  13. package/packages/client/dist/index.js +1 -1
  14. package/packages/client/dist/migrations/project-identity.js +7 -7
  15. package/packages/client/dist/migrations/state-json.d.ts +14 -0
  16. package/packages/client/dist/migrations/state-json.js +4 -0
  17. package/packages/client/dist/runner/headless/epic-git-reconciliation-inventory.d.ts +2 -0
  18. package/packages/client/dist/runner/headless/epic-git-reconciliation-inventory.js +1 -1
  19. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.js +8 -8
  20. package/packages/client/dist/state/state-json-repair.js +3 -3
  21. package/packages/client/dist/yoloop/invoke-hooks.d.ts +2 -3
  22. package/packages/client/dist/yoloop/invoke-hooks.js +9 -8
  23. package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +87 -1
  24. package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +27 -3
  25. package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -1
  26. package/packages/shared/dist/command-registry-contract.js +38 -0
  27. package/packages/shared/dist/continuity/goal-operation-authority.js +48 -0
  28. package/packages/shared/dist/executable-graph-catalog/contracts.js +935 -0
  29. package/packages/shared/dist/generated/command-registry.generated.js +82 -23
  30. package/packages/shared/dist/generated/invocation-schema.generated.js +12 -4
  31. package/packages/shared/dist/generated/public-projections.generated.js +149 -0
  32. package/packages/shared/dist/invocation/executable-policy-recovery.d.ts +83 -0
  33. package/packages/shared/dist/invocation/executable-policy-recovery.js +272 -0
  34. package/packages/shared/dist/invocation/index.d.ts +3 -1
  35. package/packages/shared/dist/invocation/index.js +40 -1
  36. package/packages/shared/dist/invocation/recovery-route-compiler.d.ts +56 -0
  37. package/packages/shared/dist/invocation/recovery-route-compiler.js +214 -0
  38. package/packages/shared/dist/state/index.d.ts +1 -0
  39. package/packages/shared/dist/state/index.js +1 -0
  40. package/packages/shared/dist/state/state-migration.d.ts +58 -0
  41. package/packages/shared/dist/state/state-migration.js +404 -0
  42. package/packages/shared/dist/yoloop/canonical.js +15 -0
  43. package/packages/shared/dist/yoloop/operational-budget.js +164 -0
  44. package/packages/shared/dist/yoloop/recovery-types.js +39 -0
  45. package/targets-stubs/antigravity/gemini.md +1 -1
  46. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  47. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  48. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  49. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  50. package/targets-stubs/claude-code/neocortex.md +2 -2
  51. package/targets-stubs/codex/AGENTS.md +11 -2
  52. package/targets-stubs/codex/README.md +7 -4
  53. package/targets-stubs/codex/neocortex.toml +53 -6
  54. package/targets-stubs/cursor/agent.md +2 -2
  55. package/targets-stubs/gemini-cli/agent.md +2 -2
  56. package/targets-stubs/opencode/neocortex-root.md +1 -1
  57. package/targets-stubs/vscode/neocortex.agent.md +2 -2
@@ -0,0 +1,100 @@
1
+ /** Generated by scripts/generate-public-catalog-projections.mjs. Do not edit. */
2
+ export declare const PUBLIC_PROJECTION_BUNDLE: {
3
+ readonly schemaVersion: "PublicProjectionBundle/1.0";
4
+ readonly generationId: "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d";
5
+ readonly sourceHash: "e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d";
6
+ readonly catalogHash: "ef01b19a69035c03fc0ab72347bb2eb69f9cd5b88290e7e8e6d697a60462ebbb";
7
+ readonly publicProjectionHash: "fa59fd5ab25b6f6155eabb0f06aad0d08583700e6594c9fb68f0878d6578bb0e";
8
+ readonly stageProjectionHash: "4f57af9f2c74c36148a4a0aa5415c7cc3cac9ee435c0578a2fc6eb385dbb468b";
9
+ readonly compilationHash: "41157e76e50487bb23ff21f41216c7250934bff8273267443c9b3d145c398267";
10
+ readonly registry: {
11
+ readonly version: "1.0.0";
12
+ readonly checksum: "b9a97bc12316a913b72a27e1d4c18e749737da40003bd73f60350b07408bd5c7";
13
+ };
14
+ readonly artifacts: readonly [{
15
+ readonly kind: "catalog";
16
+ readonly schemaVersion: "ExecutableGraphCatalogPublicProjection/1.0";
17
+ readonly relativePath: "catalog.json";
18
+ readonly sha256: "8c3b5e31e03c2cbe80112c01a0dd243c07451c03a3102029b7df7f67f152e57a";
19
+ readonly entryCount: 97;
20
+ readonly generationId: "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d";
21
+ }, {
22
+ readonly kind: "commands";
23
+ readonly schemaVersion: "CommandRegistryPublicProjection/1.0";
24
+ readonly relativePath: "commands.json";
25
+ readonly sha256: "122143b8cc2447a17eebe3aaa6aba8bf906433895f16037b1b99ee931c617b61";
26
+ readonly entryCount: 62;
27
+ readonly generationId: "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d";
28
+ }, {
29
+ readonly kind: "progress-view";
30
+ readonly schemaVersion: "ProgressViewContractProjection/1.0";
31
+ readonly relativePath: "progress-view.json";
32
+ readonly sha256: "90cbd37693bcf0a9b6dd7e89201fd4b487be9254c1bcfe1f84a36fff510f5a7d";
33
+ readonly entryCount: 1;
34
+ readonly generationId: "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d";
35
+ }, {
36
+ readonly kind: "stages";
37
+ readonly schemaVersion: "ExecutableGraphStageProjection/1.0";
38
+ readonly relativePath: "stages.json";
39
+ readonly sha256: "724a2e51c3666410b0f8b5b15a27bb9f53f5e280f3d362d77e98de0d316a9182";
40
+ readonly entryCount: 85;
41
+ readonly generationId: "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d";
42
+ }, {
43
+ readonly kind: "surfaces";
44
+ readonly schemaVersion: "PublicProjectionSurfaces/1.0";
45
+ readonly relativePath: "surfaces.json";
46
+ readonly sha256: "119607b7fe50d1564bebce0571bfa981a91ede109bc3f1f0e02e71b3e106e10a";
47
+ readonly entryCount: 6;
48
+ readonly generationId: "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d";
49
+ }];
50
+ readonly compatibility: {
51
+ readonly status: "compatible";
52
+ readonly routeCount: 97;
53
+ readonly rootCommandCount: 62;
54
+ readonly operationCount: 35;
55
+ readonly aliasCount: 199;
56
+ };
57
+ readonly contractVersions: {
58
+ readonly catalog: "ExecutableGraphCatalogPublicProjection/1.0";
59
+ readonly stages: "ExecutableGraphStageProjection/1.0";
60
+ readonly progress: "ProgressSnapshot/1.0";
61
+ readonly progressView: "ProgressView/1.0";
62
+ readonly readiness: "ExecutableGraphReadinessVector/1.0";
63
+ readonly validation: "ValidationMatrix/1.1";
64
+ };
65
+ readonly surfaces: readonly [{
66
+ readonly kind: "admin";
67
+ readonly artifactKinds: readonly ["catalog", "stages", "commands", "surfaces", "progress-view"];
68
+ readonly progressView: "ProgressView/1.0";
69
+ readonly authority: "read-only-projection";
70
+ }, {
71
+ readonly kind: "client";
72
+ readonly artifactKinds: readonly ["catalog", "stages", "commands", "surfaces", "progress-view"];
73
+ readonly progressView: "ProgressView/1.0";
74
+ readonly authority: "read-only-projection";
75
+ }, {
76
+ readonly kind: "docs";
77
+ readonly artifactKinds: readonly ["catalog", "stages", "commands", "surfaces", "progress-view"];
78
+ readonly progressView: "ProgressView/1.0";
79
+ readonly authority: "read-only-projection";
80
+ }, {
81
+ readonly kind: "metrics";
82
+ readonly artifactKinds: readonly ["catalog", "stages", "commands", "surfaces", "progress-view"];
83
+ readonly progressView: "ProgressView/1.0";
84
+ readonly authority: "read-only-projection";
85
+ }, {
86
+ readonly kind: "runtime-preview";
87
+ readonly artifactKinds: readonly ["catalog", "stages", "commands", "surfaces", "progress-view"];
88
+ readonly progressView: "ProgressView/1.0";
89
+ readonly authority: "read-only-projection";
90
+ }, {
91
+ readonly kind: "tests";
92
+ readonly artifactKinds: readonly ["catalog", "stages", "commands", "surfaces", "progress-view"];
93
+ readonly progressView: "ProgressView/1.0";
94
+ readonly authority: "read-only-projection";
95
+ }];
96
+ readonly publicSafe: true;
97
+ readonly bundleHash: "acd1a64265cccf291d3d26a4fb49620828e3c53bcf0451db5d8c5a8ddf320ea0";
98
+ };
99
+ export declare const PUBLIC_PROJECTION_GENERATION_ID: "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d";
100
+ export declare const PUBLIC_PROJECTION_BUNDLE_HASH: "acd1a64265cccf291d3d26a4fb49620828e3c53bcf0451db5d8c5a8ddf320ea0";
@@ -0,0 +1 @@
1
+ const e={schemaVersion:"PublicProjectionBundle/1.0",generationId:"sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d",sourceHash:"e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d",catalogHash:"ef01b19a69035c03fc0ab72347bb2eb69f9cd5b88290e7e8e6d697a60462ebbb",publicProjectionHash:"fa59fd5ab25b6f6155eabb0f06aad0d08583700e6594c9fb68f0878d6578bb0e",stageProjectionHash:"4f57af9f2c74c36148a4a0aa5415c7cc3cac9ee435c0578a2fc6eb385dbb468b",compilationHash:"41157e76e50487bb23ff21f41216c7250934bff8273267443c9b3d145c398267",registry:{version:"1.0.0",checksum:"b9a97bc12316a913b72a27e1d4c18e749737da40003bd73f60350b07408bd5c7"},artifacts:[{kind:"catalog",schemaVersion:"ExecutableGraphCatalogPublicProjection/1.0",relativePath:"catalog.json",sha256:"8c3b5e31e03c2cbe80112c01a0dd243c07451c03a3102029b7df7f67f152e57a",entryCount:97,generationId:"sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"},{kind:"commands",schemaVersion:"CommandRegistryPublicProjection/1.0",relativePath:"commands.json",sha256:"122143b8cc2447a17eebe3aaa6aba8bf906433895f16037b1b99ee931c617b61",entryCount:62,generationId:"sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"},{kind:"progress-view",schemaVersion:"ProgressViewContractProjection/1.0",relativePath:"progress-view.json",sha256:"90cbd37693bcf0a9b6dd7e89201fd4b487be9254c1bcfe1f84a36fff510f5a7d",entryCount:1,generationId:"sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"},{kind:"stages",schemaVersion:"ExecutableGraphStageProjection/1.0",relativePath:"stages.json",sha256:"724a2e51c3666410b0f8b5b15a27bb9f53f5e280f3d362d77e98de0d316a9182",entryCount:85,generationId:"sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"},{kind:"surfaces",schemaVersion:"PublicProjectionSurfaces/1.0",relativePath:"surfaces.json",sha256:"119607b7fe50d1564bebce0571bfa981a91ede109bc3f1f0e02e71b3e106e10a",entryCount:6,generationId:"sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"}],compatibility:{status:"compatible",routeCount:97,rootCommandCount:62,operationCount:35,aliasCount:199},contractVersions:{catalog:"ExecutableGraphCatalogPublicProjection/1.0",stages:"ExecutableGraphStageProjection/1.0",progress:"ProgressSnapshot/1.0",progressView:"ProgressView/1.0",readiness:"ExecutableGraphReadinessVector/1.0",validation:"ValidationMatrix/1.1"},surfaces:[{kind:"admin",artifactKinds:["catalog","stages","commands","surfaces","progress-view"],progressView:"ProgressView/1.0",authority:"read-only-projection"},{kind:"client",artifactKinds:["catalog","stages","commands","surfaces","progress-view"],progressView:"ProgressView/1.0",authority:"read-only-projection"},{kind:"docs",artifactKinds:["catalog","stages","commands","surfaces","progress-view"],progressView:"ProgressView/1.0",authority:"read-only-projection"},{kind:"metrics",artifactKinds:["catalog","stages","commands","surfaces","progress-view"],progressView:"ProgressView/1.0",authority:"read-only-projection"},{kind:"runtime-preview",artifactKinds:["catalog","stages","commands","surfaces","progress-view"],progressView:"ProgressView/1.0",authority:"read-only-projection"},{kind:"tests",artifactKinds:["catalog","stages","commands","surfaces","progress-view"],progressView:"ProgressView/1.0",authority:"read-only-projection"}],publicSafe:!0,bundleHash:"acd1a64265cccf291d3d26a4fb49620828e3c53bcf0451db5d8c5a8ddf320ea0"},a=e.generationId,c=e.bundleHash;export{e as PUBLIC_PROJECTION_BUNDLE,c as PUBLIC_PROJECTION_BUNDLE_HASH,a as PUBLIC_PROJECTION_GENERATION_ID};
@@ -90,6 +90,23 @@ export declare function executeP205TransientAuthority(projectRoot: string, input
90
90
  readonly identity: AnchoredDirectoryIdentity;
91
91
  };
92
92
  }): Promise<P205TransientExecutionAuthority>;
93
+ /**
94
+ * Execute the physical P205 gate once for one immutable HEAD and mint a
95
+ * separate opaque authority for every historical graph epoch accepted at that
96
+ * HEAD. The graph revision remains part of each evidence digest; only the
97
+ * expensive, graph-independent command execution is shared.
98
+ */
99
+ export declare function executeP205TransientAuthorities(projectRoot: string, input: {
100
+ readonly headSha: string;
101
+ readonly graphRevisions: readonly string[];
102
+ readonly nowIso?: string;
103
+ /** Internal detached QA sandbox; no replaceable command/executor seam. */
104
+ readonly anchoredWorkspace?: {
105
+ readonly parent: string;
106
+ readonly name: string;
107
+ readonly identity: AnchoredDirectoryIdentity;
108
+ };
109
+ }): Promise<ReadonlyMap<string, P205TransientExecutionAuthority>>;
93
110
  export declare function readGitLifecycleRuntime(projectRoot: string, options?: GitLifecycleReadOptions): Promise<GitLifecycleRuntimeDocument>;
94
111
  export declare function readGitLifecycleRuntimeSync(projectRoot: string, options?: GitLifecycleReadOptions): GitLifecycleRuntimeDocument;
95
112
  /**
@@ -1,4 +1,4 @@
1
- import{execFile as ni,execFileSync as re}from"node:child_process";import{createHash as b,randomBytes as ye}from"node:crypto";import{lstat as be,open as ai,readFile as H,realpath as U,stat as ci}from"node:fs/promises";import{existsSync as q,lstatSync as Oe,readFileSync as Pe,realpathSync as we}from"node:fs";import{basename as A,dirname as K,isAbsolute as ne,join as y,relative as oi,resolve as p}from"node:path";import{promisify as si}from"node:util";import{publicWriteSet as di}from"../../../shared/dist/yoloop/public-story-write-set.js";import{resolveBranchUnit as fi}from"../../../shared/dist/yoloop/branch-unit.js";import{anchoredAtomicWriteFile as ui,anchoredCreateOwnedDirectory as Ne,anchoredEnsureDirectory as Be,anchoredExecuteGit as gi,anchoredExecuteNode as $e,anchoredRemoveDirectory as hi,anchoredRenameDirectory as ie}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as li,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as mi}from"./git-lifecycle-step-ids.js";const N=si(ni),de="neocortex-yoloop",fe="runtime.json",V="node scripts/test-root.mjs --gate complete",Ve=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),pi=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",yi="runtime.lock",Le=new WeakMap;async function mt(i,e){if(!_(e.headSha)||!h(e.graphRevision))throw new Error("p205-transient-binding-invalid");const t=e.anchoredWorkspace;if(t&&p(i)!==y(p(t.parent),t.name))throw new Error("p205-transient-anchor-binding-invalid");const r=async R=>t?(await gi(t.parent,t.name,t.identity,R)).toString("utf8"):String((await N("git",[...R],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout),n=async()=>t?JSON.parse((await $e(t.parent,t.name,t.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(y(i,"config","release-gates.v2.json"),"utf8"),runner:await H(y(i,"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:d}=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||d!==c)throw new Error("p205-transient-producer-dirty");const f=JSON.parse(o),v=Array.isArray(f.requiredCompleteClasses)?f.requiredCompleteClasses.filter(R=>typeof R=="string"&&/^[a-z0-9-]+$/.test(R)):[];if(f.contract!=="P205-CI-02"||v.length===0)throw new Error("p205-transient-manifest-invalid");const g=t?(await $e(t.parent,t.name,t.identity,["scripts/test-root.mjs","--gate","complete"])).toString("utf8"):String((await N(process.execPath,["scripts/test-root.mjs","--gate","complete"],{cwd:i,encoding:"utf8",maxBuffer:64*1024*1024})).stdout),{manifest:l,runner:w}=await n();if(l!==o||w!==d)throw new Error("p205-transient-producer-raced");if((await r(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-raced");const P=b("sha256").update(o).digest("hex"),I=b("sha256").update(g).digest("hex"),Q=ce(e.nowIso??new Date().toISOString()),S=b("sha256").update(["p205-transient-execution-v1",V,e.headSha,e.graphRevision,P,v.join(","),I,Q].join("\0")).digest("hex"),m=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:V,executionHeadSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:P,gateIds:Object.freeze(v),resultDigest:I,executedAt:Q,executionEvidenceDigest:S}),F=Object.freeze(Object.create(null));return Le.set(F,m),F}async function ve(i,e={}){const t=await Oi(i);return Ye(t,e)}function bi(i,e={}){let t;try{const r=re("git",["rev-parse","--git-common-dir"],{cwd:i,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=we(i),a=ne(r)?p(r):p(n,r),o=we(a);if(o!==a)throw new Error("git-lifecycle-common-dir-symlink");Li(o);const d=y(o,de),u=y(d,fe);if(q(d)&&(Je(d,"directory"),we(d)!==d))throw new Error("git-lifecycle-runtime-directory-symlink");t=q(u)?u:y(o,Se)}catch{if(e.required)throw new Error("git-lifecycle-common-dir-invalid");return Ee()}if(!q(t)){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}return Je(t,"file"),xe(JSON.parse(Pe(t,"utf8")))}async function pt(i){try{await ve(i,{required:!0});return}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-missing")throw e}try{await je(i,()=>{},{expectedRevision:0})}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-revision-conflict")throw e;await ve(i,{required:!0})}}function qe(i,e,t){if(!i||i.ownerStoryId!==e)return!1;const r=typeof i.sessionId=="string"?i.sessionId:"",n=Date.parse(String(i.expiresAt));return/^setup-[a-f0-9]{64}$/.test(r)&&i.idempotencyKey===r&&Number.isFinite(n)&&n>t}async function yt(i,e,t=new Date().toISOString()){if(!et(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=y(p(i),".neocortex","state.json"),n=await H(r,"utf8"),a=s(JSON.parse(n));if(!a)throw new Error("git-lifecycle-tracked-state-invalid");const o=await ve(i),d=Si(a,o),u=s(s(d.epics)?.[e.epicId]),c=s(s(d.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(S=>typeof S=="string"):Object.keys(s(d.stories)??{}).filter(S=>{const m=s(s(d.stories)?.[S]);return String(m?.epic_id??S.split(".")[0])===e.epicId});if(Array.isArray(u.stories)&&!f.includes(e.storyId))throw new Error("git-lifecycle-graph-authority-story-invalid");const v=f.map(S=>{const m=s(s(d.stories)?.[S])??{};return{id:S,branch_name:typeof m.branch_name=="string"||m.branch_name===null?m.branch_name:void 0,pr_number:typeof m.pr_number=="number"||m.pr_number===null?m.pr_number:void 0,steps_completed:Array.isArray(m.steps_completed)?m.steps_completed.filter(F=>typeof F=="string"):[],checkpoint:s(m.checkpoint)}}),g=fi({...u,id:e.epicId},v);if(g.mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-invalid");if(g.executionBranch!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-mismatch");if(g.originBranch!==void 0&&g.originBranch!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");const l=typeof s(o.epics[e.epicId])?.origin_branch=="string"?String(s(o.epics[e.epicId]).origin_branch):void 0;if(l!==void 0&&l!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");if(g.originBranch===void 0&&l===void 0){const{stdout:S}=await N("git",["branch","--show-current"],{cwd:i,encoding:"utf8",maxBuffer:1048576});if(String(S).trim()!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-physical-mismatch")}const w=typeof u.graph_revision=="string"?u.graph_revision:void 0,B=typeof s(o.epics[e.epicId])?.graph_revision=="string"?String(s(o.epics[e.epicId]).graph_revision):void 0;if(w!==void 0&&!h(w))throw new Error("git-lifecycle-graph-revision-invalid");if(w===e.graphRevision&&B===e.graphRevision&&g.originBranch===e.originBranch&&l===e.originBranch)return{applied:!1,reused:!0,revision:o.revision,graphRevision:e.graphRevision};const P=Date.parse(t);if(!Number.isFinite(P))throw new Error("git-lifecycle-graph-authority-time-invalid");const I=s(u.branch_lease);if(I&&Number.isFinite(Date.parse(String(I.expiresAt)))&&Date.parse(String(I.expiresAt))>P&&!qe(I,e.storyId,P))throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await je(i,S=>{const m=vi(S,e.epicId);if(m.branch_mode!==void 0&&m.branch_mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-raced");const F=m.execution_branch;if(F!==void 0&&F!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const R=m.origin_branch;if(R!==void 0&&R!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-raced");const X=m.graph_revision;if(X!==void 0&&X!==w)throw new Error("git-lifecycle-graph-authority-epoch-raced");const M=s(m.branch_lease);if(M&&Number.isFinite(Date.parse(String(M.expiresAt)))&&Date.parse(String(M.expiresAt))>P&&!qe(M,e.storyId,P))throw new Error("git-lifecycle-graph-authority-writer-active");m.branch_mode="epic",m.execution_branch=e.executionBranch,m.origin_branch=e.originBranch,m.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 je(i,e,t={}){const r=await _e(i),n=await We(r),a=y(n,yi),o=await tt(a);try{const d=y(n,fe),u=y(r,Se),c=await Ye(q(d)?d:u);if(t.expectedRevision!==void 0&&t.expectedRevision!==c.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const f=structuredClone(c),v=e(f),g=xe({...f,schemaVersion:1,revision:c.revision+1});return await t.preCommit?.(g),await z(n,"directory"),await $i(d),await ui(n,fe,`${JSON.stringify(g,null,2)}
2
- `),await z(d,"file"),await wi(n),{document:g,value:v}}finally{await rt(a,o).catch(()=>{})}}async function wi(i){let e;try{e=await ai(i,"r")}catch(t){if(process.platform==="win32"&&(C(t,"EPERM")||C(t,"EISDIR")||C(t,"EINVAL")))return;throw t}try{await e.sync()}finally{await e.close()}}function Si(i,e){const t=structuredClone(i),r=ze(t,"epics"),n=ze(t,"stories");for(const[a,o]of Object.entries(e.epics))r[a]={...s(r[a])??{},...structuredClone(o)};for(const[a,o]of Object.entries(e.stories))n[a]={...s(n[a])??{},...structuredClone(o)};return t}function ze(i,e){const t=i[e];if(t===void 0){const a={};return i[e]=a,a}const r=s(t);if(r)return r;if(!Array.isArray(t))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of t){const o=s(a),d=typeof o?.id=="string"?o.id.trim():"";if(!d||n[d]!==void 0)throw new Error(`git-lifecycle-tracked-${e}-ambiguous`);n[d]=o}return i[e]=n,n}function vi(i,e){return i.epics[e]??(i.epics[e]={})}function bt(i,e){return i.stories[e]??(i.stories[e]={})}function Ge(i,e,t,r){const n=s(i);return!!(n&&n.epicId===t&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&Qe(n,e))}async function wt(i,e,t,r,n,a,o=[]){return Di(i,e,t,r,n,a,o).verdict==="verified"}function Di(i,e,t,r,n,a,o=[],d=new Date().toISOString()){const u=()=>Ci({storyId:t,epicId:r,executionBranch:n,value:e,verifiedAt:d,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!Ge(e,t,r,n))return u();const c=s(e),f=s(c.qaReceipt),v=s(c.reviewReceipt),g=String(c.headSha),l=String(c.baseSha),w=j(i,["rev-parse",`refs/heads/${n}`]).trim();re("git",["merge-base","--is-ancestor",g,w],{cwd:i,stdio:"ignore"});const B=j(i,["show","--no-patch","--format=%H%n%P%n%B",g]),P=j(i,["rev-parse",`${g}^`]).trim(),I=j(i,["rev-list","--count",`${l}..${g}`]).trim();if(P!==l||I!=="1")return u();const Q=new Set(B.split(`
3
- `).map(G=>G.trim())),m=[`Neocortex-Story: ${t}`,`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=>Q.has(G));if(m){const Ce=[...Q].find(ri=>ri.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(Ce))return u();re("git",["merge-base","--is-ancestor",Ce,g],{cwd:i,stdio:"ignore"})}const R=j(i,["diff-tree","--no-commit-id","--name-only","-r","-z",g]).split("\0").filter(Boolean);if(R.length===0||R.some(G=>!ge(G)))return u();const X=b("sha256").update(B).digest("hex"),M=b("sha256").update([...R].sort().join("\0")).digest("hex"),$=He({checkpoint:c,storyId:t,epicId:r,executionBranch:n,baseSha:l,headSha:g,commitBodyDigest:X,changedPathsDigest:M,changedPaths:R,authorizedWriteSet:o.length>0?o:Ei(i,t)});if(!$||f.receiptRef!==`story-qa:${String(f.sourceEvidenceDigest)}`)return u();const Re=Ai({storyId:t,baseSha:l,headSha:g,bundleDigest:String(c.bundleDigest),graphRevision:String(c.graphRevision),commitBody:B,changedPaths:R}),Ae=f.evidenceVersion==="p205-execution-v2"&&f.contract==="P205-CI-02"&&f.command===V&&h(f.manifestDigest)&&L(f.gateIds,32,!0)&&h(f.resultDigest)&&f.sourceEvidenceDigest===ki({gitEvidenceDigest:Re,headSha:g,graphRevision:String(c.graphRevision),manifestDigest:String(f.manifestDigest),gateIds:f.gateIds,resultDigest:String(f.resultDigest)}),ei=f.evidenceVersion==="git-immutable-v1"&&f.sourceEvidenceDigest===Re,ii=f.evidenceVersion===void 0&&$.mode==="legacy-migration"&&$.binding?.qaDigest===f.sourceEvidenceDigest,me=_i(a,w,String(c.graphRevision))&&(Ae||$.mode==="legacy-migration"&&(ei||ii)),pe=a===void 0&&Ae;if(!me&&!pe)return u();const ke=b("sha256").update(["root-commit-range-review-v1",t,l,g,String(c.bundleDigest),String(c.graphRevision),String(f.receiptRef),b("sha256").update(B).digest("hex"),[...R].sort().join(",")].join("\0")).digest("hex");if(v.sourceEvidenceDigest!==ke||v.receiptRef!==`story-review:${ke}`||$.mode==="legacy-migration"&&$.binding?.reviewDigest!==void 0&&$.binding.reviewDigest!==v.sourceEvidenceDigest||!m&&(Ve[t]!==g||!Array.isArray(c.receiptRefs)||!c.receiptRefs.some(G=>typeof G=="string"&&G.startsWith("legacy-direct-yolo:"))))return u();const ti=b("sha256").update(["checkpoint-p205-transient-v1",t,r,n,l,g,String(c.bundleDigest),X,M,$.mode,$.effectiveClaimRevision,String(f.sourceEvidenceDigest),String(v.sourceEvidenceDigest),ae(a)?.executionEvidenceDigest??(pe?"maintenance-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),ee=me?ae(a):void 0;return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:t,epicId:r,branch:n,baseSha:l,headSha:g,aggregateHeadSha:ee?.executionHeadSha??g,commitBodyDigest:X,changedPathsDigest:M,claimVerification:$.mode,effectiveClaimRevision:$.effectiveClaimRevision,sourceEvidenceDigest:ti,command:V,manifestDigest:ee?.manifestDigest??"0".repeat(64),gateIds:ee?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:ee?.resultDigest??"0".repeat(64),graphRevision:String(c.graphRevision),executionEvidenceDigest:ee?.executionEvidenceDigest??"0".repeat(64),verifiedAt:ee?.executedAt??ce(d),verdict:"verified",reasonCodes:Object.freeze([me?"checkpoint-p205-transient-verified":pe?"checkpoint-git-maintenance-verified":"checkpoint-legacy-bounded-verified",...$.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return u()}}function _i(i,e,t){const r=ae(i);return!!(r&&r.schemaVersion===1&&r.kind==="p205_transient_execution_authority"&&r.contract==="P205-CI-02"&&r.command===V&&r.graphRevision===t&&h(r.resultDigest)&&h(r.executionEvidenceDigest)&&r.executionHeadSha===e&&_(e))}function ae(i){return i&&typeof i=="object"?Le.get(i):void 0}function St(i){const e=ae(i);return e?Object.freeze({executionHeadSha:e.executionHeadSha,graphRevision:e.graphRevision,manifestDigest:e.manifestDigest,gateIds:Object.freeze([...e.gateIds]),resultDigest:e.resultDigest,executedAt:e.executedAt,executionEvidenceDigest:e.executionEvidenceDigest}):void 0}function vt(i,e,t){const r=ae(i);return!!(r&&r.executionHeadSha===e&&r.graphRevision===t&&r.command===V)}function He(i){const e=pi[i.storyId],t=typeof i.checkpoint.claimRevision=="string"?i.checkpoint.claimRevision:void 0,r=i.storyId==="P174.03.811759"||i.storyId==="P174.03.685003",n=xi(i.authorizedWriteSet),a=n.length>0&&n.length===i.authorizedWriteSet.length&&i.changedPaths.every(o=>n.some(d=>Ri(d,o)));if(e&&i.epicId==="P174"&&i.executionBranch==="epic/P174"&&i.baseSha===e.baseSha&&i.headSha===e.headSha&&i.checkpoint.graphRevision===e.graphRevision&&i.commitBodyDigest===e.commitBodyDigest&&i.changedPathsDigest===e.changedPathsDigest&&(r?t===void 0:t===e.effectiveClaimRevision))return i.authorizedWriteSet.length>0&&(!a||!Te(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(t!==void 0&&!(!t||!h(t))&&!(!a||!Te(t,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:t})}function xi(i){const e=i.map(t=>t.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(t=>!ge(t))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function Ei(i,e){try{const t=JSON.parse(Pe(y(i,".neocortex","state.json"),"utf8")),r=s(t.stories),n=s(r?.[e]),a=bi(i),o=s(a.stories[e]?.checkpoint)??s(n?.checkpoint);return Ii(e,n,o)}catch{return[]}}function Ii(i,e,t){const r=Array.isArray(e?.files_to_modify)?e.files_to_modify.filter(n=>typeof n=="string"):[];if(!t?.dispatchId||!t.bundleId)return r;try{return di({...e,id:i,files_to_modify:r})}catch{return[]}}function Te(i,e){return i===b("sha256").update(e.join("\0")).digest("hex")||i===b("sha256").update(JSON.stringify(e)).digest("hex")}function Ri(i,e){return i===e||i.endsWith("/")&&e.startsWith(i)}function Dt(i,e,t,r,n,a){try{if(!Ge(e,t,r,n))return!1;const o=s(e),d=s(o.qaReceipt),u=s(o.reviewReceipt),c=String(o.headSha),f=String(o.baseSha),v=j(i,["rev-parse",`refs/heads/${n}`]).trim();if(re("git",["merge-base","--is-ancestor",c,v],{cwd:i,stdio:"ignore"}),j(i,["rev-parse",`${c}^`]).trim()!==f||j(i,["rev-list","--count",`${f}..${c}`]).trim()!=="1")return!1;const g=j(i,["show","--no-patch","--format=%H%n%P%n%B",c]),l=j(i,["diff-tree","--no-commit-id","--name-only","-r","-z",c]).split("\0").filter(Boolean);if(l.length===0||l.some(B=>!ge(B)))return!1;const w=He({checkpoint:o,storyId:t,epicId:r,executionBranch:n,baseSha:f,headSha:c,changedPaths:l,authorizedWriteSet:a,commitBodyDigest:b("sha256").update(g).digest("hex"),changedPathsDigest:b("sha256").update([...l].sort().join("\0")).digest("hex")});return!(w?.mode!=="legacy-migration"||!w.binding||d.sourceEvidenceDigest!==w.binding.qaDigest||d.receiptRef!==`story-qa:${w.binding.qaDigest}`||u.sourceEvidenceDigest!==w.binding.reviewDigest||u.receiptRef!==`story-review:${w.binding.reviewDigest}`||u.qaReceiptRef!==d.receiptRef)}catch{return!1}}function Ai(i){return b("sha256").update(["local-yolo-tdd-git-immutable-v1",i.storyId,i.baseSha,i.headSha,i.bundleDigest,i.graphRevision,b("sha256").update(i.commitBody).digest("hex"),b("sha256").update([...i.changedPaths].sort().join("\0")).digest("hex")].join("\0")).digest("hex")}function ki(i){return b("sha256").update(["local-yolo-tdd-p205-execution-v2",V,i.gitEvidenceDigest,i.headSha,i.graphRevision,i.manifestDigest,i.gateIds.join(","),i.resultDigest].join("\0")).digest("hex")}function Ci(i){const e=s(i.value);return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:i.storyId,epicId:i.epicId,branch:i.executionBranch,baseSha:_(e?.baseSha)?String(e?.baseSha):"0".repeat(40),headSha:_(e?.headSha)?String(e?.headSha):"0".repeat(40),aggregateHeadSha:"0".repeat(40),commitBodyDigest:"0".repeat(64),changedPathsDigest:"0".repeat(64),claimVerification:"canonical",effectiveClaimRevision:"0".repeat(64),command: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:ce(i.verifiedAt),verdict:i.verdict,reasonCodes:Object.freeze([i.reasonCode]),publicSafe:!0})}function j(i,e){return re("git",[...e],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})}function ce(i){return Number.isFinite(Date.parse(i))?new Date(Date.parse(i)).toISOString():new Date().toISOString()}async function _t(i,e){if(Ve[e.storyId]!==e.headSha)return;const t=[".neocortex/state.json",`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,`.neocortex/stories/${e.storyId}/review.md`,`docs/stories/${e.storyId}.story.md`];try{const r=(await N("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:i,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await N("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:i}),(await N("git",["rev-parse",`${e.headSha}^`],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await N("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(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:i,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await N("git",["show","--no-patch","--format=%s",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const c=String((await N("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!t.every(S=>c.includes(S))||c.some(S=>!ge(S)))return;const f=await Promise.all(t.map(async S=>String((await N("git",["show",`${e.headSha}:${S}`],{cwd:i,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),v=JSON.parse(f[0]),g=s(v.stories),l=s(v.epics),w=s(g?.[e.storyId]),B=s(l?.[e.epicId]),P=Array.isArray(w?.steps_completed)?w.steps_completed:[],I=JSON.parse(f[1]);return w?.status!=="done"||!P.includes(li)||!P.includes(mi)||B?.branch_mode!=="epic"||B.execution_branch!==e.executionBranch||I.storyId!==e.storyId||I.status!=="qa-passed"||I.safeToContinueYoloop!==!0||!Array.isArray(I.blockingChecks)||I.blockingChecks.length!==0||!f[2].includes(e.storyId)||!/P205[\s\S]{0,80}(pass|aprov)/i.test(f[2])||!f[3].includes(e.storyId)||!/approved|aprovado/i.test(f[3])||!f[4].includes(e.storyId)?void 0:`legacy-direct-yolo:${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(S=>b("sha256").update(S).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function Oi(i){const e=await _e(i),t=y(e,de),r=y(t,fe);if(q(t)&&(await z(t,"directory"),await U(t)!==t))throw new Error("git-lifecycle-runtime-directory-symlink");return q(r)?r:y(e,Se)}async function Fe(i){return We(await _e(i))}async function Pi(i,e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)||e.includes(".."))throw new Error("git-lifecycle-private-child-invalid");const t=p(i);await W(t);const r=p(t,e);return te(t,r),q(r)||await Be(t,e),await W(r,t),await W(t),r}async function D(i,e){const t=p(e),r=p(i);te(t,r),await W(t),await W(r,t)}async function xt(i,e){await Y(i,e)}async function Z(i,e,t){const r=p(e),n=p(i);te(r,n);try{await D(n,r)}catch(o){if(C(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 te(r,a),await ie(r,A(n),A(a)),await D(a,r),t&&!await t(a)?(await oe(a,n,r).catch(()=>{}),!1):(await hi(r,A(a)),!0)}async function oe(i,e,t){await D(i,t);try{await be(e);return}catch(r){if(!C(r,"ENOENT"))throw r}await ie(t,A(i),A(e)),await D(e,t)}async function O(i){try{await D(i,K(i));const e=y(i,"owner.json");await Y(e,i);const t=await H(e);return await Y(e,i),b("sha256").update(t).digest("hex")}catch{return}}async function Et(i,e){const t=await Fe(i),r=await Pi(t,"leases"),n=y(r,"integration"),a=`${n}.recovery`;if(q(a)){await D(a,r);const c=await Me(a),f=await O(a);if(c===void 0||le(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!f||!await Z(a,r,async v=>await O(v)===f))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const o=ce(e.createdAt??new Date().toISOString()),d=Object.freeze({schemaVersion:1,kind:e.kind,storyId:e.storyId,sessionId:e.sessionId,idempotencyKey:e.idempotencyKey,pid:process.pid,createdAt:o,expiresAt:ce(e.expiresAt),persistent:e.persistent,ownerNonce:e.ownerNonce??ye(16).toString("hex")});if(Date.parse(d.expiresAt)<=Date.parse(d.createdAt))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const u=async()=>{await W(r,t);try{return await Ne(r,A(n),`${JSON.stringify(d)}
4
- `),await D(n,r),await Y(y(n,"owner.json"),n),!0}catch(c){throw C(c,"EEXIST")||await Z(n,r).catch(()=>{}),c}};try{return await u(),{ok:!0,owner:d,path:n}}catch(c){if(!C(c,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const c=await se(n),f=c?void 0:await Me(n);if(c&&Ke(c,d))return{ok:!0,owner:c,path:n};if(c&&Date.parse(c.expiresAt)>Date.now()&&(c.persistent||le(c.pid))||f!==void 0&&le(f)||!c&&f===void 0&&await Ze(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 l=`${n}.stale.${process.pid}.${Date.now()}`;await ie(r,A(n),A(l));try{if(await D(l,r),await O(l)!==g)return await oe(l,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await u()}finally{await Z(l,r,async w=>await O(w)===g).catch(()=>{})}return{ok:!0,owner:d,path:n}}catch(c){return{ok:!1,reasonCode:C(c,"EEXIST")||C(c,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function It(i,e){const t=await se(i);return!!(t&&De(t,e)&&Date.parse(t.expiresAt)>Date.now())}async function Ni(i,e){try{const t=K(i);await D(i,t);const r=await se(i);if(!r||!De(r,e))return!1;const n=await O(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await ie(t,A(i),A(a)),await D(a,t);const o=await se(a);return!o||!De(o,e)||await O(a)!==n?(await oe(a,i,t).catch(()=>{}),!1):Z(a,t,async d=>await O(d)===n)}catch(t){if(C(t,"ENOENT"))return!1;throw t}}function Bi(i){return b("sha256").update(["git-lifecycle-physical-owner-v1",i.kind,i.storyId,i.sessionId,i.idempotencyKey,String(i.pid),i.createdAt,i.expiresAt,i.persistent?"persistent":"ephemeral",i.ownerNonce].join("\0")).digest("hex")}async function Rt(i,e){if(!J(e.storyId)||!k(e.idempotencyKey)||!h(e.ownerDigest))return"foreign";const t=await Fe(i),r=y(t,"leases"),n=y(r,"integration");if(!q(n))return"absent";try{await D(r,t),await D(n,r);const a=await se(n);return!a||a.kind!=="direct"||a.storyId!==e.storyId||a.sessionId!==e.idempotencyKey||a.idempotencyKey!==e.idempotencyKey||a.persistent!==!0||Bi(a)!==e.ownerDigest?"foreign":await Ni(n,a)?"released":"foreign"}catch{return"foreign"}}async function se(i){try{await D(i,K(i));const e=y(i,"owner.json");await Y(e,i);const t=JSON.parse(await H(e,"utf8"));return t.schemaVersion!==1||t.kind!=="direct"&&t.kind!=="continuous"||!J(t.storyId)||!k(t.sessionId)||!k(t.idempotencyKey)||!Number.isSafeInteger(t.pid)||Number(t.pid)<=0||!E(t.createdAt)||!E(t.expiresAt)||typeof t.persistent!="boolean"||typeof t.ownerNonce!="string"||!/^[a-f0-9]{32}$/.test(t.ownerNonce)?void 0:t}catch{return}}async function Me(i){try{await D(i,K(i));const e=y(i,"owner.json");await Y(e,i);const t=JSON.parse(await H(e,"utf8"));return Number.isSafeInteger(t.pid)&&Number(t.pid)>0?Number(t.pid):void 0}catch{return}}function Ke(i,e){return i.kind===e.kind&&i.storyId===e.storyId&&i.sessionId===e.sessionId&&i.idempotencyKey===e.idempotencyKey&&i.expiresAt===e.expiresAt&&i.persistent===e.persistent}function De(i,e){return Ke(i,e)&&i.schemaVersion===e.schemaVersion&&i.pid===e.pid&&i.createdAt===e.createdAt&&i.ownerNonce===e.ownerNonce}async function _e(i){const e=await U(i),r=(await N("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim(),n=ne(r)?p(r):p(e,r),a=await U(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await Vi(a);const d=(await N("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((ne(d)?p(d):p(e,d))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function We(i){const e=y(i,de);if(q(e)||await Be(i,de),await z(e,"directory"),await U(e)!==e)throw new Error("git-lifecycle-runtime-directory-symlink");return e}async function Ye(i,e={}){try{return await z(i,"file"),xe(JSON.parse(await H(i,"utf8")))}catch(t){if(C(t,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ee()}throw t}}async function $i(i){try{await z(i,"file")}catch(e){if(C(e,"ENOENT"))return;throw e}}async function z(i,e){const t=await be(i);if(t.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!t.isFile():!t.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(ue()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(ue()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function te(i,e){const t=p(i),r=p(e),n=oi(t,r);if(!n||n.startsWith("..")||ne(n)||K(r)!==t)throw new Error("git-lifecycle-private-path-escape")}async function W(i,e){const t=p(i);if(e&&te(p(e),t),await z(t,"directory"),p(await U(t))!==t)throw new Error("git-lifecycle-directory-substituted");if(e){const r=p(e);if(await z(r,"directory"),p(await U(r))!==r)throw new Error("git-lifecycle-directory-parent-substituted")}}async function Y(i,e){const t=p(i);if(te(p(e),t),await W(p(e)),await z(t,"file"),p(await U(t))!==t)throw new Error("git-lifecycle-file-substituted")}function Je(i,e){const t=Oe(i);if(t.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!t.isFile():!t.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(ue()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(ue()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function Vi(i){const e=await be(i);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function Li(i){const e=Oe(i);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function ue(i=process.platform){return i!=="win32"&&typeof process.getuid=="function"}function xe(i){if(!i||typeof i!="object"||Array.isArray(i))throw new Error("git-lifecycle-runtime-invalid");const e=i;x(e,["schemaVersion","revision","epics","stories"],"git-lifecycle-runtime-unknown-field");const t=s(e.epics),r=s(e.stories);if(e.schemaVersion!==1||!Number.isSafeInteger(e.revision)||Number(e.revision)<0||!t||!r||Object.values(t).some(n=>!s(n))||Object.values(r).some(n=>!s(n)))throw new Error("git-lifecycle-runtime-invalid");for(const[n,a]of Object.entries(t))if(!J(n)||!zi(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!J(n)||!n.includes(".")||!Gi(a,n))throw new Error("git-lifecycle-runtime-story-invalid");return e}const qi=["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"],ji=["checkpoint","status","last_step","steps_completed"];function zi(i){return x(i,qi,"git-lifecycle-runtime-epic-unknown-field"),(i.branch_mode===void 0||i.branch_mode==="epic")&&(i.execution_branch===void 0||T(i.execution_branch))&&(i.origin_branch===void 0||T(i.origin_branch))&&(i.branch_lease===void 0||i.branch_lease===null||Hi(i.branch_lease))&&(i.origin_binding===void 0||i.origin_binding===null||Mi(i.origin_binding))&&(i.graph_revision===void 0||h(i.graph_revision))&&(i.aggregate_qa_receipt===void 0||i.aggregate_qa_receipt===null||Ki(i.aggregate_qa_receipt))&&(i.terminal_git_receipt===void 0||i.terminal_git_receipt===null||Wi(i.terminal_git_receipt))&&(i.physicalMergeStatus===void 0||["merged","pushed","denied_external_gate","blocked_local_or_repo","not_attempted"].includes(String(i.physicalMergeStatus)))&&(i.pr_number===void 0||i.pr_number===null||Number.isSafeInteger(i.pr_number)&&Number(i.pr_number)>0)&&(i.git_reconciliation_receipts===void 0||Zi(i.git_reconciliation_receipts))&&(i.git_reconciliation_debt===void 0||Xi(i.git_reconciliation_debt))}function Gi(i,e){return x(i,ji,"git-lifecycle-runtime-story-unknown-field"),(i.checkpoint===void 0||i.checkpoint===null||Qe(i.checkpoint,e))&&(i.status===void 0||k(i.status))&&(i.last_step===void 0||i.last_step===null||k(i.last_step))&&(i.steps_completed===void 0||L(i.steps_completed,128))}function Hi(i){const e=s(i);return e?(x(e,["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt","handoffGrant","handoffConsumption"],"git-lifecycle-runtime-lease-unknown-field"),e.schemaVersion===1&&J(e.ownerStoryId)&&k(e.sessionId)&&k(e.idempotencyKey)&&E(e.acquiredAt)&&E(e.expiresAt)&&Date.parse(String(e.expiresAt))>Date.parse(String(e.acquiredAt))&&(e.handoffGrant===void 0||Ti(e.handoffGrant,e))&&(e.handoffConsumption===void 0||Fi(e.handoffConsumption,e))):!1}function Ti(i,e){const t=s(i);return t?(x(t,["schemaVersion","kind","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","expiresAt"],"git-lifecycle-runtime-handoff-grant-unknown-field"),t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff"&&t.storyId===e.ownerStoryId&&t.fromSessionId===e.sessionId&&h(t.tokenDigest)&&h(t.bundleDigest)&&h(t.claimRevision)&&E(t.expiresAt)&&Date.parse(String(t.expiresAt))<=Date.parse(String(e.expiresAt))):!1}function Fi(i,e){const t=s(i);return t?(x(t,["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","consumedBySessionId","consumedAt"],"git-lifecycle-runtime-handoff-consumption-unknown-field"),t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff-consumption"&&t.state==="consumed"&&t.storyId===e.ownerStoryId&&k(t.fromSessionId)&&h(t.tokenDigest)&&h(t.bundleDigest)&&h(t.claimRevision)&&t.consumedBySessionId===e.sessionId&&E(t.consumedAt)):!1}function Mi(i){const e=s(i);return e?(x(e,["schemaVersion","originBranch","originHeadSha","executionBranch","capturedFromCurrentCheckout","capturedAt"],"git-lifecycle-runtime-origin-unknown-field"),e.schemaVersion===1&&T(e.originBranch)&&T(e.executionBranch)&&e.originBranch!==e.executionBranch&&_(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&E(e.capturedAt)):!1}function Ki(i){const e=s(i);if(!e)return!1;x(e,["schemaVersion","evidenceVersion","producer","contract","command","verdict","executionHeadSha","graphRevision","manifestDigest","resultDigest","checkedAt","receiptRef","gateIds"],"git-lifecycle-runtime-aggregate-qa-unknown-field");const t=e.evidenceVersion==="p205-execution-v2"&&e.producer==="local-yolo-tdd"&&e.contract==="P205-CI-02"&&e.command===V&&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&&(t||r)&&e.verdict==="passed"&&_(e.executionHeadSha)&&h(e.graphRevision)&&E(e.checkedAt)&&he(e.receiptRef)&&L(e.gateIds,128,!0)}function Wi(i){const e=s(i);return e?(x(e,["schemaVersion","epicId","executionBranch","originBranch","baseSha","executionHeadSha","mergeSha","pushedSha","strategy","prNumber","physicalStatus","localGateReceiptRefs","idempotencyKey","attemptStartedAt","completedAt","retryEligible","reasonCodes","publicSafe","candidateQa","providerGuard"],"git-lifecycle-runtime-terminal-receipt-unknown-field"),e.schemaVersion===1&&J(e.epicId)&&T(e.executionBranch)&&T(e.originBranch)&&_(e.baseSha)&&_(e.executionHeadSha)&&(e.mergeSha===void 0||_(e.mergeSha))&&(e.pushedSha===void 0||_(e.pushedSha))&&(e.strategy==="direct"||e.strategy==="single_pr")&&(e.candidateQa===void 0||Ji(e.candidateQa,e))&&(e.providerGuard===void 0||Yi(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)&&k(e.idempotencyKey)&&E(e.attemptStartedAt)&&(e.completedAt===void 0||E(e.completedAt))&&typeof e.retryEligible=="boolean"&&L(e.reasonCodes,128)&&e.publicSafe===!0):!1}function Yi(i,e){const t=s(i);if(!t)return!1;x(t,["schemaVersion","provider","mode","source","prHeadSha","originHeadSha","checkedAt","publicSafe"],"git-lifecycle-runtime-provider-guard-unknown-field");const r=t.mode==="recovered_exact_tree"?t.source==="physical_recovery":t.mode==="strict_up_to_date_expected_head"&&["branch_protection","ruleset","branch_protection_and_ruleset"].includes(String(t.source));return t.schemaVersion===1&&t.provider==="github"&&r&&e.strategy==="single_pr"&&e.physicalStatus==="pushed"&&Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0&&_(t.prHeadSha)&&t.prHeadSha===e.mergeSha&&_(t.originHeadSha)&&t.originHeadSha===e.baseSha&&E(t.checkedAt)&&t.publicSafe===!0}function Ji(i,e){const t=s(i);return t?(x(t,["schemaVersion","kind","contract","command","originHeadSha","executionHeadSha","mergeSha","treeSha","graphRevision","manifestDigest","resultDigest","gateIds","checkedAt","receiptRef"],"git-lifecycle-runtime-merge-candidate-unknown-field"),t.schemaVersion===1&&t.kind==="epic_merge_candidate_qa"&&t.contract==="P205-CI-02"&&t.command===V&&_(t.originHeadSha)&&t.originHeadSha===e.baseSha&&_(t.executionHeadSha)&&t.executionHeadSha===e.executionHeadSha&&_(t.mergeSha)&&t.mergeSha===e.mergeSha&&_(t.treeSha)&&h(t.graphRevision)&&h(t.manifestDigest)&&h(t.resultDigest)&&L(t.gateIds,128,!0)&&E(t.checkedAt)&&he(t.receiptRef)):!1}function Qe(i,e){const t=s(i);if(!t)return!1;x(t,["schemaVersion","storyId","epicId","branch","baseSha","headSha","commits","idempotencyKey","dispatchId","bundleId","bundleDigest","graphRevision","claimRevision","receiptRefs","qaVerdict","reviewVerdict","qaReceipt","reviewReceipt","recordedAt"],"git-lifecycle-runtime-checkpoint-unknown-field");const r=String(e).split(".")[0];return t.schemaVersion===1&&t.storyId===e&&t.epicId===r&&T(t.branch)&&_(t.baseSha)&&_(t.headSha)&&t.baseSha!==t.headSha&&it(t.commits)&&t.commits.length===1&&t.commits[0]===t.headSha&&k(t.idempotencyKey)&&(t.dispatchId===void 0||h(t.dispatchId))&&(t.bundleId===void 0||h(t.bundleId))&&h(t.bundleDigest)&&h(t.graphRevision)&&(t.claimRevision===void 0||h(t.claimRevision))&&L(t.receiptRefs,256,!0)&&(t.qaVerdict==="passed"||t.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(t.reviewVerdict))&&Qi(t.qaReceipt,t)&&(t.reviewVerdict==="pending"?t.reviewReceipt===void 0:Ui(t.reviewReceipt,t))&&E(t.recordedAt)}function Qi(i,e){const t=s(i);return t?(x(t,["schemaVersion","kind","producer","evidenceVersion","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","contract","command","manifestDigest","gateIds","resultDigest","sourceEvidenceDigest","verdict","checkedAt","receiptRef"],"git-lifecycle-runtime-story-qa-unknown-field"),t.schemaVersion===1&&t.kind==="story_qa_evidence"&&t.producer==="local-yolo-tdd"&&(t.evidenceVersion===void 0||t.evidenceVersion==="git-immutable-v1"||t.evidenceVersion==="p205-execution-v2"&&t.contract==="P205-CI-02"&&t.command===V&&h(t.manifestDigest)&&L(t.gateIds,32,!0)&&h(t.resultDigest))&&Ue(t,e)&&h(t.sourceEvidenceDigest)&&t.verdict===e.qaVerdict&&(t.verdict==="passed"||t.verdict==="blocked")&&E(t.checkedAt)&&he(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef)):!1}function Ui(i,e){const t=s(i),r=s(e.qaReceipt);return!t||!r?!1:(x(t,["schemaVersion","kind","producer","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","sourceEvidenceDigest","qaReceiptRef","verdict","reviewedAt","receiptRef"],"git-lifecycle-runtime-story-review-unknown-field"),t.schemaVersion===1&&t.kind==="story_review_evidence"&&t.producer==="root-commit-range-review"&&Ue(t,e)&&h(t.sourceEvidenceDigest)&&t.qaReceiptRef===r.receiptRef&&t.receiptRef!==r.receiptRef&&(t.verdict==="approved"||t.verdict==="changes-requested")&&(t.verdict==="approved"?e.reviewVerdict==="approved":e.reviewVerdict==="changes-requested")&&E(t.reviewedAt)&&Date.parse(String(t.reviewedAt))>=Date.parse(String(r.checkedAt))&&he(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef))}function Ue(i,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(t=>i[t]===e[t])}function Zi(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=s(e);return t?(x(t,["schemaVersion","resourceId","action","outcome","idempotencyKey","reasonCodes","recordedAt","publicSafe"],"git-lifecycle-runtime-reconciliation-receipt-unknown-field"),t.schemaVersion===1&&k(t.resourceId)&&["no_op","delete_local_branch","delete_remote_branch","close_pull_request"].includes(String(t.action))&&["applied","already_absent","dry_run","failed"].includes(String(t.outcome))&&k(t.idempotencyKey)&&L(t.reasonCodes,128)&&E(t.recordedAt)&&t.publicSafe===!0):!1})}function Xi(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=s(e);return t?(x(t,["schemaVersion","resourceId","action","managed","reasonCodes","evidence","publicSafe"],"git-lifecycle-runtime-reconciliation-debt-unknown-field"),t.schemaVersion===1&&k(t.resourceId)&&t.action==="preserve"&&typeof t.managed=="boolean"&&L(t.reasonCodes,128)&&L(t.evidence,16)&&t.publicSafe===!0):!1})}function x(i,e,t){const r=new Set(e);if(Object.keys(i).some(n=>!r.has(n)))throw new Error(t)}function J(i){return typeof i=="string"&&/^P[1-9][0-9]*(?:\.[0-9]+)*$/.test(i)}function et(i){const e=s(i);return e?Object.keys(e).length===10&&e.schemaVersion===1&&e.kind==="git_lifecycle_graph_authority"&&e.producer==="server-continuous-yoloop-v1"&&(e.source==="yolo"||e.source==="yoloop")&&J(e.epicId)&&J(e.storyId)&&String(e.storyId).startsWith(`${String(e.epicId)}.`)&&T(e.executionBranch)&&T(e.originBranch)&&e.originBranch!==e.executionBranch&&typeof e.graphRevision=="string"&&/^[a-f0-9]{64}$/.test(e.graphRevision)&&e.publicSafe===!0:!1}function T(i){return typeof i=="string"&&/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(i)&&!i.includes("..")&&!i.includes("//")&&!i.includes("@{")&&!i.endsWith("/")&&!i.endsWith(".")&&!i.split("/").some(e=>!e||e.startsWith(".")||e.endsWith(".lock"))}function ge(i){return i.length>0&&i.length<=1024&&!ne(i)&&!i.includes("\0")&&!i.replaceAll("\\","/").split("/").includes("..")}function k(i){return typeof i=="string"&&i.length>0&&i.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(i)&&!i.includes("..")}function he(i){return k(i)}function _(i){return typeof i=="string"&&/^[a-f0-9]{40,64}$/i.test(i)}function h(i){return typeof i=="string"&&/^[a-f0-9]{64}$/i.test(i)}function E(i){return typeof i=="string"&&i.length<=64&&Number.isFinite(Date.parse(i))}function L(i,e,t=!1){return Array.isArray(i)&&i.length<=e&&(!t||i.length>0)&&i.every(k)}function it(i){return Array.isArray(i)&&i.length>0&&i.length<=256&&i.every(_)}function Ee(){return{schemaVersion:1,revision:0,epics:{},stories:{}}}async function tt(i){const e=K(i),t={pid:process.pid,nonce:ye(16).toString("hex")},r=async()=>{await W(e),await Ne(e,A(i),JSON.stringify(t));try{await D(i,e),await Y(y(i,"owner.json"),i)}catch(n){throw await Z(i,e).catch(()=>{}),n}};try{await r()}catch(n){if(!C(n,"EEXIST"))throw n;await z(i,"directory");const a=await Ie(i);if(a!==void 0&&le(a.pid))throw new Error("git-lifecycle-runtime-lock-active");if(a===void 0&&await Ze(i))throw new Error("git-lifecycle-runtime-lock-active");const o=await O(i);if(!o)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const d=`${i}.stale.${process.pid}.${Date.now()}`;await ie(e,A(i),A(d));try{if(await D(d,e),await O(d)!==o)throw await oe(d,i,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await Z(d,e,async u=>await O(u)===o).catch(()=>{})}}return t}async function rt(i,e){const t=K(i);try{await D(i,t);const r=await Ie(i);if(!r||!Xe(r,e))return!1;const n=await O(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await ie(t,A(i),A(a)),await D(a,t);const o=await Ie(a);return!o||!Xe(o,e)||await O(a)!==n?(await oe(a,i,t).catch(()=>{}),!1):Z(a,t,async d=>await O(d)===n)}catch(r){if(C(r,"ENOENT"))return!1;throw r}}async function Ze(i){try{return Date.now()-(await ci(i)).mtimeMs<3e4}catch{return!0}}async function Ie(i){try{await D(i,K(i));const e=y(i,"owner.json");await Y(e,i);const t=JSON.parse(await H(e,"utf8"));return Number.isSafeInteger(t.pid)&&Number(t.pid)>0&&(t.nonce===void 0||typeof t.nonce=="string"&&/^[a-f0-9]{32}$/.test(t.nonce))?{pid:Number(t.pid),...typeof t.nonce=="string"?{nonce:t.nonce}:{}}:void 0}catch{return}}function Xe(i,e){return i.pid===e.pid&&i.nonce!==void 0&&i.nonce===e.nonce}function le(i){try{return process.kill(i,0),!0}catch(e){return C(e,"EPERM")}}function s(i){return i&&typeof i=="object"&&!Array.isArray(i)?i:void 0}function C(i,e){return i instanceof Error&&"code"in i&&i.code===e}export{de as GIT_LIFECYCLE_RUNTIME_DIRECTORY,fe as GIT_LIFECYCLE_RUNTIME_FILE,Ve as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,pi as LEGACY_P174_CHECKPOINT_MIGRATIONS,V as P205_COMPLETE_COMMAND,Et as acquireGitLifecyclePhysicalIntegrationLock,Si as applyGitLifecycleRuntimeOverlay,D as assertGitLifecyclePrivateDirectory,xt as assertGitLifecyclePrivateFile,Bi as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,Ai as computeImmutableStoryQaEvidenceDigest,_t as computeLegacyDirectYoloRecoveryReceiptRef,ki as computeP205StoryQaEvidenceDigest,Pi as ensureGitLifecyclePrivateChildDirectory,pt as ensureGitLifecycleRuntimeInitialized,vi as ensureRuntimeEpic,bt as ensureRuntimeStory,mt as executeP205TransientAuthority,Fe as gitLifecycleRuntimeDirectory,Ii as gitLifecycleStoryWriteSet,Ge as isAcceptedGitLifecycleStoryCheckpoint,je as mutateGitLifecycleRuntime,vt as p205TransientAuthorityMatchesAggregate,yt as persistGitLifecycleGraphAuthority,ue as posixSecurityAvailable,St as projectP205TransientExecutionEvidence,ve as readGitLifecycleRuntime,bi as readGitLifecycleRuntimeSync,Ni as releaseGitLifecyclePhysicalIntegrationLock,Rt as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,Z as removeGitLifecyclePrivateDirectory,wt as verifyAcceptedGitLifecycleStoryCheckpoint,Di as verifyAcceptedGitLifecycleStoryCheckpointSync,It as verifyGitLifecyclePhysicalIntegrationLock,Dt as verifyLegacyCheckpointMigrationCandidateSync};
1
+ import{execFile as ni,execFileSync as re}from"node:child_process";import{createHash as w,randomBytes as ye}from"node:crypto";import{lstat as be,open as ai,readFile as T,realpath as Z,stat as ci}from"node:fs/promises";import{existsSync as j,lstatSync as Oe,readFileSync as Pe,realpathSync as we}from"node:fs";import{basename as k,dirname as W,isAbsolute as ne,join as y,relative as oi,resolve as p}from"node:path";import{promisify as si}from"node:util";import{publicWriteSet as di}from"../../../shared/dist/yoloop/public-story-write-set.js";import{resolveBranchUnit as fi}from"../../../shared/dist/yoloop/branch-unit.js";import{anchoredAtomicWriteFile as ui,anchoredCreateOwnedDirectory as Ne,anchoredEnsureDirectory as Be,anchoredExecuteGit as gi,anchoredExecuteNode as $e,anchoredRemoveDirectory as hi,anchoredRenameDirectory as ie}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as li,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as mi}from"./git-lifecycle-step-ids.js";const B=si(ni),de="neocortex-yoloop",fe="runtime.json",V="node scripts/test-root.mjs --gate complete",Ve=Object.freeze({"P174.03.029264":"339141be7339a0edf55710cbccb6e6558f514792"}),pi=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",yi="runtime.lock",Le=new WeakMap;async function pt(i,e){return(await bi(i,{headSha:e.headSha,graphRevisions:[e.graphRevision],...e.nowIso!==void 0?{nowIso:e.nowIso}:{},...e.anchoredWorkspace!==void 0?{anchoredWorkspace:e.anchoredWorkspace}:{}})).get(e.graphRevision)}async function bi(i,e){const t=[...new Set(e.graphRevisions)];if(!x(e.headSha)||t.length===0||t.some(v=>!h(v)))throw new Error("p205-transient-binding-invalid");const r=e.anchoredWorkspace;if(r&&p(i)!==y(p(r.parent),r.name))throw new Error("p205-transient-anchor-binding-invalid");const n=async v=>r?(await gi(r.parent,r.name,r.identity,v)).toString("utf8"):String((await B("git",[...v],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout),a=async()=>r?JSON.parse((await $e(r.parent,r.name,r.identity,["-e","const fs=require('node:fs');process.stdout.write(JSON.stringify({manifest:fs.readFileSync('config/release-gates.v2.json','utf8'),runner:fs.readFileSync('scripts/test-root.mjs','utf8')}));"])).toString("utf8")):{manifest:await T(y(i,"config","release-gates.v2.json"),"utf8"),runner:await T(y(i,"scripts","test-root.mjs"),"utf8")};if((await n(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-mismatch");const{manifest:s,runner:u}=await a(),[c,f]=await Promise.all([n(["show",`${e.headSha}:config/release-gates.v2.json`]),n(["show",`${e.headSha}:scripts/test-root.mjs`])]);if(s!==c||u!==f)throw new Error("p205-transient-producer-dirty");const D=JSON.parse(s),g=Array.isArray(D.requiredCompleteClasses)?D.requiredCompleteClasses.filter(v=>typeof v=="string"&&/^[a-z0-9-]+$/.test(v)):[];if(D.contract!=="P205-CI-02"||g.length===0)throw new Error("p205-transient-manifest-invalid");const m=r?(await $e(r.parent,r.name,r.identity,["scripts/test-root.mjs","--gate","complete"])).toString("utf8"):String((await B(process.execPath,["scripts/test-root.mjs","--gate","complete"],{cwd:i,encoding:"utf8",maxBuffer:64*1024*1024})).stdout),{manifest:S,runner:N}=await a();if(S!==s||N!==u)throw new Error("p205-transient-producer-raced");if((await n(["rev-parse","HEAD"])).trim()!==e.headSha)throw new Error("p205-transient-head-raced");const R=w("sha256").update(s).digest("hex"),Q=w("sha256").update(m).digest("hex"),b=ce(e.nowIso??new Date().toISOString()),l=new Map,U=Object.freeze(g);for(const v of t){const M=w("sha256").update(["p205-transient-execution-v1",V,e.headSha,v,R,g.join(","),Q,b].join("\0")).digest("hex"),q=Object.freeze({schemaVersion:1,kind:"p205_transient_execution_authority",contract:"P205-CI-02",command:V,executionHeadSha:e.headSha,graphRevision:v,manifestDigest:R,gateIds:U,resultDigest:Q,executedAt:b,executionEvidenceDigest:M}),A=Object.freeze(Object.create(null));Le.set(A,q),l.set(v,A)}return l}async function ve(i,e={}){const t=await Pi(i);return Ye(t,e)}function wi(i,e={}){let t;try{const r=re("git",["rev-parse","--git-common-dir"],{cwd:i,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),n=we(i),a=ne(r)?p(r):p(n,r),o=we(a);if(o!==a)throw new Error("git-lifecycle-common-dir-symlink");qi(o);const s=y(o,de),u=y(s,fe);if(j(s)&&(Je(s,"directory"),we(s)!==s))throw new Error("git-lifecycle-runtime-directory-symlink");t=j(u)?u:y(o,Se)}catch{if(e.required)throw new Error("git-lifecycle-common-dir-invalid");return Ie()}if(!j(t)){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ie()}return Je(t,"file"),xe(JSON.parse(Pe(t,"utf8")))}async function yt(i){try{await ve(i,{required:!0});return}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-missing")throw e}try{await je(i,()=>{},{expectedRevision:0})}catch(e){if(!(e instanceof Error)||e.message!=="git-lifecycle-runtime-revision-conflict")throw e;await ve(i,{required:!0})}}function qe(i,e,t){if(!i||i.ownerStoryId!==e)return!1;const r=typeof i.sessionId=="string"?i.sessionId:"",n=Date.parse(String(i.expiresAt));return/^setup-[a-f0-9]{64}$/.test(r)&&i.idempotencyKey===r&&Number.isFinite(n)&&n>t}async function bt(i,e,t=new Date().toISOString()){if(!it(e))throw new Error("git-lifecycle-graph-authority-invalid");const r=y(p(i),".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(i),s=vi(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(b=>typeof b=="string"):Object.keys(d(s.stories)??{}).filter(b=>{const l=d(d(s.stories)?.[b]);return String(l?.epic_id??b.split(".")[0])===e.epicId});if(Array.isArray(u.stories)&&!f.includes(e.storyId))throw new Error("git-lifecycle-graph-authority-story-invalid");const D=f.map(b=>{const l=d(d(s.stories)?.[b])??{};return{id:b,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(U=>typeof U=="string"):[],checkpoint:d(l.checkpoint)}}),g=fi({...u,id:e.epicId},D);if(g.mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-invalid");if(g.executionBranch!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-mismatch");if(g.originBranch!==void 0&&g.originBranch!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");const m=typeof d(o.epics[e.epicId])?.origin_branch=="string"?String(d(o.epics[e.epicId]).origin_branch):void 0;if(m!==void 0&&m!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-mismatch");if(g.originBranch===void 0&&m===void 0){const{stdout:b}=await B("git",["branch","--show-current"],{cwd:i,encoding:"utf8",maxBuffer:1048576});if(String(b).trim()!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-physical-mismatch")}const S=typeof u.graph_revision=="string"?u.graph_revision:void 0,N=typeof d(o.epics[e.epicId])?.graph_revision=="string"?String(d(o.epics[e.epicId]).graph_revision):void 0;if(S!==void 0&&!h(S))throw new Error("git-lifecycle-graph-revision-invalid");if(S===e.graphRevision&&N===e.graphRevision&&g.originBranch===e.originBranch&&m===e.originBranch)return{applied:!1,reused:!0,revision:o.revision,graphRevision:e.graphRevision};const $=Date.parse(t);if(!Number.isFinite($))throw new Error("git-lifecycle-graph-authority-time-invalid");const R=d(u.branch_lease);if(R&&Number.isFinite(Date.parse(String(R.expiresAt)))&&Date.parse(String(R.expiresAt))>$&&!qe(R,e.storyId,$))throw new Error("git-lifecycle-graph-authority-writer-active");return{applied:!0,reused:!1,revision:(await je(i,b=>{const l=Di(b,e.epicId);if(l.branch_mode!==void 0&&l.branch_mode!=="epic")throw new Error("git-lifecycle-graph-authority-epic-raced");const U=l.execution_branch;if(U!==void 0&&U!==e.executionBranch)throw new Error("git-lifecycle-graph-authority-branch-raced");const v=l.origin_branch;if(v!==void 0&&v!==e.originBranch)throw new Error("git-lifecycle-graph-authority-origin-raced");const M=l.graph_revision;if(M!==void 0&&M!==S)throw new Error("git-lifecycle-graph-authority-epoch-raced");const q=d(l.branch_lease);if(q&&Number.isFinite(Date.parse(String(q.expiresAt)))&&Date.parse(String(q.expiresAt))>$&&!qe(q,e.storyId,$))throw new Error("git-lifecycle-graph-authority-writer-active");l.branch_mode="epic",l.execution_branch=e.executionBranch,l.origin_branch=e.originBranch,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 je(i,e,t={}){const r=await _e(i),n=await Ke(r),a=y(n,yi),o=await rt(a);try{const s=y(n,fe),u=y(r,Se),c=await Ye(j(s)?s:u);if(t.expectedRevision!==void 0&&t.expectedRevision!==c.revision)throw new Error("git-lifecycle-runtime-revision-conflict");const f=structuredClone(c),D=e(f),g=xe({...f,schemaVersion:1,revision:c.revision+1});return await t.preCommit?.(g),await G(n,"directory"),await Vi(s),await ui(n,fe,`${JSON.stringify(g,null,2)}
2
+ `),await G(s,"file"),await Si(n),{document:g,value:D}}finally{await nt(a,o).catch(()=>{})}}async function Si(i){let e;try{e=await ai(i,"r")}catch(t){if(process.platform==="win32"&&(O(t,"EPERM")||O(t,"EISDIR")||O(t,"EINVAL")))return;throw t}try{await e.sync()}finally{await e.close()}}function vi(i,e){const t=structuredClone(i),r=ze(t,"epics"),n=ze(t,"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 t}function ze(i,e){const t=i[e];if(t===void 0){const a={};return i[e]=a,a}const r=d(t);if(r)return r;if(!Array.isArray(t))throw new Error(`git-lifecycle-tracked-${e}-invalid`);const n={};for(const a of t){const o=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 i[e]=n,n}function Di(i,e){return i.epics[e]??(i.epics[e]={})}function wt(i,e){return i.stories[e]??(i.stories[e]={})}function Ge(i,e,t,r){const n=d(i);return!!(n&&n.epicId===t&&n.branch===r&&n.qaVerdict==="passed"&&n.reviewVerdict==="approved"&&Qe(n,e))}async function St(i,e,t,r,n,a,o=[]){return _i(i,e,t,r,n,a,o).verdict==="verified"}function _i(i,e,t,r,n,a,o=[],s=new Date().toISOString()){const u=()=>Oi({storyId:t,epicId:r,executionBranch:n,value:e,verifiedAt:s,verdict:"rejected",reasonCode:"checkpoint-git-physical-invalid"});try{if(!Ge(e,t,r,n))return u();const c=d(e),f=d(c.qaReceipt),D=d(c.reviewReceipt),g=String(c.headSha),m=String(c.baseSha),S=z(i,["rev-parse",`refs/heads/${n}`]).trim();re("git",["merge-base","--is-ancestor",g,S],{cwd:i,stdio:"ignore"});const N=z(i,["show","--no-patch","--format=%H%n%P%n%B",g]),$=z(i,["rev-parse",`${g}^`]).trim(),R=z(i,["rev-list","--count",`${m}..${g}`]).trim();if($!==m||R!=="1")return u();const Q=new Set(N.split(`
3
+ `).map(H=>H.trim())),l=[`Neocortex-Story: ${t}`,`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=>Q.has(H));if(l){const Ce=[...Q].find(ri=>ri.startsWith("Neocortex-Prepared-Base: "))?.slice(25)??"";if(!/^[a-f0-9]{40,64}$/i.test(Ce))return u();re("git",["merge-base","--is-ancestor",Ce,g],{cwd:i,stdio:"ignore"})}const v=z(i,["diff-tree","--no-commit-id","--name-only","-r","-z",g]).split("\0").filter(Boolean);if(v.length===0||v.some(H=>!ge(H)))return u();const M=w("sha256").update(N).digest("hex"),q=w("sha256").update([...v].sort().join("\0")).digest("hex"),A=He({checkpoint:c,storyId:t,epicId:r,executionBranch:n,baseSha:m,headSha:g,commitBodyDigest:M,changedPathsDigest:q,changedPaths:v,authorizedWriteSet:o.length>0?o:Ei(i,t)});if(!A||f.receiptRef!==`story-qa:${String(f.sourceEvidenceDigest)}`)return u();const Re=ki({storyId:t,baseSha:m,headSha:g,bundleDigest:String(c.bundleDigest),graphRevision:String(c.graphRevision),commitBody:N,changedPaths:v}),Ae=f.evidenceVersion==="p205-execution-v2"&&f.contract==="P205-CI-02"&&f.command===V&&h(f.manifestDigest)&&L(f.gateIds,32,!0)&&h(f.resultDigest)&&f.sourceEvidenceDigest===Ci({gitEvidenceDigest:Re,headSha:g,graphRevision:String(c.graphRevision),manifestDigest:String(f.manifestDigest),gateIds:f.gateIds,resultDigest:String(f.resultDigest)}),ei=f.evidenceVersion==="git-immutable-v1"&&f.sourceEvidenceDigest===Re,ii=f.evidenceVersion===void 0&&A.mode==="legacy-migration"&&A.binding?.qaDigest===f.sourceEvidenceDigest,me=xi(a,S,String(c.graphRevision))&&(Ae||A.mode==="legacy-migration"&&(ei||ii)),pe=a===void 0&&Ae;if(!me&&!pe)return u();const ke=w("sha256").update(["root-commit-range-review-v1",t,m,g,String(c.bundleDigest),String(c.graphRevision),String(f.receiptRef),w("sha256").update(N).digest("hex"),[...v].sort().join(",")].join("\0")).digest("hex");if(D.sourceEvidenceDigest!==ke||D.receiptRef!==`story-review:${ke}`||A.mode==="legacy-migration"&&A.binding?.reviewDigest!==void 0&&A.binding.reviewDigest!==D.sourceEvidenceDigest||!l&&(Ve[t]!==g||!Array.isArray(c.receiptRefs)||!c.receiptRefs.some(H=>typeof H=="string"&&H.startsWith("legacy-direct-yolo:"))))return u();const ti=w("sha256").update(["checkpoint-p205-transient-v1",t,r,n,m,g,String(c.bundleDigest),M,q,A.mode,A.effectiveClaimRevision,String(f.sourceEvidenceDigest),String(D.sourceEvidenceDigest),ae(a)?.executionEvidenceDigest??(pe?"maintenance-git-verification":"legacy-bounded-authority")].join("\0")).digest("hex"),ee=me?ae(a):void 0;return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:t,epicId:r,branch:n,baseSha:m,headSha:g,aggregateHeadSha:ee?.executionHeadSha??g,commitBodyDigest:M,changedPathsDigest:q,claimVerification:A.mode,effectiveClaimRevision:A.effectiveClaimRevision,sourceEvidenceDigest:ti,command:V,manifestDigest:ee?.manifestDigest??"0".repeat(64),gateIds:ee?.gateIds??Object.freeze(["legacy-bounded"]),resultDigest:ee?.resultDigest??"0".repeat(64),graphRevision:String(c.graphRevision),executionEvidenceDigest:ee?.executionEvidenceDigest??"0".repeat(64),verifiedAt:ee?.executedAt??ce(s),verdict:"verified",reasonCodes:Object.freeze([me?"checkpoint-p205-transient-verified":pe?"checkpoint-git-maintenance-verified":"checkpoint-legacy-bounded-verified",...A.mode==="legacy-migration"?["checkpoint-legacy-migration-verified"]:[]]),publicSafe:!0})}catch{return u()}}function xi(i,e,t){const r=ae(i);return!!(r&&r.schemaVersion===1&&r.kind==="p205_transient_execution_authority"&&r.contract==="P205-CI-02"&&r.command===V&&r.graphRevision===t&&h(r.resultDigest)&&h(r.executionEvidenceDigest)&&r.executionHeadSha===e&&x(e))}function ae(i){return i&&typeof i=="object"?Le.get(i):void 0}function vt(i){const e=ae(i);return e?Object.freeze({executionHeadSha:e.executionHeadSha,graphRevision:e.graphRevision,manifestDigest:e.manifestDigest,gateIds:Object.freeze([...e.gateIds]),resultDigest:e.resultDigest,executedAt:e.executedAt,executionEvidenceDigest:e.executionEvidenceDigest}):void 0}function Dt(i,e,t){const r=ae(i);return!!(r&&r.executionHeadSha===e&&r.graphRevision===t&&r.command===V)}function He(i){const e=pi[i.storyId],t=typeof i.checkpoint.claimRevision=="string"?i.checkpoint.claimRevision:void 0,r=i.storyId==="P174.03.811759"||i.storyId==="P174.03.685003",n=Ii(i.authorizedWriteSet),a=n.length>0&&n.length===i.authorizedWriteSet.length&&i.changedPaths.every(o=>n.some(s=>Ai(s,o)));if(e&&i.epicId==="P174"&&i.executionBranch==="epic/P174"&&i.baseSha===e.baseSha&&i.headSha===e.headSha&&i.checkpoint.graphRevision===e.graphRevision&&i.commitBodyDigest===e.commitBodyDigest&&i.changedPathsDigest===e.changedPathsDigest&&(r?t===void 0:t===e.effectiveClaimRevision))return i.authorizedWriteSet.length>0&&(!a||!Te(e.effectiveClaimRevision,n))?void 0:Object.freeze({mode:"legacy-migration",effectiveClaimRevision:e.effectiveClaimRevision,binding:e});if(t!==void 0&&!(!t||!h(t))&&!(!a||!Te(t,n)))return Object.freeze({mode:"canonical",effectiveClaimRevision:t})}function Ii(i){const e=i.map(t=>t.replaceAll("\\","/").replace(/^\.\//,"").replace(/\/{2,}/g,"/"));return e.some(t=>!ge(t))?Object.freeze([]):Object.freeze([...new Set(e)].sort())}function Ei(i,e){try{const t=JSON.parse(Pe(y(i,".neocortex","state.json"),"utf8")),r=d(t.stories),n=d(r?.[e]),a=wi(i),o=d(a.stories[e]?.checkpoint)??d(n?.checkpoint);return Ri(e,n,o)}catch{return[]}}function Ri(i,e,t){const r=Array.isArray(e?.files_to_modify)?e.files_to_modify.filter(n=>typeof n=="string"):[];if(!t?.dispatchId||!t.bundleId)return r;try{return di({...e,id:i,files_to_modify:r})}catch{return[]}}function Te(i,e){return i===w("sha256").update(e.join("\0")).digest("hex")||i===w("sha256").update(JSON.stringify(e)).digest("hex")}function Ai(i,e){return i===e||i.endsWith("/")&&e.startsWith(i)}function _t(i,e,t,r,n,a){try{if(!Ge(e,t,r,n))return!1;const o=d(e),s=d(o.qaReceipt),u=d(o.reviewReceipt),c=String(o.headSha),f=String(o.baseSha),D=z(i,["rev-parse",`refs/heads/${n}`]).trim();if(re("git",["merge-base","--is-ancestor",c,D],{cwd:i,stdio:"ignore"}),z(i,["rev-parse",`${c}^`]).trim()!==f||z(i,["rev-list","--count",`${f}..${c}`]).trim()!=="1")return!1;const g=z(i,["show","--no-patch","--format=%H%n%P%n%B",c]),m=z(i,["diff-tree","--no-commit-id","--name-only","-r","-z",c]).split("\0").filter(Boolean);if(m.length===0||m.some(N=>!ge(N)))return!1;const S=He({checkpoint:o,storyId:t,epicId:r,executionBranch:n,baseSha:f,headSha:c,changedPaths:m,authorizedWriteSet:a,commitBodyDigest:w("sha256").update(g).digest("hex"),changedPathsDigest:w("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 ki(i){return w("sha256").update(["local-yolo-tdd-git-immutable-v1",i.storyId,i.baseSha,i.headSha,i.bundleDigest,i.graphRevision,w("sha256").update(i.commitBody).digest("hex"),w("sha256").update([...i.changedPaths].sort().join("\0")).digest("hex")].join("\0")).digest("hex")}function Ci(i){return w("sha256").update(["local-yolo-tdd-p205-execution-v2",V,i.gitEvidenceDigest,i.headSha,i.graphRevision,i.manifestDigest,i.gateIds.join(","),i.resultDigest].join("\0")).digest("hex")}function Oi(i){const e=d(i.value);return Object.freeze({schemaVersion:1,kind:"story_checkpoint_physical_verification",producer:"client-p205-transient-v1",storyId:i.storyId,epicId:i.epicId,branch:i.executionBranch,baseSha:x(e?.baseSha)?String(e?.baseSha):"0".repeat(40),headSha:x(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:ce(i.verifiedAt),verdict:i.verdict,reasonCodes:Object.freeze([i.reasonCode]),publicSafe:!0})}function z(i,e){return re("git",[...e],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})}function ce(i){return Number.isFinite(Date.parse(i))?new Date(Date.parse(i)).toISOString():new Date().toISOString()}async function xt(i,e){if(Ve[e.storyId]!==e.headSha)return;const t=[".neocortex/state.json",`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,`.neocortex/stories/${e.storyId}/review.md`,`docs/stories/${e.storyId}.story.md`];try{const r=(await B("git",["rev-parse",`refs/heads/${e.executionBranch}`],{cwd:i,encoding:"utf8",maxBuffer:1048576})).stdout.trim();if(await B("git",["merge-base","--is-ancestor",e.headSha,r],{cwd:i}),(await B("git",["rev-parse",`${e.headSha}^`],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim()!==e.baseSha)return;const a=String((await B("git",["diff","--binary","--full-index",`${e.baseSha}..${e.headSha}`],{cwd:i,encoding:"utf8",maxBuffer:32*1024*1024})).stdout);if(w("sha256").update(a).digest("hex")!==e.bundleDigest)return;const o=String((await B("git",["show","--no-patch","--format=%H%n%P%n%B",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:4*1024*1024})).stdout);if(!String((await B("git",["show","--no-patch","--format=%s",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:1024*1024})).stdout).trim().includes(e.storyId))return;const c=String((await B("git",["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha],{cwd:i,encoding:"utf8",maxBuffer:8*1024*1024})).stdout).split("\0").filter(Boolean);if(!t.every(b=>c.includes(b))||c.some(b=>!ge(b)))return;const f=await Promise.all(t.map(async b=>String((await B("git",["show",`${e.headSha}:${b}`],{cwd:i,encoding:"utf8",maxBuffer:16*1024*1024})).stdout))),D=JSON.parse(f[0]),g=d(D.stories),m=d(D.epics),S=d(g?.[e.storyId]),N=d(m?.[e.epicId]),$=Array.isArray(S?.steps_completed)?S.steps_completed:[],R=JSON.parse(f[1]);return S?.status!=="done"||!$.includes(li)||!$.includes(mi)||N?.branch_mode!=="epic"||N.execution_branch!==e.executionBranch||R.storyId!==e.storyId||R.status!=="qa-passed"||R.safeToContinueYoloop!==!0||!Array.isArray(R.blockingChecks)||R.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:${w("sha256").update(["legacy-direct-yolo-recovery-v1",e.storyId,e.epicId,e.executionBranch,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,w("sha256").update(o).digest("hex"),w("sha256").update([...c].sort().join("\0")).digest("hex"),...f.map(b=>w("sha256").update(b).digest("hex"))].join("\0")).digest("hex")}`}catch{return}}async function Pi(i){const e=await _e(i),t=y(e,de),r=y(t,fe);if(j(t)&&(await G(t,"directory"),await Z(t)!==t))throw new Error("git-lifecycle-runtime-directory-symlink");return j(r)?r:y(e,Se)}async function Fe(i){return Ke(await _e(i))}async function Ni(i,e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)||e.includes(".."))throw new Error("git-lifecycle-private-child-invalid");const t=p(i);await K(t);const r=p(t,e);return te(t,r),j(r)||await Be(t,e),await K(r,t),await K(t),r}async function _(i,e){const t=p(e),r=p(i);te(t,r),await K(t),await K(r,t)}async function It(i,e){await Y(i,e)}async function X(i,e,t){const r=p(e),n=p(i);te(r,n);try{await _(n,r)}catch(o){if(O(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 te(r,a),await ie(r,k(n),k(a)),await _(a,r),t&&!await t(a)?(await oe(a,n,r).catch(()=>{}),!1):(await hi(r,k(a)),!0)}async function oe(i,e,t){await _(i,t);try{await be(e);return}catch(r){if(!O(r,"ENOENT"))throw r}await ie(t,k(i),k(e)),await _(e,t)}async function P(i){try{await _(i,W(i));const e=y(i,"owner.json");await Y(e,i);const t=await T(e);return await Y(e,i),w("sha256").update(t).digest("hex")}catch{return}}async function Et(i,e){const t=await Fe(i),r=await Ni(t,"leases"),n=y(r,"integration"),a=`${n}.recovery`;if(j(a)){await _(a,r);const c=await Me(a),f=await P(a);if(c===void 0||le(c))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};if(!f||!await X(a,r,async D=>await P(D)===f))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"}}const o=ce(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:ce(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 K(r,t);try{return await Ne(r,k(n),`${JSON.stringify(s)}
4
+ `),await _(n,r),await Y(y(n,"owner.json"),n),!0}catch(c){throw O(c,"EEXIST")||await X(n,r).catch(()=>{}),c}};try{return await u(),{ok:!0,owner:s,path:n}}catch(c){if(!O(c,"EEXIST"))return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"}}try{const c=await se(n),f=c?void 0:await Me(n);if(c&&We(c,s))return{ok:!0,owner:c,path:n};if(c&&Date.parse(c.expiresAt)>Date.now()&&(c.persistent||le(c.pid))||f!==void 0&&le(f)||!c&&f===void 0&&await Ze(n))return{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};const g=await P(n);if(!g)return{ok:!1,reasonCode:"git-lifecycle-integration-lock-failed"};const m=`${n}.stale.${process.pid}.${Date.now()}`;await ie(r,k(n),k(m));try{if(await _(m,r),await P(m)!==g)return await oe(m,n,r).catch(()=>{}),{ok:!1,reasonCode:"git-lifecycle-integration-backpressure"};await u()}finally{await X(m,r,async S=>await P(S)===g).catch(()=>{})}return{ok:!0,owner:s,path:n}}catch(c){return{ok:!1,reasonCode:O(c,"EEXIST")||O(c,"ENOENT")?"git-lifecycle-integration-backpressure":"git-lifecycle-integration-lock-failed"}}}async function Rt(i,e){const t=await se(i);return!!(t&&De(t,e)&&Date.parse(t.expiresAt)>Date.now())}async function Bi(i,e){try{const t=W(i);await _(i,t);const r=await se(i);if(!r||!De(r,e))return!1;const n=await P(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await ie(t,k(i),k(a)),await _(a,t);const o=await se(a);return!o||!De(o,e)||await P(a)!==n?(await oe(a,i,t).catch(()=>{}),!1):X(a,t,async s=>await P(s)===n)}catch(t){if(O(t,"ENOENT"))return!1;throw t}}function $i(i){return w("sha256").update(["git-lifecycle-physical-owner-v1",i.kind,i.storyId,i.sessionId,i.idempotencyKey,String(i.pid),i.createdAt,i.expiresAt,i.persistent?"persistent":"ephemeral",i.ownerNonce].join("\0")).digest("hex")}async function At(i,e){if(!J(e.storyId)||!C(e.idempotencyKey)||!h(e.ownerDigest))return"foreign";const t=await Fe(i),r=y(t,"leases"),n=y(r,"integration");if(!j(n))return"absent";try{await _(r,t),await _(n,r);const a=await se(n);return!a||a.kind!=="direct"||a.storyId!==e.storyId||a.sessionId!==e.idempotencyKey||a.idempotencyKey!==e.idempotencyKey||a.persistent!==!0||$i(a)!==e.ownerDigest?"foreign":await Bi(n,a)?"released":"foreign"}catch{return"foreign"}}async function se(i){try{await _(i,W(i));const e=y(i,"owner.json");await Y(e,i);const t=JSON.parse(await T(e,"utf8"));return t.schemaVersion!==1||t.kind!=="direct"&&t.kind!=="continuous"||!J(t.storyId)||!C(t.sessionId)||!C(t.idempotencyKey)||!Number.isSafeInteger(t.pid)||Number(t.pid)<=0||!E(t.createdAt)||!E(t.expiresAt)||typeof t.persistent!="boolean"||typeof t.ownerNonce!="string"||!/^[a-f0-9]{32}$/.test(t.ownerNonce)?void 0:t}catch{return}}async function Me(i){try{await _(i,W(i));const e=y(i,"owner.json");await Y(e,i);const t=JSON.parse(await T(e,"utf8"));return Number.isSafeInteger(t.pid)&&Number(t.pid)>0?Number(t.pid):void 0}catch{return}}function We(i,e){return i.kind===e.kind&&i.storyId===e.storyId&&i.sessionId===e.sessionId&&i.idempotencyKey===e.idempotencyKey&&i.expiresAt===e.expiresAt&&i.persistent===e.persistent}function De(i,e){return We(i,e)&&i.schemaVersion===e.schemaVersion&&i.pid===e.pid&&i.createdAt===e.createdAt&&i.ownerNonce===e.ownerNonce}async function _e(i){const e=await Z(i),r=(await B("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim(),n=ne(r)?p(r):p(e,r),a=await Z(n);if(a!==n)throw new Error("git-lifecycle-common-dir-symlink");await Li(a);const s=(await B("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",maxBuffer:1024*1024})).stdout.trim();if((ne(s)?p(s):p(e,s))!==n)throw new Error("git-lifecycle-common-dir-raced");return a}async function Ke(i){const e=y(i,de);if(j(e)||await Be(i,de),await G(e,"directory"),await Z(e)!==e)throw new Error("git-lifecycle-runtime-directory-symlink");return e}async function Ye(i,e={}){try{return await G(i,"file"),xe(JSON.parse(await T(i,"utf8")))}catch(t){if(O(t,"ENOENT")){if(e.required)throw new Error("git-lifecycle-runtime-missing");return Ie()}throw t}}async function Vi(i){try{await G(i,"file")}catch(e){if(O(e,"ENOENT"))return;throw e}}async function G(i,e){const t=await be(i);if(t.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!t.isFile():!t.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(ue()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(ue()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}function te(i,e){const t=p(i),r=p(e),n=oi(t,r);if(!n||n.startsWith("..")||ne(n)||W(r)!==t)throw new Error("git-lifecycle-private-path-escape")}async function K(i,e){const t=p(i);if(e&&te(p(e),t),await G(t,"directory"),p(await Z(t))!==t)throw new Error("git-lifecycle-directory-substituted");if(e){const r=p(e);if(await G(r,"directory"),p(await Z(r))!==r)throw new Error("git-lifecycle-directory-parent-substituted")}}async function Y(i,e){const t=p(i);if(te(p(e),t),await K(p(e)),await G(t,"file"),p(await Z(t))!==t)throw new Error("git-lifecycle-file-substituted")}function Je(i,e){const t=Oe(i);if(t.isSymbolicLink())throw new Error(`git-lifecycle-${e}-symlink`);if(e==="file"?!t.isFile():!t.isDirectory())throw new Error(`git-lifecycle-${e}-invalid`);if(ue()&&t.uid!==process.getuid())throw new Error(`git-lifecycle-${e}-ownership-mismatch`);if(ue()&&(t.mode&63)!==0)throw new Error(`git-lifecycle-${e}-permissions-unsafe`)}async function Li(i){const e=await be(i);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function qi(i){const e=Oe(i);if(e.isSymbolicLink())throw new Error("git-lifecycle-common-dir-symlink");if(!e.isDirectory())throw new Error("git-lifecycle-common-dir-invalid")}function ue(i=process.platform){return i!=="win32"&&typeof process.getuid=="function"}function xe(i){if(!i||typeof i!="object"||Array.isArray(i))throw new Error("git-lifecycle-runtime-invalid");const e=i;I(e,["schemaVersion","revision","epics","stories"],"git-lifecycle-runtime-unknown-field");const t=d(e.epics),r=d(e.stories);if(e.schemaVersion!==1||!Number.isSafeInteger(e.revision)||Number(e.revision)<0||!t||!r||Object.values(t).some(n=>!d(n))||Object.values(r).some(n=>!d(n)))throw new Error("git-lifecycle-runtime-invalid");for(const[n,a]of Object.entries(t))if(!J(n)||!Gi(a))throw new Error("git-lifecycle-runtime-epic-invalid");for(const[n,a]of Object.entries(r))if(!J(n)||!n.includes(".")||!Hi(a,n))throw new Error("git-lifecycle-runtime-story-invalid");return e}const ji=["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"],zi=["checkpoint","status","last_step","steps_completed"];function Gi(i){return I(i,ji,"git-lifecycle-runtime-epic-unknown-field"),(i.branch_mode===void 0||i.branch_mode==="epic")&&(i.execution_branch===void 0||F(i.execution_branch))&&(i.origin_branch===void 0||F(i.origin_branch))&&(i.branch_lease===void 0||i.branch_lease===null||Ti(i.branch_lease))&&(i.origin_binding===void 0||i.origin_binding===null||Wi(i.origin_binding))&&(i.graph_revision===void 0||h(i.graph_revision))&&(i.aggregate_qa_receipt===void 0||i.aggregate_qa_receipt===null||Ki(i.aggregate_qa_receipt))&&(i.terminal_git_receipt===void 0||i.terminal_git_receipt===null||Yi(i.terminal_git_receipt))&&(i.physicalMergeStatus===void 0||["merged","pushed","denied_external_gate","blocked_local_or_repo","not_attempted"].includes(String(i.physicalMergeStatus)))&&(i.pr_number===void 0||i.pr_number===null||Number.isSafeInteger(i.pr_number)&&Number(i.pr_number)>0)&&(i.git_reconciliation_receipts===void 0||Xi(i.git_reconciliation_receipts))&&(i.git_reconciliation_debt===void 0||et(i.git_reconciliation_debt))}function Hi(i,e){return I(i,zi,"git-lifecycle-runtime-story-unknown-field"),(i.checkpoint===void 0||i.checkpoint===null||Qe(i.checkpoint,e))&&(i.status===void 0||C(i.status))&&(i.last_step===void 0||i.last_step===null||C(i.last_step))&&(i.steps_completed===void 0||L(i.steps_completed,128))}function Ti(i){const e=d(i);return e?(I(e,["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt","handoffGrant","handoffConsumption"],"git-lifecycle-runtime-lease-unknown-field"),e.schemaVersion===1&&J(e.ownerStoryId)&&C(e.sessionId)&&C(e.idempotencyKey)&&E(e.acquiredAt)&&E(e.expiresAt)&&Date.parse(String(e.expiresAt))>Date.parse(String(e.acquiredAt))&&(e.handoffGrant===void 0||Fi(e.handoffGrant,e))&&(e.handoffConsumption===void 0||Mi(e.handoffConsumption,e))):!1}function Fi(i,e){const t=d(i);return t?(I(t,["schemaVersion","kind","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","expiresAt"],"git-lifecycle-runtime-handoff-grant-unknown-field"),t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff"&&t.storyId===e.ownerStoryId&&t.fromSessionId===e.sessionId&&h(t.tokenDigest)&&h(t.bundleDigest)&&h(t.claimRevision)&&E(t.expiresAt)&&Date.parse(String(t.expiresAt))<=Date.parse(String(e.expiresAt))):!1}function Mi(i,e){const t=d(i);return t?(I(t,["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","consumedBySessionId","consumedAt"],"git-lifecycle-runtime-handoff-consumption-unknown-field"),t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff-consumption"&&t.state==="consumed"&&t.storyId===e.ownerStoryId&&C(t.fromSessionId)&&h(t.tokenDigest)&&h(t.bundleDigest)&&h(t.claimRevision)&&t.consumedBySessionId===e.sessionId&&E(t.consumedAt)):!1}function Wi(i){const e=d(i);return e?(I(e,["schemaVersion","originBranch","originHeadSha","executionBranch","capturedFromCurrentCheckout","capturedAt"],"git-lifecycle-runtime-origin-unknown-field"),e.schemaVersion===1&&F(e.originBranch)&&F(e.executionBranch)&&e.originBranch!==e.executionBranch&&x(e.originHeadSha)&&e.capturedFromCurrentCheckout===!0&&E(e.capturedAt)):!1}function Ki(i){const e=d(i);if(!e)return!1;I(e,["schemaVersion","evidenceVersion","producer","contract","command","verdict","executionHeadSha","graphRevision","manifestDigest","resultDigest","checkedAt","receiptRef","gateIds"],"git-lifecycle-runtime-aggregate-qa-unknown-field");const t=e.evidenceVersion==="p205-execution-v2"&&e.producer==="local-yolo-tdd"&&e.contract==="P205-CI-02"&&e.command===V&&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&&(t||r)&&e.verdict==="passed"&&x(e.executionHeadSha)&&h(e.graphRevision)&&E(e.checkedAt)&&he(e.receiptRef)&&L(e.gateIds,128,!0)}function Yi(i){const e=d(i);return e?(I(e,["schemaVersion","epicId","executionBranch","originBranch","baseSha","executionHeadSha","mergeSha","pushedSha","strategy","prNumber","physicalStatus","localGateReceiptRefs","idempotencyKey","attemptStartedAt","completedAt","retryEligible","reasonCodes","publicSafe","candidateQa","providerGuard"],"git-lifecycle-runtime-terminal-receipt-unknown-field"),e.schemaVersion===1&&J(e.epicId)&&F(e.executionBranch)&&F(e.originBranch)&&x(e.baseSha)&&x(e.executionHeadSha)&&(e.mergeSha===void 0||x(e.mergeSha))&&(e.pushedSha===void 0||x(e.pushedSha))&&(e.strategy==="direct"||e.strategy==="single_pr")&&(e.candidateQa===void 0||Qi(e.candidateQa,e))&&(e.providerGuard===void 0||Ji(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)&&C(e.idempotencyKey)&&E(e.attemptStartedAt)&&(e.completedAt===void 0||E(e.completedAt))&&typeof e.retryEligible=="boolean"&&L(e.reasonCodes,128)&&e.publicSafe===!0):!1}function Ji(i,e){const t=d(i);if(!t)return!1;I(t,["schemaVersion","provider","mode","source","prHeadSha","originHeadSha","checkedAt","publicSafe"],"git-lifecycle-runtime-provider-guard-unknown-field");const r=t.mode==="recovered_exact_tree"?t.source==="physical_recovery":t.mode==="strict_up_to_date_expected_head"&&["branch_protection","ruleset","branch_protection_and_ruleset"].includes(String(t.source));return t.schemaVersion===1&&t.provider==="github"&&r&&e.strategy==="single_pr"&&e.physicalStatus==="pushed"&&Number.isSafeInteger(e.prNumber)&&Number(e.prNumber)>0&&x(t.prHeadSha)&&t.prHeadSha===e.mergeSha&&x(t.originHeadSha)&&t.originHeadSha===e.baseSha&&E(t.checkedAt)&&t.publicSafe===!0}function Qi(i,e){const t=d(i);return t?(I(t,["schemaVersion","kind","contract","command","originHeadSha","executionHeadSha","mergeSha","treeSha","graphRevision","manifestDigest","resultDigest","gateIds","checkedAt","receiptRef"],"git-lifecycle-runtime-merge-candidate-unknown-field"),t.schemaVersion===1&&t.kind==="epic_merge_candidate_qa"&&t.contract==="P205-CI-02"&&t.command===V&&x(t.originHeadSha)&&t.originHeadSha===e.baseSha&&x(t.executionHeadSha)&&t.executionHeadSha===e.executionHeadSha&&x(t.mergeSha)&&t.mergeSha===e.mergeSha&&x(t.treeSha)&&h(t.graphRevision)&&h(t.manifestDigest)&&h(t.resultDigest)&&L(t.gateIds,128,!0)&&E(t.checkedAt)&&he(t.receiptRef)):!1}function Qe(i,e){const t=d(i);if(!t)return!1;I(t,["schemaVersion","storyId","epicId","branch","baseSha","headSha","commits","idempotencyKey","dispatchId","bundleId","bundleDigest","graphRevision","claimRevision","receiptRefs","qaVerdict","reviewVerdict","qaReceipt","reviewReceipt","recordedAt"],"git-lifecycle-runtime-checkpoint-unknown-field");const r=String(e).split(".")[0];return t.schemaVersion===1&&t.storyId===e&&t.epicId===r&&F(t.branch)&&x(t.baseSha)&&x(t.headSha)&&t.baseSha!==t.headSha&&tt(t.commits)&&t.commits.length===1&&t.commits[0]===t.headSha&&C(t.idempotencyKey)&&(t.dispatchId===void 0||h(t.dispatchId))&&(t.bundleId===void 0||h(t.bundleId))&&h(t.bundleDigest)&&h(t.graphRevision)&&(t.claimRevision===void 0||h(t.claimRevision))&&L(t.receiptRefs,256,!0)&&(t.qaVerdict==="passed"||t.qaVerdict==="blocked")&&["approved","changes-requested","pending"].includes(String(t.reviewVerdict))&&Ui(t.qaReceipt,t)&&(t.reviewVerdict==="pending"?t.reviewReceipt===void 0:Zi(t.reviewReceipt,t))&&E(t.recordedAt)}function Ui(i,e){const t=d(i);return t?(I(t,["schemaVersion","kind","producer","evidenceVersion","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","contract","command","manifestDigest","gateIds","resultDigest","sourceEvidenceDigest","verdict","checkedAt","receiptRef"],"git-lifecycle-runtime-story-qa-unknown-field"),t.schemaVersion===1&&t.kind==="story_qa_evidence"&&t.producer==="local-yolo-tdd"&&(t.evidenceVersion===void 0||t.evidenceVersion==="git-immutable-v1"||t.evidenceVersion==="p205-execution-v2"&&t.contract==="P205-CI-02"&&t.command===V&&h(t.manifestDigest)&&L(t.gateIds,32,!0)&&h(t.resultDigest))&&Ue(t,e)&&h(t.sourceEvidenceDigest)&&t.verdict===e.qaVerdict&&(t.verdict==="passed"||t.verdict==="blocked")&&E(t.checkedAt)&&he(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef)):!1}function Zi(i,e){const t=d(i),r=d(e.qaReceipt);return!t||!r?!1:(I(t,["schemaVersion","kind","producer","storyId","epicId","baseSha","headSha","bundleDigest","graphRevision","sourceEvidenceDigest","qaReceiptRef","verdict","reviewedAt","receiptRef"],"git-lifecycle-runtime-story-review-unknown-field"),t.schemaVersion===1&&t.kind==="story_review_evidence"&&t.producer==="root-commit-range-review"&&Ue(t,e)&&h(t.sourceEvidenceDigest)&&t.qaReceiptRef===r.receiptRef&&t.receiptRef!==r.receiptRef&&(t.verdict==="approved"||t.verdict==="changes-requested")&&(t.verdict==="approved"?e.reviewVerdict==="approved":e.reviewVerdict==="changes-requested")&&E(t.reviewedAt)&&Date.parse(String(t.reviewedAt))>=Date.parse(String(r.checkedAt))&&he(t.receiptRef)&&e.receiptRefs.includes(t.receiptRef))}function Ue(i,e){return["storyId","epicId","baseSha","headSha","bundleDigest","graphRevision"].every(t=>i[t]===e[t])}function Xi(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=d(e);return t?(I(t,["schemaVersion","resourceId","action","outcome","idempotencyKey","reasonCodes","recordedAt","publicSafe"],"git-lifecycle-runtime-reconciliation-receipt-unknown-field"),t.schemaVersion===1&&C(t.resourceId)&&["no_op","delete_local_branch","delete_remote_branch","close_pull_request"].includes(String(t.action))&&["applied","already_absent","dry_run","failed"].includes(String(t.outcome))&&C(t.idempotencyKey)&&L(t.reasonCodes,128)&&E(t.recordedAt)&&t.publicSafe===!0):!1})}function et(i){return!Array.isArray(i)||i.length>1024?!1:i.every(e=>{const t=d(e);return t?(I(t,["schemaVersion","resourceId","action","managed","reasonCodes","evidence","publicSafe"],"git-lifecycle-runtime-reconciliation-debt-unknown-field"),t.schemaVersion===1&&C(t.resourceId)&&t.action==="preserve"&&typeof t.managed=="boolean"&&L(t.reasonCodes,128)&&L(t.evidence,16)&&t.publicSafe===!0):!1})}function I(i,e,t){const r=new Set(e);if(Object.keys(i).some(n=>!r.has(n)))throw new Error(t)}function J(i){return typeof i=="string"&&/^P[1-9][0-9]*(?:\.[0-9]+)*$/.test(i)}function it(i){const e=d(i);return e?Object.keys(e).length===10&&e.schemaVersion===1&&e.kind==="git_lifecycle_graph_authority"&&e.producer==="server-continuous-yoloop-v1"&&(e.source==="yolo"||e.source==="yoloop")&&J(e.epicId)&&J(e.storyId)&&String(e.storyId).startsWith(`${String(e.epicId)}.`)&&F(e.executionBranch)&&F(e.originBranch)&&e.originBranch!==e.executionBranch&&typeof e.graphRevision=="string"&&/^[a-f0-9]{64}$/.test(e.graphRevision)&&e.publicSafe===!0:!1}function F(i){return typeof i=="string"&&/^[A-Za-z0-9][A-Za-z0-9._/-]{0,239}$/.test(i)&&!i.includes("..")&&!i.includes("//")&&!i.includes("@{")&&!i.endsWith("/")&&!i.endsWith(".")&&!i.split("/").some(e=>!e||e.startsWith(".")||e.endsWith(".lock"))}function ge(i){return i.length>0&&i.length<=1024&&!ne(i)&&!i.includes("\0")&&!i.replaceAll("\\","/").split("/").includes("..")}function C(i){return typeof i=="string"&&i.length>0&&i.length<=240&&/^[A-Za-z0-9._:/#\-[\]]+$/.test(i)&&!i.includes("..")}function he(i){return C(i)}function x(i){return typeof i=="string"&&/^[a-f0-9]{40,64}$/i.test(i)}function h(i){return typeof i=="string"&&/^[a-f0-9]{64}$/i.test(i)}function E(i){return typeof i=="string"&&i.length<=64&&Number.isFinite(Date.parse(i))}function L(i,e,t=!1){return Array.isArray(i)&&i.length<=e&&(!t||i.length>0)&&i.every(C)}function tt(i){return Array.isArray(i)&&i.length>0&&i.length<=256&&i.every(x)}function Ie(){return{schemaVersion:1,revision:0,epics:{},stories:{}}}async function rt(i){const e=W(i),t={pid:process.pid,nonce:ye(16).toString("hex")},r=async()=>{await K(e),await Ne(e,k(i),JSON.stringify(t));try{await _(i,e),await Y(y(i,"owner.json"),i)}catch(n){throw await X(i,e).catch(()=>{}),n}};try{await r()}catch(n){if(!O(n,"EEXIST"))throw n;await G(i,"directory");const a=await Ee(i);if(a!==void 0&&le(a.pid))throw new Error("git-lifecycle-runtime-lock-active");if(a===void 0&&await Ze(i))throw new Error("git-lifecycle-runtime-lock-active");const o=await P(i);if(!o)throw new Error("git-lifecycle-runtime-lock-owner-invalid");const s=`${i}.stale.${process.pid}.${Date.now()}`;await ie(e,k(i),k(s));try{if(await _(s,e),await P(s)!==o)throw await oe(s,i,e).catch(()=>{}),new Error("git-lifecycle-runtime-lock-owner-replaced");await r()}finally{await X(s,e,async u=>await P(u)===o).catch(()=>{})}}return t}async function nt(i,e){const t=W(i);try{await _(i,t);const r=await Ee(i);if(!r||!Xe(r,e))return!1;const n=await P(i);if(!n)return!1;const a=`${i}.release.${process.pid}.${Date.now()}`;await ie(t,k(i),k(a)),await _(a,t);const o=await Ee(a);return!o||!Xe(o,e)||await P(a)!==n?(await oe(a,i,t).catch(()=>{}),!1):X(a,t,async s=>await P(s)===n)}catch(r){if(O(r,"ENOENT"))return!1;throw r}}async function Ze(i){try{return Date.now()-(await ci(i)).mtimeMs<3e4}catch{return!0}}async function Ee(i){try{await _(i,W(i));const e=y(i,"owner.json");await Y(e,i);const t=JSON.parse(await T(e,"utf8"));return Number.isSafeInteger(t.pid)&&Number(t.pid)>0&&(t.nonce===void 0||typeof t.nonce=="string"&&/^[a-f0-9]{32}$/.test(t.nonce))?{pid:Number(t.pid),...typeof t.nonce=="string"?{nonce:t.nonce}:{}}:void 0}catch{return}}function Xe(i,e){return i.pid===e.pid&&i.nonce!==void 0&&i.nonce===e.nonce}function le(i){try{return process.kill(i,0),!0}catch(e){return O(e,"EPERM")}}function d(i){return i&&typeof i=="object"&&!Array.isArray(i)?i:void 0}function O(i,e){return i instanceof Error&&"code"in i&&i.code===e}export{de as GIT_LIFECYCLE_RUNTIME_DIRECTORY,fe as GIT_LIFECYCLE_RUNTIME_FILE,Ve as LEGACY_DIRECT_YOLO_RECOVERY_COMMITS,pi as LEGACY_P174_CHECKPOINT_MIGRATIONS,V as P205_COMPLETE_COMMAND,Et as acquireGitLifecyclePhysicalIntegrationLock,vi as applyGitLifecycleRuntimeOverlay,_ as assertGitLifecyclePrivateDirectory,It as assertGitLifecyclePrivateFile,$i as computeGitLifecyclePhysicalIntegrationLockOwnerDigest,ki as computeImmutableStoryQaEvidenceDigest,xt as computeLegacyDirectYoloRecoveryReceiptRef,Ci as computeP205StoryQaEvidenceDigest,Ni as ensureGitLifecyclePrivateChildDirectory,yt as ensureGitLifecycleRuntimeInitialized,Di as ensureRuntimeEpic,wt as ensureRuntimeStory,bi as executeP205TransientAuthorities,pt as executeP205TransientAuthority,Fe as gitLifecycleRuntimeDirectory,Ri as gitLifecycleStoryWriteSet,Ge as isAcceptedGitLifecycleStoryCheckpoint,je as mutateGitLifecycleRuntime,Dt as p205TransientAuthorityMatchesAggregate,bt as persistGitLifecycleGraphAuthority,ue as posixSecurityAvailable,vt as projectP205TransientExecutionEvidence,ve as readGitLifecycleRuntime,wi as readGitLifecycleRuntimeSync,Bi as releaseGitLifecyclePhysicalIntegrationLock,At as releaseGitLifecyclePhysicalIntegrationLockForCheckpoint,X as removeGitLifecyclePrivateDirectory,St as verifyAcceptedGitLifecycleStoryCheckpoint,_i as verifyAcceptedGitLifecycleStoryCheckpointSync,Rt as verifyGitLifecyclePhysicalIntegrationLock,_t as verifyLegacyCheckpointMigrationCandidateSync};
@@ -37,6 +37,7 @@
37
37
  */
38
38
  export type { AssembledPrompt, CacheProvider, CodebaseMetadata, CreateResolverOptions, LocalResolverOptions, PipelineContext, RemoteResolverOptions, SkillContent, StandardContent, StepContent, StepRegistry, StepRegistryEntry, StoryMetadata, } from './types/index.js';
39
39
  export { ResolverMode, NoOpCache } from './types/index.js';
40
+ export { PUBLIC_PROJECTION_BUNDLE, PUBLIC_PROJECTION_GENERATION_ID, PUBLIC_PROJECTION_BUNDLE_HASH, } from './generated/public-projections.generated.js';
40
41
  export type { AssetResolver } from './resolvers/asset-resolver.js';
41
42
  export { LocalResolver } from './resolvers/local-resolver.js';
42
43
  export { RemoteResolver, RemoteResolverError } from './resolvers/remote-resolver.js';
@@ -1 +1 @@
1
- import{ResolverMode as o,NoOpCache as t}from"./types/index.js";import{LocalResolver as i}from"./resolvers/local-resolver.js";import{RemoteResolver as n,RemoteResolverError as l}from"./resolvers/remote-resolver.js";import{EncryptedCache as m}from"./cache/index.js";import{createResolver as f,selectResolver as d}from"./config/resolver-selection.js";import{collectContext as g}from"./context/context-collector.js";import{sanitizeValue as A,sanitizeRecord as S,sanitizeObject as y}from"./context/context-sanitizer.js";import{getMachineFingerprint as R}from"./machine/index.js";import{LicenseClient as D}from"./license/index.js";import{ClaudeCodeAdapter as M,CursorAdapter as h,VSCodeAdapter as E,GeminiAdapter as O,CodexAdapter as k,AntigravityAdapter as F,AdapterRegistry as P,UnknownTargetError as b,createDefaultRegistry as I,detectPlatform as N,isValidTargetId as j}from"./adapters/index.js";import{ClientCircuitBreaker as Y,DegradationManager as _,DegradationLevel as w,FreshnessIndicator as z,RecoveryDetector as G}from"./resilience/index.js";import{OfflineTelemetryQueue as V}from"./telemetry/index.js";import{getCacheStatus as Q,formatCacheStatus as U}from"./commands/cache-status.js";import{getSubagentApprovalPolicy as J,ensureManagedSubagentApprovalPolicy as K,setSubagentApprovalMode as W,resetSubagentApprovalMode as X,ApprovalPolicyConfigError as Z}from"./config.js";import{configCliHandler as ee}from"./commands/config.js";import{storyCheckpointCliHandler as oe,parseStoryCheckpointArgs as te}from"./commands/story-checkpoint.js";import{beginDirectYoloStoryCommit as ie,finalizeDirectYoloStoryCheckpoint as pe,issueDirectYoloSetupLeaseHandoff as ne,prepareDirectYoloSetup as le,recoverLegacyDirectYoloStoryCheckpoint as ce}from"./git/direct-yolo-checkpoint.js";import{FRONTMATTER_DIAGNOSTIC_CATEGORIES as se,FRONTMATTER_DIAGNOSTIC_REASON_CODES as fe,getFrontmatterDiagnostic as de,formatFrontmatterDiagnostic as Ce}from"./errors/frontmatter-diagnostics.js";import{invoke as xe,invokeCliHandler as Ae,collectStateSnapshot as Se}from"./commands/invoke.js";import{TierAwareClient as ue}from"./tier/index.js";import{buildProjectMemoryContent as ve,createNodeProjectMemoryFs as De,writeProjectMemory as Te,writeProjectMemoryTargetFiles as Me}from"./memory/project-memory-writer.js";export{P as AdapterRegistry,F as AntigravityAdapter,Z as ApprovalPolicyConfigError,M as ClaudeCodeAdapter,Y as ClientCircuitBreaker,k as CodexAdapter,h as CursorAdapter,w as DegradationLevel,_ as DegradationManager,m as EncryptedCache,se as FRONTMATTER_DIAGNOSTIC_CATEGORIES,fe as FRONTMATTER_DIAGNOSTIC_REASON_CODES,z as FreshnessIndicator,O as GeminiAdapter,D as LicenseClient,i as LocalResolver,t as NoOpCache,V as OfflineTelemetryQueue,G as RecoveryDetector,n as RemoteResolver,l as RemoteResolverError,o as ResolverMode,ue as TierAwareClient,b as UnknownTargetError,E as VSCodeAdapter,ie as beginDirectYoloStoryCommit,ve as buildProjectMemoryContent,g as collectContext,Se as collectStateSnapshot,ee as configCliHandler,I as createDefaultRegistry,De as createNodeProjectMemoryFs,f as createResolver,N as detectPlatform,K as ensureManagedSubagentApprovalPolicy,pe as finalizeDirectYoloStoryCheckpoint,U as formatCacheStatus,Ce as formatFrontmatterDiagnostic,Q as getCacheStatus,de as getFrontmatterDiagnostic,R as getMachineFingerprint,J as getSubagentApprovalPolicy,xe as invoke,Ae as invokeCliHandler,j as isValidTargetId,ne as issueDirectYoloSetupLeaseHandoff,te as parseStoryCheckpointArgs,le as prepareDirectYoloSetup,ce as recoverLegacyDirectYoloStoryCheckpoint,X as resetSubagentApprovalMode,y as sanitizeObject,S as sanitizeRecord,A as sanitizeValue,d as selectResolver,W as setSubagentApprovalMode,oe as storyCheckpointCliHandler,Te as writeProjectMemory,Me as writeProjectMemoryTargetFiles};
1
+ import{ResolverMode as o,NoOpCache as t}from"./types/index.js";import{PUBLIC_PROJECTION_BUNDLE as i,PUBLIC_PROJECTION_GENERATION_ID as p,PUBLIC_PROJECTION_BUNDLE_HASH as n}from"./generated/public-projections.generated.js";import{LocalResolver as c}from"./resolvers/local-resolver.js";import{RemoteResolver as s,RemoteResolverError as C}from"./resolvers/remote-resolver.js";import{EncryptedCache as d}from"./cache/index.js";import{createResolver as x,selectResolver as A}from"./config/resolver-selection.js";import{collectContext as S}from"./context/context-collector.js";import{sanitizeValue as u,sanitizeRecord as T,sanitizeObject as v}from"./context/context-sanitizer.js";import{getMachineFingerprint as E}from"./machine/index.js";import{LicenseClient as I}from"./license/index.js";import{ClaudeCodeAdapter as P,CursorAdapter as _,VSCodeAdapter as M,GeminiAdapter as h,CodexAdapter as L,AntigravityAdapter as k,AdapterRegistry as F,UnknownTargetError as b,createDefaultRegistry as B,detectPlatform as H,isValidTargetId as U}from"./adapters/index.js";import{ClientCircuitBreaker as G,DegradationManager as Y,DegradationLevel as w,FreshnessIndicator as z,RecoveryDetector as J}from"./resilience/index.js";import{OfflineTelemetryQueue as Q}from"./telemetry/index.js";import{getCacheStatus as K,formatCacheStatus as W}from"./commands/cache-status.js";import{getSubagentApprovalPolicy as Z,ensureManagedSubagentApprovalPolicy as $,setSubagentApprovalMode as ee,resetSubagentApprovalMode as re,ApprovalPolicyConfigError as oe}from"./config.js";import{configCliHandler as ae}from"./commands/config.js";import{storyCheckpointCliHandler as pe,parseStoryCheckpointArgs as ne}from"./commands/story-checkpoint.js";import{beginDirectYoloStoryCommit as ce,finalizeDirectYoloStoryCheckpoint as me,issueDirectYoloSetupLeaseHandoff as se,prepareDirectYoloSetup as Ce,recoverLegacyDirectYoloStoryCheckpoint as fe}from"./git/direct-yolo-checkpoint.js";import{FRONTMATTER_DIAGNOSTIC_CATEGORIES as ge,FRONTMATTER_DIAGNOSTIC_REASON_CODES as xe,getFrontmatterDiagnostic as Ae,formatFrontmatterDiagnostic as Re}from"./errors/frontmatter-diagnostics.js";import{invoke as ye,invokeCliHandler as ue,collectStateSnapshot as Te}from"./commands/invoke.js";import{TierAwareClient as De}from"./tier/index.js";import{buildProjectMemoryContent as Oe,createNodeProjectMemoryFs as Ie,writeProjectMemory as Ne,writeProjectMemoryTargetFiles as Pe}from"./memory/project-memory-writer.js";export{F as AdapterRegistry,k as AntigravityAdapter,oe as ApprovalPolicyConfigError,P as ClaudeCodeAdapter,G as ClientCircuitBreaker,L as CodexAdapter,_ as CursorAdapter,w as DegradationLevel,Y as DegradationManager,d as EncryptedCache,ge as FRONTMATTER_DIAGNOSTIC_CATEGORIES,xe as FRONTMATTER_DIAGNOSTIC_REASON_CODES,z as FreshnessIndicator,h as GeminiAdapter,I as LicenseClient,c as LocalResolver,t as NoOpCache,Q as OfflineTelemetryQueue,i as PUBLIC_PROJECTION_BUNDLE,n as PUBLIC_PROJECTION_BUNDLE_HASH,p as PUBLIC_PROJECTION_GENERATION_ID,J as RecoveryDetector,s as RemoteResolver,C as RemoteResolverError,o as ResolverMode,De as TierAwareClient,b as UnknownTargetError,M as VSCodeAdapter,ce as beginDirectYoloStoryCommit,Oe as buildProjectMemoryContent,S as collectContext,Te as collectStateSnapshot,ae as configCliHandler,B as createDefaultRegistry,Ie as createNodeProjectMemoryFs,x as createResolver,H as detectPlatform,$ as ensureManagedSubagentApprovalPolicy,me as finalizeDirectYoloStoryCheckpoint,W as formatCacheStatus,Re as formatFrontmatterDiagnostic,K as getCacheStatus,Ae as getFrontmatterDiagnostic,E as getMachineFingerprint,Z as getSubagentApprovalPolicy,ye as invoke,ue as invokeCliHandler,U as isValidTargetId,se as issueDirectYoloSetupLeaseHandoff,ne as parseStoryCheckpointArgs,Ce as prepareDirectYoloSetup,fe as recoverLegacyDirectYoloStoryCheckpoint,re as resetSubagentApprovalMode,v as sanitizeObject,T as sanitizeRecord,u as sanitizeValue,A as selectResolver,ee as setSubagentApprovalMode,pe as storyCheckpointCliHandler,Ne as writeProjectMemory,Pe as writeProjectMemoryTargetFiles};
@@ -1,7 +1,7 @@
1
- import{createHash as z,randomUUID as m}from"node:crypto";import{existsSync as I,linkSync as q,lstatSync as R,mkdirSync as Q,readFileSync as T,realpathSync as W,statSync as X,unlinkSync as O}from"node:fs";import{dirname as E,join as a,relative as F,resolve as Z}from"node:path";import{assertProjectIdentityMigrationReceiptV1 as j,PROJECT_ID_PATTERN as K}from"../../../shared/dist/invocation/index.js";import{atomicReplaceUtf8 as l,durableCreateUtf8 as U,fsyncDirectoryBestEffort as u,recoverAtomicReplaceUtf8 as $}from"../fs/atomic-state-replace.js";const Et=1,_=a(".neocortex","state.json"),f=a(".neocortex","project-identity-migration.json"),tt=a(".neocortex","project-identity-migration.lock"),et=/^\.neocortex[\\/]state\.json\.project-identity-backup-(?:\d{8}T\d{9}Z-)?mig_[a-f0-9]{32}$/;class n extends Error{code;constructor(r,t=r){super(t),this.code=r,this.name="ProjectIdentityMigrationError"}}const p=o=>z("sha256").update(o).digest("hex");function rt(){return`prj_${m().replaceAll("-","")}`}function ot(){return`mig_${m().replaceAll("-","")}`}function nt(o){return o.toISOString().replace(/[-:.]/g,"")}function g(o){const r=Z(o);let t;try{t=W(r)}catch{throw new n("PROJECT_IDENTITY_ROOT_INVALID")}if(!X(t).isDirectory())throw new n("PROJECT_IDENTITY_ROOT_INVALID");const e=a(t,".neocortex");if(I(e)&&R(e).isSymbolicLink())throw new n("PROJECT_IDENTITY_SYMLINK_REJECTED");const i=a(t,_);if(I(i)){const s=R(i);if(s.isSymbolicLink()||!s.isFile())throw new n("PROJECT_IDENTITY_SYMLINK_REJECTED")}const c=a(t,f);if(I(c)){const s=R(c);if(s.isSymbolicLink()||!s.isFile())throw new n("PROJECT_IDENTITY_SYMLINK_REJECTED")}return t}function A(o,r){const t=a(o,tt);Q(E(t),{recursive:!0,mode:448});const e=()=>{const i=`${t}.${process.pid}.${m()}.owner`;U(i,`${process.pid}
2
- `);try{q(i,t),u(E(t))}finally{try{O(i)}catch{}u(E(t))}};try{e()}catch(i){if(i.code!=="EEXIST")throw new n("PROJECT_IDENTITY_MIGRATION_LOCKED");const c=R(t);if(c.isSymbolicLink()||!c.isFile())throw new n("PROJECT_IDENTITY_SYMLINK_REJECTED");const s=T(t,"utf8");if(!/^[1-9][0-9]*\n$/.test(s)||s.length>24)throw new n("PROJECT_IDENTITY_MIGRATION_LOCK_CORRUPT");const d=Number(s.trim());let N=!0;try{process.kill(d,0)}catch(h){N=h.code!=="ESRCH"}if(N)throw new n("PROJECT_IDENTITY_MIGRATION_LOCKED");try{O(t),u(E(t)),e()}catch{throw new n("PROJECT_IDENTITY_MIGRATION_LOCKED")}}try{return r()}finally{try{O(t),u(E(t))}catch{}}}function v(o){let r;try{r=JSON.parse(o)}catch{throw new n("PROJECT_IDENTITY_STATE_CORRUPT")}if(!r||typeof r!="object"||Array.isArray(r))throw new n("PROJECT_IDENTITY_STATE_CORRUPT");return r}function y(o){const r=a(o,f);try{$(r),$(a(o,_))}catch{throw new n("PROJECT_IDENTITY_ATOMIC_RECOVERY_FAILED")}if(!I(r))return null;let t;try{t=JSON.parse(T(r,"utf8"))}catch{throw new n("PROJECT_IDENTITY_MIGRATION_STATE_CORRUPT")}if(!t||typeof t!="object"||Array.isArray(t))throw new n("PROJECT_IDENTITY_MIGRATION_STATE_CORRUPT");const e=t;if(e.schemaVersion!==1||typeof e.operationId!="string"||!/^mig_[a-f0-9]{32}$/.test(e.operationId)||typeof e.projectId!="string"||!K.test(e.projectId)||!["prepared","remote-acknowledged","finalized"].includes(String(e.phase))||!Number.isSafeInteger(e.legacyEpicFloor)||(e.legacyEpicFloor??-1)<0||typeof e.originalStateExists!="boolean"||typeof e.originalStateDigest!="string"||!/^[a-f0-9]{64}$/.test(e.originalStateDigest)||typeof e.preparedStateDigest!="string"||!/^[a-f0-9]{64}$/.test(e.preparedStateDigest)||e.backupPath!==null&&(typeof e.backupPath!="string"||!et.test(e.backupPath))||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new n("PROJECT_IDENTITY_MIGRATION_STATE_CORRUPT");e.receipt!==void 0&&j(e.receipt);const i=e.phase==="remote-acknowledged"||e.phase==="finalized";if(e.phase==="prepared"&&e.receipt!==void 0||i&&e.receipt===void 0||e.receipt!==void 0&&(e.receipt.operationId!==e.operationId||e.receipt.projectId!==e.projectId||e.receipt.acceptedLegacyFloor<e.legacyEpicFloor))throw new n("PROJECT_IDENTITY_MIGRATION_STATE_CORRUPT");return e}function it(o){const r=[];o.epics&&typeof o.epics=="object"&&!Array.isArray(o.epics)&&r.push(...Object.keys(o.epics));const t=o.epic_id_ledger;if(t&&typeof t=="object"&&!Array.isArray(t)){const e=t.reserved_ids;Array.isArray(e)&&r.push(...e.filter(i=>typeof i=="string"))}return r.reduce((e,i)=>{const c=i.match(/^P?(\d+)$/i);if(!c)return e;const s=Number(c[1]);return Number.isSafeInteger(s)?Math.max(e,s):e},0)}function J(o){return{version:1,operationId:o.operationId,projectId:o.projectId,localStateDigest:o.preparedStateDigest,legacyEpicFloor:o.legacyEpicFloor,phase:"seed"}}function B(o,r){const t=v(o),e=t.config&&typeof t.config=="object"&&!Array.isArray(t.config)?"config":t.project&&typeof t.project=="object"&&!Array.isArray(t.project)?"project":"config",i=t[e]??{};return t[e]={...i,project_id:r},t.schema_version===void 0&&(t.schema_version=1),(!t.stories||typeof t.stories!="object"||Array.isArray(t.stories))&&(t.stories={}),(!t.epics||typeof t.epics!="object"||Array.isArray(t.epics))&&(t.epics={}),{raw:`${JSON.stringify(t,null,2)}
3
- `,state:t}}function V(){return`${JSON.stringify({schema_version:1,config:{project_name:"neocortex-project",default_branch:"main",language:"pt-BR"},stories:{},epics:{}},null,2)}
4
- `}function ct(o,r){if(!r.originalStateExists)return;if(!r.backupPath)throw new n("PROJECT_IDENTITY_MIGRATION_BACKUP_MISSING");const t=a(o,r.backupPath);if(!I(t))throw new n("PROJECT_IDENTITY_MIGRATION_BACKUP_MISSING");const e=R(t);if(e.isSymbolicLink()||!e.isFile())throw new n("PROJECT_IDENTITY_SYMLINK_REJECTED");if(p(T(t))!==r.originalStateDigest)throw new n("PROJECT_IDENTITY_MIGRATION_BACKUP_CORRUPT")}function ft(o){const r=g(o);return A(r,()=>{const t=y(r);if(t){const P=a(r,_);ct(r,t);const w=I(P),L=w?p(T(P)):null;if(L===t.preparedStateDigest)return{changed:!1,document:t,request:J(t)};if(!(t.phase==="prepared"&&(w&&L===t.originalStateDigest||!w&&!t.originalStateExists)))throw new n("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");const H=w?T(P,"utf8"):V(),x=B(H,t.projectId).raw;if(p(x)!==t.preparedStateDigest)throw new n("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");return l(P,x),{changed:!0,document:t,request:J(t)}}const e=a(r,_),i=I(e),c=i?T(e,"utf8"):V(),s=v(c),d=s.config&&typeof s.config=="object"&&!Array.isArray(s.config)?"config":s.project&&typeof s.project=="object"&&!Array.isArray(s.project)?"project":"config",h=(s[d]??{}).project_id,M=typeof h=="string"&&K.test(h)?h:rt(),Y=B(c,M),S=Y.raw,b=ot(),k=new Date,D=i?a(".neocortex",`state.json.project-identity-backup-${nt(k)}-${b}`):null;D&&U(a(r,D),c);const G=k.toISOString(),C={schemaVersion:1,operationId:b,projectId:M,phase:"prepared",legacyEpicFloor:it(Y.state),originalStateExists:i,originalStateDigest:p(c),preparedStateDigest:p(S),backupPath:D,createdAt:G,updatedAt:G};return l(a(r,f),`${JSON.stringify(C,null,2)}
5
- `),l(e,S),{changed:S!==c,document:C,request:J(C)}})}function dt(o,r){j(r);const t=g(o);return A(t,()=>{const e=y(t);if(!e)throw new n("PROJECT_IDENTITY_MIGRATION_NOT_PREPARED");if(e.operationId!==r.operationId||e.projectId!==r.projectId)throw new n("PROJECT_IDENTITY_MIGRATION_RECEIPT_CONFLICT");const i=a(t,_);if(!I(i)||p(T(i))!==e.preparedStateDigest)throw new n("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");if(e.phase==="prepared"||!e.receipt||e.receipt.receiptDigest!==r.receiptDigest)throw new n("PROJECT_IDENTITY_MIGRATION_ACK_REQUIRED");if(e.phase==="finalized")return e;const c={...e,phase:"finalized",updatedAt:new Date().toISOString(),receipt:r};return l(a(t,f),`${JSON.stringify(c,null,2)}
6
- `),c})}function Rt(o,r){j(r);const t=g(o);return A(t,()=>{const e=y(t);if(!e)throw new n("PROJECT_IDENTITY_MIGRATION_NOT_PREPARED");if(e.operationId!==r.operationId||e.projectId!==r.projectId)throw new n("PROJECT_IDENTITY_MIGRATION_RECEIPT_CONFLICT");const i=a(t,_);if(!I(i)||p(T(i))!==e.preparedStateDigest)throw new n("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");if(e.receipt&&e.receipt.receiptDigest!==r.receiptDigest)throw new n("PROJECT_IDENTITY_MIGRATION_RECEIPT_CONFLICT");if(e.phase==="remote-acknowledged"||e.phase==="finalized")return e;const c={...e,phase:"remote-acknowledged",updatedAt:new Date().toISOString(),receipt:r};return l(a(t,f),`${JSON.stringify(c,null,2)}
7
- `),c})}function lt(o){const r=g(o);A(r,()=>{const t=y(r);if(!t)return;if(t.phase!=="prepared"||t.receipt)throw new n("PROJECT_IDENTITY_MIGRATION_ROLLBACK_AFTER_ACK_DENIED");const e=a(r,_);if(!I(e)||p(T(e))!==t.preparedStateDigest)throw new n("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");if(t.originalStateExists){if(!t.backupPath)throw new n("PROJECT_IDENTITY_MIGRATION_BACKUP_MISSING");const c=a(r,t.backupPath);if(!I(c))throw new n("PROJECT_IDENTITY_MIGRATION_BACKUP_MISSING");const s=R(c);if(s.isSymbolicLink()||!s.isFile())throw new n("PROJECT_IDENTITY_SYMLINK_REJECTED");const d=T(c,"utf8");if(p(d)!==t.originalStateDigest)throw new n("PROJECT_IDENTITY_MIGRATION_BACKUP_CORRUPT");l(e,d)}else O(e),u(E(e));const i=a(r,f);O(i),u(E(i))})}function ut(o){const r=g(o);return y(r)?.phase??null}function gt(o){const r=g(o);return{state:F(r,a(r,_)),migration:F(r,a(r,f))}}export{n as ProjectIdentityMigrationError,Rt as acknowledgeProjectIdentityMigration,dt as finalizeProjectIdentityMigration,ft as prepareProjectIdentityMigration,gt as projectIdentityMigrationRelativePaths,ut as readProjectIdentityMigrationPhase,lt as rollbackPreparedProjectIdentityMigration};
1
+ import{createHash as tt,randomUUID as M}from"node:crypto";import{existsSync as I,linkSync as et,lstatSync as R,mkdirSync as rt,readFileSync as T,realpathSync as nt,statSync as ot,unlinkSync as w}from"node:fs";import{dirname as f,join as a,relative as V,resolve as it}from"node:path";import{assertProjectIdentityMigrationReceiptV1 as Y,PROJECT_ID_PATTERN as z}from"../../../shared/dist/invocation/index.js";import{atomicReplaceUtf8 as d,durableCreateUtf8 as b,fsyncDirectoryBestEffort as l,recoverAtomicReplaceUtf8 as q}from"../fs/atomic-state-replace.js";const Ot=1,E=a(".neocortex","state.json"),u=a(".neocortex","project-identity-migration.json"),ct=a(".neocortex","project-identity-migration.lock"),at=/^\.neocortex[\\/]state\.json\.project-identity-backup-(?:\d{8}T\d{9}Z-)?mig_[a-f0-9]{32}$/;class o extends Error{code;constructor(r,t=r){super(t),this.code=r,this.name="ProjectIdentityMigrationError"}}const p=n=>tt("sha256").update(n).digest("hex");function st(){return`prj_${M().replaceAll("-","")}`}function H(){return`mig_${M().replaceAll("-","")}`}function Q(n){return n.toISOString().replace(/[-:.]/g,"")}function O(n){const r=it(n);let t;try{t=nt(r)}catch{throw new o("PROJECT_IDENTITY_ROOT_INVALID")}if(!ot(t).isDirectory())throw new o("PROJECT_IDENTITY_ROOT_INVALID");const e=a(t,".neocortex");if(I(e)&&R(e).isSymbolicLink())throw new o("PROJECT_IDENTITY_SYMLINK_REJECTED");const i=a(t,E);if(I(i)){const s=R(i);if(s.isSymbolicLink()||!s.isFile())throw new o("PROJECT_IDENTITY_SYMLINK_REJECTED")}const c=a(t,u);if(I(c)){const s=R(c);if(s.isSymbolicLink()||!s.isFile())throw new o("PROJECT_IDENTITY_SYMLINK_REJECTED")}return t}function S(n,r){const t=a(n,ct);rt(f(t),{recursive:!0,mode:448});const e=()=>{const i=`${t}.${process.pid}.${M()}.owner`;b(i,`${process.pid}
2
+ `);try{et(i,t),l(f(t))}finally{try{w(i)}catch{}l(f(t))}};try{e()}catch(i){if(i.code!=="EEXIST")throw new o("PROJECT_IDENTITY_MIGRATION_LOCKED");const c=R(t);if(c.isSymbolicLink()||!c.isFile())throw new o("PROJECT_IDENTITY_SYMLINK_REJECTED");const s=T(t,"utf8");if(!/^[1-9][0-9]*\n$/.test(s)||s.length>24)throw new o("PROJECT_IDENTITY_MIGRATION_LOCK_CORRUPT");const _=Number(s.trim());let C=!0;try{process.kill(_,0)}catch(g){C=g.code!=="ESRCH"}if(C)throw new o("PROJECT_IDENTITY_MIGRATION_LOCKED");try{w(t),l(f(t)),e()}catch{throw new o("PROJECT_IDENTITY_MIGRATION_LOCKED")}}try{return r()}finally{try{w(t),l(f(t))}catch{}}}function y(n){let r;try{r=JSON.parse(n)}catch{throw new o("PROJECT_IDENTITY_STATE_CORRUPT")}if(!r||typeof r!="object"||Array.isArray(r))throw new o("PROJECT_IDENTITY_STATE_CORRUPT");return r}function A(n){const r=a(n,u);try{q(r),q(a(n,E))}catch{throw new o("PROJECT_IDENTITY_ATOMIC_RECOVERY_FAILED")}if(!I(r))return null;let t;try{t=JSON.parse(T(r,"utf8"))}catch{throw new o("PROJECT_IDENTITY_MIGRATION_STATE_CORRUPT")}if(!t||typeof t!="object"||Array.isArray(t))throw new o("PROJECT_IDENTITY_MIGRATION_STATE_CORRUPT");const e=t;if(e.schemaVersion!==1||typeof e.operationId!="string"||!/^mig_[a-f0-9]{32}$/.test(e.operationId)||typeof e.projectId!="string"||!z.test(e.projectId)||!["prepared","remote-acknowledged","finalized"].includes(String(e.phase))||!Number.isSafeInteger(e.legacyEpicFloor)||(e.legacyEpicFloor??-1)<0||typeof e.originalStateExists!="boolean"||typeof e.originalStateDigest!="string"||!/^[a-f0-9]{64}$/.test(e.originalStateDigest)||typeof e.preparedStateDigest!="string"||!/^[a-f0-9]{64}$/.test(e.preparedStateDigest)||e.backupPath!==null&&(typeof e.backupPath!="string"||!at.test(e.backupPath))||typeof e.createdAt!="string"||typeof e.updatedAt!="string")throw new o("PROJECT_IDENTITY_MIGRATION_STATE_CORRUPT");e.receipt!==void 0&&Y(e.receipt);const i=e.phase==="remote-acknowledged"||e.phase==="finalized";if(e.phase==="prepared"&&e.receipt!==void 0||i&&e.receipt===void 0||e.receipt!==void 0&&(e.receipt.operationId!==e.operationId||e.receipt.projectId!==e.projectId||e.receipt.acceptedLegacyFloor<e.legacyEpicFloor))throw new o("PROJECT_IDENTITY_MIGRATION_STATE_CORRUPT");return e}function It(n){const r=[];n.epics&&typeof n.epics=="object"&&!Array.isArray(n.epics)&&r.push(...Object.keys(n.epics));const t=n.epic_id_ledger;if(t&&typeof t=="object"&&!Array.isArray(t)){const e=t.reserved_ids;Array.isArray(e)&&r.push(...e.filter(i=>typeof i=="string"))}return r.reduce((e,i)=>{const c=i.match(/^P?(\d+)$/i);if(!c)return e;const s=Number(c[1]);return Number.isSafeInteger(s)?Math.max(e,s):e},0)}function N(n){return{version:1,operationId:n.operationId,projectId:n.projectId,localStateDigest:n.preparedStateDigest,legacyEpicFloor:n.legacyEpicFloor,phase:"seed"}}function k(n,r){const t=y(n),e=G(t),i=t[e]??{};return t[e]={...i,project_id:r},t.schema_version===void 0&&(t.schema_version=1),(!t.stories||typeof t.stories!="object"||Array.isArray(t.stories))&&(t.stories={}),(!t.epics||typeof t.epics!="object"||Array.isArray(t.epics))&&(t.epics={}),{raw:`${JSON.stringify(t,null,2)}
3
+ `,state:t}}function G(n){return n.config&&typeof n.config=="object"&&!Array.isArray(n.config)?"config":n.project&&typeof n.project=="object"&&!Array.isArray(n.project)?"project":"config"}function x(n){const r=n[G(n)];return r&&typeof r=="object"&&!Array.isArray(r)?r.project_id:void 0}function W(n,r){if(!I(n))throw new o("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");const t=y(T(n,"utf8"));if(x(t)!==r.projectId)throw new o("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT")}function Tt(n,r,t,e){const i=y(t),c=x(i);if(c===e.projectId)return;if(c!==void 0)throw new o("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");const _=a(n,".neocortex",`state.json.project-identity-reconcile-backup-${Q(new Date)}-${H()}`);b(_,t),d(r,k(t,e.projectId).raw)}function X(){return`${JSON.stringify({schema_version:1,config:{project_name:"neocortex-project",default_branch:"main",language:"pt-BR"},stories:{},epics:{}},null,2)}
4
+ `}function pt(n,r){if(!r.originalStateExists)return;if(!r.backupPath)throw new o("PROJECT_IDENTITY_MIGRATION_BACKUP_MISSING");const t=a(n,r.backupPath);if(!I(t))throw new o("PROJECT_IDENTITY_MIGRATION_BACKUP_MISSING");const e=R(t);if(e.isSymbolicLink()||!e.isFile())throw new o("PROJECT_IDENTITY_SYMLINK_REJECTED");if(p(T(t))!==r.originalStateDigest)throw new o("PROJECT_IDENTITY_MIGRATION_BACKUP_CORRUPT")}function gt(n){const r=O(n);return S(r,()=>{const t=A(r);if(t){const h=a(r,E);pt(r,t);const D=I(h),P=D?T(h,"utf8"):null,v=P===null?null:p(P);if(v===t.preparedStateDigest)return{changed:!1,document:t,request:N(t)};if(t.phase==="finalized"&&P!==null)return x(y(P))===t.projectId?{changed:!1,document:t,request:N(t)}:(Tt(r,h,P,t),{changed:!0,document:t,request:N(t)});if(!(t.phase==="prepared"&&(D&&v===t.originalStateDigest||!D&&!t.originalStateExists)))throw new o("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");const Z=D?T(h,"utf8"):X(),B=k(Z,t.projectId).raw;if(p(B)!==t.preparedStateDigest)throw new o("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");return d(h,B),{changed:!0,document:t,request:N(t)}}const e=a(r,E),i=I(e),c=i?T(e,"utf8"):X(),s=y(c),_=G(s),g=(s[_]??{}).project_id,F=typeof g=="string"&&z.test(g)?g:st(),L=k(c,F),j=L.raw,K=H(),U=new Date,m=i?a(".neocortex",`state.json.project-identity-backup-${Q(U)}-${K}`):null;m&&b(a(r,m),c);const $=U.toISOString(),J={schemaVersion:1,operationId:K,projectId:F,phase:"prepared",legacyEpicFloor:It(L.state),originalStateExists:i,originalStateDigest:p(c),preparedStateDigest:p(j),backupPath:m,createdAt:$,updatedAt:$};return d(a(r,u),`${JSON.stringify(J,null,2)}
5
+ `),d(e,j),{changed:j!==c,document:J,request:N(J)}})}function ht(n,r){Y(r);const t=O(n);return S(t,()=>{const e=A(t);if(!e)throw new o("PROJECT_IDENTITY_MIGRATION_NOT_PREPARED");if(e.operationId!==r.operationId||e.projectId!==r.projectId)throw new o("PROJECT_IDENTITY_MIGRATION_RECEIPT_CONFLICT");const i=a(t,E);if(e.phase==="finalized"){if(!e.receipt||e.receipt.receiptDigest!==r.receiptDigest)throw new o("PROJECT_IDENTITY_MIGRATION_ACK_REQUIRED");return W(i,e),e}if(!I(i)||p(T(i))!==e.preparedStateDigest)throw new o("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");if(e.phase==="prepared"||!e.receipt||e.receipt.receiptDigest!==r.receiptDigest)throw new o("PROJECT_IDENTITY_MIGRATION_ACK_REQUIRED");const c={...e,phase:"finalized",updatedAt:new Date().toISOString(),receipt:r};return d(a(t,u),`${JSON.stringify(c,null,2)}
6
+ `),c})}function Pt(n,r){Y(r);const t=O(n);return S(t,()=>{const e=A(t);if(!e)throw new o("PROJECT_IDENTITY_MIGRATION_NOT_PREPARED");if(e.operationId!==r.operationId||e.projectId!==r.projectId)throw new o("PROJECT_IDENTITY_MIGRATION_RECEIPT_CONFLICT");if(e.receipt&&e.receipt.receiptDigest!==r.receiptDigest)throw new o("PROJECT_IDENTITY_MIGRATION_RECEIPT_CONFLICT");const i=a(t,E);if(e.phase==="finalized")return W(i,e),e;if(!I(i)||p(T(i))!==e.preparedStateDigest)throw new o("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");if(e.phase==="remote-acknowledged")return e;const c={...e,phase:"remote-acknowledged",updatedAt:new Date().toISOString(),receipt:r};return d(a(t,u),`${JSON.stringify(c,null,2)}
7
+ `),c})}function wt(n){const r=O(n);S(r,()=>{const t=A(r);if(!t)return;if(t.phase!=="prepared"||t.receipt)throw new o("PROJECT_IDENTITY_MIGRATION_ROLLBACK_AFTER_ACK_DENIED");const e=a(r,E);if(!I(e)||p(T(e))!==t.preparedStateDigest)throw new o("PROJECT_IDENTITY_MIGRATION_STATE_DRIFT");if(t.originalStateExists){if(!t.backupPath)throw new o("PROJECT_IDENTITY_MIGRATION_BACKUP_MISSING");const c=a(r,t.backupPath);if(!I(c))throw new o("PROJECT_IDENTITY_MIGRATION_BACKUP_MISSING");const s=R(c);if(s.isSymbolicLink()||!s.isFile())throw new o("PROJECT_IDENTITY_SYMLINK_REJECTED");const _=T(c,"utf8");if(p(_)!==t.originalStateDigest)throw new o("PROJECT_IDENTITY_MIGRATION_BACKUP_CORRUPT");d(e,_)}else w(e),l(f(e));const i=a(r,u);w(i),l(f(i))})}function yt(n){const r=O(n);return A(r)?.phase??null}function At(n){const r=O(n);return{state:V(r,a(r,E)),migration:V(r,a(r,u))}}export{o as ProjectIdentityMigrationError,Pt as acknowledgeProjectIdentityMigration,ht as finalizeProjectIdentityMigration,gt as prepareProjectIdentityMigration,At as projectIdentityMigrationRelativePaths,yt as readProjectIdentityMigrationPhase,wt as rollbackPreparedProjectIdentityMigration};
@@ -0,0 +1,14 @@
1
+ import { type StateMigrationPlanV1, type StateMigrationReceiptV1 } from '../../../shared/dist/state/index.js';
2
+ export declare class StateMigrationApplyError extends Error {
3
+ readonly reasonCode: string;
4
+ readonly receipt?: StateMigrationReceiptV1 | undefined;
5
+ constructor(reasonCode: string, message?: string, receipt?: StateMigrationReceiptV1 | undefined);
6
+ }
7
+ /** Fault boundaries used by deterministic failure-injection tests. */
8
+ export interface StateMigrationApplyHooks {
9
+ readonly afterPrepared?: (statePath: string) => void;
10
+ readonly afterReplace?: (statePath: string) => void;
11
+ }
12
+ export declare function previewStateMigration(projectRoot: string): StateMigrationPlanV1 | null;
13
+ /** Apply one shared plan under a client-owned lock, byte CAS and durable backup. */
14
+ export declare function applyStateMigration(projectRoot: string, expectedPlan?: Pick<StateMigrationPlanV1, 'operationId' | 'sourceCanonicalHash' | 'targetCanonicalHash'>, hooks?: StateMigrationApplyHooks): StateMigrationReceiptV1;
@@ -0,0 +1,4 @@
1
+ import{createHash as V,randomUUID as B}from"node:crypto";import{existsSync as C,linkSync as P,lstatSync as E,mkdirSync as O,readFileSync as f,realpathSync as q,statSync as J,unlinkSync as v}from"node:fs";import{dirname as A,join as g,resolve as G}from"node:path";import{assertStateMigrationPlanV1 as K,assertStateMigrationReceiptV1 as X,planStateMigration as F,stateMigrationDigest as z,STATE_MIGRATION_RECEIPT_SCHEMA as Q,StateMigrationHardStopError as U}from"../../../shared/dist/state/index.js";import{atomicReplaceUtf8 as R,durableCreateUtf8 as x,fsyncDirectoryBestEffort as N,recoverAtomicReplaceUtf8 as j}from"../fs/atomic-state-replace.js";const D=g(".neocortex","state.json"),M=g(".neocortex","state-migration.json"),W=g(".neocortex","state-migration.lock");class a extends Error{reasonCode;receipt;constructor(e,n=e,t){super(n),this.reasonCode=e,this.receipt=t,this.name="StateMigrationApplyError"}}const _=i=>V("sha256").update(i).digest("hex"),Y=i=>`${JSON.stringify(i,null,2)}
2
+ `;function L(i){let e;try{e=q(G(i))}catch{throw new a("state_migration_root_invalid")}if(!J(e).isDirectory())throw new a("state_migration_root_invalid");for(const n of[".neocortex",D,M]){const t=g(e,n);if(!C(t))continue;const c=E(t);if(c.isSymbolicLink()||n!==".neocortex"&&!c.isFile()||n===".neocortex"&&!c.isDirectory())throw new a("state_migration_symlink_or_type_rejected")}return e}function T(i){try{const e=JSON.parse(i);if(e&&typeof e=="object"&&!Array.isArray(e))return e}catch{}throw new a("state_migration_state_corrupt")}function Z(i){const e=g(i,W);O(A(e),{recursive:!0,mode:448});const n=B(),t=`${process.pid}:${n}
3
+ `,c=()=>{const s=`${e}.${process.pid}.${B()}.owner`;x(s,t);try{P(s,e)}finally{try{v(s)}catch{}N(A(e))}};try{c()}catch(s){if(s.code!=="EEXIST")throw new a("state_migration_lock_failed");const u=E(e);if(u.isSymbolicLink()||!u.isFile())throw new a("state_migration_lock_corrupt");const d=f(e,"utf8"),o=d.match(/^([1-9][0-9]*):([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12})\n$/i);if(!o||d.length>64)throw new a("state_migration_lock_corrupt");let h=!0;try{process.kill(Number(o[1]),0)}catch(r){h=r.code!=="ESRCH"}if(h)throw new a("state_migration_locked");try{v(e),c()}catch{throw new a("state_migration_locked")}}return()=>{try{if(f(e,"utf8")!==t)return;v(e),N(A(e))}catch{}}}function tt(i){const e=g(i,M);if(j(e),!C(e))return null;let n;try{n=JSON.parse(f(e,"utf8"))}catch{throw new a("state_migration_manifest_corrupt")}if(!n||typeof n!="object"||Array.isArray(n))throw new a("state_migration_manifest_corrupt");const t=n;if(t.schemaVersion!==1||typeof t.operationId!="string"||!/^smig_[a-f0-9]{32}$/.test(t.operationId)||!["prepared","applied","rolled-back"].includes(String(t.phase))||typeof t.sourceCanonicalHash!="string"||!/^[a-f0-9]{64}$/.test(t.sourceCanonicalHash)||typeof t.sourceByteDigest!="string"||!/^[a-f0-9]{64}$/.test(t.sourceByteDigest)||typeof t.targetCanonicalHash!="string"||!/^[a-f0-9]{64}$/.test(t.targetCanonicalHash)||typeof t.targetByteDigest!="string"||!/^[a-f0-9]{64}$/.test(t.targetByteDigest)||!Number.isSafeInteger(t.migratedEpicCount)||(t.migratedEpicCount??-1)<0||!Number.isSafeInteger(t.migratedStoryCount)||(t.migratedStoryCount??-1)<0||!Number.isSafeInteger(t.preservedUnknownFieldCount)||(t.preservedUnknownFieldCount??-1)<0||typeof t.backupPath!="string"||t.backupPath!==g(".neocortex",`state.json.migration-backup-${t.operationId}`))throw new a("state_migration_manifest_corrupt");return t}function b(i,e){R(g(i,M),`${JSON.stringify(e,null,2)}
4
+ `)}function k(i,e,n,t,c,s,u,d,o,h,r,l){const m={schemaVersion:Q,operationId:e,outcome:i,sourceBytesHash:n,targetBytesHash:t,sourceCanonicalHash:c,targetCanonicalHash:s,backupHash:u,rollbackStatus:d,migratedEpicCount:o,migratedStoryCount:h,preservedUnknownFieldCount:r,reasonCodes:l,publicSafe:!0};return X(m),m}function it(i){const e=L(i),n=g(e,D);if(!C(n))throw new a("state_migration_state_missing");let t;try{t=F(T(f(n,"utf8")))}catch(c){throw c instanceof U?new a(c.reasonCode,c.message):c}return t.kind==="migrate"?t.plan:null}function st(i,e,n={}){const t=L(i),c=Z(t);try{const s=g(t,D);try{j(s)}catch{throw new a("state_migration_atomic_recovery_failed")}if(!C(s))throw new a("state_migration_state_missing");const u=f(s,"utf8");let d;try{d=F(T(u))}catch(p){throw p instanceof U?new a(p.reasonCode,p.message):p}const o=tt(t),h=_(u);if(d.kind==="unchanged"){if(e&&d.sourceCanonicalHash!==e.targetCanonicalHash)throw new a("state_migration_expected_plan_conflict");if(o&&o.targetCanonicalHash===d.sourceCanonicalHash){if(o.targetByteDigest!==h)throw new a("state_migration_state_drift");if(o.phase==="prepared"&&b(t,{...o,phase:"applied"}),o.phase==="rolled-back")throw new a("state_migration_state_drift");return k("already-applied",o.operationId,o.sourceByteDigest,o.targetByteDigest,o.sourceCanonicalHash,o.targetCanonicalHash,o.sourceByteDigest,"not-required",o.migratedEpicCount,o.migratedStoryCount,o.preservedUnknownFieldCount,["migration_replay_verified"])}if(o)throw new a("state_migration_state_drift");return k("already-applied",e?.operationId??"smig_00000000000000000000000000000000",h,h,d.sourceCanonicalHash,d.sourceCanonicalHash,null,"not-required",0,0,0,["canonical_state_unchanged"])}const r=d.plan;if(K(r),e&&(e.operationId!==r.operationId||e.sourceCanonicalHash!==r.sourceCanonicalHash||e.targetCanonicalHash!==r.targetCanonicalHash))throw new a("state_migration_expected_plan_conflict");if(o&&o.operationId!==r.operationId)throw new a("state_migration_operation_conflict");const l=h,m=Y(r.targetState),w=_(m),$=g(".neocortex",`state.json.migration-backup-${r.operationId}`),y=g(t,$);if(C(y)){const p=E(y);if(p.isSymbolicLink()||!p.isFile()||_(f(y))!==l)throw new a("state_migration_backup_conflict")}else x(y,u);const H={schemaVersion:1,operationId:r.operationId,phase:"prepared",sourceCanonicalHash:r.sourceCanonicalHash,sourceByteDigest:l,targetCanonicalHash:r.targetCanonicalHash,targetByteDigest:w,migratedEpicCount:r.migratedEpicIds.length,migratedStoryCount:r.migratedStoryIds.length,preservedUnknownFieldCount:r.preservedUnknownFieldCount,backupPath:$};if(b(t,H),n.afterPrepared?.(s),_(f(s))!==l)throw new a("state_migration_source_cas_conflict");try{R(s,m),n.afterReplace?.(s);const p=f(s,"utf8"),I=T(p);if(_(p)!==w||z(I)!==r.targetCanonicalHash)throw new Error("readback-digest-mismatch");b(t,{...H,phase:"applied"})}catch(p){try{const S=f(y,"utf8");if(_(S)!==l)throw new Error("rollback-backup-digest-mismatch");if(R(s,S),_(f(s))!==l)throw new Error("rollback-digest-mismatch");b(t,{...H,phase:"rolled-back"})}catch{const S=k("blocked",r.operationId,l,w,r.sourceCanonicalHash,r.targetCanonicalHash,l,"unverified",r.migratedEpicIds.length,r.migratedStoryIds.length,r.preservedUnknownFieldCount,["apply_failed","rollback_unverified"]);throw new a("state_migration_rollback_failed",String(p),S)}const I=k("blocked",r.operationId,l,w,r.sourceCanonicalHash,r.targetCanonicalHash,l,"restored",r.migratedEpicIds.length,r.migratedStoryIds.length,r.preservedUnknownFieldCount,["apply_failed","rollback_verified"]);throw new a("state_migration_apply_rolled_back",String(p),I)}return k("applied",r.operationId,l,w,r.sourceCanonicalHash,r.targetCanonicalHash,l,"not-required",r.migratedEpicIds.length,r.migratedStoryIds.length,r.preservedUnknownFieldCount,["lock_acquired","source_cas_verified","backup_verified","atomic_replace_verified"])}finally{c()}}export{a as StateMigrationApplyError,st as applyStateMigration,it as previewStateMigration};
@@ -14,6 +14,8 @@ export interface GitResourceOwnership {
14
14
  readonly prNumbers: readonly number[];
15
15
  }
16
16
  export declare const GIT_INVENTORY_REF_LIMIT = 2048;
17
+ /** Maximum PRs related to managed branches, independent of repository history size. */
18
+ export declare const GIT_INVENTORY_PR_LIMIT = 1000;
17
19
  export declare function collectGitResourceOwnership(state: {
18
20
  readonly epics?: Record<string, Record<string, unknown>>;
19
21
  readonly stories?: Record<string, Record<string, unknown>>;