@resolveio/server-lib 22.3.220 → 22.3.221

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 (745) hide show
  1. package/.nodemon.json +5 -0
  2. package/.vscode/settings.json +21 -0
  3. package/AGENTS.md +195 -0
  4. package/README.md +22 -0
  5. package/build_package.sh +5 -0
  6. package/compileDTS.pl +64 -0
  7. package/docs/ai-assistant-nightly-eval.md +65 -0
  8. package/docs/ai-assistant-preflight-checklist.md +23 -0
  9. package/docs/ai-assistant-report-builder-bridge-playbook.md +115 -0
  10. package/eslint-plugin-custom/index.js +7 -0
  11. package/eslint-plugin-custom/rules/no-filter-zero-index.js +44 -0
  12. package/eslint.config.js +103 -0
  13. package/gulpfile.js +216 -0
  14. package/methodAndPublicationListGenerator.py +375 -0
  15. package/mongodbensurers.js +2 -0
  16. package/mongostop.js +3 -0
  17. package/package.json +1 -1
  18. package/scripts/cleanup-bypassed-callmethod-logs.js +616 -0
  19. package/settings.development.json +25 -0
  20. package/settings.development.redacted.json +25 -0
  21. package/src/.env +12 -0
  22. package/src/ai/assistant-core-heuristics.ts +379 -0
  23. package/src/ai/resolveio-platform-intelligence-memory-corpus.ts +185 -0
  24. package/src/ai/resolveio-platform-intelligence-memory.ts +325 -0
  25. package/{ai/resolveio-platform-intelligence-types.d.ts → src/ai/resolveio-platform-intelligence-types.ts} +20 -15
  26. package/src/ai/resolveio-platform-intelligence.ts +462 -0
  27. package/src/client-server-app.ts +12 -0
  28. package/src/collections/ai-run.collection.ts +117 -0
  29. package/src/collections/ai-terminal-conversation.collection.ts +91 -0
  30. package/src/collections/ai-terminal-issue-report.collection.ts +99 -0
  31. package/src/collections/ai-terminal-message.collection.ts +77 -0
  32. package/src/collections/app-setting.collection.ts +104 -0
  33. package/src/collections/app-status.collection.ts +58 -0
  34. package/src/collections/communication-metric.collection.ts +84 -0
  35. package/src/collections/counter.collection.ts +56 -0
  36. package/src/collections/cron-job-history.collection.ts +94 -0
  37. package/src/collections/cron-job.collection.ts +92 -0
  38. package/src/collections/customer-notification.collection.ts +131 -0
  39. package/src/collections/customer-portal-password.collection.ts +76 -0
  40. package/src/collections/email-history.collection.ts +134 -0
  41. package/src/collections/email-verified.collection.ts +62 -0
  42. package/src/collections/file.collection.ts +74 -0
  43. package/src/collections/flag-update.collection.ts +57 -0
  44. package/src/collections/flag.collection.ts +57 -0
  45. package/src/collections/log-method-latency.collection.ts +77 -0
  46. package/src/collections/log-subscription.collection.ts +80 -0
  47. package/src/collections/log.collection.ts +93 -0
  48. package/src/collections/logged-in-users.collection.ts +67 -0
  49. package/src/collections/monitor-cpu.collection.ts +65 -0
  50. package/src/collections/monitor-function.collection.ts +74 -0
  51. package/src/collections/monitor-memory.collection.ts +77 -0
  52. package/src/collections/monitor-mongo.collection.ts +71 -0
  53. package/src/collections/notification.collection.ts +57 -0
  54. package/src/collections/openai-usage-ledger.collection.ts +131 -0
  55. package/src/collections/report-builder-dashboard-builder.collection.ts +109 -0
  56. package/src/collections/report-builder-library.collection.ts +89 -0
  57. package/src/collections/report-builder-report.collection.ts +184 -0
  58. package/src/collections/user-group.collection.ts +89 -0
  59. package/src/collections/user-guide.collection.ts +57 -0
  60. package/src/collections/user.collection.ts +181 -0
  61. package/src/cron/cron.ts +117 -0
  62. package/src/fixtures/cron-jobs.ts +95 -0
  63. package/src/fixtures/init.ts +35 -0
  64. package/src/http/auth.ts +818 -0
  65. package/src/http/health.ts +7 -0
  66. package/src/http/home.ts +90 -0
  67. package/src/http/slow-query-publication.ts +49 -0
  68. package/src/index.ts +1 -0
  69. package/src/managers/ai-assistant-codex-manager.manager.ts +1131 -0
  70. package/src/managers/ai-run-evidence.manager.ts +264 -0
  71. package/src/managers/communication-metric.manager.ts +82 -0
  72. package/src/managers/cron.manager.ts +333 -0
  73. package/src/managers/customer-notification-content.manager.ts +236 -0
  74. package/src/managers/diagnostic-manager-bootstrap.ts +165 -0
  75. package/src/managers/error-auto-fix.manager.ts +2767 -0
  76. package/src/managers/local-log.manager.ts +113 -0
  77. package/src/managers/method.manager.ts +1857 -0
  78. package/src/managers/mongo.manager.ts +4575 -0
  79. package/src/managers/monitor.manager.ts +507 -0
  80. package/src/managers/openai-usage-ledger.manager.ts +112 -0
  81. package/src/managers/slow-query-verifier.manager.ts +3590 -0
  82. package/src/managers/slow-query.manager.ts +519 -0
  83. package/src/managers/subscription.manager.ts +3128 -0
  84. package/src/managers/websocket.manager.ts +746 -0
  85. package/src/managers/worker-dispatcher.manager.ts +1360 -0
  86. package/src/managers/worker-server.manager.ts +536 -0
  87. package/src/methods/accounts.ts +532 -0
  88. package/src/methods/ai-terminal.ts +29070 -0
  89. package/src/methods/app-settings.ts +114 -0
  90. package/src/methods/aws.ts +649 -0
  91. package/src/methods/collections.ts +641 -0
  92. package/src/methods/counters.ts +69 -0
  93. package/src/methods/cron-jobs.ts +2614 -0
  94. package/src/methods/customer-notifications.ts +458 -0
  95. package/src/methods/diagnostics.ts +616 -0
  96. package/src/methods/flag-updates.ts +7 -0
  97. package/src/methods/flags.ts +7 -0
  98. package/src/methods/logs.ts +657 -0
  99. package/src/methods/mongo-explorer.ts +1880 -0
  100. package/src/methods/monitor.ts +540 -0
  101. package/src/methods/pdf.ts +1236 -0
  102. package/src/methods/publications.ts +129 -0
  103. package/src/methods/report-builder.ts +3300 -0
  104. package/src/methods/support.ts +335 -0
  105. package/src/models/ai-run.model.ts +27 -0
  106. package/src/models/ai-terminal-conversation.model.ts +19 -0
  107. package/src/models/ai-terminal-issue-report.model.ts +21 -0
  108. package/src/models/ai-terminal-message.model.ts +24 -0
  109. package/src/models/app-setting.model.ts +17 -0
  110. package/{models/app-status.model.d.ts → src/models/app-status.model.ts} +3 -2
  111. package/{models/billing-logged-in-users.model.d.ts → src/models/billing-logged-in-users.model.ts} +5 -4
  112. package/src/models/collection-document.model.ts +24 -0
  113. package/src/models/communication-metric.model.ts +23 -0
  114. package/{models/counter.model.d.ts → src/models/counter.model.ts} +4 -3
  115. package/src/models/cron-job-history.model.ts +16 -0
  116. package/src/models/cron-job.model.ts +15 -0
  117. package/src/models/customer-notification.model.ts +28 -0
  118. package/src/models/customer-portal-password.model.ts +12 -0
  119. package/src/models/dialog.model.ts +25 -0
  120. package/{models/email-history.model.js → src/models/email-history.model.ts} +36 -4
  121. package/{models/email-verified.model.d.ts → src/models/email-verified.model.ts} +6 -5
  122. package/{models/file.model.d.ts → src/models/file.model.ts} +8 -7
  123. package/{models/flag-update.model.d.ts → src/models/flag-update.model.ts} +4 -3
  124. package/{models/flag.model.d.ts → src/models/flag.model.ts} +4 -3
  125. package/src/models/log-method-latency.model.ts +11 -0
  126. package/{models/log-subscription.model.d.ts → src/models/log-subscription.model.ts} +11 -9
  127. package/src/models/log.model.ts +19 -0
  128. package/{models/logged-in-users.model.d.ts → src/models/logged-in-users.model.ts} +6 -5
  129. package/{models/method-response.model.d.ts → src/models/method-response.model.ts} +7 -6
  130. package/src/models/method.model.ts +25 -0
  131. package/{models/monitor-cpu.model.d.ts → src/models/monitor-cpu.model.ts} +9 -7
  132. package/src/models/monitor-function.model.ts +16 -0
  133. package/src/models/monitor-memory.model.ts +17 -0
  134. package/src/models/monitor-mongo.model.ts +15 -0
  135. package/{models/notification.model.d.ts → src/models/notification.model.ts} +6 -4
  136. package/src/models/openai-usage-ledger.model.ts +56 -0
  137. package/src/models/pagination.model.ts +35 -0
  138. package/src/models/permission.model.ts +14 -0
  139. package/src/models/report-builder-dashboard-builder.model.ts +29 -0
  140. package/src/models/report-builder-library.model.ts +20 -0
  141. package/src/models/report-builder-report.model.ts +136 -0
  142. package/src/models/report-builder.model.ts +68 -0
  143. package/src/models/select-data-label.model.ts +9 -0
  144. package/src/models/server-message.model.ts +31 -0
  145. package/src/models/slow-query-report.model.ts +23 -0
  146. package/src/models/subscription.model.ts +73 -0
  147. package/src/models/support-ticket.model.ts +104 -0
  148. package/src/models/user-group.model.ts +24 -0
  149. package/{models/user-guide.model.d.ts → src/models/user-guide.model.ts} +5 -4
  150. package/src/models/user.model.ts +96 -0
  151. package/src/private/images/ResolveIO.png +0 -0
  152. package/src/publications/ai-terminal.ts +73 -0
  153. package/src/publications/app-settings.ts +25 -0
  154. package/src/publications/app-status.ts +13 -0
  155. package/src/publications/cron-jobs.ts +40 -0
  156. package/src/publications/customer-notifications.ts +101 -0
  157. package/src/publications/files.ts +33 -0
  158. package/src/publications/flags-update.ts +19 -0
  159. package/src/publications/flags.ts +19 -0
  160. package/src/publications/logs.ts +163 -0
  161. package/src/publications/notifications.ts +13 -0
  162. package/src/publications/report-builder-dashboard-builders.ts +39 -0
  163. package/src/publications/report-builder-libraries.ts +41 -0
  164. package/src/publications/report-builder-reports.ts +47 -0
  165. package/src/publications/super-admin.ts +13 -0
  166. package/src/publications/user-groups.ts +12 -0
  167. package/src/publications/user-guides.ts +12 -0
  168. package/src/resolveio-server-app.ts +617 -0
  169. package/src/server-app.ts +3354 -0
  170. package/src/services/codex-client.ts +1231 -0
  171. package/src/services/openai-client.ts +265 -0
  172. package/src/types/error-report.ts +26 -0
  173. package/src/types/js-tiktoken.d.ts +11 -0
  174. package/src/types/slow-query-report.ts +28 -0
  175. package/src/util/ai-qa-policy.ts +925 -0
  176. package/src/util/ai-run-evidence-adapters.ts +8347 -0
  177. package/src/util/ai-run-evidence-dashboard.ts +323 -0
  178. package/src/util/ai-run-evidence-eval.ts +1057 -0
  179. package/src/util/ai-run-evidence.ts +1430 -0
  180. package/src/util/ai-runner-artifacts.ts +586 -0
  181. package/src/util/ai-runner-manager-autopilot.ts +961 -0
  182. package/src/util/ai-runner-manager-policy.ts +5011 -0
  183. package/src/util/ai-runner-qa-auth.ts +838 -0
  184. package/src/util/ai-runner-qa-tools.ts +3536 -0
  185. package/src/util/aicoder-runner-v6.ts +3121 -0
  186. package/src/util/common.ts +649 -0
  187. package/src/util/customer-portal-password.ts +183 -0
  188. package/src/util/error-reporter.ts +332 -0
  189. package/src/util/error-tracking.ts +79 -0
  190. package/src/util/openai-usage-cost.ts +114 -0
  191. package/src/util/report-builder-unwinds.ts +180 -0
  192. package/src/util/runner-process-janitor.ts +219 -0
  193. package/src/util/schema-report-builder.ts +448 -0
  194. package/src/util/slow-query-reporter.ts +216 -0
  195. package/src/util/subscription-dependency-context.ts +1096 -0
  196. package/src/util/support-runner-v5.ts +10040 -0
  197. package/src/util/tokenizer.ts +38 -0
  198. package/src/workers/codex-runner.worker.ts +142 -0
  199. package/start_server.sh +5 -0
  200. package/tests/ai-assistant-corpus-build.ts +484 -0
  201. package/tests/ai-assistant-corpus-replay-e2e.ts +774 -0
  202. package/tests/ai-assistant-data-parity-e2e.ts +1989 -0
  203. package/tests/ai-assistant-eval-triage.ts +831 -0
  204. package/tests/ai-assistant-openai-e2e.ts +1061 -0
  205. package/tests/ai-assistant-openai-git-e2e.ts +155 -0
  206. package/tests/ai-assistant-preflight-matrix.ts +215 -0
  207. package/tests/ai-assistant-routing-eval.test.ts +585 -0
  208. package/tests/ai-assistant-snf-live-eval.ts +975 -0
  209. package/tests/ai-assistant-utils.test.ts +4834 -0
  210. package/tests/ai-manager-autopilot-snapshot.test.ts +193 -0
  211. package/tests/ai-manager-recovery-checkpoint.test.ts +1383 -0
  212. package/tests/ai-run-eval.test.ts +132 -0
  213. package/tests/ai-run-evidence.test.ts +3773 -0
  214. package/tests/ai-runner-contract.test.ts +515 -0
  215. package/tests/aicoder-runner-v6.test.ts +822 -0
  216. package/tests/error-reporter.test.ts +145 -0
  217. package/tests/method-publication-generator.test.ts +46 -0
  218. package/tests/report-builder-linking.test.ts +79 -0
  219. package/tests/resolveio-platform-intelligence.test.ts +352 -0
  220. package/tests/server-app-cron-owner.test.ts +127 -0
  221. package/tests/subscription-connect-race.test.ts +158 -0
  222. package/tests/subscription-dependency-context.test.ts +324 -0
  223. package/tests/subscription-manager-collection-tracking.test.ts +86 -0
  224. package/tests/subscription-manager-invalidation.test.ts +86 -0
  225. package/tests/support-runner-v5.test.ts +3201 -0
  226. package/tsconfig.json +34 -0
  227. package/ai/assistant-core-heuristics.d.ts +0 -11
  228. package/ai/assistant-core-heuristics.js +0 -356
  229. package/ai/assistant-core-heuristics.js.map +0 -1
  230. package/ai/resolveio-platform-intelligence-memory-corpus.d.ts +0 -3
  231. package/ai/resolveio-platform-intelligence-memory-corpus.js +0 -214
  232. package/ai/resolveio-platform-intelligence-memory-corpus.js.map +0 -1
  233. package/ai/resolveio-platform-intelligence-memory.d.ts +0 -20
  234. package/ai/resolveio-platform-intelligence-memory.js +0 -341
  235. package/ai/resolveio-platform-intelligence-memory.js.map +0 -1
  236. package/ai/resolveio-platform-intelligence-types.js +0 -4
  237. package/ai/resolveio-platform-intelligence-types.js.map +0 -1
  238. package/ai/resolveio-platform-intelligence.d.ts +0 -6
  239. package/ai/resolveio-platform-intelligence.js +0 -463
  240. package/ai/resolveio-platform-intelligence.js.map +0 -1
  241. package/client-server-app.d.ts +0 -1
  242. package/client-server-app.js +0 -68
  243. package/client-server-app.js.map +0 -1
  244. package/collections/ai-run.collection.d.ts +0 -3
  245. package/collections/ai-run.collection.js +0 -170
  246. package/collections/ai-run.collection.js.map +0 -1
  247. package/collections/ai-terminal-conversation.collection.d.ts +0 -2
  248. package/collections/ai-terminal-conversation.collection.js +0 -140
  249. package/collections/ai-terminal-conversation.collection.js.map +0 -1
  250. package/collections/ai-terminal-issue-report.collection.d.ts +0 -2
  251. package/collections/ai-terminal-issue-report.collection.js +0 -148
  252. package/collections/ai-terminal-issue-report.collection.js.map +0 -1
  253. package/collections/ai-terminal-message.collection.d.ts +0 -2
  254. package/collections/ai-terminal-message.collection.js +0 -121
  255. package/collections/ai-terminal-message.collection.js.map +0 -1
  256. package/collections/app-setting.collection.d.ts +0 -3
  257. package/collections/app-setting.collection.js +0 -103
  258. package/collections/app-setting.collection.js.map +0 -1
  259. package/collections/app-status.collection.d.ts +0 -3
  260. package/collections/app-status.collection.js +0 -57
  261. package/collections/app-status.collection.js.map +0 -1
  262. package/collections/communication-metric.collection.d.ts +0 -2
  263. package/collections/communication-metric.collection.js +0 -133
  264. package/collections/communication-metric.collection.js.map +0 -1
  265. package/collections/counter.collection.d.ts +0 -3
  266. package/collections/counter.collection.js +0 -56
  267. package/collections/counter.collection.js.map +0 -1
  268. package/collections/cron-job-history.collection.d.ts +0 -3
  269. package/collections/cron-job-history.collection.js +0 -137
  270. package/collections/cron-job-history.collection.js.map +0 -1
  271. package/collections/cron-job.collection.d.ts +0 -3
  272. package/collections/cron-job.collection.js +0 -92
  273. package/collections/cron-job.collection.js.map +0 -1
  274. package/collections/customer-notification.collection.d.ts +0 -3
  275. package/collections/customer-notification.collection.js +0 -130
  276. package/collections/customer-notification.collection.js.map +0 -1
  277. package/collections/customer-portal-password.collection.d.ts +0 -3
  278. package/collections/customer-portal-password.collection.js +0 -75
  279. package/collections/customer-portal-password.collection.js.map +0 -1
  280. package/collections/email-history.collection.d.ts +0 -3
  281. package/collections/email-history.collection.js +0 -134
  282. package/collections/email-history.collection.js.map +0 -1
  283. package/collections/email-verified.collection.d.ts +0 -3
  284. package/collections/email-verified.collection.js +0 -62
  285. package/collections/email-verified.collection.js.map +0 -1
  286. package/collections/file.collection.d.ts +0 -3
  287. package/collections/file.collection.js +0 -74
  288. package/collections/file.collection.js.map +0 -1
  289. package/collections/flag-update.collection.d.ts +0 -3
  290. package/collections/flag-update.collection.js +0 -57
  291. package/collections/flag-update.collection.js.map +0 -1
  292. package/collections/flag.collection.d.ts +0 -3
  293. package/collections/flag.collection.js +0 -57
  294. package/collections/flag.collection.js.map +0 -1
  295. package/collections/log-method-latency.collection.d.ts +0 -3
  296. package/collections/log-method-latency.collection.js +0 -77
  297. package/collections/log-method-latency.collection.js.map +0 -1
  298. package/collections/log-subscription.collection.d.ts +0 -3
  299. package/collections/log-subscription.collection.js +0 -80
  300. package/collections/log-subscription.collection.js.map +0 -1
  301. package/collections/log.collection.d.ts +0 -3
  302. package/collections/log.collection.js +0 -93
  303. package/collections/log.collection.js.map +0 -1
  304. package/collections/logged-in-users.collection.d.ts +0 -3
  305. package/collections/logged-in-users.collection.js +0 -67
  306. package/collections/logged-in-users.collection.js.map +0 -1
  307. package/collections/monitor-cpu.collection.d.ts +0 -3
  308. package/collections/monitor-cpu.collection.js +0 -65
  309. package/collections/monitor-cpu.collection.js.map +0 -1
  310. package/collections/monitor-function.collection.d.ts +0 -3
  311. package/collections/monitor-function.collection.js +0 -74
  312. package/collections/monitor-function.collection.js.map +0 -1
  313. package/collections/monitor-memory.collection.d.ts +0 -3
  314. package/collections/monitor-memory.collection.js +0 -77
  315. package/collections/monitor-memory.collection.js.map +0 -1
  316. package/collections/monitor-mongo.collection.d.ts +0 -3
  317. package/collections/monitor-mongo.collection.js +0 -71
  318. package/collections/monitor-mongo.collection.js.map +0 -1
  319. package/collections/notification.collection.d.ts +0 -3
  320. package/collections/notification.collection.js +0 -57
  321. package/collections/notification.collection.js.map +0 -1
  322. package/collections/openai-usage-ledger.collection.d.ts +0 -2
  323. package/collections/openai-usage-ledger.collection.js +0 -188
  324. package/collections/openai-usage-ledger.collection.js.map +0 -1
  325. package/collections/report-builder-dashboard-builder.collection.d.ts +0 -3
  326. package/collections/report-builder-dashboard-builder.collection.js +0 -109
  327. package/collections/report-builder-dashboard-builder.collection.js.map +0 -1
  328. package/collections/report-builder-library.collection.d.ts +0 -3
  329. package/collections/report-builder-library.collection.js +0 -87
  330. package/collections/report-builder-library.collection.js.map +0 -1
  331. package/collections/report-builder-report.collection.d.ts +0 -4
  332. package/collections/report-builder-report.collection.js +0 -184
  333. package/collections/report-builder-report.collection.js.map +0 -1
  334. package/collections/user-group.collection.d.ts +0 -4
  335. package/collections/user-group.collection.js +0 -89
  336. package/collections/user-group.collection.js.map +0 -1
  337. package/collections/user-guide.collection.d.ts +0 -3
  338. package/collections/user-guide.collection.js +0 -57
  339. package/collections/user-guide.collection.js.map +0 -1
  340. package/collections/user.collection.d.ts +0 -4
  341. package/collections/user.collection.js +0 -180
  342. package/collections/user.collection.js.map +0 -1
  343. package/cron/cron.d.ts +0 -14
  344. package/cron/cron.js +0 -216
  345. package/cron/cron.js.map +0 -1
  346. package/fixtures/cron-jobs.d.ts +0 -1
  347. package/fixtures/cron-jobs.js +0 -150
  348. package/fixtures/cron-jobs.js.map +0 -1
  349. package/fixtures/init.d.ts +0 -1
  350. package/fixtures/init.js +0 -91
  351. package/fixtures/init.js.map +0 -1
  352. package/http/auth.d.ts +0 -2
  353. package/http/auth.js +0 -951
  354. package/http/auth.js.map +0 -1
  355. package/http/health.d.ts +0 -1
  356. package/http/health.js +0 -11
  357. package/http/health.js.map +0 -1
  358. package/http/home.d.ts +0 -1
  359. package/http/home.js +0 -134
  360. package/http/home.js.map +0 -1
  361. package/http/slow-query-publication.d.ts +0 -2
  362. package/http/slow-query-publication.js +0 -99
  363. package/http/slow-query-publication.js.map +0 -1
  364. package/index.d.ts +0 -1
  365. package/index.js +0 -19
  366. package/index.js.map +0 -1
  367. package/managers/ai-assistant-codex-manager.manager.d.ts +0 -67
  368. package/managers/ai-assistant-codex-manager.manager.js +0 -1113
  369. package/managers/ai-assistant-codex-manager.manager.js.map +0 -1
  370. package/managers/ai-run-evidence.manager.d.ts +0 -36
  371. package/managers/ai-run-evidence.manager.js +0 -377
  372. package/managers/ai-run-evidence.manager.js.map +0 -1
  373. package/managers/communication-metric.manager.d.ts +0 -16
  374. package/managers/communication-metric.manager.js +0 -134
  375. package/managers/communication-metric.manager.js.map +0 -1
  376. package/managers/cron.manager.d.ts +0 -20
  377. package/managers/cron.manager.js +0 -534
  378. package/managers/cron.manager.js.map +0 -1
  379. package/managers/customer-notification-content.manager.d.ts +0 -55
  380. package/managers/customer-notification-content.manager.js +0 -158
  381. package/managers/customer-notification-content.manager.js.map +0 -1
  382. package/managers/diagnostic-manager-bootstrap.d.ts +0 -9
  383. package/managers/diagnostic-manager-bootstrap.js +0 -260
  384. package/managers/diagnostic-manager-bootstrap.js.map +0 -1
  385. package/managers/error-auto-fix.manager.d.ts +0 -149
  386. package/managers/error-auto-fix.manager.js +0 -3064
  387. package/managers/error-auto-fix.manager.js.map +0 -1
  388. package/managers/local-log.manager.d.ts +0 -18
  389. package/managers/local-log.manager.js +0 -88
  390. package/managers/local-log.manager.js.map +0 -1
  391. package/managers/method.manager.d.ts +0 -84
  392. package/managers/method.manager.js +0 -1964
  393. package/managers/method.manager.js.map +0 -1
  394. package/managers/mongo.manager.d.ts +0 -224
  395. package/managers/mongo.manager.js +0 -5000
  396. package/managers/mongo.manager.js.map +0 -1
  397. package/managers/monitor.manager.d.ts +0 -70
  398. package/managers/monitor.manager.js +0 -550
  399. package/managers/monitor.manager.js.map +0 -1
  400. package/managers/openai-usage-ledger.manager.d.ts +0 -30
  401. package/managers/openai-usage-ledger.manager.js +0 -142
  402. package/managers/openai-usage-ledger.manager.js.map +0 -1
  403. package/managers/slow-query-verifier.manager.d.ts +0 -144
  404. package/managers/slow-query-verifier.manager.js +0 -3857
  405. package/managers/slow-query-verifier.manager.js.map +0 -1
  406. package/managers/slow-query.manager.d.ts +0 -28
  407. package/managers/slow-query.manager.js +0 -468
  408. package/managers/slow-query.manager.js.map +0 -1
  409. package/managers/subscription.manager.d.ts +0 -169
  410. package/managers/subscription.manager.js +0 -3434
  411. package/managers/subscription.manager.js.map +0 -1
  412. package/managers/websocket.manager.d.ts +0 -73
  413. package/managers/websocket.manager.js +0 -673
  414. package/managers/websocket.manager.js.map +0 -1
  415. package/managers/worker-dispatcher.manager.d.ts +0 -120
  416. package/managers/worker-dispatcher.manager.js +0 -1266
  417. package/managers/worker-dispatcher.manager.js.map +0 -1
  418. package/managers/worker-server.manager.d.ts +0 -35
  419. package/managers/worker-server.manager.js +0 -582
  420. package/managers/worker-server.manager.js.map +0 -1
  421. package/methods/accounts.d.ts +0 -2
  422. package/methods/accounts.js +0 -624
  423. package/methods/accounts.js.map +0 -1
  424. package/methods/ai-terminal.d.ts +0 -458
  425. package/methods/ai-terminal.js +0 -27991
  426. package/methods/ai-terminal.js.map +0 -1
  427. package/methods/app-settings.d.ts +0 -2
  428. package/methods/app-settings.js +0 -169
  429. package/methods/app-settings.js.map +0 -1
  430. package/methods/aws.d.ts +0 -2
  431. package/methods/aws.js +0 -877
  432. package/methods/aws.js.map +0 -1
  433. package/methods/collections.d.ts +0 -2
  434. package/methods/collections.js +0 -719
  435. package/methods/collections.js.map +0 -1
  436. package/methods/counters.d.ts +0 -2
  437. package/methods/counters.js +0 -113
  438. package/methods/counters.js.map +0 -1
  439. package/methods/cron-jobs.d.ts +0 -2
  440. package/methods/cron-jobs.js +0 -2475
  441. package/methods/cron-jobs.js.map +0 -1
  442. package/methods/customer-notifications.d.ts +0 -2
  443. package/methods/customer-notifications.js +0 -528
  444. package/methods/customer-notifications.js.map +0 -1
  445. package/methods/diagnostics.d.ts +0 -2
  446. package/methods/diagnostics.js +0 -703
  447. package/methods/diagnostics.js.map +0 -1
  448. package/methods/flag-updates.d.ts +0 -2
  449. package/methods/flag-updates.js +0 -8
  450. package/methods/flag-updates.js.map +0 -1
  451. package/methods/flags.d.ts +0 -2
  452. package/methods/flags.js +0 -8
  453. package/methods/flags.js.map +0 -1
  454. package/methods/logs.d.ts +0 -2
  455. package/methods/logs.js +0 -751
  456. package/methods/logs.js.map +0 -1
  457. package/methods/mongo-explorer.d.ts +0 -2
  458. package/methods/mongo-explorer.js +0 -1808
  459. package/methods/mongo-explorer.js.map +0 -1
  460. package/methods/monitor.d.ts +0 -2
  461. package/methods/monitor.js +0 -543
  462. package/methods/monitor.js.map +0 -1
  463. package/methods/pdf.d.ts +0 -2
  464. package/methods/pdf.js +0 -1216
  465. package/methods/pdf.js.map +0 -1
  466. package/methods/publications.d.ts +0 -1
  467. package/methods/publications.js +0 -183
  468. package/methods/publications.js.map +0 -1
  469. package/methods/report-builder.d.ts +0 -2
  470. package/methods/report-builder.js +0 -3094
  471. package/methods/report-builder.js.map +0 -1
  472. package/methods/support.d.ts +0 -2
  473. package/methods/support.js +0 -430
  474. package/methods/support.js.map +0 -1
  475. package/models/ai-run.model.d.ts +0 -19
  476. package/models/ai-run.model.js +0 -4
  477. package/models/ai-run.model.js.map +0 -1
  478. package/models/ai-terminal-conversation.model.d.ts +0 -17
  479. package/models/ai-terminal-conversation.model.js +0 -4
  480. package/models/ai-terminal-conversation.model.js.map +0 -1
  481. package/models/ai-terminal-issue-report.model.d.ts +0 -19
  482. package/models/ai-terminal-issue-report.model.js +0 -4
  483. package/models/ai-terminal-issue-report.model.js.map +0 -1
  484. package/models/ai-terminal-message.model.d.ts +0 -22
  485. package/models/ai-terminal-message.model.js +0 -4
  486. package/models/ai-terminal-message.model.js.map +0 -1
  487. package/models/app-setting.model.d.ts +0 -16
  488. package/models/app-setting.model.js +0 -4
  489. package/models/app-setting.model.js.map +0 -1
  490. package/models/app-status.model.js +0 -4
  491. package/models/app-status.model.js.map +0 -1
  492. package/models/billing-logged-in-users.model.js +0 -4
  493. package/models/billing-logged-in-users.model.js.map +0 -1
  494. package/models/collection-document.model.d.ts +0 -21
  495. package/models/collection-document.model.js +0 -4
  496. package/models/collection-document.model.js.map +0 -1
  497. package/models/communication-metric.model.d.ts +0 -20
  498. package/models/communication-metric.model.js +0 -4
  499. package/models/communication-metric.model.js.map +0 -1
  500. package/models/counter.model.js +0 -4
  501. package/models/counter.model.js.map +0 -1
  502. package/models/cron-job-history.model.d.ts +0 -15
  503. package/models/cron-job-history.model.js +0 -4
  504. package/models/cron-job-history.model.js.map +0 -1
  505. package/models/cron-job.model.d.ts +0 -14
  506. package/models/cron-job.model.js +0 -4
  507. package/models/cron-job.model.js.map +0 -1
  508. package/models/customer-notification.model.d.ts +0 -26
  509. package/models/customer-notification.model.js +0 -4
  510. package/models/customer-notification.model.js.map +0 -1
  511. package/models/customer-portal-password.model.d.ts +0 -11
  512. package/models/customer-portal-password.model.js +0 -4
  513. package/models/customer-portal-password.model.js.map +0 -1
  514. package/models/dialog.model.d.ts +0 -23
  515. package/models/dialog.model.js +0 -4
  516. package/models/dialog.model.js.map +0 -1
  517. package/models/email-history.model.d.ts +0 -32
  518. package/models/email-history.model.js.map +0 -1
  519. package/models/email-verified.model.js +0 -4
  520. package/models/email-verified.model.js.map +0 -1
  521. package/models/file.model.js +0 -4
  522. package/models/file.model.js.map +0 -1
  523. package/models/flag-update.model.js +0 -4
  524. package/models/flag-update.model.js.map +0 -1
  525. package/models/flag.model.js +0 -4
  526. package/models/flag.model.js.map +0 -1
  527. package/models/log-method-latency.model.d.ts +0 -10
  528. package/models/log-method-latency.model.js +0 -4
  529. package/models/log-method-latency.model.js.map +0 -1
  530. package/models/log-subscription.model.js +0 -4
  531. package/models/log-subscription.model.js.map +0 -1
  532. package/models/log.model.d.ts +0 -17
  533. package/models/log.model.js +0 -4
  534. package/models/log.model.js.map +0 -1
  535. package/models/logged-in-users.model.js +0 -4
  536. package/models/logged-in-users.model.js.map +0 -1
  537. package/models/method-response.model.js +0 -4
  538. package/models/method-response.model.js.map +0 -1
  539. package/models/method.model.d.ts +0 -26
  540. package/models/method.model.js +0 -4
  541. package/models/method.model.js.map +0 -1
  542. package/models/monitor-cpu.model.js +0 -4
  543. package/models/monitor-cpu.model.js.map +0 -1
  544. package/models/monitor-function.model.d.ts +0 -14
  545. package/models/monitor-function.model.js +0 -4
  546. package/models/monitor-function.model.js.map +0 -1
  547. package/models/monitor-memory.model.d.ts +0 -15
  548. package/models/monitor-memory.model.js +0 -4
  549. package/models/monitor-memory.model.js.map +0 -1
  550. package/models/monitor-mongo.model.d.ts +0 -13
  551. package/models/monitor-mongo.model.js +0 -4
  552. package/models/monitor-mongo.model.js.map +0 -1
  553. package/models/notification.model.js +0 -4
  554. package/models/notification.model.js.map +0 -1
  555. package/models/openai-usage-ledger.model.d.ts +0 -30
  556. package/models/openai-usage-ledger.model.js +0 -4
  557. package/models/openai-usage-ledger.model.js.map +0 -1
  558. package/models/pagination.model.d.ts +0 -11
  559. package/models/pagination.model.js +0 -28
  560. package/models/pagination.model.js.map +0 -1
  561. package/models/permission.model.d.ts +0 -12
  562. package/models/permission.model.js +0 -4
  563. package/models/permission.model.js.map +0 -1
  564. package/models/report-builder-dashboard-builder.model.d.ts +0 -25
  565. package/models/report-builder-dashboard-builder.model.js +0 -4
  566. package/models/report-builder-dashboard-builder.model.js.map +0 -1
  567. package/models/report-builder-library.model.d.ts +0 -17
  568. package/models/report-builder-library.model.js +0 -4
  569. package/models/report-builder-library.model.js.map +0 -1
  570. package/models/report-builder-report.model.d.ts +0 -121
  571. package/models/report-builder-report.model.js +0 -4
  572. package/models/report-builder-report.model.js.map +0 -1
  573. package/models/report-builder.model.d.ts +0 -61
  574. package/models/report-builder.model.js +0 -4
  575. package/models/report-builder.model.js.map +0 -1
  576. package/models/select-data-label.model.d.ts +0 -9
  577. package/models/select-data-label.model.js +0 -4
  578. package/models/select-data-label.model.js.map +0 -1
  579. package/models/server-message.model.d.ts +0 -32
  580. package/models/server-message.model.js +0 -4
  581. package/models/server-message.model.js.map +0 -1
  582. package/models/slow-query-report.model.d.ts +0 -23
  583. package/models/slow-query-report.model.js +0 -4
  584. package/models/slow-query-report.model.js.map +0 -1
  585. package/models/subscription.model.d.ts +0 -31
  586. package/models/subscription.model.js +0 -4
  587. package/models/subscription.model.js.map +0 -1
  588. package/models/support-ticket.model.d.ts +0 -87
  589. package/models/support-ticket.model.js +0 -4
  590. package/models/support-ticket.model.js.map +0 -1
  591. package/models/user-group.model.d.ts +0 -20
  592. package/models/user-group.model.js +0 -4
  593. package/models/user-group.model.js.map +0 -1
  594. package/models/user-guide.model.js +0 -4
  595. package/models/user-guide.model.js.map +0 -1
  596. package/models/user.model.d.ts +0 -84
  597. package/models/user.model.js +0 -4
  598. package/models/user.model.js.map +0 -1
  599. package/private/images/ResolveIO.png +0 -0
  600. package/public_api.js +0 -127
  601. package/public_api.js.map +0 -1
  602. package/publications/ai-terminal.d.ts +0 -1
  603. package/publications/ai-terminal.js +0 -122
  604. package/publications/ai-terminal.js.map +0 -1
  605. package/publications/app-settings.d.ts +0 -2
  606. package/publications/app-settings.js +0 -28
  607. package/publications/app-settings.js.map +0 -1
  608. package/publications/app-status.d.ts +0 -2
  609. package/publications/app-status.js +0 -16
  610. package/publications/app-status.js.map +0 -1
  611. package/publications/cron-jobs.d.ts +0 -2
  612. package/publications/cron-jobs.js +0 -88
  613. package/publications/cron-jobs.js.map +0 -1
  614. package/publications/customer-notifications.d.ts +0 -2
  615. package/publications/customer-notifications.js +0 -161
  616. package/publications/customer-notifications.js.map +0 -1
  617. package/publications/files.d.ts +0 -2
  618. package/publications/files.js +0 -36
  619. package/publications/files.js.map +0 -1
  620. package/publications/flags-update.d.ts +0 -2
  621. package/publications/flags-update.js +0 -22
  622. package/publications/flags-update.js.map +0 -1
  623. package/publications/flags.d.ts +0 -2
  624. package/publications/flags.js +0 -22
  625. package/publications/flags.js.map +0 -1
  626. package/publications/logs.d.ts +0 -2
  627. package/publications/logs.js +0 -164
  628. package/publications/logs.js.map +0 -1
  629. package/publications/notifications.d.ts +0 -2
  630. package/publications/notifications.js +0 -16
  631. package/publications/notifications.js.map +0 -1
  632. package/publications/report-builder-dashboard-builders.d.ts +0 -2
  633. package/publications/report-builder-dashboard-builders.js +0 -42
  634. package/publications/report-builder-dashboard-builders.js.map +0 -1
  635. package/publications/report-builder-libraries.d.ts +0 -2
  636. package/publications/report-builder-libraries.js +0 -90
  637. package/publications/report-builder-libraries.js.map +0 -1
  638. package/publications/report-builder-reports.d.ts +0 -2
  639. package/publications/report-builder-reports.js +0 -50
  640. package/publications/report-builder-reports.js.map +0 -1
  641. package/publications/super-admin.d.ts +0 -2
  642. package/publications/super-admin.js +0 -16
  643. package/publications/super-admin.js.map +0 -1
  644. package/publications/user-groups.d.ts +0 -1
  645. package/publications/user-groups.js +0 -16
  646. package/publications/user-groups.js.map +0 -1
  647. package/publications/user-guides.d.ts +0 -1
  648. package/publications/user-guides.js +0 -16
  649. package/publications/user-guides.js.map +0 -1
  650. package/resolveio-server-app.d.ts +0 -70
  651. package/resolveio-server-app.js +0 -801
  652. package/resolveio-server-app.js.map +0 -1
  653. package/server-app.d.ts +0 -228
  654. package/server-app.js +0 -3566
  655. package/server-app.js.map +0 -1
  656. package/services/codex-client.d.ts +0 -128
  657. package/services/codex-client.js +0 -1629
  658. package/services/codex-client.js.map +0 -1
  659. package/services/openai-client.d.ts +0 -46
  660. package/services/openai-client.js +0 -318
  661. package/services/openai-client.js.map +0 -1
  662. package/types/error-report.d.ts +0 -25
  663. package/types/error-report.js +0 -4
  664. package/types/error-report.js.map +0 -1
  665. package/types/slow-query-report.d.ts +0 -27
  666. package/types/slow-query-report.js +0 -6
  667. package/types/slow-query-report.js.map +0 -1
  668. package/util/ai-qa-policy.d.ts +0 -124
  669. package/util/ai-qa-policy.js +0 -736
  670. package/util/ai-qa-policy.js.map +0 -1
  671. package/util/ai-run-evidence-adapters.d.ts +0 -109
  672. package/util/ai-run-evidence-adapters.js +0 -7234
  673. package/util/ai-run-evidence-adapters.js.map +0 -1
  674. package/util/ai-run-evidence-dashboard.d.ts +0 -88
  675. package/util/ai-run-evidence-dashboard.js +0 -343
  676. package/util/ai-run-evidence-dashboard.js.map +0 -1
  677. package/util/ai-run-evidence-eval.d.ts +0 -86
  678. package/util/ai-run-evidence-eval.js +0 -1018
  679. package/util/ai-run-evidence-eval.js.map +0 -1
  680. package/util/ai-run-evidence.d.ts +0 -244
  681. package/util/ai-run-evidence.js +0 -1096
  682. package/util/ai-run-evidence.js.map +0 -1
  683. package/util/ai-runner-artifacts.d.ts +0 -82
  684. package/util/ai-runner-artifacts.js +0 -713
  685. package/util/ai-runner-artifacts.js.map +0 -1
  686. package/util/ai-runner-manager-autopilot.d.ts +0 -210
  687. package/util/ai-runner-manager-autopilot.js +0 -642
  688. package/util/ai-runner-manager-autopilot.js.map +0 -1
  689. package/util/ai-runner-manager-policy.d.ts +0 -807
  690. package/util/ai-runner-manager-policy.js +0 -3501
  691. package/util/ai-runner-manager-policy.js.map +0 -1
  692. package/util/ai-runner-qa-auth.d.ts +0 -5
  693. package/util/ai-runner-qa-auth.js +0 -839
  694. package/util/ai-runner-qa-auth.js.map +0 -1
  695. package/util/ai-runner-qa-tools.d.ts +0 -26
  696. package/util/ai-runner-qa-tools.js +0 -3520
  697. package/util/ai-runner-qa-tools.js.map +0 -1
  698. package/util/aicoder-runner-v6.d.ts +0 -426
  699. package/util/aicoder-runner-v6.js +0 -2464
  700. package/util/aicoder-runner-v6.js.map +0 -1
  701. package/util/common.d.ts +0 -31
  702. package/util/common.js +0 -683
  703. package/util/common.js.map +0 -1
  704. package/util/customer-portal-password.d.ts +0 -13
  705. package/util/customer-portal-password.js +0 -209
  706. package/util/customer-portal-password.js.map +0 -1
  707. package/util/error-reporter.d.ts +0 -52
  708. package/util/error-reporter.js +0 -326
  709. package/util/error-reporter.js.map +0 -1
  710. package/util/error-tracking.d.ts +0 -13
  711. package/util/error-tracking.js +0 -120
  712. package/util/error-tracking.js.map +0 -1
  713. package/util/openai-usage-cost.d.ts +0 -6
  714. package/util/openai-usage-cost.js +0 -103
  715. package/util/openai-usage-cost.js.map +0 -1
  716. package/util/report-builder-unwinds.d.ts +0 -15
  717. package/util/report-builder-unwinds.js +0 -156
  718. package/util/report-builder-unwinds.js.map +0 -1
  719. package/util/runner-process-janitor.d.ts +0 -27
  720. package/util/runner-process-janitor.js +0 -208
  721. package/util/runner-process-janitor.js.map +0 -1
  722. package/util/schema-report-builder.d.ts +0 -6
  723. package/util/schema-report-builder.js +0 -481
  724. package/util/schema-report-builder.js.map +0 -1
  725. package/util/slow-query-reporter.d.ts +0 -28
  726. package/util/slow-query-reporter.js +0 -226
  727. package/util/slow-query-reporter.js.map +0 -1
  728. package/util/subscription-dependency-context.d.ts +0 -34
  729. package/util/subscription-dependency-context.js +0 -1283
  730. package/util/subscription-dependency-context.js.map +0 -1
  731. package/util/support-runner-v5.d.ts +0 -1426
  732. package/util/support-runner-v5.js +0 -7631
  733. package/util/support-runner-v5.js.map +0 -1
  734. package/util/tokenizer.d.ts +0 -5
  735. package/util/tokenizer.js +0 -41
  736. package/util/tokenizer.js.map +0 -1
  737. package/workers/codex-runner.worker.d.ts +0 -1
  738. package/workers/codex-runner.worker.js +0 -192
  739. package/workers/codex-runner.worker.js.map +0 -1
  740. /package/{private → src/private}/email-templates/enrollment.html +0 -0
  741. /package/{private → src/private}/email-templates/forgot-password.html +0 -0
  742. /package/{private → src/private}/email-templates/support-ticket-deleted.html +0 -0
  743. /package/{private → src/private}/email-templates/support-ticket-modified.html +0 -0
  744. /package/{private → src/private}/email-templates/support-ticket.html +0 -0
  745. /package/{public_api.d.ts → src/public_api.ts} +0 -0
