@kbediako/codex-orchestrator 0.1.38 → 0.2.1

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 (311) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +46 -317
  3. package/bin/codex-orchestrator.js +161 -0
  4. package/codex.orchestrator.json +149 -13
  5. package/dist/bin/codex-orchestrator.js +797 -1154
  6. package/dist/orchestrator/src/cli/adapters/CommandBuilder.js +50 -0
  7. package/dist/orchestrator/src/cli/adapters/CommandPlanner.js +22 -4
  8. package/dist/orchestrator/src/cli/adapters/CommandReviewer.js +3 -3
  9. package/dist/orchestrator/src/cli/adapters/CommandTester.js +2 -2
  10. package/dist/orchestrator/src/cli/adapters/cloudFailureDiagnostics.js +295 -11
  11. package/dist/orchestrator/src/cli/coStatusAttachCliShell.js +402 -0
  12. package/dist/orchestrator/src/cli/coStatusCliShell.js +451 -0
  13. package/dist/orchestrator/src/cli/coStatusOperatorAutopilotCliShell.js +120 -0
  14. package/dist/orchestrator/src/cli/codexCliShell.js +119 -0
  15. package/dist/orchestrator/src/cli/codexDefaultsSetup.js +265 -36
  16. package/dist/orchestrator/src/cli/config/delegationConfig.js +317 -5
  17. package/dist/orchestrator/src/cli/config/repoConfigPolicy.js +2 -3
  18. package/dist/orchestrator/src/cli/config/userConfig.js +28 -13
  19. package/dist/orchestrator/src/cli/control/authenticatedControlRouteGate.js +69 -0
  20. package/dist/orchestrator/src/cli/control/authenticatedRouteComposition.js +267 -0
  21. package/dist/orchestrator/src/cli/control/authenticatedRouteController.js +5 -0
  22. package/dist/orchestrator/src/cli/control/authenticatedRouteDispatcher.js +41 -0
  23. package/dist/orchestrator/src/cli/control/compatibilityIssuePresenter.js +1035 -0
  24. package/dist/orchestrator/src/cli/control/confirmationApproveController.js +62 -0
  25. package/dist/orchestrator/src/cli/control/confirmationCreateController.js +69 -0
  26. package/dist/orchestrator/src/cli/control/confirmationIssueConsumeController.js +43 -0
  27. package/dist/orchestrator/src/cli/control/confirmationListController.js +22 -0
  28. package/dist/orchestrator/src/cli/control/confirmationValidateController.js +58 -0
  29. package/dist/orchestrator/src/cli/control/confirmations.js +25 -3
  30. package/dist/orchestrator/src/cli/control/controlActionCancelConfirmation.js +65 -0
  31. package/dist/orchestrator/src/cli/control/controlActionController.js +77 -0
  32. package/dist/orchestrator/src/cli/control/controlActionControllerSequencing.js +161 -0
  33. package/dist/orchestrator/src/cli/control/controlActionExecution.js +142 -0
  34. package/dist/orchestrator/src/cli/control/controlActionFinalization.js +43 -0
  35. package/dist/orchestrator/src/cli/control/controlActionOutcome.js +60 -0
  36. package/dist/orchestrator/src/cli/control/controlActionPreflight.js +476 -0
  37. package/dist/orchestrator/src/cli/control/controlAuthenticatedRouteHandoff.js +57 -0
  38. package/dist/orchestrator/src/cli/control/controlBootstrapAssembly.js +39 -0
  39. package/dist/orchestrator/src/cli/control/controlBootstrapMetadataPersistence.js +16 -0
  40. package/dist/orchestrator/src/cli/control/controlEventTransport.js +49 -0
  41. package/dist/orchestrator/src/cli/control/controlExpiryLifecycle.js +102 -0
  42. package/dist/orchestrator/src/cli/control/controlHostOwnership.js +480 -0
  43. package/dist/orchestrator/src/cli/control/controlHostSupervision.js +630 -0
  44. package/dist/orchestrator/src/cli/control/controlOversightFacade.js +8 -0
  45. package/dist/orchestrator/src/cli/control/controlOversightReadContract.js +1 -0
  46. package/dist/orchestrator/src/cli/control/controlOversightReadService.js +16 -0
  47. package/dist/orchestrator/src/cli/control/controlOversightUpdateContract.js +1 -0
  48. package/dist/orchestrator/src/cli/control/controlPersistenceFiles.js +6 -0
  49. package/dist/orchestrator/src/cli/control/controlQuestionChildResolution.js +18 -0
  50. package/dist/orchestrator/src/cli/control/controlRequestContext.js +42 -0
  51. package/dist/orchestrator/src/cli/control/controlRequestController.js +9 -0
  52. package/dist/orchestrator/src/cli/control/controlRequestPredispatch.js +17 -0
  53. package/dist/orchestrator/src/cli/control/controlRequestRouteDispatch.js +44 -0
  54. package/dist/orchestrator/src/cli/control/controlRuntime.js +1003 -0
  55. package/dist/orchestrator/src/cli/control/controlServer.js +23 -1456
  56. package/dist/orchestrator/src/cli/control/controlServerAuditAndErrorHelpers.js +115 -0
  57. package/dist/orchestrator/src/cli/control/controlServerAuthenticatedRouteBranch.js +29 -0
  58. package/dist/orchestrator/src/cli/control/controlServerBootstrapLifecycle.js +30 -0
  59. package/dist/orchestrator/src/cli/control/controlServerBootstrapStartSequence.js +21 -0
  60. package/dist/orchestrator/src/cli/control/controlServerOwnedRuntimeLifecycle.js +67 -0
  61. package/dist/orchestrator/src/cli/control/controlServerPublicLifecycle.js +756 -0
  62. package/dist/orchestrator/src/cli/control/controlServerPublicRouteHelpers.js +86 -0
  63. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceLifecycle.js +25 -0
  64. package/dist/orchestrator/src/cli/control/controlServerReadyInstanceStartup.js +18 -0
  65. package/dist/orchestrator/src/cli/control/controlServerRequestBodyHelpers.js +37 -0
  66. package/dist/orchestrator/src/cli/control/controlServerRequestShell.js +40 -0
  67. package/dist/orchestrator/src/cli/control/controlServerRequestShellBinding.js +17 -0
  68. package/dist/orchestrator/src/cli/control/controlServerSeedLoading.js +27 -0
  69. package/dist/orchestrator/src/cli/control/controlServerSeededRuntimeAssembly.js +186 -0
  70. package/dist/orchestrator/src/cli/control/controlServerStartupInputPreparation.js +31 -0
  71. package/dist/orchestrator/src/cli/control/controlServerStartupSequence.js +49 -0
  72. package/dist/orchestrator/src/cli/control/controlState.js +233 -2
  73. package/dist/orchestrator/src/cli/control/controlStatusDashboard.js +1904 -0
  74. package/dist/orchestrator/src/cli/control/controlTelegramBridgeBootstrapLifecycle.js +22 -0
  75. package/dist/orchestrator/src/cli/control/controlTelegramBridgeLifecycle.js +67 -0
  76. package/dist/orchestrator/src/cli/control/controlTelegramBridgeOversightFacadeFactory.js +8 -0
  77. package/dist/orchestrator/src/cli/control/controlTelegramCommandController.js +49 -0
  78. package/dist/orchestrator/src/cli/control/controlTelegramDispatchRead.js +40 -0
  79. package/dist/orchestrator/src/cli/control/controlTelegramPollingController.js +89 -0
  80. package/dist/orchestrator/src/cli/control/controlTelegramProjectionNotificationController.js +29 -0
  81. package/dist/orchestrator/src/cli/control/controlTelegramPushState.js +63 -0
  82. package/dist/orchestrator/src/cli/control/controlTelegramQuestionRead.js +13 -0
  83. package/dist/orchestrator/src/cli/control/controlTelegramReadController.js +216 -0
  84. package/dist/orchestrator/src/cli/control/controlTelegramUpdateHandler.js +63 -0
  85. package/dist/orchestrator/src/cli/control/controlWatcher.js +73 -5
  86. package/dist/orchestrator/src/cli/control/delegationRegisterController.js +35 -0
  87. package/dist/orchestrator/src/cli/control/dynamicToolBridgePolicy.js +139 -0
  88. package/dist/orchestrator/src/cli/control/eventsSseController.js +12 -0
  89. package/dist/orchestrator/src/cli/control/linearBudgetState.js +1789 -0
  90. package/dist/orchestrator/src/cli/control/linearDispatchSource.js +1137 -0
  91. package/dist/orchestrator/src/cli/control/linearGraphqlClient.js +150 -0
  92. package/dist/orchestrator/src/cli/control/linearRateLimit.js +102 -0
  93. package/dist/orchestrator/src/cli/control/linearWebhookController.js +499 -0
  94. package/dist/orchestrator/src/cli/control/liveLinearAdvisoryRuntime.js +70 -0
  95. package/dist/orchestrator/src/cli/control/observabilityApiController.js +173 -0
  96. package/dist/orchestrator/src/cli/control/observabilityReadModel.js +500 -0
  97. package/dist/orchestrator/src/cli/control/observabilitySurface.js +284 -0
  98. package/dist/orchestrator/src/cli/control/observabilityUpdateNotifier.js +22 -0
  99. package/dist/orchestrator/src/cli/control/operatorDashboardPresenter.js +252 -0
  100. package/dist/orchestrator/src/cli/control/providerAgentCapacity.js +70 -0
  101. package/dist/orchestrator/src/cli/control/providerControlHostFreshnessGauge.js +1068 -0
  102. package/dist/orchestrator/src/cli/control/providerIntakeState.js +473 -0
  103. package/dist/orchestrator/src/cli/control/providerIssueHandoff.js +6811 -0
  104. package/dist/orchestrator/src/cli/control/providerIssueObservability.js +1348 -0
  105. package/dist/orchestrator/src/cli/control/providerIssueRetryQueue.js +84 -0
  106. package/dist/orchestrator/src/cli/control/providerLinearRuntimeProof.js +588 -0
  107. package/dist/orchestrator/src/cli/control/providerLinearScreenshotProof.js +473 -0
  108. package/dist/orchestrator/src/cli/control/providerLinearWorkerTruth.js +383 -0
  109. package/dist/orchestrator/src/cli/control/providerLinearWorkflowAudit.js +254 -0
  110. package/dist/orchestrator/src/cli/control/providerLinearWorkflowFacade.js +5573 -0
  111. package/dist/orchestrator/src/cli/control/providerLinearWorkflowStates.js +115 -0
  112. package/dist/orchestrator/src/cli/control/providerMergeCloseout.js +1868 -0
  113. package/dist/orchestrator/src/cli/control/providerOperatorAutopilot.js +1580 -0
  114. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLifecycle.js +154 -0
  115. package/dist/orchestrator/src/cli/control/providerOperatorAutopilotLocalRolloutExecution.js +1006 -0
  116. package/dist/orchestrator/src/cli/control/providerPollingHealth.js +435 -0
  117. package/dist/orchestrator/src/cli/control/providerTerminalCleanup.js +516 -0
  118. package/dist/orchestrator/src/cli/control/providerWorkerHosts.js +191 -0
  119. package/dist/orchestrator/src/cli/control/providerWorkflowConfigStore.js +515 -0
  120. package/dist/orchestrator/src/cli/control/questionChildResolutionAdapter.js +361 -0
  121. package/dist/orchestrator/src/cli/control/questionQueueController.js +181 -0
  122. package/dist/orchestrator/src/cli/control/questionReadRetryDeduplication.js +9 -0
  123. package/dist/orchestrator/src/cli/control/questionReadSequence.js +10 -0
  124. package/dist/orchestrator/src/cli/control/securityViolationController.js +27 -0
  125. package/dist/orchestrator/src/cli/control/selectedRunProjection.js +1885 -0
  126. package/dist/orchestrator/src/cli/control/telegramOversightApiClient.js +48 -0
  127. package/dist/orchestrator/src/cli/control/telegramOversightBridge.js +180 -0
  128. package/dist/orchestrator/src/cli/control/telegramOversightBridgeProjectionDeliveryQueue.js +25 -0
  129. package/dist/orchestrator/src/cli/control/telegramOversightBridgeRuntimeLifecycle.js +45 -0
  130. package/dist/orchestrator/src/cli/control/telegramOversightBridgeStateStore.js +77 -0
  131. package/dist/orchestrator/src/cli/control/telegramOversightControlActionApiClient.js +45 -0
  132. package/dist/orchestrator/src/cli/control/trackerDispatchPilot.js +439 -0
  133. package/dist/orchestrator/src/cli/control/uiDataController.js +34 -0
  134. package/dist/orchestrator/src/cli/control/uiSessionController.js +100 -0
  135. package/dist/orchestrator/src/cli/controlHostCliShell.js +860 -0
  136. package/dist/orchestrator/src/cli/controlHostFreshnessGaugeCliShell.js +129 -0
  137. package/dist/orchestrator/src/cli/controlHostSupervisionCliShell.js +2127 -0
  138. package/dist/orchestrator/src/cli/delegationCliShell.js +62 -0
  139. package/dist/orchestrator/src/cli/delegationServer.js +567 -678
  140. package/dist/orchestrator/src/cli/delegationServerCliShell.js +52 -0
  141. package/dist/orchestrator/src/cli/delegationServerQuestionFlowShell.js +228 -0
  142. package/dist/orchestrator/src/cli/delegationServerToolDispatchShell.js +411 -0
  143. package/dist/orchestrator/src/cli/delegationServerTransport.js +274 -0
  144. package/dist/orchestrator/src/cli/delegationSetup.js +51 -171
  145. package/dist/orchestrator/src/cli/devtoolsCliShell.js +34 -0
  146. package/dist/orchestrator/src/cli/doctor.js +678 -164
  147. package/dist/orchestrator/src/cli/doctorCliRequestShell.js +72 -0
  148. package/dist/orchestrator/src/cli/doctorCliShell.js +138 -0
  149. package/dist/orchestrator/src/cli/doctorUsage.js +119 -15
  150. package/dist/orchestrator/src/cli/exec/experience.js +16 -2
  151. package/dist/orchestrator/src/cli/exec/summary.js +3 -0
  152. package/dist/orchestrator/src/cli/execCliShell.js +51 -0
  153. package/dist/orchestrator/src/cli/flowCliRequestShell.js +44 -0
  154. package/dist/orchestrator/src/cli/flowCliShell.js +239 -0
  155. package/dist/orchestrator/src/cli/frontendTestCliRequestShell.js +80 -0
  156. package/dist/orchestrator/src/cli/frontendTestCliShell.js +41 -0
  157. package/dist/orchestrator/src/cli/init.js +95 -1
  158. package/dist/orchestrator/src/cli/initCliShell.js +50 -0
  159. package/dist/orchestrator/src/cli/linearCliShell.js +1200 -0
  160. package/dist/orchestrator/src/cli/mcpEnableCliShell.js +132 -0
  161. package/dist/orchestrator/src/cli/metrics/metricsAggregator.js +3 -2
  162. package/dist/orchestrator/src/cli/metrics/metricsRecorder.js +56 -0
  163. package/dist/orchestrator/src/cli/orchestrator.js +66 -1376
  164. package/dist/orchestrator/src/cli/planCliShell.js +19 -0
  165. package/dist/orchestrator/src/cli/prCliShell.js +41 -0
  166. package/dist/orchestrator/src/cli/providerLinearChildLanePhaseContract.js +204 -0
  167. package/dist/orchestrator/src/cli/providerLinearChildLaneRunner.js +1835 -0
  168. package/dist/orchestrator/src/cli/providerLinearChildLaneShell.js +2420 -0
  169. package/dist/orchestrator/src/cli/providerLinearChildStreamShell.js +385 -0
  170. package/dist/orchestrator/src/cli/providerLinearWorkerRunner.js +6834 -0
  171. package/dist/orchestrator/src/cli/resumeCliShell.js +14 -0
  172. package/dist/orchestrator/src/cli/reviewCliLaunchShell.js +72 -0
  173. package/dist/orchestrator/src/cli/rlm/alignment.js +3 -3
  174. package/dist/orchestrator/src/cli/rlm/context.js +94 -7
  175. package/dist/orchestrator/src/cli/rlm/rlmCodexRuntimeShell.js +546 -0
  176. package/dist/orchestrator/src/cli/rlm/symbolic.js +4 -2
  177. package/dist/orchestrator/src/cli/rlmCliRequestShell.js +42 -0
  178. package/dist/orchestrator/src/cli/rlmCompletionCliShell.js +46 -0
  179. package/dist/orchestrator/src/cli/rlmLaunchCliShell.js +51 -0
  180. package/dist/orchestrator/src/cli/rlmRunner.js +83 -523
  181. package/dist/orchestrator/src/cli/run/blockMemory.js +500 -0
  182. package/dist/orchestrator/src/cli/run/manifest.js +410 -73
  183. package/dist/orchestrator/src/cli/run/manifestPersister.js +45 -14
  184. package/dist/orchestrator/src/cli/run/runMemoryController.js +216 -0
  185. package/dist/orchestrator/src/cli/run/source0.js +690 -0
  186. package/dist/orchestrator/src/cli/run/workspacePath.js +101 -0
  187. package/dist/orchestrator/src/cli/runtime/mode.js +2 -1
  188. package/dist/orchestrator/src/cli/runtime/provider.js +39 -2
  189. package/dist/orchestrator/src/cli/selfCheckCliShell.js +12 -0
  190. package/dist/orchestrator/src/cli/services/commandRunner.js +698 -18
  191. package/dist/orchestrator/src/cli/services/execRuntime.js +66 -1
  192. package/dist/orchestrator/src/cli/services/orchestratorAutoScoutEvidenceRecorder.js +71 -0
  193. package/dist/orchestrator/src/cli/services/orchestratorCloudBranchResolution.js +8 -0
  194. package/dist/orchestrator/src/cli/services/orchestratorCloudEnvironmentResolution.js +22 -0
  195. package/dist/orchestrator/src/cli/services/orchestratorCloudExecutionLifecycleShell.js +39 -0
  196. package/dist/orchestrator/src/cli/services/orchestratorCloudPromptBuilder.js +37 -0
  197. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteFallbackContract.js +45 -0
  198. package/dist/orchestrator/src/cli/services/orchestratorCloudRouteShell.js +36 -0
  199. package/dist/orchestrator/src/cli/services/orchestratorCloudTargetExecutor.js +277 -0
  200. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycle.js +98 -0
  201. package/dist/orchestrator/src/cli/services/orchestratorControlPlaneLifecycleShell.js +54 -0
  202. package/dist/orchestrator/src/cli/services/orchestratorExecutionLifecycle.js +112 -0
  203. package/dist/orchestrator/src/cli/services/orchestratorExecutionModePolicy.js +27 -0
  204. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteAdapterShell.js +59 -0
  205. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteDecisionShell.js +57 -0
  206. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouteState.js +21 -0
  207. package/dist/orchestrator/src/cli/services/orchestratorExecutionRouter.js +2 -0
  208. package/dist/orchestrator/src/cli/services/orchestratorLocalPipelineExecutor.js +149 -0
  209. package/dist/orchestrator/src/cli/services/orchestratorLocalRouteShell.js +63 -0
  210. package/dist/orchestrator/src/cli/services/orchestratorPlanShell.js +54 -0
  211. package/dist/orchestrator/src/cli/services/orchestratorPlanTargetTracker.js +16 -0
  212. package/dist/orchestrator/src/cli/services/orchestratorResumePreparationShell.js +84 -0
  213. package/dist/orchestrator/src/cli/services/orchestratorResumeTokenValidation.js +15 -0
  214. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleCompletion.js +31 -0
  215. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleExecutionRegistration.js +37 -0
  216. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleOrchestrationShell.js +83 -0
  217. package/dist/orchestrator/src/cli/services/orchestratorRunLifecycleTaskManagerShell.js +37 -0
  218. package/dist/orchestrator/src/cli/services/orchestratorRuntimeManifestMutation.js +20 -0
  219. package/dist/orchestrator/src/cli/services/orchestratorStartPreparationShell.js +56 -0
  220. package/dist/orchestrator/src/cli/services/orchestratorStatusShell.js +70 -0
  221. package/dist/orchestrator/src/cli/services/pipelineResolver.js +7 -3
  222. package/dist/orchestrator/src/cli/services/plannerMemory.js +119 -0
  223. package/dist/orchestrator/src/cli/services/runPreparation.js +7 -3
  224. package/dist/orchestrator/src/cli/services/runSummaryWriter.js +9 -0
  225. package/dist/orchestrator/src/cli/setupBootstrapShell.js +114 -0
  226. package/dist/orchestrator/src/cli/setupCliShell.js +51 -0
  227. package/dist/orchestrator/src/cli/skillsCliShell.js +56 -0
  228. package/dist/orchestrator/src/cli/startCliRequestShell.js +53 -0
  229. package/dist/orchestrator/src/cli/startCliShell.js +68 -0
  230. package/dist/orchestrator/src/cli/statusCliShell.js +22 -0
  231. package/dist/orchestrator/src/cli/utils/authProvenanceFingerprint.js +27 -0
  232. package/dist/orchestrator/src/cli/utils/cloudPreflight.js +285 -7
  233. package/dist/orchestrator/src/cli/utils/codexFeatures.js +60 -0
  234. package/dist/orchestrator/src/cli/utils/delegationConfigParser.js +250 -0
  235. package/dist/orchestrator/src/cli/utils/delegationMcpHealth.js +1382 -0
  236. package/dist/orchestrator/src/cli/utils/devtools.js +2 -54
  237. package/dist/orchestrator/src/cli/utils/mcpServerEntry.js +53 -0
  238. package/dist/orchestrator/src/cli/utils/packageProgramResolver.js +151 -0
  239. package/dist/orchestrator/src/cli/utils/providerOverrideEnv.js +71 -0
  240. package/dist/orchestrator/src/cli/utils/trailingJsonObject.js +59 -0
  241. package/dist/orchestrator/src/learning/crystalizer.js +2 -2
  242. package/dist/orchestrator/src/manager.js +74 -4
  243. package/dist/orchestrator/src/persistence/ExperienceStore.js +233 -49
  244. package/dist/orchestrator/src/persistence/TaskStateStore.js +6 -6
  245. package/dist/orchestrator/src/persistence/lockFile.js +70 -4
  246. package/dist/orchestrator/src/persistence/sanitizeIdentifier.js +39 -0
  247. package/dist/orchestrator/src/sync/createCloudSyncWorker.js +3 -2
  248. package/dist/orchestrator/src/utils/atomicWrite.js +17 -2
  249. package/dist/packages/orchestrator/src/exec/unified-exec.js +99 -6
  250. package/dist/packages/orchestrator/src/instructions/promptPacks.js +150 -19
  251. package/dist/packages/sdk-node/src/orchestrator.js +137 -13
  252. package/dist/packages/shared/config/designConfig.js +8 -1
  253. package/dist/packages/shared/streams/stdio.js +1 -1
  254. package/dist/scripts/design/pipeline/permit.js +15 -0
  255. package/dist/scripts/lib/docs-catalog.js +399 -0
  256. package/dist/scripts/lib/docs-helpers.js +87 -5
  257. package/dist/scripts/lib/pr-watch-merge.js +1088 -80
  258. package/dist/scripts/lib/provider-run-contract.js +26 -0
  259. package/dist/scripts/lib/review-command-intent-classification.js +532 -0
  260. package/dist/scripts/lib/review-command-probe-classification.js +385 -0
  261. package/dist/scripts/lib/review-execution-boundary-preflight.js +279 -0
  262. package/dist/scripts/lib/review-execution-runtime.js +753 -0
  263. package/dist/scripts/lib/review-execution-state.js +1144 -0
  264. package/dist/scripts/lib/review-execution-telemetry.js +215 -0
  265. package/dist/scripts/lib/review-inspection-target-parsing.js +78 -0
  266. package/dist/scripts/lib/review-launch-attempt.js +601 -0
  267. package/dist/scripts/lib/review-meta-surface-boundary-analysis.js +300 -0
  268. package/dist/scripts/lib/review-meta-surface-normalization.js +746 -0
  269. package/dist/scripts/lib/review-non-interactive-handoff.js +61 -0
  270. package/dist/scripts/lib/review-prompt-context.js +376 -0
  271. package/dist/scripts/lib/review-scope-advisory.js +286 -0
  272. package/dist/scripts/lib/review-scope-paths.js +123 -0
  273. package/dist/scripts/lib/review-shell-command-parser.js +389 -0
  274. package/dist/scripts/lib/review-shell-env-interpreter.js +340 -0
  275. package/dist/scripts/lib/run-manifests.js +192 -36
  276. package/dist/scripts/lib/spark-policy-classifier.js +593 -0
  277. package/dist/scripts/run-review.js +507 -1777
  278. package/docs/README.md +43 -20
  279. package/docs/book/README.md +19 -0
  280. package/docs/book/codex-cli-0124-adoption.md +68 -0
  281. package/docs/book/local-hook-impact.md +73 -0
  282. package/docs/book/operations.md +60 -0
  283. package/docs/book/public-posture.md +34 -0
  284. package/docs/book/setup.md +91 -0
  285. package/docs/book/skills.md +11 -0
  286. package/docs/guides/codex-version-policy.md +104 -0
  287. package/docs/public/downstream-setup.md +113 -0
  288. package/docs/public/provider-onboarding.md +173 -0
  289. package/package.json +23 -10
  290. package/plugins/codex-orchestrator/.codex-plugin/plugin.json +30 -0
  291. package/plugins/codex-orchestrator/.mcp.json +13 -0
  292. package/plugins/codex-orchestrator/launcher.mjs +361 -0
  293. package/schemas/manifest.json +411 -0
  294. package/skills/README.md +26 -0
  295. package/skills/collab-subagents-first/SKILL.md +1 -1
  296. package/skills/delegation-usage/DELEGATION_GUIDE.md +30 -12
  297. package/skills/delegation-usage/SKILL.md +25 -14
  298. package/skills/land/SKILL.md +77 -0
  299. package/skills/linear/SKILL.md +255 -0
  300. package/skills/release/SKILL.md +47 -3
  301. package/skills/standalone-review/SKILL.md +6 -1
  302. package/templates/README.md +4 -2
  303. package/templates/codex/.codex/agents/awaiter-high.toml +2 -2
  304. package/templates/codex/.codex/agents/worker-complex.toml +1 -1
  305. package/templates/codex/.codex/config.toml +3 -4
  306. package/templates/codex/.codex/providers/README.md +13 -0
  307. package/templates/codex/.codex/providers/control.example.json +18 -0
  308. package/templates/codex/.codex/providers/provider.env.example +15 -0
  309. package/templates/codex/AGENTS.md +15 -8
  310. package/templates/codex/mcp-client.json +5 -1
  311. package/docs/assets/setup.gif +0 -0
