tracegrove 0.0.0-stage → 0.3.0

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 (721) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +588 -2
  3. package/conformance/coordination-vectors.json +377 -0
  4. package/dist/adapters/browser/capabilities.d.ts +45 -0
  5. package/dist/adapters/browser/capabilities.js +14 -0
  6. package/dist/adapters/browser/capabilities.js.map +1 -0
  7. package/dist/adapters/browser/driver.d.ts +45 -0
  8. package/dist/adapters/browser/driver.js +295 -0
  9. package/dist/adapters/browser/driver.js.map +1 -0
  10. package/dist/adapters/browser/session.d.ts +21 -0
  11. package/dist/adapters/browser/session.js +87 -0
  12. package/dist/adapters/browser/session.js.map +1 -0
  13. package/dist/adapters/http/capabilities.d.ts +2 -0
  14. package/dist/adapters/http/capabilities.js +21 -0
  15. package/dist/adapters/http/capabilities.js.map +1 -0
  16. package/dist/adapters/http/driver.d.ts +55 -0
  17. package/dist/adapters/http/driver.js +125 -0
  18. package/dist/adapters/http/driver.js.map +1 -0
  19. package/dist/adapters/job/capabilities.d.ts +45 -0
  20. package/dist/adapters/job/capabilities.js +8 -0
  21. package/dist/adapters/job/capabilities.js.map +1 -0
  22. package/dist/adapters/job/driver.d.ts +26 -0
  23. package/dist/adapters/job/driver.js +110 -0
  24. package/dist/adapters/job/driver.js.map +1 -0
  25. package/dist/adapters/job/types.d.ts +9 -0
  26. package/dist/adapters/job/types.js +2 -0
  27. package/dist/adapters/job/types.js.map +1 -0
  28. package/dist/adapters/mcp/capabilities.d.ts +46 -0
  29. package/dist/adapters/mcp/capabilities.js +17 -0
  30. package/dist/adapters/mcp/capabilities.js.map +1 -0
  31. package/dist/adapters/mcp/driver.d.ts +10 -0
  32. package/dist/adapters/mcp/driver.js +83 -0
  33. package/dist/adapters/mcp/driver.js.map +1 -0
  34. package/dist/adapters/poll.d.ts +12 -0
  35. package/dist/adapters/poll.js +31 -0
  36. package/dist/adapters/poll.js.map +1 -0
  37. package/dist/authoring/activity.d.ts +17 -0
  38. package/dist/authoring/activity.js +18 -0
  39. package/dist/authoring/activity.js.map +1 -0
  40. package/dist/authoring/agent.d.ts +70 -0
  41. package/dist/authoring/agent.js +268 -0
  42. package/dist/authoring/agent.js.map +1 -0
  43. package/dist/authoring/appLaunch.d.ts +7 -0
  44. package/dist/authoring/appLaunch.js +32 -0
  45. package/dist/authoring/appLaunch.js.map +1 -0
  46. package/dist/authoring/appLocation.d.ts +2 -0
  47. package/dist/authoring/appLocation.js +5 -0
  48. package/dist/authoring/appLocation.js.map +1 -0
  49. package/dist/authoring/browser.d.ts +15 -0
  50. package/dist/authoring/browser.js +20 -0
  51. package/dist/authoring/browser.js.map +1 -0
  52. package/dist/authoring/compile.d.ts +47 -0
  53. package/dist/authoring/compile.js +508 -0
  54. package/dist/authoring/compile.js.map +1 -0
  55. package/dist/authoring/discover.d.ts +43 -0
  56. package/dist/authoring/discover.js +149 -0
  57. package/dist/authoring/discover.js.map +1 -0
  58. package/dist/authoring/environmentTemplates.d.ts +3 -0
  59. package/dist/authoring/environmentTemplates.js +24 -0
  60. package/dist/authoring/environmentTemplates.js.map +1 -0
  61. package/dist/authoring/heal.d.ts +108 -0
  62. package/dist/authoring/heal.js +723 -0
  63. package/dist/authoring/heal.js.map +1 -0
  64. package/dist/authoring/index.d.ts +14 -0
  65. package/dist/authoring/index.js +15 -0
  66. package/dist/authoring/index.js.map +1 -0
  67. package/dist/authoring/init.d.ts +21 -0
  68. package/dist/authoring/init.js +141 -0
  69. package/dist/authoring/init.js.map +1 -0
  70. package/dist/authoring/localSettings.d.ts +33 -0
  71. package/dist/authoring/localSettings.js +31 -0
  72. package/dist/authoring/localSettings.js.map +1 -0
  73. package/dist/authoring/media.d.ts +10 -0
  74. package/dist/authoring/media.js +37 -0
  75. package/dist/authoring/media.js.map +1 -0
  76. package/dist/authoring/module.d.ts +2 -0
  77. package/dist/authoring/module.js +38 -0
  78. package/dist/authoring/module.js.map +1 -0
  79. package/dist/authoring/run.d.ts +74 -0
  80. package/dist/authoring/run.js +242 -0
  81. package/dist/authoring/run.js.map +1 -0
  82. package/dist/authoring/runSource.d.ts +6 -0
  83. package/dist/authoring/runSource.js +24 -0
  84. package/dist/authoring/runSource.js.map +1 -0
  85. package/dist/authoring/savedRun.d.ts +13 -0
  86. package/dist/authoring/savedRun.js +94 -0
  87. package/dist/authoring/savedRun.js.map +1 -0
  88. package/dist/authoring/schema.d.ts +574 -0
  89. package/dist/authoring/schema.js +147 -0
  90. package/dist/authoring/schema.js.map +1 -0
  91. package/dist/authoring/snapshotSource.d.ts +13 -0
  92. package/dist/authoring/snapshotSource.js +41 -0
  93. package/dist/authoring/snapshotSource.js.map +1 -0
  94. package/dist/authoring/sourceSelection.d.ts +34 -0
  95. package/dist/authoring/sourceSelection.js +13 -0
  96. package/dist/authoring/sourceSelection.js.map +1 -0
  97. package/dist/authoring/sources.d.ts +5 -0
  98. package/dist/authoring/sources.js +65 -0
  99. package/dist/authoring/sources.js.map +1 -0
  100. package/dist/authoring/status.d.ts +48 -0
  101. package/dist/authoring/status.js +100 -0
  102. package/dist/authoring/status.js.map +1 -0
  103. package/dist/authoring/typed.d.ts +6 -0
  104. package/dist/authoring/typed.js +5 -0
  105. package/dist/authoring/typed.js.map +1 -0
  106. package/dist/authoring/ui.d.ts +10 -0
  107. package/dist/authoring/ui.js +486 -0
  108. package/dist/authoring/ui.js.map +1 -0
  109. package/dist/authoring/uiPage.d.ts +1 -0
  110. package/dist/authoring/uiPage.js +358 -0
  111. package/dist/authoring/uiPage.js.map +1 -0
  112. package/dist/authoring/uiSourceControls.d.ts +2 -0
  113. package/dist/authoring/uiSourceControls.js +41 -0
  114. package/dist/authoring/uiSourceControls.js.map +1 -0
  115. package/dist/authoring/verificationSource.d.ts +41 -0
  116. package/dist/authoring/verificationSource.js +46 -0
  117. package/dist/authoring/verificationSource.js.map +1 -0
  118. package/dist/authoring/workspace.d.ts +33 -0
  119. package/dist/authoring/workspace.js +58 -0
  120. package/dist/authoring/workspace.js.map +1 -0
  121. package/dist/cli/arguments.d.ts +288 -0
  122. package/dist/cli/arguments.js +121 -0
  123. package/dist/cli/arguments.js.map +1 -0
  124. package/dist/cli/cleanup.d.ts +18 -0
  125. package/dist/cli/cleanup.js +40 -0
  126. package/dist/cli/cleanup.js.map +1 -0
  127. package/dist/cli/doctor.d.ts +51 -0
  128. package/dist/cli/doctor.js +118 -0
  129. package/dist/cli/doctor.js.map +1 -0
  130. package/dist/cli/errors.d.ts +2 -0
  131. package/dist/cli/errors.js +84 -0
  132. package/dist/cli/errors.js.map +1 -0
  133. package/dist/cli/jsonFile.d.ts +2 -0
  134. package/dist/cli/jsonFile.js +15 -0
  135. package/dist/cli/jsonFile.js.map +1 -0
  136. package/dist/cli/main.d.ts +2 -0
  137. package/dist/cli/main.js +603 -0
  138. package/dist/cli/main.js.map +1 -0
  139. package/dist/cli/render.d.ts +22 -0
  140. package/dist/cli/render.js +150 -0
  141. package/dist/cli/render.js.map +1 -0
  142. package/dist/cli/samples/catalog.d.ts +10 -0
  143. package/dist/cli/samples/catalog.js +3 -0
  144. package/dist/cli/samples/catalog.js.map +1 -0
  145. package/dist/cli/samples/write.d.ts +5 -0
  146. package/dist/cli/samples/write.js +64 -0
  147. package/dist/cli/samples/write.js.map +1 -0
  148. package/dist/cli/source.d.ts +41 -0
  149. package/dist/cli/source.js +59 -0
  150. package/dist/cli/source.js.map +1 -0
  151. package/dist/core/activationDecision.d.ts +153 -0
  152. package/dist/core/activationDecision.js +34 -0
  153. package/dist/core/activationDecision.js.map +1 -0
  154. package/dist/core/artifacts.d.ts +18 -0
  155. package/dist/core/artifacts.js +79 -0
  156. package/dist/core/artifacts.js.map +1 -0
  157. package/dist/core/atomicFiles.d.ts +9 -0
  158. package/dist/core/atomicFiles.js +76 -0
  159. package/dist/core/atomicFiles.js.map +1 -0
  160. package/dist/core/boundedFile.d.ts +2 -0
  161. package/dist/core/boundedFile.js +28 -0
  162. package/dist/core/boundedFile.js.map +1 -0
  163. package/dist/core/bundle.d.ts +77 -0
  164. package/dist/core/bundle.js +375 -0
  165. package/dist/core/bundle.js.map +1 -0
  166. package/dist/core/bundleArchive.d.ts +10 -0
  167. package/dist/core/bundleArchive.js +47 -0
  168. package/dist/core/bundleArchive.js.map +1 -0
  169. package/dist/core/bundleEvidence.d.ts +12 -0
  170. package/dist/core/bundleEvidence.js +169 -0
  171. package/dist/core/bundleEvidence.js.map +1 -0
  172. package/dist/core/bundleExport.d.ts +12 -0
  173. package/dist/core/bundleExport.js +36 -0
  174. package/dist/core/bundleExport.js.map +1 -0
  175. package/dist/core/bundleFiles.d.ts +5 -0
  176. package/dist/core/bundleFiles.js +47 -0
  177. package/dist/core/bundleFiles.js.map +1 -0
  178. package/dist/core/bundlePaths.d.ts +2 -0
  179. package/dist/core/bundlePaths.js +7 -0
  180. package/dist/core/bundlePaths.js.map +1 -0
  181. package/dist/core/bundleSnapshot.d.ts +26 -0
  182. package/dist/core/bundleSnapshot.js +71 -0
  183. package/dist/core/bundleSnapshot.js.map +1 -0
  184. package/dist/core/capabilityBoundary.d.ts +1452 -0
  185. package/dist/core/capabilityBoundary.js +361 -0
  186. package/dist/core/capabilityBoundary.js.map +1 -0
  187. package/dist/core/capabilityLifecycle.d.ts +366 -0
  188. package/dist/core/capabilityLifecycle.js +79 -0
  189. package/dist/core/capabilityLifecycle.js.map +1 -0
  190. package/dist/core/cleanup.d.ts +35 -0
  191. package/dist/core/cleanup.js +71 -0
  192. package/dist/core/cleanup.js.map +1 -0
  193. package/dist/core/cleanupActions.d.ts +5 -0
  194. package/dist/core/cleanupActions.js +15 -0
  195. package/dist/core/cleanupActions.js.map +1 -0
  196. package/dist/core/cleanupAttestation.d.ts +23 -0
  197. package/dist/core/cleanupAttestation.js +57 -0
  198. package/dist/core/cleanupAttestation.js.map +1 -0
  199. package/dist/core/clock.d.ts +4 -0
  200. package/dist/core/clock.js +14 -0
  201. package/dist/core/clock.js.map +1 -0
  202. package/dist/core/compiler.d.ts +19 -0
  203. package/dist/core/compiler.js +200 -0
  204. package/dist/core/compiler.js.map +1 -0
  205. package/dist/core/controller.d.ts +7 -0
  206. package/dist/core/controller.js +132 -0
  207. package/dist/core/controller.js.map +1 -0
  208. package/dist/core/coordination.d.ts +72 -0
  209. package/dist/core/coordination.js +118 -0
  210. package/dist/core/coordination.js.map +1 -0
  211. package/dist/core/corpus.d.ts +60 -0
  212. package/dist/core/corpus.js +216 -0
  213. package/dist/core/corpus.js.map +1 -0
  214. package/dist/core/deadline.d.ts +12 -0
  215. package/dist/core/deadline.js +38 -0
  216. package/dist/core/deadline.js.map +1 -0
  217. package/dist/core/deliveryJournal.d.ts +37 -0
  218. package/dist/core/deliveryJournal.js +85 -0
  219. package/dist/core/deliveryJournal.js.map +1 -0
  220. package/dist/core/environmentPreflight.d.ts +14 -0
  221. package/dist/core/environmentPreflight.js +179 -0
  222. package/dist/core/environmentPreflight.js.map +1 -0
  223. package/dist/core/errors.d.ts +22 -0
  224. package/dist/core/errors.js +29 -0
  225. package/dist/core/errors.js.map +1 -0
  226. package/dist/core/events.d.ts +14 -0
  227. package/dist/core/events.js +37 -0
  228. package/dist/core/events.js.map +1 -0
  229. package/dist/core/executionInspection.d.ts +90 -0
  230. package/dist/core/executionInspection.js +31 -0
  231. package/dist/core/executionInspection.js.map +1 -0
  232. package/dist/core/executionOwnership.d.ts +72 -0
  233. package/dist/core/executionOwnership.js +82 -0
  234. package/dist/core/executionOwnership.js.map +1 -0
  235. package/dist/core/executionPreparation.d.ts +362 -0
  236. package/dist/core/executionPreparation.js +93 -0
  237. package/dist/core/executionPreparation.js.map +1 -0
  238. package/dist/core/executionReadback.d.ts +15 -0
  239. package/dist/core/executionReadback.js +21 -0
  240. package/dist/core/executionReadback.js.map +1 -0
  241. package/dist/core/executor.d.ts +46 -0
  242. package/dist/core/executor.js +616 -0
  243. package/dist/core/executor.js.map +1 -0
  244. package/dist/core/frozenBundle.d.ts +314 -0
  245. package/dist/core/frozenBundle.js +24 -0
  246. package/dist/core/frozenBundle.js.map +1 -0
  247. package/dist/core/fsDurability.d.ts +2 -0
  248. package/dist/core/fsDurability.js +12 -0
  249. package/dist/core/fsDurability.js.map +1 -0
  250. package/dist/core/generators.d.ts +4 -0
  251. package/dist/core/generators.js +71 -0
  252. package/dist/core/generators.js.map +1 -0
  253. package/dist/core/gitSnapshot.d.ts +63 -0
  254. package/dist/core/gitSnapshot.js +55 -0
  255. package/dist/core/gitSnapshot.js.map +1 -0
  256. package/dist/core/gitSources.d.ts +29 -0
  257. package/dist/core/gitSources.js +97 -0
  258. package/dist/core/gitSources.js.map +1 -0
  259. package/dist/core/ledger.d.ts +38 -0
  260. package/dist/core/ledger.js +169 -0
  261. package/dist/core/ledger.js.map +1 -0
  262. package/dist/core/ledgerInspection.d.ts +18 -0
  263. package/dist/core/ledgerInspection.js +66 -0
  264. package/dist/core/ledgerInspection.js.map +1 -0
  265. package/dist/core/ledgerRecords.d.ts +23 -0
  266. package/dist/core/ledgerRecords.js +29 -0
  267. package/dist/core/ledgerRecords.js.map +1 -0
  268. package/dist/core/localActivationState.d.ts +260 -0
  269. package/dist/core/localActivationState.js +49 -0
  270. package/dist/core/localActivationState.js.map +1 -0
  271. package/dist/core/localPromotionState.d.ts +387 -0
  272. package/dist/core/localPromotionState.js +22 -0
  273. package/dist/core/localPromotionState.js.map +1 -0
  274. package/dist/core/localQualificationResults.d.ts +39 -0
  275. package/dist/core/localQualificationResults.js +160 -0
  276. package/dist/core/localQualificationResults.js.map +1 -0
  277. package/dist/core/localReviewStore.d.ts +28 -0
  278. package/dist/core/localReviewStore.js +167 -0
  279. package/dist/core/localReviewStore.js.map +1 -0
  280. package/dist/core/localScenarioActivation.d.ts +6 -0
  281. package/dist/core/localScenarioActivation.js +70 -0
  282. package/dist/core/localScenarioActivation.js.map +1 -0
  283. package/dist/core/localScenarioOwner.d.ts +20 -0
  284. package/dist/core/localScenarioOwner.js +2 -0
  285. package/dist/core/localScenarioOwner.js.map +1 -0
  286. package/dist/core/localScenarioPromotion.d.ts +9 -0
  287. package/dist/core/localScenarioPromotion.js +49 -0
  288. package/dist/core/localScenarioPromotion.js.map +1 -0
  289. package/dist/core/localScenarioState.d.ts +2297 -0
  290. package/dist/core/localScenarioState.js +117 -0
  291. package/dist/core/localScenarioState.js.map +1 -0
  292. package/dist/core/localScenarioStore.d.ts +838 -0
  293. package/dist/core/localScenarioStore.js +218 -0
  294. package/dist/core/localScenarioStore.js.map +1 -0
  295. package/dist/core/localScenarioStructure.d.ts +4 -0
  296. package/dist/core/localScenarioStructure.js +52 -0
  297. package/dist/core/localScenarioStructure.js.map +1 -0
  298. package/dist/core/localStructureState.d.ts +2 -0
  299. package/dist/core/localStructureState.js +22 -0
  300. package/dist/core/localStructureState.js.map +1 -0
  301. package/dist/core/lookup.d.ts +662 -0
  302. package/dist/core/lookup.js +55 -0
  303. package/dist/core/lookup.js.map +1 -0
  304. package/dist/core/ownership.d.ts +3 -0
  305. package/dist/core/ownership.js +24 -0
  306. package/dist/core/ownership.js.map +1 -0
  307. package/dist/core/planInspection.d.ts +108 -0
  308. package/dist/core/planInspection.js +44 -0
  309. package/dist/core/planInspection.js.map +1 -0
  310. package/dist/core/planner.d.ts +14 -0
  311. package/dist/core/planner.js +261 -0
  312. package/dist/core/planner.js.map +1 -0
  313. package/dist/core/qualification.d.ts +26 -0
  314. package/dist/core/qualification.js +58 -0
  315. package/dist/core/qualification.js.map +1 -0
  316. package/dist/core/qualificationBundle.d.ts +6 -0
  317. package/dist/core/qualificationBundle.js +51 -0
  318. package/dist/core/qualificationBundle.js.map +1 -0
  319. package/dist/core/qualificationExecution.d.ts +879 -0
  320. package/dist/core/qualificationExecution.js +54 -0
  321. package/dist/core/qualificationExecution.js.map +1 -0
  322. package/dist/core/recoveryStatus.d.ts +6 -0
  323. package/dist/core/recoveryStatus.js +123 -0
  324. package/dist/core/recoveryStatus.js.map +1 -0
  325. package/dist/core/reducer.d.ts +56 -0
  326. package/dist/core/reducer.js +355 -0
  327. package/dist/core/reducer.js.map +1 -0
  328. package/dist/core/replayAssessment.d.ts +15 -0
  329. package/dist/core/replayAssessment.js +78 -0
  330. package/dist/core/replayAssessment.js.map +1 -0
  331. package/dist/core/replayEvidence.d.ts +7 -0
  332. package/dist/core/replayEvidence.js +58 -0
  333. package/dist/core/replayEvidence.js.map +1 -0
  334. package/dist/core/repositorySelectionEvidence.d.ts +3 -0
  335. package/dist/core/repositorySelectionEvidence.js +58 -0
  336. package/dist/core/repositorySelectionEvidence.js.map +1 -0
  337. package/dist/core/rerun.d.ts +3 -0
  338. package/dist/core/rerun.js +24 -0
  339. package/dist/core/rerun.js.map +1 -0
  340. package/dist/core/resultSink.d.ts +52 -0
  341. package/dist/core/resultSink.js +120 -0
  342. package/dist/core/resultSink.js.map +1 -0
  343. package/dist/core/review.d.ts +22 -0
  344. package/dist/core/review.js +65 -0
  345. package/dist/core/review.js.map +1 -0
  346. package/dist/core/runnerCapabilities.d.ts +22 -0
  347. package/dist/core/runnerCapabilities.js +44 -0
  348. package/dist/core/runnerCapabilities.js.map +1 -0
  349. package/dist/core/scenario.d.ts +32 -0
  350. package/dist/core/scenario.js +119 -0
  351. package/dist/core/scenario.js.map +1 -0
  352. package/dist/core/scenarioActivation.d.ts +16 -0
  353. package/dist/core/scenarioActivation.js +47 -0
  354. package/dist/core/scenarioActivation.js.map +1 -0
  355. package/dist/core/scenarioStructure.d.ts +400 -0
  356. package/dist/core/scenarioStructure.js +72 -0
  357. package/dist/core/scenarioStructure.js.map +1 -0
  358. package/dist/core/snapshotEvidence.d.ts +3 -0
  359. package/dist/core/snapshotEvidence.js +37 -0
  360. package/dist/core/snapshotEvidence.js.map +1 -0
  361. package/dist/core/snapshotRepository.d.ts +48 -0
  362. package/dist/core/snapshotRepository.js +47 -0
  363. package/dist/core/snapshotRepository.js.map +1 -0
  364. package/dist/core/source-analysis.d.ts +18 -0
  365. package/dist/core/source-analysis.js +99 -0
  366. package/dist/core/source-analysis.js.map +1 -0
  367. package/dist/core/source-citation.d.ts +53 -0
  368. package/dist/core/source-citation.js +59 -0
  369. package/dist/core/source-citation.js.map +1 -0
  370. package/dist/core/sourcePromotion.d.ts +929 -0
  371. package/dist/core/sourcePromotion.js +92 -0
  372. package/dist/core/sourcePromotion.js.map +1 -0
  373. package/dist/core/sourceReviewEvidence.d.ts +271 -0
  374. package/dist/core/sourceReviewEvidence.js +24 -0
  375. package/dist/core/sourceReviewEvidence.js.map +1 -0
  376. package/dist/core/targetObservation.d.ts +3 -0
  377. package/dist/core/targetObservation.js +26 -0
  378. package/dist/core/targetObservation.js.map +1 -0
  379. package/dist/hosts/launchTemplates.d.ts +2 -0
  380. package/dist/hosts/launchTemplates.js +5 -0
  381. package/dist/hosts/launchTemplates.js.map +1 -0
  382. package/dist/hosts/local.d.ts +17 -0
  383. package/dist/hosts/local.js +311 -0
  384. package/dist/hosts/local.js.map +1 -0
  385. package/dist/hosts/localSupervisor.d.ts +1 -0
  386. package/dist/hosts/localSupervisor.js +115 -0
  387. package/dist/hosts/localSupervisor.js.map +1 -0
  388. package/dist/hosts/mock.d.ts +4 -0
  389. package/dist/hosts/mock.js +82 -0
  390. package/dist/hosts/mock.js.map +1 -0
  391. package/dist/hosts/pinnedArguments.d.ts +3 -0
  392. package/dist/hosts/pinnedArguments.js +39 -0
  393. package/dist/hosts/pinnedArguments.js.map +1 -0
  394. package/dist/hosts/runtime.d.ts +5 -0
  395. package/dist/hosts/runtime.js +60 -0
  396. package/dist/hosts/runtime.js.map +1 -0
  397. package/dist/hosts/sourceIdentity.d.ts +54 -0
  398. package/dist/hosts/sourceIdentity.js +27 -0
  399. package/dist/hosts/sourceIdentity.js.map +1 -0
  400. package/dist/hosts/types.d.ts +39 -0
  401. package/dist/hosts/types.js +2 -0
  402. package/dist/hosts/types.js.map +1 -0
  403. package/dist/index.d.ts +56 -0
  404. package/dist/index.js +52 -0
  405. package/dist/index.js.map +1 -0
  406. package/dist/integrations/awr/attachment.d.ts +34 -0
  407. package/dist/integrations/awr/attachment.js +120 -0
  408. package/dist/integrations/awr/attachment.js.map +1 -0
  409. package/dist/integrations/awr/attachmentContracts.d.ts +273 -0
  410. package/dist/integrations/awr/attachmentContracts.js +39 -0
  411. package/dist/integrations/awr/attachmentContracts.js.map +1 -0
  412. package/dist/integrations/awr/attachmentHttp.d.ts +9 -0
  413. package/dist/integrations/awr/attachmentHttp.js +19 -0
  414. package/dist/integrations/awr/attachmentHttp.js.map +1 -0
  415. package/dist/integrations/awr/cli.d.ts +7 -0
  416. package/dist/integrations/awr/cli.js +43 -0
  417. package/dist/integrations/awr/cli.js.map +1 -0
  418. package/dist/integrations/awr/contracts.d.ts +54 -0
  419. package/dist/integrations/awr/contracts.js +33 -0
  420. package/dist/integrations/awr/contracts.js.map +1 -0
  421. package/dist/integrations/awr/http.d.ts +8 -0
  422. package/dist/integrations/awr/http.js +23 -0
  423. package/dist/integrations/awr/http.js.map +1 -0
  424. package/dist/integrations/awr/index.d.ts +7 -0
  425. package/dist/integrations/awr/index.js +8 -0
  426. package/dist/integrations/awr/index.js.map +1 -0
  427. package/dist/integrations/awr/jsonHttp.d.ts +15 -0
  428. package/dist/integrations/awr/jsonHttp.js +69 -0
  429. package/dist/integrations/awr/jsonHttp.js.map +1 -0
  430. package/dist/integrations/awr/outbox.d.ts +28 -0
  431. package/dist/integrations/awr/outbox.js +88 -0
  432. package/dist/integrations/awr/outbox.js.map +1 -0
  433. package/dist/integrations/awr/projection.d.ts +4 -0
  434. package/dist/integrations/awr/projection.js +54 -0
  435. package/dist/integrations/awr/projection.js.map +1 -0
  436. package/dist/protocol/canonical.d.ts +41 -0
  437. package/dist/protocol/canonical.js +114 -0
  438. package/dist/protocol/canonical.js.map +1 -0
  439. package/dist/protocol/index.d.ts +9620 -0
  440. package/dist/protocol/index.js +185 -0
  441. package/dist/protocol/index.js.map +1 -0
  442. package/dist/protocol/primitives.d.ts +63 -0
  443. package/dist/protocol/primitives.js +46 -0
  444. package/dist/protocol/primitives.js.map +1 -0
  445. package/dist/protocol/schemas/browser.d.ts +153 -0
  446. package/dist/protocol/schemas/browser.js +29 -0
  447. package/dist/protocol/schemas/browser.js.map +1 -0
  448. package/dist/protocol/schemas/capability.d.ts +2126 -0
  449. package/dist/protocol/schemas/capability.js +165 -0
  450. package/dist/protocol/schemas/capability.js.map +1 -0
  451. package/dist/protocol/schemas/capabilityLifecycle.d.ts +509 -0
  452. package/dist/protocol/schemas/capabilityLifecycle.js +47 -0
  453. package/dist/protocol/schemas/capabilityLifecycle.js.map +1 -0
  454. package/dist/protocol/schemas/cleanup.d.ts +109 -0
  455. package/dist/protocol/schemas/cleanup.js +59 -0
  456. package/dist/protocol/schemas/cleanup.js.map +1 -0
  457. package/dist/protocol/schemas/cli.d.ts +121 -0
  458. package/dist/protocol/schemas/cli.js +24 -0
  459. package/dist/protocol/schemas/cli.js.map +1 -0
  460. package/dist/protocol/schemas/config.d.ts +59 -0
  461. package/dist/protocol/schemas/config.js +32 -0
  462. package/dist/protocol/schemas/config.js.map +1 -0
  463. package/dist/protocol/schemas/corpus.d.ts +36 -0
  464. package/dist/protocol/schemas/corpus.js +10 -0
  465. package/dist/protocol/schemas/corpus.js.map +1 -0
  466. package/dist/protocol/schemas/definitions.d.ts +3409 -0
  467. package/dist/protocol/schemas/definitions.js +431 -0
  468. package/dist/protocol/schemas/definitions.js.map +1 -0
  469. package/dist/protocol/schemas/evidenceProjection.d.ts +146 -0
  470. package/dist/protocol/schemas/evidenceProjection.js +18 -0
  471. package/dist/protocol/schemas/evidenceProjection.js.map +1 -0
  472. package/dist/protocol/schemas/execution.d.ts +3179 -0
  473. package/dist/protocol/schemas/execution.js +500 -0
  474. package/dist/protocol/schemas/execution.js.map +1 -0
  475. package/dist/protocol/schemas/gitSources.d.ts +330 -0
  476. package/dist/protocol/schemas/gitSources.js +32 -0
  477. package/dist/protocol/schemas/gitSources.js.map +1 -0
  478. package/dist/protocol/schemas/mcp.d.ts +24 -0
  479. package/dist/protocol/schemas/mcp.js +16 -0
  480. package/dist/protocol/schemas/mcp.js.map +1 -0
  481. package/dist/protocol/schemas/nativeJob.d.ts +106 -0
  482. package/dist/protocol/schemas/nativeJob.js +16 -0
  483. package/dist/protocol/schemas/nativeJob.js.map +1 -0
  484. package/dist/protocol/schemas/portableEnvironment.d.ts +1256 -0
  485. package/dist/protocol/schemas/portableEnvironment.js +108 -0
  486. package/dist/protocol/schemas/portableEnvironment.js.map +1 -0
  487. package/dist/protocol/schemas/promotion.d.ts +132 -0
  488. package/dist/protocol/schemas/promotion.js +9 -0
  489. package/dist/protocol/schemas/promotion.js.map +1 -0
  490. package/dist/protocol/schemas/protocol.d.ts +146 -0
  491. package/dist/protocol/schemas/protocol.js +25 -0
  492. package/dist/protocol/schemas/protocol.js.map +1 -0
  493. package/dist/protocol/schemas/recoveryStatus.d.ts +88 -0
  494. package/dist/protocol/schemas/recoveryStatus.js +20 -0
  495. package/dist/protocol/schemas/recoveryStatus.js.map +1 -0
  496. package/dist/protocol/schemas/resultSink.d.ts +80 -0
  497. package/dist/protocol/schemas/resultSink.js +14 -0
  498. package/dist/protocol/schemas/resultSink.js.map +1 -0
  499. package/dist/protocol/schemas/review.d.ts +248 -0
  500. package/dist/protocol/schemas/review.js +45 -0
  501. package/dist/protocol/schemas/review.js.map +1 -0
  502. package/dist/protocol/schemas/scenario.d.ts +810 -0
  503. package/dist/protocol/schemas/scenario.js +53 -0
  504. package/dist/protocol/schemas/scenario.js.map +1 -0
  505. package/dist/protocol/schemas/source.d.ts +300 -0
  506. package/dist/protocol/schemas/source.js +25 -0
  507. package/dist/protocol/schemas/source.js.map +1 -0
  508. package/dist/source/git.d.ts +36 -0
  509. package/dist/source/git.js +159 -0
  510. package/dist/source/git.js.map +1 -0
  511. package/dist/source/gitObjectProof.d.ts +12 -0
  512. package/dist/source/gitObjectProof.js +115 -0
  513. package/dist/source/gitObjectProof.js.map +1 -0
  514. package/dist/source/snapshotPaths.d.ts +2 -0
  515. package/dist/source/snapshotPaths.js +24 -0
  516. package/dist/source/snapshotPaths.js.map +1 -0
  517. package/dist/source/snapshotTree.d.ts +15 -0
  518. package/dist/source/snapshotTree.js +79 -0
  519. package/dist/source/snapshotTree.js.map +1 -0
  520. package/docs/architecture.md +126 -0
  521. package/docs/awr-delivery.md +102 -0
  522. package/docs/browser-driver.md +148 -0
  523. package/docs/cleanup-followups.md +74 -0
  524. package/docs/developer-ux.md +315 -0
  525. package/docs/examples/portable-environments/alongside_runner.json +199 -0
  526. package/docs/examples/portable-environments/external_staging.json +183 -0
  527. package/docs/git-object-proof.md +100 -0
  528. package/docs/git-source-resolution.md +133 -0
  529. package/docs/images/ui-run.png +0 -0
  530. package/docs/local-execution-recovery.md +55 -0
  531. package/docs/local-review-store.md +13 -0
  532. package/docs/local-scenario-store.md +91 -0
  533. package/docs/mcp-driver.md +87 -0
  534. package/docs/native-jobs.md +96 -0
  535. package/docs/portable-environments.md +155 -0
  536. package/docs/qualification-registration.md +58 -0
  537. package/docs/qualification-results.md +59 -0
  538. package/docs/replay-assessment.md +17 -0
  539. package/docs/result-sink.md +87 -0
  540. package/docs/scenario-activation.md +54 -0
  541. package/docs/scenario-structure.md +58 -0
  542. package/docs/source-promotion.md +104 -0
  543. package/docs/source-review.md +21 -0
  544. package/docs/verified-bundles.md +175 -0
  545. package/docs/work-report-attachment.md +127 -0
  546. package/package.json +45 -4
  547. package/samples/django-notes/manage.py +8 -0
  548. package/samples/django-notes/notes/__init__.py +0 -0
  549. package/samples/django-notes/notes/auth.py +14 -0
  550. package/samples/django-notes/notes/migrations/0001_initial.py +19 -0
  551. package/samples/django-notes/notes/migrations/__init__.py +0 -0
  552. package/samples/django-notes/notes/models.py +13 -0
  553. package/samples/django-notes/notes/views.py +33 -0
  554. package/samples/django-notes/notesite/__init__.py +0 -0
  555. package/samples/django-notes/notesite/settings.py +17 -0
  556. package/samples/django-notes/notesite/urls.py +9 -0
  557. package/samples/django-notes/requirements.txt +1 -0
  558. package/samples/django-notes/tracegrove/notes/crud.flow.yaml +27 -0
  559. package/samples/django-notes/tracegrove.config.yaml +7 -0
  560. package/samples/fastapi-notes/app/__init__.py +0 -0
  561. package/samples/fastapi-notes/app/main.py +69 -0
  562. package/samples/fastapi-notes/requirements.txt +2 -0
  563. package/samples/fastapi-notes/tracegrove/notes/crud.flow.yaml +27 -0
  564. package/samples/fastapi-notes/tracegrove.config.yaml +8 -0
  565. package/samples/notes-api/app/app.mjs +67 -0
  566. package/samples/notes-api/app/http.mjs +16 -0
  567. package/samples/notes-api/tracegrove/fixtures/existing-note.fixture.yaml +12 -0
  568. package/samples/notes-api/tracegrove/notes/create-read-delete.flow.yaml +35 -0
  569. package/samples/notes-api/tracegrove/notes/list.flow.yaml +25 -0
  570. package/samples/notes-api/tracegrove.config.yaml +15 -0
  571. package/samples/notes-api/verification/actions/notes.registry.yaml +6 -0
  572. package/samples/notes-api/verification/auth/host-issued-owner.yaml +6 -0
  573. package/samples/notes-api/verification/cases/notes.contract.yaml +51 -0
  574. package/samples/notes-api/verification/cases/notes.create.yaml +123 -0
  575. package/samples/notes-api/verification/cases/notes.suite.yaml +5 -0
  576. package/samples/notes-api/verification/components/notes-api-stub.profile.yaml +8 -0
  577. package/samples/notes-api/verification/components/notes-api.profile.yaml +15 -0
  578. package/samples/notes-api/verification/environments/local-notes.yaml +11 -0
  579. package/samples/notes-api/verification/environments/mock-notes.yaml +11 -0
  580. package/samples/notes-api/verification/fidelity/full-live-sandbox.yaml +7 -0
  581. package/samples/notes-api/verification/fidelity/mock-contract.yaml +6 -0
  582. package/samples/notes-api/verification/fixtures/existing-note.payload.yaml +15 -0
  583. package/samples/notes-api/verification/fixtures/existing-note.plan.yaml +9 -0
  584. package/samples/notes-api/verification/fixtures/existing-note.recipe.yaml +29 -0
  585. package/samples/notes-api/verification/hosts/local-process.yaml +27 -0
  586. package/samples/notes-api/verification/hosts/mock-loopback.yaml +14 -0
  587. package/samples/notes-api/verification/mocks/notes.responses.yaml +5 -0
  588. package/samples/notes-api/verification/personas/owner.yaml +16 -0
  589. package/samples/notes-api/verification/policies/no-authoring-inference.yaml +10 -0
  590. package/samples/notes-api/verification/runners/http.yaml +5 -0
  591. package/samples/notes-api/verification/surfaces/http-api.binding.yaml +11 -0
  592. package/samples/notes-api/verification/surfaces/http-api.pack.yaml +7 -0
  593. package/samples/notes-api/verification/workflow.yaml +27 -0
  594. package/samples/notes-browser/tracegrove/notes/browser.flow.yaml +19 -0
  595. package/samples/notes-browser/verification/cases/notes.browser.yaml +63 -0
  596. package/samples/notes-browser/verification/cases/notes.suite.yaml +4 -0
  597. package/samples/notes-browser/verification/runners/http.yaml +5 -0
  598. package/samples/notes-browser/verification/surfaces/http-api.binding.yaml +11 -0
  599. package/samples/notes-browser/verification/surfaces/http-api.pack.yaml +7 -0
  600. package/samples/notes-django/README.md +21 -0
  601. package/samples/notes-django/app/django_app.py +119 -0
  602. package/samples/notes-django/app/requirements.lock +4 -0
  603. package/samples/notes-mcp/app/mcp.mjs +47 -0
  604. package/samples/notes-mcp/tracegrove/notes.flow.yaml +20 -0
  605. package/samples/notes-mcp/tracegrove.config.yaml +13 -0
  606. package/samples/report-jobs/README.md +30 -0
  607. package/samples/report-jobs/app/jobs-api.mjs +65 -0
  608. package/samples/report-jobs/app/native-bridge.mjs +30 -0
  609. package/samples/report-jobs/app/store.mjs +74 -0
  610. package/samples/report-jobs/app/worker.mjs +22 -0
  611. package/samples/report-jobs/tracegrove/fixtures/failed-job.fixture.yaml +12 -0
  612. package/samples/report-jobs/tracegrove/fixtures/held-job.fixture.yaml +12 -0
  613. package/samples/report-jobs/tracegrove/fixtures/success-job.fixture.yaml +12 -0
  614. package/samples/report-jobs/tracegrove/reports/cancellation.flow.yaml +15 -0
  615. package/samples/report-jobs/tracegrove/reports/completion.flow.yaml +31 -0
  616. package/samples/report-jobs/tracegrove/reports/failure.flow.yaml +12 -0
  617. package/samples/report-jobs/tracegrove.config.yaml +10 -0
  618. package/samples/report-native/README.md +11 -0
  619. package/samples/report-native/tracegrove/cancellation.flow.yaml +11 -0
  620. package/samples/report-native/tracegrove/completion.flow.yaml +22 -0
  621. package/samples/report-native/tracegrove/failure.flow.yaml +7 -0
  622. package/samples/report-native/tracegrove.config.yaml +11 -0
  623. package/schema/tracegrove_cli-error_v1.json +156 -0
  624. package/schema/tracegrove_config_v1.json +233 -0
  625. package/schema/tracegrove_fixture_v1.json +297 -0
  626. package/schema/tracegrove_flow_v1.json +960 -0
  627. package/schema/tracegrove_recovery-status_v1.json +234 -0
  628. package/schema/tracegrove_run-video_v1.json +25 -0
  629. package/schema/workflow_action-registry_v1.json +303 -0
  630. package/schema/workflow_auth-recipe_v1.json +146 -0
  631. package/schema/workflow_boundary-observation_v1.json +515 -0
  632. package/schema/workflow_browser-command_v1.json +292 -0
  633. package/schema/workflow_browser-locator_v1.json +74 -0
  634. package/schema/workflow_browser-network-observation_v1.json +48 -0
  635. package/schema/workflow_browser-observation_v1.json +53 -0
  636. package/schema/workflow_budget-reservation_v1.json +150 -0
  637. package/schema/workflow_campaign-result_v1.json +382 -0
  638. package/schema/workflow_capability-artifact-manifest_v1.json +529 -0
  639. package/schema/workflow_capability-descriptor_v1.json +351 -0
  640. package/schema/workflow_capability-lifecycle-checkpoint_v1.json +510 -0
  641. package/schema/workflow_capability-observation_v1.json +1707 -0
  642. package/schema/workflow_capability-operation_v1.json +3212 -0
  643. package/schema/workflow_capability-replay-plan_v1.json +1247 -0
  644. package/schema/workflow_capability-retry-policy_v1.json +39 -0
  645. package/schema/workflow_capability-retry-state_v1.json +242 -0
  646. package/schema/workflow_case_v1.json +4222 -0
  647. package/schema/workflow_change-model_v1.json +614 -0
  648. package/schema/workflow_cleanup-expectation_v1.json +108 -0
  649. package/schema/workflow_cleanup-followup_v1.json +145 -0
  650. package/schema/workflow_component-profile_v1.json +219 -0
  651. package/schema/workflow_config_v1.json +180 -0
  652. package/schema/workflow_corpus_v1.json +172 -0
  653. package/schema/workflow_cost-observation_v1.json +366 -0
  654. package/schema/workflow_credential-lease_v1.json +222 -0
  655. package/schema/workflow_effective-config_v1.json +214 -0
  656. package/schema/workflow_environment-plan_v1.json +445 -0
  657. package/schema/workflow_environment_v1.json +1827 -0
  658. package/schema/workflow_evidence-projection_v1.json +636 -0
  659. package/schema/workflow_execution_v1.json +4086 -0
  660. package/schema/workflow_fidelity-plan_v1.json +512 -0
  661. package/schema/workflow_fidelity-profile_v1.json +396 -0
  662. package/schema/workflow_fixture-manifest_v1.json +918 -0
  663. package/schema/workflow_fixture-plan_v1.json +594 -0
  664. package/schema/workflow_git-source-request_v1.json +124 -0
  665. package/schema/workflow_git-source-resolution_v1.json +660 -0
  666. package/schema/workflow_git-source-snapshot_v1.json +287 -0
  667. package/schema/workflow_host-lease_v1.json +321 -0
  668. package/schema/workflow_host-observation_v1.json +282 -0
  669. package/schema/workflow_host-plan_v1.json +719 -0
  670. package/schema/workflow_identity-attestation_v1.json +412 -0
  671. package/schema/workflow_intelligence-policy_v1.json +153 -0
  672. package/schema/workflow_logical-payload_v1.json +206 -0
  673. package/schema/workflow_mcp-tool-call_v1.json +70 -0
  674. package/schema/workflow_mcp-tool-observation_v1.json +125 -0
  675. package/schema/workflow_mock-responses_v1.json +185 -0
  676. package/schema/workflow_native-job-action_v1.json +123 -0
  677. package/schema/workflow_native-job-observation_v1.json +138 -0
  678. package/schema/workflow_native-job-ready_v1.json +31 -0
  679. package/schema/workflow_native-job-request_v1.json +155 -0
  680. package/schema/workflow_native-job-response_v1.json +125 -0
  681. package/schema/workflow_ownership_v1.json +116 -0
  682. package/schema/workflow_persona_v1.json +499 -0
  683. package/schema/workflow_plan-edit-projection_v1.json +152 -0
  684. package/schema/workflow_plan-review_v1.json +246 -0
  685. package/schema/workflow_portable-environment-intent_v1.json +499 -0
  686. package/schema/workflow_portable-environment-profile_v1.json +1429 -0
  687. package/schema/workflow_portable-preflight_v1.json +2281 -0
  688. package/schema/workflow_qualification-admission_v1.json +467 -0
  689. package/schema/workflow_qualification-intent_v1.json +98 -0
  690. package/schema/workflow_qualification-policy_v1.json +109 -0
  691. package/schema/workflow_qualification-round_v1.json +226 -0
  692. package/schema/workflow_replay-assessment_v1.json +197 -0
  693. package/schema/workflow_replay-finding_v1.json +147 -0
  694. package/schema/workflow_request_v1.json +1567 -0
  695. package/schema/workflow_result-ingest_v1.json +343 -0
  696. package/schema/workflow_revisions_v1.json +334 -0
  697. package/schema/workflow_routing-decision_v1.json +482 -0
  698. package/schema/workflow_runner-capabilities_v1.json +316 -0
  699. package/schema/workflow_runner-profile_v1.json +119 -0
  700. package/schema/workflow_runner-protocol_v1_host.json +382 -0
  701. package/schema/workflow_runner-protocol_v1_plugin.json +491 -0
  702. package/schema/workflow_scenario-activation-intent_v1.json +346 -0
  703. package/schema/workflow_scenario-activation_v1.json +562 -0
  704. package/schema/workflow_scenario-projection_v1.json +221 -0
  705. package/schema/workflow_scenario-promotion_v1.json +455 -0
  706. package/schema/workflow_scenario-replay-assessment_v1.json +696 -0
  707. package/schema/workflow_scenario-revision-token_v1.json +115 -0
  708. package/schema/workflow_scenario-structure_v1.json +368 -0
  709. package/schema/workflow_scenario_v1.json +401 -0
  710. package/schema/workflow_scoped-resource_v1.json +550 -0
  711. package/schema/workflow_seed-recipe_v1.json +724 -0
  712. package/schema/workflow_selection_v1.json +1108 -0
  713. package/schema/workflow_signed-cleanup-followup_v1.json +175 -0
  714. package/schema/workflow_source-plan_v1.json +756 -0
  715. package/schema/workflow_source-selection_v1.json +456 -0
  716. package/schema/workflow_source-validation_v1.json +366 -0
  717. package/schema/workflow_step-event_v1.json +228 -0
  718. package/schema/workflow_stream-transcript_v1.json +1030 -0
  719. package/schema/workflow_suite_v1.json +64 -0
  720. package/schema/workflow_surface-binding_v1.json +411 -0
  721. package/schema/workflow_surface-pack_v1.json +159 -0