@@ -0,0 +1,822 @@
1
+ import * as assert from 'node:assert/strict';
2
+ import {
3
+ buildResolveIOAICoderWorkflowProofCheckpoint,
4
+ buildResolveIOAICoderWorkflowQaRowsFromJourneyContract,
5
+ buildResolveIOAICoderV6DiagnoseFirstPrompt,
6
+ collectResolveIOAICoderJourneyContractIssues,
7
+ decideResolveIOAICoderV6Continuation,
8
+ evaluateResolveIOAICoderWorkflowProofReadiness,
9
+ extractResolveIOAICoderJourneyContractFromMarkdown,
10
+ fingerprintResolveIOAICoderV6Blocker,
11
+ initializeResolveIOAICoderV6State,
12
+ recordResolveIOAICoderV6Step,
13
+ validateResolveIOAICoderJourneyContract
14
+ } from '../src/util/aicoder-runner-v6';
15
+
16
+ const initialized = initializeResolveIOAICoderV6State({
17
+ runKind: 'initial_builder',
18
+ jobId: 'job-1',
19
+ appId: 'app-1',
20
+ title: 'Build crypto dashboard',
21
+ description: 'Create a complete crypto trading dashboard.',
22
+ branchName: 'ai/crypto-dashboard',
23
+ now: '2026-06-07T12:00:00.000Z'
24
+ });
25
+
26
+ assert.equal(initialized.aiCoderRunnerVersion, 'v6');
27
+ assert.equal(initialized.aiCoderV6SupervisorState.runKind, 'initial_builder');
28
+ assert.equal(initialized.aiCoderV6SupervisorState.activeLane, 'plan');
29
+ assert.equal(initialized.aiCoderV6LaneMemory.build.threadKey, 'aicoder:initial_builder:job-1:build');
30
+ assert.equal(initialized.aiCoderV6Budget.maxRepeatedNoProgress, 2);
31
+ assert.equal(initialized.aiCoderV6WorkflowMemory.journeyContractPath, 'docs/APP_JOURNEY_CONTRACT.md');
32
+ assert.deepEqual(initialized.aiCoderV6RecoveryDispatchHistory, []);
33
+ assert.equal(initialized.aiCoderV6RecoveryDirective, undefined);
34
+
35
+ const validJourneyContract = {
36
+ app_archetype: 'optimizer',
37
+ primary_actor: 'Operations planner',
38
+ primary_goal: 'Create a saved hose pressure recommendation for a field route.',
39
+ primary_workflow_id: 'layflat-optimizer',
40
+ first_screen: {
41
+ route: '/dashboard/hub',
42
+ purpose: 'Command center showing active scenarios and the recommended next optimizer action.',
43
+ visible_cta: 'Start optimizer scenario',
44
+ next_step: 'Open scenario assumptions with seeded route data.'
45
+ },
46
+ north_star_workflow: [{
47
+ position: 'first',
48
+ id: 'start-scenario',
49
+ route: '/dashboard/hub',
50
+ visible_cta: 'Start optimizer scenario',
51
+ data_input_or_selection: 'Select the seeded North Field route scenario.',
52
+ method_or_calculation: 'local calculation path optimizerScenarioDraft plus server method saveOptimizerScenarioDraft',
53
+ expected_state_transition: 'Scenario assumptions panel opens with route, elevation, pump, and hose records loaded.',
54
+ success_confirmation: 'Scenario ready badge appears.',
55
+ next_step_destination: '/dashboard/hub?scenario=active'
56
+ }, {
57
+ position: 'next',
58
+ id: 'run-optimizer',
59
+ route: '/dashboard/hub',
60
+ visible_cta: 'Run optimization',
61
+ data_input_or_selection: 'Confirm pressure limit, terrain elevation, pump, and hose specs.',
62
+ method_or_calculation: 'local calculation path runLayflatPressureOptimizer and server method saveOptimizerResult',
63
+ expected_state_transition: 'Alternatives table and recommendation card update.',
64
+ success_confirmation: 'Recommendation calculated badge appears.',
65
+ next_step_destination: '/dashboard/hub?result=compare'
66
+ }, {
67
+ position: 'last',
68
+ id: 'save-report',
69
+ route: '/reports/optimizer',
70
+ visible_cta: 'Save recommendation report',
71
+ data_input_or_selection: 'Choose the recommended hose plan from the comparison table.',
72
+ method_or_calculation: 'server method publishOptimizerRecommendation and report export path optimizerRecommendationPdf',
73
+ expected_state_transition: 'Saved report row appears with export controls.',
74
+ success_confirmation: 'Recommendation saved and report ready message appears.',
75
+ final_result: 'Saved optimizer recommendation with exportable pressure report.'
76
+ }],
77
+ secondary_workflows: [
78
+ { id: 'setup', route: '/manage/settings', purpose: 'Maintain pump and hose defaults.' },
79
+ { id: 'report-export', route: '/reports/optimizer', purpose: 'Review and export saved recommendations.' },
80
+ { id: 'recovery', route: '/dashboard/hub', purpose: 'Show empty and invalid pressure recovery states.' }
81
+ ],
82
+ screen_sequence: [{
83
+ workflow_step_id: 'start-scenario',
84
+ route: '/dashboard/hub',
85
+ screen_purpose: 'Command center with seeded scenario, KPIs, next-up work queue, and embedded optimizer action.',
86
+ visible_cta: 'Start optimizer scenario',
87
+ action: 'Open scenario assumptions',
88
+ method_or_calculation: 'local calculation path optimizerScenarioDraft',
89
+ expected_next_state: 'Scenario assumptions are visible.',
90
+ data_shown: 'Seeded route, elevation, pump, hose, and pressure-limit records.'
91
+ }, {
92
+ workflow_step_id: 'run-optimizer',
93
+ route: '/dashboard/hub',
94
+ screen_purpose: 'Run optimizer and compare alternatives.',
95
+ visible_cta: 'Run optimization',
96
+ action: 'Calculate pressure recommendation',
97
+ method_or_calculation: 'local calculation path runLayflatPressureOptimizer',
98
+ expected_next_state: 'Recommendation and alternatives update.',
99
+ data_shown: 'Comparison table, pressure KPIs, and recommendation card.'
100
+ }, {
101
+ workflow_step_id: 'save-report',
102
+ route: '/reports/optimizer',
103
+ screen_purpose: 'Save and export recommendation report.',
104
+ visible_cta: 'Save recommendation report',
105
+ action: 'Persist recommendation report',
106
+ method_or_calculation: 'server method publishOptimizerRecommendation',
107
+ expected_next_state: 'Saved report row and export button visible.',
108
+ data_shown: 'Saved recommendation, route assumptions, calculated pressure, and export status.'
109
+ }],
110
+ data_story: {
111
+ seeded_scenario: 'North Field irrigation route with elevation changes, two pump options, and three hose alternatives.',
112
+ records: ['North Field route', 'Pump A', 'Pump B', '4-inch layflat hose', '6-inch layflat hose'],
113
+ relationships: ['Route uses pump options', 'Pump options feed hose alternatives', 'Optimization result belongs to scenario'],
114
+ non_empty_states: ['Dashboard KPI cards show pressure, flow, and route length.', 'Reports table shows saved recommendation row.']
115
+ },
116
+ completion_states: [
117
+ 'Recommendation card shows selected hose and pressure margin.',
118
+ 'Report route lists saved recommendation with export action.'
119
+ ],
120
+ qa_assertions: [{
121
+ id: 'login-hub',
122
+ workflow_step_id: 'start-scenario',
123
+ route: '/dashboard/hub',
124
+ coverage_tags: ['login', 'hub_action', 'non_empty_data'],
125
+ proof_kind: 'login',
126
+ action: 'Login and land on dashboard hub.',
127
+ expected_dom_or_data_proof: 'Hub shows seeded North Field scenario and non-empty KPI cards.'
128
+ }, {
129
+ id: 'primary-hub-action',
130
+ workflow_step_id: 'start-scenario',
131
+ route: '/dashboard/hub',
132
+ coverage_tags: ['hub_action'],
133
+ proof_kind: 'hub_action',
134
+ action: 'Click Start optimizer scenario.',
135
+ expected_dom_or_data_proof: 'Scenario assumptions panel opens with seeded route and pump records.'
136
+ }, {
137
+ id: 'workflow-completion',
138
+ covers_workflow_step_ids: ['run-optimizer', 'save-report'],
139
+ route: '/dashboard/hub',
140
+ coverage_tags: ['workflow_completion', 'report_export'],
141
+ proof_kind: 'report_export',
142
+ action: 'Run optimization and save recommendation.',
143
+ expected_dom_or_data_proof: 'Saved recommendation report row appears with calculated pressure result.'
144
+ }, {
145
+ id: 'mobile-viewport',
146
+ covers_workflow_step_ids: ['start-scenario', 'run-optimizer', 'save-report'],
147
+ route: '/dashboard/hub',
148
+ coverage_tags: ['mobile', 'workflow_completion'],
149
+ proof_kind: 'mobile',
150
+ action: 'Repeat primary optimizer path at mobile viewport 390x844.',
151
+ expected_dom_or_data_proof: 'Mobile hub shows non-empty scenario and recommendation controls.',
152
+ viewport: '390x844 mobile'
153
+ }, {
154
+ id: 'empty-error-recovery',
155
+ workflow_step_id: 'start-scenario',
156
+ route: '/dashboard/hub',
157
+ coverage_tags: ['recovery'],
158
+ proof_kind: 'recovery',
159
+ action: 'Clear scenario input and submit invalid pressure limit.',
160
+ expected_dom_or_data_proof: 'Empty/error recovery message appears and Start optimizer scenario remains available.'
161
+ }]
162
+ };
163
+
164
+ const validJourneyValidation = validateResolveIOAICoderJourneyContract(validJourneyContract);
165
+ assert.equal(validJourneyValidation.valid, true);
166
+ assert.equal(validJourneyValidation.primaryWorkflowId, 'layflat-optimizer');
167
+ assert.equal(validJourneyValidation.workflowQaRows.length, 5);
168
+ assert.equal(validJourneyValidation.workflowQaRows[2].stepId, 'workflow-completion');
169
+ assert.equal(validJourneyValidation.workflowQaRows[2].workflowStepId, undefined);
170
+ assert.deepEqual(validJourneyValidation.workflowQaRows[2].workflowStepIds, ['run-optimizer', 'save-report']);
171
+ assert.equal(validJourneyValidation.workflowQaRows[2].acceptanceGate, 'aiqa_business_assertion');
172
+ assert.equal(validJourneyValidation.workflowQaRows[2].proofKind, 'report_export');
173
+ assert.deepEqual(validJourneyValidation.workflowQaRows[2].coverageTags, ['workflow_completion', 'report_export']);
174
+ assert.ok(validJourneyValidation.workflowQaRows[2].requiredArtifacts?.some((artifact) => /saved output row proof|generated report\/export artifact/i.test(artifact)));
175
+ assert.equal(validJourneyValidation.workflowQaRows[2].stateTransition?.assertion, 'Saved recommendation report row appears with calculated pressure result.');
176
+ assert.equal(buildResolveIOAICoderWorkflowQaRowsFromJourneyContract(validJourneyContract)[0].workflowId, 'layflat-optimizer');
177
+
178
+ const validJourneyMarkdown = `# App Journey Contract
179
+
180
+ ## journey_contract
181
+ \`\`\`json
182
+ ${JSON.stringify(validJourneyContract, null, 2)}
183
+ \`\`\`
184
+ `;
185
+ assert.equal(extractResolveIOAICoderJourneyContractFromMarkdown(validJourneyMarkdown)?.app_archetype, 'optimizer');
186
+ assert.equal(validateResolveIOAICoderJourneyContract(validJourneyMarkdown).valid, true);
187
+
188
+ const passingWorkflowQaRows = buildResolveIOAICoderWorkflowQaRowsFromJourneyContract(validJourneyContract).map((row) => ({
189
+ ...row,
190
+ status: 'pass',
191
+ artifactPaths: [`qa-artifacts/${row.stepId || row.index}.json`]
192
+ }));
193
+ const passingWorkflowBusinessAssertions = passingWorkflowQaRows.map((row) => ({
194
+ stepId: row.stepId,
195
+ workflowId: row.workflowId,
196
+ route: row.route,
197
+ action: row.action,
198
+ assertion: row.assertion || row.expectedState,
199
+ status: 'pass',
200
+ observed: `${row.stepId || row.index} produced the expected visible state in the north-star workflow.`,
201
+ dataProof: `${row.stepId || row.index} has observed DOM/data proof from seeded Layflat records.`,
202
+ artifactPaths: row.artifactPaths
203
+ }));
204
+ const workflowProofReady = evaluateResolveIOAICoderWorkflowProofReadiness({
205
+ journeyContract: validJourneyContract,
206
+ workflowQaRows: passingWorkflowQaRows,
207
+ businessAssertions: passingWorkflowBusinessAssertions,
208
+ routeProbes: [{ route: '/dashboard/hub', status: 'pass' }],
209
+ scorecardPassed: true,
210
+ deployStatus: 'pass',
211
+ publishStatus: 'published',
212
+ sampleDataStatus: 'pass',
213
+ now: '2026-06-07T12:00:00.000Z'
214
+ });
215
+ assert.equal(workflowProofReady.ready, true);
216
+ assert.equal(workflowProofReady.status, 'ready');
217
+ assert.equal(workflowProofReady.passedWorkflowRows.length, 5);
218
+ assert.equal(workflowProofReady.sampleDataReady, true);
219
+ assert.match(workflowProofReady.workflowProofFingerprint, /^aicoder-workflow-proof-/);
220
+ assert.match(workflowProofReady.artifactFingerprint, /^aicoder-workflow-artifacts-/);
221
+ assert.equal(workflowProofReady.proofFreshness, 'fresh');
222
+
223
+ const staleWorkflowProof = evaluateResolveIOAICoderWorkflowProofReadiness({
224
+ journeyContract: validJourneyContract,
225
+ workflowQaRows: passingWorkflowQaRows,
226
+ businessAssertions: passingWorkflowBusinessAssertions,
227
+ routeProbes: [{ route: '/dashboard/hub', status: 'pass' }],
228
+ scorecardPassed: true,
229
+ deployStatus: 'pass',
230
+ publishStatus: 'published',
231
+ sampleDataStatus: 'pass',
232
+ previousWorkflowProofFingerprint: workflowProofReady.workflowProofFingerprint,
233
+ now: '2026-06-07T12:03:00.000Z'
234
+ });
235
+ assert.equal(staleWorkflowProof.ready, false);
236
+ assert.equal(staleWorkflowProof.status, 'stale_workflow_proof');
237
+ assert.equal(staleWorkflowProof.proofFreshness, 'same_as_previous');
238
+ assert.ok(staleWorkflowProof.nextAction.includes('Rerun workflow QA'));
239
+
240
+ const routeOnlyWorkflowProof = evaluateResolveIOAICoderWorkflowProofReadiness({
241
+ journeyContract: validJourneyContract,
242
+ routeProbes: [{ route: '/dashboard/hub', status: 'pass' }],
243
+ scorecardPassed: true
244
+ });
245
+ assert.equal(routeOnlyWorkflowProof.ready, false);
246
+ assert.equal(routeOnlyWorkflowProof.status, 'route_only');
247
+ assert.equal(routeOnlyWorkflowProof.scorecardOnly, true);
248
+
249
+ const screenshotOnlyWorkflowProof = evaluateResolveIOAICoderWorkflowProofReadiness({
250
+ journeyContract: validJourneyContract,
251
+ workflowQaRows: passingWorkflowQaRows,
252
+ businessAssertions: passingWorkflowBusinessAssertions.map((assertion) => ({
253
+ ...assertion,
254
+ observed: '',
255
+ dataProof: '',
256
+ artifactPaths: assertion.artifactPaths
257
+ })),
258
+ scorecardPassed: true,
259
+ sampleDataStatus: 'pass'
260
+ });
261
+ assert.equal(screenshotOnlyWorkflowProof.ready, false);
262
+ assert.equal(screenshotOnlyWorkflowProof.status, 'business_proof_weak');
263
+ assert.ok(screenshotOnlyWorkflowProof.blockers.some((blocker) => /observed DOM\/data proof/i.test(blocker)));
264
+
265
+ const weakWorkflowProofRows = buildResolveIOAICoderWorkflowQaRowsFromJourneyContract(validJourneyContract).map((row) => ({
266
+ ...row,
267
+ status: 'pass',
268
+ artifactPaths: []
269
+ }));
270
+ const weakWorkflowProof = evaluateResolveIOAICoderWorkflowProofReadiness({
271
+ journeyContract: validJourneyContract,
272
+ workflowQaRows: weakWorkflowProofRows,
273
+ businessAssertions: [{
274
+ stepId: 'workflow-completion',
275
+ workflowId: 'layflat-optimizer',
276
+ route: '/dashboard/hub',
277
+ assertion: 'Saved recommendation report row appears with calculated pressure result.',
278
+ status: 'pass',
279
+ dataProof: 'North Field seeded hose records produced saved optimizer recommendation pressure output.'
280
+ }],
281
+ scorecardPassed: true,
282
+ sampleDataStatus: 'pass'
283
+ });
284
+ assert.equal(weakWorkflowProof.ready, false);
285
+ assert.equal(weakWorkflowProof.status, 'business_proof_weak');
286
+ assert.ok(weakWorkflowProof.blockers.some((blocker) => /missing required artifact proof|AIQaBusinessAssertion/i.test(blocker)));
287
+
288
+ const partialWorkflowProof = evaluateResolveIOAICoderWorkflowProofReadiness({
289
+ journeyContract: validJourneyContract,
290
+ workflowQaRows: passingWorkflowQaRows.slice(0, 2),
291
+ businessAssertions: passingWorkflowBusinessAssertions.slice(0, 2),
292
+ sampleDataStatus: 'pass'
293
+ });
294
+ assert.equal(partialWorkflowProof.ready, false);
295
+ assert.equal(partialWorkflowProof.status, 'workflow_qa_incomplete');
296
+ assert.ok(partialWorkflowProof.missingWorkflowRows.length > 0);
297
+
298
+ const releaseBlockedWorkflowProof = evaluateResolveIOAICoderWorkflowProofReadiness({
299
+ journeyContract: validJourneyContract,
300
+ workflowQaRows: passingWorkflowQaRows,
301
+ businessAssertions: passingWorkflowBusinessAssertions,
302
+ sampleDataStatus: 'pass',
303
+ deployStatus: 'pass',
304
+ publishStatus: 'publish failed'
305
+ });
306
+ assert.equal(releaseBlockedWorkflowProof.ready, false);
307
+ assert.equal(releaseBlockedWorkflowProof.status, 'release_blocked');
308
+ assert.ok(releaseBlockedWorkflowProof.releaseBlockers.some((blocker) => /publish/.test(blocker)));
309
+
310
+ const missingOrderedWorkflowIssues = collectResolveIOAICoderJourneyContractIssues({
311
+ ...validJourneyContract,
312
+ north_star_workflow: validJourneyContract.north_star_workflow.slice(0, 2)
313
+ }, { requireMarkdownEnvelope: false });
314
+ assert.ok(missingOrderedWorkflowIssues.some((issue) => /first, next, and last/i.test(issue)));
315
+
316
+ const ctaWithoutImplementationIssues = collectResolveIOAICoderJourneyContractIssues({
317
+ ...validJourneyContract,
318
+ north_star_workflow: validJourneyContract.north_star_workflow.map((step, index) => index === 1
319
+ ? { ...step, method_or_calculation: '' }
320
+ : step)
321
+ }, { requireMarkdownEnvelope: false });
322
+ assert.ok(ctaWithoutImplementationIssues.some((issue) => /server method, publication, local calculation/i.test(issue)));
323
+
324
+ const linkOnlyHubIssues = collectResolveIOAICoderJourneyContractIssues({
325
+ ...validJourneyContract,
326
+ screen_sequence: validJourneyContract.screen_sequence.map((screen, index) => index === 0
327
+ ? {
328
+ route: '/dashboard/hub',
329
+ screen_purpose: 'Command center link list.',
330
+ visible_cta: 'Open optimizer page',
331
+ action: 'Navigate to optimizer route',
332
+ expected_next_state: 'Route opens.',
333
+ data_shown: 'Links to pages.'
334
+ }
335
+ : screen)
336
+ }, { requireMarkdownEnvelope: false });
337
+ assert.ok(linkOnlyHubIssues.some((issue) => /link farm|navigate without changing workflow state/i.test(issue)));
338
+
339
+ const disconnectedScreenIssues = collectResolveIOAICoderJourneyContractIssues({
340
+ ...validJourneyContract,
341
+ screen_sequence: validJourneyContract.screen_sequence.map((screen, index) => index === 1
342
+ ? {
343
+ workflow_step_id: 'unrelated-review-step',
344
+ route: '/reports/summary',
345
+ screen_purpose: 'Review unrelated summary data.',
346
+ visible_cta: 'Review summary',
347
+ action: 'Review unrelated summary output',
348
+ method_or_calculation: 'local calculation path unrelatedSummary',
349
+ expected_next_state: 'Summary panel updates.',
350
+ data_shown: 'Unrelated summary rows.'
351
+ }
352
+ : screen)
353
+ }, { requireMarkdownEnvelope: false });
354
+ assert.ok(disconnectedScreenIssues.some((issue) => /screen_sequence\[1\].*north_star_workflow step/i.test(issue)));
355
+ assert.ok(disconnectedScreenIssues.some((issue) => /north_star_workflow\[1\].*matching screen_sequence row/i.test(issue)));
356
+
357
+ const weakDataStoryIssues = collectResolveIOAICoderJourneyContractIssues({
358
+ ...validJourneyContract,
359
+ data_story: {
360
+ seeded_scenario: 'Short',
361
+ records: [],
362
+ relationships: [],
363
+ non_empty_states: []
364
+ }
365
+ }, { requireMarkdownEnvelope: false });
366
+ assert.ok(weakDataStoryIssues.some((issue) => /seeded records/i.test(issue)));
367
+ assert.ok(weakDataStoryIssues.some((issue) => /non-empty dashboard/i.test(issue)));
368
+
369
+ const routeOnlyQaIssues = collectResolveIOAICoderJourneyContractIssues({
370
+ ...validJourneyContract,
371
+ qa_assertions: [{
372
+ id: 'route-load',
373
+ route: '/dashboard/hub',
374
+ action: 'Open route',
375
+ expected_dom_or_data_proof: 'Route loaded'
376
+ }]
377
+ }, { requireMarkdownEnvelope: false });
378
+ assert.ok(routeOnlyQaIssues.some((issue) => /workflow completion|business completion|mobile viewport|non-empty/i.test(issue)));
379
+
380
+ const proseOnlyQaIssues = collectResolveIOAICoderJourneyContractIssues({
381
+ ...validJourneyContract,
382
+ qa_assertions: [{
383
+ id: 'login-hub',
384
+ route: '/dashboard/hub',
385
+ action: 'Login and land on dashboard hub.',
386
+ expected_dom_or_data_proof: 'Hub shows seeded North Field scenario and non-empty KPI cards.'
387
+ }, {
388
+ id: 'primary-hub-action',
389
+ route: '/dashboard/hub',
390
+ action: 'Click Start optimizer scenario.',
391
+ expected_dom_or_data_proof: 'Scenario assumptions panel opens with seeded route and pump records.'
392
+ }, {
393
+ id: 'workflow-completion',
394
+ route: '/dashboard/hub',
395
+ action: 'Run optimization and save recommendation.',
396
+ expected_dom_or_data_proof: 'Saved recommendation report row appears with calculated pressure result.'
397
+ }, {
398
+ id: 'mobile-viewport',
399
+ route: '/dashboard/hub',
400
+ action: 'Repeat primary optimizer path at mobile viewport 390x844.',
401
+ expected_dom_or_data_proof: 'Mobile hub shows non-empty scenario and recommendation controls.',
402
+ viewport: '390x844 mobile'
403
+ }, {
404
+ id: 'empty-error-recovery',
405
+ route: '/dashboard/hub',
406
+ action: 'Clear scenario input and submit invalid pressure limit.',
407
+ expected_dom_or_data_proof: 'Empty/error recovery message appears and Start optimizer scenario remains available.'
408
+ }]
409
+ }, { requireMarkdownEnvelope: false });
410
+ assert.ok(proseOnlyQaIssues.some((issue) => /coverage_tags|prose-only keyword/i.test(issue)));
411
+
412
+ const disconnectedQaIssues = collectResolveIOAICoderJourneyContractIssues({
413
+ ...validJourneyContract,
414
+ qa_assertions: [{
415
+ id: 'login-hub',
416
+ route: '/dashboard/hub',
417
+ coverage_tags: ['login', 'hub_action', 'non_empty_data'],
418
+ proof_kind: 'login',
419
+ action: 'Authenticate and confirm the dashboard shell is visible.',
420
+ expected_dom_or_data_proof: 'Dashboard shell loaded with a title.'
421
+ }, {
422
+ id: 'primary-hub-action',
423
+ route: '/dashboard/hub',
424
+ coverage_tags: ['hub_action'],
425
+ proof_kind: 'hub_action',
426
+ action: 'Confirm a generic command exists.',
427
+ expected_dom_or_data_proof: 'A command button is visible.'
428
+ }, {
429
+ id: 'workflow-completion',
430
+ route: '/dashboard/hub',
431
+ coverage_tags: ['workflow_completion', 'report_export'],
432
+ proof_kind: 'report_export',
433
+ action: 'Confirm a workflow finished.',
434
+ expected_dom_or_data_proof: 'A generic success message is visible.'
435
+ }, {
436
+ id: 'mobile-viewport',
437
+ route: '/dashboard/hub',
438
+ coverage_tags: ['mobile', 'workflow_completion'],
439
+ proof_kind: 'mobile',
440
+ action: 'Open the mobile dashboard.',
441
+ expected_dom_or_data_proof: 'Mobile shell is visible.',
442
+ viewport: '390x844 mobile'
443
+ }, {
444
+ id: 'empty-error-recovery',
445
+ route: '/dashboard/hub',
446
+ coverage_tags: ['recovery'],
447
+ proof_kind: 'recovery',
448
+ action: 'Trigger generic validation.',
449
+ expected_dom_or_data_proof: 'A generic error message is visible.'
450
+ }]
451
+ }, { requireMarkdownEnvelope: false });
452
+ assert.ok(disconnectedQaIssues.some((issue) => /qa_assertions\[0\].*workflow_step_id|qa_assertions\[0\].*covers_workflow_step_ids/i.test(issue)));
453
+ assert.ok(disconnectedQaIssues.some((issue) => /north_star_workflow\[1\].*covered by at least one qa_assertions row/i.test(issue)));
454
+
455
+ const withBuildFailure = recordResolveIOAICoderV6Step(initialized, {
456
+ lane: 'build',
457
+ stepType: 'build',
458
+ outcome: 'needs_repair',
459
+ model: 'gpt-5.3-codex',
460
+ threadKey: 'job-1:build',
461
+ promptVersion: 'abc123',
462
+ promptTokenEstimate: 1200,
463
+ inputTokens: 1000,
464
+ cachedInputTokens: 200,
465
+ outputTokens: 300,
466
+ summary: 'Angular build failed.',
467
+ blocker: 'TS2304 line 42 cannot find name InvoiceModel',
468
+ changedFiles: ['angular/app/dashboard/hub/dashboard-hub.component.ts'],
469
+ artifactPaths: ['.dashboard-output/build-client.log'],
470
+ now: '2026-06-07T12:01:00.000Z'
471
+ });
472
+
473
+ assert.equal(withBuildFailure.aiCoderV6SupervisorState.activeLane, 'build');
474
+ assert.equal(withBuildFailure.aiCoderV6SupervisorState.activeStep, 'build');
475
+ assert.equal(withBuildFailure.aiCoderV6LaneMemory.build.latestPromptVersion, 'abc123');
476
+ assert.equal(withBuildFailure.aiCoderV6Budget.totalInputTokens, 1000);
477
+ assert.equal(withBuildFailure.aiCoderV6Budget.totalCachedInputTokens, 200);
478
+ assert.equal(withBuildFailure.aiCoderV6Budget.totalOutputTokens, 300);
479
+ assert.equal(withBuildFailure.aiCoderV6StepHistory[0].blockerFingerprint, fingerprintResolveIOAICoderV6Blocker('TS2304 line 99 cannot find name InvoiceModel'));
480
+ assert.equal(withBuildFailure.aiCoderV6RecoveryPlan?.recoveryClass, 'compile_repair');
481
+ assert.equal(withBuildFailure.aiCoderV6RecoveryCheckpoint?.recoveryClass, 'compile_repair');
482
+ assert.equal(withBuildFailure.aiCoderV6RecoveryAction?.checkpointId, withBuildFailure.aiCoderV6RecoveryCheckpoint?.checkpointId);
483
+ const buildFailureDecision = decideResolveIOAICoderV6Continuation(withBuildFailure);
484
+ assert.equal(buildFailureDecision.action, 'infra_retry');
485
+ assert.equal(buildFailureDecision.reason, 'aicoder_v6_compile_repair_required');
486
+ assert.equal(buildFailureDecision.recoveryPlan.recoveryClass, 'compile_repair');
487
+ assert.equal(buildFailureDecision.recoveryPlan.productRepairAllowed, false);
488
+ assert.ok(buildFailureDecision.recoveryPlan.requiredEvidence.includes('compile log artifact'));
489
+ assert.equal(buildFailureDecision.recoveryCheckpoint.recoveryClass, 'compile_repair');
490
+ assert.equal(buildFailureDecision.recoveryCheckpoint.productRepairAllowed, false);
491
+ assert.equal(buildFailureDecision.workflowReadiness.status, 'compile_repair_only');
492
+ assert.equal(buildFailureDecision.workflowReadiness.compileOnly, true);
493
+ assert.equal(buildFailureDecision.workflowReadiness.canRunProductRepair, false);
494
+ assert.equal(buildFailureDecision.nextActionContract.primaryCommand, 'repair_aicoder_compile_gate');
495
+ assert.equal(buildFailureDecision.nextActionContract.costRisk, 'small_model_or_qa');
496
+ assert.equal(buildFailureDecision.nextActionContract.canRunWithoutCodexMonitor, true);
497
+ assert.ok(buildFailureDecision.nextActionContract.stopConditions.some((entry) => /compile failures stay in infra\/compile repair/i.test(entry)));
498
+
499
+ const withWorkflowQa = recordResolveIOAICoderV6Step(initialized, {
500
+ lane: 'qa',
501
+ stepType: 'workflow_qa',
502
+ outcome: 'pass',
503
+ primaryWorkflowId: 'north-star',
504
+ activeWorkflowStep: 'save-result',
505
+ workflowQaRows: [{
506
+ index: 1,
507
+ workflowId: 'north-star',
508
+ stepId: 'save-result',
509
+ route: '/dashboard/hub',
510
+ action: 'Save recommendation',
511
+ assertion: 'Saved result appears in the recommendations table.',
512
+ expectedState: 'Recommendation saved',
513
+ status: 'pass',
514
+ artifactPaths: ['.build-output/workflow-save-result.png']
515
+ }],
516
+ artifactPaths: ['.build-output/workflow-save-result.png'],
517
+ businessProofArtifacts: ['.build-output/workflow-save-result-business-proof.json'],
518
+ summary: 'North-star workflow QA passed.'
519
+ });
520
+
521
+ assert.equal(withWorkflowQa.aiCoderV6WorkflowMemory.primaryWorkflowId, 'north-star');
522
+ assert.equal(withWorkflowQa.aiCoderV6WorkflowMemory.activeWorkflowStep, 'save-result');
523
+ assert.equal(withWorkflowQa.aiCoderV6WorkflowMemory.completedWorkflowSteps.includes('save-result'), true);
524
+ assert.equal(withWorkflowQa.aiCoderV6WorkflowMemory.workflowQaRows[0].route, '/dashboard/hub');
525
+ assert.equal(withWorkflowQa.aiCoderV6WorkflowMemory.businessProofArtifacts.includes('.build-output/workflow-save-result-business-proof.json'), true);
526
+ const workflowReadyDecision = decideResolveIOAICoderV6Continuation(withWorkflowQa);
527
+ assert.equal(workflowReadyDecision.workflowReadiness.status, 'workflow_business_proof_ready');
528
+ assert.equal(workflowReadyDecision.workflowReadiness.businessProofReady, true);
529
+ assert.equal(workflowReadyDecision.workflowReadiness.canPublish, true);
530
+ assert.equal(workflowReadyDecision.workflowReadiness.canPolishWowUi, true);
531
+ assert.equal(workflowReadyDecision.workflowProofCheckpoint.status, 'ready_to_continue');
532
+ assert.equal(workflowReadyDecision.workflowProofCheckpoint.blocksPublishUntilWorkflowProof, false);
533
+ assert.equal(workflowReadyDecision.workflowProofCheckpoint.blocksWowUiUntilWorkflowProof, false);
534
+ assert.equal(workflowReadyDecision.nextActionContract.primaryCommand, 'continue_aicoder_workflow');
535
+ assert.equal(workflowReadyDecision.nextActionContract.workflowFirstSatisfied, true);
536
+ assert.equal(workflowReadyDecision.nextActionContract.codexFallbackRequired, false);
537
+ assert.equal(workflowReadyDecision.nextActionContract.decisionBasis.canPublish, true);
538
+
539
+ let repeated = withBuildFailure;
540
+ for (let index = 0; index < 3; index += 1) {
541
+ repeated = recordResolveIOAICoderV6Step(repeated, {
542
+ lane: 'build',
543
+ stepType: 'build',
544
+ outcome: 'needs_repair',
545
+ summary: 'Angular build failed.',
546
+ blocker: 'TS2304 line 77 cannot find name InvoiceModel',
547
+ now: `2026-06-07T12:0${index + 2}:00.000Z`
548
+ });
549
+ }
550
+
551
+ const repeatedDecision = decideResolveIOAICoderV6Continuation(repeated);
552
+ assert.equal(repeatedDecision.action, 'park');
553
+ assert.equal(repeatedDecision.reason, 'aicoder_v6_repeated_no_progress');
554
+ assert.equal(repeatedDecision.recoveryPlan.recoveryClass, 'blocked_until_new_evidence');
555
+ assert.equal(repeatedDecision.recoveryPlan.allowedAction, 'collect_new_evidence_only');
556
+ assert.equal(repeatedDecision.recoveryCheckpoint.status, 'parked');
557
+ assert.equal(repeatedDecision.recoveryCheckpoint.allowedAction, 'collect_new_evidence_only');
558
+ assert.equal(repeatedDecision.recoveryEvidenceProbe.evidenceOnly, true);
559
+ assert.equal(repeatedDecision.recoveryEvidenceProbe.productRepairAllowed, false);
560
+ assert.ok(repeatedDecision.recoveryEvidenceProbe.steps.some((step) => step.kind === 'rerun_same_gate'));
561
+ assert.equal(repeatedDecision.recoveryAction.mode, 'collect_evidence');
562
+ assert.equal(repeatedDecision.recoveryAction.retryPolicy.requireNewEvidence, true);
563
+ assert.equal(repeatedDecision.recoveryAction.productRepairAllowed, false);
564
+ assert.equal(repeatedDecision.workflowReadiness.status, 'collect_new_evidence');
565
+ assert.equal(repeatedDecision.workflowReadiness.sameFailureParked, true);
566
+ assert.equal(repeatedDecision.workflowReadiness.canRunProductRepair, false);
567
+ assert.equal(repeatedDecision.workflowProofCheckpoint.status, 'waiting_for_new_evidence');
568
+ assert.equal(repeatedDecision.workflowProofCheckpoint.blocksPublishUntilWorkflowProof, true);
569
+ assert.equal(repeatedDecision.workflowProofCheckpoint.blocksWowUiUntilWorkflowProof, true);
570
+ assert.ok(repeatedDecision.workflowProofCheckpoint.requiredResetEvidence.some((entry) => /new workflow proof fingerprint|changed blocker fingerprint|fresh workflow QA artifact/i.test(entry)));
571
+ assert.equal(repeated.aiCoderV6RecoveryPlan?.recoveryClass, 'blocked_until_new_evidence');
572
+ assert.equal(repeated.aiCoderV6RecoveryCheckpoint?.status, 'parked');
573
+ assert.equal(repeated.aiCoderV6RecoveryEvidenceProbe?.checkpointId, repeated.aiCoderV6RecoveryCheckpoint?.checkpointId);
574
+
575
+ const newEvidenceRetry = recordResolveIOAICoderV6Step(withBuildFailure, {
576
+ lane: 'build',
577
+ stepType: 'build',
578
+ outcome: 'needs_repair',
579
+ failureClass: 'compile',
580
+ summary: 'Angular build failed with the same root blocker after a targeted change.',
581
+ blocker: 'TS2304 line 88 cannot find name InvoiceModel',
582
+ evidenceHash: 'compile-log-after-import-fix',
583
+ changedFiles: ['angular/app/dashboard/hub/dashboard-hub.component.ts'],
584
+ artifactPaths: ['.dashboard-output/build-client-after-import.log']
585
+ });
586
+ assert.equal(newEvidenceRetry.aiCoderV6Budget.loopCount, 1);
587
+ const newEvidenceDecision = decideResolveIOAICoderV6Continuation(newEvidenceRetry);
588
+ assert.equal(newEvidenceDecision.action, 'infra_retry');
589
+ assert.equal(newEvidenceDecision.recoveryPlan.recoveryClass, 'compile_repair');
590
+ assert.equal(newEvidenceDecision.recoveryPlan.productRepairAllowed, false);
591
+ assert.equal(newEvidenceDecision.workflowReadiness.status, 'compile_repair_only');
592
+ assert.ok(newEvidenceDecision.recoveryPlan.loopResetEvidence.some((entry) => /same check now passes|new infra\/compile blocker hash/.test(entry)));
593
+
594
+ const infraFailure = recordResolveIOAICoderV6Step(initialized, {
595
+ lane: 'qa',
596
+ stepType: 'workflow_qa',
597
+ outcome: 'needs_repair',
598
+ failureClass: 'infra',
599
+ summary: 'Puppeteer could not launch Chrome.',
600
+ blocker: 'Puppeteer could not launch Chrome from the configured executable path.'
601
+ });
602
+ const infraDecision = decideResolveIOAICoderV6Continuation(infraFailure);
603
+ assert.equal(infraDecision.action, 'infra_retry');
604
+ assert.equal(infraDecision.nextLane, 'qa');
605
+ assert.equal(infraDecision.reason, 'aicoder_v6_infra_retry');
606
+ assert.equal(infraDecision.recoveryPlan.recoveryClass, 'infra_repair');
607
+ assert.equal(infraDecision.recoveryPlan.expensiveModelAllowed, false);
608
+ assert.ok(infraDecision.recoveryPlan.forbiddenActions.some((action) => /product-code model repair/.test(action)));
609
+ assert.equal(infraDecision.workflowReadiness.status, 'infra_repair_only');
610
+ assert.equal(infraDecision.workflowReadiness.infraOnly, true);
611
+ assert.equal(infraDecision.workflowReadiness.canRunProductRepair, false);
612
+ assert.equal(infraDecision.nextActionContract.primaryCommand, 'repair_aicoder_infra_gate');
613
+ assert.equal(infraDecision.nextActionContract.costRisk, 'small_model_or_qa');
614
+ assert.equal(infraDecision.nextActionContract.decisionBasis.infraOnly, true);
615
+
616
+ const journeyFailure = recordResolveIOAICoderV6Step(initialized, {
617
+ lane: 'plan',
618
+ stepType: 'journey_validation',
619
+ outcome: 'needs_repair',
620
+ summary: 'Journey contract is missing first/next/last steps.',
621
+ blocker: 'docs/APP_JOURNEY_CONTRACT.md journey_contract.north_star_workflow has fewer than 3 ordered steps.'
622
+ });
623
+ const journeyDecision = decideResolveIOAICoderV6Continuation(journeyFailure);
624
+ assert.equal(journeyDecision.action, 'retry_same_step');
625
+ assert.equal(journeyDecision.nextLane, 'plan');
626
+ assert.equal(journeyDecision.nextStep, 'journey_contract');
627
+ assert.equal(journeyDecision.reason, 'aicoder_v6_journey_contract_repair_required');
628
+ assert.equal(journeyDecision.recoveryPlan.recoveryClass, 'journey_contract_repair');
629
+ assert.equal(journeyDecision.recoveryPlan.productRepairAllowed, false);
630
+ assert.ok(journeyDecision.recoveryPlan.forbiddenActions.some((action) => /empty routes/.test(action)));
631
+ assert.equal(journeyDecision.workflowReadiness.status, 'journey_contract_repair_required');
632
+ assert.equal(journeyDecision.workflowReadiness.nextGate, 'journey_contract');
633
+ assert.equal(journeyDecision.workflowReadiness.canRunProductRepair, false);
634
+ assert.equal(journeyDecision.nextActionContract.action, 'retry_same_step');
635
+ assert.equal(journeyDecision.nextActionContract.primaryCommand, 'repair_aicoder_journey_contract');
636
+ assert.equal(journeyDecision.nextActionContract.safeToAutoRun, true);
637
+ assert.equal(journeyDecision.nextActionContract.canRunWithoutCodexMonitor, true);
638
+ assert.equal(journeyDecision.nextActionContract.decisionBasis.journeyContractReady, false);
639
+ assert.ok(journeyDecision.nextActionContract.stopConditions.some((entry) => /APP_JOURNEY_CONTRACT\.md validates/i.test(entry)));
640
+
641
+ const releaseFailure = recordResolveIOAICoderV6Step(withWorkflowQa, {
642
+ lane: 'publish',
643
+ stepType: 'test_deploy',
644
+ outcome: 'needs_repair',
645
+ summary: 'Test deploy failed after workflow QA passed.',
646
+ blocker: 'CloudFront invalidation failed during test deploy.'
647
+ });
648
+ const releaseDecision = decideResolveIOAICoderV6Continuation(releaseFailure);
649
+ assert.equal(releaseDecision.action, 'retry_same_step');
650
+ assert.equal(releaseDecision.nextLane, 'publish');
651
+ assert.equal(releaseDecision.nextStep, 'test_deploy');
652
+ assert.equal(releaseDecision.reason, 'aicoder_v6_release_repair_required');
653
+ assert.equal(releaseDecision.recoveryPlan.recoveryClass, 'release_repair');
654
+ assert.equal(releaseDecision.recoveryPlan.expensiveModelAllowed, false);
655
+ assert.ok(releaseDecision.recoveryPlan.forbiddenActions.some((action) => /scorecard only/.test(action)));
656
+ assert.equal(releaseDecision.workflowReadiness.status, 'release_repair_required');
657
+ assert.equal(releaseDecision.workflowReadiness.releaseBlocked, true);
658
+ assert.equal(releaseDecision.workflowReadiness.canPublish, false);
659
+ assert.equal(releaseDecision.workflowProofCheckpoint.status, 'waiting_for_release_gate');
660
+ assert.equal(releaseDecision.workflowProofCheckpoint.blocksPublishUntilWorkflowProof, false);
661
+ assert.equal(releaseDecision.workflowProofCheckpoint.blocksPublishUntilReleaseGate, true);
662
+ assert.equal(releaseDecision.nextActionContract.primaryCommand, 'repair_aicoder_release_gate');
663
+ assert.equal(releaseDecision.nextActionContract.costRisk, 'release_or_customer_send');
664
+ assert.equal(releaseDecision.nextActionContract.decisionBasis.releaseBlocked, true);
665
+ assert.equal(releaseDecision.nextActionContract.decisionBasis.hotfixCommitRequired, true);
666
+ assert.equal(releaseDecision.nextActionContract.decisionBasis.liveHotfixBlockedUntilCommit, true);
667
+ assert.deepEqual(releaseDecision.nextActionContract.requiredHotfixCommitProof, ['sourceCommitSha', 'githubCommitUrl', 'gitCommitStatus=passed', 'gitPushStatus=passed']);
668
+ assert.ok(releaseDecision.nextActionContract.nextCommands.includes('prefer_hotfix_before_full_deploy'));
669
+ assert.ok(releaseDecision.nextActionContract.nextCommands.indexOf('commit_and_push_hotfix_to_github') < releaseDecision.nextActionContract.nextCommands.indexOf('apply_live_hotfix_only_after_github_commit_proof'));
670
+ assert.ok(releaseDecision.nextActionContract.stopConditions.some((entry) => /repeat a full publish\/deploy/i.test(entry)));
671
+ assert.ok(releaseDecision.nextActionContract.stopConditions.some((entry) => /sourceCommitSha.*githubCommitUrl.*gitCommitStatus.*gitPushStatus/i.test(entry)));
672
+
673
+ const routeOnlyWorkflowBundle = recordResolveIOAICoderV6Step(withWorkflowQa, {
674
+ lane: 'qa',
675
+ stepType: 'workflow_qa',
676
+ outcome: 'needs_repair',
677
+ failureClass: 'business',
678
+ summary: 'Route loaded but workflow result was not saved.',
679
+ blocker: 'Route-only browser proof: /dashboard/hub loaded without saved recommendation output.',
680
+ evidenceHash: 'route-only-proof',
681
+ artifactPaths: ['.build-output/route-loaded-only.png']
682
+ });
683
+ const routeOnlyWorkflowDecision = decideResolveIOAICoderV6Continuation(routeOnlyWorkflowBundle);
684
+ assert.equal(routeOnlyWorkflowDecision.workflowReadiness.status, 'workflow_qa_required');
685
+ assert.equal(routeOnlyWorkflowDecision.workflowReadiness.routeOnlyBlocked, true);
686
+ assert.equal(routeOnlyWorkflowDecision.workflowProofCheckpoint.status, 'waiting_for_workflow_proof');
687
+ assert.equal(routeOnlyWorkflowDecision.workflowProofCheckpoint.blocksPublishUntilWorkflowProof, true);
688
+ assert.equal(routeOnlyWorkflowDecision.workflowProofCheckpoint.blocksWowUiUntilWorkflowProof, true);
689
+ assert.equal(routeOnlyWorkflowDecision.nextActionContract.primaryCommand, 'run_aicoder_workflow_qa');
690
+ assert.equal(routeOnlyWorkflowDecision.nextActionContract.costRisk, 'small_model_or_qa');
691
+ assert.equal(routeOnlyWorkflowDecision.nextActionContract.decisionBasis.routeOnlyBlocked, true);
692
+ assert.ok(routeOnlyWorkflowDecision.nextActionContract.stopConditions.some((entry) => /Route-only proof/i.test(entry)));
693
+ assert.ok(routeOnlyWorkflowDecision.nextActionContract.forbiddenActions.some((entry) => /route-only proof/i.test(entry)));
694
+
695
+ const directRouteOnlyCheckpoint = buildResolveIOAICoderWorkflowProofCheckpoint({
696
+ status: 'workflow_qa_required',
697
+ nextGate: 'workflow_qa',
698
+ routeOnlyBlocked: true,
699
+ journeyContractReady: true,
700
+ businessProofReady: false,
701
+ last: routeOnlyWorkflowBundle.aiCoderV6StepHistory[routeOnlyWorkflowBundle.aiCoderV6StepHistory.length - 1],
702
+ workflowQaRows: routeOnlyWorkflowBundle.aiCoderV6WorkflowMemory.workflowQaRows,
703
+ businessProofArtifacts: []
704
+ });
705
+ assert.equal(directRouteOnlyCheckpoint.blocksPublishUntilWorkflowProof, true);
706
+ assert.ok(directRouteOnlyCheckpoint.requiredEvidence.some((entry) => /AIQaBusinessAssertion|saved\/calculated output/i.test(entry)));
707
+
708
+ let pingPong = initialized;
709
+ for (const blocker of ['Workflow save button is disabled', 'Workflow save button is enabled but does not persist', 'Workflow save button is disabled', 'Workflow save button is enabled but does not persist']) {
710
+ pingPong = recordResolveIOAICoderV6Step(pingPong, {
711
+ lane: 'qa',
712
+ stepType: 'workflow_qa',
713
+ outcome: 'needs_repair',
714
+ failureClass: 'business',
715
+ summary: blocker,
716
+ blocker,
717
+ evidenceHash: blocker
718
+ });
719
+ }
720
+ const pingPongDecision = decideResolveIOAICoderV6Continuation(pingPong);
721
+ assert.equal(pingPongDecision.action, 'park');
722
+ assert.equal(pingPongDecision.reason, 'aicoder_v6_ping_pong_no_progress');
723
+ assert.equal(pingPongDecision.recoveryPlan.recoveryClass, 'blocked_until_new_evidence');
724
+ assert.ok(pingPongDecision.recoveryPlan.forbiddenActions.some((action) => /alternate between two failed patches/.test(action)));
725
+
726
+ let terminalReplay = initializeResolveIOAICoderV6State({
727
+ runKind: 'terminal_helper',
728
+ jobId: 'terminal-job-1',
729
+ appId: 'app-1',
730
+ conversationId: 'conversation-1',
731
+ title: 'Fix app dashboard save action',
732
+ description: 'Terminal helper should recover from repeated dashboard save failures.',
733
+ branchName: 'ai/terminal-dashboard-fix',
734
+ now: '2026-06-07T12:20:00.000Z'
735
+ });
736
+ for (let index = 0; index < 3; index += 1) {
737
+ terminalReplay = recordResolveIOAICoderV6Step(terminalReplay, {
738
+ lane: 'repair',
739
+ stepType: 'repair',
740
+ outcome: 'needs_repair',
741
+ failureClass: 'product_code',
742
+ summary: 'Dashboard save action throws TypeError.',
743
+ blocker: 'Dashboard save action throws TypeError cannot read property id.',
744
+ evidenceHash: 'terminal-save-typeerror',
745
+ artifactPaths: ['.terminal-output/save-typeerror.log']
746
+ });
747
+ }
748
+ const terminalReplayDecision = decideResolveIOAICoderV6Continuation(terminalReplay);
749
+ assert.equal(terminalReplayDecision.action, 'park');
750
+ assert.equal(terminalReplayDecision.recoveryPlan.recoveryClass, 'blocked_until_new_evidence');
751
+ assert.equal(terminalReplayDecision.recoveryPlan.allowedAction, 'collect_new_evidence_only');
752
+ assert.ok(terminalReplayDecision.recoveryPlan.loopResetEvidence.some((evidence) => /new artifact path/.test(evidence)));
753
+ assert.equal(terminalReplayDecision.recoveryCheckpoint.status, 'parked');
754
+ assert.equal(terminalReplayDecision.recoveryCheckpoint.recoveryClass, 'blocked_until_new_evidence');
755
+ assert.equal(terminalReplayDecision.recoveryEvidenceProbe.evidenceOnly, true);
756
+ assert.ok(terminalReplayDecision.recoveryEvidenceProbe.acceptanceEvidence.some((evidence) => /new artifact path|changed evidence hash/i.test(evidence)));
757
+ assert.equal(terminalReplayDecision.recoveryAction.mode, 'collect_evidence');
758
+ assert.equal(terminalReplayDecision.recoveryAction.evidenceOnly, true);
759
+ assert.ok(terminalReplayDecision.recoveryAction.successCriteria.some((evidence) => /new artifact path|changed evidence hash/i.test(evidence)));
760
+
761
+ const terminalCompileFailure = recordResolveIOAICoderV6Step(initializeResolveIOAICoderV6State({
762
+ runKind: 'terminal_helper',
763
+ jobId: 'terminal-job-2',
764
+ appId: 'app-1',
765
+ conversationId: 'conversation-2',
766
+ title: 'Fix app dashboard compile failure',
767
+ description: 'Terminal helper should route app-dashboard compile failures to compile repair.',
768
+ branchName: 'ai/terminal-compile-fix',
769
+ now: '2026-06-07T12:26:00.000Z'
770
+ }), {
771
+ lane: 'build',
772
+ stepType: 'build',
773
+ outcome: 'needs_repair',
774
+ failureClass: 'compile',
775
+ summary: 'AI terminal dashboard build failed.',
776
+ blocker: 'TS2304 cannot find name DashboardWidgetModel',
777
+ evidenceHash: 'terminal-compile-before-import-fix',
778
+ artifactPaths: ['.terminal-output/build-client.log'],
779
+ now: '2026-06-07T12:27:00.000Z'
780
+ });
781
+ const terminalCompileDecision = decideResolveIOAICoderV6Continuation(terminalCompileFailure);
782
+ assert.equal(terminalCompileDecision.action, 'infra_retry');
783
+ assert.equal(terminalCompileDecision.reason, 'aicoder_v6_compile_repair_required');
784
+ assert.equal(terminalCompileDecision.nextLane, 'build');
785
+ assert.equal(terminalCompileDecision.nextStep, 'build');
786
+ assert.equal(terminalCompileDecision.recoveryPlan.recoveryClass, 'compile_repair');
787
+ assert.equal(terminalCompileDecision.recoveryPlan.productRepairAllowed, false);
788
+ assert.equal(terminalCompileDecision.recoveryPlan.expensiveModelAllowed, false);
789
+ assert.ok(terminalCompileDecision.recoveryPlan.forbiddenActions.some((action) => /product-code model repair|count this as product failure/i.test(action)));
790
+ assert.equal(terminalCompileDecision.workflowReadiness.status, 'compile_repair_only');
791
+
792
+ const prompt = buildResolveIOAICoderV6DiagnoseFirstPrompt({
793
+ goal: 'Ship a full-featured app update',
794
+ activeLane: 'repair',
795
+ activeStep: 'repair',
796
+ activeBlocker: 'Build failed',
797
+ journeyContractPath: 'docs/APP_JOURNEY_CONTRACT.md',
798
+ activeWorkflowStep: 'save-result',
799
+ changedFiles: ['server/src/methods/invoices.ts'],
800
+ artifactPaths: ['qa-artifacts/mobile.png']
801
+ });
802
+
803
+ assert.ok(prompt.some((line) => /Diagnose First/i.test(line)));
804
+ assert.ok(prompt.some((line) => /Active lane: repair/i.test(line)));
805
+ assert.ok(prompt.some((line) => /server\/src\/methods\/invoices\.ts/i.test(line)));
806
+ assert.ok(prompt.some((line) => /Journey contract: docs\/APP_JOURNEY_CONTRACT\.md/i.test(line)));
807
+
808
+ const budgeted = recordResolveIOAICoderV6Step(initialized, {
809
+ lane: 'plan',
810
+ stepType: 'plan',
811
+ outcome: 'pass',
812
+ promptTokenEstimate: 9000,
813
+ summary: 'Large plan prompt.'
814
+ });
815
+
816
+ const budgetDecision = decideResolveIOAICoderV6Continuation(budgeted);
817
+ assert.equal(budgetDecision.action, 'budget_stop');
818
+ assert.equal(budgetDecision.recoveryPlan.recoveryClass, 'manual_handoff');
819
+ assert.equal(budgetDecision.workflowReadiness.status, 'budget_stopped');
820
+ assert.equal(budgetDecision.workflowReadiness.requiresHumanDecision, true);
821
+
822
+ console.log('aicoder runner v6 tests passed');