codex-workflow-v2 2.0.0-beta.13.9 → 2.0.0-beta.14

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 (271) hide show
  1. package/README.md +27 -388
  2. package/dist/reviewer-runtime-build.json +89 -29
  3. package/dist/src/alpha6/adoption.d.ts +2 -0
  4. package/dist/src/alpha6/adoption.js +22 -0
  5. package/dist/src/alpha6/adoption.js.map +1 -1
  6. package/dist/src/alpha6/captured-check-evidence.d.ts +51 -0
  7. package/dist/src/alpha6/captured-check-evidence.js +152 -0
  8. package/dist/src/alpha6/captured-check-evidence.js.map +1 -0
  9. package/dist/src/alpha6/component-owner.d.ts +15 -1
  10. package/dist/src/alpha6/component-owner.js +44 -2
  11. package/dist/src/alpha6/component-owner.js.map +1 -1
  12. package/dist/src/alpha6/corrective-decision-boundary.d.ts +4 -0
  13. package/dist/src/alpha6/corrective-decision-boundary.js +47 -0
  14. package/dist/src/alpha6/corrective-decision-boundary.js.map +1 -0
  15. package/dist/src/alpha6/downstream-proof.d.ts +1 -25
  16. package/dist/src/alpha6/downstream-proof.js +0 -171
  17. package/dist/src/alpha6/downstream-proof.js.map +1 -1
  18. package/dist/src/alpha6/literal-test-invocation.d.ts +2 -0
  19. package/dist/src/alpha6/literal-test-invocation.js +106 -0
  20. package/dist/src/alpha6/literal-test-invocation.js.map +1 -0
  21. package/dist/src/alpha6/milestone.d.ts +2 -0
  22. package/dist/src/alpha6/milestone.js +10 -1
  23. package/dist/src/alpha6/milestone.js.map +1 -1
  24. package/dist/src/alpha6/navigation-dirty-carryover.d.ts +11 -0
  25. package/dist/src/alpha6/navigation-dirty-carryover.js +130 -0
  26. package/dist/src/alpha6/navigation-dirty-carryover.js.map +1 -0
  27. package/dist/src/alpha6/plan-integrity.js +7 -5
  28. package/dist/src/alpha6/plan-integrity.js.map +1 -1
  29. package/dist/src/alpha6/remediation.d.ts +6 -21
  30. package/dist/src/alpha6/remediation.js +161 -476
  31. package/dist/src/alpha6/remediation.js.map +1 -1
  32. package/dist/src/alpha6/root-cause-replan-carryover.d.ts +4 -1
  33. package/dist/src/alpha6/root-cause-replan-carryover.js +29 -5
  34. package/dist/src/alpha6/root-cause-replan-carryover.js.map +1 -1
  35. package/dist/src/beta1/project-transaction.d.ts +3 -1
  36. package/dist/src/beta1/project-transaction.js +6 -2
  37. package/dist/src/beta1/project-transaction.js.map +1 -1
  38. package/dist/src/checks/runner.d.ts +26 -0
  39. package/dist/src/checks/runner.js +223 -0
  40. package/dist/src/checks/runner.js.map +1 -0
  41. package/dist/src/checks/task-sync.d.ts +10 -0
  42. package/dist/src/checks/task-sync.js +41 -0
  43. package/dist/src/checks/task-sync.js.map +1 -0
  44. package/dist/src/checks/worker.d.ts +1 -0
  45. package/dist/src/checks/worker.js +154 -0
  46. package/dist/src/checks/worker.js.map +1 -0
  47. package/dist/src/cli-actions.d.ts +2 -2
  48. package/dist/src/cli-actions.js +3 -15
  49. package/dist/src/cli-actions.js.map +1 -1
  50. package/dist/src/cli.js +14 -98
  51. package/dist/src/cli.js.map +1 -1
  52. package/dist/src/contracts.d.ts +35 -32
  53. package/dist/src/dependency-provenance.d.ts +2 -2
  54. package/dist/src/dependency-provenance.js +12 -69
  55. package/dist/src/dependency-provenance.js.map +1 -1
  56. package/dist/src/domain/base-sync-conflict.d.ts +13 -0
  57. package/dist/src/domain/base-sync-conflict.js +32 -0
  58. package/dist/src/domain/base-sync-conflict.js.map +1 -0
  59. package/dist/src/domain/step-start-admission.d.ts +4 -0
  60. package/dist/src/domain/step-start-admission.js +9 -0
  61. package/dist/src/domain/step-start-admission.js.map +1 -0
  62. package/dist/src/domain/virgin-registration.d.ts +3 -0
  63. package/dist/src/domain/virgin-registration.js +65 -0
  64. package/dist/src/domain/virgin-registration.js.map +1 -0
  65. package/dist/src/errors.d.ts +1 -1
  66. package/dist/src/errors.js.map +1 -1
  67. package/dist/src/gateway-handshake.js +0 -8
  68. package/dist/src/gateway-handshake.js.map +1 -1
  69. package/dist/src/git.d.ts +3 -1
  70. package/dist/src/git.js +41 -14
  71. package/dist/src/git.js.map +1 -1
  72. package/dist/src/graph.js +25 -3
  73. package/dist/src/graph.js.map +1 -1
  74. package/dist/src/index.d.ts +1 -0
  75. package/dist/src/navigation-actions.d.ts +9 -0
  76. package/dist/src/navigation-actions.js +72 -0
  77. package/dist/src/navigation-actions.js.map +1 -0
  78. package/dist/src/navigation-update-artifact.d.ts +5 -0
  79. package/dist/src/navigation-update-artifact.js +227 -0
  80. package/dist/src/navigation-update-artifact.js.map +1 -0
  81. package/dist/src/navigation-update.d.ts +39 -0
  82. package/dist/src/navigation-update.js +82 -0
  83. package/dist/src/navigation-update.js.map +1 -0
  84. package/dist/src/observation.js +52 -29
  85. package/dist/src/observation.js.map +1 -1
  86. package/dist/src/observed-routes.js +5 -6
  87. package/dist/src/observed-routes.js.map +1 -1
  88. package/dist/src/pending-review-update.d.ts +0 -13
  89. package/dist/src/pending-review-update.js +1 -6
  90. package/dist/src/pending-review-update.js.map +1 -1
  91. package/dist/src/reviewer.d.ts +1 -1
  92. package/dist/src/reviewer.js +20 -17
  93. package/dist/src/reviewer.js.map +1 -1
  94. package/dist/src/runtime.d.ts +3 -0
  95. package/dist/src/runtime.js +6 -0
  96. package/dist/src/runtime.js.map +1 -0
  97. package/dist/src/state/corrective-replan-executor.d.ts +10 -0
  98. package/dist/src/state/corrective-replan-executor.js +37 -1
  99. package/dist/src/state/corrective-replan-executor.js.map +1 -1
  100. package/dist/src/state/corrective-replan-public-schema.js +15 -2
  101. package/dist/src/state/corrective-replan-public-schema.js.map +1 -1
  102. package/dist/src/state/corrective-replan-public.js +1 -1
  103. package/dist/src/state/corrective-replan-public.js.map +1 -1
  104. package/dist/src/state/corrective-replan-transaction.d.ts +1 -0
  105. package/dist/src/state/corrective-replan-transaction.js +12 -11
  106. package/dist/src/state/corrective-replan-transaction.js.map +1 -1
  107. package/dist/src/state/corrective-yield-transaction.d.ts +1 -0
  108. package/dist/src/state/corrective-yield-transaction.js +11 -10
  109. package/dist/src/state/corrective-yield-transaction.js.map +1 -1
  110. package/dist/src/state/lock.d.ts +4 -0
  111. package/dist/src/state/lock.js +21 -0
  112. package/dist/src/state/lock.js.map +1 -1
  113. package/dist/src/version.d.ts +1 -1
  114. package/dist/src/version.js +1 -1
  115. package/dist/src/version.js.map +1 -1
  116. package/dist/src/workflow-blocker-route.d.ts +8 -0
  117. package/dist/src/workflow-blocker-route.js +106 -0
  118. package/dist/src/workflow-blocker-route.js.map +1 -0
  119. package/dist/src/workflow.d.ts +48 -63
  120. package/dist/src/workflow.js +666 -1460
  121. package/dist/src/workflow.js.map +1 -1
  122. package/docs/autonomy-guardrails.md +26 -304
  123. package/docs/decisions.md +14 -112
  124. package/docs/development-flow.md +35 -238
  125. package/docs/project-memory.md +31 -50
  126. package/docs/release-app-evidence.md +190 -0
  127. package/docs/release.md +95 -388
  128. package/docs/updating-existing-project.md +19 -717
  129. package/package.json +11 -13
  130. package/plugins/codex-workflow-gateway/.codex-plugin/plugin.json +2 -2
  131. package/plugins/codex-workflow-gateway/references/chat-dispatch.md +73 -197
  132. package/plugins/codex-workflow-gateway/references/codebase-memory-routing.md +57 -0
  133. package/plugins/codex-workflow-gateway/references/protocol.md +42 -445
  134. package/plugins/codex-workflow-gateway/scripts/chat-dispatch.mjs +7 -1
  135. package/plugins/codex-workflow-gateway/scripts/chat-model-policy.mjs +10 -8
  136. package/plugins/codex-workflow-gateway/scripts/chat-registry.mjs +23 -5
  137. package/plugins/codex-workflow-gateway/skills/codex-workflow-gateway/SKILL.md +66 -757
  138. package/references/state-machine.md +4 -4
  139. package/roles/technical-planner.md +1 -1
  140. package/schemas/corrective-decision-event.schema.json +3 -1
  141. package/schemas/project-knowledge-map.schema.json +3 -1
  142. package/schemas/remediation-event.schema.json +10 -1
  143. package/schemas/task.schema.json +46 -2
  144. package/schemas/transition-payloads.schema.json +16 -1
  145. package/src/alpha6/adoption.ts +1123 -0
  146. package/src/alpha6/captured-check-evidence.ts +132 -0
  147. package/src/alpha6/check-support-anchor.ts +128 -0
  148. package/src/alpha6/component-owner.ts +168 -0
  149. package/src/alpha6/corrective-decision-boundary.ts +39 -0
  150. package/src/alpha6/downstream-proof.ts +520 -0
  151. package/src/alpha6/failed-step-planning-recovery.ts +88 -0
  152. package/src/alpha6/handoff.ts +1443 -0
  153. package/src/alpha6/journal.ts +473 -0
  154. package/src/alpha6/literal-test-invocation.ts +84 -0
  155. package/src/alpha6/mechanical-feasibility.ts +488 -0
  156. package/src/alpha6/milestone.ts +2192 -0
  157. package/src/alpha6/navigation-dirty-carryover.ts +154 -0
  158. package/src/alpha6/npm-check-contract.ts +47 -0
  159. package/src/alpha6/plan-integrity.ts +298 -0
  160. package/src/alpha6/plan-risk.ts +1480 -0
  161. package/src/alpha6/preexecution-replan.ts +187 -0
  162. package/src/alpha6/remediation-cause.ts +98 -0
  163. package/src/alpha6/remediation.ts +2438 -0
  164. package/src/alpha6/review.ts +1198 -0
  165. package/src/alpha6/root-cause-replan-carryover.ts +491 -0
  166. package/src/alpha6/store-sidecars.ts +335 -0
  167. package/src/alpha7/autonomy.ts +411 -0
  168. package/src/alpha7/corrective-recovery.ts +1332 -0
  169. package/src/artifacts.ts +130 -0
  170. package/src/beta1/project-transaction.ts +355 -0
  171. package/src/change-explanation.ts +153 -0
  172. package/src/checks/runner.ts +245 -0
  173. package/src/checks/task-sync.ts +41 -0
  174. package/src/checks/worker.ts +149 -0
  175. package/src/cli-actions.ts +107 -0
  176. package/src/cli.ts +1457 -0
  177. package/src/contracts.ts +1494 -0
  178. package/src/credential-output.ts +89 -0
  179. package/src/credential-transport.ts +215 -0
  180. package/src/delegation.ts +190 -0
  181. package/src/dependency-provenance.ts +472 -0
  182. package/src/diagnostics.ts +93 -0
  183. package/src/domain/base-sync-conflict.ts +35 -0
  184. package/src/domain/completed-step-carryover.ts +76 -0
  185. package/src/domain/discovery.ts +27 -0
  186. package/src/domain/plan-semantics.ts +58 -0
  187. package/src/domain/step-start-admission.ts +10 -0
  188. package/src/domain/validation.ts +177 -0
  189. package/src/domain/virgin-registration.ts +46 -0
  190. package/src/errors.ts +24 -0
  191. package/src/fs-utils.ts +61 -0
  192. package/src/gateway-handshake.ts +95 -0
  193. package/src/git.ts +183 -0
  194. package/src/graph.ts +342 -0
  195. package/src/historical-step-provenance.ts +136 -0
  196. package/src/index.ts +23 -0
  197. package/src/lifecycle/canonical-hash.ts +28 -0
  198. package/src/lifecycle/catalog.ts +202 -0
  199. package/src/lifecycle/compiler-inspection.ts +29 -0
  200. package/src/lifecycle/core-static-readiness.ts +132 -0
  201. package/src/lifecycle/corrective-replan-authority.ts +136 -0
  202. package/src/lifecycle/corrective-replan-binding-manifest.ts +51 -0
  203. package/src/lifecycle/corrective-replan-credential-core.ts +408 -0
  204. package/src/lifecycle/corrective-replan-credential-schema.ts +54 -0
  205. package/src/lifecycle/corrective-replan-credentials.ts +48 -0
  206. package/src/lifecycle/corrective-replan.ts +843 -0
  207. package/src/lifecycle/evaluator.ts +48 -0
  208. package/src/lifecycle/fingerprint.ts +488 -0
  209. package/src/lifecycle/immutable.ts +8 -0
  210. package/src/lifecycle/implementation-table.ts +118 -0
  211. package/src/lifecycle/index.ts +8 -0
  212. package/src/lifecycle/schema-artifact.ts +263 -0
  213. package/src/lifecycle/semantic-registry.ts +572 -0
  214. package/src/lifecycle/types.ts +838 -0
  215. package/src/memory.ts +273 -0
  216. package/src/migration.ts +161 -0
  217. package/src/navigation-actions.ts +70 -0
  218. package/src/navigation-update-artifact.ts +198 -0
  219. package/src/navigation-update.ts +121 -0
  220. package/src/observation.ts +225 -0
  221. package/src/observed-routes.ts +660 -0
  222. package/src/operational-contract.ts +125 -0
  223. package/src/pending-review-update.ts +175 -0
  224. package/src/repository.ts +99 -0
  225. package/src/reviewer.ts +1879 -0
  226. package/src/runtime.ts +6 -0
  227. package/src/state/corrective-replan-executor.ts +818 -0
  228. package/src/state/corrective-replan-public-schema.ts +83 -0
  229. package/src/state/corrective-replan-public.ts +908 -0
  230. package/src/state/corrective-replan-transaction.ts +949 -0
  231. package/src/state/corrective-yield-executor.ts +327 -0
  232. package/src/state/corrective-yield-transaction.ts +730 -0
  233. package/src/state/lock.ts +902 -0
  234. package/src/state/store.ts +567 -0
  235. package/src/transition-core.ts +330 -0
  236. package/src/ulid.ts +24 -0
  237. package/src/version.ts +2 -0
  238. package/src/workflow-blocker-route.ts +109 -0
  239. package/src/workflow.ts +10172 -0
  240. package/docs/alpha7.1-implementation-brief.md +0 -268
  241. package/docs/alpha7.2-corrective-context-refresh-brief.md +0 -484
  242. package/docs/alpha7.2.1-remediation-recovery-brief.md +0 -86
  243. package/docs/beta1-stabilization-brief.md +0 -165
  244. package/docs/beta11-plan-integrity-recovery-brief.md +0 -38
  245. package/docs/beta13.2-signal-review-recovery.md +0 -38
  246. package/docs/beta2-initial-assembly-navigation-brief.md +0 -616
  247. package/docs/change-model.md +0 -118
  248. package/docs/delegated-approval.md +0 -254
  249. package/docs/lifecycle/state-machine-stabilization.md +0 -641
  250. package/docs/pdf/README.md +0 -24
  251. package/docs/pdf/codex-workflow-v2-architecture-ru.pdf +0 -0
  252. package/docs/pdf/codex-workflow-v2-chat-only-guide-ru.pdf +0 -0
  253. package/docs/pdf/codex-workflow-v2-technical-reference-ru.pdf +0 -0
  254. package/docs/pdf/requirements.txt +0 -1
  255. package/docs/pdf/sources/codex-workflow-v2-architecture-ru.md +0 -478
  256. package/docs/pdf/sources/codex-workflow-v2-chat-only-guide-ru.md +0 -506
  257. package/docs/pdf/sources/codex-workflow-v2-technical-reference-ru.md +0 -778
  258. package/docs/pending-review-update.md +0 -15
  259. package/docs/problem-briefs/01-pre-implementation-integrity.md +0 -482
  260. package/docs/problem-briefs/02-minimal-step-integrity.md +0 -411
  261. package/docs/problem-briefs/03-minimal-agent-context-integrity.md +0 -358
  262. package/docs/problem-briefs/04-task-dependency-and-structural-replacement-integrity.md +0 -573
  263. package/docs/problem-briefs/BRIEF-TEMPLATE.md +0 -56
  264. package/docs/problem-briefs/README.md +0 -120
  265. package/docs/problem-briefs/evidence/p01-mechanical-feasibility-corpus.md +0 -90
  266. package/docs/problem-briefs/evidence/signal-v4-pre-m3-replay.md +0 -246
  267. package/docs/split-required-recovery.md +0 -47
  268. package/docs/stable-release-defect-register.md +0 -730
  269. package/docs/validation-report.md +0 -182
  270. package/scripts/generate-pdf-docs.py +0 -524
  271. package/scripts/run-pdf-docs.mjs +0 -62
