tracegrove 0.0.0-stage → 0.3.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 (703) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +61 -2
  3. package/dist/adapters/browser/capabilities.d.ts +45 -0
  4. package/dist/adapters/browser/capabilities.js +14 -0
  5. package/dist/adapters/browser/capabilities.js.map +1 -0
  6. package/dist/adapters/browser/driver.d.ts +45 -0
  7. package/dist/adapters/browser/driver.js +295 -0
  8. package/dist/adapters/browser/driver.js.map +1 -0
  9. package/dist/adapters/browser/session.d.ts +21 -0
  10. package/dist/adapters/browser/session.js +87 -0
  11. package/dist/adapters/browser/session.js.map +1 -0
  12. package/dist/adapters/http/capabilities.d.ts +2 -0
  13. package/dist/adapters/http/capabilities.js +21 -0
  14. package/dist/adapters/http/capabilities.js.map +1 -0
  15. package/dist/adapters/http/driver.d.ts +55 -0
  16. package/dist/adapters/http/driver.js +125 -0
  17. package/dist/adapters/http/driver.js.map +1 -0
  18. package/dist/adapters/job/capabilities.d.ts +45 -0
  19. package/dist/adapters/job/capabilities.js +8 -0
  20. package/dist/adapters/job/capabilities.js.map +1 -0
  21. package/dist/adapters/job/driver.d.ts +26 -0
  22. package/dist/adapters/job/driver.js +110 -0
  23. package/dist/adapters/job/driver.js.map +1 -0
  24. package/dist/adapters/job/types.d.ts +9 -0
  25. package/dist/adapters/job/types.js +2 -0
  26. package/dist/adapters/job/types.js.map +1 -0
  27. package/dist/adapters/mcp/capabilities.d.ts +46 -0
  28. package/dist/adapters/mcp/capabilities.js +17 -0
  29. package/dist/adapters/mcp/capabilities.js.map +1 -0
  30. package/dist/adapters/mcp/driver.d.ts +10 -0
  31. package/dist/adapters/mcp/driver.js +83 -0
  32. package/dist/adapters/mcp/driver.js.map +1 -0
  33. package/dist/adapters/poll.d.ts +12 -0
  34. package/dist/adapters/poll.js +31 -0
  35. package/dist/adapters/poll.js.map +1 -0
  36. package/dist/authoring/activity.d.ts +17 -0
  37. package/dist/authoring/activity.js +18 -0
  38. package/dist/authoring/activity.js.map +1 -0
  39. package/dist/authoring/agent.d.ts +70 -0
  40. package/dist/authoring/agent.js +268 -0
  41. package/dist/authoring/agent.js.map +1 -0
  42. package/dist/authoring/appLaunch.d.ts +7 -0
  43. package/dist/authoring/appLaunch.js +32 -0
  44. package/dist/authoring/appLaunch.js.map +1 -0
  45. package/dist/authoring/appLocation.d.ts +2 -0
  46. package/dist/authoring/appLocation.js +5 -0
  47. package/dist/authoring/appLocation.js.map +1 -0
  48. package/dist/authoring/browser.d.ts +15 -0
  49. package/dist/authoring/browser.js +20 -0
  50. package/dist/authoring/browser.js.map +1 -0
  51. package/dist/authoring/compile.d.ts +47 -0
  52. package/dist/authoring/compile.js +508 -0
  53. package/dist/authoring/compile.js.map +1 -0
  54. package/dist/authoring/discover.d.ts +43 -0
  55. package/dist/authoring/discover.js +149 -0
  56. package/dist/authoring/discover.js.map +1 -0
  57. package/dist/authoring/environmentTemplates.d.ts +3 -0
  58. package/dist/authoring/environmentTemplates.js +24 -0
  59. package/dist/authoring/environmentTemplates.js.map +1 -0
  60. package/dist/authoring/heal.d.ts +108 -0
  61. package/dist/authoring/heal.js +723 -0
  62. package/dist/authoring/heal.js.map +1 -0
  63. package/dist/authoring/index.d.ts +14 -0
  64. package/dist/authoring/index.js +15 -0
  65. package/dist/authoring/index.js.map +1 -0
  66. package/dist/authoring/init.d.ts +21 -0
  67. package/dist/authoring/init.js +141 -0
  68. package/dist/authoring/init.js.map +1 -0
  69. package/dist/authoring/localSettings.d.ts +33 -0
  70. package/dist/authoring/localSettings.js +31 -0
  71. package/dist/authoring/localSettings.js.map +1 -0
  72. package/dist/authoring/media.d.ts +10 -0
  73. package/dist/authoring/media.js +37 -0
  74. package/dist/authoring/media.js.map +1 -0
  75. package/dist/authoring/module.d.ts +2 -0
  76. package/dist/authoring/module.js +38 -0
  77. package/dist/authoring/module.js.map +1 -0
  78. package/dist/authoring/run.d.ts +74 -0
  79. package/dist/authoring/run.js +242 -0
  80. package/dist/authoring/run.js.map +1 -0
  81. package/dist/authoring/runSource.d.ts +6 -0
  82. package/dist/authoring/runSource.js +24 -0
  83. package/dist/authoring/runSource.js.map +1 -0
  84. package/dist/authoring/savedRun.d.ts +13 -0
  85. package/dist/authoring/savedRun.js +94 -0
  86. package/dist/authoring/savedRun.js.map +1 -0
  87. package/dist/authoring/schema.d.ts +574 -0
  88. package/dist/authoring/schema.js +147 -0
  89. package/dist/authoring/schema.js.map +1 -0
  90. package/dist/authoring/snapshotSource.d.ts +13 -0
  91. package/dist/authoring/snapshotSource.js +41 -0
  92. package/dist/authoring/snapshotSource.js.map +1 -0
  93. package/dist/authoring/sourceSelection.d.ts +34 -0
  94. package/dist/authoring/sourceSelection.js +13 -0
  95. package/dist/authoring/sourceSelection.js.map +1 -0
  96. package/dist/authoring/sources.d.ts +5 -0
  97. package/dist/authoring/sources.js +65 -0
  98. package/dist/authoring/sources.js.map +1 -0
  99. package/dist/authoring/status.d.ts +48 -0
  100. package/dist/authoring/status.js +100 -0
  101. package/dist/authoring/status.js.map +1 -0
  102. package/dist/authoring/typed.d.ts +6 -0
  103. package/dist/authoring/typed.js +5 -0
  104. package/dist/authoring/typed.js.map +1 -0
  105. package/dist/authoring/ui.d.ts +10 -0
  106. package/dist/authoring/ui.js +486 -0
  107. package/dist/authoring/ui.js.map +1 -0
  108. package/dist/authoring/uiPage.d.ts +1 -0
  109. package/dist/authoring/uiPage.js +358 -0
  110. package/dist/authoring/uiPage.js.map +1 -0
  111. package/dist/authoring/uiSourceControls.d.ts +2 -0
  112. package/dist/authoring/uiSourceControls.js +41 -0
  113. package/dist/authoring/uiSourceControls.js.map +1 -0
  114. package/dist/authoring/verificationSource.d.ts +41 -0
  115. package/dist/authoring/verificationSource.js +46 -0
  116. package/dist/authoring/verificationSource.js.map +1 -0
  117. package/dist/authoring/workspace.d.ts +33 -0
  118. package/dist/authoring/workspace.js +58 -0
  119. package/dist/authoring/workspace.js.map +1 -0
  120. package/dist/cli/arguments.d.ts +288 -0
  121. package/dist/cli/arguments.js +121 -0
  122. package/dist/cli/arguments.js.map +1 -0
  123. package/dist/cli/cleanup.d.ts +18 -0
  124. package/dist/cli/cleanup.js +40 -0
  125. package/dist/cli/cleanup.js.map +1 -0
  126. package/dist/cli/doctor.d.ts +51 -0
  127. package/dist/cli/doctor.js +118 -0
  128. package/dist/cli/doctor.js.map +1 -0
  129. package/dist/cli/errors.d.ts +2 -0
  130. package/dist/cli/errors.js +84 -0
  131. package/dist/cli/errors.js.map +1 -0
  132. package/dist/cli/jsonFile.d.ts +2 -0
  133. package/dist/cli/jsonFile.js +15 -0
  134. package/dist/cli/jsonFile.js.map +1 -0
  135. package/dist/cli/main.d.ts +2 -0
  136. package/dist/cli/main.js +603 -0
  137. package/dist/cli/main.js.map +1 -0
  138. package/dist/cli/render.d.ts +22 -0
  139. package/dist/cli/render.js +150 -0
  140. package/dist/cli/render.js.map +1 -0
  141. package/dist/cli/samples/catalog.d.ts +10 -0
  142. package/dist/cli/samples/catalog.js +3 -0
  143. package/dist/cli/samples/catalog.js.map +1 -0
  144. package/dist/cli/samples/write.d.ts +5 -0
  145. package/dist/cli/samples/write.js +64 -0
  146. package/dist/cli/samples/write.js.map +1 -0
  147. package/dist/cli/source.d.ts +41 -0
  148. package/dist/cli/source.js +59 -0
  149. package/dist/cli/source.js.map +1 -0
  150. package/dist/core/activationDecision.d.ts +153 -0
  151. package/dist/core/activationDecision.js +34 -0
  152. package/dist/core/activationDecision.js.map +1 -0
  153. package/dist/core/artifacts.d.ts +18 -0
  154. package/dist/core/artifacts.js +79 -0
  155. package/dist/core/artifacts.js.map +1 -0
  156. package/dist/core/atomicFiles.d.ts +9 -0
  157. package/dist/core/atomicFiles.js +76 -0
  158. package/dist/core/atomicFiles.js.map +1 -0
  159. package/dist/core/boundedFile.d.ts +2 -0
  160. package/dist/core/boundedFile.js +28 -0
  161. package/dist/core/boundedFile.js.map +1 -0
  162. package/dist/core/bundle.d.ts +77 -0
  163. package/dist/core/bundle.js +375 -0
  164. package/dist/core/bundle.js.map +1 -0
  165. package/dist/core/bundleArchive.d.ts +10 -0
  166. package/dist/core/bundleArchive.js +47 -0
  167. package/dist/core/bundleArchive.js.map +1 -0
  168. package/dist/core/bundleEvidence.d.ts +12 -0
  169. package/dist/core/bundleEvidence.js +169 -0
  170. package/dist/core/bundleEvidence.js.map +1 -0
  171. package/dist/core/bundleExport.d.ts +12 -0
  172. package/dist/core/bundleExport.js +36 -0
  173. package/dist/core/bundleExport.js.map +1 -0
  174. package/dist/core/bundleFiles.d.ts +5 -0
  175. package/dist/core/bundleFiles.js +47 -0
  176. package/dist/core/bundleFiles.js.map +1 -0
  177. package/dist/core/bundlePaths.d.ts +2 -0
  178. package/dist/core/bundlePaths.js +7 -0
  179. package/dist/core/bundlePaths.js.map +1 -0
  180. package/dist/core/bundleSnapshot.d.ts +26 -0
  181. package/dist/core/bundleSnapshot.js +71 -0
  182. package/dist/core/bundleSnapshot.js.map +1 -0
  183. package/dist/core/capabilityBoundary.d.ts +1452 -0
  184. package/dist/core/capabilityBoundary.js +361 -0
  185. package/dist/core/capabilityBoundary.js.map +1 -0
  186. package/dist/core/capabilityLifecycle.d.ts +366 -0
  187. package/dist/core/capabilityLifecycle.js +79 -0
  188. package/dist/core/capabilityLifecycle.js.map +1 -0
  189. package/dist/core/cleanup.d.ts +35 -0
  190. package/dist/core/cleanup.js +71 -0
  191. package/dist/core/cleanup.js.map +1 -0
  192. package/dist/core/cleanupActions.d.ts +5 -0
  193. package/dist/core/cleanupActions.js +15 -0
  194. package/dist/core/cleanupActions.js.map +1 -0
  195. package/dist/core/cleanupAttestation.d.ts +23 -0
  196. package/dist/core/cleanupAttestation.js +57 -0
  197. package/dist/core/cleanupAttestation.js.map +1 -0
  198. package/dist/core/clock.d.ts +4 -0
  199. package/dist/core/clock.js +14 -0
  200. package/dist/core/clock.js.map +1 -0
  201. package/dist/core/compiler.d.ts +19 -0
  202. package/dist/core/compiler.js +200 -0
  203. package/dist/core/compiler.js.map +1 -0
  204. package/dist/core/controller.d.ts +7 -0
  205. package/dist/core/controller.js +132 -0
  206. package/dist/core/controller.js.map +1 -0
  207. package/dist/core/coordination.d.ts +72 -0
  208. package/dist/core/coordination.js +118 -0
  209. package/dist/core/coordination.js.map +1 -0
  210. package/dist/core/corpus.d.ts +60 -0
  211. package/dist/core/corpus.js +216 -0
  212. package/dist/core/corpus.js.map +1 -0
  213. package/dist/core/deadline.d.ts +12 -0
  214. package/dist/core/deadline.js +38 -0
  215. package/dist/core/deadline.js.map +1 -0
  216. package/dist/core/deliveryJournal.d.ts +37 -0
  217. package/dist/core/deliveryJournal.js +85 -0
  218. package/dist/core/deliveryJournal.js.map +1 -0
  219. package/dist/core/environmentPreflight.d.ts +14 -0
  220. package/dist/core/environmentPreflight.js +179 -0
  221. package/dist/core/environmentPreflight.js.map +1 -0
  222. package/dist/core/errors.d.ts +22 -0
  223. package/dist/core/errors.js +29 -0
  224. package/dist/core/errors.js.map +1 -0
  225. package/dist/core/events.d.ts +14 -0
  226. package/dist/core/events.js +37 -0
  227. package/dist/core/events.js.map +1 -0
  228. package/dist/core/executionInspection.d.ts +90 -0
  229. package/dist/core/executionInspection.js +31 -0
  230. package/dist/core/executionInspection.js.map +1 -0
  231. package/dist/core/executionOwnership.d.ts +72 -0
  232. package/dist/core/executionOwnership.js +82 -0
  233. package/dist/core/executionOwnership.js.map +1 -0
  234. package/dist/core/executionPreparation.d.ts +362 -0
  235. package/dist/core/executionPreparation.js +93 -0
  236. package/dist/core/executionPreparation.js.map +1 -0
  237. package/dist/core/executionReadback.d.ts +15 -0
  238. package/dist/core/executionReadback.js +21 -0
  239. package/dist/core/executionReadback.js.map +1 -0
  240. package/dist/core/executor.d.ts +46 -0
  241. package/dist/core/executor.js +616 -0
  242. package/dist/core/executor.js.map +1 -0
  243. package/dist/core/frozenBundle.d.ts +314 -0
  244. package/dist/core/frozenBundle.js +24 -0
  245. package/dist/core/frozenBundle.js.map +1 -0
  246. package/dist/core/fsDurability.d.ts +2 -0
  247. package/dist/core/fsDurability.js +12 -0
  248. package/dist/core/fsDurability.js.map +1 -0
  249. package/dist/core/generators.d.ts +4 -0
  250. package/dist/core/generators.js +71 -0
  251. package/dist/core/generators.js.map +1 -0
  252. package/dist/core/gitSnapshot.d.ts +63 -0
  253. package/dist/core/gitSnapshot.js +55 -0
  254. package/dist/core/gitSnapshot.js.map +1 -0
  255. package/dist/core/gitSources.d.ts +29 -0
  256. package/dist/core/gitSources.js +97 -0
  257. package/dist/core/gitSources.js.map +1 -0
  258. package/dist/core/ledger.d.ts +38 -0
  259. package/dist/core/ledger.js +169 -0
  260. package/dist/core/ledger.js.map +1 -0
  261. package/dist/core/ledgerInspection.d.ts +18 -0
  262. package/dist/core/ledgerInspection.js +66 -0
  263. package/dist/core/ledgerInspection.js.map +1 -0
  264. package/dist/core/ledgerRecords.d.ts +23 -0
  265. package/dist/core/ledgerRecords.js +29 -0
  266. package/dist/core/ledgerRecords.js.map +1 -0
  267. package/dist/core/localActivationState.d.ts +260 -0
  268. package/dist/core/localActivationState.js +49 -0
  269. package/dist/core/localActivationState.js.map +1 -0
  270. package/dist/core/localPromotionState.d.ts +387 -0
  271. package/dist/core/localPromotionState.js +22 -0
  272. package/dist/core/localPromotionState.js.map +1 -0
  273. package/dist/core/localQualificationResults.d.ts +39 -0
  274. package/dist/core/localQualificationResults.js +160 -0
  275. package/dist/core/localQualificationResults.js.map +1 -0
  276. package/dist/core/localReviewStore.d.ts +28 -0
  277. package/dist/core/localReviewStore.js +167 -0
  278. package/dist/core/localReviewStore.js.map +1 -0
  279. package/dist/core/localScenarioActivation.d.ts +6 -0
  280. package/dist/core/localScenarioActivation.js +70 -0
  281. package/dist/core/localScenarioActivation.js.map +1 -0
  282. package/dist/core/localScenarioOwner.d.ts +20 -0
  283. package/dist/core/localScenarioOwner.js +2 -0
  284. package/dist/core/localScenarioOwner.js.map +1 -0
  285. package/dist/core/localScenarioPromotion.d.ts +9 -0
  286. package/dist/core/localScenarioPromotion.js +49 -0
  287. package/dist/core/localScenarioPromotion.js.map +1 -0
  288. package/dist/core/localScenarioState.d.ts +2297 -0
  289. package/dist/core/localScenarioState.js +117 -0
  290. package/dist/core/localScenarioState.js.map +1 -0
  291. package/dist/core/localScenarioStore.d.ts +838 -0
  292. package/dist/core/localScenarioStore.js +218 -0
  293. package/dist/core/localScenarioStore.js.map +1 -0
  294. package/dist/core/localScenarioStructure.d.ts +4 -0
  295. package/dist/core/localScenarioStructure.js +52 -0
  296. package/dist/core/localScenarioStructure.js.map +1 -0
  297. package/dist/core/localStructureState.d.ts +2 -0
  298. package/dist/core/localStructureState.js +22 -0
  299. package/dist/core/localStructureState.js.map +1 -0
  300. package/dist/core/lookup.d.ts +662 -0
  301. package/dist/core/lookup.js +55 -0
  302. package/dist/core/lookup.js.map +1 -0
  303. package/dist/core/ownership.d.ts +3 -0
  304. package/dist/core/ownership.js +24 -0
  305. package/dist/core/ownership.js.map +1 -0
  306. package/dist/core/planInspection.d.ts +108 -0
  307. package/dist/core/planInspection.js +44 -0
  308. package/dist/core/planInspection.js.map +1 -0
  309. package/dist/core/planner.d.ts +14 -0
  310. package/dist/core/planner.js +261 -0
  311. package/dist/core/planner.js.map +1 -0
  312. package/dist/core/qualification.d.ts +26 -0
  313. package/dist/core/qualification.js +58 -0
  314. package/dist/core/qualification.js.map +1 -0
  315. package/dist/core/qualificationBundle.d.ts +6 -0
  316. package/dist/core/qualificationBundle.js +51 -0
  317. package/dist/core/qualificationBundle.js.map +1 -0
  318. package/dist/core/qualificationExecution.d.ts +879 -0
  319. package/dist/core/qualificationExecution.js +54 -0
  320. package/dist/core/qualificationExecution.js.map +1 -0
  321. package/dist/core/recoveryStatus.d.ts +6 -0
  322. package/dist/core/recoveryStatus.js +123 -0
  323. package/dist/core/recoveryStatus.js.map +1 -0
  324. package/dist/core/reducer.d.ts +56 -0
  325. package/dist/core/reducer.js +355 -0
  326. package/dist/core/reducer.js.map +1 -0
  327. package/dist/core/replayAssessment.d.ts +15 -0
  328. package/dist/core/replayAssessment.js +78 -0
  329. package/dist/core/replayAssessment.js.map +1 -0
  330. package/dist/core/replayEvidence.d.ts +7 -0
  331. package/dist/core/replayEvidence.js +58 -0
  332. package/dist/core/replayEvidence.js.map +1 -0
  333. package/dist/core/repositorySelectionEvidence.d.ts +3 -0
  334. package/dist/core/repositorySelectionEvidence.js +58 -0
  335. package/dist/core/repositorySelectionEvidence.js.map +1 -0
  336. package/dist/core/rerun.d.ts +3 -0
  337. package/dist/core/rerun.js +24 -0
  338. package/dist/core/rerun.js.map +1 -0
  339. package/dist/core/resultSink.d.ts +52 -0
  340. package/dist/core/resultSink.js +120 -0
  341. package/dist/core/resultSink.js.map +1 -0
  342. package/dist/core/review.d.ts +22 -0
  343. package/dist/core/review.js +65 -0
  344. package/dist/core/review.js.map +1 -0
  345. package/dist/core/runnerCapabilities.d.ts +22 -0
  346. package/dist/core/runnerCapabilities.js +44 -0
  347. package/dist/core/runnerCapabilities.js.map +1 -0
  348. package/dist/core/scenario.d.ts +32 -0
  349. package/dist/core/scenario.js +119 -0
  350. package/dist/core/scenario.js.map +1 -0
  351. package/dist/core/scenarioActivation.d.ts +16 -0
  352. package/dist/core/scenarioActivation.js +47 -0
  353. package/dist/core/scenarioActivation.js.map +1 -0
  354. package/dist/core/scenarioStructure.d.ts +400 -0
  355. package/dist/core/scenarioStructure.js +72 -0
  356. package/dist/core/scenarioStructure.js.map +1 -0
  357. package/dist/core/snapshotEvidence.d.ts +3 -0
  358. package/dist/core/snapshotEvidence.js +37 -0
  359. package/dist/core/snapshotEvidence.js.map +1 -0
  360. package/dist/core/snapshotRepository.d.ts +48 -0
  361. package/dist/core/snapshotRepository.js +47 -0
  362. package/dist/core/snapshotRepository.js.map +1 -0
  363. package/dist/core/source-analysis.d.ts +18 -0
  364. package/dist/core/source-analysis.js +99 -0
  365. package/dist/core/source-analysis.js.map +1 -0
  366. package/dist/core/source-citation.d.ts +53 -0
  367. package/dist/core/source-citation.js +59 -0
  368. package/dist/core/source-citation.js.map +1 -0
  369. package/dist/core/sourcePromotion.d.ts +929 -0
  370. package/dist/core/sourcePromotion.js +92 -0
  371. package/dist/core/sourcePromotion.js.map +1 -0
  372. package/dist/core/sourceReviewEvidence.d.ts +271 -0
  373. package/dist/core/sourceReviewEvidence.js +24 -0
  374. package/dist/core/sourceReviewEvidence.js.map +1 -0
  375. package/dist/core/targetObservation.d.ts +3 -0
  376. package/dist/core/targetObservation.js +26 -0
  377. package/dist/core/targetObservation.js.map +1 -0
  378. package/dist/hosts/launchTemplates.d.ts +2 -0
  379. package/dist/hosts/launchTemplates.js +5 -0
  380. package/dist/hosts/launchTemplates.js.map +1 -0
  381. package/dist/hosts/local.d.ts +17 -0
  382. package/dist/hosts/local.js +311 -0
  383. package/dist/hosts/local.js.map +1 -0
  384. package/dist/hosts/localSupervisor.d.ts +1 -0
  385. package/dist/hosts/localSupervisor.js +115 -0
  386. package/dist/hosts/localSupervisor.js.map +1 -0
  387. package/dist/hosts/mock.d.ts +4 -0
  388. package/dist/hosts/mock.js +82 -0
  389. package/dist/hosts/mock.js.map +1 -0
  390. package/dist/hosts/pinnedArguments.d.ts +3 -0
  391. package/dist/hosts/pinnedArguments.js +39 -0
  392. package/dist/hosts/pinnedArguments.js.map +1 -0
  393. package/dist/hosts/runtime.d.ts +5 -0
  394. package/dist/hosts/runtime.js +60 -0
  395. package/dist/hosts/runtime.js.map +1 -0
  396. package/dist/hosts/sourceIdentity.d.ts +54 -0
  397. package/dist/hosts/sourceIdentity.js +27 -0
  398. package/dist/hosts/sourceIdentity.js.map +1 -0
  399. package/dist/hosts/types.d.ts +39 -0
  400. package/dist/hosts/types.js +2 -0
  401. package/dist/hosts/types.js.map +1 -0
  402. package/dist/index.d.ts +56 -0
  403. package/dist/index.js +52 -0
  404. package/dist/index.js.map +1 -0
  405. package/dist/integrations/awr/attachment.d.ts +34 -0
  406. package/dist/integrations/awr/attachment.js +120 -0
  407. package/dist/integrations/awr/attachment.js.map +1 -0
  408. package/dist/integrations/awr/attachmentContracts.d.ts +273 -0
  409. package/dist/integrations/awr/attachmentContracts.js +39 -0
  410. package/dist/integrations/awr/attachmentContracts.js.map +1 -0
  411. package/dist/integrations/awr/attachmentHttp.d.ts +9 -0
  412. package/dist/integrations/awr/attachmentHttp.js +19 -0
  413. package/dist/integrations/awr/attachmentHttp.js.map +1 -0
  414. package/dist/integrations/awr/cli.d.ts +7 -0
  415. package/dist/integrations/awr/cli.js +43 -0
  416. package/dist/integrations/awr/cli.js.map +1 -0
  417. package/dist/integrations/awr/contracts.d.ts +54 -0
  418. package/dist/integrations/awr/contracts.js +33 -0
  419. package/dist/integrations/awr/contracts.js.map +1 -0
  420. package/dist/integrations/awr/http.d.ts +8 -0
  421. package/dist/integrations/awr/http.js +23 -0
  422. package/dist/integrations/awr/http.js.map +1 -0
  423. package/dist/integrations/awr/index.d.ts +7 -0
  424. package/dist/integrations/awr/index.js +8 -0
  425. package/dist/integrations/awr/index.js.map +1 -0
  426. package/dist/integrations/awr/jsonHttp.d.ts +15 -0
  427. package/dist/integrations/awr/jsonHttp.js +69 -0
  428. package/dist/integrations/awr/jsonHttp.js.map +1 -0
  429. package/dist/integrations/awr/outbox.d.ts +28 -0
  430. package/dist/integrations/awr/outbox.js +88 -0
  431. package/dist/integrations/awr/outbox.js.map +1 -0
  432. package/dist/integrations/awr/projection.d.ts +4 -0
  433. package/dist/integrations/awr/projection.js +54 -0
  434. package/dist/integrations/awr/projection.js.map +1 -0
  435. package/dist/protocol/canonical.d.ts +41 -0
  436. package/dist/protocol/canonical.js +114 -0
  437. package/dist/protocol/canonical.js.map +1 -0
  438. package/dist/protocol/index.d.ts +9620 -0
  439. package/dist/protocol/index.js +185 -0
  440. package/dist/protocol/index.js.map +1 -0
  441. package/dist/protocol/primitives.d.ts +63 -0
  442. package/dist/protocol/primitives.js +46 -0
  443. package/dist/protocol/primitives.js.map +1 -0
  444. package/dist/protocol/schemas/browser.d.ts +153 -0
  445. package/dist/protocol/schemas/browser.js +29 -0
  446. package/dist/protocol/schemas/browser.js.map +1 -0
  447. package/dist/protocol/schemas/capability.d.ts +2126 -0
  448. package/dist/protocol/schemas/capability.js +165 -0
  449. package/dist/protocol/schemas/capability.js.map +1 -0
  450. package/dist/protocol/schemas/capabilityLifecycle.d.ts +509 -0
  451. package/dist/protocol/schemas/capabilityLifecycle.js +47 -0
  452. package/dist/protocol/schemas/capabilityLifecycle.js.map +1 -0
  453. package/dist/protocol/schemas/cleanup.d.ts +109 -0
  454. package/dist/protocol/schemas/cleanup.js +59 -0
  455. package/dist/protocol/schemas/cleanup.js.map +1 -0
  456. package/dist/protocol/schemas/cli.d.ts +121 -0
  457. package/dist/protocol/schemas/cli.js +24 -0
  458. package/dist/protocol/schemas/cli.js.map +1 -0
  459. package/dist/protocol/schemas/config.d.ts +59 -0
  460. package/dist/protocol/schemas/config.js +32 -0
  461. package/dist/protocol/schemas/config.js.map +1 -0
  462. package/dist/protocol/schemas/corpus.d.ts +36 -0
  463. package/dist/protocol/schemas/corpus.js +10 -0
  464. package/dist/protocol/schemas/corpus.js.map +1 -0
  465. package/dist/protocol/schemas/definitions.d.ts +3409 -0
  466. package/dist/protocol/schemas/definitions.js +431 -0
  467. package/dist/protocol/schemas/definitions.js.map +1 -0
  468. package/dist/protocol/schemas/evidenceProjection.d.ts +146 -0
  469. package/dist/protocol/schemas/evidenceProjection.js +18 -0
  470. package/dist/protocol/schemas/evidenceProjection.js.map +1 -0
  471. package/dist/protocol/schemas/execution.d.ts +3179 -0
  472. package/dist/protocol/schemas/execution.js +500 -0
  473. package/dist/protocol/schemas/execution.js.map +1 -0
  474. package/dist/protocol/schemas/gitSources.d.ts +330 -0
  475. package/dist/protocol/schemas/gitSources.js +32 -0
  476. package/dist/protocol/schemas/gitSources.js.map +1 -0
  477. package/dist/protocol/schemas/mcp.d.ts +24 -0
  478. package/dist/protocol/schemas/mcp.js +16 -0
  479. package/dist/protocol/schemas/mcp.js.map +1 -0
  480. package/dist/protocol/schemas/nativeJob.d.ts +106 -0
  481. package/dist/protocol/schemas/nativeJob.js +16 -0
  482. package/dist/protocol/schemas/nativeJob.js.map +1 -0
  483. package/dist/protocol/schemas/portableEnvironment.d.ts +1256 -0
  484. package/dist/protocol/schemas/portableEnvironment.js +108 -0
  485. package/dist/protocol/schemas/portableEnvironment.js.map +1 -0
  486. package/dist/protocol/schemas/promotion.d.ts +132 -0
  487. package/dist/protocol/schemas/promotion.js +9 -0
  488. package/dist/protocol/schemas/promotion.js.map +1 -0
  489. package/dist/protocol/schemas/protocol.d.ts +146 -0
  490. package/dist/protocol/schemas/protocol.js +25 -0
  491. package/dist/protocol/schemas/protocol.js.map +1 -0
  492. package/dist/protocol/schemas/recoveryStatus.d.ts +88 -0
  493. package/dist/protocol/schemas/recoveryStatus.js +20 -0
  494. package/dist/protocol/schemas/recoveryStatus.js.map +1 -0
  495. package/dist/protocol/schemas/resultSink.d.ts +80 -0
  496. package/dist/protocol/schemas/resultSink.js +14 -0
  497. package/dist/protocol/schemas/resultSink.js.map +1 -0
  498. package/dist/protocol/schemas/review.d.ts +248 -0
  499. package/dist/protocol/schemas/review.js +45 -0
  500. package/dist/protocol/schemas/review.js.map +1 -0
  501. package/dist/protocol/schemas/scenario.d.ts +810 -0
  502. package/dist/protocol/schemas/scenario.js +53 -0
  503. package/dist/protocol/schemas/scenario.js.map +1 -0
  504. package/dist/protocol/schemas/source.d.ts +300 -0
  505. package/dist/protocol/schemas/source.js +25 -0
  506. package/dist/protocol/schemas/source.js.map +1 -0
  507. package/dist/source/git.d.ts +36 -0
  508. package/dist/source/git.js +159 -0
  509. package/dist/source/git.js.map +1 -0
  510. package/dist/source/gitObjectProof.d.ts +12 -0
  511. package/dist/source/gitObjectProof.js +115 -0
  512. package/dist/source/gitObjectProof.js.map +1 -0
  513. package/dist/source/snapshotPaths.d.ts +2 -0
  514. package/dist/source/snapshotPaths.js +24 -0
  515. package/dist/source/snapshotPaths.js.map +1 -0
  516. package/dist/source/snapshotTree.d.ts +15 -0
  517. package/dist/source/snapshotTree.js +79 -0
  518. package/dist/source/snapshotTree.js.map +1 -0
  519. package/docs/agent-guide.md +21 -0
  520. package/docs/browser-driver.md +146 -0
  521. package/docs/getting-started.md +13 -0
  522. package/docs/git-object-proof.md +100 -0
  523. package/docs/local-execution-recovery.md +55 -0
  524. package/docs/mcp-driver.md +87 -0
  525. package/docs/native-jobs.md +96 -0
  526. package/docs/result-sink.md +87 -0
  527. package/docs/verified-bundles.md +175 -0
  528. package/package.json +98 -4
  529. package/samples/django-notes/manage.py +8 -0
  530. package/samples/django-notes/notes/__init__.py +0 -0
  531. package/samples/django-notes/notes/auth.py +14 -0
  532. package/samples/django-notes/notes/migrations/0001_initial.py +19 -0
  533. package/samples/django-notes/notes/migrations/__init__.py +0 -0
  534. package/samples/django-notes/notes/models.py +13 -0
  535. package/samples/django-notes/notes/views.py +33 -0
  536. package/samples/django-notes/notesite/__init__.py +0 -0
  537. package/samples/django-notes/notesite/settings.py +17 -0
  538. package/samples/django-notes/notesite/urls.py +9 -0
  539. package/samples/django-notes/requirements.txt +1 -0
  540. package/samples/django-notes/tracegrove/notes/crud.flow.yaml +27 -0
  541. package/samples/django-notes/tracegrove.config.yaml +7 -0
  542. package/samples/fastapi-notes/app/__init__.py +0 -0
  543. package/samples/fastapi-notes/app/main.py +69 -0
  544. package/samples/fastapi-notes/requirements.txt +2 -0
  545. package/samples/fastapi-notes/tracegrove/notes/crud.flow.yaml +27 -0
  546. package/samples/fastapi-notes/tracegrove.config.yaml +8 -0
  547. package/samples/notes-api/app/app.mjs +67 -0
  548. package/samples/notes-api/app/http.mjs +16 -0
  549. package/samples/notes-api/tracegrove/fixtures/existing-note.fixture.yaml +12 -0
  550. package/samples/notes-api/tracegrove/notes/create-read-delete.flow.yaml +35 -0
  551. package/samples/notes-api/tracegrove/notes/list.flow.yaml +25 -0
  552. package/samples/notes-api/tracegrove.config.yaml +15 -0
  553. package/samples/notes-api/verification/actions/notes.registry.yaml +6 -0
  554. package/samples/notes-api/verification/auth/host-issued-owner.yaml +6 -0
  555. package/samples/notes-api/verification/cases/notes.contract.yaml +51 -0
  556. package/samples/notes-api/verification/cases/notes.create.yaml +123 -0
  557. package/samples/notes-api/verification/cases/notes.suite.yaml +5 -0
  558. package/samples/notes-api/verification/components/notes-api-stub.profile.yaml +8 -0
  559. package/samples/notes-api/verification/components/notes-api.profile.yaml +15 -0
  560. package/samples/notes-api/verification/environments/local-notes.yaml +11 -0
  561. package/samples/notes-api/verification/environments/mock-notes.yaml +11 -0
  562. package/samples/notes-api/verification/fidelity/full-live-sandbox.yaml +7 -0
  563. package/samples/notes-api/verification/fidelity/mock-contract.yaml +6 -0
  564. package/samples/notes-api/verification/fixtures/existing-note.payload.yaml +15 -0
  565. package/samples/notes-api/verification/fixtures/existing-note.plan.yaml +9 -0
  566. package/samples/notes-api/verification/fixtures/existing-note.recipe.yaml +29 -0
  567. package/samples/notes-api/verification/hosts/local-process.yaml +27 -0
  568. package/samples/notes-api/verification/hosts/mock-loopback.yaml +14 -0
  569. package/samples/notes-api/verification/mocks/notes.responses.yaml +5 -0
  570. package/samples/notes-api/verification/personas/owner.yaml +16 -0
  571. package/samples/notes-api/verification/policies/no-authoring-inference.yaml +10 -0
  572. package/samples/notes-api/verification/runners/http.yaml +5 -0
  573. package/samples/notes-api/verification/surfaces/http-api.binding.yaml +11 -0
  574. package/samples/notes-api/verification/surfaces/http-api.pack.yaml +7 -0
  575. package/samples/notes-api/verification/workflow.yaml +27 -0
  576. package/samples/notes-browser/tracegrove/notes/browser.flow.yaml +19 -0
  577. package/samples/notes-browser/verification/cases/notes.browser.yaml +63 -0
  578. package/samples/notes-browser/verification/cases/notes.suite.yaml +4 -0
  579. package/samples/notes-browser/verification/runners/http.yaml +5 -0
  580. package/samples/notes-browser/verification/surfaces/http-api.binding.yaml +11 -0
  581. package/samples/notes-browser/verification/surfaces/http-api.pack.yaml +7 -0
  582. package/samples/notes-django/README.md +21 -0
  583. package/samples/notes-django/app/django_app.py +119 -0
  584. package/samples/notes-django/app/requirements.lock +4 -0
  585. package/samples/notes-mcp/app/mcp.mjs +47 -0
  586. package/samples/notes-mcp/tracegrove/notes.flow.yaml +20 -0
  587. package/samples/notes-mcp/tracegrove.config.yaml +13 -0
  588. package/samples/report-jobs/README.md +30 -0
  589. package/samples/report-jobs/app/jobs-api.mjs +65 -0
  590. package/samples/report-jobs/app/native-bridge.mjs +30 -0
  591. package/samples/report-jobs/app/store.mjs +74 -0
  592. package/samples/report-jobs/app/worker.mjs +22 -0
  593. package/samples/report-jobs/tracegrove/fixtures/failed-job.fixture.yaml +12 -0
  594. package/samples/report-jobs/tracegrove/fixtures/held-job.fixture.yaml +12 -0
  595. package/samples/report-jobs/tracegrove/fixtures/success-job.fixture.yaml +12 -0
  596. package/samples/report-jobs/tracegrove/reports/cancellation.flow.yaml +15 -0
  597. package/samples/report-jobs/tracegrove/reports/completion.flow.yaml +31 -0
  598. package/samples/report-jobs/tracegrove/reports/failure.flow.yaml +12 -0
  599. package/samples/report-jobs/tracegrove.config.yaml +10 -0
  600. package/samples/report-native/README.md +11 -0
  601. package/samples/report-native/tracegrove/cancellation.flow.yaml +11 -0
  602. package/samples/report-native/tracegrove/completion.flow.yaml +22 -0
  603. package/samples/report-native/tracegrove/failure.flow.yaml +7 -0
  604. package/samples/report-native/tracegrove.config.yaml +11 -0
  605. package/schema/tracegrove_cli-error_v1.json +156 -0
  606. package/schema/tracegrove_config_v1.json +233 -0
  607. package/schema/tracegrove_fixture_v1.json +297 -0
  608. package/schema/tracegrove_flow_v1.json +960 -0
  609. package/schema/tracegrove_recovery-status_v1.json +234 -0
  610. package/schema/tracegrove_run-video_v1.json +25 -0
  611. package/schema/workflow_action-registry_v1.json +303 -0
  612. package/schema/workflow_auth-recipe_v1.json +146 -0
  613. package/schema/workflow_boundary-observation_v1.json +515 -0
  614. package/schema/workflow_browser-command_v1.json +292 -0
  615. package/schema/workflow_browser-locator_v1.json +74 -0
  616. package/schema/workflow_browser-network-observation_v1.json +48 -0
  617. package/schema/workflow_browser-observation_v1.json +53 -0
  618. package/schema/workflow_budget-reservation_v1.json +150 -0
  619. package/schema/workflow_campaign-result_v1.json +382 -0
  620. package/schema/workflow_capability-artifact-manifest_v1.json +529 -0
  621. package/schema/workflow_capability-descriptor_v1.json +351 -0
  622. package/schema/workflow_capability-lifecycle-checkpoint_v1.json +510 -0
  623. package/schema/workflow_capability-observation_v1.json +1707 -0
  624. package/schema/workflow_capability-operation_v1.json +3212 -0
  625. package/schema/workflow_capability-replay-plan_v1.json +1247 -0
  626. package/schema/workflow_capability-retry-policy_v1.json +39 -0
  627. package/schema/workflow_capability-retry-state_v1.json +242 -0
  628. package/schema/workflow_case_v1.json +4222 -0
  629. package/schema/workflow_change-model_v1.json +614 -0
  630. package/schema/workflow_cleanup-expectation_v1.json +108 -0
  631. package/schema/workflow_cleanup-followup_v1.json +145 -0
  632. package/schema/workflow_component-profile_v1.json +219 -0
  633. package/schema/workflow_config_v1.json +180 -0
  634. package/schema/workflow_corpus_v1.json +172 -0
  635. package/schema/workflow_cost-observation_v1.json +366 -0
  636. package/schema/workflow_credential-lease_v1.json +222 -0
  637. package/schema/workflow_effective-config_v1.json +214 -0
  638. package/schema/workflow_environment-plan_v1.json +445 -0
  639. package/schema/workflow_environment_v1.json +1827 -0
  640. package/schema/workflow_evidence-projection_v1.json +636 -0
  641. package/schema/workflow_execution_v1.json +4086 -0
  642. package/schema/workflow_fidelity-plan_v1.json +512 -0
  643. package/schema/workflow_fidelity-profile_v1.json +396 -0
  644. package/schema/workflow_fixture-manifest_v1.json +918 -0
  645. package/schema/workflow_fixture-plan_v1.json +594 -0
  646. package/schema/workflow_git-source-request_v1.json +124 -0
  647. package/schema/workflow_git-source-resolution_v1.json +660 -0
  648. package/schema/workflow_git-source-snapshot_v1.json +287 -0
  649. package/schema/workflow_host-lease_v1.json +321 -0
  650. package/schema/workflow_host-observation_v1.json +282 -0
  651. package/schema/workflow_host-plan_v1.json +719 -0
  652. package/schema/workflow_identity-attestation_v1.json +412 -0
  653. package/schema/workflow_intelligence-policy_v1.json +153 -0
  654. package/schema/workflow_logical-payload_v1.json +206 -0
  655. package/schema/workflow_mcp-tool-call_v1.json +70 -0
  656. package/schema/workflow_mcp-tool-observation_v1.json +125 -0
  657. package/schema/workflow_mock-responses_v1.json +185 -0
  658. package/schema/workflow_native-job-action_v1.json +123 -0
  659. package/schema/workflow_native-job-observation_v1.json +138 -0
  660. package/schema/workflow_native-job-ready_v1.json +31 -0
  661. package/schema/workflow_native-job-request_v1.json +155 -0
  662. package/schema/workflow_native-job-response_v1.json +125 -0
  663. package/schema/workflow_ownership_v1.json +116 -0
  664. package/schema/workflow_persona_v1.json +499 -0
  665. package/schema/workflow_plan-edit-projection_v1.json +152 -0
  666. package/schema/workflow_plan-review_v1.json +246 -0
  667. package/schema/workflow_portable-environment-intent_v1.json +499 -0
  668. package/schema/workflow_portable-environment-profile_v1.json +1429 -0
  669. package/schema/workflow_portable-preflight_v1.json +2281 -0
  670. package/schema/workflow_qualification-admission_v1.json +467 -0
  671. package/schema/workflow_qualification-intent_v1.json +98 -0
  672. package/schema/workflow_qualification-policy_v1.json +109 -0
  673. package/schema/workflow_qualification-round_v1.json +226 -0
  674. package/schema/workflow_replay-assessment_v1.json +197 -0
  675. package/schema/workflow_replay-finding_v1.json +147 -0
  676. package/schema/workflow_request_v1.json +1567 -0
  677. package/schema/workflow_result-ingest_v1.json +343 -0
  678. package/schema/workflow_revisions_v1.json +334 -0
  679. package/schema/workflow_routing-decision_v1.json +482 -0
  680. package/schema/workflow_runner-capabilities_v1.json +316 -0
  681. package/schema/workflow_runner-profile_v1.json +119 -0
  682. package/schema/workflow_runner-protocol_v1_host.json +382 -0
  683. package/schema/workflow_runner-protocol_v1_plugin.json +491 -0
  684. package/schema/workflow_scenario-activation-intent_v1.json +346 -0
  685. package/schema/workflow_scenario-activation_v1.json +562 -0
  686. package/schema/workflow_scenario-projection_v1.json +221 -0
  687. package/schema/workflow_scenario-promotion_v1.json +455 -0
  688. package/schema/workflow_scenario-replay-assessment_v1.json +696 -0
  689. package/schema/workflow_scenario-revision-token_v1.json +115 -0
  690. package/schema/workflow_scenario-structure_v1.json +368 -0
  691. package/schema/workflow_scenario_v1.json +401 -0
  692. package/schema/workflow_scoped-resource_v1.json +550 -0
  693. package/schema/workflow_seed-recipe_v1.json +724 -0
  694. package/schema/workflow_selection_v1.json +1108 -0
  695. package/schema/workflow_signed-cleanup-followup_v1.json +175 -0
  696. package/schema/workflow_source-plan_v1.json +756 -0
  697. package/schema/workflow_source-selection_v1.json +456 -0
  698. package/schema/workflow_source-validation_v1.json +366 -0
  699. package/schema/workflow_step-event_v1.json +228 -0
  700. package/schema/workflow_stream-transcript_v1.json +1030 -0
  701. package/schema/workflow_suite_v1.json +64 -0
  702. package/schema/workflow_surface-binding_v1.json +411 -0
  703. package/schema/workflow_surface-pack_v1.json +159 -0
