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,55 @@
1
+ # Local acquisition recovery gate
2
+
3
+ The executable local path records ownership in the existing fsynced, single-writer ProjectionLedger. Each new execution initializes `ownership:<executionId>` with its scope, immutable request digest, campaign, attempt and generation. Host and fixture reservations precede workspace acquisition/host startup or application-API create. Observed physical IDs are acknowledged before readback/steps, and cleanup moves through pending to removed only after the existing trusted host stop or registered deletion plus absence readback confirms it. Internal typed host and fixture acknowledgements remain separate: a fixture named `host.process` or `host.workspace` cannot borrow a successful host acknowledgement from the legacy public display-key arrays.
4
+
5
+ No credentials or fixture request/cleanup arguments are added to this inventory. Physical resource IDs and native workspace/process identities remain private operational metadata in the existing private ledger. The owner must protect that directory.
6
+
7
+ After controller interruption, redelivery of the same frozen idempotency key checks the prior inventory before admitting a new attempt. Reserved, observed or cleanup-pending entries block with `ownership_reconciliation_required`. Legacy interrupted attempts without inventory block with `ownership_inventory_missing`. Wrong request/scope/attempt/generation cannot discharge the inventory. Cleanly recorded removed inventory permits a fresh attempt through the existing admission path; an empty initialized inventory means no acquisition was reserved. Existing finalized redelivery returns its existing result without replaying effects.
8
+
9
+ This is deliberately a recovery gate, not an automatic janitor. A controller crash after a real acquisition but before its acknowledgement leaves a durable reservation even if the native supervisor subsequently cleans up. No cleanup acknowledgement is invented from supervisor exit, workspace disappearance, an old PID or elapsed lease time. There is no automatic cross-process takeover/deletion or credential reconstruction, and no operator command to discharge unresolved inventory in this slice. Such cases remain blocked pending a separately reviewed reconciliation path with independent ownership and cleanup evidence. Do not edit ledger records to bypass the gate.
10
+
11
+ The actual local supervisor still handles ordinary controller disconnect and cleanup. A persistence failure must not prevent best-effort cleanup of resources already known in memory; it does prevent a successful durable completion acknowledgement. A process/power loss during the ledger write inherits the ledger's existing uncertain-write and corrupt-tail behavior.
12
+
13
+ Tests exercise real native acquisition and application-API fixture create in subprocesses, kill the controller before the executor receives their acknowledgements, reopen the actual persisted ledger, and prove redelivery performs no second acquisition. Other tests exercise native/sample cleanup, reservation/acknowledgement ordering, invalid cleanup transitions and foreign binding rejection. They do not qualify a remote provider, shared-resource fencing, distributed leases, machine power-loss recovery, or a durable supervisor-to-controller cleanup journal. Atomic artifact publication is a separate milestone.
14
+
15
+ ## Read-only recovery inspection
16
+
17
+ ```sh
18
+ tracegrove recovery-status --state-dir <owned-state> --execution <execution-id> --json
19
+ ```
20
+
21
+ This command reads an existing checkpoint without opening `LocalLedger` for writing. It creates
22
+ no directories, locks or credentials, does not contact a controller, and never probes or kills a
23
+ PID. It does not append interrupted/finalized transitions, delete resources, discharge ownership,
24
+ sync a commit, resume a run or admit an acquisition. The existing execution path remains the
25
+ authority for all recovery and admission decisions.
26
+
27
+ The strict `tracegrove.recovery-status/v1` report includes a journal sequence/content digest,
28
+ lock presence (not process liveness), recorded phase, counts by resource kind/state, bounded
29
+ evidence status, static recovery guidance and an optional verified **historical** outcome.
30
+ It omits raw journal records, resource keys, physical IDs, PIDs, paths, controller tokens,
31
+ cleanup arguments and candidate diagnostics. The checkpoint digest identifies selected local
32
+ bytes; it is not a signature or an admission token. The local process scope and filesystem owner
33
+ must already be authorized to inspect the private state directory.
34
+
35
+ The journal uses the same schema/sequence/version parser as the existing writer. Inspection is
36
+ bounded to 16 MiB and 100,000 records; oversized, nonregular, linked, malformed or partial inputs
37
+ fail closed. The directory identity, journal bytes and lock fingerprint are checked before and
38
+ after capture and again after evidence inspection. Concurrent changes return an explicit changed
39
+ checkpoint rather than a ready result. This is a checkpoint observation, not a promise that a
40
+ live writer cannot change state after the command returns or confinement against hostile parent
41
+ replacement during filesystem operations.
42
+
43
+ Ownership counts describe the journal's recorded states, not newly observed absence. The
44
+ committed-bundle path reuses the executor's exact ledger/request/selection/scope/attempt/generation/
45
+ receipt binding checks and full bounded bundle reduction. Exit 0 means either matching finalized
46
+ historical evidence or a recorded interrupted commit available for normal readback; exit 2 means
47
+ another state or unavailable/invalid evidence. Every report says `actionAuthority: none`,
48
+ `execution: not_started_by_inspection` and `verificationVerdict: not_evaluated`. Unknown cleanup
49
+ remains unresolved even when a workspace disappeared or a controller exited. A stale lock does
50
+ not itself record interruption; only normal trusted writer reconciliation can do that.
51
+
52
+ Automatic janitor/discharge, durable supervisor acknowledgements and provider recovery remain
53
+ separate gates. The supervisor's current `host.cleaned` message is ephemeral IPC. Adding cleanup
54
+ authority requires bound ownership/cleanup evidence admitted by the existing exclusive ledger
55
+ writer; this status command provides neither that evidence nor a new journal.
@@ -0,0 +1,13 @@
1
+ # Durable local plan review
2
+
3
+ `LocalReviewStore` connects `editPlan` and `reviewPlan` to the existing `LocalLedger`. Construct it with an already opened ledger, editable-plan identity, exact scope and trusted host implementations of `authorize` and `validateSources`. Its `ports()` implements `PlanReviewPorts`; no permissive authority or source-check fallback is installed.
4
+
5
+ `initialize(plan)` stores an unreviewed immutable draft at edit revision one. `stage(plan)` adds another immutable revision without changing the editable revision or current review. The staged draft gains neither approval nor execution authority. `editPlan(store.ports(), token, stagedRef)` then atomically advances editable revision and clears approval. Re-staging identical bytes is a no-op; changing bytes under the same document identity/revision is refused.
6
+
7
+ Review commits recheck the current actor and policy after source checking, compare the storage version, and append the projection, review and source-validation records in one journal entry. Authorization revocation, substituted scope, missing independent validation, immutable-reference collisions and competing writers publish no losing review. Source validation is persisted with its exact plan/change-model/revision-matrix/policy bindings. Reopening the ledger recovers the review and those records together. Local collections are bounded to 500 plans, reviews and validations; exhaustion fails rather than discarding history.
8
+
9
+ The journal stores private local state behind the single-writer controller lock. Writes check ownership, serialize and validate before consuming a sequence, synchronize the journal and its directory, and cache only the serialized bytes. Reads and append results are copies. An uncertain write stops both reads and writes through that handle; close it and reconcile the persisted journal before continuing. Closed handles and replaced writer ownership also refuse current-state reads. A truncated or unterminated record is retained and refuses reopening; this change never trims or repairs evidence automatically. Recovery acquires the new writer identity before recording interrupted work.
10
+
11
+ This is a protected local-host adapter, not distributed fencing, a tenant ACL, a signed external issuer or a replacement for the shared OrgX authority decision. The host must protect the state directory from candidate processes and supply authenticated admission and the registered independent source checker. Do not accept local approval records as hosted authority merely because their hashes verify. No new database table, paid call, deployment or live database change is required by this adapter.
12
+
13
+ Tests cover actual journal bytes, reopen recovery, concurrent review arbitration, staged edits, authorization revocation, forged actor/policy fields, missing validation, caller mutation, serialization failure, failed synchronization, replaced writer ownership and unterminated records. Source authorization/checking in the persistence tests is explicitly simulated. [Source promotion](source-promotion.md) reuses its actual approved snapshot and current-review guard. [Local scenario storage](local-scenario-store.md) supports structural transitions, registered qualification execution, result retention and explicit atomic activation. Hosted coordination acceptance, CLI lifecycle commands and activated regression execution remain open.
@@ -0,0 +1,91 @@
1
+ # Durable local scenario registration
2
+
3
+ `LocalScenarioStore` implements `ScenarioPorts` on the existing `LocalLedger`.
4
+ It persists definitions, selections, pending qualification admissions and semantic
5
+ invalidation together. It supplies `resolveAdmission(ref, scope)` for reading an
6
+ actual registered record, rather than accepting a producer document as registration.
7
+
8
+ ```ts
9
+ const store = new LocalScenarioStore(ledger, scenarioId, scope, authority);
10
+ await store.initialize(definition, [qualificationMatrix, selectedRound]);
11
+ const admission = await registerQualificationRound(store.ports(), token, {
12
+ selectionManifestRef: selectedRound.ref,
13
+ stateLeaseRefs: provisionedStateLeaseRefs,
14
+ });
15
+ ```
16
+
17
+ The authenticated host must provide all three authority methods. There is no
18
+ permissive default:
19
+
20
+ - `authorize(scope, action)` checks the current owner and policy. Reads are
21
+ authorized too; registration/invalidation recheck authorization before publication.
22
+ - `validateDefinition(definition)` checks the complete reviewed source, replay,
23
+ policy, target and matrix closure. Initialization requires the host to have
24
+ already authorized promotion and structural validation. It does not create an
25
+ approval or turn a draft into an accepted native plan.
26
+ - `validateStateLeases(admission)` is a read-only check that the host actually
27
+ provisioned fresh state and can reserve the supplied leases for this admission.
28
+ The store does not provision resources, establish an issuer or infer freshness
29
+ from a caller-generated UUID. The host remains responsible for synchronizing its
30
+ external authority and physical lease checks with its controller.
31
+
32
+ Source-derived definitions additionally require `reviewStore: reviews`, the
33
+ `LocalReviewStore` that owns the same ledger. Its current approved source snapshot
34
+ and synchronous fence are composed with the three host methods. Do not substitute a
35
+ serialized approval object or a callback that only checks the review before an await.
36
+ The fence is checked again immediately before registry writes. Qualification context
37
+ also carries its sealed plan, review and validation into the execution bundle.
38
+
39
+ Repeated identical input documents are stored once, including when the selected
40
+ round is the qualification matrix itself. Different bytes under the same immutable
41
+ document identity are refused.
42
+
43
+ One bounded registry per scope makes lease claims atomic across scenarios sharing
44
+ that registry. A commit checks the scenario version, exact allowed projection
45
+ transition, complete selection/allocation, epoch and immutable definition bindings.
46
+ It then rechecks authorization and the registry version and appends the projection
47
+ and admission in one synced record. Competing writers publish one winner. A lease
48
+ identity cannot be reused by changing its revision/digest or by selecting another
49
+ scenario in the same scope. Other scopes and distributed resource pools need their
50
+ own trusted coordination owner; this is not a tenant isolation boundary.
51
+
52
+ `stage(definition, selections)` stores an immutable replacement without changing
53
+ the current definition, epoch, approval or coverage. Re-staging identical bytes
54
+ is a no-op. `invalidateScenario` must name a new revision of the same definition;
55
+ it retains history, advances the epoch, clears activation authority and degrades
56
+ the projection. Invalidation that commits while registration checks state makes
57
+ the older registration lose its CAS. Direct port calls cannot manufacture an
58
+ active projection or skip the epoch/version rules.
59
+
60
+ Reopening the ledger recovers admission and projection together. If a commit's
61
+ acknowledgement is lost, inspect the registered history and resolve its immutable
62
+ admission reference. An old token conflicts; it does not register another attempt.
63
+ Historical reads do not establish current execution or activation authority.
64
+ Caller mutations cannot rewrite returned or stored records. Closed, ownership-lost
65
+ or uncertain ledger handles retain the underlying ledger's refusal behavior.
66
+
67
+ The prototype permits 100 scenarios, 500 total admissions and 2,000 definition/
68
+ selection records in one registry. Exhaustion requires archival indexing; history
69
+ is never silently dropped. The state directory must stay private to the trusted
70
+ controller and inaccessible to candidate processes. Local hashes and projection
71
+ states are not signatures or hosted approval receipts.
72
+
73
+ The [terminal result index](qualification-results.md#durable-local-terminal-results)
74
+ retains complete rounds through the existing result sink. The
75
+ [activation adapter](scenario-activation.md#local-atomic-storage) publishes the active
76
+ projection, receipt and assessment records in one scenario-registry append.
77
+ `propose` and the [structural validation adapter](scenario-structure.md) separate
78
+ staging a proposal from compiling its frozen execution closure and entering validating
79
+ state. The same operation can revalidate a semantically edited, degraded definition.
80
+ This adapter does not install physical lease provisioning, hosted source/issuer
81
+ authorization or CLI lifecycle commands. [Source-plan promotion](source-promotion.md)
82
+ uses actual current approved review storage to register proposed scenarios.
83
+ [Registered qualification execution](qualification-registration.md#executing-a-registered-round)
84
+ requires a separate authenticated runtime owner and uses the admission's allocated
85
+ cell identities. Requests without that owner and all activated regression requests
86
+ remain refused. A registration record cannot relabel trial evidence as qualification.
87
+
88
+ Tests use real journal bytes, reopen recovery and competing operations. Host
89
+ authentication, structural promotion and physical lease checks are explicitly
90
+ simulated in those storage tests. No live database, paid model or OrgX decision is
91
+ created or approved by this adapter.
@@ -0,0 +1,87 @@
1
+ # Test a local MCP tool through the existing verification path
2
+
3
+ Install the optional protocol adapter dependency when using MCP flows:
4
+
5
+ ```sh
6
+ npm install --save-dev --save-exact @modelcontextprotocol/sdk@1.32.1
7
+ tracegrove sample-config --sample notes-mcp --output ./mcp-notes
8
+ tracegrove test --config ./mcp-notes/tracegrove.config.yaml
9
+ ```
10
+
11
+ The core, HTTP, browser and native job startup paths do not load this peer. Planning
12
+ an MCP flow without it reports `mcp_sdk_missing` with the installation command.
13
+ The package pins the SDK version and lockfile integrity. This driver uses the
14
+ [official v1 client](https://ts.sdk.modelcontextprotocol.io/client) and its
15
+ Streamable HTTP transport. Conformance exercises the negotiated `2025-11-25`
16
+ protocol with JSON and SSE responses. Other protocol revisions, legacy HTTP+SSE
17
+ fallback, stdio servers, OAuth discovery and hosted targets are not qualified here.
18
+
19
+ ## Author a flow
20
+
21
+ ```yaml
22
+ title: A created note is independently readable
23
+ effects:
24
+ maxMcpCalls: 1
25
+ allowedMcpTools: [notes.create]
26
+ steps:
27
+ - name: create
28
+ mcp:
29
+ endpoint: /mcp
30
+ tool: notes.create
31
+ arguments: {title: Protocol proof, body: Native persistence}
32
+ save: {noteId: structuredContent.note.id}
33
+ expect:
34
+ json: {structuredContent.note.title: Protocol proof}
35
+ - GET: /notes/{noteId}
36
+ expect:
37
+ status: 200
38
+ json: {note.title: Protocol proof}
39
+ ```
40
+
41
+ MCP steps use the ordinary persona selector, saved-value bindings, deadlines and
42
+ JSON captures. The endpoint stays on the launched application's admitted origin.
43
+ Tool and endpoint names are frozen; only arguments can contain saved values.
44
+ The compiler requires the tool allowlist, call ceiling, designated-write mode,
45
+ POST permission and endpoint prefix before any host starts. A tool's
46
+ `readOnlyHint` or other server-supplied annotation cannot grant authority.
47
+ The ceiling bounds calls, not the number or financial cost of downstream effects.
48
+ Use an isolated application with run-owned data and known tool effects. Hosted,
49
+ paid, messaging and external-provider tool qualifications remain separate gates.
50
+ MCP and HTTP can share a flow; browser/native-job combinations remain blocked
51
+ until jointly qualified.
52
+
53
+ ## Results and recovery
54
+
55
+ The existing planner, executor, bundle writer and independent reducer handle the
56
+ flow. Each observation includes the tool, endpoint, negotiated protocol version,
57
+ observed server name/version, content, structured content, `isError`, duration and
58
+ attempt count. Server identity is self-reported protocol metadata; target source
59
+ and runtime identity still come from the local host's attestation.
60
+
61
+ The default required assertion checks `isError: false` in addition to configured
62
+ facts. A tool error is retained as a failed step, skips dependent effects, and
63
+ keeps potentially partial mutations unknown. An independently readable record is
64
+ stronger evidence than the tool saying it saved one: the sample's controlled
65
+ success-without-persistence defect fails on HTTP readback. Independent bundle
66
+ verification uses the frozen MCP runner and typed oracle; substituting an HTTP
67
+ runner or oracle is rejected.
68
+
69
+ Each call establishes a protocol connection with the same step deadline. There is
70
+ one tool attempt and no automatic tool replay or transport fallback. Throttling,
71
+ connection loss, cancellation or expiry does not prove that remote work stopped.
72
+ Potential effects remain unknown in cleanup accounting after an ambiguous call.
73
+ Local process/workspace cleanup is confirmed separately. Inspect the native
74
+ application before requesting another run; MCP has no generic idempotency-key or
75
+ rollback guarantee. SDK transport reconnection is disabled.
76
+
77
+ Requests and each response stream are bounded to 64 KiB. Credentials stay in
78
+ memory, are sent only to the admitted endpoint, and cannot be expanded into tool
79
+ arguments. Redirects are refused. Results echoing an issued bearer are withheld;
80
+ raw protocol/provider error messages are not saved. Resource links are inert
81
+ evidence: the driver does not fetch them, render embedded UI or call other tools.
82
+
83
+ The native `notes-mcp` sample uses file-backed notes and a JSON-response subset of
84
+ the `2025-11-25` transport. Separate tests interoperate with the official SDK server
85
+ using JSON and SSE. These are local protocol proofs, not an actual ChatGPT/Claude
86
+ widget-host, mobile, production authorization or complete MCP-server conformance
87
+ claim. No inference model or external account is used in these tests.
@@ -0,0 +1,96 @@
1
+ # Native job bridge
2
+
3
+ The `native_job` runner uses Node IPC for job submission, independent readback,
4
+ and cancellation. HTTP remains available for fixtures and application readiness;
5
+ an HTTP response cannot satisfy a `job.observation/1` assertion. The core,
6
+ planner, reducer, evidence bundle, CLI, and Grove use the same frozen contracts.
7
+
8
+ ```sh
9
+ tracegrove sample-config --sample report-native --output ./native-example
10
+ tracegrove test --config ./native-example/tracegrove.config.yaml
11
+ tracegrove ui --dir ./native-example
12
+ ```
13
+
14
+ The example reuses the report-jobs application's real SQLite store and separate
15
+ worker. It exercises duplicate delivery, a conflicting idempotency key, another
16
+ persona's denied read, persisted output, worker-confirmed cancellation, and a
17
+ failed job. The application and worker are stopped and their attempt-owned data
18
+ directory removed. The native sample uses no HTTP job endpoint.
19
+
20
+ ## Authoring
21
+
22
+ Set `app.nativeJobs: node_ipc/v1` on a Node preset. The application must implement
23
+ the explicit handshake below; setting the option alone cannot establish a native
24
+ capability. Declare `effects.maxJobs`; every submit invocation, including a
25
+ duplicate or conflicting invocation, consumes one position in that ceiling.
26
+ The compiler derives the allowed queues from the flow. Low-level corpus authors
27
+ must supply `effects.allowedJobQueues` explicitly. Read-only envelopes refuse
28
+ submission and cancellation. Job steps require one attempt; there is no implicit
29
+ submission retry.
30
+
31
+ ```yaml
32
+ effects: { maxJobs: 1 }
33
+ steps:
34
+ - job:
35
+ action: submit
36
+ queue: reports
37
+ requestKey: one-report
38
+ payload: { title: Example, mode: succeed }
39
+ save: { jobId: jobId }
40
+ expect: { present: [jobId] }
41
+ - job: { action: read, queue: reports, jobId: '{jobId}' }
42
+ expect:
43
+ json: { status: succeeded, output.report.content: 'Report: Example' }
44
+ present: [workerId]
45
+ ```
46
+
47
+ These compile to `job.submit`, `job.observe`, and `job.cancel`. Expectations
48
+ refer to the typed job observation, using `expect.json`, `present`, `absent`, or
49
+ `count`. HTTP status expectations are rejected. `as` uses the same attempt-issued
50
+ persona credentials as HTTP. Credentials cross the private IPC channel and are
51
+ excluded from protocol results and recorded observations. Provider output still
52
+ needs the application's ordinary data-redaction policy.
53
+ An output that echoes the issued credential is withheld with a typed adapter
54
+ failure; the credential is not sealed into observations.
55
+
56
+ The read operation polls to its step deadline. A completed readback survives a
57
+ later timeout, so `succeeded` without the required report is an assertion failure
58
+ with retained evidence. Cancellation or a transport failure remains a failure of
59
+ the attempt. Request and response IDs are correlated, read/cancel results must
60
+ name the requested job, and submitted results must retain the requested key.
61
+
62
+ ## Application protocol
63
+
64
+ Schemas are exported through `workflow-verify/protocol` and JSON Schema:
65
+ `workflow.native-job-{action,request,response,ready,observation}/v1`.
66
+ The supervisor opens IPC only for an opted-in Node application and sets
67
+ `TRACEGROVE_NATIVE_JOBS=node_ipc/v1`. After its worker/provider is ready, the
68
+ application sends:
69
+
70
+ ```json
71
+ {"kind":"tracegrove.job.ready","version":1,"queues":["reports"]}
72
+ ```
73
+
74
+ It receives `tracegrove.job.request` messages with a UUID `id`, nullable
75
+ `credential`, and a typed `command`. Commands are `submit` (queue, requestKey,
76
+ payload), `read` (queue, jobId), or `cancel` (queue, jobId). The application owns
77
+ credential validation, tenant isolation, idempotency, actual submission, readback,
78
+ and cancellation semantics. It replies with the same UUID:
79
+
80
+ ```json
81
+ {"kind":"tracegrove.job.response","id":"00000000-0000-4000-8000-000000000001","result":{"jobId":"example","status":"queued","requestKey":"one-report","output":null,"workerId":null}}
82
+ ```
83
+
84
+ Messages are bounded to 32 KiB. Malformed, missing, oversized, mismatched, or
85
+ late responses cannot become successful observations. Only job-namespace
86
+ messages are forwarded from the application; application output cannot impersonate
87
+ the supervisor's source or cleanup observations. The same supervisor owns the
88
+ application process group, including workers, and removes its workspace when the
89
+ controller disconnects. Snapshot-pinned launches use the same bridge from the
90
+ private pinned source copy.
91
+
92
+ This is a local Node provider seam. It does not qualify a hosted queue, a remote
93
+ provider account, production cancellation, or distributed crash recovery. The
94
+ handshake declares supported queues; it does not independently certify the
95
+ provider's implementation. Python bridges and mixed browser/native-job packs
96
+ require separate conformance work and currently block rather than downgrade.
@@ -0,0 +1,155 @@
1
+ # Portable environment setup — experimental foundation
2
+
3
+ Use the README's single first-run quickstart before adapting your app. This document defines a
4
+ profile/admission boundary; it does not install another runner. The executable scenario remains
5
+ the existing case/flow with its assertions, fixtures and personas. A separate execution profile
6
+ selects where and under what authority that same scenario runs. A host brand or a placement enum
7
+ is not a supported capability.
8
+
9
+ ## Current versus needed configuration
10
+
11
+ | Concern | Current executable CLI | New reusable contract / remaining integration |
12
+ | --- | --- | --- |
13
+ | Scenario versus placement | Short authoring config combines app setup and personas; low-level corpus separates cases, profiles, EnvironmentPlan and HostPlan | Reference-only PortableEnvironmentProfile plus per-attempt intent; profile never embeds scenario steps. Selection/compiler/CLI integration remains gated. |
14
+ | Workspace / source / build | Native launch hashes selected source files and observes the interpreter; Git resolver freezes exact base/head | Host-resolved workspace, immutable source-selection/build/config refs. Verify actual installed dependency/build closure; a launch-file hash is not a complete installed closure. |
15
+ | Start app alongside runner | Node, FastAPI and Django native process hosts, fresh directory/port, GET readiness; command wrapper blocked | Reuse frozen host/launch/dependency plan refs. Discover process/runtime/loopback/filesystem capabilities. No arbitrary shell execution DSL. |
16
+ | Existing hosted staging | Declared origins and environment classes exist; general authenticated external-host execution is not wired | Resolve exact deployment and endpoint, confirm authorized access and identity, then read readiness. Never restart or tear down a borrowed deployment. Not qualified here. |
17
+ | Endpoints | Native host reports/reserves loopback port; browser and HTTP use that observed origin | Host endpoint resolver refs distinguish owned launch, service discovery and external deployment. No embedded credential-bearing URLs, tunnels or assumed inbound access. |
18
+ | Browser / dependencies | Chromium driver; explicit Playwright binary/system libraries. Python environments separate. Docker sample harness exists | Required versioned capabilities and pinned dependency plans; unsupported/missing features block. No automatic Docker, services, root, persistent-volume or browser-library assumption. |
19
+ | Network | Browser/API effect envelopes constrain adapter actions; arbitrary launched app egress is not proven confined | Host-enforced policy ref, explicit allowed endpoints, inbound none/loopback. Current native host cannot attest full network containment; a strict profile must remain blocked there. No policy changes or gateway bypass. |
20
+ | Application persona | Sample host issues attempt-local synthetic bearer tokens; adapters consume in-memory credentials | personaRef + secretRef, resolved by that environment's authorized broker. No values in scenarios/profiles/artifacts. Declaring the ref grants no access. |
21
+ | Execution authority | Current local process runs with the environment's existing OS/sandbox permissions | Independent execution actor, policy ref and optional execution secret refs. App personas cannot grant workspace/service/admin authority. Host must validate scope/lease/operation permission. |
22
+ | Synthetic data / reset | API fixture create/readback/reverse cleanup; isolated sample data dirs | Versioned seed/generator/namespace/reset/resource policy refs. Reset only host-resolved owned isolated resources; no production reset, global prune or database integrity replay. General DB/service provisioning is not installed. |
23
+ | Artifacts / redaction | Local verified bundles, JSON/Markdown/JUnit, WebM and media integrity. Raw bodies/video can be private | Destination/durability/retention/redaction policy/size bound. Ephemeral hosts must prove authorized export before completion; executable redaction and general destination adapters remain unfinished. |
24
+ | Resource/time/spend | Existing request/action deadlines and budgets; native/Docker enforcement differs; draft provider caps differ | Explicit wall/cleanup reserve, CPU/memory/disk/request/browser/provider/agent/spend limits. Host must prove enforceability, including zero calls/spend. A number in YAML is not enforced accounting. |
25
+ | Ownership / cleanup | Scoped process/data/fixture inventory, acknowledged stop, unresolved cleanup retained | Lease/cleanup policy refs and per-attempt bindings; acquired resources only. Durable acquisition CAS/fencing, atomic artifacts, expired-lease recovery and real-provider crash/interleaving remain integration gates. |
26
+ | Replay | Verify/play existing evidence; `test` creates fresh actions; low-level rerun preserves lineage | Explicit fresh execution, evidence playback, fresh-fixture, recorded-I/O or history mode; host-supported replay plan required. Source fixture reuse is rejected by the existing lifecycle validator. No replay engine installed. |
27
+ | Agent output / onboarding | check/doctor/test JSON and exit codes; doctor discovers authoring projects and reports native compiled-plan provenance, dependencies and structured errors. Other top-level errors sometimes prose | SDK preflight returns typed checks, omissions, stable errors and recovery; ready is execution not started and verification not evaluated. It is not an admission token. Portable profile dispatch remains gated. |
28
+
29
+ ## Reference-only profiles
30
+
31
+ Generated, schema-validated examples:
32
+
33
+ - [App alongside runner](examples/portable-environments/alongside_runner.json)
34
+ - [Existing staging](examples/portable-environments/external_staging.json)
35
+
36
+ Every `example.*` ref is an unresolved placeholder, including its illustrative digest. Neither
37
+ file registers a host, authorizes a target or can be passed to the current CLI config loader.
38
+ The source is `src/authoring/environmentTemplates.ts`; `node --import tsx
39
+ scripts/export-environment-examples.ts` regenerates them. Tests compare generated bytes/records
40
+ and parse them through the same Zod schemas exported to JSON Schema. Do not maintain another
41
+ handwritten environment DSL or copy credentials into these files.
42
+
43
+ Recommended setup is one shared scenario tree plus one small profile selection per environment:
44
+ `mac-local`, `coding-cloud-local`, `workflow-cloud`, and separately `authorized-staging`. Each
45
+ selection resolves the same logical source/build/configuration refs to that host's workspace and
46
+ resolves credential refs in that host. These names are recommendations, not installed adapters.
47
+ Start with the native no-service API sample, then Chromium, then OrgX with its isolated dependency
48
+ and fixture prerequisites; qualify each stage before enabling it in onboarding.
49
+
50
+ For application credentials, have the environment's existing broker bind a logical secret ref
51
+ to the intended test persona under an attempt-scoped lease. For execution permissions, separately
52
+ bind the execution actor to an existing policy and any required execution credential refs. The
53
+ preflight interface checks access metadata without fetching or returning secret values. Actual
54
+ dispatch must obtain an in-memory handle from that broker and erase/revoke it at teardown. No
55
+ universal environment-variable/token export, copied browser session, persistent credential setup
56
+ or transfer between Mac/Codex/Claude/OrgX environments is implemented or authorized.
57
+
58
+ The optional non-secret configuration ref is also host-resolved: its resolver must reject secret
59
+ values and must not evaluate arbitrary project code during preflight. Existing `app.env` is
60
+ serialized into frozen inputs; use it only for non-secret test configuration. Hashes/ref names are
61
+ not an automatic secret detector or evidence-content redactor.
62
+
63
+ ## Read-only SDK preflight
64
+
65
+ `preflightPortableEnvironment(intent, ports, {signal, timeoutMs})` resolves a self-digested frozen
66
+ profile, validates scope and requested replay mode, and invokes bounded trusted read-only probes.
67
+ Each observation binds the exact profile, execution/attempt/generation, actor and request digest,
68
+ has an observed/expiry time and references host evidence. Unknown/stale/unsupported required
69
+ capabilities block. Optional omissions remain visible. Authorization is checked before target or
70
+ secret metadata. Errors returned by a port are never serialized into the report.
71
+
72
+ The host probes inspect launch/readiness capability and existing target metadata. Preflight never
73
+ starts a server, changes permissions, installs dependencies, issues credentials, creates fixtures,
74
+ resets data, creates tunnels or performs cleanup. Actual post-launch readiness, identity, actions,
75
+ artifact byte verification and cleanup need their own execution receipts. Ready preflight reports
76
+ must be re-admitted under a live lease before effects; they are not reusable permission tokens.
77
+
78
+ Examples of actionable machine output:
79
+
80
+ | Code | Meaning / recovery |
81
+ | --- | --- |
82
+ | `capability_missing` | Install through an already authorized dependency path or choose a provisioned host; do not assume Docker/root. |
83
+ | `persona_credential_missing` | Bind the existing logical secret reference in this host's broker. Never paste the value into a scenario. |
84
+ | `authorization_denied` | Stop before target/secret probing; obtain owner review or select an already authorized target. Do not change permissions automatically. |
85
+ | `network_unknown` | No observed enforcement for this policy; select a host/policy with proof, preserving current restrictions. |
86
+ | `artifacts_missing` | Select an authorized exportable destination before an ephemeral host run. |
87
+ | `probe_binding_mismatch` | Reject stale/cross-run, wrong actor or wrong request evidence; collect a fresh scoped observation. |
88
+ | `preflight_deadline` / `preflight_cancelled` | Stop bounded probes; preserve the blocked report. No execution started. |
89
+
90
+ The report uses `status: ready|blocked`, `exitCode: 0|2`, `checks[]` with request/state/required/
91
+ evidenceRefs/code/recovery, `errors[]`, `execution: not_started` and
92
+ `verificationVerdict: not_evaluated`. CLI `doctor --dir <project> --json` discovers an authoring
93
+ config and reuses the existing compiler and planner; low-level `--config`/`--profile` remain
94
+ supported. Its separate `tracegrove.doctor/v1` report includes selected host/corpus refs,
95
+ source/runtime digests, dependency checks and recovery actions. Compilation writes derived
96
+ files and interpreter version probes may run; the app never starts. Required Chromium executable
97
+ presence is installation metadata, not a tested engine or environment qualification. No portable
98
+ profile execution flag is advertised.
99
+
100
+ ## Environment acceptance and rollout
101
+
102
+ 1. **This slice:** frozen reference-only schemas/templates, bounded SDK probes, negative
103
+ conformance and README first-use checks. Synthetic probe tests establish contract behavior,
104
+ not host support. Independent review must challenge secret/actor separation, stale observations,
105
+ ignored cancellation, scope, startup-versus-staging and security/spend enforcement claims.
106
+ 2. **Native selection/onboarding:** doctor now resolves the existing native authoring/HostPlan
107
+ selection and reports source/runtime/dependency inspection. General portable profile dispatch
108
+ and host-specific missing-ref recovery remain gated; no silent policy downgrade. Repeat the clean API/browser
109
+ first run independently on each actual machine. Mac remains unqualified while offline.
110
+ 3. **External staging:** install a reviewed read-only external-host adapter and existing secret
111
+ broker integration. Prove deployment/endpoint identity and authorized test-persona access;
112
+ fixtures require separately scoped owned synthetic-resource authority. No denied staging retry
113
+ is part of this work. Do not infer support from local notes or Inspector/mock tests.
114
+ 4. **OrgX-triggered/workflow cloud:** bind an actual authorized runner/workspace/lease, discover
115
+ capabilities and enforce budgets/export/cleanup. Reuse existing dispatch ownership; a task
116
+ record is not a running verifier. Add real interruption/interleaving recovery before broader
117
+ resource/provider integration; keep journals/atomic-publication gates open until tested.
118
+
119
+ For every claimed environment retain: clean dependency/runtime install, exact tool/source/build
120
+ and profile pins; setup elapsed time and manual steps (including failures); fresh capability and
121
+ authorization observations; the actual API/browser/client journey with positive/negative
122
+ assertions; verified artifacts exported before ephemeral storage expires; owned-resource cleanup
123
+ readback; and measured cost or explicitly unmeasured infrastructure cost. Preserve failed attempts
124
+ and distinguish preflight, execution, verification and business acceptance. No environment becomes
125
+ supported from templates, schemas, host brand, CI color or prose alone.
126
+
127
+ Current evidence is limited to this Codex Linux cloud's isolated native/API/browser fixtures and
128
+ the hosted Linux sample CI lanes already linked in the release audit. Actual OrgX #3620 proved a
129
+ settings heading, #3614 a method boundary, and #3645 failed receipt lookup with unavailable offline
130
+ workspace/store. None proves full OrgX workflow/client acceptance. Local Docker registry HTTPS
131
+ was refused; hosted CI's Docker success is separate evidence. Claude coding cloud, Hope's Mac,
132
+ OrgX-triggered runtime and authenticated external staging remain unqualified.
133
+
134
+ ## Recorded clean-room onboarding
135
+
136
+ An independent AI reviewer followed only the README at source
137
+ `3894ed6e43b32c0177be03397e22df757405ed6c` in a fresh Linux x86_64 checkout, with a new toolchain,
138
+ dependency tree, cache and sample. Default Node 24.19.0/npm 11.9.0 required the documented optional
139
+ bootstrap to Node 22.23.3/npm 10.9.9. The reviewer preserved PATH/cache across stateless shell
140
+ calls; the README now explicitly recommends one shell session. No source/flow repair or
141
+ undocumented install was needed. Observed setup through bundle verification took 39 seconds,
142
+ including README inspection and orchestration; it is not a benchmark or measured infrastructure cost.
143
+
144
+ Doctor/check, both real notes scenarios, independent API readbacks, stranger 403/empty-list,
145
+ anonymous 401 and deletion 404 assertions passed. Original and copied evidence bundles verified
146
+ with two receipts and no problems. Fixture/process/workspace cleanup was confirmed, with independent
147
+ readback finding both owned process entries and workspaces absent. The private receipt and run are
148
+ retained privately in the saved cloud environment; they are not shipped in npm. One stale “any command” table claim was corrected after review.
149
+ The canonical executed quickstart is unchanged by that documentation correction.
150
+
151
+ The automated README journey separately passed using the existing build/dependencies. Its first
152
+ harness run misread the receipt's `critical` IDs as errors; the corrected harness requires all
153
+ attempted and critical IDs to be confirmed. That initial harness failure receipt is preserved.
154
+ Neither run exercises portable-profile dispatch, a browser, another cloud, Mac, authenticated
155
+ staging or an npm registry installation. Those environment acceptance gates remain open.
@@ -0,0 +1,58 @@
1
+ # Qualification registration and invalidation
2
+
3
+ `registerQualificationRound` creates a sealed pending admission before execution. It requires an exact scenario revision token, a structurally validated definition, its complete frozen selection matrix and fresh leased-state refs. A new campaign and per-cell execution/attempt identities are allocated together with the next monotonic round sequence.
4
+
5
+ The prototype uses `SelectionManifest` as the qualification matrix. Its policy, required case/persona/target strata and exclusions are frozen; the round selection must match them exactly. Every scenario case must retain a required matrix cell. Changed personas/targets, empty or duplicated cells, unexplained exclusions and dropped required cases are refused. The exported `qualificationStrataDigest` uses stable code-unit ordering across hosts.
6
+
7
+ `ScenarioPorts` are trusted host ports, never candidate/plugin inputs. `validateDefinition` must resolve and validate the exact review, replay-contract, matrix, policy and target-profile closure. `compareAndSwap` must atomically verify/reserve the submitted state leases, enforce ownership/fencing/freshness, append the admission and update the projection, or publish none of them. This API does not provision physical state or grant per-cell effects. It does not install that storage adapter.
8
+
9
+ Snapshots include all registered admissions, including rounds still pending or later failed; the admission itself carries no outcome claim. The projection's latest sequence must match complete, scoped, sealed history. Reused campaign/execution/attempt/lease identities and incomplete histories are conflicts. A lease cannot become fresh by changing its revision or digest. An exhausted 500-round prototype history blocks until an authoritative archival index is supplied; it never silently drops earlier registrations.
10
+
11
+ Registration increments aggregate version and latest-round sequence without activating coverage. Any older activation snapshot must therefore conflict even before the newest round completes. Concurrent registration/invalidation uses the same aggregate-version CAS. Losing writers publish no admission and do not advance the epoch.
12
+
13
+ `invalidateScenario` requires a new immutable definition revision of the same scenario, advances the invalidation epoch, clears activation authority and moves coverage to `degraded`. It retains historical round records. Retired coverage cannot be resurrected through this operation. An observed product regression does not itself call semantic invalidation or remove its detecting case.
14
+
15
+ Terminal campaign binding is available through [qualification result reduction](qualification-results.md), followed by [read-only replay assessment](replay-assessment.md) and [explicit activation](scenario-activation.md). [LocalScenarioStore](local-scenario-store.md) supplies durable local registration/invalidation and scoped lease-identity claims on the existing ledger, with required host authority callbacks. Promotion, structural-validation transitions and hosted persistence remain open. A registration record is neither a passing round nor release coverage.
16
+
17
+ ## Executing a registered round
18
+
19
+ The SDK can prepare a new qualification request from an unchanged frozen trial or
20
+ work-proof plan. This creates new sealed request, fidelity and fixture documents;
21
+ it does not read, rewrite or promote trial receipts.
22
+
23
+ ```ts
24
+ const owner = localQualificationExecutionOwner(store, authorizeEffects);
25
+ const qualified = await prepareQualificationExecution(
26
+ frozenPlan, admission.ref, scope, ledger, owner,
27
+ );
28
+ const run = await executeBundle({
29
+ bundle: qualified, scope, ledger, stateDir, qualification: owner,
30
+ });
31
+ ```
32
+
33
+ The store must use this exact ledger and state directory. `authorizeEffects` is a
34
+ trusted host capability checked before host start, fixture creation and each
35
+ forward step. It must establish actual permission to affect the selected target;
36
+ read and registration permission alone do not suffice. The store rechecks current
37
+ definition, invalidation epoch, reviewed closure and physical leases around each
38
+ authorization await. Cleanup remains available after forward permission is revoked.
39
+ External authority synchronization and provider fencing remain host responsibilities.
40
+
41
+ Every cell uses its registered execution and attempt IDs. A single durable claim
42
+ binds the admission to the complete frozen request, independently of caller retry
43
+ keys. Terminal redelivery returns the recorded summary without repeating effects.
44
+ An incomplete claim, including a lost publication acknowledgement, requires
45
+ reconciliation; it never automatically replays preallocated effects. Execution
46
+ directories cannot overwrite existing evidence. The trusted controller must keep
47
+ its ledger and evidence directory inaccessible to candidate processes.
48
+
49
+ Pass resulting bundles to `reduceQualificationRound` with the persisted admission
50
+ resolver and independent issuer authentication. Structural bundle verification
51
+ alone does not establish an authentic qualification result. Local tests use real
52
+ native HTTP effects and durable registration, with explicitly simulated host
53
+ authorization, reviewed-source and physical-lease callbacks.
54
+
55
+ There is no automatic CLI qualification owner. Qualification without an explicit
56
+ runtime owner, a trial disguised with lifecycle refs, and activated regression
57
+ requests remain refused. This SDK path does not activate coverage or prove hosted
58
+ source, issuer, lease provisioning or release authority.
@@ -0,0 +1,59 @@
1
+ # Complete terminal qualification rounds
2
+
3
+ `reduceQualificationRound(ports, { admissionRef, scope, bundleDir })` reads a single verified bundle snapshot and binds its entire campaign to an authentic previously registered admission. It returns a sealed `workflow.qualification-round/v1` document containing the exact admission, campaign and terminal receipt references. Redelivery of identical evidence produces the same result reference and digest.
4
+
5
+ Every selected cell needs exactly one terminal receipt with its preallocated execution and attempt identity. Missing cells, duplicate allocations, substituted scope/campaign/selection/policy/strata, mismatched scenario references and invalid raw evidence are rejected. The bundle reader reapplies the full saved cell and campaign guards, including assertions, identity observations, capture, cleanup and receipt bindings. No caller-supplied success count replaces those checks.
6
+
7
+ The host owns `authorize`, `resolveAdmission` and `authenticateEvidence`. The admission resolver must read authentic persisted registration and reserved state, not accept an imported producer document as registration. Evidence authentication must validate the exact definition/replay/policy/matrix/target closure and issuer/effect authority against the captured bundle manifest digest. A host without those implementations must refuse the operation. Callbacks receive separate copies so mutation cannot rewrite the result being sealed. The reducer publishes no persistence write; a host must store the result with its immutable admission binding and enforce idempotency/conflict handling.
8
+
9
+ Complete failed, blocked, cancelled, inconclusive and mock campaigns remain terminal evidence. A result has neither `qualifies` nor a live proof level. It does not activate coverage. [Replay assessment](replay-assessment.md) derives independent-round readiness, latest-round and epoch checks and policy-specific revision proof. [Explicit activation](scenario-activation.md) supplies an atomic host contract and local journal adapter. A historical terminal result can be retained after invalidation without becoming eligible for current activation.
10
+
11
+ [Registered SDK execution](qualification-registration.md#executing-a-registered-round)
12
+ uses actual persisted admissions and allocated cell identities with an explicit runtime
13
+ owner. Qualification without that owner and activated regression execution remain blocked.
14
+ Older consumer fixtures simulate registration around real observations; they do not prove
15
+ authentic hosted qualification.
16
+
17
+ ## Durable local terminal results
18
+
19
+ `LocalQualificationResults` connects this reducer to the existing `LocalResultSink` and
20
+ `LocalLedger`. It retains a complete immutable bundle before atomically publishing the
21
+ admission-to-round index. It does not create a second archive, database or readiness flag.
22
+
23
+ ```ts
24
+ const results = new LocalQualificationResults(ledger, scope, {
25
+ authorize: authorizeResultRead,
26
+ authorizeRetention: authorizeResultRetention,
27
+ resolveAdmission: (ref, scope) => store.resolveAdmission(ref, scope),
28
+ authenticateEvidence,
29
+ });
30
+ const saved = await results.retain({ admissionRef: admission.ref, scope, bundleDir });
31
+ // Supply this resolver to ReplayAssessmentPorts:
32
+ const resolveRound = (admission) => results.resolveRound(admission);
33
+ ```
34
+
35
+ All authority callbacks are required. Read permission, retention permission and issuer
36
+ authentication are distinct. Registration must come from an authoritative owner; the
37
+ result sink's integrity check does not authenticate a producer. Every historical lookup
38
+ rechecks permission, persisted admission, raw bundle integrity, issuer authentication,
39
+ manifest digest and exact terminal round bindings. Pending work returns null only after
40
+ checking authentic registration. Broken or inaccessible retained evidence raises an error.
41
+
42
+ Both outcomes and raw bytes remain available after the producer's directory is deleted.
43
+ Duplicate and concurrent retention of the same admission/manifest converge on one index
44
+ record. Different bytes under an existing round conflict. The sink accepts an expected
45
+ manifest digest, so bytes changed after issuer authentication cannot claim the campaign
46
+ in the generic index. A crash before index publication
47
+ can leave an integrity-checked generic result, which stays pending as a qualification round;
48
+ retry reconciles it. A lost acknowledgement after publication recovers the original round
49
+ after reopening the ledger. Neither recovery path executes the candidate again.
50
+
51
+ The bounded index permits 500 rounds per scope and requires archival indexing at capacity;
52
+ it never drops failures or pending admissions to make coverage pass. The controller must
53
+ protect the state directory from candidate writes. This is local single-writer storage,
54
+ not distributed fencing, hosted IAM, physical lease provisioning or atomic activation.
55
+ Tests include real registration and native HTTP effects, producer deletion, journal reopen,
56
+ lost publication acknowledgements, concurrent retention, permission/issuer revocation and
57
+ byte replacement across authorization awaits. Two independent real registered campaigns
58
+ feed replay assessment through this index. Host, source, physical-lease and issuer authority
59
+ are explicitly simulated; hosted qualification and release coverage remain unproven.