@adammcarter/use-cases 0.1.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 (704) hide show
  1. package/.agents/skills/migration/SKILL.md +85 -0
  2. package/.agents/skills/showcase/SKILL.md +60 -0
  3. package/.agents/skills/use-cases/SKILL.md +161 -0
  4. package/.agents/skills/walkthrough/SKILL.md +48 -0
  5. package/.claude-plugin/plugin.json +14 -0
  6. package/.codex-plugin/plugin.json +33 -0
  7. package/.mcp.json +8 -0
  8. package/.opencode/plugin/use-cases.js +32 -0
  9. package/CHANGELOG.md +125 -0
  10. package/LICENSE +21 -0
  11. package/README.md +112 -0
  12. package/bootstrap/use-cases.md +60 -0
  13. package/docs/README.md +51 -0
  14. package/docs/acceptance.md +16 -0
  15. package/docs/activation.md +89 -0
  16. package/docs/adr/0001-p0-bootstrap-decisions.md +107 -0
  17. package/docs/adr/0002-p1-schema-contracts.md +136 -0
  18. package/docs/adr/0003-p2-use-case-matrix-contracts.md +67 -0
  19. package/docs/adr/0004-p3-evidence-ledger-contracts.md +85 -0
  20. package/docs/adr/0005-p4-cli-contract.md +70 -0
  21. package/docs/adr/0006-trusted-user-approval-path.md +125 -0
  22. package/docs/cli.md +108 -0
  23. package/docs/data-model.md +56 -0
  24. package/docs/getting-started.md +296 -0
  25. package/docs/hosts.md +30 -0
  26. package/docs/markers-adoption.md +100 -0
  27. package/docs/mcp.md +114 -0
  28. package/docs/migration.md +90 -0
  29. package/docs/reference/error-codes.md +123 -0
  30. package/docs/reference/stability.md +123 -0
  31. package/docs/release.md +26 -0
  32. package/docs/security/ci-hardening.md +144 -0
  33. package/docs/security/key-management.md +158 -0
  34. package/docs/security.md +66 -0
  35. package/docs/showcase.md +39 -0
  36. package/docs/tutorials/python-pytest.md +188 -0
  37. package/examples/basic-product/demo-capsules/product-search.yml +23 -0
  38. package/examples/basic-product/evidence/by-id/ev/evidence-basic-search.jsonl +1 -0
  39. package/examples/basic-product/showcase-runs/run.basic.product.search/events.jsonl +4 -0
  40. package/examples/basic-product/use-cases/product.yml +85 -0
  41. package/examples/basic-product/use-cases.yml +9 -0
  42. package/examples/damaged-product/evidence/broken.jsonl +1 -0
  43. package/examples/damaged-product/use-cases/duplicate-a.yml +28 -0
  44. package/examples/damaged-product/use-cases/duplicate-b.yml +28 -0
  45. package/examples/damaged-product/use-cases/malformed.yml +14 -0
  46. package/examples/damaged-product/use-cases/valid-sibling.yml +28 -0
  47. package/examples/damaged-product/use-cases.yml +9 -0
  48. package/examples/host-projections/use-cases.yml +9 -0
  49. package/examples/python-pytest/README.md +39 -0
  50. package/examples/python-pytest/pytest.ini +8 -0
  51. package/examples/python-pytest/src/coupon.py +32 -0
  52. package/examples/python-pytest/tests/use_cases/example.checkout.apply_coupon_test.py +31 -0
  53. package/examples/python-pytest/use-cases/checkout.yml +47 -0
  54. package/examples/python-pytest/use-cases.yml +19 -0
  55. package/hooks/hooks-codex.json +16 -0
  56. package/hooks/hooks.json +16 -0
  57. package/hooks/session-start +42 -0
  58. package/hosts/claude.yml +29 -0
  59. package/hosts/codex.yml +29 -0
  60. package/hosts/copilot.yml +29 -0
  61. package/hosts/opencode.yml +29 -0
  62. package/package.json +81 -0
  63. package/packages/cli/README.md +37 -0
  64. package/packages/cli/dist/args/parse.d.ts +6 -0
  65. package/packages/cli/dist/args/parse.d.ts.map +1 -0
  66. package/packages/cli/dist/args/parse.js +55 -0
  67. package/packages/cli/dist/args/parse.js.map +1 -0
  68. package/packages/cli/dist/args/validate.d.ts +3 -0
  69. package/packages/cli/dist/args/validate.d.ts.map +1 -0
  70. package/packages/cli/dist/args/validate.js +80 -0
  71. package/packages/cli/dist/args/validate.js.map +1 -0
  72. package/packages/cli/dist/builtins.d.ts +2 -0
  73. package/packages/cli/dist/builtins.d.ts.map +1 -0
  74. package/packages/cli/dist/builtins.js +235 -0
  75. package/packages/cli/dist/builtins.js.map +1 -0
  76. package/packages/cli/dist/command/dispatch.d.ts +4 -0
  77. package/packages/cli/dist/command/dispatch.d.ts.map +1 -0
  78. package/packages/cli/dist/command/dispatch.js +45 -0
  79. package/packages/cli/dist/command/dispatch.js.map +1 -0
  80. package/packages/cli/dist/command/help-catalog.d.ts +13 -0
  81. package/packages/cli/dist/command/help-catalog.d.ts.map +1 -0
  82. package/packages/cli/dist/command/help-catalog.js +42 -0
  83. package/packages/cli/dist/command/help-catalog.js.map +1 -0
  84. package/packages/cli/dist/command/registry.d.ts +3 -0
  85. package/packages/cli/dist/command/registry.d.ts.map +1 -0
  86. package/packages/cli/dist/command/registry.js +33 -0
  87. package/packages/cli/dist/command/registry.js.map +1 -0
  88. package/packages/cli/dist/command/types.d.ts +32 -0
  89. package/packages/cli/dist/command/types.d.ts.map +1 -0
  90. package/packages/cli/dist/command/types.js +6 -0
  91. package/packages/cli/dist/command/types.js.map +1 -0
  92. package/packages/cli/dist/commands/capsule.d.ts +7 -0
  93. package/packages/cli/dist/commands/capsule.d.ts.map +1 -0
  94. package/packages/cli/dist/commands/capsule.js +178 -0
  95. package/packages/cli/dist/commands/capsule.js.map +1 -0
  96. package/packages/cli/dist/commands/common.d.ts +7 -0
  97. package/packages/cli/dist/commands/common.d.ts.map +1 -0
  98. package/packages/cli/dist/commands/common.js +32 -0
  99. package/packages/cli/dist/commands/common.js.map +1 -0
  100. package/packages/cli/dist/commands/doctor.d.ts +6 -0
  101. package/packages/cli/dist/commands/doctor.d.ts.map +1 -0
  102. package/packages/cli/dist/commands/doctor.js +133 -0
  103. package/packages/cli/dist/commands/doctor.js.map +1 -0
  104. package/packages/cli/dist/commands/evidence.d.ts +6 -0
  105. package/packages/cli/dist/commands/evidence.d.ts.map +1 -0
  106. package/packages/cli/dist/commands/evidence.js +191 -0
  107. package/packages/cli/dist/commands/evidence.js.map +1 -0
  108. package/packages/cli/dist/commands/host.d.ts +6 -0
  109. package/packages/cli/dist/commands/host.d.ts.map +1 -0
  110. package/packages/cli/dist/commands/host.js +180 -0
  111. package/packages/cli/dist/commands/host.js.map +1 -0
  112. package/packages/cli/dist/commands/keygen.d.ts +4 -0
  113. package/packages/cli/dist/commands/keygen.d.ts.map +1 -0
  114. package/packages/cli/dist/commands/keygen.js +132 -0
  115. package/packages/cli/dist/commands/keygen.js.map +1 -0
  116. package/packages/cli/dist/commands/markers.d.ts +8 -0
  117. package/packages/cli/dist/commands/markers.d.ts.map +1 -0
  118. package/packages/cli/dist/commands/markers.js +455 -0
  119. package/packages/cli/dist/commands/markers.js.map +1 -0
  120. package/packages/cli/dist/commands/matrix.d.ts +8 -0
  121. package/packages/cli/dist/commands/matrix.d.ts.map +1 -0
  122. package/packages/cli/dist/commands/matrix.js +237 -0
  123. package/packages/cli/dist/commands/matrix.js.map +1 -0
  124. package/packages/cli/dist/commands/migrate.d.ts +4 -0
  125. package/packages/cli/dist/commands/migrate.d.ts.map +1 -0
  126. package/packages/cli/dist/commands/migrate.js +82 -0
  127. package/packages/cli/dist/commands/migrate.js.map +1 -0
  128. package/packages/cli/dist/commands/plan.d.ts +6 -0
  129. package/packages/cli/dist/commands/plan.d.ts.map +1 -0
  130. package/packages/cli/dist/commands/plan.js +129 -0
  131. package/packages/cli/dist/commands/plan.js.map +1 -0
  132. package/packages/cli/dist/commands/recover.d.ts +4 -0
  133. package/packages/cli/dist/commands/recover.d.ts.map +1 -0
  134. package/packages/cli/dist/commands/recover.js +352 -0
  135. package/packages/cli/dist/commands/recover.js.map +1 -0
  136. package/packages/cli/dist/commands/schema.d.ts +5 -0
  137. package/packages/cli/dist/commands/schema.d.ts.map +1 -0
  138. package/packages/cli/dist/commands/schema.js +51 -0
  139. package/packages/cli/dist/commands/schema.js.map +1 -0
  140. package/packages/cli/dist/commands/showcase.d.ts +14 -0
  141. package/packages/cli/dist/commands/showcase.d.ts.map +1 -0
  142. package/packages/cli/dist/commands/showcase.js +638 -0
  143. package/packages/cli/dist/commands/showcase.js.map +1 -0
  144. package/packages/cli/dist/commands/workflow.d.ts +5 -0
  145. package/packages/cli/dist/commands/workflow.d.ts.map +1 -0
  146. package/packages/cli/dist/commands/workflow.js +107 -0
  147. package/packages/cli/dist/commands/workflow.js.map +1 -0
  148. package/packages/cli/dist/coreLoader.d.ts +6 -0
  149. package/packages/cli/dist/coreLoader.d.ts.map +1 -0
  150. package/packages/cli/dist/coreLoader.js +34 -0
  151. package/packages/cli/dist/coreLoader.js.map +1 -0
  152. package/packages/cli/dist/index.d.ts +5 -0
  153. package/packages/cli/dist/index.d.ts.map +1 -0
  154. package/packages/cli/dist/index.js +83 -0
  155. package/packages/cli/dist/index.js.map +1 -0
  156. package/packages/cli/dist/render.d.ts +2 -0
  157. package/packages/cli/dist/render.d.ts.map +1 -0
  158. package/packages/cli/dist/render.js +88 -0
  159. package/packages/cli/dist/render.js.map +1 -0
  160. package/packages/cli/dist/runtime.d.ts +25 -0
  161. package/packages/cli/dist/runtime.d.ts.map +1 -0
  162. package/packages/cli/dist/runtime.js +89 -0
  163. package/packages/cli/dist/runtime.js.map +1 -0
  164. package/packages/cli/package.json +38 -0
  165. package/packages/core/README.md +37 -0
  166. package/packages/core/dist/capsules/index.d.ts +4 -0
  167. package/packages/core/dist/capsules/index.d.ts.map +1 -0
  168. package/packages/core/dist/capsules/index.js +4 -0
  169. package/packages/core/dist/capsules/index.js.map +1 -0
  170. package/packages/core/dist/capsules/loadCapsule.d.ts +11 -0
  171. package/packages/core/dist/capsules/loadCapsule.d.ts.map +1 -0
  172. package/packages/core/dist/capsules/loadCapsule.js +167 -0
  173. package/packages/core/dist/capsules/loadCapsule.js.map +1 -0
  174. package/packages/core/dist/capsules/runCapsule.d.ts +3 -0
  175. package/packages/core/dist/capsules/runCapsule.d.ts.map +1 -0
  176. package/packages/core/dist/capsules/runCapsule.js +333 -0
  177. package/packages/core/dist/capsules/runCapsule.js.map +1 -0
  178. package/packages/core/dist/capsules/types.d.ts +106 -0
  179. package/packages/core/dist/capsules/types.d.ts.map +1 -0
  180. package/packages/core/dist/capsules/types.js +2 -0
  181. package/packages/core/dist/capsules/types.js.map +1 -0
  182. package/packages/core/dist/durableWrite.d.ts +2 -0
  183. package/packages/core/dist/durableWrite.d.ts.map +1 -0
  184. package/packages/core/dist/durableWrite.js +34 -0
  185. package/packages/core/dist/durableWrite.js.map +1 -0
  186. package/packages/core/dist/errors/registry.d.ts +122 -0
  187. package/packages/core/dist/errors/registry.d.ts.map +1 -0
  188. package/packages/core/dist/errors/registry.js +206 -0
  189. package/packages/core/dist/errors/registry.js.map +1 -0
  190. package/packages/core/dist/errors/render.d.ts +3 -0
  191. package/packages/core/dist/errors/render.d.ts.map +1 -0
  192. package/packages/core/dist/errors/render.js +64 -0
  193. package/packages/core/dist/errors/render.js.map +1 -0
  194. package/packages/core/dist/errors.d.ts +5 -0
  195. package/packages/core/dist/errors.d.ts.map +1 -0
  196. package/packages/core/dist/errors.js +9 -0
  197. package/packages/core/dist/errors.js.map +1 -0
  198. package/packages/core/dist/evidence/appendEvidenceEvent.d.ts +27 -0
  199. package/packages/core/dist/evidence/appendEvidenceEvent.d.ts.map +1 -0
  200. package/packages/core/dist/evidence/appendEvidenceEvent.js +218 -0
  201. package/packages/core/dist/evidence/appendEvidenceEvent.js.map +1 -0
  202. package/packages/core/dist/evidence/assurance.d.ts +18 -0
  203. package/packages/core/dist/evidence/assurance.d.ts.map +1 -0
  204. package/packages/core/dist/evidence/assurance.js +38 -0
  205. package/packages/core/dist/evidence/assurance.js.map +1 -0
  206. package/packages/core/dist/evidence/index.d.ts +8 -0
  207. package/packages/core/dist/evidence/index.d.ts.map +1 -0
  208. package/packages/core/dist/evidence/index.js +8 -0
  209. package/packages/core/dist/evidence/index.js.map +1 -0
  210. package/packages/core/dist/evidence/jsonlLedger.d.ts +13 -0
  211. package/packages/core/dist/evidence/jsonlLedger.d.ts.map +1 -0
  212. package/packages/core/dist/evidence/jsonlLedger.js +171 -0
  213. package/packages/core/dist/evidence/jsonlLedger.js.map +1 -0
  214. package/packages/core/dist/evidence/linkEvidence.d.ts +4 -0
  215. package/packages/core/dist/evidence/linkEvidence.d.ts.map +1 -0
  216. package/packages/core/dist/evidence/linkEvidence.js +53 -0
  217. package/packages/core/dist/evidence/linkEvidence.js.map +1 -0
  218. package/packages/core/dist/evidence/replayEvidence.d.ts +6 -0
  219. package/packages/core/dist/evidence/replayEvidence.d.ts.map +1 -0
  220. package/packages/core/dist/evidence/replayEvidence.js +216 -0
  221. package/packages/core/dist/evidence/replayEvidence.js.map +1 -0
  222. package/packages/core/dist/evidence/results.d.ts +4 -0
  223. package/packages/core/dist/evidence/results.d.ts.map +1 -0
  224. package/packages/core/dist/evidence/results.js +32 -0
  225. package/packages/core/dist/evidence/results.js.map +1 -0
  226. package/packages/core/dist/evidence/types.d.ts +149 -0
  227. package/packages/core/dist/evidence/types.d.ts.map +1 -0
  228. package/packages/core/dist/evidence/types.js +2 -0
  229. package/packages/core/dist/evidence/types.js.map +1 -0
  230. package/packages/core/dist/host-profiles/claude.yml +29 -0
  231. package/packages/core/dist/host-profiles/codex.yml +29 -0
  232. package/packages/core/dist/host-profiles/copilot.yml +29 -0
  233. package/packages/core/dist/host-profiles/opencode.yml +29 -0
  234. package/packages/core/dist/hosts/conformanceStatus.d.ts +16 -0
  235. package/packages/core/dist/hosts/conformanceStatus.d.ts.map +1 -0
  236. package/packages/core/dist/hosts/conformanceStatus.js +160 -0
  237. package/packages/core/dist/hosts/conformanceStatus.js.map +1 -0
  238. package/packages/core/dist/hosts/index.d.ts +5 -0
  239. package/packages/core/dist/hosts/index.d.ts.map +1 -0
  240. package/packages/core/dist/hosts/index.js +5 -0
  241. package/packages/core/dist/hosts/index.js.map +1 -0
  242. package/packages/core/dist/hosts/loadHostProfile.d.ts +6 -0
  243. package/packages/core/dist/hosts/loadHostProfile.d.ts.map +1 -0
  244. package/packages/core/dist/hosts/loadHostProfile.js +41 -0
  245. package/packages/core/dist/hosts/loadHostProfile.js.map +1 -0
  246. package/packages/core/dist/hosts/projectHostFiles.d.ts +16 -0
  247. package/packages/core/dist/hosts/projectHostFiles.d.ts.map +1 -0
  248. package/packages/core/dist/hosts/projectHostFiles.js +272 -0
  249. package/packages/core/dist/hosts/projectHostFiles.js.map +1 -0
  250. package/packages/core/dist/hosts/types.d.ts +122 -0
  251. package/packages/core/dist/hosts/types.d.ts.map +1 -0
  252. package/packages/core/dist/hosts/types.js +2 -0
  253. package/packages/core/dist/hosts/types.js.map +1 -0
  254. package/packages/core/dist/index.d.ts +26 -0
  255. package/packages/core/dist/index.d.ts.map +1 -0
  256. package/packages/core/dist/index.js +31 -0
  257. package/packages/core/dist/index.js.map +1 -0
  258. package/packages/core/dist/init/index.d.ts +2 -0
  259. package/packages/core/dist/init/index.d.ts.map +1 -0
  260. package/packages/core/dist/init/index.js +3 -0
  261. package/packages/core/dist/init/index.js.map +1 -0
  262. package/packages/core/dist/init/scaffold.d.ts +28 -0
  263. package/packages/core/dist/init/scaffold.d.ts.map +1 -0
  264. package/packages/core/dist/init/scaffold.js +293 -0
  265. package/packages/core/dist/init/scaffold.js.map +1 -0
  266. package/packages/core/dist/markers/appendOnly.d.ts +23 -0
  267. package/packages/core/dist/markers/appendOnly.d.ts.map +1 -0
  268. package/packages/core/dist/markers/appendOnly.js +75 -0
  269. package/packages/core/dist/markers/appendOnly.js.map +1 -0
  270. package/packages/core/dist/markers/bindingSetHash.d.ts +28 -0
  271. package/packages/core/dist/markers/bindingSetHash.d.ts.map +1 -0
  272. package/packages/core/dist/markers/bindingSetHash.js +33 -0
  273. package/packages/core/dist/markers/bindingSetHash.js.map +1 -0
  274. package/packages/core/dist/markers/canonicalJson.d.ts +4 -0
  275. package/packages/core/dist/markers/canonicalJson.d.ts.map +1 -0
  276. package/packages/core/dist/markers/canonicalJson.js +51 -0
  277. package/packages/core/dist/markers/canonicalJson.js.map +1 -0
  278. package/packages/core/dist/markers/ciAuthority.d.ts +17 -0
  279. package/packages/core/dist/markers/ciAuthority.d.ts.map +1 -0
  280. package/packages/core/dist/markers/ciAuthority.js +131 -0
  281. package/packages/core/dist/markers/ciAuthority.js.map +1 -0
  282. package/packages/core/dist/markers/cli/bind.d.ts +48 -0
  283. package/packages/core/dist/markers/cli/bind.d.ts.map +1 -0
  284. package/packages/core/dist/markers/cli/bind.js +198 -0
  285. package/packages/core/dist/markers/cli/bind.js.map +1 -0
  286. package/packages/core/dist/markers/cli/index.d.ts +9 -0
  287. package/packages/core/dist/markers/cli/index.d.ts.map +1 -0
  288. package/packages/core/dist/markers/cli/index.js +15 -0
  289. package/packages/core/dist/markers/cli/index.js.map +1 -0
  290. package/packages/core/dist/markers/cli/io.d.ts +18 -0
  291. package/packages/core/dist/markers/cli/io.d.ts.map +1 -0
  292. package/packages/core/dist/markers/cli/io.js +62 -0
  293. package/packages/core/dist/markers/cli/io.js.map +1 -0
  294. package/packages/core/dist/markers/cli/precommit.d.ts +32 -0
  295. package/packages/core/dist/markers/cli/precommit.d.ts.map +1 -0
  296. package/packages/core/dist/markers/cli/precommit.js +174 -0
  297. package/packages/core/dist/markers/cli/precommit.js.map +1 -0
  298. package/packages/core/dist/markers/cli/prove.d.ts +69 -0
  299. package/packages/core/dist/markers/cli/prove.d.ts.map +1 -0
  300. package/packages/core/dist/markers/cli/prove.js +381 -0
  301. package/packages/core/dist/markers/cli/prove.js.map +1 -0
  302. package/packages/core/dist/markers/cli/scan.d.ts +63 -0
  303. package/packages/core/dist/markers/cli/scan.d.ts.map +1 -0
  304. package/packages/core/dist/markers/cli/scan.js +233 -0
  305. package/packages/core/dist/markers/cli/scan.js.map +1 -0
  306. package/packages/core/dist/markers/cli/shared.d.ts +25 -0
  307. package/packages/core/dist/markers/cli/shared.d.ts.map +1 -0
  308. package/packages/core/dist/markers/cli/shared.js +123 -0
  309. package/packages/core/dist/markers/cli/shared.js.map +1 -0
  310. package/packages/core/dist/markers/cli/validateLedger.d.ts +38 -0
  311. package/packages/core/dist/markers/cli/validateLedger.d.ts.map +1 -0
  312. package/packages/core/dist/markers/cli/validateLedger.js +81 -0
  313. package/packages/core/dist/markers/cli/validateLedger.js.map +1 -0
  314. package/packages/core/dist/markers/cli/verify.d.ts +65 -0
  315. package/packages/core/dist/markers/cli/verify.d.ts.map +1 -0
  316. package/packages/core/dist/markers/cli/verify.js +245 -0
  317. package/packages/core/dist/markers/cli/verify.js.map +1 -0
  318. package/packages/core/dist/markers/commentPrefix.d.ts +7 -0
  319. package/packages/core/dist/markers/commentPrefix.d.ts.map +1 -0
  320. package/packages/core/dist/markers/commentPrefix.js +79 -0
  321. package/packages/core/dist/markers/commentPrefix.js.map +1 -0
  322. package/packages/core/dist/markers/constants.d.ts +10 -0
  323. package/packages/core/dist/markers/constants.d.ts.map +1 -0
  324. package/packages/core/dist/markers/constants.js +13 -0
  325. package/packages/core/dist/markers/constants.js.map +1 -0
  326. package/packages/core/dist/markers/evidenceLedger.d.ts +150 -0
  327. package/packages/core/dist/markers/evidenceLedger.d.ts.map +1 -0
  328. package/packages/core/dist/markers/evidenceLedger.js +391 -0
  329. package/packages/core/dist/markers/evidenceLedger.js.map +1 -0
  330. package/packages/core/dist/markers/freshness.d.ts +125 -0
  331. package/packages/core/dist/markers/freshness.d.ts.map +1 -0
  332. package/packages/core/dist/markers/freshness.js +605 -0
  333. package/packages/core/dist/markers/freshness.js.map +1 -0
  334. package/packages/core/dist/markers/index.d.ts +26 -0
  335. package/packages/core/dist/markers/index.d.ts.map +1 -0
  336. package/packages/core/dist/markers/index.js +38 -0
  337. package/packages/core/dist/markers/index.js.map +1 -0
  338. package/packages/core/dist/markers/keygen.d.ts +6 -0
  339. package/packages/core/dist/markers/keygen.d.ts.map +1 -0
  340. package/packages/core/dist/markers/keygen.js +18 -0
  341. package/packages/core/dist/markers/keygen.js.map +1 -0
  342. package/packages/core/dist/markers/keyring.d.ts +23 -0
  343. package/packages/core/dist/markers/keyring.d.ts.map +1 -0
  344. package/packages/core/dist/markers/keyring.js +93 -0
  345. package/packages/core/dist/markers/keyring.js.map +1 -0
  346. package/packages/core/dist/markers/markerLine.d.ts +35 -0
  347. package/packages/core/dist/markers/markerLine.d.ts.map +1 -0
  348. package/packages/core/dist/markers/markerLine.js +125 -0
  349. package/packages/core/dist/markers/markerLine.js.map +1 -0
  350. package/packages/core/dist/markers/physicalLines.d.ts +10 -0
  351. package/packages/core/dist/markers/physicalLines.d.ts.map +1 -0
  352. package/packages/core/dist/markers/physicalLines.js +48 -0
  353. package/packages/core/dist/markers/physicalLines.js.map +1 -0
  354. package/packages/core/dist/markers/policyHash.d.ts +4 -0
  355. package/packages/core/dist/markers/policyHash.d.ts.map +1 -0
  356. package/packages/core/dist/markers/policyHash.js +14 -0
  357. package/packages/core/dist/markers/policyHash.js.map +1 -0
  358. package/packages/core/dist/markers/proofSignature.d.ts +29 -0
  359. package/packages/core/dist/markers/proofSignature.d.ts.map +1 -0
  360. package/packages/core/dist/markers/proofSignature.js +106 -0
  361. package/packages/core/dist/markers/proofSignature.js.map +1 -0
  362. package/packages/core/dist/markers/reconcile.d.ts +26 -0
  363. package/packages/core/dist/markers/reconcile.d.ts.map +1 -0
  364. package/packages/core/dist/markers/reconcile.js +52 -0
  365. package/packages/core/dist/markers/reconcile.js.map +1 -0
  366. package/packages/core/dist/markers/registry.d.ts +53 -0
  367. package/packages/core/dist/markers/registry.d.ts.map +1 -0
  368. package/packages/core/dist/markers/registry.js +161 -0
  369. package/packages/core/dist/markers/registry.js.map +1 -0
  370. package/packages/core/dist/markers/rowHash.d.ts +2 -0
  371. package/packages/core/dist/markers/rowHash.d.ts.map +1 -0
  372. package/packages/core/dist/markers/rowHash.js +10 -0
  373. package/packages/core/dist/markers/rowHash.js.map +1 -0
  374. package/packages/core/dist/markers/scanner.d.ts +67 -0
  375. package/packages/core/dist/markers/scanner.d.ts.map +1 -0
  376. package/packages/core/dist/markers/scanner.js +292 -0
  377. package/packages/core/dist/markers/scanner.js.map +1 -0
  378. package/packages/core/dist/markers/schemas/binding-registry-event.schema.json +41 -0
  379. package/packages/core/dist/markers/schemas/freshness-status.schema.json +134 -0
  380. package/packages/core/dist/markers/schemas/proof-event.schema.json +170 -0
  381. package/packages/core/dist/markers/spanCanon.d.ts +4 -0
  382. package/packages/core/dist/markers/spanCanon.d.ts.map +1 -0
  383. package/packages/core/dist/markers/spanCanon.js +42 -0
  384. package/packages/core/dist/markers/spanCanon.js.map +1 -0
  385. package/packages/core/dist/markers/swiftFuncRecognizer.d.ts +36 -0
  386. package/packages/core/dist/markers/swiftFuncRecognizer.d.ts.map +1 -0
  387. package/packages/core/dist/markers/swiftFuncRecognizer.js +638 -0
  388. package/packages/core/dist/markers/swiftFuncRecognizer.js.map +1 -0
  389. package/packages/core/dist/markers/validators.d.ts +13 -0
  390. package/packages/core/dist/markers/validators.d.ts.map +1 -0
  391. package/packages/core/dist/markers/validators.js +64 -0
  392. package/packages/core/dist/markers/validators.js.map +1 -0
  393. package/packages/core/dist/markers/verificationContextHash.d.ts +23 -0
  394. package/packages/core/dist/markers/verificationContextHash.d.ts.map +1 -0
  395. package/packages/core/dist/markers/verificationContextHash.js +96 -0
  396. package/packages/core/dist/markers/verificationContextHash.js.map +1 -0
  397. package/packages/core/dist/markers/verifierPresets.d.ts +18 -0
  398. package/packages/core/dist/markers/verifierPresets.d.ts.map +1 -0
  399. package/packages/core/dist/markers/verifierPresets.js +71 -0
  400. package/packages/core/dist/markers/verifierPresets.js.map +1 -0
  401. package/packages/core/dist/markers/verifierResolver.d.ts +27 -0
  402. package/packages/core/dist/markers/verifierResolver.d.ts.map +1 -0
  403. package/packages/core/dist/markers/verifierResolver.js +151 -0
  404. package/packages/core/dist/markers/verifierResolver.js.map +1 -0
  405. package/packages/core/dist/migration/index.d.ts +2 -0
  406. package/packages/core/dist/migration/index.d.ts.map +1 -0
  407. package/packages/core/dist/migration/index.js +2 -0
  408. package/packages/core/dist/migration/index.js.map +1 -0
  409. package/packages/core/dist/migration/testMatrix.d.ts +42 -0
  410. package/packages/core/dist/migration/testMatrix.d.ts.map +1 -0
  411. package/packages/core/dist/migration/testMatrix.js +351 -0
  412. package/packages/core/dist/migration/testMatrix.js.map +1 -0
  413. package/packages/core/dist/package/index.d.ts +2 -0
  414. package/packages/core/dist/package/index.d.ts.map +1 -0
  415. package/packages/core/dist/package/index.js +2 -0
  416. package/packages/core/dist/package/index.js.map +1 -0
  417. package/packages/core/dist/package/inspectPackage.d.ts +67 -0
  418. package/packages/core/dist/package/inspectPackage.d.ts.map +1 -0
  419. package/packages/core/dist/package/inspectPackage.js +371 -0
  420. package/packages/core/dist/package/inspectPackage.js.map +1 -0
  421. package/packages/core/dist/presentation/candidates.d.ts +13 -0
  422. package/packages/core/dist/presentation/candidates.d.ts.map +1 -0
  423. package/packages/core/dist/presentation/candidates.js +86 -0
  424. package/packages/core/dist/presentation/candidates.js.map +1 -0
  425. package/packages/core/dist/presentation/index.d.ts +8 -0
  426. package/packages/core/dist/presentation/index.d.ts.map +1 -0
  427. package/packages/core/dist/presentation/index.js +8 -0
  428. package/packages/core/dist/presentation/index.js.map +1 -0
  429. package/packages/core/dist/presentation/items.d.ts +18 -0
  430. package/packages/core/dist/presentation/items.d.ts.map +1 -0
  431. package/packages/core/dist/presentation/items.js +228 -0
  432. package/packages/core/dist/presentation/items.js.map +1 -0
  433. package/packages/core/dist/presentation/ordering.d.ts +8 -0
  434. package/packages/core/dist/presentation/ordering.d.ts.map +1 -0
  435. package/packages/core/dist/presentation/ordering.js +31 -0
  436. package/packages/core/dist/presentation/ordering.js.map +1 -0
  437. package/packages/core/dist/presentation/planHelpers.d.ts +26 -0
  438. package/packages/core/dist/presentation/planHelpers.d.ts.map +1 -0
  439. package/packages/core/dist/presentation/planHelpers.js +62 -0
  440. package/packages/core/dist/presentation/planHelpers.js.map +1 -0
  441. package/packages/core/dist/presentation/presentationFormat.d.ts +39 -0
  442. package/packages/core/dist/presentation/presentationFormat.d.ts.map +1 -0
  443. package/packages/core/dist/presentation/presentationFormat.js +58 -0
  444. package/packages/core/dist/presentation/presentationFormat.js.map +1 -0
  445. package/packages/core/dist/presentation/renderCard.d.ts +37 -0
  446. package/packages/core/dist/presentation/renderCard.d.ts.map +1 -0
  447. package/packages/core/dist/presentation/renderCard.js +129 -0
  448. package/packages/core/dist/presentation/renderCard.js.map +1 -0
  449. package/packages/core/dist/presentation/scoring.d.ts +10 -0
  450. package/packages/core/dist/presentation/scoring.d.ts.map +1 -0
  451. package/packages/core/dist/presentation/scoring.js +82 -0
  452. package/packages/core/dist/presentation/scoring.js.map +1 -0
  453. package/packages/core/dist/presentation/selectPlan.d.ts +4 -0
  454. package/packages/core/dist/presentation/selectPlan.d.ts.map +1 -0
  455. package/packages/core/dist/presentation/selectPlan.js +122 -0
  456. package/packages/core/dist/presentation/selectPlan.js.map +1 -0
  457. package/packages/core/dist/presentation/selectShowcasePlan.d.ts +3 -0
  458. package/packages/core/dist/presentation/selectShowcasePlan.d.ts.map +1 -0
  459. package/packages/core/dist/presentation/selectShowcasePlan.js +6 -0
  460. package/packages/core/dist/presentation/selectShowcasePlan.js.map +1 -0
  461. package/packages/core/dist/presentation/selectWalkthroughPlan.d.ts +3 -0
  462. package/packages/core/dist/presentation/selectWalkthroughPlan.d.ts.map +1 -0
  463. package/packages/core/dist/presentation/selectWalkthroughPlan.js +6 -0
  464. package/packages/core/dist/presentation/selectWalkthroughPlan.js.map +1 -0
  465. package/packages/core/dist/presentation/selection.d.ts +7 -0
  466. package/packages/core/dist/presentation/selection.d.ts.map +1 -0
  467. package/packages/core/dist/presentation/selection.js +20 -0
  468. package/packages/core/dist/presentation/selection.js.map +1 -0
  469. package/packages/core/dist/presentation/snapshot.d.ts +12 -0
  470. package/packages/core/dist/presentation/snapshot.d.ts.map +1 -0
  471. package/packages/core/dist/presentation/snapshot.js +53 -0
  472. package/packages/core/dist/presentation/snapshot.js.map +1 -0
  473. package/packages/core/dist/presentation/types.d.ts +172 -0
  474. package/packages/core/dist/presentation/types.d.ts.map +1 -0
  475. package/packages/core/dist/presentation/types.js +2 -0
  476. package/packages/core/dist/presentation/types.js.map +1 -0
  477. package/packages/core/dist/redact.d.ts +11 -0
  478. package/packages/core/dist/redact.d.ts.map +1 -0
  479. package/packages/core/dist/redact.js +17 -0
  480. package/packages/core/dist/redact.js.map +1 -0
  481. package/packages/core/dist/roots.d.ts +81 -0
  482. package/packages/core/dist/roots.d.ts.map +1 -0
  483. package/packages/core/dist/roots.js +220 -0
  484. package/packages/core/dist/roots.js.map +1 -0
  485. package/packages/core/dist/schema/cliResult.d.ts +34 -0
  486. package/packages/core/dist/schema/cliResult.d.ts.map +1 -0
  487. package/packages/core/dist/schema/cliResult.js +35 -0
  488. package/packages/core/dist/schema/cliResult.js.map +1 -0
  489. package/packages/core/dist/schema/diagnostic.d.ts +26 -0
  490. package/packages/core/dist/schema/diagnostic.d.ts.map +1 -0
  491. package/packages/core/dist/schema/diagnostic.js +28 -0
  492. package/packages/core/dist/schema/diagnostic.js.map +1 -0
  493. package/packages/core/dist/schema/index.d.ts +8 -0
  494. package/packages/core/dist/schema/index.d.ts.map +1 -0
  495. package/packages/core/dist/schema/index.js +9 -0
  496. package/packages/core/dist/schema/index.js.map +1 -0
  497. package/packages/core/dist/schema/registry.d.ts +15 -0
  498. package/packages/core/dist/schema/registry.d.ts.map +1 -0
  499. package/packages/core/dist/schema/registry.js +206 -0
  500. package/packages/core/dist/schema/registry.js.map +1 -0
  501. package/packages/core/dist/schema/syntheticContracts.d.ts +3 -0
  502. package/packages/core/dist/schema/syntheticContracts.d.ts.map +1 -0
  503. package/packages/core/dist/schema/syntheticContracts.js +342 -0
  504. package/packages/core/dist/schema/syntheticContracts.js.map +1 -0
  505. package/packages/core/dist/schema/validate.d.ts +21 -0
  506. package/packages/core/dist/schema/validate.d.ts.map +1 -0
  507. package/packages/core/dist/schema/validate.js +210 -0
  508. package/packages/core/dist/schema/validate.js.map +1 -0
  509. package/packages/core/dist/schemas/v1/authority.schema.json +70 -0
  510. package/packages/core/dist/schemas/v1/cli-result.schema.json +30 -0
  511. package/packages/core/dist/schemas/v1/common.schema.json +274 -0
  512. package/packages/core/dist/schemas/v1/demo-capsule.schema.json +78 -0
  513. package/packages/core/dist/schemas/v1/evidence-append-result.schema.json +14 -0
  514. package/packages/core/dist/schemas/v1/evidence-event.schema.json +181 -0
  515. package/packages/core/dist/schemas/v1/evidence-status-result.schema.json +68 -0
  516. package/packages/core/dist/schemas/v1/host-profile.schema.json +94 -0
  517. package/packages/core/dist/schemas/v1/host-status-result.schema.json +49 -0
  518. package/packages/core/dist/schemas/v1/keyring.schema.json +77 -0
  519. package/packages/core/dist/schemas/v1/ledger.schema.json +99 -0
  520. package/packages/core/dist/schemas/v1/marker.schema.json +84 -0
  521. package/packages/core/dist/schemas/v1/matrix-list-result.schema.json +67 -0
  522. package/packages/core/dist/schemas/v1/matrix-mutation-result.schema.json +49 -0
  523. package/packages/core/dist/schemas/v1/matrix-validation-result.schema.json +77 -0
  524. package/packages/core/dist/schemas/v1/mcp-tool-results.schema.json +34 -0
  525. package/packages/core/dist/schemas/v1/migration-test-matrix-result.schema.json +76 -0
  526. package/packages/core/dist/schemas/v1/presentation-plan-result.schema.json +62 -0
  527. package/packages/core/dist/schemas/v1/presentation-plan.schema.json +259 -0
  528. package/packages/core/dist/schemas/v1/release-gate-result.schema.json +136 -0
  529. package/packages/core/dist/schemas/v1/showcase-approval-result.schema.json +5 -0
  530. package/packages/core/dist/schemas/v1/showcase-event-append-result.schema.json +17 -0
  531. package/packages/core/dist/schemas/v1/showcase-event.schema.json +235 -0
  532. package/packages/core/dist/schemas/v1/showcase-finish-result.schema.json +5 -0
  533. package/packages/core/dist/schemas/v1/showcase-run-status-result.schema.json +70 -0
  534. package/packages/core/dist/schemas/v1/showcase-start-result.schema.json +5 -0
  535. package/packages/core/dist/schemas/v1/use-case-file.schema.json +178 -0
  536. package/packages/core/dist/schemas/v1/workflow-mode.schema.json +16 -0
  537. package/packages/core/dist/schemas/v1/workspace-config.schema.json +58 -0
  538. package/packages/core/dist/showcase/appendShowcaseEvent.d.ts +116 -0
  539. package/packages/core/dist/showcase/appendShowcaseEvent.d.ts.map +1 -0
  540. package/packages/core/dist/showcase/appendShowcaseEvent.js +353 -0
  541. package/packages/core/dist/showcase/appendShowcaseEvent.js.map +1 -0
  542. package/packages/core/dist/showcase/approval.d.ts +2 -0
  543. package/packages/core/dist/showcase/approval.d.ts.map +1 -0
  544. package/packages/core/dist/showcase/approval.js +2 -0
  545. package/packages/core/dist/showcase/approval.js.map +1 -0
  546. package/packages/core/dist/showcase/approvalAuthority.d.ts +19 -0
  547. package/packages/core/dist/showcase/approvalAuthority.d.ts.map +1 -0
  548. package/packages/core/dist/showcase/approvalAuthority.js +46 -0
  549. package/packages/core/dist/showcase/approvalAuthority.js.map +1 -0
  550. package/packages/core/dist/showcase/index.d.ts +11 -0
  551. package/packages/core/dist/showcase/index.d.ts.map +1 -0
  552. package/packages/core/dist/showcase/index.js +11 -0
  553. package/packages/core/dist/showcase/index.js.map +1 -0
  554. package/packages/core/dist/showcase/jsonlLedger.d.ts +11 -0
  555. package/packages/core/dist/showcase/jsonlLedger.d.ts.map +1 -0
  556. package/packages/core/dist/showcase/jsonlLedger.js +50 -0
  557. package/packages/core/dist/showcase/jsonlLedger.js.map +1 -0
  558. package/packages/core/dist/showcase/planBinding.d.ts +5 -0
  559. package/packages/core/dist/showcase/planBinding.d.ts.map +1 -0
  560. package/packages/core/dist/showcase/planBinding.js +33 -0
  561. package/packages/core/dist/showcase/planBinding.js.map +1 -0
  562. package/packages/core/dist/showcase/replayRun.d.ts +5 -0
  563. package/packages/core/dist/showcase/replayRun.d.ts.map +1 -0
  564. package/packages/core/dist/showcase/replayRun.js +199 -0
  565. package/packages/core/dist/showcase/replayRun.js.map +1 -0
  566. package/packages/core/dist/showcase/results.d.ts +3 -0
  567. package/packages/core/dist/showcase/results.d.ts.map +1 -0
  568. package/packages/core/dist/showcase/results.js +4 -0
  569. package/packages/core/dist/showcase/results.js.map +1 -0
  570. package/packages/core/dist/showcase/revisionEpochs.d.ts +2 -0
  571. package/packages/core/dist/showcase/revisionEpochs.d.ts.map +1 -0
  572. package/packages/core/dist/showcase/revisionEpochs.js +2 -0
  573. package/packages/core/dist/showcase/revisionEpochs.js.map +1 -0
  574. package/packages/core/dist/showcase/startRun.d.ts +2 -0
  575. package/packages/core/dist/showcase/startRun.d.ts.map +1 -0
  576. package/packages/core/dist/showcase/startRun.js +2 -0
  577. package/packages/core/dist/showcase/startRun.js.map +1 -0
  578. package/packages/core/dist/showcase/types.d.ts +66 -0
  579. package/packages/core/dist/showcase/types.d.ts.map +1 -0
  580. package/packages/core/dist/showcase/types.js +2 -0
  581. package/packages/core/dist/showcase/types.js.map +1 -0
  582. package/packages/core/dist/skills/canonicalSkills.d.ts +3 -0
  583. package/packages/core/dist/skills/canonicalSkills.d.ts.map +1 -0
  584. package/packages/core/dist/skills/canonicalSkills.js +7 -0
  585. package/packages/core/dist/skills/canonicalSkills.js.map +1 -0
  586. package/packages/core/dist/skills/index.d.ts +4 -0
  587. package/packages/core/dist/skills/index.d.ts.map +1 -0
  588. package/packages/core/dist/skills/index.js +4 -0
  589. package/packages/core/dist/skills/index.js.map +1 -0
  590. package/packages/core/dist/skills/types.d.ts +26 -0
  591. package/packages/core/dist/skills/types.d.ts.map +1 -0
  592. package/packages/core/dist/skills/types.js +2 -0
  593. package/packages/core/dist/skills/types.js.map +1 -0
  594. package/packages/core/dist/skills/validateSkillAssets.d.ts +6 -0
  595. package/packages/core/dist/skills/validateSkillAssets.d.ts.map +1 -0
  596. package/packages/core/dist/skills/validateSkillAssets.js +218 -0
  597. package/packages/core/dist/skills/validateSkillAssets.js.map +1 -0
  598. package/packages/core/dist/useCases/integrity.d.ts +11 -0
  599. package/packages/core/dist/useCases/integrity.d.ts.map +1 -0
  600. package/packages/core/dist/useCases/integrity.js +178 -0
  601. package/packages/core/dist/useCases/integrity.js.map +1 -0
  602. package/packages/core/dist/useCases/loadUseCaseMatrix.d.ts +7 -0
  603. package/packages/core/dist/useCases/loadUseCaseMatrix.d.ts.map +1 -0
  604. package/packages/core/dist/useCases/loadUseCaseMatrix.js +74 -0
  605. package/packages/core/dist/useCases/loadUseCaseMatrix.js.map +1 -0
  606. package/packages/core/dist/useCases/mutateUseCaseMatrix.d.ts +25 -0
  607. package/packages/core/dist/useCases/mutateUseCaseMatrix.d.ts.map +1 -0
  608. package/packages/core/dist/useCases/mutateUseCaseMatrix.js +198 -0
  609. package/packages/core/dist/useCases/mutateUseCaseMatrix.js.map +1 -0
  610. package/packages/core/dist/useCases/query.d.ts +12 -0
  611. package/packages/core/dist/useCases/query.d.ts.map +1 -0
  612. package/packages/core/dist/useCases/query.js +47 -0
  613. package/packages/core/dist/useCases/query.js.map +1 -0
  614. package/packages/core/dist/useCases/types.d.ts +149 -0
  615. package/packages/core/dist/useCases/types.d.ts.map +1 -0
  616. package/packages/core/dist/useCases/types.js +2 -0
  617. package/packages/core/dist/useCases/types.js.map +1 -0
  618. package/packages/core/dist/useCases/validateUseCaseFile.d.ts +9 -0
  619. package/packages/core/dist/useCases/validateUseCaseFile.d.ts.map +1 -0
  620. package/packages/core/dist/useCases/validateUseCaseFile.js +107 -0
  621. package/packages/core/dist/useCases/validateUseCaseFile.js.map +1 -0
  622. package/packages/core/dist/version.d.ts +9 -0
  623. package/packages/core/dist/version.d.ts.map +1 -0
  624. package/packages/core/dist/version.js +17 -0
  625. package/packages/core/dist/version.js.map +1 -0
  626. package/packages/core/package.json +39 -0
  627. package/packages/mcp/README.md +48 -0
  628. package/packages/mcp/dist/index.d.ts +20 -0
  629. package/packages/mcp/dist/index.d.ts.map +1 -0
  630. package/packages/mcp/dist/index.js +180 -0
  631. package/packages/mcp/dist/index.js.map +1 -0
  632. package/packages/mcp/dist/prompts.d.ts +32 -0
  633. package/packages/mcp/dist/prompts.d.ts.map +1 -0
  634. package/packages/mcp/dist/prompts.js +199 -0
  635. package/packages/mcp/dist/prompts.js.map +1 -0
  636. package/packages/mcp/dist/resources.d.ts +22 -0
  637. package/packages/mcp/dist/resources.d.ts.map +1 -0
  638. package/packages/mcp/dist/resources.js +342 -0
  639. package/packages/mcp/dist/resources.js.map +1 -0
  640. package/packages/mcp/dist/toolHandlers.d.ts +28 -0
  641. package/packages/mcp/dist/toolHandlers.d.ts.map +1 -0
  642. package/packages/mcp/dist/toolHandlers.js +592 -0
  643. package/packages/mcp/dist/toolHandlers.js.map +1 -0
  644. package/packages/mcp/dist/toolSchemas.d.ts +23 -0
  645. package/packages/mcp/dist/toolSchemas.d.ts.map +1 -0
  646. package/packages/mcp/dist/toolSchemas.js +223 -0
  647. package/packages/mcp/dist/toolSchemas.js.map +1 -0
  648. package/packages/mcp/dist/tools.d.ts +22 -0
  649. package/packages/mcp/dist/tools.d.ts.map +1 -0
  650. package/packages/mcp/dist/tools.js +65 -0
  651. package/packages/mcp/dist/tools.js.map +1 -0
  652. package/packages/mcp/package.json +38 -0
  653. package/plugin.json +6 -0
  654. package/schemas/v1/authority.schema.json +70 -0
  655. package/schemas/v1/cli-result.schema.json +30 -0
  656. package/schemas/v1/common.schema.json +274 -0
  657. package/schemas/v1/demo-capsule.schema.json +78 -0
  658. package/schemas/v1/evidence-append-result.schema.json +14 -0
  659. package/schemas/v1/evidence-event.schema.json +181 -0
  660. package/schemas/v1/evidence-status-result.schema.json +68 -0
  661. package/schemas/v1/host-profile.schema.json +94 -0
  662. package/schemas/v1/host-status-result.schema.json +49 -0
  663. package/schemas/v1/keyring.schema.json +77 -0
  664. package/schemas/v1/ledger.schema.json +99 -0
  665. package/schemas/v1/marker.schema.json +84 -0
  666. package/schemas/v1/matrix-list-result.schema.json +67 -0
  667. package/schemas/v1/matrix-mutation-result.schema.json +49 -0
  668. package/schemas/v1/matrix-validation-result.schema.json +77 -0
  669. package/schemas/v1/mcp-tool-results.schema.json +34 -0
  670. package/schemas/v1/migration-test-matrix-result.schema.json +76 -0
  671. package/schemas/v1/presentation-plan-result.schema.json +62 -0
  672. package/schemas/v1/presentation-plan.schema.json +259 -0
  673. package/schemas/v1/release-gate-result.schema.json +136 -0
  674. package/schemas/v1/showcase-approval-result.schema.json +5 -0
  675. package/schemas/v1/showcase-event-append-result.schema.json +17 -0
  676. package/schemas/v1/showcase-event.schema.json +235 -0
  677. package/schemas/v1/showcase-finish-result.schema.json +5 -0
  678. package/schemas/v1/showcase-run-status-result.schema.json +70 -0
  679. package/schemas/v1/showcase-start-result.schema.json +5 -0
  680. package/schemas/v1/use-case-file.schema.json +178 -0
  681. package/schemas/v1/workflow-mode.schema.json +16 -0
  682. package/schemas/v1/workspace-config.schema.json +58 -0
  683. package/use-cases/capsule/demos.yml +212 -0
  684. package/use-cases/capsule/runner.yml +49 -0
  685. package/use-cases/diagnostics/contracts.yml +239 -0
  686. package/use-cases/evidence/core.yml +32 -0
  687. package/use-cases/evidence/ledger.yml +330 -0
  688. package/use-cases/hosts/profiles.yml +365 -0
  689. package/use-cases/hosts/projections.yml +96 -0
  690. package/use-cases/lifecycle/loop.yml +229 -0
  691. package/use-cases/matrix/core.yml +92 -0
  692. package/use-cases/matrix/product.yml +289 -0
  693. package/use-cases/mcp/surface.yml +257 -0
  694. package/use-cases/mcp/wrapper.yml +100 -0
  695. package/use-cases/migration/importer.yml +171 -0
  696. package/use-cases/migration/test-matrix.yml +32 -0
  697. package/use-cases/planning/cards.yml +215 -0
  698. package/use-cases/release/package.yml +80 -0
  699. package/use-cases/release/proof.yml +180 -0
  700. package/use-cases/roadmap/deferred.yml +184 -0
  701. package/use-cases/showcase/flow.yml +269 -0
  702. package/use-cases/showcase/live.yml +44 -0
  703. package/use-cases/skills/assets.yml +92 -0
  704. package/use-cases.yml +9 -0
