@mnstry/atelier 0.2.0-alpha.6 → 0.2.0-alpha.8

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 (374) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/README.md +59 -15
  3. package/SECURITY.md +6 -1
  4. package/contracts/atelier-adoption-policy.v1.schema.json +49 -0
  5. package/contracts/atelier-coauthor.v1.schema.json +163 -0
  6. package/contracts/atelier-decision-request.v1.schema.json +476 -0
  7. package/contracts/atelier-decision-result.v1.schema.json +500 -0
  8. package/contracts/atelier-guide.v1.schema.json +227 -0
  9. package/contracts/atelier-intake.v1.schema.json +151 -0
  10. package/contracts/atelier-migration.v2.schema.json +61 -0
  11. package/contracts/atelier-obsidian-acceptance-receipt.v1.schema.json +211 -0
  12. package/contracts/atelier-obsidian-apply-policy.v1.schema.json +298 -0
  13. package/contracts/atelier-obsidian-corpus-profile.v1.schema.json +98 -0
  14. package/contracts/atelier-obsidian-edit-operation.v1.schema.json +138 -0
  15. package/contracts/atelier-obsidian-ext-settings.v1.schema.json +287 -0
  16. package/contracts/atelier-obsidian-generation-manifest.v1.schema.json +353 -0
  17. package/contracts/atelier-obsidian-proposal-receipt.v1.schema.json +110 -0
  18. package/contracts/atelier-obsidian-publication-journal.v1.schema.json +167 -0
  19. package/contracts/atelier-obsidian-scope.v1.schema.json +264 -0
  20. package/contracts/atelier-obsidian-service-state.v1.schema.json +149 -0
  21. package/contracts/atelier-obsidian-source-snapshot.v1.schema.json +179 -0
  22. package/contracts/atelier-pane-presentation.v1.schema.json +76 -0
  23. package/contracts/atelier-presentation.v1.schema.json +1293 -0
  24. package/contracts/atelier-review.v1.schema.json +1601 -0
  25. package/contracts/atelier-skill-steward.v1.schema.json +692 -0
  26. package/contracts/atelier-upgrade-plan.v2.schema.json +398 -0
  27. package/contracts/atelier-upgrade-receipt.v1.schema.json +99 -0
  28. package/contracts/atelier-vault-publication.v1.schema.json +58 -0
  29. package/docs/assurance-controls.md +9 -1
  30. package/docs/atelier-sync.md +5 -4
  31. package/docs/blocks/claims.md +15 -10
  32. package/docs/blocks/will-not-do.md +4 -1
  33. package/docs/coauthor-session.md +57 -0
  34. package/docs/connected-composition.md +75 -0
  35. package/docs/decisions.md +167 -0
  36. package/docs/exact-upgrades.md +159 -0
  37. package/docs/extension-pack-lifecycle.md +33 -0
  38. package/docs/guided-upgrades.md +99 -0
  39. package/docs/install.md +65 -9
  40. package/docs/intake-and-guides.md +65 -0
  41. package/docs/integration-and-review-plan.md +409 -0
  42. package/docs/integration-contract-decisions.md +22 -0
  43. package/docs/local-review.md +84 -0
  44. package/docs/local-services.md +227 -0
  45. package/docs/local-state.md +107 -0
  46. package/docs/obsidian-contract.md +687 -0
  47. package/docs/obsidian.md +387 -0
  48. package/docs/portable-presentation.md +328 -0
  49. package/docs/presentation-consumer-boundaries.md +75 -0
  50. package/docs/presentation-review-disposition.md +47 -0
  51. package/docs/project-command-inventory.md +38 -0
  52. package/docs/project-options.md +53 -0
  53. package/docs/release-engineering.md +88 -0
  54. package/docs/review-portability.md +55 -0
  55. package/docs/skill-steward.md +156 -0
  56. package/docs/upgrade.md +55 -2
  57. package/docs/vault-service.md +292 -0
  58. package/fixtures/atelier-coauthor/invalid/authority.v1.json +5 -0
  59. package/fixtures/atelier-coauthor/valid/config.v1.json +12 -0
  60. package/fixtures/atelier-guide/invalid/authority.v1.json +11 -0
  61. package/fixtures/atelier-guide/valid/capability.v1.json +10 -0
  62. package/fixtures/atelier-guide/valid/consent.v1.json +11 -0
  63. package/fixtures/atelier-guide/valid/engagement.v1.json +7 -0
  64. package/fixtures/atelier-guide/valid/offer.v1.json +10 -0
  65. package/fixtures/atelier-intake/invalid/authority.v1.json +9 -0
  66. package/fixtures/atelier-intake/valid/attempt.v1.json +8 -0
  67. package/fixtures/atelier-intake/valid/completion.v1.json +9 -0
  68. package/fixtures/atelier-intake/valid/source.v1.json +7 -0
  69. package/fixtures/atelier-review/invalid/authenticated-identity.v1.json +22 -0
  70. package/fixtures/atelier-review/valid/bound.v1.json +229 -0
  71. package/fixtures/atelier-review/valid/bundle.v1.json +267 -0
  72. package/fixtures/atelier-review/valid/contribution.v1.json +22 -0
  73. package/fixtures/atelier-review/valid/lifecycle.v1.json +14 -0
  74. package/fixtures/atelier-skill-steward/audit/invalid/source-mutation.v1.json +26 -0
  75. package/fixtures/atelier-skill-steward/audit/valid/clean.v1.json +26 -0
  76. package/fixtures/atelier-skill-steward/candidates/invalid/workflow-key.v1.json +37 -0
  77. package/fixtures/atelier-skill-steward/candidates/valid/create.v1.json +37 -0
  78. package/fixtures/atelier-skill-steward/lock/invalid/bad-digest.v1.json +18 -0
  79. package/fixtures/atelier-skill-steward/lock/valid/installed.v1.json +23 -0
  80. package/fixtures/atelier-skill-steward/plan/invalid/delete-action.v1.json +33 -0
  81. package/fixtures/atelier-skill-steward/plan/valid/add.v1.json +33 -0
  82. package/fixtures/atelier-upgrade-transaction/adoption-policy/invalid/example.json +12 -0
  83. package/fixtures/atelier-upgrade-transaction/adoption-policy/valid/example.json +11 -0
  84. package/fixtures/atelier-upgrade-transaction/migration/invalid/example.json +20 -0
  85. package/fixtures/atelier-upgrade-transaction/migration/valid/example.json +19 -0
  86. package/fixtures/atelier-upgrade-transaction/upgrade-plan/invalid/example.json +58 -0
  87. package/fixtures/atelier-upgrade-transaction/upgrade-plan/valid/example.json +57 -0
  88. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/invalid/example.json +15 -0
  89. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/valid/example.json +14 -0
  90. package/fixtures/atelier-vault-publication/invalid/publication.json +5 -0
  91. package/fixtures/atelier-vault-publication/valid/publication.json +11 -0
  92. package/fixtures/decisions/request/invalid/unknown-authority.v1.json +61 -0
  93. package/fixtures/decisions/request/valid/triage.v1.json +60 -0
  94. package/fixtures/decisions/result/invalid/execution-authority.v1.json +50 -0
  95. package/fixtures/decisions/result/valid/abstained.v1.json +23 -0
  96. package/fixtures/decisions/result/valid/assessed.v1.json +50 -0
  97. package/fixtures/obsidian/acceptance/ap05-extra-notes.json +14 -0
  98. package/fixtures/obsidian/acceptance/receipts/G07.valid.v1.json +63 -0
  99. package/fixtures/obsidian/acceptance/receipts/G13.valid.v1.json +69 -0
  100. package/fixtures/obsidian/acceptance/receipts/G14.valid.v1.json +62 -0
  101. package/fixtures/obsidian/acceptance/receipts/G15.valid.v1.json +56 -0
  102. package/fixtures/obsidian/acceptance/receipts/G16.valid.v1.json +73 -0
  103. package/fixtures/obsidian/acceptance/receipts/G17.valid.v1.json +75 -0
  104. package/fixtures/obsidian/acceptance/receipts/G18.valid.v1.json +64 -0
  105. package/fixtures/obsidian/acceptance/service-sentinels.json +10 -0
  106. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/duplicate-evidence-name.v1.json +39 -0
  107. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/evidence-by-absolute-path.v1.json +34 -0
  108. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/missing-candidate-tree.v1.json +33 -0
  109. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/no-evidence.v1.json +28 -0
  110. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-outcome.v1.json +34 -0
  111. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-top-level-field.v1.json +35 -0
  112. package/fixtures/obsidian/contracts/acceptance-receipt/valid/node-gate.v1.json +34 -0
  113. package/fixtures/obsidian/contracts/apply-policy/invalid/automatic-without-edit-class.v1.json +27 -0
  114. package/fixtures/obsidian/contracts/apply-policy/invalid/conflict-overwrite.v1.json +29 -0
  115. package/fixtures/obsidian/contracts/apply-policy/invalid/missing-policy-digest.v1.json +28 -0
  116. package/fixtures/obsidian/contracts/apply-policy/invalid/unbounded-batch.v1.json +29 -0
  117. package/fixtures/obsidian/contracts/apply-policy/invalid/unimplemented-edit-class.v1.json +30 -0
  118. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-mode.v1.json +29 -0
  119. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-selector-operator.v1.json +22 -0
  120. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-top-level-field.v1.json +30 -0
  121. package/fixtures/obsidian/contracts/apply-policy/valid/automatic-scoped.v1.json +29 -0
  122. package/fixtures/obsidian/contracts/apply-policy/valid/manual-default.v1.json +20 -0
  123. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-path-in-ext.v1.json +30 -0
  124. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-repository-root.v1.json +27 -0
  125. package/fixtures/obsidian/contracts/corpus-profile/invalid/duplicate-repository-id.v1.json +27 -0
  126. package/fixtures/obsidian/contracts/corpus-profile/invalid/overlapping-managed-roots.v1.json +27 -0
  127. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-enrollment.v1.json +27 -0
  128. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-top-level-field.v1.json +28 -0
  129. package/fixtures/obsidian/contracts/corpus-profile/valid/three-repositories.v1.json +27 -0
  130. package/fixtures/obsidian/contracts/edit-operation/invalid/absolute-recovery-ref.v1.json +21 -0
  131. package/fixtures/obsidian/contracts/edit-operation/invalid/inline-observed-bytes.v1.json +22 -0
  132. package/fixtures/obsidian/contracts/edit-operation/invalid/missing-base-digest.v1.json +20 -0
  133. package/fixtures/obsidian/contracts/edit-operation/invalid/short-idempotency-key.v1.json +21 -0
  134. package/fixtures/obsidian/contracts/edit-operation/invalid/unknown-kind.v1.json +21 -0
  135. package/fixtures/obsidian/contracts/edit-operation/valid/pending-body-replacement.v1.json +21 -0
  136. package/fixtures/obsidian/contracts/ext-settings/invalid/absolute-path-prefix.v1.json +28 -0
  137. package/fixtures/obsidian/contracts/ext-settings/invalid/apply-policy-in-portable-settings.v1.json +30 -0
  138. package/fixtures/obsidian/contracts/ext-settings/invalid/duplicate-scope-id.v1.json +27 -0
  139. package/fixtures/obsidian/contracts/ext-settings/invalid/machine-local-vault-path.v1.json +28 -0
  140. package/fixtures/obsidian/contracts/ext-settings/invalid/service-port-in-portable-settings.v1.json +28 -0
  141. package/fixtures/obsidian/contracts/ext-settings/invalid/unknown-default-scope.v1.json +27 -0
  142. package/fixtures/obsidian/contracts/ext-settings/valid/disabled.v1.json +5 -0
  143. package/fixtures/obsidian/contracts/ext-settings/valid/enabled-with-scopes.v1.json +27 -0
  144. package/fixtures/obsidian/contracts/generation-manifest/invalid/absolute-note-path.v1.json +114 -0
  145. package/fixtures/obsidian/contracts/generation-manifest/invalid/complete-with-unwritten-notes.v1.json +114 -0
  146. package/fixtures/obsidian/contracts/generation-manifest/invalid/derived-link-claimed-declared.v1.json +114 -0
  147. package/fixtures/obsidian/contracts/generation-manifest/invalid/duplicate-note-identity.v1.json +114 -0
  148. package/fixtures/obsidian/contracts/generation-manifest/invalid/in-scope-endpoint-missing.v1.json +114 -0
  149. package/fixtures/obsidian/contracts/generation-manifest/invalid/title-only-note-path.v1.json +114 -0
  150. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-note-field.v1.json +115 -0
  151. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-relation-type.v1.json +114 -0
  152. package/fixtures/obsidian/contracts/generation-manifest/invalid/withheld-endpoint.v1.json +114 -0
  153. package/fixtures/obsidian/contracts/generation-manifest/valid/two-notes.v1.json +114 -0
  154. package/fixtures/obsidian/contracts/oracles/scope-cases.json +412 -0
  155. package/fixtures/obsidian/contracts/proposal-receipt/invalid/accepted-without-proposal-id.v1.json +12 -0
  156. package/fixtures/obsidian/contracts/proposal-receipt/invalid/missing-adapter-operation-id.v1.json +11 -0
  157. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-backpressure-outcome.v1.json +12 -0
  158. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-top-level-field.v1.json +13 -0
  159. package/fixtures/obsidian/contracts/proposal-receipt/valid/accepted-new.v1.json +12 -0
  160. package/fixtures/obsidian/contracts/proposal-receipt/valid/deferred.v1.json +12 -0
  161. package/fixtures/obsidian/contracts/publication-journal/invalid/absolute-recovery-ref.v1.json +47 -0
  162. package/fixtures/obsidian/contracts/publication-journal/invalid/duplicate-sequence.v1.json +47 -0
  163. package/fixtures/obsidian/contracts/publication-journal/invalid/empty-protocol-id.v1.json +47 -0
  164. package/fixtures/obsidian/contracts/publication-journal/invalid/missing-protocol-id.v1.json +46 -0
  165. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-entry-field.v1.json +48 -0
  166. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-state.v1.json +47 -0
  167. package/fixtures/obsidian/contracts/publication-journal/valid/committed.v1.json +47 -0
  168. package/fixtures/obsidian/contracts/publication-journal/valid/updating-after-restart.v1.json +22 -0
  169. package/fixtures/obsidian/contracts/scope/invalid/absolute-path-prefix.v1.json +15 -0
  170. package/fixtures/obsidian/contracts/scope/invalid/duplicate-ids.v1.json +18 -0
  171. package/fixtures/obsidian/contracts/scope/invalid/expansion-without-node-budget.v1.json +40 -0
  172. package/fixtures/obsidian/contracts/scope/invalid/full-mode-with-subset.v1.json +8 -0
  173. package/fixtures/obsidian/contracts/scope/invalid/unknown-mode.v1.json +41 -0
  174. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-key.v1.json +15 -0
  175. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-operator.v1.json +14 -0
  176. package/fixtures/obsidian/contracts/scope/invalid/unknown-top-level-field.v1.json +42 -0
  177. package/fixtures/obsidian/contracts/scope/valid/explicit-empty.v1.json +8 -0
  178. package/fixtures/obsidian/contracts/scope/valid/focus.v1.json +11 -0
  179. package/fixtures/obsidian/contracts/scope/valid/full.v1.json +8 -0
  180. package/fixtures/obsidian/contracts/scope/valid/scoped-set-expression.v1.json +41 -0
  181. package/fixtures/obsidian/contracts/service-state/invalid/hostname-instead-of-literal-loopback.v1.json +23 -0
  182. package/fixtures/obsidian/contracts/service-state/invalid/missing-consent.v1.json +18 -0
  183. package/fixtures/obsidian/contracts/service-state/invalid/privileged-port.v1.json +23 -0
  184. package/fixtures/obsidian/contracts/service-state/invalid/unknown-top-level-field.v1.json +24 -0
  185. package/fixtures/obsidian/contracts/service-state/invalid/wildcard-bind.v1.json +23 -0
  186. package/fixtures/obsidian/contracts/service-state/valid/healthy.v1.json +23 -0
  187. package/fixtures/obsidian/contracts/source-snapshot/invalid/absolute-file-path.v1.json +48 -0
  188. package/fixtures/obsidian/contracts/source-snapshot/invalid/duplicate-repository-id.v1.json +48 -0
  189. package/fixtures/obsidian/contracts/source-snapshot/invalid/mixed-read.v1.json +48 -0
  190. package/fixtures/obsidian/contracts/source-snapshot/invalid/parent-traversal-path.v1.json +48 -0
  191. package/fixtures/obsidian/contracts/source-snapshot/invalid/unknown-file-field.v1.json +49 -0
  192. package/fixtures/obsidian/contracts/source-snapshot/valid/two-repositories.v1.json +48 -0
  193. package/fixtures/obsidian/edits/workspace.json +65 -0
  194. package/fixtures/obsidian/materialization/expected-full.json +99 -0
  195. package/fixtures/obsidian/materialization/expected-scoped.json +39 -0
  196. package/fixtures/obsidian/materialization/workspace.json +54 -0
  197. package/fixtures/obsidian/proposals/expected-shapes.json +11 -0
  198. package/fixtures/ui/presentation/pane.v1.json +7 -0
  199. package/fixtures/ui/presentation/reference.v1.json +293 -0
  200. package/package.json +57 -6
  201. package/skills/claude/atelier-guided-coauthor/SKILL.md +49 -0
  202. package/skills/claude/atelier-guided-upgrade/SKILL.md +97 -0
  203. package/skills/claude/atelier-open/SKILL.md +5 -0
  204. package/skills/claude/atelier-skill-steward/SKILL.md +62 -0
  205. package/skills/claude/mnstry-readiness/SKILL.md +5 -0
  206. package/skills/codex/atelier-guided-coauthor/SKILL.md +49 -0
  207. package/skills/codex/atelier-guided-upgrade/SKILL.md +97 -0
  208. package/skills/codex/atelier-open/SKILL.md +5 -0
  209. package/skills/codex/atelier-skill-steward/SKILL.md +62 -0
  210. package/skills/codex/mnstry-readiness/SKILL.md +5 -0
  211. package/src/access/preview-enforcer.mjs +84 -0
  212. package/src/boundary/policy.mjs +57 -25
  213. package/src/cli/project-options.mjs +58 -0
  214. package/src/cli/run.mjs +43 -3
  215. package/src/coauthor/session.mjs +161 -0
  216. package/src/coauthor/store.mjs +173 -0
  217. package/src/collaboration/event-ledger.mjs +16 -33
  218. package/src/collaboration/inspection-bundle.mjs +223 -0
  219. package/src/collaboration/review-contracts.mjs +25 -0
  220. package/src/collaboration/review-store.mjs +305 -0
  221. package/src/commands/coauthor.mjs +26 -0
  222. package/src/commands/config.mjs +6 -1
  223. package/src/commands/extension-pack.mjs +15 -8
  224. package/src/commands/init.mjs +44 -5
  225. package/src/commands/obsidian.mjs +368 -0
  226. package/src/commands/review.mjs +147 -0
  227. package/src/commands/setup.mjs +51 -14
  228. package/src/commands/skills.mjs +199 -0
  229. package/src/commands/sync.mjs +8 -1
  230. package/src/composition/registry.mjs +27 -0
  231. package/src/composition/wire.mjs +122 -0
  232. package/src/contracts/corpus.mjs +29 -0
  233. package/src/decisions/contracts.d.mts +96 -0
  234. package/src/decisions/contracts.mjs +321 -0
  235. package/src/disclosure/content-scan.mjs +13 -0
  236. package/src/export/atelier-export-contract.mjs +16 -1
  237. package/src/extension-packs/lifecycle.mjs +154 -0
  238. package/src/graph/graph.mjs +64 -2
  239. package/src/graph/knowledge-graph.mjs +548 -24
  240. package/src/guides/contracts.mjs +54 -0
  241. package/src/intake/store.mjs +119 -0
  242. package/src/preview/channel.mjs +89 -0
  243. package/src/project/config.mjs +26 -27
  244. package/src/project/durable-state.mjs +161 -0
  245. package/src/project/file-class.mjs +166 -0
  246. package/src/project/private-state.mjs +11 -1
  247. package/src/projection/obsidian/contracts.mjs +571 -0
  248. package/src/projection/obsidian/edits/align.mjs +169 -0
  249. package/src/projection/obsidian/edits/apply.mjs +889 -0
  250. package/src/projection/obsidian/edits/arbitrate.mjs +414 -0
  251. package/src/projection/obsidian/edits/contribution.mjs +108 -0
  252. package/src/projection/obsidian/edits/index.mjs +19 -0
  253. package/src/projection/obsidian/edits/object-identity.mjs +61 -0
  254. package/src/projection/obsidian/edits/object-store.mjs +517 -0
  255. package/src/projection/obsidian/edits/observe.mjs +123 -0
  256. package/src/projection/obsidian/edits/policy.mjs +123 -0
  257. package/src/projection/obsidian/edits/regions.mjs +648 -0
  258. package/src/projection/obsidian/materialize/byte-lens.mjs +98 -0
  259. package/src/projection/obsidian/materialize/index.mjs +7 -0
  260. package/src/projection/obsidian/materialize/path-registry.mjs +105 -0
  261. package/src/projection/obsidian/materialize/prepare-view.mjs +746 -0
  262. package/src/projection/obsidian/materialize/settings.mjs +57 -0
  263. package/src/projection/obsidian/materialize/stage.mjs +27 -0
  264. package/src/projection/obsidian/proposals/adapter.mjs +572 -0
  265. package/src/projection/obsidian/proposals/backpressure.mjs +113 -0
  266. package/src/projection/obsidian/proposals/contribution.mjs +55 -0
  267. package/src/projection/obsidian/proposals/index.mjs +23 -0
  268. package/src/projection/obsidian/proposals/observation.mjs +216 -0
  269. package/src/projection/obsidian/proposals/queue.mjs +277 -0
  270. package/src/projection/obsidian/proposals/router.mjs +168 -0
  271. package/src/projection/obsidian/publication/bridge-script.mjs +266 -0
  272. package/src/projection/obsidian/publication/exchange.mjs +117 -0
  273. package/src/projection/obsidian/publication/index.mjs +5 -0
  274. package/src/projection/obsidian/publication/publisher.mjs +588 -0
  275. package/src/projection/obsidian/publication/test-seam.mjs +16 -0
  276. package/src/projection/obsidian/publication/transport.mjs +139 -0
  277. package/src/projection/obsidian/recovery/index.mjs +6 -0
  278. package/src/projection/obsidian/recovery/journal.mjs +134 -0
  279. package/src/projection/obsidian/recovery/late-writer.mjs +46 -0
  280. package/src/projection/obsidian/recovery/restart.mjs +316 -0
  281. package/src/projection/obsidian/recovery/store.mjs +234 -0
  282. package/src/projection/obsidian/selection-ui/conflict-view.mjs +91 -0
  283. package/src/projection/obsidian/selection-ui/contribution.mjs +141 -0
  284. package/src/projection/obsidian/selection-ui/focus.mjs +82 -0
  285. package/src/projection/obsidian/selection-ui/index.mjs +12 -0
  286. package/src/projection/obsidian/selection-ui/policy-setup.mjs +107 -0
  287. package/src/projection/obsidian/selection-ui/receipt.mjs +173 -0
  288. package/src/projection/obsidian/selection-ui/selection-state.mjs +122 -0
  289. package/src/projection/obsidian/selection-ui/selection.mjs +109 -0
  290. package/src/projection/project.mjs +28 -19
  291. package/src/readiness-protocols/evidence.mjs +282 -0
  292. package/src/readiness-protocols/runtime.mjs +4 -3
  293. package/src/readiness-protocols/source-read.mjs +39 -0
  294. package/src/runtime/obsidian/app-capability.mjs +110 -0
  295. package/src/runtime/obsidian/app-production-seams.mjs +96 -0
  296. package/src/runtime/obsidian/contributions/proposal-adapter.mjs +4 -0
  297. package/src/runtime/obsidian/contributions/selection-ui.mjs +4 -0
  298. package/src/runtime/obsidian/contributions/source-apply.mjs +4 -0
  299. package/src/runtime/obsidian/contributions.mjs +27 -0
  300. package/src/runtime/obsidian/documents.mjs +37 -0
  301. package/src/runtime/obsidian/enablement.mjs +53 -0
  302. package/src/runtime/obsidian/engine.mjs +532 -0
  303. package/src/runtime/obsidian/errors.mjs +14 -0
  304. package/src/runtime/obsidian/extension-points.mjs +103 -0
  305. package/src/runtime/obsidian/index.mjs +34 -0
  306. package/src/runtime/obsidian/lifecycle.mjs +258 -0
  307. package/src/runtime/obsidian/machine-settings.mjs +260 -0
  308. package/src/runtime/obsidian/observation.mjs +158 -0
  309. package/src/runtime/obsidian/opening.mjs +243 -0
  310. package/src/runtime/obsidian/pending-edits.mjs +141 -0
  311. package/src/runtime/obsidian/pipeline.mjs +122 -0
  312. package/src/runtime/obsidian/private-lock.mjs +156 -0
  313. package/src/runtime/obsidian/process-identity.mjs +58 -0
  314. package/src/runtime/obsidian/service-client.mjs +66 -0
  315. package/src/runtime/obsidian/service-main.mjs +89 -0
  316. package/src/runtime/obsidian/service-record.mjs +169 -0
  317. package/src/runtime/obsidian/service-server.mjs +121 -0
  318. package/src/runtime/obsidian/service.mjs +216 -0
  319. package/src/runtime/obsidian/startup-adapters.mjs +87 -0
  320. package/src/runtime/obsidian/state-store.mjs +180 -0
  321. package/src/runtime/obsidian/sync-notice.mjs +33 -0
  322. package/src/runtime/obsidian/tick-loop.mjs +84 -0
  323. package/src/runtime/obsidian/watchers.mjs +36 -0
  324. package/src/runtime/supervisor.mjs +16 -1
  325. package/src/server/local-sidecar.mjs +44 -0
  326. package/src/server/server.mjs +1 -0
  327. package/src/skills/steward.mjs +780 -0
  328. package/src/ui/presentation/browser.mjs +278 -0
  329. package/src/ui/presentation/contract.mjs +116 -0
  330. package/src/ui/presentation/index.mjs +7 -0
  331. package/src/ui/presentation/native.mjs +153 -0
  332. package/src/ui/presentation/proof.mjs +57 -0
  333. package/src/ui/presentation/schema-check.mjs +30 -0
  334. package/src/ui/presentation/schema.generated.mjs +1371 -0
  335. package/src/ui/presentation/state.mjs +43 -0
  336. package/src/ui/presentation/styles.mjs +67 -0
  337. package/src/ui/presentation/tokens.mjs +74 -0
  338. package/src/ui/presentation/web.mjs +85 -0
  339. package/src/ui/review-page.mjs +32 -0
  340. package/src/upgrade/explanation.mjs +33 -0
  341. package/src/upgrade/provenance.mjs +338 -0
  342. package/src/upgrade/transaction-files.mjs +103 -0
  343. package/src/upgrade/transaction.mjs +475 -0
  344. package/src/upgrade/upgrade.mjs +63 -28
  345. package/src/vault/hosts.mjs +21 -0
  346. package/src/vault/identity.mjs +19 -0
  347. package/src/vault/index.mjs +7 -0
  348. package/src/vault/interface.mjs +11 -0
  349. package/src/vault/metadata.mjs +31 -0
  350. package/src/vault/privacy.mjs +148 -0
  351. package/src/vault/probe.mjs +89 -0
  352. package/src/vault/service.mjs +131 -0
  353. package/src/vault/source.mjs +45 -0
  354. package/src/vault/storage.mjs +23 -0
  355. package/templates/distribution-workspace/.claude/launch.json +6 -2
  356. package/templates/distribution-workspace/gitignore +1 -0
  357. package/templates/distribution-workspace/project/README.md +2 -2
  358. package/templates/external-project-workspace/README.md +45 -0
  359. package/templates/external-project-workspace/answers.example.json +4 -0
  360. package/templates/external-project-workspace/atelier.project.json +40 -0
  361. package/templates/external-project-workspace/boundary-policy.v1.json +60 -0
  362. package/templates/external-project-workspace/gitignore +8 -0
  363. package/templates/external-project-workspace/pack-lifecycle.json +14 -0
  364. package/templates/external-project-workspace/packs/protocols/contract-gate.v1.json +109 -0
  365. package/templates/external-project-workspace/packs/sample-pack.v1.json +48 -0
  366. package/templates/external-project-workspace/repo-access.v1.json +9 -0
  367. package/templates/external-project-workspace/source/README.md +11 -0
  368. package/templates/launch.json +6 -2
  369. package/templates/private-domain-workspace/.claude/launch.json +6 -2
  370. package/templates/private-domain-workspace/domain/README.md +2 -2
  371. package/templates/private-domain-workspace/gitignore +1 -0
  372. package/templates/shared-project-workspace/.claude/launch.json +6 -2
  373. package/templates/shared-project-workspace/gitignore +1 -0
  374. package/templates/shared-project-workspace/project/README.md +2 -2
