@ornexus/neocortex 4.60.72 → 4.60.74

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 (46) hide show
  1. package/dist/release-source.json +1 -1
  2. package/dist/sbom.cdx.json +1217 -1211
  3. package/install.ps1 +1 -1
  4. package/install.sh +1 -1
  5. package/package.json +2 -2
  6. package/packages/client/dist/commands/invoke.js +66 -66
  7. package/packages/client/dist/continuity/sqlite-store.d.ts +22 -1
  8. package/packages/client/dist/continuity/sqlite-store.js +60 -60
  9. package/packages/client/dist/git/epic-operational-state.d.ts +198 -0
  10. package/packages/client/dist/git/epic-operational-state.js +2 -0
  11. package/packages/client/dist/git/git-lifecycle-store.d.ts +32 -1
  12. package/packages/client/dist/git/git-lifecycle-store.js +9 -8
  13. package/packages/client/dist/migrations/epic-lifecycle-backfill.d.ts +97 -0
  14. package/packages/client/dist/migrations/epic-lifecycle-backfill.js +3 -0
  15. package/packages/client/dist/migrations/state-json.d.ts +22 -0
  16. package/packages/client/dist/migrations/state-json.js +4 -4
  17. package/packages/client/dist/runner/headless/epic-merge-candidate-qa.d.ts +1 -1
  18. package/packages/client/dist/runner/headless/epic-merge-candidate-qa.js +2 -2
  19. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.d.ts +2 -0
  20. package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.js +10 -8
  21. package/packages/client/dist/runner/headless/epic-terminal-git-runner.d.ts +18 -2
  22. package/packages/client/dist/runner/headless/epic-terminal-git-runner.js +2 -2
  23. package/packages/client/dist/runner/headless/run-yolo.js +1 -1
  24. package/packages/client/dist/runner/headless/run-yoloop.d.ts +1 -0
  25. package/packages/client/dist/runner/headless/run-yoloop.js +2 -2
  26. package/packages/client/dist/runner/headless/types.js +2 -2
  27. package/packages/client/dist/state/project-state-snapshot.d.ts +8 -0
  28. package/packages/client/dist/state/project-state-snapshot.js +1 -1
  29. package/packages/client/dist/yolo/spec-envelope-collector.js +3 -3
  30. package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +65 -1
  31. package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +8 -0
  32. package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -1
  33. package/packages/shared/dist/yolo/change-evidence.js +1 -1
  34. package/packages/shared/dist/yolo/spec-envelope.js +3 -6
  35. package/packages/shared/dist/yoloop/epic-terminal-git.js +144 -2
  36. package/targets-stubs/antigravity/gemini.md +1 -1
  37. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  38. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  39. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  40. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  41. package/targets-stubs/claude-code/neocortex.md +2 -2
  42. package/targets-stubs/codex/AGENTS.md +1 -1
  43. package/targets-stubs/cursor/agent.md +2 -2
  44. package/targets-stubs/gemini-cli/agent.md +2 -2
  45. package/targets-stubs/opencode/neocortex-root.md +1 -1
  46. package/targets-stubs/vscode/neocortex.agent.md +2 -2