@@ -0,0 +1,39 @@
1
+ # Showcases
2
+
3
+ A showcase is a live run in front of the user or another reviewer. The agent can
4
+ drive the run, the user can drive it, or a script can drive it, depending on the
5
+ use case and user preference.
6
+
7
+ The mechanical flow is:
8
+
9
+ ```text
10
+ start -> item -> observation -> verdict -> continue
11
+ |
12
+ +-> fail -> continue | pause_to_fix | waive_with_reason | abort
13
+ finish -> approval when required
14
+ ```
15
+
16
+ Use `plan showcase` for a short, high-value demo and `plan walkthrough` for
17
+ broader coverage. Use `capsule plan` when a persisted smoke demo or golden path
18
+ script already exists. A generated plan is prepared material until
19
+ `showcase start --plan-file` records a run against its content hash.
20
+
21
+ Use `capsule run --capsule <id>` when the persisted capsule should be performed
22
+ now. Instruction steps become action events. Static observation steps are
23
+ recorded as prompts for a real runtime observation; they do not become proof and
24
+ do not create pass verdicts by themselves. Command-backed observations can
25
+ record pass/fail verdicts in the same append-only showcase ledger. Successful
26
+ command-backed runs are finished automatically; runs with pending runtime
27
+ observations or failed commands stay open so the agent or user can continue,
28
+ pause to fix, waive with a reason, or abort.
29
+
30
+ Command steps are inert by default. They run only when the caller passes
31
+ `--execute-commands` and the capsule sets `permissions.command_execution: true`.
32
+ The runner executes an exact executable/argv pair without a shell, requires the
33
+ working directory to stay inside the repository, uses a small environment
34
+ allowlist, and records bounded/redacted stdout/stderr plus the exit code as the
35
+ observation.
36
+
37
+ User-required approval cannot be recorded by an agent or MCP tool. The trusted
38
+ path is the interactive CLI-mediated user approval command. Approval is only
39
+ valid after finish, and is bound to the plan hash and finish event.
@@ -0,0 +1,188 @@
1
+ # Tutorial: adopt the matrix in a pure-Python repo (pytest, no JS)
2
+
3
+ This walkthrough proves the headline claim — **anyone can adopt Use Cases,
4
+ not just JavaScript repos** — by taking a tiny Python project from nothing to a
5
+ signed **FRESH** row using a **pure Python toolchain**. There is **no pnpm and no
6
+ vitest** anywhere in the project: the verifier is `pytest`.
7
+
8
+ The complete, runnable project lives at
9
+ [`examples/python-pytest/`](../../examples/python-pytest), and it is exercised
10
+ end-to-end (from the published `uc` tarball, running real `pytest`) by
11
+ [`tests/release/example-python-pytest.test.ts`](../../tests/release/example-python-pytest.test.ts).
12
+
13
+ > The only Node you install is the `uc` CLI itself (the trust engine). The code
14
+ > under test, the acceptance test, and the verifier are 100% Python.
15
+
16
+ ---
17
+
18
+ ## What the project looks like
19
+
20
+ ```
21
+ examples/python-pytest/
22
+ ├─ use-cases.yml # workspace config: acceptance → python.pytest preset
23
+ ├─ pytest.ini # importlib mode + pythonpath=src
24
+ ├─ src/coupon.py # implementation, wrapped in a marker block
25
+ ├─ tests/use_cases/
26
+ │ └─ example.checkout.apply_coupon_test.py # acceptance test the preset runs
27
+ └─ use-cases/checkout.yml # the matrix row
28
+ ```
29
+
30
+ ### The workspace config (`use-cases.yml`)
31
+
32
+ The `acceptance` verifier resolves to the **`python.pytest` preset** — the same
33
+ config-driven verifier model JS repos use, just pointed at pytest:
34
+
35
+ ```yaml
36
+ verifiers:
37
+ default: acceptance
38
+ acceptance:
39
+ preset: python.pytest # runs: pytest tests/use_cases/{slug}_test.py
40
+ evidence_kind: test_result
41
+ ```
42
+
43
+ ### The marked code (`src/coupon.py`)
44
+
45
+ `#` is the configured comment prefix for `.py`, so the marker is the Python
46
+ spelling of the same `<comment>: @use-case: <slug>` convention:
47
+
48
+ ```python
49
+ #: @use-case: example.checkout.apply_coupon
50
+ COUPONS = {"SAVE10": 10, "HALF": 50}
51
+
52
+
53
+ def apply_coupon(subtotal_cents: int, code: str) -> int:
54
+ if subtotal_cents <= 0:
55
+ raise ValueError("subtotal must be positive")
56
+ if code not in COUPONS:
57
+ raise KeyError(f"unknown coupon: {code}")
58
+ discount = subtotal_cents * COUPONS[code] // 100
59
+ return subtotal_cents - discount
60
+ #: @use-case: end example.checkout.apply_coupon
61
+ ```
62
+
63
+ ### The acceptance test
64
+
65
+ The `python.pytest` preset derives the path `tests/use_cases/{slug}_test.py` from
66
+ the row id, so the test file is
67
+ `tests/use_cases/example.checkout.apply_coupon_test.py`:
68
+
69
+ ```python
70
+ from coupon import apply_coupon
71
+
72
+ def test_percentage_coupon_discounts_the_subtotal():
73
+ assert apply_coupon(1000, "SAVE10") == 900
74
+ ```
75
+
76
+ `pytest.ini` makes that path collectable and importable with **no packaging
77
+ boilerplate**:
78
+
79
+ ```ini
80
+ [pytest]
81
+ # importlib mode lets pytest collect the dotted row-id filename;
82
+ # pythonpath=src lets the test `from coupon import ...`.
83
+ addopts = --import-mode=importlib
84
+ pythonpath = src
85
+ ```
86
+
87
+ ---
88
+
89
+ ## The flow: from nothing to FRESH
90
+
91
+ Install the CLI once (the only Node dependency), then drive the trust flow. These
92
+ are the exact commands the release test runs.
93
+
94
+ ### 0. Install the CLI and generate a scratch signing key
95
+
96
+ ```bash
97
+ npm i -g use-cases # provides the `uc` binary
98
+ # A throwaway ed25519 keypair. In production the PRIVATE key lives ONLY in CI.
99
+ node -e 'const c=require("crypto"),f=require("fs");const k=c.generateKeyPairSync("ed25519");
100
+ f.writeFileSync("public-key.pem",k.publicKey.export({type:"spki",format:"pem"}));
101
+ f.writeFileSync("private-key.pem",k.privateKey.export({type:"pkcs8",format:"pem"}));'
102
+ ```
103
+
104
+ ### 1. Validate the matrix
105
+
106
+ ```bash
107
+ uc matrix validate --repo . --json # ok: true
108
+ ```
109
+
110
+ ### 2. Register the binding
111
+
112
+ The marker already lives in `src/coupon.py`, so register it without editing
113
+ source:
114
+
115
+ ```bash
116
+ uc bind --repo . \
117
+ --row example.checkout.apply_coupon \
118
+ --file src/coupon.py \
119
+ --mode explicit --register-existing --json
120
+ ```
121
+
122
+ ### 3. Scan — the row is UNPROVEN
123
+
124
+ ```bash
125
+ uc scan --repo . --public-key public-key.pem --json
126
+ # example.checkout.apply_coupon → UNPROVEN (bound, but no signed proof yet)
127
+ ```
128
+
129
+ ### 4. Verify — runs REAL pytest (keyless)
130
+
131
+ `verify` resolves the `python.pytest` preset and actually runs
132
+ `pytest tests/use_cases/example.checkout.apply_coupon_test.py`. It holds **no
133
+ signing key** and writes an unsigned results ledger:
134
+
135
+ ```bash
136
+ uc verify --repo . --all --out verification-results.jsonl \
137
+ --public-key public-key.pem --json
138
+ # results[0].status: "pass", verifier_id: "acceptance", exit_code: 0
139
+ ```
140
+
141
+ ### 5. Prove — sign from the verification result (trusted CI)
142
+
143
+ `prove` consumes the unsigned results, recomputes every hash itself, and mints an
144
+ ed25519-signed proof. Locally you can use the scratch key; in production the key
145
+ is a CI secret:
146
+
147
+ ```bash
148
+ UCM_SIGNING_KEY="$(cat private-key.pem)" \
149
+ uc prove --repo . --all --trusted-ci --append \
150
+ --verification-results verification-results.jsonl \
151
+ --signing-key-env UCM_SIGNING_KEY \
152
+ --public-key public-key.pem --json
153
+ # rows[0].status: "signed", proof_events_appended: 1
154
+ ```
155
+
156
+ ### 6. Scan again — the row is FRESH
157
+
158
+ ```bash
159
+ uc scan --repo . --public-key public-key.pem --json
160
+ # summary: { fresh: 1, ... } example.checkout.apply_coupon → FRESH
161
+ ```
162
+
163
+ ---
164
+
165
+ ## Why this is honest, not a rubber stamp
166
+
167
+ Break the production code so the genuine acceptance test fails, then re-verify:
168
+
169
+ ```bash
170
+ # drop the discount in src/coupon.py, then:
171
+ uc verify --repo . --all --out verification-results.jsonl --public-key public-key.pem --json
172
+ # results[0].status: "fail", exit_code != 0
173
+ ```
174
+
175
+ `prove` now refuses (`reason: RESULT_FAILED`, nothing appended) and the row stays
176
+ out of FRESH. The proof is bound to a verifier that **really ran** — exactly the
177
+ guarantee the JS path gives, delivered by a pure-Python toolchain.
178
+
179
+ | Stage | Command | Row state |
180
+ |---|---|---|
181
+ | Authored | `uc matrix validate` | (tracked) |
182
+ | Bound | `uc bind … --register-existing` | UNPROVEN |
183
+ | Verified (keyless, real pytest) | `uc verify --out …` | UNPROVEN (results only) |
184
+ | Proved (trusted, signed) | `uc prove --trusted-ci …` | **FRESH** |
185
+ | Production code broken | `uc verify` → `uc prove` | refused → not FRESH |
186
+
187
+ See [verifiers](../concepts/verifiers.md) for the full preset model and
188
+ [getting started](../getting-started.md) for the JS path and the CI workflow.
@@ -0,0 +1,23 @@
1
+ schema_version: 1
2
+ capsule_id: capsule.basic.product_search
3
+ title: Product search showcase
4
+ mode: showcase
5
+ description: Demonstrate the golden product search path.
6
+ audience: reviewer
7
+ timebox_seconds: 600
8
+ items:
9
+ - use_case_id: product.search.golden
10
+ scenario_ids: [product.search.golden.cli]
11
+ runbook:
12
+ - kind: instruction
13
+ text: Open the product search surface.
14
+ - kind: instruction
15
+ text: Search for a known product.
16
+ - kind: observation
17
+ text: Confirm that matching results and a selectable product are visible.
18
+ permissions:
19
+ command_execution: false
20
+ extensions:
21
+ use-cases.dev/runner:
22
+ command: uc capsule run --repo examples/basic-product --capsule capsule.basic.product_search --json
23
+ command_steps: none
@@ -0,0 +1 @@
1
+ {"schema_version":1,"event_type":"evidence_recorded","event_id":"evt_basic_search_evidence_1","aggregate_id":"evidence.basic.search.1","sequence":1,"recorded_at":"2026-06-25T00:00:00.000Z","actor_type":"script","host_surface":"codex.cli","idempotency_key":"example:basic:evidence:search","payload":{"targets":[{"use_case_id":"product.search.golden","use_case_semantic_hash":"sha256:3331f31a3c86b251cf9a2783a06291d7277ab475753c79a709ef1691ac72f701"}],"kind":"test_result","captured_at":"2026-06-25T00:00:00.000Z","result":"pass","summary":"Example product search check passed.","producer":{"type":"script"},"method":{"type":"structured_command","executable":"pnpm","argv":["test","product-search"]},"evidence_kind":"test_result","use_case_ids":["product.search.golden"],"verifier":{"type":"script"},"verdict":"pass"}}
@@ -0,0 +1,4 @@
1
+ {"schema_version":1,"event_type":"run_started","event_id":"evt_basic_showcase_start","run_id":"run.basic.product.search","aggregate_id":"run.basic.product.search","sequence":1,"recorded_at":"2026-06-25T00:00:00.000Z","actor_type":"agent","host_surface":"codex.cli","idempotency_key":"example:basic:showcase:start","intent_digest":"sha256:1111111111111111111111111111111111111111111111111111111111111111","payload":{"plan":{"schema_version":1,"plan_id":"plan.basic.product.search","mode":"showcase","complete":true,"selected_items":[{"plan_item_id":"item.product.search.golden","use_case_id":"product.search.golden","scenario_ids":["product.search.golden.cli"],"verification_policy_snapshot":{"mode":"requirements","requirements":[{"evidence_kind":"test_result","required_verifiers":["script"],"minimum_count":1}]},"approval_policy_snapshot":{"mode":"predefined","requirements":[{"approver_type":"user","minimum_count":1}],"statement":"User approval follows the live product search showcase."}}],"known_gaps":[]},"control_mode":"agent_led","initial_epoch_id":"epoch.1","known_gap_acknowledgement":null}}
2
+ {"schema_version":1,"event_type":"observation_recorded","event_id":"evt_basic_showcase_observation","run_id":"run.basic.product.search","aggregate_id":"run.basic.product.search","sequence":2,"recorded_at":"2026-06-25T00:01:00.000Z","actor_type":"agent","host_surface":"codex.cli","idempotency_key":"example:basic:showcase:observation","intent_digest":"sha256:2222222222222222222222222222222222222222222222222222222222222222","payload":{"plan_item_id":"item.product.search.golden","epoch_id":"epoch.1","observation":"The product search result appeared in the live demo."}}
3
+ {"schema_version":1,"event_type":"verdict_recorded","event_id":"evt_basic_showcase_verdict","run_id":"run.basic.product.search","aggregate_id":"run.basic.product.search","sequence":3,"recorded_at":"2026-06-25T00:02:00.000Z","actor_type":"user","host_surface":"codex.cli","idempotency_key":"example:basic:showcase:verdict","intent_digest":"sha256:3333333333333333333333333333333333333333333333333333333333333333","payload":{"plan_item_id":"item.product.search.golden","epoch_id":"epoch.1","observation_event_ids":["evt_basic_showcase_observation"],"verdict":"pass","verifier":{"type":"user"}}}
4
+ {"schema_version":1,"event_type":"run_finished","event_id":"evt_basic_showcase_finish","run_id":"run.basic.product.search","aggregate_id":"run.basic.product.search","sequence":4,"recorded_at":"2026-06-25T00:03:00.000Z","actor_type":"agent","host_surface":"codex.cli","idempotency_key":"example:basic:showcase:finish","intent_digest":"sha256:4444444444444444444444444444444444444444444444444444444444444444","payload":{"requested_finish":true}}
@@ -0,0 +1,85 @@
1
+ schema_version: 1
2
+ feature:
3
+ id: product.search
4
+ name: Product search
5
+ summary: Users can find and refine product results.
6
+ metadata:
7
+ owner: use-cases
8
+ lifecycle: active
9
+ use_cases:
10
+ - id: product.search.golden
11
+ title: Find a product from the main search box
12
+ lifecycle: active
13
+ value_tier: critical
14
+ journey_role: golden
15
+ usage_frequency: common
16
+ tags: [product, search, showcase]
17
+ source_refs:
18
+ - kind: file
19
+ path: src/product/search.ts
20
+ actor: shopper
21
+ intent: Find a matching product quickly.
22
+ preconditions:
23
+ - Product catalog contains visible items.
24
+ trigger: Shopper submits a product search.
25
+ scenarios:
26
+ - id: product.search.golden.cli
27
+ kind: steps
28
+ steps:
29
+ - Open the product search surface.
30
+ - Search for a known product.
31
+ - Select the highest-ranked matching result.
32
+ observable_outcomes:
33
+ - Matching product results are visible.
34
+ - The selected product can be opened from the results list.
35
+ host_applicability:
36
+ - host_surface: codex.cli
37
+ supported: true
38
+ - host_surface: claude.cli
39
+ supported: true
40
+ - host_surface: opencode.cli
41
+ supported: true
42
+ verification_policy:
43
+ mode: requirements
44
+ requirements:
45
+ - evidence_kind: test_result
46
+ required_verifiers: [script]
47
+ minimum_count: 1
48
+ approval_policy:
49
+ mode: predefined
50
+ requirements:
51
+ - approver_type: user
52
+ minimum_count: 1
53
+ statement: User approval follows the live product search showcase.
54
+ - id: product.filter.alternate
55
+ title: Refine product results with a filter
56
+ lifecycle: active
57
+ value_tier: core
58
+ journey_role: alternate
59
+ usage_frequency: occasional
60
+ tags: [product, filter]
61
+ source_refs:
62
+ - kind: file
63
+ path: src/product/filter.ts
64
+ actor: shopper
65
+ intent: Narrow a product result set.
66
+ preconditions:
67
+ - Product search results are visible.
68
+ trigger: Shopper applies a category filter.
69
+ scenarios:
70
+ - id: product.filter.alternate.cli
71
+ kind: steps
72
+ steps:
73
+ - Search for a product category.
74
+ - Apply one category filter.
75
+ observable_outcomes:
76
+ - Results are narrowed to the selected category.
77
+ host_applicability:
78
+ - host_surface: codex.cli
79
+ supported: true
80
+ - host_surface: claude.cli
81
+ supported: true
82
+ verification_policy:
83
+ mode: none
84
+ approval_policy:
85
+ mode: none
@@ -0,0 +1,9 @@
1
+ schema_version: 1
2
+ workspace_id: basic-product-example
3
+ component_id: basic-product
4
+ data_root: .
5
+ use_cases_dir: use-cases
6
+ evidence_dir: evidence
7
+ demo_capsules_dir: demo-capsules
8
+ showcase_runs_dir: showcase-runs
9
+ default_workflow_mode: continuous
@@ -0,0 +1 @@
1
+ {"schema_version":1,"event_type":"evidence_recorded","event_id":"evt_bad_json"
@@ -0,0 +1,28 @@
1
+ schema_version: 1
2
+ feature:
3
+ id: damage.duplicate
4
+ name: Duplicate use cases
5
+ summary: Duplicate IDs are ambiguous.
6
+ use_cases:
7
+ - id: damage.duplicate.id
8
+ title: Duplicate use case A
9
+ lifecycle: active
10
+ value_tier: supporting
11
+ journey_role: edge
12
+ usage_frequency: rare
13
+ actor: agent
14
+ intent: Exercise duplicate detection.
15
+ preconditions: [A duplicate sibling exists.]
16
+ trigger: Matrix validation runs.
17
+ scenarios:
18
+ - id: damage.duplicate.a.cli
19
+ kind: steps
20
+ steps: [Validate duplicate A.]
21
+ observable_outcomes: [Duplicate A is marked ambiguous.]
22
+ host_applicability:
23
+ - host_surface: codex.cli
24
+ supported: true
25
+ verification_policy:
26
+ mode: none
27
+ approval_policy:
28
+ mode: none
@@ -0,0 +1,28 @@
1
+ schema_version: 1
2
+ feature:
3
+ id: damage.duplicate
4
+ name: Duplicate use cases
5
+ summary: Duplicate IDs are ambiguous.
6
+ use_cases:
7
+ - id: damage.duplicate.id
8
+ title: Duplicate use case B
9
+ lifecycle: active
10
+ value_tier: supporting
11
+ journey_role: edge
12
+ usage_frequency: rare
13
+ actor: agent
14
+ intent: Exercise duplicate detection.
15
+ preconditions: [A duplicate sibling exists.]
16
+ trigger: Matrix validation runs.
17
+ scenarios:
18
+ - id: damage.duplicate.b.cli
19
+ kind: steps
20
+ steps: [Validate duplicate B.]
21
+ observable_outcomes: [Duplicate B is marked ambiguous.]
22
+ host_applicability:
23
+ - host_surface: codex.cli
24
+ supported: true
25
+ verification_policy:
26
+ mode: none
27
+ approval_policy:
28
+ mode: none
@@ -0,0 +1,14 @@
1
+ schema_version: 1
2
+ feature:
3
+ id: damage.malformed
4
+ name: Malformed file
5
+ summary: This file is intentionally malformed.
6
+ use_cases:
7
+ - id: damage.malformed
8
+ title: Broken
9
+ lifecycle: active
10
+ value_tier: supporting
11
+ journey_role: edge
12
+ usage_frequency: rare
13
+ actor: agent
14
+ intent: [
@@ -0,0 +1,28 @@
1
+ schema_version: 1
2
+ feature:
3
+ id: damage.valid
4
+ name: Damaged fixture valid sibling
5
+ summary: A valid sibling remains usable while nearby files are damaged.
6
+ use_cases:
7
+ - id: damage.valid.sibling
8
+ title: Valid sibling remains addressable
9
+ lifecycle: active
10
+ value_tier: supporting
11
+ journey_role: edge
12
+ usage_frequency: rare
13
+ actor: agent
14
+ intent: Confirm partial matrix recovery.
15
+ preconditions: [At least one nearby file is damaged.]
16
+ trigger: Matrix validation runs.
17
+ scenarios:
18
+ - id: damage.valid.sibling.cli
19
+ kind: steps
20
+ steps: [Validate the damaged workspace.]
21
+ observable_outcomes: [The valid sibling is still addressable.]
22
+ host_applicability:
23
+ - host_surface: codex.cli
24
+ supported: true
25
+ verification_policy:
26
+ mode: none
27
+ approval_policy:
28
+ mode: none
@@ -0,0 +1,9 @@
1
+ schema_version: 1
2
+ workspace_id: damaged-product-example
3
+ component_id: damaged-product
4
+ data_root: .
5
+ use_cases_dir: use-cases
6
+ evidence_dir: evidence
7
+ demo_capsules_dir: demo-capsules
8
+ showcase_runs_dir: showcase-runs
9
+ default_workflow_mode: continuous
@@ -0,0 +1,9 @@
1
+ schema_version: 1
2
+ workspace_id: host-projections-example
3
+ component_id: host-projections-example
4
+ data_root: .
5
+ use_cases_dir: use-cases
6
+ evidence_dir: evidence
7
+ demo_capsules_dir: demo-capsules
8
+ showcase_runs_dir: showcase-runs
9
+ default_workflow_mode: continuous
@@ -0,0 +1,39 @@
1
+ # Example: Python + pytest
2
+
3
+ A minimal, already-wired Use Cases workspace that proves the headline
4
+ trust flow against real pytest tests. It mirrors the full walkthrough in
5
+ [`docs/tutorials/python-pytest.md`](../../docs/tutorials/python-pytest.md) — read
6
+ that for the step-by-step narrative; this README is the map.
7
+
8
+ ## Layout
9
+
10
+ | Path | What it is |
11
+ |---|---|
12
+ | `use-cases.yml` | Workspace config. `verifiers.default` runs pytest. |
13
+ | `use-cases/checkout.yml` | One behaviour row: `example.checkout.apply_coupon`. |
14
+ | `src/coupon.py` | The code that satisfies the row, wrapped in `//: @use-case:` markers (Python uses `#:` comment prefix). |
15
+ | `tests/use_cases/…_test.py` | The pytest test that verifies the behaviour. |
16
+
17
+ Because the code is already marked, adopt it with `bind --register-existing`
18
+ (register the existing span) rather than a fresh `bind` (which would insert new
19
+ markers).
20
+
21
+ ## Run it
22
+
23
+ ```bash
24
+ # from this directory, with `use-cases` installed (npm i -g use-cases)
25
+ uc matrix validate --repo . # matrix is clean
26
+ uc scan --repo . # row is UNBOUND until you register it
27
+
28
+ # register the already-marked span, then run the trust flow:
29
+ uc bind --row example.checkout.apply_coupon \
30
+ --file src/coupon.py --register-existing
31
+ uc verify --all --out verify-results.jsonl --repo . # runs pytest
32
+ # prove needs an ed25519 signing key — see docs/security/key-management.md:
33
+ # node -e '...generateKeyPairSync("ed25519")...' (one-liner in that doc)
34
+ uc prove --all --trusted-ci --signing-key-env UCM_CI_SIGNING_KEY \
35
+ --verification-results verify-results.jsonl --append --repo .
36
+ uc scan --repo . --public-key ci-signing-key.pub.pem # row reads FRESH
37
+
38
+ # now edit src/coupon.py inside the marked span and re-scan — it flips to SUSPECT.
39
+ ```
@@ -0,0 +1,8 @@
1
+ [pytest]
2
+ # `--import-mode=importlib` lets pytest collect the acceptance test whose filename
3
+ # carries the dotted row id (example.checkout.apply_coupon_test.py); the default
4
+ # "prepend" import mode rejects dots in module names.
5
+ # `pythonpath = src` puts the implementation module (coupon.py) on sys.path so the
6
+ # test can `from coupon import apply_coupon` without any packaging boilerplate.
7
+ addopts = --import-mode=importlib
8
+ pythonpath = src
@@ -0,0 +1,32 @@
1
+ """A tiny, self-contained checkout helper an adopter might own.
2
+
3
+ The function below is the implementation the use-case row
4
+ `example.checkout.apply_coupon` describes. It is wrapped in a Use Cases
5
+ marker block (the `@use-case` start/end comments below) so the matrix can bind
6
+ the row to exactly these source lines.
7
+
8
+ `#` is the configured comment prefix for `.py`, so the markers are the Python
9
+ spelling of the same convention `//` languages use. No JavaScript, pnpm, or
10
+ vitest is involved anywhere in this project.
11
+ """
12
+
13
+ #: @use-case: example.checkout.apply_coupon
14
+ COUPONS = {
15
+ "SAVE10": 10, # 10% off
16
+ "HALF": 50, # 50% off
17
+ }
18
+
19
+
20
+ def apply_coupon(subtotal_cents: int, code: str) -> int:
21
+ """Return the cart total in cents after applying coupon ``code``.
22
+
23
+ Raises ``ValueError`` for a non-positive subtotal and ``KeyError`` for an
24
+ unknown coupon code.
25
+ """
26
+ if subtotal_cents <= 0:
27
+ raise ValueError("subtotal must be positive")
28
+ if code not in COUPONS:
29
+ raise KeyError(f"unknown coupon: {code}")
30
+ discount = subtotal_cents * COUPONS[code] // 100
31
+ return subtotal_cents - discount
32
+ #: @use-case: end example.checkout.apply_coupon
@@ -0,0 +1,31 @@
1
+ """Acceptance test for the `example.checkout.apply_coupon` use-case row.
2
+
3
+ This is a plain pytest module — the `python.pytest` verifier preset runs it with
4
+
5
+ pytest tests/use_cases/example.checkout.apply_coupon_test.py
6
+
7
+ (the path the preset derives from the row id). It imports the implementation via
8
+ the `pythonpath = src` setting in pytest.ini, so there is no JS toolchain here.
9
+ """
10
+
11
+ import pytest
12
+
13
+ from coupon import apply_coupon
14
+
15
+
16
+ def test_percentage_coupon_discounts_the_subtotal():
17
+ assert apply_coupon(1000, "SAVE10") == 900
18
+
19
+
20
+ def test_half_off_coupon():
21
+ assert apply_coupon(2000, "HALF") == 1000
22
+
23
+
24
+ def test_unknown_coupon_is_rejected():
25
+ with pytest.raises(KeyError):
26
+ apply_coupon(1000, "NOPE")
27
+
28
+
29
+ def test_non_positive_subtotal_is_rejected():
30
+ with pytest.raises(ValueError):
31
+ apply_coupon(0, "SAVE10")
@@ -0,0 +1,47 @@
1
+ schema_version: 1
2
+ feature:
3
+ id: example.checkout
4
+ name: Checkout coupons
5
+ summary: Shoppers can apply a coupon code to reduce their cart total.
6
+ metadata:
7
+ owner: example-team
8
+ lifecycle: active
9
+ use_cases:
10
+ - id: example.checkout.apply_coupon
11
+ title: Apply a valid coupon to a cart
12
+ lifecycle: active
13
+ value_tier: critical
14
+ journey_role: golden
15
+ usage_frequency: common
16
+ tags: [checkout, coupon, python]
17
+ source_refs:
18
+ - kind: file
19
+ path: src/coupon.py
20
+ actor: shopper
21
+ intent: Reduce the cart total by applying a known coupon code.
22
+ preconditions:
23
+ - A cart with a positive subtotal exists.
24
+ trigger: The shopper submits a coupon code at checkout.
25
+ scenarios:
26
+ - id: example.checkout.apply_coupon.main
27
+ kind: steps
28
+ steps:
29
+ - The shopper enters a known coupon code.
30
+ - The system looks up the coupon's discount percentage.
31
+ - The system subtracts the discount from the subtotal.
32
+ observable_outcomes:
33
+ - The returned cart total reflects the coupon discount.
34
+ - An unknown coupon code is rejected rather than silently ignored.
35
+ host_applicability:
36
+ - host_surface: codex.cli
37
+ supported: true
38
+ - host_surface: claude.cli
39
+ supported: true
40
+ verification_policy:
41
+ mode: requirements
42
+ requirements:
43
+ - evidence_kind: test_result
44
+ required_verifiers: [acceptance]
45
+ minimum_count: 1
46
+ approval_policy:
47
+ mode: none
@@ -0,0 +1,19 @@
1
+ schema_version: 1
2
+ workspace_id: example.python-pytest
3
+ component_id: example.python-pytest
4
+ data_root: .
5
+ use_cases_dir: use-cases
6
+ evidence_dir: evidence
7
+ demo_capsules_dir: demo-capsules
8
+ showcase_runs_dir: showcase-runs
9
+ default_workflow_mode: continuous
10
+ # Verifiers map a row's required_verifiers id to a real command. `default` is used
11
+ # by any row that does not name its own verifier. This workspace adopts the matrix
12
+ # with a PURE PYTHON toolchain: the `acceptance` verifier resolves to the
13
+ # `python.pytest` preset, which runs `pytest tests/use_cases/<row-id>_test.py`.
14
+ # There is no pnpm/vitest anywhere in this project.
15
+ verifiers:
16
+ default: acceptance
17
+ acceptance:
18
+ preset: python.pytest
19
+ evidence_kind: test_result