@@ -0,0 +1,17 @@
1
+ # Replay assessment
2
+
3
+ `assessScenarioReplay(ports, token)` derives read-only readiness from the complete registered scenario history and authenticated raw bundle snapshots. It never accepts caller-provided passing assessments and never activates coverage. A host must still perform explicit authenticated activation with an atomic comparison against the returned scenario revision token, chosen rounds and exact definition bindings.
4
+
5
+ The immutable, scoped `workflow.qualification-policy/v1` selects environment or revision proof and requires between two and twenty independent rounds. Two is the minimum; there is no mock-only or single-run activation policy. Source-derived scenarios additionally require revision proof even when the policy requests environment proof.
6
+
7
+ Every current-epoch round retains its exact scenario/replay/policy/matrix/target-profile/strata bindings. Registration history is complete, monotonic and checked before any results are filtered. Reused campaign, execution, attempt or leased-state identities are refused. An incomplete history or unknown issuer is an error, never an empty passing report. Old epochs remain in the host's history but cannot count toward current qualification.
8
+
9
+ Each terminal round is re-derived through the same authenticated snapshot reader used by `reduceQualificationRound`; the trusted result index must match that derived round reference. Required cell coverage, assertions, capture, observed identity and cleanup guards therefore run again. Mock, replayed, intercepted, fault-injected or stubbed claimed boundaries cannot count as live proof. Required target identities must be nonempty and observed; the full observed tuple must match the expected tuple. A failed, cancelled, blocked or inconclusive campaign cannot qualify even when some cells passed.
10
+
11
+ Revision proof additionally binds every resolved repository role, URL, commit, origin, object reference and lockfile digest to the observed target and requires a registered resolver reference. Generic environment proof cannot satisfy a revision-specific policy or waive missing/mismatched source identity when source bindings or expected repository identities exist. Source-bound requests must retain the scenario's reviewed source plan. These comparisons do not authenticate observations by themselves: `authenticateEvidence` must establish issuer authority, real state leases, the reviewed source/replay/policy/matrix/target closure, required capture and independently observed target fields against the captured manifest digest. Copying requested identities into an observation is insufficient. The prototype does not install that host adapter or a source resolver.
12
+
13
+ The latest admitted current-epoch round must be terminal and qualify. Two older passes do not hide a newer pending or nonqualifying campaign. All current-epoch rounds, including nonqualifying ones, appear in the report. Version, definition, epoch and latest sequence are rechecked after reading evidence; a concurrent registration or semantic edit makes the report stale. A subsequent activation must repeat its atomic comparison because an edit can still arrive after this read-only report returns.
14
+
15
+ Reports contain sealed `workflow.replay-assessment/v1` documents and their resolvable `workflow.replay-finding/v1` reason documents. Proof levels are structural, mock, environment or revision. These are observations, not permissions. The report contains its exact revision token and qualifying round refs for a future activation owner; the schema's `qualifies` boolean alone grants no authority.
16
+
17
+ Tests run real local native application observations and genuine mock observations with explicitly simulated catalog registration and issuer ports. They prove consumer reduction and race handling. Synthetic resolved-source fixtures exercise classifier guards only. The [local result index](qualification-results.md#durable-local-terminal-results) supplies retained terminal evidence, and [explicit activation](scenario-activation.md#local-atomic-storage) has a durable journal adapter. [Structural validation](scenario-structure.md) shares the executor preflight and supports proposed/degraded transitions. [Source-plan promotion](source-promotion.md) binds current approved storage to proposed scenarios. Additional integration tests use actual registration and native execution with simulated external authority. Hosted registration/issuer authority, live staging qualification and activated regression execution remain open.
@@ -0,0 +1,87 @@
1
+ # Independent local result retention
2
+
3
+ The result sink retains complete verified bundles independently of the producer's
4
+ run directory. It reuses the existing fenced `LocalLedger` for its index; there is
5
+ no second database, mutable status file, or hosted service in this implementation.
6
+
7
+ ```sh
8
+ tracegrove result-ingest --bundle ./run/bundle --sink ./retained-results --json
9
+ tracegrove results --sink ./retained-results --limit 20 --json
10
+ tracegrove results --sink ./retained-results --id <result-id> --json
11
+ ```
12
+
13
+ `result-ingest` captures a bounded verified snapshot, checks the selected consumer
14
+ scope, copies only sealed files, reads the completed archive back, and publishes
15
+ an immutable `workflow.result-ingest/v1` receipt. Manifest and payload bytes come
16
+ from the same snapshot that passed complete evidence reduction; the source is
17
+ not reopened during copy. Binary artifacts retain their exact bytes. Unsealed
18
+ files, including accidental scratch files, are not imported.
19
+
20
+ SDK consumers that authenticated an earlier snapshot can pass
21
+ `sink.ingest(bundleDir, { expectedManifestDigest })`. A mismatch is refused before
22
+ archiving or publishing a campaign receipt. This binds retention to the authenticated
23
+ bytes without treating the digest itself as issuer authentication.
24
+
25
+ The receipt records the actual retained outcome, exact campaign/request/selection
26
+ and fidelity-plan refs, planned fidelity lanes, manifest digest, receipt count,
27
+ and acceptance time. A failed, cancelled, blocked, or mocked result never becomes
28
+ a passing live result through storage. Every receipt explicitly says:
29
+
30
+ ```json
31
+ {"evidenceClass":"integrity_checked_local_bundle","issuerStatus":"unverified","qualificationStatus":"not_evaluated"}
32
+ ```
33
+
34
+ Exit 0 from ingestion means durable retention succeeded, including retention of
35
+ an honestly failed attempt. Check `receipt.retainedOutcome` for the result's
36
+ verdict. The ordinary CLI error convention remains stderr plus a nonzero exit;
37
+ invalid or inconsistent evidence is a conflict (exit 2).
38
+
39
+ ## Reading and replaying deliveries
40
+
41
+ Listing returns stored receipt metadata with `archiveStatus: not_checked`. It
42
+ does not renew an earlier integrity check. Inspecting a result by ID captures and
43
+ re-verifies the retained archive against its exact indexed manifest and refs.
44
+ Missing or corrupted archives fail rather than echoing the recorded verdict as a
45
+ fresh verification. Inspection keeps working when the original run is removed.
46
+
47
+ Delivering the identical campaign and manifest again returns the original receipt
48
+ with `replayed: true`; it does not append another result. Reusing that scoped
49
+ `campaignId` with different evidence is a conflict, including renaming its result
50
+ document reference. Even a differently serialized
51
+ manifest is different evidence. Preserve the original manifest bytes for retries.
52
+
53
+ List pages are bounded to 100 records. An opaque cursor binds the selected scope,
54
+ index version, and offset; later deliveries do not change that page sequence.
55
+ Cursors are pagination positions, not access grants. An exhausted 10,000-record
56
+ prototype index blocks new admissions until an authoritative archival index is
57
+ provided. Entries are never silently evicted.
58
+
59
+ ## Durability and scope
60
+
61
+ Archive files and directories are synced before their immutable content-addressed
62
+ directory is published. The archive namespace is synced before the ledger receipt
63
+ is appended and synced. A crash between those operations can leave an unindexed
64
+ complete object, but cannot publish an accepted receipt for an incomplete copy.
65
+ A retry verifies that object and syncs its namespace again before publishing one receipt. Partial
66
+ staging directories are not indexed; only a staging directory created by the
67
+ current operation is removed on an ordinary write failure. Existing content is
68
+ not replaced or silently repaired. The test suite includes an actual SIGKILL at
69
+ the archive/index boundary, reopen/retry, and injected sync failure.
70
+
71
+ The SDK exports `ResultSink`, `ResultSinkAuthority`, `LocalResultSink`, and
72
+ `VerifiedBundleSnapshot`. A host supplies consumer authorization; ingestion
73
+ rechecks it after capture and commits without an asynchronous gap. The CLI uses
74
+ the same local operator scope as ordinary runs, with no producer-supplied scope
75
+ override. The journal and objects are namespaced by that complete scope.
76
+
77
+ The operator must provide protected, quiescent source and storage directories
78
+ and authorize the source location before calling the SDK. The existing local
79
+ ledger supplies one writer and stale-process recovery; this is not distributed
80
+ fencing or a filesystem ACL against a hostile same-user process. Local owner
81
+ labels, including `WORKFLOW_VERIFY_OWNER`, do not authenticate a remote tenant.
82
+
83
+ This sink verifies integrity and record consistency. It does not authenticate an
84
+ issuer, approve a source plan, provision qualification leases, activate coverage,
85
+ or publish an OrgX AWR record. Hosted receiver authentication, tenant delivery,
86
+ and scoped OrgX projection require their own trusted adapters. A storage receipt
87
+ cannot stand in for those acceptance gates.
@@ -0,0 +1,54 @@
1
+ # Explicit scenario activation
2
+
3
+ `activateScenario(ports, intent)` consumes an exact scenario revision token, replay/policy/matrix/target references, an explicit selection of terminal round references and a scoped idempotency key. It returns a sealed `workflow.scenario-activation/v1` receipt. Actor identity and the authorization policy come from the authenticated host's `authorizeActivation(scope, intentDigest)`; callers cannot submit an actor, approval flag or readiness result.
4
+
5
+ The operation requires a validating scenario, checks all expected definition bindings and re-derives replay qualification from authenticated complete evidence. The selected set must satisfy the policy's independent-round minimum and include the latest admitted qualifying round. Duplicate or foreign rounds, mock-only proof, a newer pending round and stale scope/version/epoch are refused. Existing matrix, history, issuer and bundle guards are shared with replay assessment.
6
+
7
+ `compareAndSwapActivation` is an atomic authority boundary. In one transaction, the host must compare validating state, aggregate version, definition and replay/policy/matrix/target digests, epoch, latest admitted sequence, exact immutable selected result refs and current activation authorization. It must enforce the scoped idempotency key and publish the assessment/finding records, activation receipt and active projection together, or publish none. The selected-result check still matters when a result index changes without advancing the scenario version. A registered newer round or semantic invalidation must conflict with an older activation attempt. The local adapter below uses the existing journal; hosted transaction storage remains a separate host integration.
8
+
9
+ Repeated round order is normalized. An already committed identical intent returns its original receipt without another write, including after a lost commit acknowledgement or concurrent identical delivery. Reusing the key for a different intent conflicts. Authorization runs before historical receipt lookup too. Returning an earlier activation receipt does not assert that coverage remains active now: a later semantic invalidation or retirement remains in effect, and retries cannot resurrect it. Read the current projection to establish current state.
10
+
11
+ This API cannot activate proposed, degraded, active or retired projections through a fresh intent. Promotion and successful structural validation must first establish validating state through their own authority. Product regressions remain visible through qualification/release evidence; they do not implicitly call semantic invalidation or remove the detecting case.
12
+
13
+ ## Local atomic storage
14
+
15
+ `LocalScenarioStore.activationPorts(results, authority)` connects explicit activation
16
+ to the scenario registry and `LocalQualificationResults` on the same `LocalLedger`.
17
+ It reuses the public decision validator and independently rederives replay assessment
18
+ inside the commit boundary. Submitted readiness flags, actors, reports and projections
19
+ are compared with freshly derived values; they cannot grant authority.
20
+
21
+ ```ts
22
+ const ports = store.activationPorts(results, {
23
+ resolvePolicy,
24
+ authorizeActivation, // Current authenticated owner and policy for this exact intent digest.
25
+ });
26
+ const activation = await activateScenario(ports, intent);
27
+ ```
28
+
29
+ The adapter checks the scenario registry version, complete result-index version and
30
+ captured archive manifest digests after its final activation authorization await.
31
+ There is no await between those checks and the single synced append containing the
32
+ active projection, receipt and full assessment/finding records. An unrelated change
33
+ to the scope's registry or result index can conflict conservatively; retry from a
34
+ fresh snapshot. Revocation and physical/provider fencing outside this local writer
35
+ still require the host to synchronize its authority checks with its controller.
36
+
37
+ Idempotency keys are unique across scenarios in the scope. Reopen reads the complete
38
+ activation and projection from the same journal entry. A write failure publishes
39
+ neither; a committed entry with a lost acknowledgement returns its original receipt
40
+ on retry. Historical retrieval requires current activation authorization and never
41
+ reverses a later invalidation. Existing registration-only journals read with empty
42
+ activation history; an active projection without its persisted receipt is refused.
43
+ The scope permits 500 retained activations before explicit archival indexing is needed.
44
+
45
+ Tests use actual registered native/mock execution, the immutable result sink and
46
+ durable scenario journal, alongside the earlier in-memory consumer tests. They cover
47
+ concurrency, lost acknowledgement with reopen, pre-write failure, forged submissions,
48
+ registration/invalidation/revocation/archive/index races and corrupt persisted reports.
49
+ Host, reviewed-source, physical-lease and issuer authority are explicitly simulated.
50
+ These proofs do not establish hosted activation, deployed staging qualification or
51
+ live regression admission. [Structural transitions](scenario-structure.md) have a local
52
+ adapter. [Source-plan promotion](source-promotion.md) has a local approved-review bridge.
53
+ Hosted persistence and
54
+ activated regression execution remain open.
@@ -0,0 +1,58 @@
1
+ # Structural validation before qualification
2
+
3
+ `LocalScenarioStore.propose(definition, selections)` stores an authorized immutable
4
+ scenario in `proposed` state. Qualification registration refuses that state.
5
+ `validateScenarioStructure(ports, token, frozenPlan)` performs static checks and
6
+ records the transition to `validating`. It can also revalidate a `degraded` revision
7
+ after semantic invalidation. It does not run the candidate or claim functional PASS.
8
+
9
+ ```ts
10
+ await store.propose(definition, [qualificationMatrix, selectedRound]);
11
+ const validation = await validateScenarioStructure(
12
+ store.structuralPorts({ authorizeValidation }),
13
+ exactScenarioRevisionToken,
14
+ frozenTrialPlan,
15
+ );
16
+ ```
17
+
18
+ The plan must be a sealed trial/work-proof request without lifecycle refs or plan
19
+ blockers. Its cases, personas, target cells and exclusions must exactly match the
20
+ scenario matrix. The implementation shares the executor's actual document resolution,
21
+ capability reproduction, fixture/fidelity checks and case compiler. Missing fixture
22
+ plans, changed fidelity, unsupported capabilities and unresolved/modified documents
23
+ fail before a host, fixture operation or provider starts. Matrix policy is taken from
24
+ the scenario's reviewed definition; this operation cannot change that matrix.
25
+
26
+ The authenticated host supplies `authorizeValidation(scope, intentDigest)`, returning
27
+ the current actor and authorization policy for the exact token, frozen request and
28
+ executable-closure digest. Source/review/definition checking remains the store's
29
+ required `validateDefinition` responsibility. No permission or independent source
30
+ validation is inferred from a caller's success flag. Proposed storage is not itself
31
+ the source-plan promotion manifest; [source promotion](source-promotion.md) supplies
32
+ that separate approved-review operation.
33
+
34
+ The local adapter recompiles the supplied closure and rechecks definition and actor
35
+ authority before publishing the sealed `workflow.scenario-structure/v1` receipt and
36
+ validating projection in one synced registry entry. A competing edit, invalidation or
37
+ authorization change publishes no validation. The receipt records the exact scenario
38
+ token, request, qualification matrix, executable closure, actor, policy and timestamp.
39
+ It clears current qualification/activation refs without deleting historical evidence.
40
+
41
+ Repeated identical deliveries recover one receipt, including after lost acknowledgement
42
+ or journal reopen. Historical receipt retrieval requires current validation permission;
43
+ it does not reverse later invalidation or prove that coverage remains validating now.
44
+ Revalidation of a replacement definition uses a new token and preserves its advanced
45
+ invalidation epoch. Keep the original frozen plan alongside the receipt: the digest
46
+ binds that plan but does not make the receipt an executable bundle.
47
+
48
+ The index is bounded to 500 structural records per scope and refuses exhaustion rather
49
+ than dropping history. Existing journals read with empty structural history. The earlier
50
+ `initialize` API remains a trusted-host import of an already structurally validated
51
+ scenario; it does not produce this receipt and requires the host to establish both
52
+ promotion and validation authority before calling it.
53
+
54
+ This is protected local single-writer storage. It does not install hosted IAM, physical
55
+ state leases, hosted source promotion, CLI lifecycle commands, live qualification or
56
+ activation. Tests use real journal bytes and static compilation; one positive test then
57
+ executes two newly admitted native cells. Host/source/review/effect authority is explicitly
58
+ simulated, and structural success alone is never reported as application success.
@@ -0,0 +1,104 @@
1
+ # Promoting an approved source plan
2
+
3
+ `promoteScenario(ports, intent, definition, selections)` registers an approved source
4
+ scenario as `proposed`. It returns a sealed `workflow.scenario-promotion/v1` manifest.
5
+ It creates no plan approval, structural validation, runtime PASS or active coverage.
6
+
7
+ The intent names the scenario, immutable definition and selection refs, exact editable
8
+ plan revision token, and scoped idempotency key. The definition binds the source plan
9
+ and current review. Promotion requires the stored review to be approved for that exact
10
+ plan/edit revision and to retain its atomically stored source validation. Each promoted
11
+ case must belong to approved runnable candidates whose source elements were independently
12
+ validated. Blocked/excluded candidates and non-scenario plan dispositions cannot become
13
+ promoted cases. The matrix and every supplied selection retain the exact case/persona/
14
+ target strata and policy.
15
+
16
+ ```ts
17
+ const ports = scenarios.promotionPorts(reviews, { authorizePromotion });
18
+ const manifest = await promoteScenario(ports, {
19
+ scenarioId,
20
+ definitionRef: definition.ref,
21
+ reviewToken,
22
+ selectionManifestRefs: selections.map(selection => selection.ref),
23
+ idempotencyKey,
24
+ }, definition, selections);
25
+ ```
26
+
27
+ `LocalReviewStore.approvedSnapshot(ledger, token, reviewRef)` resolves actual approved
28
+ storage on the same writer. It requires current review authority without writing a
29
+ review or approving anything. Its documents are copies; its runtime `assertCurrent`
30
+ checks the review aggregate version. The local promotion adapter resolves that snapshot
31
+ again inside its commit, compares the submitted context, rechecks creation/promotion
32
+ authority and verifies both review and scenario versions after the final await.
33
+ One synced scenario-registry entry contains the proposed definition, selections,
34
+ manifest, full reviewed plan, review and source-validation snapshot. Gaps, withheld
35
+ flows, excluded candidates and diagnostics remain in that immutable snapshot.
36
+
37
+ The manifest binds the review/source-validation refs and storage version as well as
38
+ the authenticated promoter and policy. Selection order is normalized. Repeated or
39
+ concurrent identical intent returns one manifest; a changed scoped key binding or an
40
+ attempt to overwrite an existing scenario conflicts. A pre-write failure publishes
41
+ nothing; a lost acknowledgement recovers the committed manifest after reopen. The
42
+ registry's existing 100-scenario bound applies. Older journals have no promotion record.
43
+
44
+ ## Current review checks after promotion
45
+
46
+ Bind the current review owner once when constructing a source-backed local scenario store:
47
+
48
+ ```ts
49
+ const scenarios = new LocalScenarioStore(ledger, scenarioId, scope, {
50
+ reviewStore: reviews,
51
+ authorize,
52
+ validateDefinition: validateReplayPolicyAndTarget,
53
+ validateStateLeases,
54
+ });
55
+ ```
56
+
57
+ `reviewStore` is required when a definition names a source plan. It must own the same
58
+ ledger. The store checks its exact current approved review and independently validated
59
+ runnable cases in addition to the host's replay/target/policy checks. Initialize,
60
+ structural validation, round registration and activation hold its synchronous version
61
+ fence through their last awaited authorization and assert it immediately before the
62
+ registry write. An edit during that await publishes no transition.
63
+
64
+ An edit clears the current plan review. These guards then refuse later structural,
65
+ qualification and activation admission against the old review. Use `invalidateScenario`
66
+ with a replacement definition to advance its epoch and clear activation. Historical
67
+ promotion retries return the original receipt without renewing approval or altering
68
+ the scenario. Promotion registers new entries; replacing an existing scenario remains
69
+ an explicit semantic edit and review flow.
70
+
71
+ All ports belong to the trusted host. A saved source plan or producer-supplied approval
72
+ object cannot supply them. Protect the state directory and synchronize external IAM,
73
+ revocation and provider fencing with the controller. Local hashes and receipts do not
74
+ establish a hosted issuer or deployed revision. Source-bound activation still requires
75
+ independent runtime revision proof; source inspection alone cannot grant it.
76
+
77
+ ## Execute the reviewed revision
78
+
79
+ Use the compiler's `--source-snapshot` and `--source-repository-role` options to bind
80
+ the complete resolver-head snapshot before selecting, reviewing and promoting cases.
81
+ The approved source plan must name that exact resolver matrix. A different matrix
82
+ ref is rejected even when its commits happen to match. Component-only source runs
83
+ can still execute, but cannot establish revision qualification.
84
+
85
+ `prepareQualificationExecution` reads current source review evidence through the
86
+ scenario owner and carries copies of the sealed plan, approved review and source
87
+ validation into the frozen execution documents. It leaves the original trial plan
88
+ unchanged. Each effect authorization resolves current owner state again, including
89
+ after awaited effect permission. The controller never obtains approval from the
90
+ copied documents.
91
+
92
+ Preflight and saved-bundle checks use `validateReviewedSourceDocuments` to check seals,
93
+ scope, plan/review/validation links and the selected matrix. The same pure schema is
94
+ shared with promotion. Saved evidence proves the recorded relationships; the owning
95
+ review store determines current approval. Historical bundles remain readable after
96
+ an edit, while new execution and activation require current authority.
97
+
98
+ Tests compose immutable Git reads, an actual bounded TypeScript AST predicate, source
99
+ validation, durable review, promotion, structural validation, two independently admitted
100
+ native revision rounds and atomic activation, including reopen recovery and source-edit
101
+ races at the final structural, registration and activation boundaries.
102
+ Authentication, coverage policy, physical leases and issuer authority are explicitly
103
+ simulated. The AST oracle proves a declared POST branch only. These proofs do not
104
+ establish full semantic coverage, a deployed source tuple or hosted qualification.
@@ -0,0 +1,21 @@
1
+ # Source-backed plan review
2
+
3
+ `validatePlanSources` checks a sealed source plan against its exact change model and revision matrix. It authorizes each repository, hashes the fetched full diff, resolves citations only at selected immutable commits, and reuses `verifySourceCitation` for file/excerpt checks. A modified working checkout cannot substitute for unavailable selected source.
4
+
5
+ Runnable derivations need confirmed metadata, citations, and nonempty evidence from a registered independent AST/schema/route oracle. Confidence and a proposed `confirmed` label do not establish that evidence. Failed/partial/unsupported extraction retains diagnostic refs as plan gaps. The trusted coverage policy checks frozen requirements, unresolved questions, excluded material and no-E2E reasoning. Source checks never produce runtime PASS, qualification or activation.
6
+
7
+ Trusted host integration:
8
+
9
+ ```ts
10
+ const reviewPorts: PlanReviewPorts = {
11
+ ...authenticatedReviewAndStorage,
12
+ validateSources: (plan, policyRef) => validatePlanSources(sourcePorts, plan, policyRef),
13
+ };
14
+ const reviewed = await reviewPlan(reviewPorts, revisionToken, 'approved', reasonRefs);
15
+ ```
16
+
17
+ All ports belong to the authenticated host. A candidate, plugin or authoring model cannot supply its own source checker, oracle or coverage policy. Revision policy must explicitly admit a missing merge base and its alternative diff method. A full diff over 4 MiB, over 500 distinct runnable citations, unavailable objects, mismatched refs or denied authority block validation rather than truncate source.
18
+
19
+ Approval requires a sealed `workflow.source-validation/v1` result binding the same plan, change model, matrix, scope and admitted review policy. Its ref is included in the immutable review's reason refs. The host's `compareAndSwap` must publish that validation record, review and projection in one atomic write. A losing write publishes none of them. Rejection requires no fabricated successful source check. An edit still clears the current review; historical validation records remain evidence of their original source digests.
20
+
21
+ This changes the experimental `PlanReviewPorts` contract: approved reviews require `validateSources`, and `compareAndSwap` receives a fourth validation argument. Persist it atomically; ignoring it is not a conforming host. [Local review storage](local-review-store.md) persists its records and [source promotion](source-promotion.md) binds current approved storage to a proposed scenario. This review API installs no hosted source registry or production oracle. Qualification execution requires a separately registered runtime owner; activated regression execution remains blocked.
@@ -0,0 +1,175 @@
1
+ # Verified bundle snapshots
2
+
3
+ `verifyBundle(directory)` retains its summary response shape; invalid bundles report a null outcome instead of echoing a producer's PASS label. `readVerifiedBundle(directory)` returns the checked request, selection, campaign, per-cell receipts, frozen document map and manifest byte digest; it throws instead of returning records for an invalid bundle. These records prepare whole-round qualification evaluation but do not themselves qualify or activate a scenario.
4
+
5
+ Both paths use one `BundleSnapshot`. Each listed payload is read once, checked against its sealed byte count/hash and retained privately. JSON decoding, assertion checks and campaign reduction consume those captured bytes. Mutating the directory after capture does not change that snapshot. Buffers returned by the snapshot are copies. A later verification call takes a fresh snapshot rather than caching a former success.
6
+
7
+ `VerifiedBundleSnapshot.open(directory)` exposes the exact verified manifest and
8
+ payload bytes as defensive copies for storage adapters. Its records and manifest
9
+ digest are copies too. The [local result sink](result-sink.md) writes those
10
+ captured bytes, verifies the completed archive, and publishes a scoped receipt
11
+ through the existing ledger. It does not re-open producer files during copying
12
+ or promote a storage receipt into qualification authority.
13
+
14
+ The reader refuses traversal, duplicate paths, symlinks and nonregular files. Reads are bounded to the expected size plus one byte so growth is detected without loading an arbitrarily larger file. Current prototype bounds are 1 MiB for the manifest, 16 MiB per file, 64 MiB of payload and 10,000 files. Oversize bundles fail verification; files are never truncated or silently omitted. Larger media packs need an explicitly supported bounded reader.
15
+
16
+ Campaign verification rechecks complete receipt bindings, missing cells, coverage and proof eligibility, as well as full request/selection/campaign scope and reference identity. Per-cell checks bind exact case/persona/surface/variant and qualification-admission refs. The outcome label alone cannot cover inconsistent campaign metadata.
17
+
18
+ Target comparison checks every target metadata field and each required component's
19
+ kind and identity. Current hosts supply component attestations and, when explicitly
20
+ bound, verified pinned Git-object repository observations. Remote ownership,
21
+ release, schema, flag, browser, container and model metadata remain unobserved.
22
+ Requesting those fields cannot fill their observations; a required mismatch blocks
23
+ the run before fixtures or steps. The saved-bundle reader reconstructs the observed
24
+ tuple from the captured host attestations too, so inventing matching expected and
25
+ observed metadata and recomputing all file/document hashes cannot create passing
26
+ source or deployment evidence. Unsupported target observations need a real host
27
+ contract before they can qualify. Honest blocked attempts retain their evidence.
28
+
29
+ An optional source-snapshot binding covers local launch content. Its frozen
30
+ manifest must match the admitted scope and supervisor observation; every attested
31
+ identity file must belong to that manifest with the same bytes. The reader also
32
+ recomputes the source digest from those file observations. This binds captured
33
+ local content. The [Git proof guide](git-object-proof.md) describes the separate
34
+ actual-file object check and opt-in repository role. Neither establishes remote
35
+ ownership, deployment identity or hosted issuer trust.
36
+
37
+ This is integrity and record-consistency verification. A passing mocked bundle retains its mocked proof boundary. It is not live qualification, trusted issuer identity, tenant authorization or production acceptance. The host must authorize a quiescent artifact directory and apply its own issuer/admission policy. The snapshot API is not a remote filesystem ACL or a defense against a hostile process replacing parent directories during capture.
38
+
39
+ ## Atomic local export
40
+
41
+ `exportVerifiedBundle(source, output)` captures and reduces one bounded snapshot, writes only its sealed bytes into a private sibling staging directory, verifies the staged copy, and renames it into a fresh output directory. The manifest comes from that same snapshot; unlisted host/private files are excluded. The CLI `export` and authoring `test` use this path. CLI JSON includes `published`; invalid source evidence publishes no output. Existing outputs are never merged or overwritten, including an empty directory.
42
+
43
+ Files and directory entries are synced before acknowledgement, including newly created ancestor entries. Content-addressed object publication uses an exclusive hard link, unique temporary storage, bounded no-follow readback and a single digest-checked read. A preexisting corrupt object is retained and reported, never silently replaced. Preexisting symlink ancestors are rejected before directory creation. These operations require a supported owned local filesystem with directory fsync and hard links; unsupported filesystem behavior fails rather than claiming durability.
44
+
45
+ Cooperating exporters share an exclusive sibling publication lock. A writer crash can leave its private staging directory and lock; the destination is absent or contains the complete verified bundle. Locks are never automatically broken. The operator must establish that the writer is gone and inspect the owned staging/output state before a separately authorized cleanup/retry; do not blindly remove a lock belonging to another writer. If final parent sync fails after rename, the command reports that publication durability is unconfirmed: the complete output may exist, so verify it before retrying and do not overwrite it.
46
+
47
+ Tests include concurrent independent publishers, actual writer SIGKILL during a payload write, source mutation after snapshot capture, corrupt objects, symlink/no-effect refusal and injected write/sync failures. This establishes local process-crash behavior and fsync ordering, not physical power-loss qualification, arbitrary hostile-parent confinement, distributed fencing, automatic recovery or provider attestation.
48
+
49
+ ## Durable original execution seal
50
+
51
+ `writeExecutionBundle` now persists the original execution records before acknowledging the
52
+ source seal, rather than relying on a later exported copy. Cell and final payload files are created
53
+ exclusively and fsynced. Existing cell payloads are re-read through the bounded no-follow reader,
54
+ synced as regular files, and their directories are synced before final publication. Existing
55
+ payloads or manifests are never overwritten, including corrupt bytes left by an interrupted write.
56
+
57
+ The writer builds the existing v1 manifest in a unique private `.bundle-pending-*` directory.
58
+ An internal candidate snapshot checks its bounded payload hashes and performs the same complete
59
+ frozen-record, assertion and campaign reduction as the public verifier. The verified receipt set
60
+ must also match the final records supplied by the executor. Only then does an exclusive hard link
61
+ publish `manifest.json`, followed by directory fsync. The executor's ledger finalization follows
62
+ the returned source seal. The bundle format and public reader contract are unchanged: a candidate
63
+ without a published manifest is never a valid public bundle.
64
+
65
+ The caller must own a quiescent local execution tree and retain its existing ledger writer.
66
+ An exclusive `.bundle-write.lock` serializes cooperating source writers. A write/sync/candidate
67
+ failure or process death retains its incomplete records, lock and any manifest staging for explicit
68
+ reconciliation; no stale lock is automatically removed and no assertion is retried. A manifest
69
+ that became visible before a later directory sync failure is reported as published with durability
70
+ unconfirmed, rather than removed or overwritten. Verify that existing bundle before any retry.
71
+
72
+ Tests cover actual SIGKILL before the manifest link and after its first directory fsync, injected
73
+ payload write/fsync failures, corruption during manifest staging, a hash-consistent candidate
74
+ whose campaign disagrees with reduction, existing corrupt payload preservation, linked-parent
75
+ refusal and post-publication sync uncertainty. A process crash can leave an invalid incomplete
76
+ source or a complete verifiable source with reconciliation remnants. These bounded local tests
77
+ do not simulate physical power loss, establish hostile-writer confinement, distributed fencing,
78
+ provider/host qualification, or transactional recovery across the separate ledger and bundle seal.
79
+
80
+ ## Local commit-window readback
81
+
82
+ If a controller dies after the original manifest commits but before ledger finalization, local
83
+ redelivery first requires the existing durable ownership inventory to show acknowledged removal
84
+ of every resource. It then verifies and reduces the entire committed bundle and binds its exact
85
+ request/selection, scope, execution/attempt/generation, attempt number, idempotency key and
86
+ per-cell receipt references to the trusted ledger. Only a matching commit can reconstruct the
87
+ original summary, sync the manifest's directory and append the missing `finalized` transition.
88
+ A failed recovery directory sync leaves finalization blocked with durability unconfirmed.
89
+ It returns checked receipts and
90
+ starts no second host or fixture. A manifest's mere presence or a producer PASS label is insufficient.
91
+
92
+ Finalized redelivery also reads this bound committed evidence instead of trusting the cached
93
+ summary containing an empty receipt list. Missing, corrupt or foreign finalized evidence fails
94
+ closed without acquisition. Interrupted attempts without a committed manifest retain the existing
95
+ retry policy and ownership gate; this readback does not repair incomplete files or invent cleanup.
96
+ Actual controller SIGKILL immediately before the ledger finalization write, zero-launch readback,
97
+ unknown ownership, corrupt/foreign/missing evidence and false cached summary are regression-tested.
98
+ This is local reconciliation under one ledger writer, not a distributed transaction or a claim that
99
+ physical power loss was simulated.
100
+
101
+ ## Inspect and hand off a frozen run
102
+
103
+ ```sh
104
+ tracegrove inspect --request ./frozen.json --json
105
+ tracegrove rerun --request ./frozen.json --output ./next-attempt.json
106
+ tracegrove run --request ./next-attempt.json --state-dir ./state
107
+ tracegrove inspect --execution <id> --state-dir ./state --json
108
+ tracegrove inspect --bundle ./exported-evidence --failed-step --json
109
+ tracegrove export --execution <id> --state-dir ./state --output ./new-export
110
+ ```
111
+
112
+ `inspect --request` uses the typed frozen transport envelope and static executable
113
+ closure checks. It reports requested refs, selected cells, a closure digest, blockers
114
+ and whether a qualification owner is required. `executionAuthority: not_checked`
115
+ means exactly that: inspection does not query an approval owner, probe a runtime,
116
+ start an application, provision state or grant effects. It needs no mutable project
117
+ YAML. A blocked structure exits 2; a valid structure exits 0.
118
+
119
+ The CLI reads frozen envelopes from bounded regular files (96 MiB maximum), rejects
120
+ unknown envelope fields and checks document keys and seals before rerun. A trial or
121
+ work-proof rerun retains the exact frozen case/persona/target selection, assigns fresh
122
+ campaign/request identities and records `replayOf`. Its documents are independent
123
+ copies of the original. Qualification/lifecycle requests cannot use `rerun` to erase
124
+ registration; use the current owning registry to admit a new independent round and
125
+ `prepareQualificationExecution` to bind it.
126
+
127
+ Execution inspection first captures and independently verifies the complete evidence
128
+ bundle. It never reports an unverified producer PASS. `--bundle` supports evidence
129
+ outside the original state directory; `--execution` requires one safe path segment
130
+ and a state directory. `--failed-step` is the explicit path for failed observation
131
+ payloads. Ordinary summaries retain compact step/assertion labels. Successful
132
+ inspection exits 0 even when the verified product outcome is a failure; read `outcome`.
133
+ Invalid evidence exits 2 and reports no success summary.
134
+
135
+ The CLI `export` uses the atomic local export described above. The library also exports
136
+ `exportCapturedBundle(snapshot, output)`, which writes a `VerifiedBundleSnapshot`'s captured
137
+ sealed bytes through the same file writer as the result archive. It never rereads the producer directory or copies
138
+ unlisted scratch files or workspaces. The output must be a new directory. Files are
139
+ exclusive, the manifest is written last, and completed output is reverified. Failed
140
+ writes remove only the newly allocated output; existing destinations and links are
141
+ left intact. Capturing before the producer disappears still permits export afterward.
142
+
143
+ The library exports the `FrozenBundle`, `FrozenPlanInspection`, `ExecutionInspection`
144
+ and `FailedStepInspection` Zod schemas with the corresponding reader/inspection
145
+ functions. These local projections are not new execution authority or outcome records.
146
+
147
+
148
+ ## Runner compatibility
149
+
150
+ A frozen runner profile is evidence of the selected configuration, not permission to
151
+ substitute the verifier's current runner identity. `verify-bundle --json` and failed verified
152
+ exports may include `diagnostics` with schema `tracegrove.runner-compatibility/v1`:
153
+
154
+ - `runner_profile_missing`: no valid, self-digest-checked profile reproduces the requested runner kind.
155
+ - `runner_capability_revision_unsupported`: a valid matching profile is present, but this verifier
156
+ cannot reproduce the requested capability revision.
157
+ - `runner_capability_digest_mismatch`: the kind and revision are supported, but the exact capability
158
+ digest cannot be reproduced from the frozen profiles. Investigate the producer/profile mismatch.
159
+
160
+ The diagnostic includes the exact `requestedRunner` ref and up to 32 matching valid profiles with
161
+ `reproducedRunner` refs. It always says `verification: "not_completed"`; it never grants a historical
162
+ outcome. Unsupported evidence still returns `ok: false`, `outcome: null`, and CLI exit 2. Other
163
+ integrity failures retain their own errors and need not produce a compatibility diagnostic.
164
+
165
+ Preserve the original bytes and manifest. Do not edit or reseal references, choose a runner by
166
+ step names, or replace a requested revision merely because the case uses a subset of its operations.
167
+ For historical inspection, use the producer's recorded compatible verifier and pinned dependency
168
+ closure. An npm version alone may be insufficient for an unpublished build; retain its source commit
169
+ and package integrity too. To qualify a current runtime, perform a new authorized execution, preserving
170
+ both attempts and their distinct identities. This is a new qualification, not a migration of old proof.
171
+
172
+ For example, a valid browser profile captured by an unreleased verifier with capability revision
173
+ `0.3.0` cannot be reproduced by a verifier that implements only `0.1.0`. That is an unsupported reader
174
+ boundary, not proof that the profile is absent or that either workflow passed now. These diagnostics
175
+ do not add historical runner implementations, alter accepted evidence, or grant replay authority.