@@ -0,0 +1,198 @@
1
+ import type { YoloopPersistedCounters, YoloopPersistedLock, YoloopPersistenceCapability, YoloopStateOperation } from '../yoloop/shared-yoloop-types.js';
2
+ import { type GitLifecycleRuntimeDocument } from './git-lifecycle-store.js';
3
+ export declare const EPIC_OPERATIONAL_SOURCE_LIMIT_BYTES: number;
4
+ export declare const EPIC_OPERATIONAL_PAYLOAD_LIMIT_BYTES: number;
5
+ export declare const EPIC_OPERATIONAL_RECEIPT_CAP = 64;
6
+ export declare const EPIC_OPERATIONAL_IDENTITY_CAP = 2048;
7
+ export type EpicOperationalJournalKind = 'backfill' | 'cross-epic-reconcile' | 'rollback';
8
+ export type EpicOperationalJournalPhase = 'prepared' | 'authority-applied' | 'projections-applied' | 'committed' | 'aborted-before-authority';
9
+ export interface EpicOperationalIdentityV1 {
10
+ readonly schemaVersion: 'EpicOperationalIdentity/1.0';
11
+ readonly epicId: string;
12
+ readonly executionBranch: string;
13
+ readonly graphRevision: string;
14
+ readonly originBindingDigest: string;
15
+ readonly repositoryFingerprint: string;
16
+ readonly identityHash: string;
17
+ }
18
+ export interface CommonYoloopAuthorityV1 {
19
+ readonly schemaVersion: 'CommonYoloopAuthority/1.0';
20
+ readonly lock: YoloopPersistedLock | null;
21
+ readonly state: YoloopPersistedCounters;
22
+ readonly capabilities: readonly YoloopPersistenceCapability[];
23
+ }
24
+ export interface EpicOperationalProjectionBindingV1 {
25
+ readonly status: 'bound' | 'unbound' | 'unavailable';
26
+ readonly sourceDigest: string | null;
27
+ readonly authorityRevision: number;
28
+ readonly reasonCodes: readonly string[];
29
+ }
30
+ export interface EpicOperationalProjectionBindingsV1 {
31
+ readonly schemaVersion: 'EpicOperationalProjectionBindings/1.0';
32
+ readonly trackedState: EpicOperationalProjectionBindingV1;
33
+ readonly sqlite: EpicOperationalProjectionBindingV1;
34
+ }
35
+ export interface EpicOperationalJournalV1 {
36
+ readonly schemaVersion: 'EpicOperationalJournal/1.0';
37
+ readonly kind: EpicOperationalJournalKind;
38
+ readonly operationId: string;
39
+ readonly idempotencyKey: string;
40
+ readonly payloadHash: string;
41
+ readonly identityHash: string;
42
+ readonly expectedRevision: number;
43
+ readonly expectedWriterEpoch: number;
44
+ readonly preimageDigest: string;
45
+ readonly backupManifestRef: string;
46
+ readonly phase: EpicOperationalJournalPhase;
47
+ readonly projectionStatuses: {
48
+ readonly trackedState: 'pending' | 'applied' | 'not-applicable';
49
+ readonly sqlite: 'pending' | 'applied' | 'unavailable' | 'not-applicable';
50
+ };
51
+ readonly reasonCodes: readonly string[];
52
+ }
53
+ export interface YoloopCrossEpicReconciliationReceiptV1 {
54
+ readonly schemaVersion: 'YoloopCrossEpicReconciliationReceipt/1.0';
55
+ readonly operationId: string;
56
+ readonly idempotencyKey: string;
57
+ readonly payloadHash: string;
58
+ readonly sourceEpicId: string;
59
+ readonly sourceGraphRevision: string;
60
+ readonly targetEpicId: string;
61
+ readonly targetGraphRevision: string;
62
+ readonly runId: string;
63
+ readonly previousSessionHash: string;
64
+ readonly nextSessionHash: string;
65
+ readonly retiredAuthorityHash: string;
66
+ readonly retiredAuthorityCount: 0 | 1;
67
+ readonly outcome: 'cross-epic-reconciled';
68
+ readonly publicSafe: true;
69
+ }
70
+ export interface EpicLifecycleBackfillReceiptV1 {
71
+ readonly schemaVersion: 'EpicLifecycleBackfillReceipt/1.0';
72
+ readonly operationId: string;
73
+ readonly idempotencyKey: string;
74
+ readonly payloadHash: string;
75
+ readonly planDigest: string;
76
+ readonly sourceInventoryDigest: string;
77
+ readonly preimageDigest: string;
78
+ readonly postimageDigest: string;
79
+ readonly authorityPostimageDigest: string;
80
+ readonly backupManifestDigest: string;
81
+ readonly identityHash: string;
82
+ readonly appliedRevision: number;
83
+ readonly writerEpoch: number;
84
+ readonly stateMigrationOperationId: string | null;
85
+ readonly outcome: 'applied' | 'already-applied';
86
+ readonly reasonCodes: readonly string[];
87
+ readonly publicSafe: true;
88
+ }
89
+ export interface EpicOperationalRollbackReceiptV1 {
90
+ readonly schemaVersion: 'EpicOperationalRollbackReceipt/1.0';
91
+ readonly operationId: string;
92
+ readonly targetOperationId: string;
93
+ readonly expectedPostimageDigest: string;
94
+ readonly restoredPreimageDigest: string;
95
+ readonly reasonCodes: readonly string[];
96
+ readonly publicSafe: true;
97
+ }
98
+ export interface EpicOperationalStateV1 {
99
+ readonly schemaVersion: 'EpicOperationalState/1.0';
100
+ readonly repositoryFingerprint: string;
101
+ readonly writerEpoch: number;
102
+ readonly capabilities: readonly ('epic-operational-state-v1' | 'epic-lifecycle-backfill-v1')[];
103
+ readonly identities: Readonly<Record<string, EpicOperationalIdentityV1>>;
104
+ readonly yoloop: CommonYoloopAuthorityV1;
105
+ readonly projectionBindings: EpicOperationalProjectionBindingsV1;
106
+ readonly activeJournal: EpicOperationalJournalV1 | null;
107
+ readonly backfillReceipts: readonly EpicLifecycleBackfillReceiptV1[];
108
+ readonly reconciliationReceipts: readonly YoloopCrossEpicReconciliationReceiptV1[];
109
+ readonly rollbackReceipts: readonly EpicOperationalRollbackReceiptV1[];
110
+ }
111
+ export interface EpicOperationalPublicProjectionV1 {
112
+ readonly schemaVersion: 'EpicOperationalPublicProjection/1.0';
113
+ readonly repositoryFingerprint: string;
114
+ readonly identityHash: string;
115
+ readonly epicId: string;
116
+ readonly executionBranch: string;
117
+ readonly graphRevision: string;
118
+ readonly storeRevision: number;
119
+ readonly writerEpoch: number;
120
+ readonly runId: string | null;
121
+ readonly runStatus: string | null;
122
+ readonly runRevision: number | null;
123
+ readonly snapshotHash: string | null;
124
+ readonly continuationSessionHash: string;
125
+ readonly pendingAuthorityHash: string;
126
+ readonly pendingAuthorityCount: number;
127
+ readonly lockActive: boolean;
128
+ readonly currentSessionActive: boolean;
129
+ readonly journalActive: boolean;
130
+ readonly reasonCodes: readonly string[];
131
+ readonly publicSafe: true;
132
+ }
133
+ export interface YoloopCrossEpicReconciliationEvidenceV1 extends Omit<EpicOperationalPublicProjectionV1, 'schemaVersion'> {
134
+ readonly schemaVersion: 'YoloopCrossEpicReconciliationEvidence/1.0';
135
+ readonly sourceEpicId: string;
136
+ readonly sourceGraphRevision: string;
137
+ readonly targetEpicId: string;
138
+ readonly targetGraphRevision: string;
139
+ readonly decision: 'eligible';
140
+ }
141
+ export type CrossEpicReconciliationDecisionV1 = {
142
+ readonly kind: 'eligible';
143
+ readonly evidence: YoloopCrossEpicReconciliationEvidenceV1;
144
+ } | {
145
+ readonly kind: 'blocked';
146
+ readonly reasonCodes: readonly string[];
147
+ } | {
148
+ readonly kind: 'not-applicable';
149
+ readonly reasonCodes: readonly string[];
150
+ };
151
+ export interface EpicOperationalMutationContext {
152
+ readonly identityHash: string;
153
+ readonly expectedRevision: number;
154
+ readonly expectedWriterEpoch: number;
155
+ }
156
+ export declare function epicOperationalCanonicalJson(value: unknown): string;
157
+ export declare function epicOperationalHash(domain: string, value: unknown): string;
158
+ export declare function deriveEpicOperationalRepositoryFingerprint(projectRoot: string): string;
159
+ export declare function createEpicOperationalIdentity(projectRoot: string, input: {
160
+ readonly epicId: string;
161
+ readonly executionBranch: string;
162
+ readonly graphRevision: string;
163
+ readonly originBindingDigest: string;
164
+ }): EpicOperationalIdentityV1;
165
+ export declare function createInitialEpicOperationalState(input: {
166
+ readonly identity: EpicOperationalIdentityV1;
167
+ readonly yoloop: Omit<CommonYoloopAuthorityV1, 'schemaVersion'>;
168
+ readonly trackedStateDigest: string;
169
+ readonly sqliteStatus?: 'unbound' | 'unavailable';
170
+ readonly sqliteReasonCodes?: readonly string[];
171
+ }): EpicOperationalStateV1;
172
+ export declare function assertEpicOperationalState(value: unknown): asserts value is EpicOperationalStateV1;
173
+ export declare function readEpicOperationalState(projectRoot: string, context?: Partial<EpicOperationalMutationContext>): {
174
+ readonly document: GitLifecycleRuntimeDocument;
175
+ readonly operational: EpicOperationalStateV1;
176
+ };
177
+ export declare function mutateEpicOperationalState<T>(projectRoot: string, context: EpicOperationalMutationContext, mutate: (state: EpicOperationalStateV1, document: GitLifecycleRuntimeDocument) => T): Promise<{
178
+ readonly document: GitLifecycleRuntimeDocument;
179
+ readonly value: T;
180
+ }>;
181
+ export declare function projectEpicOperationalState(document: GitLifecycleRuntimeDocument, identityHash: string): EpicOperationalPublicProjectionV1;
182
+ export declare function classifyCrossEpicContinuationReconciliation(input: {
183
+ readonly document: GitLifecycleRuntimeDocument;
184
+ readonly targetIdentityHash: string;
185
+ readonly targetEpicId: string;
186
+ readonly targetGraphRevision: string;
187
+ readonly legacyActivity: 'inactive' | 'active' | 'unknown';
188
+ }): CrossEpicReconciliationDecisionV1;
189
+ export declare function buildCrossEpicContinuationPayloadHash(payload: Omit<Extract<YoloopStateOperation, {
190
+ readonly type: 'reconcile_cross_epic_continuation';
191
+ }>, 'type' | 'payloadHash' | 'receipt'>): string;
192
+ export declare function applyCrossEpicContinuationReconciliation(projectRoot: string, operation: Extract<YoloopStateOperation, {
193
+ readonly type: 'reconcile_cross_epic_continuation';
194
+ }>): Promise<{
195
+ readonly applied: boolean;
196
+ readonly replay: boolean;
197
+ readonly receipt: YoloopCrossEpicReconciliationReceiptV1;
198
+ }>;
@@ -0,0 +1,2 @@
1
+ import{execFileSync as O}from"node:child_process";import{createHash as S}from"node:crypto";import{existsSync as B,fsyncSync as V,lstatSync as w,mkdirSync as Y,openSync as _,closeSync as J,readFileSync as N,realpathSync as E,writeFileSync as q}from"node:fs";import{isAbsolute as x,join as R,relative as Z,resolve as y}from"node:path";import{GIT_LIFECYCLE_RUNTIME_DIRECTORY as F,mutateGitLifecycleRuntime as U,readGitLifecycleRuntime as Q,readGitLifecycleRuntimeSync as X}from"./git-lifecycle-store.js";const ee=4*1024*1024,ie=1024*1024,C=64,te=2048,oe=/^[a-f0-9]{64}$/,A=/^P[1-9][0-9]*(?:\.[0-9]+)*$/,ne=/^[A-Za-z0-9._:/#\-[\]]{1,240}$/;function m(i){return i===null||typeof i!="object"?JSON.stringify(i):Array.isArray(i)?`[${i.map(m).join(",")}]`:`{${Object.entries(i).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${m(t)}`).join(",")}}`}function g(i,e){return S("sha256").update(`${i}\0${m(e)}`).digest("hex")}function re(i){const e=E(y(i)),t=O("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim(),o=x(t)?y(t):y(e,t),n=E(o);if(n!==o)throw new Error("epic-operational-path-unsafe");const r=w(n);if(!r.isDirectory()||r.isSymbolicLink())throw new Error("epic-operational-path-unsafe");return g("p224-epic-operational-repository-v1",{commonDir:n,dev:Number(r.dev),ino:Number(r.ino)})}function we(i,e){const t=re(i),o={schemaVersion:"EpicOperationalIdentity/1.0",epicId:e.epicId,executionBranch:e.executionBranch,graphRevision:e.graphRevision,originBindingDigest:e.originBindingDigest,repositoryFingerprint:t},n=Object.freeze({...o,identityHash:g("p224-epic-operational-identity-v1",o)});return W(n),n}function xe(i){const e={schemaVersion:"EpicOperationalState/1.0",repositoryFingerprint:i.identity.repositoryFingerprint,writerEpoch:1,capabilities:["epic-operational-state-v1","epic-lifecycle-backfill-v1"],identities:{[i.identity.identityHash]:i.identity},yoloop:{schemaVersion:"CommonYoloopAuthority/1.0",...i.yoloop},projectionBindings:{schemaVersion:"EpicOperationalProjectionBindings/1.0",trackedState:{status:"bound",sourceDigest:i.trackedStateDigest,authorityRevision:0,reasonCodes:["epic-operational-tracked-state-bound"]},sqlite:{status:i.sqliteStatus??"unbound",sourceDigest:null,authorityRevision:0,reasonCodes:i.sqliteReasonCodes??["epic-operational-projection-unbound"]}},activeJournal:null,backfillReceipts:[],reconciliationReceipts:[],rollbackReceipts:[]};return I(e),Object.freeze(e)}function I(i){const e=p(i);if(!e)throw new Error("epic-operational-store-corrupt");z(e,["schemaVersion","repositoryFingerprint","writerEpoch","capabilities","identities","yoloop","projectionBindings","activeJournal","backfillReceipts","reconciliationReceipts","rollbackReceipts"]);const t=p(e.identities),o=p(e.yoloop),n=p(e.projectionBindings);if(e.schemaVersion!=="EpicOperationalState/1.0"||!l(e.repositoryFingerprint)||!Number.isSafeInteger(e.writerEpoch)||Number(e.writerEpoch)<1||!Array.isArray(e.capabilities)||!ge(e.capabilities,["epic-operational-state-v1","epic-lifecycle-backfill-v1"])||!t||Object.keys(t).length>te||!o||!v(o,["schemaVersion","lock","state","capabilities"])||o.schemaVersion!=="CommonYoloopAuthority/1.0"||!p(o.state)||!(o.lock===null||p(o.lock))||!Array.isArray(o.capabilities)||o.capabilities.length>16||new Set(o.capabilities).size!==o.capabilities.length||o.capabilities.some(r=>!["rollover-session-v1","successor-transition-v1","continuation-replan-v1","cross-epic-continuation-reconcile-v1"].includes(String(r)))||!n||!v(n,["schemaVersion","trackedState","sqlite"])||n.schemaVersion!=="EpicOperationalProjectionBindings/1.0"||!T(n.trackedState)||!T(n.sqlite)||!(e.activeJournal===null||ue(e.activeJournal))||!P(e.backfillReceipts,"EpicLifecycleBackfillReceipt/1.0")||!P(e.reconciliationReceipts,"YoloopCrossEpicReconciliationReceipt/1.0")||!P(e.rollbackReceipts,"EpicOperationalRollbackReceipt/1.0"))throw new Error("epic-operational-store-corrupt");for(const[r,c]of Object.entries(t))if(W(c),r!==c.identityHash||c.repositoryFingerprint!==e.repositoryFingerprint)throw new Error("epic-operational-identity-mismatch");if(Buffer.byteLength(m(e),"utf8")>ee)throw new Error("epic-operational-source-oversized")}function Ce(i,e){const t=X(i,{required:!0});if(t.schemaVersion!==2||t.operational===void 0)throw new Error("epic-operational-store-missing");return I(t.operational),K(t,t.operational,e),{document:t,operational:t.operational}}async function k(i,e,t){try{return await U(i,o=>{if(o.schemaVersion!==2||o.operational===void 0)throw new Error("epic-operational-store-missing");return I(o.operational),K(o,o.operational,e),t(o.operational,o)},{expectedRevision:e.expectedRevision})}catch(o){throw o instanceof Error&&o.message==="git-lifecycle-runtime-revision-conflict"?new Error("epic-operational-revision-conflict"):o}}function se(i,e){if(i.schemaVersion!==2||i.operational===void 0)throw new Error("epic-operational-store-missing");I(i.operational);const t=i.operational,o=t.identities[e];if(!o)throw new Error("epic-operational-identity-mismatch");const n=p(t.yoloop.state.runControl),r=t.yoloop.state.pendingContinuationAuthorities??[];return Object.freeze({schemaVersion:"EpicOperationalPublicProjection/1.0",repositoryFingerprint:t.repositoryFingerprint,identityHash:e,epicId:o.epicId,executionBranch:o.executionBranch,graphRevision:o.graphRevision,storeRevision:i.revision,writerEpoch:t.writerEpoch,runId:typeof n?.runId=="string"?n.runId:null,runStatus:typeof n?.status=="string"?n.status:null,runRevision:Number.isSafeInteger(n?.revision)?Number(n.revision):null,snapshotHash:n?.latestSnapshotHash===null||l(n?.latestSnapshotHash)?n?.latestSnapshotHash:null,continuationSessionHash:g("p224-common-continuation-session-v1",t.yoloop.state.continuationSession??null),pendingAuthorityHash:g("p224-common-pending-authorities-v1",r),pendingAuthorityCount:r.length,lockActive:t.yoloop.lock!==null,currentSessionActive:t.yoloop.state.currentSession!==null,journalActive:t.activeJournal!==null,reasonCodes:["epic-operational-projection-bounded"],publicSafe:!0})}function ke(i){let e;try{e=se(i.document,i.targetIdentityHash)}catch(d){return{kind:"blocked",reasonCodes:[Ee(d)]}}const t=i.document.operational,o=t.identities[i.targetIdentityHash],n=p(t.yoloop.state.continuationSession);if(!n)return{kind:"not-applicable",reasonCodes:["yoloop-cross-epic-session-missing"]};const r=typeof n.epicId=="string"?n.epicId:"",c=typeof n.graphFingerprint=="string"?n.graphFingerprint:"";if(r===i.targetEpicId&&c===i.targetGraphRevision)return{kind:"not-applicable",reasonCodes:["yoloop-cross-epic-target-unchanged"]};const s=[],u=p(t.yoloop.state.runControl),a=t.yoloop.state.pendingContinuationAuthorities??[];if((!o||o.epicId!==i.targetEpicId||o.graphRevision!==i.targetGraphRevision)&&s.push("epic-operational-identity-mismatch"),t.yoloop.capabilities.includes("cross-epic-continuation-reconcile-v1")||s.push("yoloop-cross-epic-capability-missing"),(!u||!["success","exhausted"].includes(String(u.status)))&&s.push("yoloop-cross-epic-predecessor-active"),(t.yoloop.lock!==null||t.yoloop.state.currentSession!==null||i.legacyActivity!=="inactive")&&s.push("yoloop-cross-epic-lock-active"),t.activeJournal!==null&&s.push("epic-operational-journal-conflict"),t.reconciliationReceipts.length>=C&&s.push("yoloop-cross-epic-receipt-capacity"),a.length>1&&s.push("yoloop-cross-epic-authority-ambiguous"),a.length===1){const d=p(a[0]),h=p(d?.certificate);!d||!h||d.sessionId!==n.sessionId||h.sessionId!==n.sessionId?s.push("yoloop-cross-epic-authority-ambiguous"):d.delegated!==!1&&s.push("yoloop-cross-epic-authority-delegated")}return(!l(c)||!l(n.sessionId)||e.runId===null||e.runRevision===null)&&s.push("yoloop-cross-epic-state-corrupt"),s.length>0?{kind:"blocked",reasonCodes:[...new Set(s)]}:{kind:"eligible",evidence:Object.freeze({...e,schemaVersion:"YoloopCrossEpicReconciliationEvidence/1.0",sourceEpicId:r,sourceGraphRevision:c,targetEpicId:i.targetEpicId,targetGraphRevision:i.targetGraphRevision,decision:"eligible"})}}function ce(i){return g("p224-cross-epic-continuation-reconcile-v1",i)}async function He(i,e){pe(e);let t=await Q(i,{required:!0});if(t.schemaVersion!==2||t.operational===void 0)throw new Error("epic-operational-store-missing");I(t.operational);let o=t.operational;const n=L(e),r=o.reconciliationReceipts.find(a=>a.operationId===e.operationId||a.idempotencyKey===e.idempotencyKey);if(r){if(m(r)!==m(n)||g("p224-common-continuation-session-v1",o.yoloop.state.continuationSession??null)!==e.nextSessionHash||(o.yoloop.state.pendingContinuationAuthorities?.length??0)!==0)throw new Error("yoloop-cross-epic-replay-conflict");return{applied:!1,replay:!0,receipt:r}}if(o.reconciliationReceipts.length>=C)throw new Error("yoloop-cross-epic-receipt-capacity");const c=o.activeJournal;if(c&&(c.operationId!==e.operationId||c.idempotencyKey!==e.idempotencyKey||c.payloadHash!==e.payloadHash))throw new Error("epic-operational-journal-conflict");c||G(t,o,e);const s=c?de(i,c.backupManifestRef,c.preimageDigest):le(i,e.operationId,o);if(!c){const a=ae(e,s.digest,s.ref,"prepared");t=(await k(i,{identityHash:e.expectedIdentityHash,expectedRevision:t.revision,expectedWriterEpoch:e.expectedWriterEpoch},h=>{h.activeJournal=a})).document,o=t.operational}if(o.activeJournal?.phase==="prepared"){G(t,o,e,!0);const a={...o.yoloop.state,continuationSession:e.nextSession,pendingContinuationAuthorities:[]};t=(await k(i,{identityHash:e.expectedIdentityHash,expectedRevision:t.revision,expectedWriterEpoch:e.expectedWriterEpoch},h=>{h.yoloop={...h.yoloop,state:a},h.activeJournal={...h.activeJournal,phase:"authority-applied"}})).document,o=t.operational}if(o.activeJournal?.phase==="authority-applied"&&(t=(await k(i,{identityHash:e.expectedIdentityHash,expectedRevision:t.revision,expectedWriterEpoch:e.expectedWriterEpoch},d=>{d.activeJournal={...d.activeJournal,phase:"projections-applied",projectionStatuses:{trackedState:"not-applicable",sqlite:"not-applicable"}}})).document,o=t.operational),o.activeJournal?.phase!=="projections-applied")throw new Error("epic-operational-journal-corrupt");const u=await k(i,{identityHash:e.expectedIdentityHash,expectedRevision:t.revision,expectedWriterEpoch:e.expectedWriterEpoch},a=>{if(a.reconciliationReceipts.length>=C)throw new Error("yoloop-cross-epic-receipt-capacity");a.reconciliationReceipts=[...a.reconciliationReceipts,n],a.activeJournal=null});return I(u.document.operational),{applied:!0,replay:!1,receipt:n}}function G(i,e,t,o=!1){const n=p(e.yoloop.state.runControl),r=e.yoloop.state.pendingContinuationAuthorities??[],c=e.identities[t.expectedIdentityHash],s=p(e.yoloop.state.continuationSession);if(i.revision!==t.expectedCommonRevision&&!o||e.writerEpoch!==t.expectedWriterEpoch||!c||c.epicId!==t.targetEpicId||c.graphRevision!==t.targetGraphRevision||!e.yoloop.capabilities.includes("cross-epic-continuation-reconcile-v1")||e.yoloop.lock!==null||e.yoloop.state.currentSession!==null||!n||n.runId!==t.expectedRunId||n.status!==t.expectedRunStatus||n.revision!==t.expectedRunRevision||(n.latestSnapshotHash??null)!==t.expectedSnapshotHash||!s||s.epicId!==t.sourceEpicId||s.graphFingerprint!==t.sourceGraphRevision||s.sessionId!==t.sourceSessionId||g("p224-common-continuation-session-v1",e.yoloop.state.continuationSession??null)!==t.expectedSessionHash||g("p224-common-pending-authorities-v1",r)!==t.expectedPendingHash||r.length!==t.expectedPendingCount)throw new Error("yoloop-cross-epic-revision-conflict");if(r.length>1||r.some(u=>{const a=p(u),d=p(a?.certificate);return!a||a.delegated!==!1||!d||a.sessionId!==t.sourceSessionId||d.sessionId!==t.sourceSessionId}))throw new Error("yoloop-cross-epic-authority-ambiguous")}function L(i){return Object.freeze({schemaVersion:"YoloopCrossEpicReconciliationReceipt/1.0",operationId:i.operationId,idempotencyKey:i.idempotencyKey,payloadHash:i.payloadHash,sourceEpicId:i.sourceEpicId,sourceGraphRevision:i.sourceGraphRevision,targetEpicId:i.targetEpicId,targetGraphRevision:i.targetGraphRevision,runId:i.expectedRunId,previousSessionHash:i.expectedSessionHash,nextSessionHash:i.nextSessionHash,retiredAuthorityHash:i.expectedPendingHash,retiredAuthorityCount:i.expectedPendingCount,outcome:"cross-epic-reconciled",publicSafe:!0})}function ae(i,e,t,o){return{schemaVersion:"EpicOperationalJournal/1.0",kind:"cross-epic-reconcile",operationId:i.operationId,idempotencyKey:i.idempotencyKey,payloadHash:i.payloadHash,identityHash:i.expectedIdentityHash,expectedRevision:i.expectedCommonRevision,expectedWriterEpoch:i.expectedWriterEpoch,preimageDigest:e,backupManifestRef:t,phase:o,projectionStatuses:{trackedState:"not-applicable",sqlite:"not-applicable"},reasonCodes:["epic-operational-backup-verified"]}}function pe(i){const{type:e,payloadHash:t,receipt:o,...n}=i,r=p(i.nextSession);if(!f(i.operationId)||!f(i.idempotencyKey)||ce(n)!==i.payloadHash||Buffer.byteLength(m(n),"utf8")>ie||i.expectedPendingCount<0||i.expectedPendingCount>1||!r||r.epicId!==i.targetEpicId||r.graphFingerprint!==i.targetGraphRevision||!l(r.sessionId)||i.nextSessionHash!==g("p224-common-continuation-session-v1",i.nextSession)||m(i.receipt)!==m(L(i)))throw new Error("yoloop-cross-epic-replay-conflict")}function le(i,e,t){if(!f(e))throw new Error("epic-operational-backup-failed");const o=E(y(i)),n=O("git",["rev-parse","--git-common-dir"],{cwd:o,encoding:"utf8"}).trim(),r=E(x(n)?y(n):y(o,n)),c=R(r,F),s=R(c,"backups");D(c,r),B(s)||Y(s,{mode:448}),D(s,c);const u=`${e}.operational.json`,a=R(s,u),d=`${JSON.stringify(t,null,2)}
2
+ `,h=S("sha256").update(d).digest("hex");if(B(a)){const b=w(a);if(!b.isFile()||b.isSymbolicLink()||S("sha256").update(N(a)).digest("hex")!==h)throw new Error("epic-operational-backup-failed")}else{const b=_(a,"wx",384);try{q(b,d),V(b)}finally{J(b)}const j=_(s,"r");try{V(j)}finally{J(j)}}return{ref:`backups/${u}`,digest:h}}function de(i,e,t){if(!/^backups\/[A-Za-z0-9._-]{1,240}$/.test(e)||!l(t))throw new Error("epic-operational-backup-failed");const o=E(y(i)),n=O("git",["rev-parse","--git-common-dir"],{cwd:o,encoding:"utf8"}).trim(),r=E(x(n)?y(n):y(o,n)),c=R(r,F),s=R(c,e);D(c,r);const u=w(s);if(!u.isFile()||u.isSymbolicLink()||S("sha256").update(N(s)).digest("hex")!==t)throw new Error("epic-operational-backup-failed");return{ref:e,digest:t}}function D(i,e){const t=E(e);if(Z(t,y(i)).startsWith(".."))throw new Error("epic-operational-path-unsafe");const o=w(i);if(!o.isDirectory()||o.isSymbolicLink()||E(i)!==y(i)||typeof process.getuid=="function"&&(o.uid!==process.getuid()||(o.mode&63)!==0))throw new Error("epic-operational-path-unsafe")}function K(i,e,t){if(t?.expectedRevision!==void 0&&i.revision!==t.expectedRevision)throw new Error("epic-operational-revision-conflict");if(t?.expectedWriterEpoch!==void 0&&e.writerEpoch!==t.expectedWriterEpoch)throw new Error("epic-operational-epoch-conflict");if(t?.identityHash!==void 0&&!e.identities[t.identityHash])throw new Error("epic-operational-identity-mismatch")}function W(i){const e=p(i);if(!e)throw new Error("epic-operational-identity-mismatch");z(e,["schemaVersion","epicId","executionBranch","graphRevision","originBindingDigest","repositoryFingerprint","identityHash"]);const{identityHash:t,...o}=e;if(e.schemaVersion!=="EpicOperationalIdentity/1.0"||!A.test(String(e.epicId))||!me(e.executionBranch)||!l(e.graphRevision)||!l(e.originBindingDigest)||!l(e.repositoryFingerprint)||t!==g("p224-epic-operational-identity-v1",o))throw new Error("epic-operational-identity-mismatch")}function T(i){const e=p(i);return!!(e&&v(e,["status","sourceDigest","authorityRevision","reasonCodes"])&&["bound","unbound","unavailable"].includes(String(e.status))&&(e.sourceDigest===null||l(e.sourceDigest))&&Number.isSafeInteger(e.authorityRevision)&&Number(e.authorityRevision)>=0&&Array.isArray(e.reasonCodes)&&e.reasonCodes.length<=16&&e.reasonCodes.every(H))}function ue(i){const e=p(i),t=p(e?.projectionStatuses);return!!(e&&v(e,["schemaVersion","kind","operationId","idempotencyKey","payloadHash","identityHash","expectedRevision","expectedWriterEpoch","preimageDigest","backupManifestRef","phase","projectionStatuses","reasonCodes"])&&e.schemaVersion==="EpicOperationalJournal/1.0"&&["backfill","cross-epic-reconcile","rollback"].includes(String(e.kind))&&M(e.operationId)&&M(e.idempotencyKey)&&l(e.payloadHash)&&l(e.identityHash)&&Number.isSafeInteger(e.expectedRevision)&&Number.isSafeInteger(e.expectedWriterEpoch)&&l(e.preimageDigest)&&typeof e.backupManifestRef=="string"&&e.backupManifestRef.length<=1024&&!x(e.backupManifestRef)&&!e.backupManifestRef.includes("..")&&["prepared","authority-applied","projections-applied","committed","aborted-before-authority"].includes(String(e.phase))&&t&&v(t,["trackedState","sqlite"])&&["pending","applied","not-applicable"].includes(String(t.trackedState))&&["pending","applied","unavailable","not-applicable"].includes(String(t.sqlite))&&Array.isArray(e.reasonCodes)&&e.reasonCodes.length<=16&&e.reasonCodes.every(H))}function P(i,e){return Array.isArray(i)&&i.length<=C&&i.every(t=>e==="EpicLifecycleBackfillReceipt/1.0"?he(t):e==="YoloopCrossEpicReconciliationReceipt/1.0"?ye(t):fe(t))}function he(i){const e=p(i);return!!(e&&v(e,["schemaVersion","operationId","idempotencyKey","payloadHash","planDigest","sourceInventoryDigest","preimageDigest","postimageDigest","authorityPostimageDigest","backupManifestDigest","identityHash","appliedRevision","writerEpoch","stateMigrationOperationId","outcome","reasonCodes","publicSafe"])&&e.schemaVersion==="EpicLifecycleBackfillReceipt/1.0"&&f(e.operationId)&&f(e.idempotencyKey)&&e.operationId===e.idempotencyKey&&[e.payloadHash,e.planDigest,e.sourceInventoryDigest,e.preimageDigest,e.postimageDigest,e.authorityPostimageDigest,e.backupManifestDigest,e.identityHash].every(l)&&Number.isSafeInteger(e.appliedRevision)&&Number(e.appliedRevision)>=1&&Number.isSafeInteger(e.writerEpoch)&&Number(e.writerEpoch)>=1&&(e.stateMigrationOperationId===null||f(e.stateMigrationOperationId))&&["applied","already-applied"].includes(String(e.outcome))&&$(e.reasonCodes)&&e.publicSafe===!0)}function ye(i){const e=p(i);return!!(e&&v(e,["schemaVersion","operationId","idempotencyKey","payloadHash","sourceEpicId","sourceGraphRevision","targetEpicId","targetGraphRevision","runId","previousSessionHash","nextSessionHash","retiredAuthorityHash","retiredAuthorityCount","outcome","publicSafe"])&&e.schemaVersion==="YoloopCrossEpicReconciliationReceipt/1.0"&&f(e.operationId)&&f(e.idempotencyKey)&&l(e.payloadHash)&&A.test(String(e.sourceEpicId))&&A.test(String(e.targetEpicId))&&l(e.sourceGraphRevision)&&l(e.targetGraphRevision)&&f(e.runId)&&l(e.previousSessionHash)&&l(e.nextSessionHash)&&l(e.retiredAuthorityHash)&&[0,1].includes(Number(e.retiredAuthorityCount))&&e.outcome==="cross-epic-reconciled"&&e.publicSafe===!0)}function fe(i){const e=p(i);return!!(e&&v(e,["schemaVersion","operationId","targetOperationId","expectedPostimageDigest","restoredPreimageDigest","reasonCodes","publicSafe"])&&e.schemaVersion==="EpicOperationalRollbackReceipt/1.0"&&f(e.operationId)&&f(e.targetOperationId)&&l(e.expectedPostimageDigest)&&l(e.restoredPreimageDigest)&&$(e.reasonCodes)&&e.publicSafe===!0)}function $(i){return Array.isArray(i)&&i.length<=16&&i.every(H)}function ge(i,e){return i.length===e.length&&e.every(t=>i.includes(t))}function z(i,e){const t=new Set(e);if(Object.keys(i).some(o=>!t.has(o)))throw new Error("epic-operational-store-corrupt")}function v(i,e){const t=Object.keys(i).sort(),o=[...e].sort();return t.length===o.length&&t.every((n,r)=>n===o[r])}function p(i){return i&&typeof i=="object"&&!Array.isArray(i)?i:void 0}function l(i){return typeof i=="string"&&oe.test(i)}function M(i){return typeof i=="string"&&ne.test(i)&&!i.includes("..")}function f(i){return typeof i=="string"&&/^[A-Za-z0-9._:-]{1,128}$/.test(i)}function H(i){return typeof i=="string"&&/^[a-z0-9][a-z0-9-]{0,79}$/.test(i)}function me(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(".")}function Ee(i){const e=i instanceof Error?i.message:"";return H(e)?e:"epic-operational-store-corrupt"}export{te as EPIC_OPERATIONAL_IDENTITY_CAP,ie as EPIC_OPERATIONAL_PAYLOAD_LIMIT_BYTES,C as EPIC_OPERATIONAL_RECEIPT_CAP,ee as EPIC_OPERATIONAL_SOURCE_LIMIT_BYTES,He as applyCrossEpicContinuationReconciliation,I as assertEpicOperationalState,ce as buildCrossEpicContinuationPayloadHash,ke as classifyCrossEpicContinuationReconciliation,we as createEpicOperationalIdentity,xe as createInitialEpicOperationalState,re as deriveEpicOperationalRepositoryFingerprint,m as epicOperationalCanonicalJson,g as epicOperationalHash,k as mutateEpicOperationalState,se as projectEpicOperationalState,Ce as readEpicOperationalState};
@@ -1,3 +1,4 @@
1
+ import { type EpicAggregateQaReceipt, type EpicHeadReconciliationReceiptV1 } from '../../../shared/dist/yoloop/epic-terminal-git.js';
1
2
  import { type AnchoredDirectoryIdentity } from './secure-filesystem-boundary.js';
2
3
  export declare const GIT_LIFECYCLE_RUNTIME_DIRECTORY = "neocortex-yoloop";
3
4
  export declare const GIT_LIFECYCLE_RUNTIME_FILE = "runtime.json";
@@ -20,10 +21,16 @@ interface LegacyCheckpointMigrationBinding {
20
21
  */
21
22
  export declare const LEGACY_P174_CHECKPOINT_MIGRATIONS: Readonly<Record<string, Readonly<LegacyCheckpointMigrationBinding>>>;
22
23
  export interface GitLifecycleRuntimeDocument {
23
- readonly schemaVersion: 1;
24
+ readonly schemaVersion: 1 | 2;
24
25
  readonly revision: number;
25
26
  readonly epics: Record<string, Record<string, unknown>>;
26
27
  readonly stories: Record<string, Record<string, unknown>>;
28
+ /**
29
+ * P224.01 common operational authority. It is absent from readable v1
30
+ * documents and mandatory for v2. Domain consumers perform the stronger
31
+ * closed-schema validation in `epic-operational-state.ts` before use.
32
+ */
33
+ readonly operational?: Record<string, unknown>;
27
34
  }
28
35
  export interface GitLifecycleMutationResult<T> {
29
36
  readonly document: GitLifecycleRuntimeDocument;
@@ -34,6 +41,8 @@ export interface GitLifecycleMutationOptions {
34
41
  readonly expectedRevision?: number;
35
42
  /** Final async physical guard executed while the lifecycle lock is held. */
36
43
  readonly preCommit?: (document: GitLifecycleRuntimeDocument) => Promise<void>;
44
+ /** Explicit migration-only promotion. Normal lifecycle writes preserve schema. */
45
+ readonly nextSchemaVersion?: 2;
37
46
  }
38
47
  export interface GitLifecycleReadOptions {
39
48
  /** Epic-aware calls require the initialized sidecar; projectless calls opt out explicitly. */
@@ -109,6 +118,11 @@ export type StoryCheckpointProjectionDecision = {
109
118
  export interface P205TransientExecutionAuthority {
110
119
  readonly __p205OpaqueAuthority: never;
111
120
  }
121
+ /** One-shot terminal capability minted only after fresh physical receipt revalidation. */
122
+ export interface EpicHeadReconciliationAuthority {
123
+ readonly __epicHeadReconciliationOpaqueAuthority: never;
124
+ }
125
+ export type EpicTerminalReleaseAuthority = P205TransientExecutionAuthority | EpicHeadReconciliationAuthority;
112
126
  export declare function executeP205TransientAuthority(projectRoot: string, input: {
113
127
  readonly headSha: string;
114
128
  readonly graphRevision: string;
@@ -190,6 +204,23 @@ export declare function projectP205TransientExecutionEvidence(authority: P205Tra
190
204
  readonly executionEvidenceDigest: string;
191
205
  }> | undefined;
192
206
  export declare function p205TransientAuthorityMatchesAggregate(authority: P205TransientExecutionAuthority | null | undefined, headSha: string, graphRevision: string): boolean;
207
+ /**
208
+ * Reopen a persisted reconciliation receipt from physical Git and mint a
209
+ * process-local, one-shot terminal capability. This path never runs P205 and
210
+ * never creates an aggregate PASS; it only renews admissibility for identical
211
+ * immutable inputs.
212
+ */
213
+ export declare function revalidateEpicHeadReconciliationAuthority(projectRoot: string, receipt: EpicHeadReconciliationReceiptV1, aggregateQaReceipt: EpicAggregateQaReceipt, nowIso?: string): Promise<Readonly<{
214
+ authority: EpicHeadReconciliationAuthority;
215
+ receipt: EpicHeadReconciliationReceiptV1;
216
+ }>>;
217
+ /** Consume one exact terminal authority. Serialized objects and replays fail. */
218
+ export declare function consumeEpicTerminalReleaseAuthority(authority: EpicTerminalReleaseAuthority | null | undefined, input: {
219
+ readonly executionHeadSha: string;
220
+ readonly graphRevision: string;
221
+ readonly aggregateQaReceipt: EpicAggregateQaReceipt;
222
+ readonly headReconciliationReceipt?: EpicHeadReconciliationReceiptV1 | null;
223
+ }): boolean;
193
224
  /** Reconstruct the same closed claim used by the direct or continuous planner. */
194
225
  export declare function gitLifecycleStoryWriteSet(storyId: string, story: Record<string, unknown> | undefined, checkpoint: Record<string, unknown> | undefined): readonly string[];
195
226
  /** Pre-P205 admission for only the exact seven immutable P174 migrations. */