@@ -5,11 +5,13 @@ export class CommandBuilder {
5
5
  }
6
6
  async build(input) {
7
7
  const result = await this.executePipeline(input);
8
+ const failure = resolveManifestFailure(result.manifest);
8
9
  return {
9
10
  subtaskId: input.target.id,
10
11
  artifacts: [
11
12
  { path: result.manifestPath, description: 'CLI run manifest' },
12
13
  { path: result.logPath, description: 'Runner log (ndjson)' },
14
+ ...collectCommandErrorArtifacts(result.manifest.commands),
13
15
  ...(result.manifest.cloud_execution?.diff_path
14
16
  ? [{ path: result.manifest.cloud_execution.diff_path, description: 'Cloud diff artifact' }]
15
17
  : [])
@@ -18,6 +20,8 @@ export class CommandBuilder {
18
20
  runId: input.runId,
19
21
  success: result.success,
20
22
  notes: result.notes.join('\n') || undefined,
23
+ failureStage: failure.stage,
24
+ failureArtifactPath: failure.artifactPath,
21
25
  cloudExecution: result.manifest.cloud_execution
22
26
  ? {
23
27
  taskId: result.manifest.cloud_execution.task_id,
@@ -42,3 +46,49 @@ export class CommandBuilder {
42
46
  };
43
47
  }
44
48
  }
49
+ function resolveManifestFailure(manifest) {
50
+ const statusDetailStage = extractStageFromStatusDetail(manifest.status_detail);
51
+ const cloudStage = extractCloudStageFromStatusDetail(manifest.status_detail);
52
+ const fallbackFailedCommand = statusDetailStage || hasStatusDetail(manifest.status_detail) ? null : firstFailedCommand(manifest.commands);
53
+ const cloudFailedStage = cloudStage && hasFailedCommand(manifest.commands, cloudStage) ? cloudStage : null;
54
+ const stage = statusDetailStage ?? cloudFailedStage ?? fallbackFailedCommand?.id ?? null;
55
+ const artifactPath = stage ? findFailedCommandErrorArtifact(manifest.commands, stage) : null;
56
+ return { stage, artifactPath };
57
+ }
58
+ function hasStatusDetail(statusDetail) {
59
+ return statusDetail != null && statusDetail.trim().length > 0;
60
+ }
61
+ function extractStageFromStatusDetail(statusDetail) {
62
+ const match = /^(?:stage|subpipeline):(.+):(?:failed|error)$/.exec(statusDetail ?? '');
63
+ return match?.[1] ?? null;
64
+ }
65
+ function extractCloudStageFromStatusDetail(statusDetail) {
66
+ const match = /^cloud:(.+):(?:failed|error)$/.exec(statusDetail ?? '');
67
+ return match?.[1] ?? null;
68
+ }
69
+ function firstFailedCommand(commands) {
70
+ return commands.find((command) => command.status === 'failed') ?? null;
71
+ }
72
+ function hasFailedCommand(commands, stage) {
73
+ return commands.some((command) => command.status === 'failed' && command.id === stage);
74
+ }
75
+ function findFailedCommandErrorArtifact(commands, stage) {
76
+ const matching = commands.find((command) => command.status === 'failed' && command.id === stage && command.error_file);
77
+ return matching?.error_file ?? null;
78
+ }
79
+ function collectCommandErrorArtifacts(commands) {
80
+ const seen = new Set();
81
+ const artifacts = [];
82
+ for (const command of commands) {
83
+ const errorFile = command.error_file;
84
+ if (!errorFile || seen.has(errorFile)) {
85
+ continue;
86
+ }
87
+ seen.add(errorFile);
88
+ artifacts.push({
89
+ path: errorFile,
90
+ description: `Command error artifact (${command.id})`
91
+ });
92
+ }
93
+ return artifacts;
94
+ }
@@ -1,16 +1,18 @@
1
1
  import { PLANNER_EXECUTION_MODE_PARSER, resolveRequiresCloudPolicy } from '../../utils/executionMode.js';
2
+ import { selectTaskMemoryRefs } from '../services/plannerMemory.js';
2
3
  export class CommandPlanner {
3
4
  pipeline;
4
5
  options;
5
6
  cachedPlan = null;
7
+ cachedPlanKey = null;
6
8
  constructor(pipeline, options = {}) {
7
9
  this.pipeline = pipeline;
8
10
  this.options = options;
9
11
  }
10
12
  async plan(task) {
11
- void task;
12
- if (!this.cachedPlan) {
13
- const items = this.pipeline.stages.map((stage, index) => this.buildPlanItem(stage, index));
13
+ const planKey = buildPlanCacheKey(task);
14
+ if (!this.cachedPlan || this.cachedPlanKey !== planKey) {
15
+ const items = this.pipeline.stages.map((stage, index) => this.buildPlanItem(stage, index, task));
14
16
  const targetId = this.resolveTargetId(items);
15
17
  const normalizedItems = items.map((item) => ({
16
18
  ...item,
@@ -21,10 +23,11 @@ export class CommandPlanner {
21
23
  notes: this.pipeline.description,
22
24
  targetId: targetId ?? null
23
25
  };
26
+ this.cachedPlanKey = planKey;
24
27
  }
25
28
  return clonePlanResult(this.cachedPlan);
26
29
  }
27
- buildPlanItem(stage, index) {
30
+ buildPlanItem(stage, index, task) {
28
31
  const stagePlanHints = extractStagePlanHints(stage);
29
32
  const requiresCloud = resolveStageRequiresCloud(stage, stagePlanHints);
30
33
  const runnable = resolveStageRunnable(stagePlanHints);
@@ -47,6 +50,18 @@ export class CommandPlanner {
47
50
  metadata.cloudEnvId = stagePlanHints.cloudEnvId;
48
51
  }
49
52
  metadata.requiresCloud = requiresCloud;
53
+ const selectedMemoryRefs = selectTaskMemoryRefs({
54
+ task,
55
+ pipeline: this.pipeline,
56
+ target: {
57
+ id: `${this.pipeline.id}:${stage.id}`,
58
+ description: stage.title
59
+ },
60
+ stage
61
+ });
62
+ if (selectedMemoryRefs.length > 0) {
63
+ metadata.selectedMemoryRefs = selectedMemoryRefs;
64
+ }
50
65
  return {
51
66
  id: `${this.pipeline.id}:${stage.id}`,
52
67
  description: stage.title,
@@ -178,3 +193,6 @@ function clonePlanResult(plan) {
178
193
  targetId: plan.targetId ?? null
179
194
  };
180
195
  }
196
+ function buildPlanCacheKey(task) {
197
+ return JSON.stringify(task.memory?.refs ?? null);
198
+ }
@@ -1,4 +1,4 @@
1
- import { diagnoseCloudFailure } from './cloudFailureDiagnostics.js';
1
+ import { diagnoseCloudFailure, formatCloudFailureClass } from './cloudFailureDiagnostics.js';
2
2
  export class CommandReviewer {
3
3
  getResult;
4
4
  constructor(getResult) {
@@ -41,12 +41,12 @@ export class CommandReviewer {
41
41
  ...(cloudExecution?.status_url ? [`Cloud status URL: ${cloudExecution.status_url}`] : [])
42
42
  ];
43
43
  if (!approved) {
44
- summaryLines.push(`Failure class: ${diagnosis.category}`);
44
+ summaryLines.push(`Failure class: ${formatCloudFailureClass(diagnosis)}`);
45
45
  summaryLines.push(`Guidance: ${diagnosis.guidance}`);
46
46
  }
47
47
  const feedbackLines = [cloudExecution?.error ?? (result.notes.join('\n') || undefined)].filter((line) => Boolean(line && line.trim().length > 0));
48
48
  if (!approved) {
49
- feedbackLines.push(`Failure class: ${diagnosis.category}`);
49
+ feedbackLines.push(`Failure class: ${formatCloudFailureClass(diagnosis)}`);
50
50
  feedbackLines.push(`Guidance: ${diagnosis.guidance}`);
51
51
  }
52
52
  return {
@@ -1,5 +1,5 @@
1
1
  import { ensureGuardrailStatus } from '../run/manifest.js';
2
- import { diagnoseCloudFailure } from './cloudFailureDiagnostics.js';
2
+ import { diagnoseCloudFailure, formatCloudFailureClass } from './cloudFailureDiagnostics.js';
3
3
  export class CommandTester {
4
4
  getResult;
5
5
  constructor(getResult) {
@@ -49,7 +49,7 @@ export class CommandTester {
49
49
  status: passed ? 'passed' : 'failed',
50
50
  details: passed
51
51
  ? failureDetails
52
- : `${failureDetails}\nFailure class: ${diagnosis.category}. ${diagnosis.guidance}`
52
+ : `${failureDetails}\nFailure class: ${formatCloudFailureClass(diagnosis)}. ${diagnosis.guidance}`
53
53
  }
54
54
  ];
55
55
  return {
@@ -1,44 +1,328 @@
1
+ export function formatCloudFailureClass(diagnosis) {
2
+ return `${diagnosis.category} (${diagnosis.diagnostic_category})`;
3
+ }
1
4
  const CLOUD_FAILURE_RULES = [
5
+ {
6
+ category: 'execution',
7
+ diagnostic_category: 'guardian_timeout',
8
+ patterns: [
9
+ 'guardian timeout',
10
+ 'guardian-timeout',
11
+ 'guardian_timeout',
12
+ 'guardian timed out',
13
+ 'guardian review timeout',
14
+ 'guardian review timed out'
15
+ ],
16
+ guidance: 'Guardian review timed out; retry or inspect timeout-specific Guardian guidance before treating it as a policy denial.'
17
+ },
18
+ {
19
+ category: 'execution',
20
+ diagnostic_category: 'guardian_policy_denial',
21
+ patterns: [
22
+ 'guardian policy denial',
23
+ 'guardian-policy-denial',
24
+ 'guardian_policy_denial',
25
+ 'guardian policy denied',
26
+ 'guardian denied',
27
+ 'guardian blocked'
28
+ ],
29
+ guidance: 'Guardian policy denied the request; inspect policy-denial guidance instead of retrying as a timeout.'
30
+ },
31
+ {
32
+ category: 'credentials',
33
+ diagnostic_category: 'cloud_connector_auth_drift',
34
+ patterns: [
35
+ 'cloud connector auth drift',
36
+ 'cloud-connector-auth-drift',
37
+ 'cloud_connector_auth_drift',
38
+ 'missing_github_connector_link',
39
+ 'missing github connector link',
40
+ 'github connection not found for user',
41
+ 'github connection not found',
42
+ 'github connector not found',
43
+ 'github connector link missing',
44
+ 'missing github connection',
45
+ 'missing github connector'
46
+ ],
47
+ guidance: 'Repair or relink the GitHub connector for the current ChatGPT/Codex cloud account/environment, or record an explicit waiver before re-running cloud-canary gates.'
48
+ },
49
+ {
50
+ category: 'credentials',
51
+ diagnostic_category: 'cloud_denial',
52
+ patterns: [
53
+ 'cloud denial',
54
+ 'cloud-denial',
55
+ 'cloud_denial',
56
+ 'cloud denied',
57
+ 'not allowed in cloud',
58
+ 'cloud access denied',
59
+ 'cloud execution denied'
60
+ ],
61
+ guidance: 'Codex Cloud rejected this run; verify the configured cloud environment, branch, and account permission for cloud execution.'
62
+ },
63
+ {
64
+ category: 'configuration',
65
+ diagnostic_category: 'environment_not_found',
66
+ patterns: ['environment_not_found', 'environment not found', 'is not visible to codex cloud'],
67
+ guidance: 'CODEX_CLOUD_ENV_ID is configured, but Codex Cloud could not resolve it. Fix the env id or choose an environment visible to this account.'
68
+ },
69
+ {
70
+ category: 'configuration',
71
+ diagnostic_category: 'environment_unavailable',
72
+ patterns: ['environment_unavailable', 'could not be verified by codex cloud'],
73
+ guidance: 'CODEX_CLOUD_ENV_ID is configured, but this account cannot use that environment right now. Verify visibility/permissions and retry.'
74
+ },
2
75
  {
3
76
  category: 'configuration',
4
- patterns: ['cloud-env-missing', 'codex_cloud_env_id', 'no environment id is configured', '--env'],
77
+ diagnostic_category: 'env_config',
78
+ patterns: [
79
+ 'env config',
80
+ 'env-config',
81
+ 'env_config',
82
+ 'cloud-env-missing',
83
+ 'codex_cloud_env_id',
84
+ 'no_environment_id',
85
+ 'no environment id is configured',
86
+ '--env'
87
+ ],
5
88
  guidance: 'Set CODEX_CLOUD_ENV_ID (or metadata.cloudEnvId) to a valid cloud environment id before re-running.'
6
89
  },
7
90
  {
8
91
  category: 'credentials',
9
- patterns: ['unauthorized', 'forbidden', 'not logged in', 'login', 'api key', 'credential', 'token'],
10
- guidance: 'Ensure Codex Cloud credentials are available to the runner and have access to the configured environment.'
92
+ diagnostic_category: 'auth_mismatch',
93
+ patterns: [
94
+ 'auth mismatch',
95
+ 'auth-mismatch',
96
+ 'auth_mismatch',
97
+ 'auth profile',
98
+ 'profile mismatch',
99
+ 'account mismatch',
100
+ 'active account',
101
+ 'active profile',
102
+ 'unauthorized',
103
+ 'forbidden',
104
+ 'not logged in',
105
+ 'login',
106
+ 'api key',
107
+ 'credential',
108
+ 'auth token',
109
+ 'access token',
110
+ 'refresh token',
111
+ 'bearer token',
112
+ 'invalid token',
113
+ 'expired token',
114
+ 'token expired',
115
+ 'missing token',
116
+ 'token missing'
117
+ ],
118
+ guidance: 'Ensure the active Codex account/auth profile matches the cloud environment and has access to the configured environment.'
119
+ },
120
+ {
121
+ category: 'execution',
122
+ diagnostic_category: 'quota_rate_limit',
123
+ patterns: [
124
+ 'quota_rate_limit',
125
+ 'rate limit',
126
+ 'rate-limit',
127
+ 'rate_limited',
128
+ 'rate_limit_exceeded',
129
+ 'quota',
130
+ 'too many requests',
131
+ 'usage limit',
132
+ 'usage_limit_reached'
133
+ ],
134
+ guidance: 'Codex account quota or rate-limit state is implicated; inspect account plan/rate-limit evidence and retry after limits reset.'
11
135
  },
12
136
  {
13
137
  category: 'connectivity',
138
+ diagnostic_category: 'network_connectivity',
14
139
  patterns: ['enotfound', 'econn', 'timed out', 'timeout', 'network', '502', '503', '504'],
15
140
  guidance: 'Cloud endpoint connectivity looks unstable; retry and inspect network/endpoint health.'
16
141
  }
17
142
  ];
18
143
  const TERMINAL_FAILURE_STATUSES = new Set(['failed', 'error', 'cancelled']);
144
+ const MACHINE_READABLE_CLOUD_DETAILS = new Set([
145
+ 'auth_mismatch',
146
+ 'cloud_access_denied',
147
+ 'cloud_denial',
148
+ 'cloud_denied',
149
+ 'cloud_env_missing',
150
+ 'environment_not_found',
151
+ 'environment_unavailable',
152
+ 'cloud_execution_denied',
153
+ 'cloud_connector_auth_drift',
154
+ 'codex_cloud_env_id',
155
+ 'env_config',
156
+ 'guardian_policy_denial',
157
+ 'guardian_timeout',
158
+ 'github_connection_not_found',
159
+ 'github_connector_not_found',
160
+ 'missing_github_connector_link',
161
+ 'no_environment_id',
162
+ 'not_allowed_in_cloud',
163
+ 'quota_rate_limit',
164
+ 'rate_limit',
165
+ 'rate_limit_exceeded',
166
+ 'rate_limited',
167
+ 'usage_limit_reached'
168
+ ]);
169
+ function isEnvironmentNotFoundSignal(signal) {
170
+ const lowercase = signal.toLowerCase();
171
+ if (/\benvironment_not_found\b/u.test(lowercase)) {
172
+ return true;
173
+ }
174
+ if (!/\benvironment\s+(?:['"][^'"]+['"]|[^\s'"]+)\s+not\s+found\b/u.test(lowercase)) {
175
+ return false;
176
+ }
177
+ return (lowercase.includes('codex_cloud_env_id') ||
178
+ lowercase.includes('codex cloud env id') ||
179
+ lowercase.includes('is not visible to codex cloud') ||
180
+ lowercase.includes('could not be verified by codex cloud'));
181
+ }
182
+ function matchesCloudFailureRule(rule, lowercase, normalized) {
183
+ return rule.patterns.some((pattern) => {
184
+ const normalizedPattern = normalizeCloudFailureSignal(pattern);
185
+ return lowercase.includes(pattern) ||
186
+ (normalizedPattern.length >= 4 && normalized.includes(normalizedPattern));
187
+ });
188
+ }
189
+ function findCloudFailureRule(diagnosticCategory) {
190
+ return CLOUD_FAILURE_RULES.find((rule) => rule.diagnostic_category === diagnosticCategory) ?? null;
191
+ }
192
+ function findMatchedCloudFailureRule(diagnosticCategory, signal) {
193
+ const rule = findCloudFailureRule(diagnosticCategory);
194
+ if (!rule) {
195
+ return null;
196
+ }
197
+ const lowercase = signal.toLowerCase();
198
+ const normalized = normalizeCloudFailureSignal(signal);
199
+ return matchesCloudFailureRule(rule, lowercase, normalized) ? rule : null;
200
+ }
201
+ function maskEnvConfigIdentifierValues(normalizedSignal) {
202
+ return normalizedSignal
203
+ .replace(/\bcodex_cloud_env_id\s+(?:['"][^'"]+['"]|[^\s'"]+)/gu, 'codex_cloud_env_id <env-id>')
204
+ .replace(/\bcodex cloud env id\s+(?:['"][^'"]+['"]|[^\s'"]+)/gu, 'codex cloud env id <env-id>')
205
+ .replace(/\benvironment\s+(?:['"][^'"]+['"]|[^\s'"]+)\s+not\s+found\b/gu, 'environment <env-id> not found');
206
+ }
207
+ function hasStrongConnectivityContext(signal) {
208
+ const normalized = maskEnvConfigIdentifierValues(signal.toLowerCase());
209
+ return (normalized.includes('enotfound') ||
210
+ normalized.includes('econn') ||
211
+ normalized.includes('bad gateway') ||
212
+ normalized.includes('service unavailable') ||
213
+ normalized.includes('gateway timeout') ||
214
+ /\bnetwork\W{0,24}(?:error|failure|unreachable|unavailable|timeout|timed out|connection|connectivity)\b/u.test(normalized) ||
215
+ /\b(?:request|connection|endpoint|gateway|upstream|service)\W{0,24}(?:timed out|timeout)\b/u.test(normalized) ||
216
+ /\b(?:timed out|timeout)\W{0,24}(?:(?:while\s+)?(?:contacting|connecting|reaching|calling|waiting)|request|connection|endpoint|gateway|upstream|service|after)\b/u.test(normalized) ||
217
+ /\b(?:http(?:\s+(?:status|response))?|status|response|upstream|gateway|error|failed|returned)\D{0,16}(?:502|503|504)\b/u.test(normalized) ||
218
+ /\b(?:502|503|504)\D{0,16}(?:bad gateway|service unavailable|gateway timeout)\b/u.test(normalized));
219
+ }
220
+ function matchCloudFailureRule(signal) {
221
+ const lowercase = signal.toLowerCase();
222
+ const normalized = normalizeCloudFailureSignal(signal);
223
+ const envConfigRule = findCloudFailureRule('env_config');
224
+ if (isEnvironmentNotFoundSignal(signal)) {
225
+ const specificRule = matchSpecificWrappedFailureRule(signal, lowercase, normalized);
226
+ if (specificRule) {
227
+ return specificRule;
228
+ }
229
+ return findCloudFailureRule('environment_not_found');
230
+ }
231
+ if (envConfigRule && matchesCloudFailureRule(envConfigRule, lowercase, normalized)) {
232
+ const specificRule = matchSpecificWrappedFailureRule(signal, lowercase, normalized);
233
+ if (specificRule) {
234
+ return specificRule;
235
+ }
236
+ const envUnavailableRule = findCloudFailureRule('environment_unavailable');
237
+ if (envUnavailableRule && matchesCloudFailureRule(envUnavailableRule, lowercase, normalized)) {
238
+ return envUnavailableRule;
239
+ }
240
+ }
241
+ return CLOUD_FAILURE_RULES.find((rule) => matchesCloudFailureRule(rule, lowercase, normalized)) ?? null;
242
+ }
243
+ function matchSpecificWrappedFailureRule(signal, lowercase, normalized) {
244
+ const maskedSignal = maskEnvConfigIdentifierValues(lowercase);
245
+ for (const diagnosticCategory of [
246
+ 'cloud_connector_auth_drift',
247
+ 'cloud_denial',
248
+ 'auth_mismatch',
249
+ 'quota_rate_limit'
250
+ ]) {
251
+ const rule = findMatchedCloudFailureRule(diagnosticCategory, maskedSignal);
252
+ if (rule) {
253
+ return rule;
254
+ }
255
+ }
256
+ const connectivityRule = findCloudFailureRule('network_connectivity');
257
+ if (connectivityRule &&
258
+ matchesCloudFailureRule(connectivityRule, lowercase, normalized) &&
259
+ hasStrongConnectivityContext(signal)) {
260
+ return connectivityRule;
261
+ }
262
+ return null;
263
+ }
264
+ function normalizeCloudFailureSignal(signal) {
265
+ return signal
266
+ .replace(/([a-z0-9])([A-Z])/gu, '$1 $2')
267
+ .toLowerCase()
268
+ .replace(/[_-]+/gu, ' ')
269
+ .replace(/\s+/gu, ' ')
270
+ .trim();
271
+ }
272
+ function normalizeMachineReadableCloudDetail(signal) {
273
+ return normalizeCloudFailureSignal(signal).replace(/\s+/gu, '_');
274
+ }
275
+ function isMachineReadableCloudDetail(signal) {
276
+ return MACHINE_READABLE_CLOUD_DETAILS.has(normalizeMachineReadableCloudDetail(signal));
277
+ }
278
+ function buildCloudFailureDiagnosis(rule, signal) {
279
+ return {
280
+ category: rule.category,
281
+ diagnostic_category: rule.diagnostic_category,
282
+ guidance: rule.guidance,
283
+ signal
284
+ };
285
+ }
19
286
  export function diagnoseCloudFailure(options) {
20
287
  const signal = [options.status ?? null, options.statusDetail ?? null, options.error ?? null]
21
288
  .filter((value) => typeof value === 'string' && value.trim().length > 0)
22
289
  .join('\n');
23
- const normalized = signal.toLowerCase();
24
- for (const rule of CLOUD_FAILURE_RULES) {
25
- if (rule.patterns.some((pattern) => normalized.includes(pattern))) {
26
- return {
27
- category: rule.category,
28
- guidance: rule.guidance,
29
- signal
30
- };
290
+ if (options.statusDetail && isMachineReadableCloudDetail(options.statusDetail)) {
291
+ const statusDetailRule = matchCloudFailureRule(options.statusDetail);
292
+ if (statusDetailRule) {
293
+ if (normalizeMachineReadableCloudDetail(options.statusDetail) === 'environment_unavailable' &&
294
+ options.error) {
295
+ const errorRule = matchCloudFailureRule(options.error);
296
+ if (errorRule &&
297
+ errorRule.diagnostic_category !== 'environment_unavailable' &&
298
+ errorRule.diagnostic_category !== 'env_config') {
299
+ return buildCloudFailureDiagnosis(errorRule, signal);
300
+ }
301
+ }
302
+ return buildCloudFailureDiagnosis(statusDetailRule, signal);
31
303
  }
32
304
  }
305
+ if (options.error) {
306
+ const errorRule = matchCloudFailureRule(options.error);
307
+ if (errorRule) {
308
+ return buildCloudFailureDiagnosis(errorRule, signal);
309
+ }
310
+ }
311
+ const signalRule = matchCloudFailureRule(signal);
312
+ if (signalRule) {
313
+ return buildCloudFailureDiagnosis(signalRule, signal);
314
+ }
33
315
  if (options.status && TERMINAL_FAILURE_STATUSES.has(options.status.toLowerCase())) {
34
316
  return {
35
317
  category: 'execution',
318
+ diagnostic_category: 'provider_runtime',
36
319
  guidance: 'Inspect manifest cloud_execution.error and cloud command logs for the terminal cloud failure.',
37
320
  signal
38
321
  };
39
322
  }
40
323
  return {
41
324
  category: 'unknown',
325
+ diagnostic_category: 'unknown',
42
326
  guidance: 'Inspect manifest status_detail plus cloud command logs to classify this failure.',
43
327
  signal
44
328
  };