@@ -0,0 +1,292 @@
1
+ # Portable private artifact vaults (experimental)
2
+
3
+ This is an optional hosted service contract, not part of the local authoring
4
+ server. The core does not start a service, provision infrastructure, select an
5
+ identity provider, or make network requests on import. A host explicitly binds
6
+ provider SDKs and owns their network access, credentials, costs and operations.
7
+ Canonical sources and editorial review remain in the consuming repository.
8
+ Uploading a derived artifact does not satisfy an editorial publication gate.
9
+
10
+ ## HTTP contract
11
+
12
+ - `GET /<vault>/<artifact-path>` and `HEAD` authenticate a browser session and
13
+ require exact owner issuer + subject equality. Every asset uses this route.
14
+ - `POST /_publish/<vault>` requires a separate vault-scoped machine credential.
15
+ Browser cookies and Origin headers are refused on this endpoint. The JSON
16
+ body has schema `atelier-vault-publication/v1`, `contractVersion: "1.0.0"`,
17
+ `expectedRevision` (initially
18
+ zero), and `files: [{path, base64}]`. No URL retrieval or directory discovery
19
+ occurs. The caller explicitly selects all uploaded files and is responsible
20
+ for source selection, disclosure checks and any editorial approval.
21
+ - Successful publication returns 201 and a receipt containing vault, revision
22
+ and the SHA-256 publication digest. Conflicts return 409. Retry after uncertain
23
+ delivery uses `GET /_publish/<vault>` with the same machine credential. It
24
+ returns only schema `atelier-vault-status/v1`, vault, revision and publication
25
+ digest (null before the first publication), never the file manifest. Compare
26
+ both revision and digest with the intended publication before declaring it
27
+ delivered. A differing digest or later revision requires reconciliation; do
28
+ not silently overwrite it. There is no automatic retry or idempotency promise.
29
+ - Unauthenticated reads return 401; a host may route these to its established
30
+ sign-in UI. Missing and non-owned vaults both return 404. Failures return 503
31
+ without leaking adapter errors. No CORS grants or sharing bypass exist.
32
+ - Requests are limited to 4 MiB encoded JSON, 100 files, conservative ASCII
33
+ paths and allowlisted types. HTML and CSS are supported with restrictive CSP;
34
+ scripts, SVG and arbitrary interactive applications are excluded. HTML is
35
+ sandboxed without same-origin or script privileges. PDF is a download.
36
+
37
+ All output, including errors, is private/no-store. Content bytes are checked
38
+ against the committed manifest before delivery. No public object URLs or
39
+ presigned download redirects are returned. Revocation blocks subsequent
40
+ checks; it cannot recall a response already authorized or a downloaded file.
41
+
42
+ The optional `contractVersion` and inert `ext` containers follow the kit schema
43
+ epoch. Extension data never grants authority and is not copied into artifacts.
44
+
45
+ ## Host interfaces
46
+
47
+ Import the `@mnstry/atelier/vault` entrypoint. `createVaultService` takes:
48
+
49
+ - `identity.read(request)` returns a verified `{issuer, subject}` or null. It
50
+ must verify signatures, issuer/audience, expiry and current revocation using
51
+ the chosen provider. Never derive identity from a caller-provided header.
52
+ - `identity.publish(request, vault)` verifies a machine credential. The supplied
53
+ `vaultIdentity` helper hashes a high-entropy bearer credential and calls the
54
+ host's authoritative `lookupCredential(hash)`. A record contains `vault`,
55
+ `owner`, `revoked: false` and finite millisecond `expiresAt`. Generate at least
56
+ 32 random bytes; never place credentials in repository files or URLs.
57
+ - `metadata.get(vault)` returns owner, revision and manifest. `commit` compares
58
+ owner AND expected revision atomically before replacing the current manifest.
59
+ - `storage.put(key, bytes)` and `get(key)` use private storage. Keys are generated
60
+ from validated vault IDs and byte digests; request paths never become keys.
61
+
62
+ Metadata lookup and credential lookup must use authoritative current state,
63
+ not eventually consistent caches. Provision vault ownership out of band; the
64
+ publication endpoint cannot claim a vault or change ownership. A host identity
65
+ migration must explicitly map issuer and subject, not match email strings.
66
+
67
+ ## Provider bindings
68
+
69
+ `createVercelVault` composes Blob/PostgreSQL bindings into a Web handler.
70
+ `createCloudflareVault` returns a Worker with per-request first-primary D1
71
+ sessions, using `env.VAULT_OBJECTS` and `env.VAULT_DB`. Both require explicit
72
+ verified-session and current-credential lookup functions from the host.
73
+
74
+
75
+ Vercel: pass the host-installed `@vercel/blob` SDK to `vercelPrivateStorage` and
76
+ an established PostgreSQL client object exposing `query(sql, args)` to `postgresVaultMetadata`. Use the
77
+ exported `VAULT_TABLE_SQL` to initialize a new disposable/purpose-built store.
78
+ Bind an established browser identity SDK to `verifySession`; the kit does not
79
+ ship a bespoke login system. Route all vault paths through the handler. Do not
80
+ copy artifact output into public/static deployment directories.
81
+
82
+ Cloudflare: pass a private R2 binding to `r2PrivateStorage` and D1 to
83
+ `d1VaultMetadata`. If using D1 read replication, pass a session with
84
+ `first-primary` semantics so ownership lookup cannot use a stale replica.
85
+ The Web Request/Response handler can run directly in a Worker. Disable public
86
+ R2 access and do not attach a public R2 domain. All Worker/provider aliases must
87
+ run the same handler; no cache rule or static-assets shortcut may bypass it.
88
+
89
+ Each adapter puts immutable-in-meaning content-addressed bytes first, then
90
+ switches the manifest through an atomic SQL update. Concurrent publications
91
+ cannot overwrite a newer revision. Failed uploads can leave unreferenced
92
+ private objects; garbage collection and retention are host responsibilities.
93
+ There is no automatic deletion. Republishing a selected earlier artifact set
94
+ at the current expected revision implements rollback as a new revision.
95
+
96
+ References:
97
+ - https://vercel.com/docs/vercel-blob/private-storage
98
+ - https://developers.cloudflare.com/r2/api/workers/workers-api-reference/
99
+ - https://developers.cloudflare.com/d1/worker-api/d1-database/
100
+
101
+ ## Qualification and remaining integration
102
+
103
+ `node --test test/vault.test.mjs` exercises both storage adapters with SDK-shaped
104
+ local doubles and a real SQLite engine behind both SQL interfaces. PostgreSQL
105
+ placeholder translation in the test is a local double, not a PostgreSQL engine. This proves
106
+ shared local behavior, not Vercel, R2, D1 or PostgreSQL hosted operation.
107
+
108
+ Before serving real material: qualify the chosen identity SDK and browser
109
+ login/revocation, deployed provider bindings, owner/wrong-owner/anonymous reads,
110
+ all aliases and assets, CSS/image rendering under sandbox CSP, publication
111
+ failure recovery, limits and credentials. Run a source-bound independent
112
+ review. These are open gates. The implementation is not deployment-ready.
113
+ The SDKs, production credential store, provisioning UI, CLI integration and
114
+ hosted conformance runner remain consumer-host work for the next integration
115
+ step. No existing deployment or protection setting is modified by this code.
116
+
117
+ ## Privacy gate and vault interface
118
+
119
+ This is an experimental contract, not a qualified hosted product. The service
120
+ requires a trusted `deployment: {id, origins}` binding. Origins are canonical
121
+ HTTPS origins, including every deployment alias and direct handler origin (up
122
+ to 16). The provider inspector must discover any additional bypass surfaces and
123
+ refuse `completeInventory` if this binding is stale. Configuration evidence is
124
+ trusted host input, never publisher/browser input or a repository assertion.
125
+
126
+ The context carries vault, owner, publication digest, metadata revision, manifest, deployment,
127
+ request origin/path, phase, and `objects: [{key, sha256, size}]`. Object keys are
128
+ explicit even before upload. The evaluator requires both vault home routes and
129
+ every manifest path on every configured origin, plus every unique object key.
130
+ Each route target has `kind: "route"`, URL and expected SHA-256; each storage
131
+ target has `kind: "storage"`, URL, key, SHA-256 and size. Storage URLs are only
132
+ passed to the trusted inspector/transport, never returned to the browser.
133
+
134
+ Privacy checks ask whether **anonymous and other-user identities are denied**.
135
+ They never request an owner's session or probe as the author. Owner rendering
136
+ and login continuity are separate functional acceptance checks. Consequently,
137
+ probes against the real handler exit at authorization without recursively
138
+ entering the privacy gate. No substitute owner route or privileged inspection
139
+ endpoint is used to manufacture a verified verdict.
140
+
141
+ `privacy.verify(context)` collects before-upload and before-activation evidence.
142
+ Before upload, authoritative provider configuration must attest private storage
143
+ and owner-only routing before private bytes are written. Denial probes of paths
144
+ that do not yet exist are supplementary; a 404 alone cannot prove future bytes
145
+ will be protected. A host can supply public synthetic canary markers to check
146
+ its protection machinery, without uploading private data to discover exposure.
147
+ Before activation, the same gate checks actual staged object locations and all
148
+ planned artifact routes. Unactivated artifact paths may return 404; their future
149
+ owner rendering is not asserted by a denial verdict. Provider configuration and
150
+ the handler's authorization remain the preventive controls. A change between
151
+ checks refuses activation, but cannot atomically lock external provider policy.
152
+
153
+ Read requests call only `privacy.current(context)`, which must load stored
154
+ current evidence. They never collect probes. Missing, expired, wrong-owner,
155
+ wrong-deployment, wrong-publication or incomplete evidence blocks delivery.
156
+ `createVaultPrivacyState({probe, load, compareAndSet})` supplies an explicit refresher and
157
+ host-owned evidence persistence. Call `refresh(context)` after commit and from
158
+ the host scheduler with the current authoritative manifest and owner. Use the public
159
+ `createVaultContext({vault, record, deployment})` export to build that context
160
+ from `metadata.get(vault)`; it includes storage keys, revision and null handling
161
+ without copying internal formats. Refresh rejects a missing, negative or
162
+ non-integer revision before reading the evidence store. Activation
163
+ evidence is deliberately not promoted to read evidence; owner delivery remains
164
+ unavailable until the first successful read-phase refresh. Refresh failure never
165
+ extends a validity window. A policy change requires immediate host invalidation;
166
+ the kit cannot discover that change from an evidence-store read alone.
167
+
168
+ The store key includes deployment ID and vault. `load(key)` returns an immutable
169
+ snapshot `{version, evidence}`; a missing record is `{version: 0, evidence: null}`.
170
+ `compareAndSet(key, evidence, {expectedVersion})` must atomically compare the
171
+ version, increment it on success and return exactly `true`, or return `false`
172
+ without writing. Its transaction must refuse replacement of any exposure alarm
173
+ and refuse older metadata revisions for green evidence. Exposure alarms must
174
+ be allowed to replace newer green evidence regardless of the alarm revision: a
175
+ staged-only exposure can concern objects outside the current manifest. Separate atomic load/save calls are not
176
+ sufficient. Protect the store from publishers; no unconditional save adapter is
177
+ accepted. Evidence and refresh contexts bind the authoritative metadata revision.
178
+
179
+ Green evidence retains the version loaded before collection. A conflict refuses
180
+ that collection; it is never converted into an unconditional overwrite. Before
181
+ returning non-read green evidence, the wrapper reloads the store to notice an
182
+ alarm another instance persisted during probing. This check is not atomic with
183
+ metadata activation; hosts must still own provider containment and transactions.
184
+
185
+ Exposure alarms use a different path. The wrapper latches the original evidence
186
+ in memory, then reloads and conditionally writes it, with at most three attempts
187
+ per verify/refresh call. If a durable alarm already exists, no rewrite is needed.
188
+ If writes conflict, each retry uses a fresh snapshot. If the store throws or the
189
+ attempt bound is reached, verify/refresh rejects with the public
190
+ `VaultAlarmPersistenceError` (`code: "VAULT_ALARM_NOT_PERSISTED"`, `evidence`).
191
+ Hosts must alert on that error and retry the same wrapper after store recovery.
192
+ Its next verify/refresh retries the original pending evidence without re-probing,
193
+ so a vanished or staged-only exposure is not forgotten. Store calls themselves
194
+ must have host-enforced deadlines; the attempt bound is not a network timeout.
195
+
196
+ `current` performs no persistence retry or probe and immediately returns any
197
+ local alarm, including an unpersisted one. The service's gate translates the
198
+ typed error into an exposed/refused result with `persistence: "unconfirmed"`;
199
+ the underlying wrapper API exposes the typed error to host refresh/verification
200
+ callers. Other instances and restarts cannot see an unpersisted memory latch,
201
+ so durable-store failure is an unresolved incident, never a success receipt.
202
+ Best-effort notification alone does not settle it.
203
+
204
+ No alarm-clear API is provided. Recovery is an explicit host operator procedure:
205
+ contain the external exposure, verify restored controls, reconcile durable state,
206
+ then replace affected handler instances. Restart alone is not recovery and does
207
+ not clear a successfully persisted alarm. No provider containment is implemented
208
+ by this module.
209
+
210
+ ### Reusable denial probe collector
211
+
212
+ `createVaultPrivacyProbe({inspect, request, onExposure})` takes an explicit
213
+ provider inspector and transport, without choosing a network implementation.
214
+ The transport receives only anonymous/otherUser identity, manual redirects and
215
+ an AbortSignal; otherUser must be a dedicated synthetic unauthorized principal,
216
+ not another real person's session. Never give this collector an owner credential.
217
+ The inspector supplies configuration, policy revision and the full target list.
218
+ Configuration must report `ownerOnly`, `privateStorage`, `completeInventory`.
219
+
220
+ The collector supports at most 2000 targets, sufficient for 100 files across
221
+ 16 origins plus home routes and unique storage objects. Exceeding the bound or
222
+ the configurable whole-operation deadline (maximum/default 60 seconds) refuses
223
+ verification; completeness is never replaced with sampling. The serial transport
224
+ may not finish a large inventory in time. Qualify provider latency and choose a
225
+ smaller deployment or a separately reviewed batched collector if needed. The
226
+ current 60-second validity starts at collection start; refresher period plus
227
+ worst-case collection time must be strictly less than 60 seconds. A minute
228
+ schedule or a near-deadline collection cannot provide continuous availability.
229
+ These defaults are an open product limitation, not a scheduling recommendation.
230
+
231
+ Each target supplies an expected SHA-256, optionally a public synthetic `canary`
232
+ marker of at least 32 characters. Nonempty whole-body digest or embedded canary matches
233
+ are exposure even on error or already-followed responses. Zero-byte artifacts
234
+ remain valid: an empty refusal discloses no bytes and never raises an exposure
235
+ alarm. Home-route digests may use an inspector-defined placeholder; use an
236
+ explicit public canary to detect actual listing disclosure. Nonempty 401/403/404 bodies without a match
237
+ are inconclusive, because a body fragment is not proof of non-disclosure. Empty
238
+ 401/403/404 responses count as denial. Arbitrary HTML and 5xx are inconclusive.
239
+ Login redirects may match trusted `loginEndpoints: [{url, queryKeys}]`; endpoints
240
+ are exact HTTPS origin/path, with an explicit allowlist of supported non-secret
241
+ parameter names. Credential-bearing or unexpected parameters, hosts and paths
242
+ are inconclusive. The collector never follows redirects or copies login values
243
+ into evidence. This verifies refusal, not the return-to user experience.
244
+
245
+ Evidence starts its freshness window at collection start (60 seconds), binds
246
+ owner/operation/publication/deployment, retains target digests and keys, and
247
+ re-inspects provider policy using canonical object-key ordering. An unauthorized
248
+ content observation returns immediately and stays `exposed` even if evidence
249
+ later expires. Optional `onExposure(evidence)` is a best-effort host notification;
250
+ it cannot delay or downgrade the alarm and is not durable containment. Hosts
251
+ must persist incidents and enforce provider-side containment independently.
252
+ No scheduler, provider configuration collector, credential store, containment
253
+ operation, or hosted transport is bundled here.
254
+
255
+ A provider bypass can expose staged objects after a successful preflight. This
256
+ handler can refuse its own delivery/activation but cannot close an external
257
+ public origin or delete orphaned bytes. Before real material, qualify atomic
258
+ incident persistence, provider protection restoration, staging retention/deletion
259
+ and owner-visible recovery. Do not advertise a denied handler response as global
260
+ containment or an observed denial as permanent privacy.
261
+
262
+ ### Reference interface and browser qualification
263
+
264
+ The reference home provides privacy status, revision, navigation, search, empty
265
+ and unavailable states, accessible labels and responsive layout. Its status
266
+ states that unauthorized-access checks passed at a recorded time, not that owner
267
+ rendering or every future provider state is proven. Generated HTML stays outside
268
+ the trusted shell under script-disabled sandbox CSP. This is a minimal reference
269
+ interface, not full authoring/review parity.
270
+
271
+ **Open browser design gate:** opaque-origin sandboxed HTML may lose SameSite
272
+ session cookies on CSS/image requests. Widening cookies can permit cross-site
273
+ embedding. The kit does not silently remove sandbox isolation or widen cookie
274
+ scope. A consuming host must qualify an isolated artifact-origin/session design,
275
+ including Chromium/Firefox/WebKit subresources and refused cross-site embeds,
276
+ before claiming browser-product readiness. No browser acceptance is claimed.
277
+
278
+ ### Source layouts
279
+
280
+ The Node-only `@mnstry/atelier/vault/source` entrypoint exports
281
+ `prepareVaultSource({root, paths, expectedRevision})`. Pass an absolute local
282
+ artifact root and explicit relative file paths. A root can be a folder inside
283
+ the authoring repository or a separate artifact checkout; neither is scanned
284
+ automatically. It returns the publication request, digest and manifest without
285
+ uploading anything. Keep machine-specific roots in local host configuration.
286
+
287
+ The reader refuses symlinks, hard-linked files, path escapes, directories,
288
+ unsupported formats and oversized bundles. It checks file identity and metadata
289
+ around the read and binds the resulting bytes to the manifest. Run against a
290
+ quiescent source tree; portable filesystem checks are not a sandbox against a
291
+ malicious process concurrently replacing ancestor directories. The publication
292
+ bundle is an immutable byte snapshot, not a live directory handle.
@@ -0,0 +1,5 @@
1
+ {
2
+ "id": "sample-session",
3
+ "fields": [],
4
+ "publication": true
5
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "sample-session",
3
+ "fields": [
4
+ {
5
+ "id": "sample-field",
6
+ "source": {
7
+ "ref": "packet.md",
8
+ "digest": "0000000000000000000000000000000000000000000000000000000000000000"
9
+ }
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "schema": "mnstry.atelier-remote-capability@v1",
3
+ "id": "sample-capability",
4
+ "serviceRef": "https://example.invalid/mcp",
5
+ "inputSchemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6
+ "outputSchemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7
+ "maxInputBytes": 1024,
8
+ "implementation": "remote",
9
+ "executionAuthority": false,
10
+ "command": "execute"
11
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "schema": "mnstry.atelier-remote-capability@v1",
3
+ "id": "sample-capability",
4
+ "serviceRef": "https://example.invalid/mcp",
5
+ "inputSchemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6
+ "outputSchemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7
+ "maxInputBytes": 1024,
8
+ "implementation": "remote",
9
+ "executionAuthority": false
10
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "schema": "mnstry.atelier-guide-consent@v1",
3
+ "offerDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
4
+ "capabilityDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
5
+ "payloadDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6
+ "engagementRevision": 1,
7
+ "status": "approved",
8
+ "validFrom": "2026-01-01T00:00:00Z",
9
+ "expiresAt": "2026-01-02T00:00:00Z",
10
+ "authority": "local-assertion-only"
11
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "schema": "mnstry.atelier-guide-engagement@v1",
3
+ "offerDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
4
+ "revision": 0,
5
+ "status": "proposed",
6
+ "authority": "local-assertion-only"
7
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "schema": "mnstry.atelier-guide-offer@v1",
3
+ "id": "sample-offer",
4
+ "guideId": "sample-guide",
5
+ "capabilityIds": [
6
+ "sample-capability"
7
+ ],
8
+ "deliverableReview": "required",
9
+ "commercialAuthority": false
10
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "schema": "mnstry.atelier-intake-completion@v1",
3
+ "attemptId": "sample",
4
+ "attemptDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
5
+ "outputDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6
+ "bytes": 12,
7
+ "integrity": "verified",
8
+ "semanticAcceptance": "accepted"
9
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "schema": "mnstry.atelier-intake-attempt@v1",
3
+ "attemptId": "sample",
4
+ "blobId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
5
+ "extractorId": "plain-text",
6
+ "extractorVersion": "1",
7
+ "configurationDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "schema": "mnstry.atelier-intake-completion@v1",
3
+ "attemptId": "sample",
4
+ "attemptDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
5
+ "outputDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6
+ "bytes": 12,
7
+ "integrity": "verified",
8
+ "semanticAcceptance": "pending"
9
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "schema": "mnstry.atelier-intake-source@v1",
3
+ "sourceRef": "sample.txt",
4
+ "blobId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
5
+ "bytes": 12,
6
+ "originalMutation": false
7
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "schema": "atelier-contribution@v1",
3
+ "input": {
4
+ "requestId": "example-decision",
5
+ "kind": "decision",
6
+ "targetId": "claim:readiness-run-2061e72d2051ed20fc51b9ef:scope-supports-review",
7
+ "expectedVersion": 0,
8
+ "reviewer": "Example Reader",
9
+ "rationale": "Read the mapped source.",
10
+ "runId": "readiness-run-2061e72d2051ed20fc51b9ef",
11
+ "evidenceDigest": "sha256:4ada62e30889014598a5f57af253789424dd668dfbe36b38f51f176a49db2633",
12
+ "decision": "accepted"
13
+ },
14
+ "inputDigest": "sha256:b86ef8ee5d46d01b3e1ea438284f72558c81b37667d618c260198d675aad20c5",
15
+ "key": "sha256:4a166ed7e3de11fbde448638c30d1e1e5dfe52e1ecdf36ad4b25e5e49d54fe8e",
16
+ "version": 1,
17
+ "identity": {
18
+ "kind": "authenticated",
19
+ "name": "Example Reader"
20
+ },
21
+ "recordedAt": "2026-09-06T14:24:30.169Z"
22
+ }
@@ -0,0 +1,229 @@
1
+ {
2
+ "schema": "atelier-bound-run@v1",
3
+ "run": {
4
+ "schema": "atelier-readiness-run@v1",
5
+ "runId": "readiness-run-2061e72d2051ed20fc51b9ef",
6
+ "protocolId": "sample.readiness:contract-gate",
7
+ "createdAt": "2026-01-01T00:00:00.000Z",
8
+ "project": "sample-adapter",
9
+ "answers": {
10
+ "scope.name": "Sample observation",
11
+ "scope.sourceRef": "sample-source:observation"
12
+ },
13
+ "status": "review-needed",
14
+ "score": 100,
15
+ "blockers": [],
16
+ "warnings": [],
17
+ "claims": [
18
+ {
19
+ "schema": "atelier-claim@v1",
20
+ "claimId": "claim:readiness-run-2061e72d2051ed20fc51b9ef:scope-supports-review",
21
+ "subject": "readiness:sample-adapter:contract-gate",
22
+ "predicate": "supports",
23
+ "object": "readiness:contract-gate:scope-supports-review",
24
+ "provider": "atelier-readiness",
25
+ "status": "proposed",
26
+ "promoted": false,
27
+ "evidence": [
28
+ "readiness-run:readiness-run-2061e72d2051ed20fc51b9ef"
29
+ ],
30
+ "notes": [
31
+ "Proposed sample.readiness:contract-gate.scope-supports-review from Sample contract gate.",
32
+ "Answer presence is not evidence confidence; human judgment is required."
33
+ ],
34
+ "createdAt": "2026-01-01T00:00:00.000Z"
35
+ }
36
+ ],
37
+ "safety": {
38
+ "runtimeMutation": false,
39
+ "runtimeImport": false,
40
+ "canonicalWrites": false,
41
+ "claimOnly": true,
42
+ "storage": "ignored-local"
43
+ }
44
+ },
45
+ "runDigest": "sha256:f8df3d130264a55d6b246f8265f192da5ce6044d16d98be06a146cd41ac233e6",
46
+ "snapshot": {
47
+ "schema": "atelier-review-evidence@v1",
48
+ "protocolId": "sample.readiness:contract-gate",
49
+ "protocol": {
50
+ "schema": "atelier-readiness-protocol@v1",
51
+ "id": "sample.readiness:contract-gate",
52
+ "slug": "contract-gate",
53
+ "version": "v1",
54
+ "stage": "formation",
55
+ "title": "Sample contract gate",
56
+ "purpose": "Verify neutral protocol inputs before a readiness run is accepted.",
57
+ "questions": [
58
+ {
59
+ "id": "scope",
60
+ "prompt": "What neutral scope is being prepared?",
61
+ "inputFields": [
62
+ "scope.name",
63
+ "scope.sourceRef"
64
+ ],
65
+ "required": true
66
+ }
67
+ ],
68
+ "inputFields": [
69
+ {
70
+ "id": "scope.name",
71
+ "type": "string",
72
+ "required": true,
73
+ "description": "Neutral scope name."
74
+ },
75
+ {
76
+ "id": "scope.sourceRef",
77
+ "type": "string",
78
+ "required": true,
79
+ "description": "Evidence reference for the scope."
80
+ }
81
+ ],
82
+ "outputHints": [
83
+ {
84
+ "id": "contract-gate.summary",
85
+ "text": "Render scope and evidence before review."
86
+ }
87
+ ],
88
+ "outputs": {
89
+ "runSchema": "atelier-readiness-run@v1",
90
+ "artifacts": [
91
+ {
92
+ "id": "sample.readiness:contract-gate.summary",
93
+ "kind": "draft",
94
+ "schema": "atelier-readiness-run@v1",
95
+ "description": "Draft readiness summary."
96
+ }
97
+ ]
98
+ },
99
+ "claimMappings": [
100
+ {
101
+ "id": "sample.readiness:contract-gate.scope-supports-review",
102
+ "claimPredicate": "supports",
103
+ "sourceFields": [
104
+ "scope.name"
105
+ ],
106
+ "target": "atelier-claim@v1",
107
+ "evidence": "scope.sourceRef"
108
+ }
109
+ ],
110
+ "readinessRules": [
111
+ {
112
+ "id": "sample.readiness:contract-gate.scope-present",
113
+ "severity": "blocker",
114
+ "condition": "Scope name and evidence are present.",
115
+ "remediation": "Add scope.name and scope.sourceRef.",
116
+ "failClosed": true
117
+ }
118
+ ],
119
+ "graphLenses": [
120
+ {
121
+ "id": "sample.readiness:contract-gate.lens",
122
+ "title": "Sample contract gate lens",
123
+ "query": {
124
+ "protocolId": "sample.readiness:contract-gate"
125
+ }
126
+ }
127
+ ],
128
+ "exportMappings": [
129
+ {
130
+ "id": "sample.readiness:contract-gate.export",
131
+ "sourceField": "scope",
132
+ "sourceTerm": "sample.readiness:contract-gate.scope",
133
+ "target": "core.artifact",
134
+ "runtimeOwner": "audit",
135
+ "targetCollection": "staffPrep"
136
+ }
137
+ ],
138
+ "ui": {
139
+ "section": "readiness-journey",
140
+ "title": "Sample contract gate",
141
+ "description": "Neutral protocol fixture.",
142
+ "agentPrompt": "Run atelier readiness run sample.readiness:contract-gate --project ./atelier.project.json."
143
+ },
144
+ "safety": {
145
+ "runtimeMutation": false,
146
+ "runtimeImport": false,
147
+ "canonicalWrites": false,
148
+ "claimOnly": true,
149
+ "telemetry": false,
150
+ "egress": false,
151
+ "sendPath": false,
152
+ "browserApply": false,
153
+ "dryRunOnly": true
154
+ },
155
+ "safetyPosture": {
156
+ "runtimeMutation": false,
157
+ "externalEgress": false,
158
+ "defaultVisibility": "private",
159
+ "authority": "proposal-only",
160
+ "reviewMode": "static-inspection",
161
+ "failClosedOnMissingEvidence": true,
162
+ "refuses": [
163
+ "runtime writes"
164
+ ]
165
+ }
166
+ },
167
+ "protocolDigest": "sha256:9acc7315916332fca63495fd256739403a5a46833094dd056343c5776e5bbbbd",
168
+ "answers": {
169
+ "scope.name": "Sample observation",
170
+ "scope.sourceRef": "sample-source:observation"
171
+ },
172
+ "answersDigest": "sha256:e2fc229e8deaf4c6e004f011aa2abe466572425c6d7bdd677b893375980f67e8",
173
+ "configDigest": "sha256:1a4f8d12aad9bf457521e2ec4675a3cf372ad1be552817d7fb08a85f625c2145",
174
+ "lifecycleDigest": "sha256:bb744765b3b8825285a1168d6ec7ac4abb3a7e97459d1e828d1317a0d841d5f9",
175
+ "policyDigest": "sha256:93d58dd57620ba26497459dedc0744a4909ad2204112186fd0d9e49532c9e64b",
176
+ "packs": [
177
+ {
178
+ "id": "sample.readiness",
179
+ "version": "v1",
180
+ "digest": "sha256:0eff795765e0bbd4c2510acda2e492201c23bc870df6c354eef623484643ab11"
181
+ }
182
+ ],
183
+ "evaluator": {
184
+ "id": "answer-completeness/v1",
185
+ "digest": "sha256:223fcaf96e973c2798803e177893d4eb749e52237a5767c082446c2c60c79159"
186
+ },
187
+ "sources": [
188
+ {
189
+ "id": "sample-source:observation",
190
+ "repo": "source",
191
+ "path": "README.md",
192
+ "audience": "private",
193
+ "digest": "sha256:5e4159e37577f4fe466b69646b9d1a5067eaa85cf2d4f9a6e65bd7de157d9b6b",
194
+ "metadata": null
195
+ }
196
+ ],
197
+ "claimEvidence": [
198
+ {
199
+ "mappingId": "sample.readiness:contract-gate.scope-supports-review",
200
+ "sourceFields": [
201
+ "scope.name"
202
+ ],
203
+ "answers": {
204
+ "scope.name": "Sample observation"
205
+ },
206
+ "evidenceField": "scope.sourceRef",
207
+ "references": [
208
+ "sample-source:observation"
209
+ ],
210
+ "resolved": [
211
+ {
212
+ "id": "sample-source:observation",
213
+ "repo": "source",
214
+ "path": "README.md",
215
+ "digest": "sha256:5e4159e37577f4fe466b69646b9d1a5067eaa85cf2d4f9a6e65bd7de157d9b6b",
216
+ "excerpt": "---\ntitle: Sample observation\nkg:\n id: \"sample-source:observation\"\n type: \"document\"\n status: \"active\"\n audience: \"private\"\n---\n# Sample observation\n\nThe sample observation needs an owner to confirm its interpretation.\n"
217
+ }
218
+ ],
219
+ "unresolved": [],
220
+ "status": "linked-source"
221
+ }
222
+ ],
223
+ "limitations": [
224
+ "Answers are operator assertions; source presence does not substantiate each claim.",
225
+ "No calibrated evidence confidence or runtime acceptance is established."
226
+ ],
227
+ "digest": "sha256:4ada62e30889014598a5f57af253789424dd668dfbe36b38f51f176a49db2633"
228
+ }
229
+ }