@@ -0,0 +1,330 @@
1
+ import { WorkflowService } from './workflow.js';
2
+ import { CoreTaskOperationLockManager } from './state/lock.js';
3
+ import { correctiveReplanTerminalReadback, driveCorrectiveReplanTransaction } from './state/corrective-replan-executor.js';
4
+ import { CorrectiveReplanTaskTransactionStore } from './state/corrective-replan-transaction.js';
5
+ import { GuardedTransitionCatalog, validateTransitionDefinitionSemantics } from './lifecycle/catalog.js';
6
+ import { installedAuthoritySemanticBindings, projectAuthoritySemanticBundle, type AuthoritySemanticBinding } from './lifecycle/corrective-replan-authority.js';
7
+ import { correctiveReplanCredentialFunctionBindings, type CredentialFunctionBinding } from './lifecycle/corrective-replan-credential-core.js';
8
+ import { correctiveReplanCredentialSchemaArtifacts, correctiveReplanCredentialSchemaValidators } from './lifecycle/corrective-replan-credential-schema.js';
9
+ import { diagnoseCorrectiveReplanCredentialClosure } from './lifecycle/corrective-replan-credentials.js';
10
+ import { hashCorrectivePlanBytes, taskCorrectiveReplanDefinition } from './lifecycle/corrective-replan.js';
11
+ import { evaluateTransition } from './lifecycle/evaluator.js';
12
+ import {
13
+ evaluateInstalledReleaseRulesForCore, installedCoreRuleBindings, projectReleaseRuleContextForCore,
14
+ } from './lifecycle/core-static-readiness.js';
15
+ import { hashCanonical, runtimeCatalogHash, runtimeSemanticFingerprint, runtimeSemanticProjection as runtimeProjection, transitionDefinitionManifestHash } from './lifecycle/fingerprint.js';
16
+ import { deepFreeze } from './lifecycle/immutable.js';
17
+ import { createCorrectiveReplanImplementationTable } from './lifecycle/implementation-table.js';
18
+ import {
19
+ installedPayloadSchemaArtifacts, installedPayloadSchemaValidators,
20
+ installedTransitionDefinitionArtifact, installedTransitionDefinitionValidator,
21
+ transitionDefinitionDocumentSha256, transitionDefinitionVocabularySha256,
22
+ } from './lifecycle/schema-artifact.js';
23
+ import { transitionSemanticRegistry } from './lifecycle/semantic-registry.js';
24
+ import {
25
+ LIFECYCLE_EPOCH, TRANSITION_DEFINITION_FORMAT_VERSION,
26
+ type CompilerDiagnostic, type CoreCatalogCompileResult, type CoreCompiledCatalogHandle,
27
+ type CoreCompilerProvenance, type CoreReleaseRuleBinding, type CoreReleaseRuleContext,
28
+ type ExecutableSemanticBinding, type PayloadSchemaArtifactBinding, type PayloadSchemaValidatorBinding,
29
+ type SerializedTransitionDefinition, type StaticReadinessReport, type TransitionId,
30
+ } from './lifecycle/types.js';
31
+
32
+ type Callable = (...arguments_: never[]) => unknown;
33
+ interface BoundPayloadSchema {
34
+ readonly schema: { readonly id: string; readonly version: number };
35
+ readonly artifact: PayloadSchemaArtifactBinding;
36
+ readonly validator: PayloadSchemaValidatorBinding;
37
+ }
38
+ interface BoundRule extends CoreReleaseRuleBinding { readonly context: CoreReleaseRuleContext }
39
+ interface GuardExecutableBinding { readonly guardId: string; readonly semanticVersion: number; readonly implementationId: `implementation.${string}`; readonly implementationVersion: number; readonly callable: Callable }
40
+ interface ExecutableSlot { readonly path: string; readonly binding: ExecutableSemanticBinding }
41
+ export interface TransitionExecutableBinding { readonly transitionId: TransitionId; readonly version: 1; readonly runtimeSemanticFingerprint: string; readonly implementationId: `implementation.${string}`; readonly implementationVersion: number; readonly guardCallables: readonly GuardExecutableBinding[]; readonly executableSlots: readonly ExecutableSlot[]; readonly evaluate: Callable }
42
+ export interface CorePrivateTransitionIr {
43
+ readonly transitionId: TransitionId;
44
+ readonly serializedDefinition: SerializedTransitionDefinition;
45
+ readonly transitionExecutableBinding: TransitionExecutableBinding;
46
+ readonly authoritySemanticBindings: readonly AuthoritySemanticBinding[];
47
+ readonly credentialSemanticBindings: readonly CredentialFunctionBinding[];
48
+ readonly credentialClosureSha256: string;
49
+ readonly definitionSchema: BoundPayloadSchema;
50
+ readonly rules: readonly BoundRule[];
51
+ readonly payloadSchemas: readonly BoundPayloadSchema[];
52
+ readonly payloadSchemaClosureSha256: string;
53
+ }
54
+ interface CoreRecord { readonly ir: readonly CorePrivateTransitionIr[]; readonly readiness: StaticReadinessReport }
55
+ const guards = taskCorrectiveReplanDefinition.guards.map((guard) => guard.evaluate) as readonly Callable[];
56
+ const credentialReceiptVerifier = correctiveReplanCredentialFunctionBindings.find(
57
+ (entry) => entry.id === 'credential-verifier.corrective-replan.receipt',
58
+ );
59
+ if (!credentialReceiptVerifier) throw new TypeError('Installed corrective-replan receipt verifier is missing.');
60
+ const credentialClosure = diagnoseCorrectiveReplanCredentialClosure();
61
+ if (!credentialClosure.closed) throw new TypeError('Installed corrective-replan credential bundle is not closed.');
62
+ const executableTable = createCorrectiveReplanImplementationTable({
63
+ guards,
64
+ identityComparators: installedAuthoritySemanticBindings.filter((entry) => entry.kind === 'identity-comparator').map((entry) => entry.callable) as readonly Callable[],
65
+ verifyReceipt: credentialReceiptVerifier.callable as Callable,
66
+ acquireTaskLock: CoreTaskOperationLockManager.prototype.acquire as Callable,
67
+ createJournalIntent: CorrectiveReplanTaskTransactionStore.prototype.createIntent as Callable,
68
+ recoverCorrectiveReplan: driveCorrectiveReplanTransaction as Callable,
69
+ executeCorrectiveReplan: WorkflowService.prototype.executeCorrectiveReplan as Callable,
70
+ terminalReadback: correctiveReplanTerminalReadback as Callable,
71
+ canonicalJsonSha256: hashCanonical, rawPlanSha256: hashCorrectivePlanBytes,
72
+ });
73
+ const installedExecutables = deepFreeze(Object.values(executableTable).flat());
74
+ const installedFamilySemantics = runtimeProjection(taskCorrectiveReplanDefinition.metadata).semantics;
75
+ const installedTransitionExecutableBinding = deepFreeze({
76
+ transitionId: taskCorrectiveReplanDefinition.metadata.transitionId, version: 1,
77
+ runtimeSemanticFingerprint: taskCorrectiveReplanDefinition.runtimeSemanticFingerprint,
78
+ implementationId: 'implementation.transition.task-corrective-replan', implementationVersion: 2,
79
+ guardCallables: taskCorrectiveReplanDefinition.guards.map((guard, index) => {
80
+ const binding = executable(taskCorrectiveReplanDefinition.metadata.guards[index]!.evaluator);
81
+ return { guardId: guard.metadata.guardId, semanticVersion: guard.metadata.semanticVersion,
82
+ implementationId: binding.semanticId, implementationVersion: binding.semanticVersion, callable: guard.evaluate };
83
+ }),
84
+ executableSlots: declaredExecutableSlots(), evaluate: evaluateTransition as Callable,
85
+ }) as TransitionExecutableBinding;
86
+ export const installedTransitionExecutableBindings = deepFreeze([installedTransitionExecutableBinding]);
87
+ const issuedCatalogs = new WeakMap<object, CoreRecord>();
88
+
89
+ export const guardedTransitionCatalog = deepFreeze(new GuardedTransitionCatalog([taskCorrectiveReplanDefinition]));
90
+
91
+ export function compileCoreTransitionCatalog(raw: readonly unknown[]): CoreCatalogCompileResult {
92
+ if (!Array.isArray(raw)) return failed([{ diagnosticId: 'compiler.catalog.input-invalid', path: '/', message: 'Core catalog input must be an array.' }]);
93
+ const diagnostics = diagnoseClosure(raw, installedCoreRuleBindings, installedTransitionExecutableBindings, installedPayloadSchemaArtifacts, installedPayloadSchemaValidators);
94
+ if (diagnostics.length > 0) return failed(diagnostics);
95
+ const ir: CorePrivateTransitionIr[] = [];
96
+ const seen = new Set<string>();
97
+ for (const candidate of raw) {
98
+ const definition = structuredClone(candidate) as SerializedTransitionDefinition;
99
+ if (seen.has(definition.transitionId)) {
100
+ diagnostics.push({ diagnosticId: 'compiler.catalog.transition-duplicate', path: '/transitionId', ref: definition.transitionId, message: 'Transition ID is duplicated.' });
101
+ continue;
102
+ }
103
+ seen.add(definition.transitionId);
104
+ const payloadSchemas = bindPayloadSchemas(definition, installedPayloadSchemaArtifacts, installedPayloadSchemaValidators, diagnostics);
105
+ const rules = installedCoreRuleBindings.map((binding) => ({ ...binding, context: projectReleaseRuleContextForCore(definition, binding.id) }));
106
+ const payloadSchemaClosureSha256 = hashCanonical(payloadSchemas.map(projectPayloadBinding));
107
+ const definitionSchema = { schema: { id: installedTransitionDefinitionArtifact.id, version: 1 },
108
+ artifact: installedTransitionDefinitionArtifact, validator: installedTransitionDefinitionValidator };
109
+ ir.push(deepFreeze({ transitionId: definition.transitionId, serializedDefinition: definition,
110
+ transitionExecutableBinding: installedTransitionExecutableBinding, authoritySemanticBindings: installedAuthoritySemanticBindings,
111
+ credentialSemanticBindings: correctiveReplanCredentialFunctionBindings,
112
+ credentialClosureSha256: credentialClosure.closureSha256,
113
+ definitionSchema, rules, payloadSchemas, payloadSchemaClosureSha256 }));
114
+ }
115
+ if (diagnostics.length > 0) return failed(diagnostics);
116
+ ir.sort((left, right) => left.transitionId.localeCompare(right.transitionId));
117
+ const frozenIr = deepFreeze(ir);
118
+ const readiness = readinessFromIr(frozenIr);
119
+ const serialized = frozenIr.map((entry) => entry.serializedDefinition);
120
+ const order = frozenIr.map((entry) => semanticOrder(entry.serializedDefinition));
121
+ const canonicalIr = frozenIr.map(projectPrivateIr);
122
+ const provenance: CoreCompilerProvenance = {
123
+ compilerId: 'codex-workflow-exact-family-compiler', compilerVersion: '4.0.0',
124
+ compilerBuildSha256: hashCanonical({ implementation: 'corrective-replan-exact-family', version: 2 }),
125
+ definitionFormatVersion: TRANSITION_DEFINITION_FORMAT_VERSION, lifecycleEpoch: LIFECYCLE_EPOCH,
126
+ rawCatalogSha256: hashCanonical(serialized), runtimeCatalogHash: runtimeCatalogHash(serialized),
127
+ staticCatalogHash: hashCanonical(readiness),
128
+ semanticRegistryClosureSha256: hashCanonical(canonicalIr.map((entry) => entry.registryClosure)),
129
+ executableRegistryClosureSha256: hashCanonical(canonicalIr.map((entry) => entry.transitionExecutableBinding)),
130
+ transitionSchemaArtifactSha256: transitionDefinitionDocumentSha256,
131
+ transitionSchemaVocabularySha256: transitionDefinitionVocabularySha256,
132
+ transitionSchemaValidatorSha256: hashCanonical(projectPayloadValidator(installedTransitionDefinitionValidator)),
133
+ payloadSchemaClosureSha256: frozenIr[0]?.payloadSchemaClosureSha256 ?? hashCanonical([]),
134
+ officialProfileSha256: hashCanonical({}),
135
+ ruleSetSha256: hashCanonical(installedCoreRuleBindings.map(projectRule)),
136
+ canonicalOrderSha256: hashCanonical(order), irSha256: hashCanonical({ transitions: canonicalIr, order, readiness }),
137
+ };
138
+ const catalog = deepFreeze({ kind: 'core-compiled-transition-catalog', provenance,
139
+ transitions: frozenIr.map((entry) => ({ transitionId: entry.transitionId,
140
+ runtimeSemanticFingerprint: entry.serializedDefinition.runtimeSemanticFingerprint,
141
+ definitionManifestHash: entry.serializedDefinition.definitionManifestHash })) }) as CoreCompiledCatalogHandle;
142
+ issuedCatalogs.set(catalog, deepFreeze({ ir: frozenIr, readiness }));
143
+ return { ok: true, catalog, diagnostics: [], diagnosticsHash: hashCanonical([]) };
144
+ }
145
+
146
+ export function evaluateCoreStaticReadiness(catalog: CoreCompiledCatalogHandle): StaticReadinessReport {
147
+ return requireRecord(catalog).readiness;
148
+ }
149
+
150
+ export function inspectCorePrivateIr(catalog: CoreCompiledCatalogHandle): readonly CorePrivateTransitionIr[] {
151
+ return requireRecord(catalog).ir;
152
+ }
153
+
154
+ export function diagnoseCoreIssuanceClosure(input: {
155
+ readonly definitions: readonly unknown[];
156
+ readonly ruleBindings?: readonly CoreReleaseRuleBinding[];
157
+ readonly transitionExecutableBindings?: readonly TransitionExecutableBinding[];
158
+ readonly authoritySemanticBindings?: readonly AuthoritySemanticBinding[];
159
+ readonly schemaArtifacts?: readonly PayloadSchemaArtifactBinding[];
160
+ readonly schemaValidators?: readonly PayloadSchemaValidatorBinding[];
161
+ }) {
162
+ const diagnostics = diagnoseClosure(input.definitions, input.ruleBindings ?? installedCoreRuleBindings,
163
+ input.transitionExecutableBindings ?? installedTransitionExecutableBindings,
164
+ input.schemaArtifacts ?? installedPayloadSchemaArtifacts, input.schemaValidators ?? installedPayloadSchemaValidators,
165
+ input.authoritySemanticBindings ?? installedAuthoritySemanticBindings);
166
+ const ordered = orderDiagnostics(diagnostics);
167
+ return deepFreeze({ issuable: ordered.length === 0, diagnostics: ordered, diagnosticsHash: hashCanonical(ordered) });
168
+ }
169
+
170
+ function diagnoseClosure(definitions: readonly unknown[], rules: readonly CoreReleaseRuleBinding[], transitionBindings: readonly TransitionExecutableBinding[], artifacts: readonly PayloadSchemaArtifactBinding[], validators: readonly PayloadSchemaValidatorBinding[], authorityBindings: readonly AuthoritySemanticBinding[] = installedAuthoritySemanticBindings): CompilerDiagnostic[] {
171
+ const diagnostics: CompilerDiagnostic[] = [];
172
+ exactRules(rules, diagnostics);
173
+ exactTransitionBindings(transitionBindings, diagnostics);
174
+ exactAuthorityBindings(authorityBindings, diagnostics);
175
+ for (const raw of definitions) {
176
+ if (!installedTransitionDefinitionArtifact || !installedTransitionDefinitionValidator.callable(raw)) {
177
+ diagnostics.push({ diagnosticId: 'compiler.schema.document-invalid', path: '/', message: 'Definition fails the installed root schema.' });
178
+ continue;
179
+ }
180
+ const semantic = validateTransitionDefinitionSemantics(raw as SerializedTransitionDefinition);
181
+ semantic.issues.forEach((entry) => diagnostics.push(entry.ref === undefined
182
+ ? { diagnosticId: `compiler.semantic.${entry.ruleId.slice('validation.'.length)}`, path: entry.path, message: entry.message }
183
+ : { diagnosticId: `compiler.semantic.${entry.ruleId.slice('validation.'.length)}`, path: entry.path, ref: entry.ref, message: entry.message }));
184
+ const definition = raw as SerializedTransitionDefinition;
185
+ if (definition.transitionId !== 'task.plan.corrective-replan') diagnostics.push({ diagnosticId: 'compiler.family.unsupported', path: '/transitionId', ref: definition.transitionId, message: 'No installed exact family compiler.' });
186
+ try {
187
+ const metadata = stripHashes(definition);
188
+ const mismatch = firstDifferencePath(installedFamilySemantics, runtimeProjection(metadata).semantics);
189
+ if (mismatch) diagnostics.push({ diagnosticId: 'core.transition-binding.semantic-mismatch', path: mismatch, ref: definition.transitionId, message: `Definition semantics differ from the installed exact family at ${mismatch}.` });
190
+ if (runtimeSemanticFingerprint(metadata) !== definition.runtimeSemanticFingerprint) diagnostics.push({ diagnosticId: 'compiler.fingerprint.runtime-mismatch', path: '/runtimeSemanticFingerprint', message: 'Runtime fingerprint is stale.' });
191
+ if (transitionDefinitionManifestHash(metadata, definition.runtimeSemanticFingerprint) !== definition.definitionManifestHash) diagnostics.push({ diagnosticId: 'compiler.fingerprint.manifest-mismatch', path: '/definitionManifestHash', message: 'Manifest hash is stale.' });
192
+ } catch (error) {
193
+ const ref = (error as { ref?: string }).ref;
194
+ diagnostics.push(ref === undefined
195
+ ? { diagnosticId: 'compiler.registry.reference-unresolved', path: '/', message: error instanceof Error ? error.message : String(error) }
196
+ : { diagnosticId: 'compiler.registry.reference-unresolved', path: '/', ref, message: error instanceof Error ? error.message : String(error) });
197
+ }
198
+ bindPayloadSchemas(definition, artifacts, validators, diagnostics);
199
+ }
200
+ return diagnostics;
201
+ }
202
+
203
+ function exactRules(candidate: readonly CoreReleaseRuleBinding[], diagnostics: CompilerDiagnostic[]): void {
204
+ for (const installed of installedCoreRuleBindings) {
205
+ const matches = candidate.filter((entry) => sameRef(entry, installed));
206
+ if (matches.length !== 1) diagnostics.push({ diagnosticId: matches.length === 0 ? 'core.rule-binding.missing' : 'core.rule-binding.duplicate', path: `/ruleBindings/${installed.id}`, ref: refKey(installed), message: `${installed.id} must be bound exactly once.` });
207
+ else if (matches[0] !== installed || matches[0]!.callable !== installed.callable
208
+ || matches[0]!.implementationId !== installed.implementationId || matches[0]!.implementationVersion !== installed.implementationVersion) {
209
+ diagnostics.push({ diagnosticId: 'core.rule-binding.callable-substituted', path: `/ruleBindings/${installed.id}`, ref: refKey(installed), message: `${installed.id} callable differs from installed Core identity.` });
210
+ }
211
+ }
212
+ }
213
+
214
+ function exactAuthorityBindings(candidate: readonly AuthoritySemanticBinding[], diagnostics: CompilerDiagnostic[]): void {
215
+ const issue = (id: string, installed: AuthoritySemanticBinding) => diagnostics.push({ diagnosticId: `core.authority-binding.${id}`,
216
+ path: `/authoritySemanticBindings/${installed.id}`, ref: installed.id, message: `${installed.id} authority callable differs from Core.` });
217
+ for (const installed of installedAuthoritySemanticBindings) {
218
+ const matches = candidate.filter((entry) => sameRef(entry, installed));
219
+ if (matches.length !== 1) issue(matches.length === 0 ? 'missing' : 'duplicate', installed);
220
+ else if (typeof matches[0]!.callable !== 'function') issue('callable-missing', installed);
221
+ else if (matches[0] !== installed || matches[0]!.callable !== installed.callable) issue('callable-substituted', installed);
222
+ }
223
+ candidate.filter((entry) => !installedAuthoritySemanticBindings.some((installed) => sameRef(entry, installed)))
224
+ .forEach((entry) => issue('extra', entry));
225
+ }
226
+
227
+ function exactTransitionBindings(candidate: readonly TransitionExecutableBinding[], diagnostics: CompilerDiagnostic[]): void {
228
+ const expected = installedTransitionExecutableBinding;
229
+ const matches = candidate.filter((entry) => entry.transitionId === expected.transitionId);
230
+ const issue = (id: string, path: string, ref: string) => diagnostics.push({ diagnosticId: `core.transition-binding.${id}`, path, ref, message: `Exact transition binding mismatch: ${ref}.` });
231
+ if (matches.length !== 1) issue(matches.length === 0 ? 'missing' : 'duplicate', `/transitionExecutableBindings/${expected.transitionId}`, expected.transitionId);
232
+ candidate.filter((entry) => entry.transitionId !== expected.transitionId).forEach((entry) => issue('extra', '/transitionExecutableBindings', entry.transitionId));
233
+ if (matches.length !== 1 || matches[0] === expected) return;
234
+ const actual = matches[0]!;
235
+ expected.guardCallables.filter((guard) => !actual.guardCallables.some((entry) => entry.guardId === guard.guardId)).forEach((guard) => issue('guard-missing', '/transitionExecutableBindings/guards', guard.guardId));
236
+ actual.guardCallables.filter((guard) => !expected.guardCallables.some((entry) => entry.guardId === guard.guardId) || actual.guardCallables.filter((entry) => entry.guardId === guard.guardId).length > 1).forEach((guard) => issue('guard-extra', '/transitionExecutableBindings/guards', guard.guardId));
237
+ if (actual.guardCallables.map((entry) => entry.guardId).join('\0') !== expected.guardCallables.map((entry) => entry.guardId).join('\0')) issue('guard-order-mismatch', '/transitionExecutableBindings/guards', expected.transitionId);
238
+ expected.guardCallables.forEach((guard, index) => { const entry = actual.guardCallables[index]; if (entry?.guardId === guard.guardId && (entry.callable !== guard.callable || entry.semanticVersion !== guard.semanticVersion || entry.implementationId !== guard.implementationId || entry.implementationVersion !== guard.implementationVersion)) issue('guard-callable-substituted', `/transitionExecutableBindings/guards/${index}`, guard.guardId); });
239
+ if (actual.version !== expected.version) issue('semantic-mismatch', '/transitionExecutableBindings/version', expected.transitionId);
240
+ if (actual.runtimeSemanticFingerprint !== expected.runtimeSemanticFingerprint || actual.evaluate !== expected.evaluate || actual.implementationId !== expected.implementationId || actual.implementationVersion !== expected.implementationVersion || actual.executableSlots !== expected.executableSlots) issue('semantic-mismatch', '/transitionExecutableBindings', expected.transitionId);
241
+ }
242
+
243
+ function bindPayloadSchemas(definition: SerializedTransitionDefinition, artifacts: readonly PayloadSchemaArtifactBinding[], validators: readonly PayloadSchemaValidatorBinding[], diagnostics: CompilerDiagnostic[]): BoundPayloadSchema[] {
244
+ let schemaRefs: { id: string; version: number }[] = [];
245
+ try {
246
+ const closure = runtimeSemanticProjectionForCore(stripHashes(definition));
247
+ schemaRefs = closure.filter((entry) => entry.category === 'schemas').map((entry) => entry.entry as { id: string; version: number });
248
+ } catch { return []; }
249
+ return schemaRefs.map((schema) => {
250
+ const installedArtifact = onlyInstalled(installedPayloadSchemaArtifacts, schema)!;
251
+ const installedValidator = onlyInstalled(installedPayloadSchemaValidators, schema)!;
252
+ const artifactMatches = artifacts.filter((entry) => sameRef(entry, schema));
253
+ const validatorMatches = validators.filter((entry) => sameRef(entry, schema));
254
+ if (artifactMatches.length !== 1) diagnostics.push({ diagnosticId: artifactMatches.length === 0 ? 'core.payload-artifact.missing' : 'core.payload-artifact.duplicate', path: `/schemaArtifacts/${schema.id}`, ref: refKey(schema), message: `${schema.id} artifact must occur exactly once.` });
255
+ else if (artifactMatches[0] !== installedArtifact) diagnostics.push({ diagnosticId: 'core.payload-artifact.subschema-substituted', path: `/schemaArtifacts/${schema.id}`, ref: refKey(schema), message: `${schema.id} artifact identity or subschema differs from Core.` });
256
+ if (validatorMatches.length !== 1) diagnostics.push({ diagnosticId: validatorMatches.length === 0 ? 'core.payload-validator.missing' : 'core.payload-validator.duplicate', path: `/schemaValidators/${schema.id}`, ref: refKey(schema), message: `${schema.id} validator must occur exactly once.` });
257
+ else if (validatorMatches[0] !== installedValidator || validatorMatches[0]!.callable !== installedValidator.callable) diagnostics.push({ diagnosticId: 'core.payload-validator.callable-substituted', path: `/schemaValidators/${schema.id}`, ref: refKey(schema), message: `${schema.id} validator differs from Core.` });
258
+ return { schema, artifact: installedArtifact, validator: installedValidator };
259
+ });
260
+ }
261
+
262
+ function runtimeSemanticProjectionForCore(metadata: ReturnType<typeof stripHashes>) {
263
+ return (runtimeProjection(metadata).resolvedRegistryEntries as { category: string; entry: unknown }[]);
264
+ }
265
+
266
+ function readinessFromIr(ir: readonly CorePrivateTransitionIr[]): StaticReadinessReport {
267
+ const transitions = ir.map((entry) => ({ transitionId: entry.transitionId,
268
+ blockers: [...evaluateInstalledReleaseRulesForCore(entry.rules)] }));
269
+ const content = { staticReady: ir.length > 0 && transitions.every((entry) => entry.blockers.length === 0),
270
+ catalogBlockers: ir.length === 0 ? ['static.catalog.empty'] : [], transitions };
271
+ return deepFreeze({ ...content, reportHash: hashCanonical(content) });
272
+ }
273
+
274
+ function semanticOrder(definition: SerializedTransitionDefinition) {
275
+ return { transitionId: definition.transitionId, guards: definition.guards.map((entry) => entry.guardId),
276
+ effects: definition.effects.orderedNodes.map((entry) => ({ id: entry.effectId, ordinal: entry.ordinal, dependsOn: entry.dependsOn })),
277
+ revalidations: definition.admissionBoundary.orderedRevalidations.map((entry) => ({ id: entry.revalidationId, ordinal: entry.ordinal })) };
278
+ }
279
+ function projectPrivateIr(ir: CorePrivateTransitionIr) {
280
+ const runtime = runtimeProjection(stripHashes(ir.serializedDefinition));
281
+ return { transitionId: ir.transitionId, semantics: runtime.semantics, registryClosure: runtime.resolvedRegistryEntries,
282
+ transitionExecutableBinding: projectTransitionBinding(ir.transitionExecutableBinding), authoritySemanticBundle: projectAuthoritySemanticBundle(ir.authoritySemanticBindings),
283
+ credentialSemanticBundle: {
284
+ manifestSha256: credentialClosure.manifestSha256,
285
+ closureSha256: ir.credentialClosureSha256,
286
+ artifacts: correctiveReplanCredentialSchemaArtifacts.map(({ document: _document, ...entry }) => entry),
287
+ validators: correctiveReplanCredentialSchemaValidators.map(({ callable: _callable, ...entry }) => entry),
288
+ functions: ir.credentialSemanticBindings.map(({ callable: _callable, ...entry }) => entry),
289
+ },
290
+ definitionSchema: projectPayloadBinding(ir.definitionSchema), rules: ir.rules.map(projectRule),
291
+ payloadSchemas: ir.payloadSchemas.map(projectPayloadBinding), blockers: evaluateInstalledReleaseRulesForCore(ir.rules) };
292
+ }
293
+ function projectTransitionBinding(entry: TransitionExecutableBinding) { return { transitionId: entry.transitionId, version: entry.version, runtimeSemanticFingerprint: entry.runtimeSemanticFingerprint, implementationId: entry.implementationId, implementationVersion: entry.implementationVersion, guards: entry.guardCallables.map(({ callable: _callable, ...guard }) => guard), executableSlots: entry.executableSlots.map((slot) => ({ path: slot.path, binding: projectExecutable(slot.binding) })) }; }
294
+ function projectExecutable(entry: ExecutableSemanticBinding) { return { id: entry.id, version: entry.version, semanticId: entry.semanticId, semanticVersion: entry.semanticVersion, wiring: entry.wiring ?? null, implementationResult: entry.implementationResult ?? null, projectionWiring: entry.projectionWiring ?? null }; }
295
+ function projectRule(entry: CoreReleaseRuleBinding) { return { id: entry.id, version: entry.version, implementationId: entry.implementationId, implementationVersion: entry.implementationVersion }; }
296
+ function projectPayloadBinding(entry: BoundPayloadSchema) { return { schema: entry.schema, artifact: projectPayloadArtifact(entry.artifact), validator: projectPayloadValidator(entry.validator) }; }
297
+ function projectPayloadArtifact(entry: PayloadSchemaArtifactBinding) { return { id: entry.id, version: entry.version, implementationId: entry.implementationId, implementationVersion: entry.implementationVersion, documentSha256: entry.documentSha256, schemaPointer: entry.schemaPointer, subschemaSha256: entry.subschemaSha256 }; }
298
+ function projectPayloadValidator(entry: PayloadSchemaValidatorBinding) { return { id: entry.id, version: entry.version, implementationId: entry.implementationId, implementationVersion: entry.implementationVersion, artifactSha256: entry.artifactSha256, subschemaSha256: entry.subschemaSha256 }; }
299
+ function stripHashes(definition: SerializedTransitionDefinition) { const { runtimeSemanticFingerprint: _r, semanticFingerprint: _s, definitionManifestHash: _m, ...metadata } = definition; return metadata; }
300
+ function onlyInstalled<T extends { id: string; version: number }>(entries: readonly T[], ref: { id: string; version: number }): T | undefined { const matches = entries.filter((entry) => sameRef(entry, ref)); return matches.length === 1 ? matches[0] : undefined; }
301
+ function sameRef(left: { id: string; version: number }, right: { id: string; version: number }): boolean { return left.id === right.id && left.version === right.version; }
302
+ function refKey(ref: { id: string; version: number }): string { return `${ref.id}@${ref.version}`; }
303
+ function executable(ref: { id: string; version: number }): ExecutableSemanticBinding { const matches = installedExecutables.filter((entry) => sameRef(entry, ref)); if (matches.length !== 1) throw new TypeError(`Installed executable ${refKey(ref)} is not exact-one.`); return matches[0]!; }
304
+ function declaredExecutableSlots(): ExecutableSlot[] {
305
+ const metadata = taskCorrectiveReplanDefinition.metadata;
306
+ const refs: Array<readonly [string, { id: string; version: number }]> = [
307
+ ...metadata.guards.map((guard, index) => [`/guards/${index}/evaluator`, guard.evaluator] as const),
308
+ ...metadata.effects.orderedNodes.map((effect, index) => [`/effects/orderedNodes/${index}/adapter`, effect.adapter] as const),
309
+ ...metadata.admissionBoundary.orderedRevalidations.map((entry, index) => [`/admissionBoundary/orderedRevalidations/${index}/evaluator`, entry.evaluator] as const),
310
+ ...metadata.authority.separationOfDuty.map((constraint, index) => [`/authority/separationOfDuty/${index}/comparator`, constraint.comparator] as const),
311
+ ...metadata.authority.forbiddenCombinations.map((constraint, index) => [`/authority/forbiddenCombinations/${index}/comparator`, constraint.comparator] as const),
312
+ ['/authority/credentialVerifier', { id: 'credential-verifier.corrective-replan.receipt', version: 1 }],
313
+ ['/admissionBoundary/lock/policy', metadata.admissionBoundary.lock.policy],
314
+ ['/atomicity/journal/adapter', metadata.atomicity.journal.mode === 'required' ? metadata.atomicity.journal.adapter : { id: 'journal-adapter.unreachable', version: 1 }],
315
+ ['/atomicity/recovery/adapter', metadata.atomicity.recovery.mode !== 'manual-integrity-stop' ? metadata.atomicity.recovery.adapter : { id: 'recovery-adapter.unreachable', version: 1 }],
316
+ ['/executorAdapter', metadata.executorAdapter], ['/atomicity/executionKey/hashPolicy', metadata.atomicity.executionKey.hashPolicy],
317
+ ['/atomicity/readback/adapter', metadata.atomicity.readback.adapter], ['/atomicity/readback/resultDigestPolicy', metadata.atomicity.readback.resultDigestPolicy],
318
+ ];
319
+ metadata.inputContract.forEach((contract, index) => { const input = transitionSemanticRegistry.inputs.find((entry) => sameRef(entry, contract.input)); if (input?.hashPolicy) refs.push([`/inputContract/${index}/hashPolicy`, input.hashPolicy]); });
320
+ return refs.map(([path, ref]) => ({ path, binding: executable(ref) }));
321
+ }
322
+ function firstDifferencePath(left: unknown, right: unknown, path = ''): string | null {
323
+ if (Object.is(left, right)) return null;
324
+ if (Array.isArray(left) && Array.isArray(right)) { for (let index = 0; index < Math.max(left.length, right.length); index += 1) { const mismatch = firstDifferencePath(left[index], right[index], `${path}/${index}`); if (mismatch) return mismatch; } return null; }
325
+ if (left !== null && right !== null && typeof left === 'object' && typeof right === 'object') { for (const key of [...new Set([...Object.keys(left), ...Object.keys(right)])].filter((entry) => entry !== 'description').sort()) { const mismatch = firstDifferencePath((left as Record<string, unknown>)[key], (right as Record<string, unknown>)[key], `${path}/${key}`); if (mismatch) return mismatch; } return null; }
326
+ return path || '/';
327
+ }
328
+ function requireRecord(catalog: CoreCompiledCatalogHandle): CoreRecord { const record = catalog !== null && typeof catalog === 'object' ? issuedCatalogs.get(catalog) : undefined; if (!record) { const error = new TypeError('Invalid compiled provenance: catalog was not issued by Workflow Core.'); Object.assign(error, { code: 'INVALID_COMPILED_PROVENANCE' }); throw error; } return record; }
329
+ function failed(diagnostics: readonly CompilerDiagnostic[]): CoreCatalogCompileResult { const ordered = orderDiagnostics(diagnostics); return { ok: false, diagnostics: ordered, diagnosticsHash: hashCanonical(ordered) }; }
330
+ function orderDiagnostics(diagnostics: readonly CompilerDiagnostic[]) { return [...diagnostics].sort((left, right) => `${left.path}\0${left.diagnosticId}\0${left.ref ?? ''}`.localeCompare(`${right.path}\0${right.diagnosticId}\0${right.ref ?? ''}`)); }
package/src/ulid.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { randomBytes } from 'node:crypto';
2
+
3
+ const ALPHABET = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
4
+
5
+ function encode(value: bigint, length: number): string {
6
+ let result = '';
7
+ for (let index = 0; index < length; index += 1) {
8
+ result = ALPHABET[Number(value & 31n)] + result;
9
+ value >>= 5n;
10
+ }
11
+ return result;
12
+ }
13
+
14
+ export function createUlid(now = Date.now()): string {
15
+ const timestamp = encode(BigInt(now), 10);
16
+ const random = randomBytes(10);
17
+ let randomValue = 0n;
18
+ for (const byte of random) randomValue = (randomValue << 8n) | BigInt(byte);
19
+ return `${timestamp}${encode(randomValue, 16)}`;
20
+ }
21
+
22
+ export function createEntityId(prefix: 'DISC' | 'TASK' | 'MS' | 'DGR', now = Date.now()): string {
23
+ return `${prefix}-${createUlid(now)}`;
24
+ }
package/src/version.ts ADDED
@@ -0,0 +1,2 @@
1
+ export const PACKAGE_NAME = 'codex-workflow-v2';
2
+ export const PACKAGE_VERSION = '2.0.0-beta.14';
@@ -0,0 +1,109 @@
1
+ import { isCliCommand } from './cli-actions.js';
2
+ import { hashCanonical } from './lifecycle/fingerprint.js';
3
+
4
+ type ObjectValue = Record<string, unknown>;
5
+ const object = (value: unknown): ObjectValue =>
6
+ value !== null && typeof value === 'object' && !Array.isArray(value) ? value as ObjectValue : {};
7
+
8
+ export function nextBetaPatchVersion(version: string): string {
9
+ const beta = /^(.*-beta(?:\.\d+)*\.)(\d+)$/u.exec(version);
10
+ if (beta) return `${beta[1]}${Number(beta[2]) + 1}`;
11
+ const stable = /^(\d+)\.(\d+)\.(\d+)$/u.exec(version);
12
+ if (stable) return `${stable[1]}.${stable[2]}.${Number(stable[3]) + 1}`;
13
+ throw new TypeError(`Workflow package version has no incrementable patch: ${version}`);
14
+ }
15
+
16
+ function requiresHuman(next: ObjectValue): boolean {
17
+ const visit = (value: unknown): boolean => {
18
+ if (Array.isArray(value)) return value.some(visit);
19
+ const record = object(value);
20
+ return Object.entries(record).some(([key, child]) =>
21
+ ((key === 'humanApprovalRequired' || key === 'productDecisionRequired') && child === true)
22
+ || (key === 'requiredHumanGate' && child !== null && child !== undefined)
23
+ || visit(child));
24
+ };
25
+ return visit(next);
26
+ }
27
+
28
+ /**
29
+ * Describes a cross-project incident when Core has no executable, repair, or Human route.
30
+ * The descriptor grants no authority: gateway/App orchestration owns chat creation and release work.
31
+ */
32
+ export function withWorkflowBlockerRoute(next: ObjectValue, packageVersion: string): ObjectValue {
33
+ const observation = object(next.observation);
34
+ const route = object(next.route);
35
+ const blockedAction = next.blockedAction;
36
+ if (next.action !== 'doctor'
37
+ || typeof blockedAction !== 'string'
38
+ || !isCliCommand(blockedAction)
39
+ || observation.kind !== 'assessment'
40
+ || observation.availableRepairTransitionId !== null
41
+ || observation.repair !== null
42
+ || route.actionSupport !== 'unwitnessed'
43
+ || requiresHuman(next)) return next;
44
+
45
+ const patchVersion = nextBetaPatchVersion(packageVersion);
46
+ const source = {
47
+ scope: typeof next.scope === 'string' ? next.scope : null,
48
+ id: typeof next.id === 'string' ? next.id : null,
49
+ revision: Number.isInteger(next.revision) ? next.revision : null,
50
+ status: typeof next.status === 'string' ? next.status : null,
51
+ stepId: typeof next.stepId === 'string' ? next.stepId : null,
52
+ action: 'doctor',
53
+ blockedAction,
54
+ routeId: typeof route.routeId === 'string' ? route.routeId : null,
55
+ routeFingerprint: typeof route.routeFingerprint === 'string' ? route.routeFingerprint : null,
56
+ reasonCodes: Array.isArray(observation.reasonCodes)
57
+ ? observation.reasonCodes.filter((value): value is string => typeof value === 'string')
58
+ : [],
59
+ };
60
+ const blockerId = hashCanonical({ domain: 'codex-workflow/workflow-blocker-route/v1', packageVersion, source });
61
+ return {
62
+ ...next,
63
+ workflowBlockerRoute: {
64
+ schemaVersion: 1,
65
+ state: 'gateway-confirmation-required',
66
+ blockerId,
67
+ packageVersion,
68
+ source,
69
+ confirmation: {
70
+ required: true,
71
+ checks: [
72
+ 'Refresh status and next without mutation.',
73
+ 'Confirm that no executable Core, repair, or Human route exists.',
74
+ 'Confirm that the responsible product chat is not actively progressing the blocked action.',
75
+ ],
76
+ },
77
+ dispatch: {
78
+ owner: 'originating-coordinator-via-gateway',
79
+ projectName: 'codex-workflow-v2',
80
+ chatType: 'workflow-blocker',
81
+ title: patchVersion,
82
+ modelRequest: { phase: 'implementation', complexity: 'complex', highRisk: false },
83
+ requiredPacketFields: [
84
+ 'blockerId', 'packageVersion', 'sourceProject', 'sourceThreadId', 'source',
85
+ 'freshStatusHash', 'freshNextHash', 'repositoryState', 'expectedContinuation',
86
+ ],
87
+ },
88
+ patchChatResponsibilities: [
89
+ 'Reproduce and identify the state-machine cause.',
90
+ 'Implement the smallest general fix and regression coverage.',
91
+ 'Run release checks and publish the exact patch version.',
92
+ 'Send a closed callback report to the originating Coordinator without being polled.',
93
+ ],
94
+ callback: {
95
+ target: 'originating-coordinator-thread',
96
+ requiredFields: [
97
+ 'blockerId', 'publishedVersion', 'verification', 'downstreamUpdateRoute',
98
+ 'expectedFreshNext', 'residualBlockers',
99
+ ],
100
+ },
101
+ authority: {
102
+ core: ['describe', 'bind-current-navigation', 'suggest-patch-version'],
103
+ coordinator: ['confirm', 'dispatch', 'verify-created-instructions', 'receive-callback', 'resume-product'],
104
+ patchChat: ['analyze', 'implement', 'verify', 'publish', 'send-callback'],
105
+ coreEffects: 'none',
106
+ },
107
+ },
108
+ };
109
+ }