@@ -0,0 +1,54 @@
1
+ import { z } from 'zod';
2
+ import { QualificationRoundAdmission, ScenarioDefinition, SelectionManifest, RunRequest, refKey, sameRef, sameScope, verifySelfDigest, digestOfValue } from "../protocol/index.js";
3
+ import { checkAdmission } from "./localScenarioState.js";
4
+ import { Conflict } from "./errors.js";
5
+ import { ApprovedPlanReview, validateApprovedPlanReview, validatePromotedCases } from "./sourcePromotion.js";
6
+ export const QualificationExecutionContext = z.object({ admission: QualificationRoundAdmission, definition: ScenarioDefinition,
7
+ selection: SelectionManifest, matrix: SelectionManifest, sourceReview: ApprovedPlanReview.optional() }).strict();
8
+ export function localQualificationExecutionOwner(store, authorizeEffects) {
9
+ return { resolve: (ref, scope, ledger) => store.executionContext(ref, scope, ledger), authorizeEffects };
10
+ }
11
+ export function validateQualificationExecution(request, selection, raw) {
12
+ const context = QualificationExecutionContext.parse(raw);
13
+ const { admission, definition, matrix } = context;
14
+ for (const document of [admission, definition, selection, context.selection, matrix]) {
15
+ if (!verifySelfDigest(document) || !sameScope(document.scope, request.requestedScope))
16
+ throw new Conflict('qualification document seal or scope mismatch');
17
+ }
18
+ checkAdmission({ definitions: [definition], selections: [matrix, context.selection] }, admission);
19
+ if (definition.sourcePlanRef) {
20
+ if (!context.sourceReview)
21
+ throw new Conflict('source-backed qualification needs current review owner evidence');
22
+ const approved = context.sourceReview;
23
+ validateApprovedPlanReview(approved, { id: approved.projection.id, scope: definition.scope,
24
+ expectedEditRevision: approved.projection.editRevision, expectedSourcePlanRef: definition.sourcePlanRef }, definition.reviewRef);
25
+ validatePromotedCases(definition, approved);
26
+ }
27
+ else if (context.sourceReview)
28
+ throw new Conflict('unbound source review in qualification context');
29
+ if (admission.attempts.some(a => [a.executionId, a.attemptId].some(id => !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id) || id === '.' || id === '..')))
30
+ throw new Conflict('qualification allocation IDs must be safe local path segments');
31
+ const nullableEqual = (a, b) => a === null ? b === null : b !== null && sameRef(a, b);
32
+ const unique = (values) => new Set(values).size === values.length;
33
+ if (request.purpose !== 'qualification' || !request.qualificationRoundRef || !sameRef(request.qualificationRoundRef, admission.ref) ||
34
+ request.campaignId !== admission.campaignId || request.scenarioRefs.length !== 1 || !sameRef(request.scenarioRefs[0], definition.ref) ||
35
+ !nullableEqual(request.sourcePlanRef, definition.sourcePlanRef) || !nullableEqual(request.reviewRef, definition.reviewRef) ||
36
+ !sameRef(request.selectionManifestRef, selection.ref) || !sameRef(selection.ref, context.selection.ref) || !sameRef(selection.ref, admission.selectionManifestRef) ||
37
+ admission.attempts.length !== selection.cells.length || !unique(admission.attempts.map(a => a.selectionCellId)) ||
38
+ !unique(admission.attempts.map(a => a.executionId)) || !unique(admission.attempts.map(a => a.attemptId)) || !unique(admission.stateLeaseRefs.map(r => r.id)) ||
39
+ digestOfValue([...new Set(request.caseRefs.map(refKey))].sort()).hex !== digestOfValue([...new Set(definition.caseRefs.map(refKey))].sort()).hex)
40
+ throw new Conflict('qualification request differs from its registered closure or allocations');
41
+ return context;
42
+ }
43
+ export async function authorizeQualificationExecution(owner, request, selection, ledger, cellId) {
44
+ if (!request.qualificationRoundRef)
45
+ throw new Conflict('qualification execution requires a registered round');
46
+ const context = validateQualificationExecution(request, selection, await owner.resolve(structuredClone(request.qualificationRoundRef), structuredClone(request.requestedScope), ledger));
47
+ await owner.authorizeEffects(structuredClone(request), structuredClone(context.admission), cellId);
48
+ // Effect authorization may yield while invalidation or source/lease revocation is committed.
49
+ const current = validateQualificationExecution(request, selection, await owner.resolve(structuredClone(request.qualificationRoundRef), structuredClone(request.requestedScope), ledger));
50
+ if (digestOfValue(current).hex !== digestOfValue(context).hex)
51
+ throw new Conflict('qualification authority changed before effects');
52
+ return current;
53
+ }
54
+ //# sourceMappingURL=qualificationExecution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qualificationExecution.js","sourceRoot":"","sources":["../../src/core/qualificationExecution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { RecoveryStatusReport, type Scope } from '../protocol/index.ts';
2
+ export declare function inspectRecoveryStatus(options: {
3
+ stateDir: string;
4
+ executionId: string;
5
+ scope: Scope;
6
+ }): RecoveryStatusReport;
@@ -0,0 +1,123 @@
1
+ /** Read-only, checkpoint-bound diagnostics. Recorded cleanup is not a new absence observation. */
2
+ import { lstatSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { z } from 'zod';
5
+ import { RecoveryStatusReport } from "../protocol/index.js";
6
+ import { requireRealDirectory } from "./atomicFiles.js";
7
+ import { readVerifiedBundle } from "./bundle.js";
8
+ import { checkCommittedExecutionBinding } from "./executionReadback.js";
9
+ import { readExecutionOwnership } from "./executionOwnership.js";
10
+ import { inspectLedger, LedgerInspectionError } from "./ledgerInspection.js";
11
+ const guidance = {
12
+ ledger_snapshot_unavailable: 'Select an existing readable owned state directory. Inspection creates no state or locks.',
13
+ ledger_snapshot_changed: 'The checkpoint changed during inspection. Repeat this read-only command; no recovery action was admitted.',
14
+ ledger_snapshot_invalid: 'Preserve the journal and seek trusted reconciliation of its incomplete or invalid records; do not edit or truncate it.',
15
+ execution_missing: 'Select an execution recorded in this state directory.',
16
+ execution_binding_invalid: 'Preserve the records and check the execution, scope and attempt binding with the trusted owner.',
17
+ ownership_missing: 'Legacy or missing ownership inventory requires trusted reconciliation; absence of inventory does not prove cleanup.',
18
+ ownership_invalid: 'Preserve the ownership records and obtain trusted binding reconciliation; no resource was discharged.',
19
+ ownership_unresolved: 'Recorded acquisitions remain unresolved. Preserve their evidence; a trusted reconciliation path must establish cleanup before replay.',
20
+ execution_in_flight: 'A final or interrupted transition is not recorded. Inspect through the current trusted owner; do not break locks or infer process absence.',
21
+ interrupted_without_manifest: 'No committed bundle is available. Preserve incomplete records; use the original frozen request through normal admission only if another attempt is intended.',
22
+ committed_evidence_invalid: 'Preserve the existing execution and reconcile its missing or corrupt evidence. Do not replay the acquisition.',
23
+ committed_binding_mismatch: 'The committed evidence does not match this ledger attempt. Preserve both for trusted reconciliation; do not replay it.',
24
+ committed_readback_available: 'The checkpoint contains matching committed evidence and recorded removals. Normal run admission must recheck it and sync before finalizing; inspection did neither.',
25
+ finalized_evidence_verified: 'The finalized records match verified historical evidence. Inspection performed no new execution and grants no retry authority.',
26
+ recovery_inspection_failed: 'Preserve the existing state and inspect it with its trusted owner. No cleanup, lock recovery or execution was attempted.',
27
+ };
28
+ function empty() {
29
+ return { schemaVersion: 'tracegrove.recovery-status/v1', exitCode: 2, code: 'recovery_inspection_failed', recovery: guidance.recovery_inspection_failed,
30
+ checkpoint: null, writerLock: 'unknown', recordedPhase: null, resources: null, bundle: 'not_checked', historicalOutcome: null,
31
+ actionAuthority: 'none', execution: 'not_started_by_inspection', verificationVerdict: 'not_evaluated' };
32
+ }
33
+ const Admission = z.object({ requestDigest: z.string().regex(/^[a-f0-9]{64}$/), attemptId: z.string().min(1).max(256),
34
+ generation: z.number().int().positive(), attemptNumber: z.number().int().positive() });
35
+ export function inspectRecoveryStatus(options) {
36
+ const report = empty();
37
+ try {
38
+ if (!/^[A-Za-z0-9_-]{1,256}$/.test(options.executionId))
39
+ return RecoveryStatusReport.parse({ ...report,
40
+ code: 'execution_binding_invalid', recovery: guidance.execution_binding_invalid });
41
+ const view = inspectLedger(options.stateDir);
42
+ report.checkpoint = { ...view.head };
43
+ report.writerLock = view.writerLock;
44
+ const finish = (code, exitCode = 2) => {
45
+ view.assertUnchanged();
46
+ return RecoveryStatusReport.parse({ ...report, code, exitCode, recovery: guidance[code] });
47
+ };
48
+ const executionId = options.executionId;
49
+ const history = view.history(`execution:${executionId}`);
50
+ const state = history.at(-1);
51
+ if (!state)
52
+ return finish('execution_missing');
53
+ const admitted = history.find(row => row.type === 'admitted');
54
+ const admission = Admission.safeParse(admitted?.data);
55
+ if (!admission.success)
56
+ return finish('execution_binding_invalid');
57
+ report.recordedPhase = ['admitted', 'cell.finalized', 'interrupted', 'finalized'].includes(state.type) ? state.type : 'other';
58
+ const ownership = view.current(`ownership:${executionId}`);
59
+ if (!ownership)
60
+ return finish('ownership_missing');
61
+ const campaign = z.object({ binding: z.object({ campaignId: z.string().min(1) }) }).safeParse(ownership.data);
62
+ if (!campaign.success)
63
+ return finish('ownership_invalid');
64
+ const expected = { executionId, attemptId: admission.data.attemptId, generation: admission.data.generation,
65
+ requestDigest: admission.data.requestDigest, campaignId: campaign.data.binding.campaignId, scope: options.scope };
66
+ let inventory;
67
+ try {
68
+ inventory = readExecutionOwnership(view, expected).inventory;
69
+ }
70
+ catch {
71
+ return finish('ownership_invalid');
72
+ }
73
+ const counts = () => ({ reserved: 0, observed: 0, cleanup_pending: 0, removed: 0 });
74
+ report.resources = { host: counts(), fixture: counts() };
75
+ for (const resource of inventory.resources)
76
+ report.resources[resource.kind][resource.state]++;
77
+ // These are journal states only. Never infer removal from a PID, path or elapsed time.
78
+ const unresolved = inventory.resources.some(resource => resource.state !== 'removed');
79
+ if (unresolved && state.type !== 'finalized')
80
+ return finish('ownership_unresolved');
81
+ if (state.type !== 'finalized' && state.type !== 'interrupted')
82
+ return finish('execution_in_flight');
83
+ const dir = join(resolve(options.stateDir), 'executions', executionId);
84
+ try {
85
+ requireRealDirectory(dir);
86
+ lstatSync(join(dir, 'manifest.json'));
87
+ }
88
+ catch (error) {
89
+ if (error.code === 'ENOENT') {
90
+ report.bundle = 'absent';
91
+ return finish(state.type === 'finalized' ? 'committed_evidence_invalid' : 'interrupted_without_manifest');
92
+ }
93
+ report.bundle = 'invalid';
94
+ return finish('committed_evidence_invalid');
95
+ }
96
+ let checked;
97
+ try {
98
+ checked = readVerifiedBundle(dir);
99
+ }
100
+ catch {
101
+ report.bundle = 'invalid';
102
+ return finish('committed_evidence_invalid');
103
+ }
104
+ try {
105
+ checkCommittedExecutionBinding(view, checked, { ...expected, attemptNumber: admission.data.attemptNumber });
106
+ }
107
+ catch {
108
+ report.bundle = 'invalid';
109
+ return finish('committed_binding_mismatch');
110
+ }
111
+ report.bundle = 'verified_bound';
112
+ report.historicalOutcome = checked.campaign.outcome;
113
+ // Finalized records may preserve failed/unconfirmed cleanup: show it rather than imply readiness.
114
+ if (unresolved)
115
+ return finish('ownership_unresolved');
116
+ return finish(state.type === 'finalized' ? 'finalized_evidence_verified' : 'committed_readback_available', 0);
117
+ }
118
+ catch (error) {
119
+ const code = error instanceof LedgerInspectionError ? error.code : 'recovery_inspection_failed';
120
+ return RecoveryStatusReport.parse({ ...empty(), code, recovery: guidance[code] });
121
+ }
122
+ }
123
+ //# sourceMappingURL=recoveryStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recoveryStatus.js","sourceRoot":"","sources":["../../src/core/recoveryStatus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Trusted reducer: derives expected assertion instances from the frozen case, evaluates them
3
+ * against recorded step observations, computes coverage and the per-cell/campaign outcomes.
4
+ * Producer flags are redundant checks, never authority.
5
+ */
6
+ import { AssertionObservation, BrowserObservation, CampaignResult, Coverage, type CaseSpec, type EnvironmentBinding, type ExecutionReceipt, type Outcome, type PredicateT, type Ref, type SelectionManifest, type StepObservation, type TargetTuple, type Scope } from '../protocol/index.ts';
7
+ export declare const REDUCER_REF: Ref;
8
+ export declare function getPath(value: unknown, path: string): {
9
+ present: boolean;
10
+ value: unknown;
11
+ };
12
+ export type ObservationView = {
13
+ status?: number | undefined;
14
+ body?: unknown;
15
+ browser?: BrowserObservation;
16
+ stepResult?: StepObservation['result'] | undefined;
17
+ };
18
+ export declare function evaluatePredicate(predicate: PredicateT, view: ObservationView): {
19
+ pass: boolean;
20
+ actual: unknown;
21
+ reason: string | null;
22
+ };
23
+ export declare function evaluateAssertions(spec: CaseSpec, environmentClass: EnvironmentBinding['class'], steps: StepObservation[], producerRef: Ref, from: string, to: string): AssertionObservation[];
24
+ export type CellReductionInput = {
25
+ spec: CaseSpec;
26
+ expectedStepIds: string[];
27
+ steps: StepObservation[];
28
+ assertions: AssertionObservation[];
29
+ cancelled: boolean;
30
+ fixtureState: 'verified' | 'failed' | 'blocked' | 'cancelled' | 'unknown' | 'not_required';
31
+ identityMatched: boolean | null;
32
+ fidelityMatched: boolean;
33
+ requiredCapabilitiesObserved: boolean;
34
+ artifactsVerified: boolean;
35
+ unknownMutations: number;
36
+ criticalCleanupConfirmed: boolean;
37
+ infrastructureFailure: boolean;
38
+ blockedReasons: string[];
39
+ };
40
+ export declare function reduceCell(input: CellReductionInput): {
41
+ outcome: Outcome;
42
+ reasonCodes: string[];
43
+ proofEligible: boolean;
44
+ coverage: Coverage;
45
+ };
46
+ export declare function reduceCampaign(input: {
47
+ scope: Scope;
48
+ campaignId: string;
49
+ requestRef: Ref;
50
+ selection: SelectionManifest;
51
+ receipts: ExecutionReceipt[];
52
+ }): CampaignResult;
53
+ export declare function compareTargets(expected: TargetTuple, observed: TargetTuple | null): {
54
+ matched: boolean | null;
55
+ mismatches: string[];
56
+ };
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Trusted reducer: derives expected assertion instances from the frozen case, evaluates them
3
+ * against recorded step observations, computes coverage and the per-cell/campaign outcomes.
4
+ * Producer flags are redundant checks, never authority.
5
+ */
6
+ import { AssertionObservation, BrowserObservation, NativeJobObservation, McpToolObservation, CampaignResult, Coverage, digestOfValue, freeze, parseAs, } from "../protocol/index.js";
7
+ import { nowIso } from "./clock.js";
8
+ import { isInfrastructureStepFailure } from "./errors.js";
9
+ export const REDUCER_REF = (() => {
10
+ const base = { id: 'tracegrove.reducer', revision: '0.1.0' };
11
+ return { ...base, digest: digestOfValue(base) };
12
+ })();
13
+ export function getPath(value, path) {
14
+ let current = value;
15
+ for (const segment of path.split('.')) {
16
+ const match = segment.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:\[([0-9]+)\])?$/);
17
+ if (!match)
18
+ return { present: false, value: undefined };
19
+ const key = match[1];
20
+ if (!current || typeof current !== 'object' || !(key in current))
21
+ return { present: false, value: undefined };
22
+ current = current[key];
23
+ if (match[2] !== undefined) {
24
+ if (!Array.isArray(current))
25
+ return { present: false, value: undefined };
26
+ const index = Number(match[2]);
27
+ if (index >= current.length)
28
+ return { present: false, value: undefined };
29
+ current = current[index];
30
+ }
31
+ }
32
+ return { present: current !== undefined, value: current };
33
+ }
34
+ function jsonEqual(a, b) {
35
+ return digestOfValue(a).hex === digestOfValue(b).hex;
36
+ }
37
+ export function evaluatePredicate(predicate, view) {
38
+ switch (predicate.kind) {
39
+ case 'status_equals': return { pass: view.status === predicate.value, actual: view.status ?? null, reason: view.status === predicate.value ? null : `status ${view.status ?? 'none'} != ${predicate.value}` };
40
+ case 'json_path_equals': {
41
+ const got = getPath(view, predicate.path);
42
+ const pass = got.present && jsonEqual(got.value, predicate.value);
43
+ return { pass, actual: got.present ? got.value : null, reason: pass ? null : `${predicate.path} ${got.present ? 'differs' : 'absent'}` };
44
+ }
45
+ case 'json_path_present': {
46
+ const got = getPath(view, predicate.path);
47
+ return { pass: got.present, actual: got.present ? got.value : null, reason: got.present ? null : `${predicate.path} absent` };
48
+ }
49
+ case 'json_path_absent': {
50
+ const got = getPath(view, predicate.path);
51
+ return { pass: !got.present, actual: got.present ? got.value : null, reason: got.present ? null : `${predicate.path} present` };
52
+ }
53
+ case 'json_path_count': {
54
+ const got = getPath(view, predicate.path);
55
+ const count = Array.isArray(got.value) ? got.value.length : got.present ? 1 : 0;
56
+ return { pass: count === predicate.count, actual: count, reason: count === predicate.count ? null : `count ${count} != ${predicate.count}` };
57
+ }
58
+ case 'step_result': return { pass: view.stepResult === predicate.value, actual: view.stepResult ?? null, reason: view.stepResult === predicate.value ? null : `step ${view.stepResult ?? 'unobserved'} != ${predicate.value}` };
59
+ case 'all': {
60
+ const results = predicate.predicates.map((p) => evaluatePredicate(p, view));
61
+ const failed = results.find((r) => !r.pass);
62
+ return { pass: !failed, actual: results.map((r) => r.actual), reason: failed ? failed.reason : null };
63
+ }
64
+ }
65
+ }
66
+ export function evaluateAssertions(spec, environmentClass, steps, producerRef, from, to) {
67
+ const byStep = new Map(steps.map((s) => [s.stepId, s]));
68
+ const expected = [...spec.preconditions, ...spec.assertions];
69
+ return expected.map((assertion) => {
70
+ const oracleRef = { id: assertion.oracle.name, revision: assertion.oracle.version, digest: digestOfValue(assertion.oracle) };
71
+ const applicable = assertion.environmentClasses.includes(environmentClass);
72
+ const step = byStep.get(assertion.stepId);
73
+ let result;
74
+ let reasonCode = null;
75
+ let actual = null;
76
+ if (!applicable) {
77
+ result = 'not_applicable';
78
+ }
79
+ else if (!step || step.result === 'not_run' || step.result === 'cancelled') {
80
+ result = 'not_observed';
81
+ reasonCode = step ? `step_${step.result}` : 'step_missing';
82
+ }
83
+ else if (step.result === 'failed' && isInfrastructureStepFailure(step.reasonCode)) {
84
+ result = 'not_observed';
85
+ reasonCode = step.reasonCode;
86
+ }
87
+ else if (assertion.oracle.name === 'step.result') {
88
+ const evaluation = evaluatePredicate(assertion.predicate, { stepResult: step.result });
89
+ result = evaluation.pass ? 'pass' : 'fail';
90
+ actual = evaluation.actual;
91
+ reasonCode = evaluation.reason;
92
+ }
93
+ else if (assertion.oracle.name === 'browser.observation') {
94
+ const browser = BrowserObservation.safeParse(step.output);
95
+ if (!browser.success || browser.data.textTruncated) {
96
+ result = 'not_observed';
97
+ reasonCode = 'invalid_or_truncated_browser_observation';
98
+ }
99
+ else {
100
+ const evaluation = evaluatePredicate(assertion.predicate, { browser: browser.data });
101
+ result = evaluation.pass ? 'pass' : 'fail';
102
+ actual = evaluation.actual;
103
+ reasonCode = evaluation.reason;
104
+ }
105
+ }
106
+ else if (assertion.oracle.name === 'mcp.observation') {
107
+ const mcp = McpToolObservation.safeParse(step.output);
108
+ const expected = spec.steps.find(item => item.id === assertion.stepId);
109
+ if (!mcp.success || expected?.kind !== 'mcp.call' || mcp.data.tool !== expected.command.tool || mcp.data.endpoint !== expected.command.endpoint) {
110
+ result = 'not_observed';
111
+ reasonCode = 'invalid_mcp_observation';
112
+ }
113
+ else {
114
+ const evaluation = evaluatePredicate(assertion.predicate, { body: mcp.data });
115
+ result = evaluation.pass ? 'pass' : 'fail';
116
+ actual = evaluation.actual;
117
+ reasonCode = evaluation.reason;
118
+ }
119
+ }
120
+ else if (assertion.oracle.name === 'job.observation') {
121
+ const job = NativeJobObservation.safeParse(step.output);
122
+ if (!job.success) {
123
+ result = 'not_observed';
124
+ reasonCode = 'invalid_native_job_observation';
125
+ }
126
+ else {
127
+ const evaluation = evaluatePredicate(assertion.predicate, { body: job.data });
128
+ result = evaluation.pass ? 'pass' : 'fail';
129
+ actual = evaluation.actual;
130
+ reasonCode = evaluation.reason;
131
+ }
132
+ }
133
+ else {
134
+ const output = (step.output ?? null);
135
+ if (!output) {
136
+ result = 'not_observed';
137
+ reasonCode = 'no_observation_recorded';
138
+ }
139
+ else {
140
+ const evaluation = evaluatePredicate(assertion.predicate, { status: output.status, body: output.body });
141
+ result = evaluation.pass ? 'pass' : 'fail';
142
+ actual = evaluation.actual;
143
+ reasonCode = evaluation.reason;
144
+ }
145
+ }
146
+ return parseAs(AssertionObservation, {
147
+ assertionId: assertion.id,
148
+ required: assertion.required,
149
+ oracleRef,
150
+ result,
151
+ reasonCode,
152
+ actual: actual ?? null,
153
+ evidenceRefs: [],
154
+ producerRef,
155
+ inputDigest: digestOfValue({ assertion, stepOutput: step?.outputDigest ?? null }),
156
+ observedFrom: from,
157
+ observedTo: to,
158
+ judge: null,
159
+ }, `assertion ${assertion.id}`);
160
+ });
161
+ }
162
+ export function reduceCell(input) {
163
+ const reasons = [...input.blockedReasons];
164
+ const observedSteps = new Set(input.steps.map((s) => s.stepId));
165
+ const missingSteps = input.expectedStepIds.filter((id) => !observedSteps.has(id));
166
+ const completedSteps = input.steps.filter((s) => s.result === 'completed').length;
167
+ const requiredAssertions = input.assertions.filter((a) => a.required && a.result !== 'not_applicable');
168
+ const passedRequired = requiredAssertions.filter((a) => a.result === 'pass').length;
169
+ const failedRequired = requiredAssertions.filter((a) => a.result === 'fail');
170
+ const unobservedRequired = requiredAssertions.filter((a) => a.result === 'not_observed');
171
+ if (missingSteps.length > 0)
172
+ reasons.push(`missing_step_observation:${missingSteps.join('/')}`);
173
+ if (requiredAssertions.length === 0)
174
+ reasons.push('zero_required_assertions');
175
+ let outcome;
176
+ if (failedRequired.length > 0) {
177
+ outcome = 'assertion_failed';
178
+ reasons.push(...failedRequired.map((a) => `assertion_failed:${a.assertionId}`));
179
+ }
180
+ else if (input.blockedReasons.length > 0) {
181
+ outcome = 'blocked';
182
+ }
183
+ else if (input.cancelled) {
184
+ outcome = 'cancelled';
185
+ reasons.push('cancelled_before_completion');
186
+ }
187
+ else if (input.fixtureState !== 'verified' && input.fixtureState !== 'not_required') {
188
+ outcome = 'blocked';
189
+ reasons.push(`fixture_${input.fixtureState}`);
190
+ }
191
+ else if (input.infrastructureFailure) {
192
+ outcome = 'infrastructure_failed';
193
+ }
194
+ else if (unobservedRequired.length > 0 || missingSteps.length > 0 || completedSteps !== input.expectedStepIds.length) {
195
+ outcome = 'inconclusive';
196
+ reasons.push(...unobservedRequired.map((a) => `required_not_observed:${a.assertionId}`));
197
+ }
198
+ else if (input.identityMatched !== true) {
199
+ outcome = 'inconclusive';
200
+ reasons.push(input.identityMatched === null ? 'required_identity_unknown' : 'identity_mismatch');
201
+ }
202
+ else if (!input.fidelityMatched) {
203
+ outcome = 'inconclusive';
204
+ reasons.push('boundary_fidelity_mismatch');
205
+ }
206
+ else if (!input.requiredCapabilitiesObserved) {
207
+ outcome = 'blocked';
208
+ reasons.push('required_capability_not_observed');
209
+ }
210
+ else if (!input.artifactsVerified) {
211
+ outcome = 'inconclusive';
212
+ reasons.push('required_artifacts_unverified');
213
+ }
214
+ else if (input.unknownMutations > 0 || !input.criticalCleanupConfirmed) {
215
+ outcome = 'inconclusive';
216
+ reasons.push(input.unknownMutations > 0 ? 'unknown_mutations_remain' : 'critical_cleanup_unconfirmed');
217
+ }
218
+ else if (requiredAssertions.length === 0) {
219
+ outcome = 'inconclusive';
220
+ }
221
+ else {
222
+ outcome = 'passed';
223
+ }
224
+ // Evidence/cleanup failures stay recorded even on assertion failure.
225
+ if (outcome === 'assertion_failed') {
226
+ if (!input.artifactsVerified)
227
+ reasons.push('required_artifacts_unverified');
228
+ if (!input.criticalCleanupConfirmed)
229
+ reasons.push('critical_cleanup_unconfirmed');
230
+ }
231
+ const proofEligible = outcome === 'passed';
232
+ const coverage = parseAs(Coverage, {
233
+ selected: 1, required: 1, attempted: 1, observed: 1,
234
+ passed: outcome === 'passed' ? 1 : 0, blocked: outcome === 'blocked' ? 1 : 0, excluded: 0,
235
+ requiredCells: [],
236
+ expectedSteps: input.expectedStepIds.length,
237
+ completedSteps,
238
+ requiredAssertions: requiredAssertions.length,
239
+ passedRequiredAssertions: passedRequired,
240
+ }, 'coverage');
241
+ return { outcome, reasonCodes: [...new Set(reasons)], proofEligible, coverage };
242
+ }
243
+ export function reduceCampaign(input) {
244
+ const byCell = new Map();
245
+ for (const receipt of input.receipts) {
246
+ const list = byCell.get(receipt.selectionCellId) ?? [];
247
+ list.push(receipt);
248
+ byCell.set(receipt.selectionCellId, list);
249
+ }
250
+ const missing = [];
251
+ const cellReceiptRefs = [];
252
+ const requiredCells = [];
253
+ const outcomes = [];
254
+ let duplicate = false;
255
+ for (const cell of input.selection.cells) {
256
+ const list = byCell.get(cell.selectionCellId) ?? [];
257
+ if (list.length === 0) {
258
+ missing.push(cell.selectionCellId);
259
+ if (cell.required)
260
+ requiredCells.push({ selectionCellId: cell.selectionCellId, outcome: 'missing' });
261
+ continue;
262
+ }
263
+ if (list.length > 1)
264
+ duplicate = true;
265
+ const receipt = list[0];
266
+ // The receipt must bind its own cell's case/persona/binding, never another cell's defaults.
267
+ const bound = receipt.caseRef.digest.hex === cell.caseRef.digest.hex && receipt.personaRef.digest.hex === cell.personaRef.digest.hex && receipt.surfaceBindingRef.digest.hex === cell.surfaceBindingRef.digest.hex;
268
+ const outcome = bound ? receipt.outcome : 'inconclusive';
269
+ cellReceiptRefs.push({ selectionCellId: cell.selectionCellId, receiptRef: receipt.ref });
270
+ if (cell.required) {
271
+ requiredCells.push({ selectionCellId: cell.selectionCellId, outcome: bound ? outcome : 'relabeled_receipt' });
272
+ outcomes.push(outcome);
273
+ }
274
+ }
275
+ const unknownCells = [...byCell.keys()].filter((id) => !input.selection.cells.some((cell) => cell.selectionCellId === id));
276
+ const requiredCount = input.selection.cells.filter((c) => c.required).length;
277
+ let outcome;
278
+ if (requiredCount === 0)
279
+ outcome = 'inconclusive';
280
+ else if (duplicate || unknownCells.length > 0)
281
+ outcome = 'inconclusive';
282
+ else if (outcomes.some((o) => o === 'assertion_failed'))
283
+ outcome = 'assertion_failed';
284
+ else if (missing.length > 0 && requiredCells.some((c) => c.outcome === 'missing'))
285
+ outcome = 'inconclusive';
286
+ else if (outcomes.some((o) => o === 'blocked'))
287
+ outcome = 'blocked';
288
+ else if (outcomes.some((o) => o === 'infrastructure_failed'))
289
+ outcome = 'infrastructure_failed';
290
+ else if (outcomes.some((o) => o === 'cancelled'))
291
+ outcome = 'cancelled';
292
+ else if (outcomes.some((o) => o === 'inconclusive'))
293
+ outcome = 'inconclusive';
294
+ else
295
+ outcome = 'passed';
296
+ const receiptsForCoverage = input.receipts;
297
+ const coverage = parseAs(Coverage, {
298
+ selected: input.selection.cells.length,
299
+ required: requiredCount,
300
+ attempted: cellReceiptRefs.length,
301
+ observed: cellReceiptRefs.length,
302
+ passed: receiptsForCoverage.filter((r) => r.outcome === 'passed').length,
303
+ blocked: receiptsForCoverage.filter((r) => r.outcome === 'blocked').length,
304
+ excluded: input.selection.excludedCells.length,
305
+ requiredCells,
306
+ expectedSteps: receiptsForCoverage.reduce((n, r) => n + r.coverage.expectedSteps, 0),
307
+ completedSteps: receiptsForCoverage.reduce((n, r) => n + r.coverage.completedSteps, 0),
308
+ requiredAssertions: receiptsForCoverage.reduce((n, r) => n + r.coverage.requiredAssertions, 0),
309
+ passedRequiredAssertions: receiptsForCoverage.reduce((n, r) => n + r.coverage.passedRequiredAssertions, 0),
310
+ }, 'campaign coverage');
311
+ const result = freeze({
312
+ schemaVersion: 'workflow.campaign-result/v1',
313
+ ref: { id: `${input.campaignId}.result`, revision: '1' },
314
+ scope: input.scope,
315
+ campaignId: input.campaignId,
316
+ requestRef: input.requestRef,
317
+ selectionManifestRef: input.selection.ref,
318
+ cellReceiptRefs,
319
+ missingCellIds: missing,
320
+ coverage,
321
+ outcome,
322
+ proofEligible: outcome === 'passed',
323
+ finalizedAt: nowIso(),
324
+ });
325
+ return parseAs(CampaignResult, result, 'campaign result');
326
+ }
327
+ export function compareTargets(expected, observed) {
328
+ if (!observed)
329
+ return { matched: null, mismatches: ['no observed target'] };
330
+ const mismatches = [];
331
+ for (const field of Object.keys(expected)) {
332
+ if (field !== 'components' && !jsonEqual(expected[field], observed[field]))
333
+ mismatches.push(`${field}: identity differs`);
334
+ }
335
+ for (const componentId of expected.requiredComponents) {
336
+ const exp = expected.components.find((c) => c.componentId === componentId);
337
+ const obs = observed.components.find((c) => c.componentId === componentId);
338
+ if (!exp || !exp.identity) {
339
+ mismatches.push(`${componentId}: expected identity missing`);
340
+ continue;
341
+ }
342
+ if (!obs || !obs.identity) {
343
+ mismatches.push(`${componentId}: not observed`);
344
+ continue;
345
+ }
346
+ if (exp.kind !== obs.kind)
347
+ mismatches.push(`${componentId}: component kind differs`);
348
+ if (digestOfValue(exp.identity).hex !== digestOfValue(obs.identity).hex)
349
+ mismatches.push(`${componentId}: identity differs`);
350
+ }
351
+ if (mismatches.some((m) => m.endsWith('not observed')))
352
+ return { matched: null, mismatches };
353
+ return { matched: mismatches.length === 0, mismatches };
354
+ }
355
+ //# sourceMappingURL=reducer.js.map