@mnstry/atelier 0.2.0-alpha.1 → 0.2.0-alpha.11

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 (414) hide show
  1. package/CHANGELOG.md +413 -0
  2. package/README.md +402 -205
  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-repository-observation.v1.schema.json +163 -0
  25. package/contracts/atelier-review.v1.schema.json +1601 -0
  26. package/contracts/atelier-skill-steward.v1.schema.json +692 -0
  27. package/contracts/atelier-upgrade-plan.v2.schema.json +398 -0
  28. package/contracts/atelier-upgrade-receipt.v1.schema.json +99 -0
  29. package/contracts/atelier-vault-publication.v1.schema.json +58 -0
  30. package/contracts/public-api-baseline.json +57 -0
  31. package/docs/assurance-controls.md +49 -0
  32. package/docs/atelier-runtime.md +28 -2
  33. package/docs/atelier-sync.md +172 -0
  34. package/docs/blocks/audience-visibility.md +9 -0
  35. package/docs/blocks/claims.md +61 -0
  36. package/docs/blocks/conformance-admission.md +15 -0
  37. package/docs/blocks/will-not-do.md +18 -0
  38. package/docs/coauthor-session.md +57 -0
  39. package/docs/connected-composition.md +75 -0
  40. package/docs/continuity.md +3 -4
  41. package/docs/decisions.md +167 -0
  42. package/docs/design.md +167 -0
  43. package/docs/exact-upgrades.md +159 -0
  44. package/docs/extension-pack-lifecycle.md +33 -0
  45. package/docs/guided-upgrades.md +99 -0
  46. package/docs/install.md +99 -16
  47. package/docs/intake-and-guides.md +65 -0
  48. package/docs/integration-and-review-plan.md +409 -0
  49. package/docs/integration-contract-decisions.md +22 -0
  50. package/docs/knowledge-graph.md +8 -4
  51. package/docs/local-review.md +84 -0
  52. package/docs/local-services.md +328 -0
  53. package/docs/local-state.md +107 -0
  54. package/docs/obsidian-contract.md +698 -0
  55. package/docs/obsidian.md +484 -0
  56. package/docs/portable-presentation.md +328 -0
  57. package/docs/presentation-consumer-boundaries.md +75 -0
  58. package/docs/presentation-review-disposition.md +47 -0
  59. package/docs/project-command-inventory.md +38 -0
  60. package/docs/project-options.md +53 -0
  61. package/docs/release-engineering.md +174 -12
  62. package/docs/repo-boundary-guard.md +12 -2
  63. package/docs/review-portability.md +55 -0
  64. package/docs/skill-steward.md +156 -0
  65. package/docs/upgrade.md +155 -5
  66. package/docs/vault-service.md +292 -0
  67. package/fixtures/atelier-coauthor/invalid/authority.v1.json +5 -0
  68. package/fixtures/atelier-coauthor/valid/config.v1.json +12 -0
  69. package/fixtures/atelier-guide/invalid/authority.v1.json +11 -0
  70. package/fixtures/atelier-guide/valid/capability.v1.json +10 -0
  71. package/fixtures/atelier-guide/valid/consent.v1.json +11 -0
  72. package/fixtures/atelier-guide/valid/engagement.v1.json +7 -0
  73. package/fixtures/atelier-guide/valid/offer.v1.json +10 -0
  74. package/fixtures/atelier-intake/invalid/authority.v1.json +9 -0
  75. package/fixtures/atelier-intake/valid/attempt.v1.json +8 -0
  76. package/fixtures/atelier-intake/valid/completion.v1.json +9 -0
  77. package/fixtures/atelier-intake/valid/source.v1.json +7 -0
  78. package/fixtures/atelier-repository-observation/invalid/complete-with-blocker.v1.json +18 -0
  79. package/fixtures/atelier-repository-observation/valid/complete-local.v1.json +48 -0
  80. package/fixtures/atelier-review/invalid/authenticated-identity.v1.json +22 -0
  81. package/fixtures/atelier-review/valid/bound.v1.json +229 -0
  82. package/fixtures/atelier-review/valid/bundle.v1.json +267 -0
  83. package/fixtures/atelier-review/valid/contribution.v1.json +22 -0
  84. package/fixtures/atelier-review/valid/lifecycle.v1.json +14 -0
  85. package/fixtures/atelier-skill-steward/audit/invalid/source-mutation.v1.json +26 -0
  86. package/fixtures/atelier-skill-steward/audit/valid/clean.v1.json +26 -0
  87. package/fixtures/atelier-skill-steward/candidates/invalid/workflow-key.v1.json +37 -0
  88. package/fixtures/atelier-skill-steward/candidates/valid/create.v1.json +37 -0
  89. package/fixtures/atelier-skill-steward/lock/invalid/bad-digest.v1.json +18 -0
  90. package/fixtures/atelier-skill-steward/lock/valid/installed.v1.json +23 -0
  91. package/fixtures/atelier-skill-steward/plan/invalid/delete-action.v1.json +33 -0
  92. package/fixtures/atelier-skill-steward/plan/valid/add.v1.json +33 -0
  93. package/fixtures/atelier-upgrade-transaction/adoption-policy/invalid/example.json +12 -0
  94. package/fixtures/atelier-upgrade-transaction/adoption-policy/valid/example.json +11 -0
  95. package/fixtures/atelier-upgrade-transaction/migration/invalid/example.json +20 -0
  96. package/fixtures/atelier-upgrade-transaction/migration/valid/example.json +19 -0
  97. package/fixtures/atelier-upgrade-transaction/upgrade-plan/invalid/example.json +58 -0
  98. package/fixtures/atelier-upgrade-transaction/upgrade-plan/valid/example.json +57 -0
  99. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/invalid/example.json +15 -0
  100. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/valid/example.json +14 -0
  101. package/fixtures/atelier-vault-publication/invalid/publication.json +5 -0
  102. package/fixtures/atelier-vault-publication/valid/publication.json +11 -0
  103. package/fixtures/decisions/request/invalid/unknown-authority.v1.json +61 -0
  104. package/fixtures/decisions/request/valid/triage.v1.json +60 -0
  105. package/fixtures/decisions/result/invalid/execution-authority.v1.json +50 -0
  106. package/fixtures/decisions/result/valid/abstained.v1.json +23 -0
  107. package/fixtures/decisions/result/valid/assessed.v1.json +50 -0
  108. package/fixtures/obsidian/acceptance/ap05-extra-notes.json +14 -0
  109. package/fixtures/obsidian/acceptance/receipts/G07.valid.v1.json +63 -0
  110. package/fixtures/obsidian/acceptance/receipts/G13.valid.v1.json +69 -0
  111. package/fixtures/obsidian/acceptance/receipts/G14.valid.v1.json +62 -0
  112. package/fixtures/obsidian/acceptance/receipts/G15.valid.v1.json +56 -0
  113. package/fixtures/obsidian/acceptance/receipts/G16.valid.v1.json +73 -0
  114. package/fixtures/obsidian/acceptance/receipts/G17.valid.v1.json +75 -0
  115. package/fixtures/obsidian/acceptance/receipts/G18.valid.v1.json +64 -0
  116. package/fixtures/obsidian/acceptance/service-sentinels.json +10 -0
  117. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/duplicate-evidence-name.v1.json +39 -0
  118. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/evidence-by-absolute-path.v1.json +34 -0
  119. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/missing-candidate-tree.v1.json +33 -0
  120. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/no-evidence.v1.json +28 -0
  121. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-outcome.v1.json +34 -0
  122. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-top-level-field.v1.json +35 -0
  123. package/fixtures/obsidian/contracts/acceptance-receipt/valid/node-gate.v1.json +34 -0
  124. package/fixtures/obsidian/contracts/apply-policy/invalid/automatic-without-edit-class.v1.json +27 -0
  125. package/fixtures/obsidian/contracts/apply-policy/invalid/conflict-overwrite.v1.json +29 -0
  126. package/fixtures/obsidian/contracts/apply-policy/invalid/missing-policy-digest.v1.json +28 -0
  127. package/fixtures/obsidian/contracts/apply-policy/invalid/unbounded-batch.v1.json +29 -0
  128. package/fixtures/obsidian/contracts/apply-policy/invalid/unimplemented-edit-class.v1.json +30 -0
  129. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-mode.v1.json +29 -0
  130. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-selector-operator.v1.json +22 -0
  131. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-top-level-field.v1.json +30 -0
  132. package/fixtures/obsidian/contracts/apply-policy/valid/automatic-scoped.v1.json +29 -0
  133. package/fixtures/obsidian/contracts/apply-policy/valid/manual-default.v1.json +20 -0
  134. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-path-in-ext.v1.json +30 -0
  135. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-repository-root.v1.json +27 -0
  136. package/fixtures/obsidian/contracts/corpus-profile/invalid/duplicate-repository-id.v1.json +27 -0
  137. package/fixtures/obsidian/contracts/corpus-profile/invalid/overlapping-managed-roots.v1.json +27 -0
  138. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-enrollment.v1.json +27 -0
  139. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-top-level-field.v1.json +28 -0
  140. package/fixtures/obsidian/contracts/corpus-profile/valid/three-repositories.v1.json +27 -0
  141. package/fixtures/obsidian/contracts/edit-operation/invalid/absolute-recovery-ref.v1.json +21 -0
  142. package/fixtures/obsidian/contracts/edit-operation/invalid/inline-observed-bytes.v1.json +22 -0
  143. package/fixtures/obsidian/contracts/edit-operation/invalid/missing-base-digest.v1.json +20 -0
  144. package/fixtures/obsidian/contracts/edit-operation/invalid/short-idempotency-key.v1.json +21 -0
  145. package/fixtures/obsidian/contracts/edit-operation/invalid/unknown-kind.v1.json +21 -0
  146. package/fixtures/obsidian/contracts/edit-operation/valid/pending-body-replacement.v1.json +21 -0
  147. package/fixtures/obsidian/contracts/ext-settings/invalid/absolute-path-prefix.v1.json +28 -0
  148. package/fixtures/obsidian/contracts/ext-settings/invalid/apply-policy-in-portable-settings.v1.json +30 -0
  149. package/fixtures/obsidian/contracts/ext-settings/invalid/duplicate-scope-id.v1.json +27 -0
  150. package/fixtures/obsidian/contracts/ext-settings/invalid/machine-local-vault-path.v1.json +28 -0
  151. package/fixtures/obsidian/contracts/ext-settings/invalid/service-port-in-portable-settings.v1.json +28 -0
  152. package/fixtures/obsidian/contracts/ext-settings/invalid/unknown-default-scope.v1.json +27 -0
  153. package/fixtures/obsidian/contracts/ext-settings/valid/disabled.v1.json +5 -0
  154. package/fixtures/obsidian/contracts/ext-settings/valid/enabled-with-scopes.v1.json +27 -0
  155. package/fixtures/obsidian/contracts/generation-manifest/invalid/absolute-note-path.v1.json +114 -0
  156. package/fixtures/obsidian/contracts/generation-manifest/invalid/complete-with-unwritten-notes.v1.json +114 -0
  157. package/fixtures/obsidian/contracts/generation-manifest/invalid/derived-link-claimed-declared.v1.json +114 -0
  158. package/fixtures/obsidian/contracts/generation-manifest/invalid/duplicate-note-identity.v1.json +114 -0
  159. package/fixtures/obsidian/contracts/generation-manifest/invalid/in-scope-endpoint-missing.v1.json +114 -0
  160. package/fixtures/obsidian/contracts/generation-manifest/invalid/title-only-note-path.v1.json +114 -0
  161. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-note-field.v1.json +115 -0
  162. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-relation-type.v1.json +114 -0
  163. package/fixtures/obsidian/contracts/generation-manifest/invalid/withheld-endpoint.v1.json +114 -0
  164. package/fixtures/obsidian/contracts/generation-manifest/valid/two-notes.v1.json +114 -0
  165. package/fixtures/obsidian/contracts/oracles/scope-cases.json +412 -0
  166. package/fixtures/obsidian/contracts/proposal-receipt/invalid/accepted-without-proposal-id.v1.json +12 -0
  167. package/fixtures/obsidian/contracts/proposal-receipt/invalid/missing-adapter-operation-id.v1.json +11 -0
  168. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-backpressure-outcome.v1.json +12 -0
  169. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-top-level-field.v1.json +13 -0
  170. package/fixtures/obsidian/contracts/proposal-receipt/valid/accepted-new.v1.json +12 -0
  171. package/fixtures/obsidian/contracts/proposal-receipt/valid/deferred.v1.json +12 -0
  172. package/fixtures/obsidian/contracts/publication-journal/invalid/absolute-recovery-ref.v1.json +47 -0
  173. package/fixtures/obsidian/contracts/publication-journal/invalid/duplicate-sequence.v1.json +47 -0
  174. package/fixtures/obsidian/contracts/publication-journal/invalid/empty-protocol-id.v1.json +47 -0
  175. package/fixtures/obsidian/contracts/publication-journal/invalid/missing-protocol-id.v1.json +46 -0
  176. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-entry-field.v1.json +48 -0
  177. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-state.v1.json +47 -0
  178. package/fixtures/obsidian/contracts/publication-journal/valid/committed.v1.json +47 -0
  179. package/fixtures/obsidian/contracts/publication-journal/valid/updating-after-restart.v1.json +22 -0
  180. package/fixtures/obsidian/contracts/scope/invalid/absolute-path-prefix.v1.json +15 -0
  181. package/fixtures/obsidian/contracts/scope/invalid/duplicate-ids.v1.json +18 -0
  182. package/fixtures/obsidian/contracts/scope/invalid/expansion-without-node-budget.v1.json +40 -0
  183. package/fixtures/obsidian/contracts/scope/invalid/full-mode-with-subset.v1.json +8 -0
  184. package/fixtures/obsidian/contracts/scope/invalid/unknown-mode.v1.json +41 -0
  185. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-key.v1.json +15 -0
  186. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-operator.v1.json +14 -0
  187. package/fixtures/obsidian/contracts/scope/invalid/unknown-top-level-field.v1.json +42 -0
  188. package/fixtures/obsidian/contracts/scope/valid/explicit-empty.v1.json +8 -0
  189. package/fixtures/obsidian/contracts/scope/valid/focus.v1.json +11 -0
  190. package/fixtures/obsidian/contracts/scope/valid/full.v1.json +8 -0
  191. package/fixtures/obsidian/contracts/scope/valid/scoped-set-expression.v1.json +41 -0
  192. package/fixtures/obsidian/contracts/service-state/invalid/hostname-instead-of-literal-loopback.v1.json +23 -0
  193. package/fixtures/obsidian/contracts/service-state/invalid/missing-consent.v1.json +18 -0
  194. package/fixtures/obsidian/contracts/service-state/invalid/privileged-port.v1.json +23 -0
  195. package/fixtures/obsidian/contracts/service-state/invalid/unknown-top-level-field.v1.json +24 -0
  196. package/fixtures/obsidian/contracts/service-state/invalid/wildcard-bind.v1.json +23 -0
  197. package/fixtures/obsidian/contracts/service-state/valid/healthy.v1.json +23 -0
  198. package/fixtures/obsidian/contracts/source-snapshot/invalid/absolute-file-path.v1.json +48 -0
  199. package/fixtures/obsidian/contracts/source-snapshot/invalid/duplicate-repository-id.v1.json +48 -0
  200. package/fixtures/obsidian/contracts/source-snapshot/invalid/mixed-read.v1.json +48 -0
  201. package/fixtures/obsidian/contracts/source-snapshot/invalid/parent-traversal-path.v1.json +48 -0
  202. package/fixtures/obsidian/contracts/source-snapshot/invalid/unknown-file-field.v1.json +49 -0
  203. package/fixtures/obsidian/contracts/source-snapshot/valid/two-repositories.v1.json +48 -0
  204. package/fixtures/obsidian/edits/workspace.json +65 -0
  205. package/fixtures/obsidian/materialization/expected-full.json +99 -0
  206. package/fixtures/obsidian/materialization/expected-scoped.json +39 -0
  207. package/fixtures/obsidian/materialization/workspace.json +54 -0
  208. package/fixtures/obsidian/proposals/expected-shapes.json +11 -0
  209. package/fixtures/projects/sample-workspace/content/source.html.kg.json +4 -1
  210. package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +4 -1
  211. package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +4 -1
  212. package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +4 -1
  213. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +4 -1
  214. package/fixtures/ui/presentation/pane.v1.json +7 -0
  215. package/fixtures/ui/presentation/reference.v1.json +293 -0
  216. package/package.json +86 -10
  217. package/skills/claude/atelier-guided-coauthor/SKILL.md +49 -0
  218. package/skills/claude/atelier-guided-upgrade/SKILL.md +97 -0
  219. package/skills/claude/atelier-local-service/SKILL.md +47 -0
  220. package/skills/claude/atelier-open/SKILL.md +11 -5
  221. package/skills/claude/atelier-public-boundary/SKILL.md +31 -0
  222. package/skills/claude/atelier-skill-steward/SKILL.md +62 -0
  223. package/skills/claude/mnstry-readiness/SKILL.md +5 -0
  224. package/skills/codex/atelier-guided-coauthor/SKILL.md +49 -0
  225. package/skills/codex/atelier-guided-upgrade/SKILL.md +97 -0
  226. package/skills/codex/atelier-local-service/SKILL.md +47 -0
  227. package/skills/codex/atelier-open/SKILL.md +11 -5
  228. package/skills/codex/atelier-public-boundary/SKILL.md +31 -0
  229. package/skills/codex/atelier-skill-steward/SKILL.md +62 -0
  230. package/skills/codex/mnstry-readiness/SKILL.md +5 -0
  231. package/src/access/preview-enforcer.mjs +84 -0
  232. package/src/boundary/content-rules.mjs +283 -20
  233. package/src/boundary/policy.mjs +213 -91
  234. package/src/cli/execute-command.mjs +36 -0
  235. package/src/cli/project-options.mjs +58 -0
  236. package/src/cli/run.mjs +78 -10
  237. package/src/coauthor/session.mjs +161 -0
  238. package/src/coauthor/store.mjs +173 -0
  239. package/src/collaboration/event-ledger.mjs +348 -0
  240. package/src/collaboration/index.mjs +17 -0
  241. package/src/collaboration/inspection-bundle.mjs +223 -0
  242. package/src/collaboration/proposals.mjs +265 -65
  243. package/src/collaboration/review-contracts.mjs +25 -0
  244. package/src/collaboration/review-store.mjs +305 -0
  245. package/src/commands/attestation.mjs +20 -6
  246. package/src/commands/coauthor.mjs +26 -0
  247. package/src/commands/config.mjs +6 -1
  248. package/src/commands/disclosure.mjs +133 -0
  249. package/src/commands/distribution.mjs +2 -1
  250. package/src/commands/extension-pack.mjs +17 -9
  251. package/src/commands/init.mjs +46 -6
  252. package/src/commands/obsidian.mjs +371 -0
  253. package/src/commands/review.mjs +147 -0
  254. package/src/commands/server.mjs +1 -4
  255. package/src/commands/setup.mjs +51 -14
  256. package/src/commands/skills.mjs +199 -0
  257. package/src/commands/sync.mjs +107 -0
  258. package/src/composition/registry.mjs +27 -0
  259. package/src/composition/wire.mjs +122 -0
  260. package/src/contracts/corpus.mjs +35 -0
  261. package/src/decisions/contracts.d.mts +96 -0
  262. package/src/decisions/contracts.mjs +321 -0
  263. package/src/disclosure/content-scan.mjs +206 -0
  264. package/src/egress/check.mjs +7 -38
  265. package/src/egress/forbidden-egress.mjs +32 -18
  266. package/src/export/atelier-export-contract.mjs +16 -1
  267. package/src/extension-packs/lifecycle.mjs +154 -0
  268. package/src/graph/graph.mjs +176 -316
  269. package/src/graph/knowledge-graph.mjs +643 -43
  270. package/src/guides/contracts.mjs +54 -0
  271. package/src/harness/context-client.mjs +9 -1
  272. package/src/index.mjs +41 -0
  273. package/src/intake/store.mjs +119 -0
  274. package/src/preview/channel.mjs +89 -0
  275. package/src/project/config.mjs +112 -52
  276. package/src/project/durable-state.mjs +161 -0
  277. package/src/project/file-class.mjs +180 -0
  278. package/src/project/package-root.mjs +10 -0
  279. package/src/project/path-match.mjs +38 -15
  280. package/src/project/private-state.mjs +120 -0
  281. package/src/projection/obsidian/contracts.mjs +571 -0
  282. package/src/projection/obsidian/edits/align.mjs +169 -0
  283. package/src/projection/obsidian/edits/apply.mjs +889 -0
  284. package/src/projection/obsidian/edits/arbitrate.mjs +414 -0
  285. package/src/projection/obsidian/edits/contribution.mjs +108 -0
  286. package/src/projection/obsidian/edits/index.mjs +19 -0
  287. package/src/projection/obsidian/edits/object-identity.mjs +61 -0
  288. package/src/projection/obsidian/edits/object-store.mjs +517 -0
  289. package/src/projection/obsidian/edits/observe.mjs +123 -0
  290. package/src/projection/obsidian/edits/policy.mjs +123 -0
  291. package/src/projection/obsidian/edits/regions.mjs +648 -0
  292. package/src/projection/obsidian/materialize/byte-lens.mjs +98 -0
  293. package/src/projection/obsidian/materialize/index.mjs +7 -0
  294. package/src/projection/obsidian/materialize/path-registry.mjs +105 -0
  295. package/src/projection/obsidian/materialize/prepare-view.mjs +746 -0
  296. package/src/projection/obsidian/materialize/settings.mjs +57 -0
  297. package/src/projection/obsidian/materialize/stage.mjs +27 -0
  298. package/src/projection/obsidian/proposals/adapter.mjs +572 -0
  299. package/src/projection/obsidian/proposals/backpressure.mjs +113 -0
  300. package/src/projection/obsidian/proposals/contribution.mjs +55 -0
  301. package/src/projection/obsidian/proposals/index.mjs +23 -0
  302. package/src/projection/obsidian/proposals/observation.mjs +216 -0
  303. package/src/projection/obsidian/proposals/queue.mjs +277 -0
  304. package/src/projection/obsidian/proposals/router.mjs +168 -0
  305. package/src/projection/obsidian/publication/bridge-script.mjs +266 -0
  306. package/src/projection/obsidian/publication/exchange.mjs +117 -0
  307. package/src/projection/obsidian/publication/index.mjs +5 -0
  308. package/src/projection/obsidian/publication/publisher.mjs +588 -0
  309. package/src/projection/obsidian/publication/test-seam.mjs +16 -0
  310. package/src/projection/obsidian/publication/transport.mjs +212 -0
  311. package/src/projection/obsidian/recovery/index.mjs +6 -0
  312. package/src/projection/obsidian/recovery/journal.mjs +134 -0
  313. package/src/projection/obsidian/recovery/late-writer.mjs +46 -0
  314. package/src/projection/obsidian/recovery/restart.mjs +316 -0
  315. package/src/projection/obsidian/recovery/store.mjs +234 -0
  316. package/src/projection/obsidian/selection-ui/conflict-view.mjs +91 -0
  317. package/src/projection/obsidian/selection-ui/contribution.mjs +141 -0
  318. package/src/projection/obsidian/selection-ui/focus.mjs +82 -0
  319. package/src/projection/obsidian/selection-ui/index.mjs +12 -0
  320. package/src/projection/obsidian/selection-ui/policy-setup.mjs +107 -0
  321. package/src/projection/obsidian/selection-ui/receipt.mjs +173 -0
  322. package/src/projection/obsidian/selection-ui/selection-state.mjs +122 -0
  323. package/src/projection/obsidian/selection-ui/selection.mjs +109 -0
  324. package/src/projection/project.mjs +28 -19
  325. package/src/readiness-protocols/evidence.mjs +282 -0
  326. package/src/readiness-protocols/runtime.mjs +4 -3
  327. package/src/readiness-protocols/source-read.mjs +39 -0
  328. package/src/runtime/git-adapter.mjs +189 -0
  329. package/src/runtime/local-state.mjs +439 -0
  330. package/src/runtime/obsidian/app-capability.mjs +138 -0
  331. package/src/runtime/obsidian/app-production-seams.mjs +107 -0
  332. package/src/runtime/obsidian/contributions/proposal-adapter.mjs +4 -0
  333. package/src/runtime/obsidian/contributions/selection-ui.mjs +4 -0
  334. package/src/runtime/obsidian/contributions/source-apply.mjs +4 -0
  335. package/src/runtime/obsidian/contributions.mjs +27 -0
  336. package/src/runtime/obsidian/documents.mjs +37 -0
  337. package/src/runtime/obsidian/enablement.mjs +53 -0
  338. package/src/runtime/obsidian/engine.mjs +532 -0
  339. package/src/runtime/obsidian/errors.mjs +14 -0
  340. package/src/runtime/obsidian/extension-points.mjs +103 -0
  341. package/src/runtime/obsidian/index.mjs +34 -0
  342. package/src/runtime/obsidian/lifecycle.mjs +258 -0
  343. package/src/runtime/obsidian/machine-settings.mjs +260 -0
  344. package/src/runtime/obsidian/observation.mjs +158 -0
  345. package/src/runtime/obsidian/opening.mjs +280 -0
  346. package/src/runtime/obsidian/pending-edits.mjs +141 -0
  347. package/src/runtime/obsidian/pipeline.mjs +122 -0
  348. package/src/runtime/obsidian/private-lock.mjs +156 -0
  349. package/src/runtime/obsidian/process-identity.mjs +58 -0
  350. package/src/runtime/obsidian/service-client.mjs +66 -0
  351. package/src/runtime/obsidian/service-entry-path.mjs +9 -0
  352. package/src/runtime/obsidian/service-main.mjs +93 -0
  353. package/src/runtime/obsidian/service-record.mjs +169 -0
  354. package/src/runtime/obsidian/service-server.mjs +121 -0
  355. package/src/runtime/obsidian/service.mjs +216 -0
  356. package/src/runtime/obsidian/startup-adapters.mjs +87 -0
  357. package/src/runtime/obsidian/state-store.mjs +180 -0
  358. package/src/runtime/obsidian/sync-notice.mjs +33 -0
  359. package/src/runtime/obsidian/tick-loop.mjs +84 -0
  360. package/src/runtime/obsidian/watchers.mjs +36 -0
  361. package/src/runtime/repository-observation.mjs +491 -0
  362. package/src/runtime/supervisor.mjs +803 -0
  363. package/src/server/local-sidecar.mjs +125 -59
  364. package/src/server/security.mjs +89 -4
  365. package/src/server/server.mjs +4 -2
  366. package/src/skills/steward.mjs +780 -0
  367. package/src/support/feedback-report.mjs +4 -3
  368. package/src/ui/presentation/browser.mjs +278 -0
  369. package/src/ui/presentation/contract.mjs +116 -0
  370. package/src/ui/presentation/index.mjs +7 -0
  371. package/src/ui/presentation/native.mjs +153 -0
  372. package/src/ui/presentation/proof.mjs +57 -0
  373. package/src/ui/presentation/schema-check.mjs +30 -0
  374. package/src/ui/presentation/schema.generated.mjs +1371 -0
  375. package/src/ui/presentation/state.mjs +43 -0
  376. package/src/ui/presentation/styles.mjs +67 -0
  377. package/src/ui/presentation/tokens.mjs +74 -0
  378. package/src/ui/presentation/web.mjs +85 -0
  379. package/src/ui/review-page.mjs +32 -0
  380. package/src/upgrade/explanation.mjs +33 -0
  381. package/src/upgrade/provenance.mjs +338 -0
  382. package/src/upgrade/transaction-files.mjs +103 -0
  383. package/src/upgrade/transaction.mjs +475 -0
  384. package/src/upgrade/upgrade.mjs +65 -29
  385. package/src/vault/hosts.mjs +21 -0
  386. package/src/vault/identity.mjs +19 -0
  387. package/src/vault/index.mjs +7 -0
  388. package/src/vault/interface.mjs +11 -0
  389. package/src/vault/metadata.mjs +31 -0
  390. package/src/vault/privacy.mjs +148 -0
  391. package/src/vault/probe.mjs +89 -0
  392. package/src/vault/service.mjs +131 -0
  393. package/src/vault/source.mjs +45 -0
  394. package/src/vault/storage.mjs +23 -0
  395. package/templates/distribution-workspace/.claude/launch.json +6 -2
  396. package/templates/distribution-workspace/gitignore +1 -0
  397. package/templates/distribution-workspace/project/README.md +2 -2
  398. package/templates/external-project-workspace/README.md +45 -0
  399. package/templates/external-project-workspace/answers.example.json +4 -0
  400. package/templates/external-project-workspace/atelier.project.json +40 -0
  401. package/templates/external-project-workspace/boundary-policy.v1.json +60 -0
  402. package/templates/external-project-workspace/gitignore +8 -0
  403. package/templates/external-project-workspace/pack-lifecycle.json +14 -0
  404. package/templates/external-project-workspace/packs/protocols/contract-gate.v1.json +109 -0
  405. package/templates/external-project-workspace/packs/sample-pack.v1.json +48 -0
  406. package/templates/external-project-workspace/repo-access.v1.json +9 -0
  407. package/templates/external-project-workspace/source/README.md +11 -0
  408. package/templates/launch.json +6 -2
  409. package/templates/private-domain-workspace/.claude/launch.json +6 -2
  410. package/templates/private-domain-workspace/domain/README.md +2 -2
  411. package/templates/private-domain-workspace/gitignore +1 -0
  412. package/templates/shared-project-workspace/.claude/launch.json +6 -2
  413. package/templates/shared-project-workspace/gitignore +1 -0
  414. package/templates/shared-project-workspace/project/README.md +2 -2
package/README.md CHANGED
@@ -1,50 +1,302 @@
1
1
  # MNSTRY Atelier
2
2
 
3
- A methodology that creates real transformation cannot scale through static
4
- content, generic AI, or manual labor. The Atelier is a local-first toolkit for
5
- authoring that body of work as structured documents machines can validate —
6
- in plain files, on your machine, under your control.
7
-
8
- It is built for methodology holders and the studios that serve them: you
9
- author primitives, sources, and offers in your own repositories; the Atelier
10
- builds a knowledge graph over them, projects a local review surface, checks
11
- readiness against published protocols, and validates exports against public
12
- contracts. The MNSTRY runtime remains the authority for identity, consent,
13
- visibility, provisioning, bookings, commerce, sessions, audit, and
14
- client-grade sharing — using it is optional, and everything here works
15
- without it.
16
-
17
- ## Status
18
-
19
- - Version: `0.2.0-alpha.1`
20
- - Stability: alpha — contracts are under a compatibility gate from the
21
- `v0.2.0-alpha.0` epoch tag onward; everything else may still move
22
- - Runtime: Node.js `>=22.18.0 <23`
23
- - Dependencies: ajv, ajv-formats (JSON Schema validation); nothing else at
24
- runtime
25
- - Distribution: `@mnstry/atelier@0.2.0-alpha.1` on npm, published from the
26
- `v0.2.0-alpha.1` tag. The older `v0.2.0-alpha.0` tag is the contract
27
- epoch marker, not an install target — it predates the current tree.
28
- - Telemetry: none. Network egress: none, with one documented exception —
29
- see "Nothing leaves your machine" below.
30
-
31
- ## Claims you can check
3
+ **Turn a repository into a living, governed system.**
4
+
5
+ Important bodies of work often begin as files: methods, research, programs,
6
+ policies, editorial systems, product knowledge, or something no existing app
7
+ quite understands. A folder can hold that work, but it cannot explain what each
8
+ file is, how the pieces relate, who may see them, or whether the whole is ready
9
+ to use.
10
+
11
+ The Atelier adds that missing layer without taking the work away from you. It
12
+ turns a repository into an ontology-governed knowledge graph, gives rules the
13
+ power to refuse invalid states, and produces bounded views for people, teams,
14
+ agents, and tools. Git remains the source of record. Your files remain readable.
15
+ The authoring runtime remains local; optional vault adapters run in an explicitly configured host.
16
+
17
+ That makes the same repository useful at several levels:
18
+
19
+ - A **steward** can shape a coherent system without surrendering it to a
20
+ proprietary database.
21
+ - A **team** can collaborate through explicit roles, handoffs, and disclosure
22
+ boundaries.
23
+ - A **person or agent** can receive the right context and capabilities for the
24
+ task, without receiving the entire repository.
25
+ - A **toolmaker** can build a specialized or commercial product on the graph,
26
+ contracts, validators, and projections instead of inventing a new source of
27
+ truth.
28
+
29
+ MNSTRY built the Atelier for a demanding case: a living body of methodology
30
+ that must stay legible, internally connected, privacy-aware, and usable across
31
+ many interfaces. Methodology authoring is one application of the system, not
32
+ its definition or ceiling.
33
+
34
+ ## From files to a working system
35
+
36
+ For local-harness authoring, see [durable coauthor sessions](docs/coauthor-session.md)
37
+ and [skill stewardship and managed installation](docs/skill-steward.md).
38
+ [Immutable intake and guide contracts](docs/intake-and-guides.md) extend existing
39
+ processing and hosted-tool adapters without adding remote execution or publication
40
+ authority. These alpha capabilities require explicit consumer integration.
41
+
42
+ ```text
43
+ files you own
44
+ ↓ declare identity, type, audience, and relationships
45
+ ontology-governed graph
46
+ ↓ apply contracts, policies, and readiness rules
47
+ governed projections
48
+ ├── local review
49
+ ├── bounded agent context
50
+ ├── collaboration and disclosure
51
+ └── specialized tools and commercial distributions
52
+ ```
53
+
54
+ You can see the complete loop in a disposable sample workspace:
55
+
56
+ ```bash
57
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.11
58
+ npx mnstry-atelier init --fixture=sample-workspace --target ./sample
59
+ npx mnstry-atelier graph --project ./sample/atelier.project.json
60
+ npx mnstry-atelier project --project ./sample/atelier.project.json
61
+ npx mnstry-atelier dev --project ./sample/atelier.project.json
62
+ ```
63
+
64
+ Open the loopback URL printed by `dev`. The browser page is generated from
65
+ the same graph and rules that the CLI and library expose.
66
+
67
+ `npx` here runs the binary installed in `./node_modules/.bin`, so install the
68
+ scoped package first. Keep the `@mnstry/` scope: the unscoped npm package
69
+ `atelier` is unrelated. The branded `npx mnstry-atelier` command avoids that
70
+ collision; inside an installed workspace, the shorter `atelier` command is
71
+ also available.
72
+
73
+ ## What authoring looks like
74
+
75
+ Enrollment is deliberately small. A source file declares its identity, type,
76
+ audience, and relationships in front matter:
77
+
78
+ ```markdown
79
+ ---
80
+ title: Breath practice
81
+ summary: A simple preparation practice.
82
+ tags: []
83
+ kg:
84
+ id: example:breath-practice
85
+ type: document
86
+ status: active
87
+ audience: public
88
+ relations:
89
+ belongs_to: example:flagship-program
90
+ ---
91
+
92
+ # Breath practice
93
+
94
+ Let the exhale become slightly longer than the inhale.
95
+ ```
96
+
97
+ The file is still Markdown. Git still records its history. The declarations
98
+ let the Atelier resolve one canonical identity, validate its declared shape,
99
+ connect it to neighboring work, and decide where it may
100
+ travel.
101
+
102
+ When a source format cannot carry front matter, a sidecar can provide the same
103
+ declarations. The graph does not require every source to become Markdown.
104
+
105
+ From there, one source can inform a human-readable review page, a session-bound
106
+ context envelope for an agent, or structured input to another tool. These are
107
+ interfaces to the same governed repository, not copies that quietly drift apart.
108
+
109
+ ## Rules travel with the work
110
+
111
+ The ontology is not only a vocabulary. It is an enforcement surface. Contracts
112
+ define valid shapes, policies govern movement and disclosure, readiness rules
113
+ make completion testable, and validators fail closed when a boundary cannot be
114
+ proven.
115
+
116
+ <!-- atelier:block:audience-visibility:start -->
117
+ The `audience` field in the header is the load-bearing word. It declares who
118
+ a source is written for — `public`, `team`, `operator`, `staff`, `private`,
119
+ or `sensitive` — and the machinery downstream refuses to let material travel
120
+ further than its audience allows. Runtime and export `visibility` is a
121
+ separate vocabulary (`private`, `shared`, `platform`, `public`) describing
122
+ runtime exposure, and the validators reject every crossing between the two.
123
+ Above all: a public export that references a source whose audience is not
124
+ public is refused. That check is fixture-pinned and mutation-tested —
125
+ deleting its enforcement fails tests, not documentation.
126
+ <!-- atelier:block:audience-visibility:end -->
127
+
128
+ That distinction matters whenever several interfaces share one body of work.
129
+ A public site, an internal review tool, and an agent session can all use the
130
+ same graph while receiving different, mechanically checked projections.
131
+
132
+ ## The system beneath it
133
+
134
+ ### 1. The repository becomes an ontology
135
+
136
+ The project manifest tells the Atelier where sources live and which boundaries
137
+ govern the workspace. Source declarations establish typed nodes and relationships. The
138
+ graph command resolves those declarations into a deterministic index that can
139
+ be queried, validated, rendered, and extended.
140
+
141
+ This is what makes a collection of files behave like a system while remaining
142
+ portable. The repository contains both the knowledge and the terms needed to
143
+ interpret it.
144
+
145
+ ### 2. Rules can refuse
146
+
147
+ A useful rule must do more than advise. The Atelier checks schema validity,
148
+ relationship integrity, audience boundaries, readiness protocols, and export
149
+ contracts. Invalid or ambiguous states produce a failing command instead of a
150
+ best-effort publication.
151
+
152
+ Because the checks are local and versioned with the work, the repository can
153
+ prove its state in CI, on a laptop, or inside a larger toolchain.
154
+
155
+ Repositories that may contribute to a public or shared surface can add a
156
+ private, ignored disclosure denylist and scan either the tracked tree or the
157
+ exact staged index:
158
+
159
+ ```bash
160
+ npx mnstry-atelier disclosure check --staged
161
+ ```
162
+
163
+ The built-in structural pass catches machine-local paths, key material, and
164
+ secret-shaped assignments. A client-aware verdict additionally requires the
165
+ private denylist; the command fails closed when it is absent unless
166
+ `--structural-only` is chosen explicitly. Denylist patterns and matched text
167
+ never belong in the shared repository.
168
+
169
+ ### 3. Collaboration becomes governed disclosure
170
+
171
+ Collaboration is not equivalent to giving every participant every file. The
172
+ Atelier models audience, runtime visibility, roles, and capability envelopes
173
+ as separate concerns. A projection can therefore disclose the material needed
174
+ for a task while withholding material outside that boundary.
175
+
176
+ This creates a shared language for human handoffs, agent sessions, reviews,
177
+ and eventual managed delivery. The open package validates the declared
178
+ boundary; it does not silently make access decisions on your behalf.
179
+
180
+ ### 4. The local runtime serves people and agents
181
+
182
+ `atelier dev` exposes a loopback-only review surface backed by the compiled
183
+ graph. The library exposes the same project, graph, validation, and projection
184
+ primitives to code.
185
+
186
+ Consumer-owned authoring or review services that need a separate durable
187
+ lifecycle follow [the managed local-service contract](./docs/local-services.md).
188
+ That contract standardizes process ownership, private local state, and browser
189
+ recovery without putting a tenant's service details into Atelier.
190
+
191
+ The shipped agent model is intentionally bounded: the Atelier can assemble
192
+ session context, capability envelopes, and proposed changes, but it does not
193
+ apply those proposals or grant direct write access. It is a local context and
194
+ control layer that another interface can build on, not an autonomous editor.
195
+
196
+ The separate headless repository supervisor can observe one explicitly
197
+ enrolled Git repository, fetch and fast-forward it, and prepare a bounded
198
+ commit plan. A commit still requires an exact user confirmation and an
199
+ unchanged re-observation; the loopback browser receives no apply endpoint.
200
+ See [Atelier Sync: Deliverable Zero](docs/atelier-sync.md).
201
+
202
+ ### 5. The repository can power another product
32
203
 
204
+ The CLI is one interface. The package is also a library, and its contracts are
205
+ published artifacts. A tool can use the repository as its durable source of
206
+ truth, compile the graph, select an audience-safe projection, and present a
207
+ purpose-built experience without reimplementing the governance model.
208
+
209
+ That tool may be private, open source, or commercial. Apache-2.0 permits all
210
+ three. Conformance to the public Atelier contracts does not require a MNSTRY
211
+ account or service.
212
+
213
+ Read [the design document](./docs/design.md) for the five-part architecture and
214
+ [the ontology](./docs/ontology.md) and
215
+ [contract-stability policy](./docs/contract-stability.md) for the stable
216
+ boundaries.
217
+
218
+ ## Build your own tool on it
219
+
220
+ Use the CLI when a shell command or CI gate is enough. Use the library when the
221
+ Atelier is the substrate beneath a custom interface:
222
+
223
+ ```js
224
+ import {
225
+ buildGraph,
226
+ resolveProjectConfig,
227
+ } from '@mnstry/atelier'
228
+
229
+ const project = resolveProjectConfig({
230
+ cwd: process.cwd(),
231
+ argv: ['--project=./atelier.project.json'],
232
+ })
233
+ const graph = buildGraph(project)
234
+
235
+ if (graph.errors.length > 0) throw new Error(graph.errors.join('\n'))
236
+ console.log(graph.nodes)
237
+ ```
238
+
239
+ The package exports change over the alpha series, so pin the exact prerelease
240
+ version and treat the package export map and shipped source modules as the
241
+ executable API reference. [Distribution contracts](./docs/distributions.md) explain
242
+ how a governed subset can be packaged for another surface without widening its
243
+ audience.
244
+
245
+ The [advisory decision contract](./docs/decisions.md) gives hosts bounded
246
+ choice, score and boolean questions with evidence references and recorded
247
+ uncertainty. `@mnstry/atelier/decisions` validates these records offline.
248
+ The host supplies optional provider execution and retains authorization;
249
+ an assessment carries proposal-only authority.
250
+
251
+ ## Where the Atelier stops
252
+
253
+ The open package owns repository-side structure and proof. A managed runtime
254
+ may consume a conformant export, but that is a separate system with a separate
255
+ trust boundary.
256
+
257
+ | The local Atelier does | A managed runtime may do |
258
+ | --- | --- |
259
+ | Parse sources and sidecars | Authenticate participants |
260
+ | Compile and query the graph | Resolve live authorization |
261
+ | Validate contracts and relationships | Persist runtime state |
262
+ | Enforce export audience boundaries | Deliver governed experiences |
263
+ | Generate local review and agent context | Record consent and operational events |
264
+ | Check offline conformance | Decide optional admission |
265
+
266
+ ### Claims you can verify
267
+
268
+ <!-- atelier:block:claims:start -->
33
269
  This package makes three promises. None of them asks for your trust — each
34
270
  one names the command that proves it.
35
271
 
36
- **Nothing leaves your machine, with one exception you can see.** There is no
37
- telemetry, no update check, no crash reporting, and no send path anywhere in
38
- the package. The exception: when no actor is configured, `boundary check` and
39
- `doctor` fall back to the `gh` CLI to resolve your GitHub login, which is an
40
- authenticated request to GitHub made with your own credentials. Set
41
- `MNSTRY_ATELIER_ACTOR` and that path is never taken. The only network client
42
- refuses non-loopback URLs, the served pages carry a policy that authorizes no
43
- external origin, and a fail-closed gate scans the executable and markup files
44
- under `src/`, `bin/`, `scripts/`, and `examples/` for egress primitives. Two
45
- limits worth stating plainly: the gate does not read the `.json` and `.md`
46
- files under `templates/` and `skills/`, and it does not model
47
- `child_process`, which is why the `gh` fallback above does not trip it:
272
+ **There is no silent egress; every network path is named.** There is no
273
+ telemetry, update check, crash reporting, or model provider path in the package.
274
+ The optional vault API adds explicit host-bound artifact uploads and reads; it
275
+ is never activated by local authoring commands. Its injected storage, database
276
+ and identity SDKs may use the network and require separate hosted qualification. The exceptions are explicit: `boundary check` and
277
+ `upgrade` (including `--dry-run` and `--apply`) may invoke `gh api user` only when
278
+ an operated private-domain repository needs owner attribution, no explicit selector or `GITHUB_ACTOR` was supplied, and no
279
+ configured Git email maps to an actor. Shared-only boundary checks skip derived
280
+ identity lookup. Invalid explicit selectors are refused without fallback;
281
+ platform logins must uniquely match declared login mappings. Repository identity
282
+ checks may invoke `gh api repos/...` to resolve a canonical GitHub identity.
283
+ Those authenticated requests use your own `gh` credentials. Recorded repository
284
+ identities let identity checks keep working when the provider is unavailable.
285
+ See `docs/install.md` for the full attribution precedence and mode semantics.
286
+ Explicitly enrolled Atelier Sync may also run bounded Git fetches
287
+ for observation/reconciliation and one non-force push only when the exact
288
+ reviewed commit plan requested and confirmed it, no earlier local commit is
289
+ waiting to be published, and HEAD still names the verified commit object. Sync
290
+ never uses the network actor fallback, follows tags, or recursively publishes
291
+ submodule refs. The local authoring HTTP client
292
+ refuses non-loopback URLs, the served pages authorize no external origin, and
293
+ release audit scans every executable or markup file in the exact `npm pack`
294
+ inventory for egress primitives. The standalone gate also scans executable and
295
+ markup files under `src/`, `bin/`, `scripts/`, `templates/`, `examples/`, and
296
+ `skills/`. Two limits worth stating plainly: the egress control does not
297
+ interpret data-only `.json` or `.md` files, and it does not model
298
+ `child_process`; the reviewed `gh` and enrolled Git paths above are documented
299
+ subprocess exceptions rather than scanner detections:
48
300
 
49
301
  ```bash
50
302
  npm run egress:check
@@ -75,188 +327,133 @@ atelier dry-run ./atelier-export.json
75
327
  `docs/continuity.md` records the distribution commitments behind these
76
328
  claims, including the perpetual Apache-2.0 grant on every tagged release you
77
329
  receive.
330
+ <!-- atelier:block:claims:end -->
78
331
 
79
- ## Quickstart
80
-
81
- ```bash
82
- npm install --save-dev @mnstry/atelier@0.2.0-alpha.1
83
-
84
- npx atelier init --fixture=sample-workspace --target ./sample
85
- npx atelier graph --project ./sample/atelier.project.json
86
- npx atelier project --project ./sample/atelier.project.json
87
- npx atelier readiness --project ./sample/atelier.project.json
88
- MNSTRY_ATELIER_ACTOR=owner npx atelier boundary check --project ./sample/atelier.project.json
89
- npx atelier dev --project ./sample/atelier.project.json
90
- ```
91
-
92
- `npx` here runs the binary already installed in `./node_modules/.bin`. Always
93
- install first, and keep the `@mnstry/` scope — the unscoped name `atelier`
94
- belongs to an unrelated third-party package.
95
-
96
- `init` scaffolds a fictional sample workspace, `graph` builds the knowledge
97
- graph from front matter and sidecars, `project` generates the local review
98
- surface, `dev` serves it on loopback only. From there:
99
-
100
- ```js
101
- import { validateAtelierExportDryRun } from '@mnstry/atelier'
102
-
103
- const report = validateAtelierExportDryRun(exportDocument)
104
- console.log(report.accepted, report.importable, report.errors)
105
- ```
106
-
107
- Real projects start from the `private-domain`, `shared-project`, or
108
- `distribution` templates instead of the sample fixture.
109
-
110
- ## What this package does
111
-
112
- - Initializes neutral local Atelier projects.
113
- - Builds a front-matter and sidecar-led knowledge graph; a `.kg.json` sidecar
114
- enrolls any file — Markdown, JSON, YAML, CSV, media — without the kit ever
115
- parsing the foreign format.
116
- - Generates and serves a local GUI projection over a loopback-only sidecar.
117
- - Produces agent-harness context and capability envelopes, and ships neutral
118
- Codex and Claude skill wrappers for readiness review work.
119
- - Records proposal metadata without browser apply/write endpoints.
120
- - Enforces the local source `audience` and runtime `visibility` boundary, and
121
- rejects unresolved, disguised, or non-public-projectable source references.
122
- - Enforces Repo Boundary Guard V1 for private domain and shared project
123
- repos: strict policies fail closed when private or sensitive source is
124
- placed in a shared repo, when protected local files are staged, or when
125
- private-domain material appears in shared work without a `git.promote`
126
- disclosure record.
127
- - Validates `atelier-export@v1` JSON against the published schema and
128
- produces deterministic dry-run reports with `accepted`, `importable`, and
129
- `worstOperationStatus`.
130
- - Ships the bundled `mnstry-readiness-pack@v1` with twelve claim-first
131
- readiness protocols, extensible through validated extension packs.
132
- - Writes and checks `atelier.lock.json`, and applies branch-based,
133
- review-first upgrades that refuse dirty repos and never silently overwrite
134
- authored content.
135
- - Checks first-party source, templates, and examples for forbidden
136
- non-localhost egress — a fail-closed discipline gate over this repo's own
137
- code, not a runtime sandbox.
138
-
139
- ## What this package does not do
332
+ ### What it will not do
140
333
 
334
+ <!-- atelier:block:will-not-do:start -->
141
335
  - It does not write to a MNSTRY runtime database.
142
- - It does not import, provision, publish, or send anything.
143
- - It does not contact external services.
336
+ - It does not import, provision, publish, or send project content to a MNSTRY
337
+ managed runtime.
338
+ - Conformance remains offline. Local CLI network access is limited to the documented
339
+ `gh` actor-resolution fallback and explicitly enrolled Atelier Sync Git
340
+ operations: bounded fetch for observation/reconciliation, and non-force push
341
+ only when the exact reviewed commit plan requested and confirmed it, no
342
+ earlier local commit remains unpublished, and HEAD still names the verified
343
+ commit object; Sync does not use network actor fallback, follow tags, or
344
+ recursively publish submodule refs.
345
+ - Optional vault adapters use explicitly injected host SDKs and transports. The
346
+ host owns their network access, authentication and infrastructure; importing
347
+ the kit does not create a service or make a network request.
144
348
  - It does not execute model-assisted analysis or any model provider.
145
349
  - It does not include client project content.
146
350
 
147
351
  These limits are the design. An authoring tool for private material earns
148
352
  trust by what it refuses to be able to do.
353
+ <!-- atelier:block:will-not-do:end -->
149
354
 
150
- ## Your documents and the boundary
151
-
152
- What you author is yours. Documents live in your repositories, in formats you
153
- chose, readable without this tool. The one vocabulary the contracts enforce:
154
- `audience` describes local source readership (`public`, `team`, `operator`,
155
- `staff`, `private`, `sensitive`); runtime/export `visibility` describes
156
- runtime exposure and accepts only `private`, `shared`, `platform`, or
157
- `public`. A public export referencing a source whose audience is not public
158
- is refused — that check is fixture-pinned and mutation-tested.
159
-
160
- ## Build a branded distribution
161
-
162
- The Atelier is designed to be white-labeled. A distribution wraps the CLI
163
- under its own name, contributes a validated extension pack (branded
164
- protocols, terms, templates), and themes the projection — while the root
165
- contracts, guards, and conformance stay canonical underneath. Start by
166
- copying the worked example:
167
-
168
- - `examples/loomworks-studio` — a complete fictional distribution: branded
169
- bin, extension pack, themed workspace template.
170
- - `docs/distributions.md` — the contract a distribution must honor.
171
- - `TRADEMARKS.md` — naming rules; Apache-2.0 grants code rights, not brand
172
- rights. Every distribution carries "powered by MNSTRY Atelier" attribution,
173
- checked by `atelier distribution check`.
174
-
175
- ## The MNSTRY relationship
176
-
177
- The Atelier is the front porch, not the house. Conformance — is this document
178
- valid against the published contracts? — is public, offline, and free,
179
- forever. Admission — will MNSTRY's governed runtime accept it for delivery to
180
- clients? — is a separate, opt-in step: a signed attestation issued by MNSTRY
181
- against criteria this package publishes (`docs/attestation.md`). You can
182
- build on the Atelier without ever talking to MNSTRY. If you want your work to
183
- run on MNSTRY runtimes, the path is admission, and the rejection message is
184
- part of the contract.
185
-
186
- ## Feedback and announcements
187
-
188
- Both channels respect consent by construction. `atelier feedback` writes a
189
- scanned, redaction-checked report to a local file — there is no send path;
190
- you choose whether and where to share it. `announcements list` verifies
191
- project-shipped announcements against a committed public key — pull-only,
192
- nothing phones home to ask.
193
-
194
- ## Running the test suite from a fresh clone
195
-
196
- `npm test` includes one fail-closed check that expects a private denylist
197
- file (`release-denylist.local.json`, gitignored) used by MNSTRY's release
198
- lane. On a fresh clone that file is absent, so the check **fails** — it never
199
- passes silently on missing protection. Expect this, after `npm install`:
355
+ ### Conformance and admission
200
356
 
201
- ```bash
202
- npm install
203
- npm test # 509 tests: 508 pass, 1 fail — the denylist check, by design
204
- ```
357
+ <!-- atelier:block:conformance-admission:start -->
358
+ The Atelier export format is MNSTRY's format, offered openly.
205
359
 
206
- To acknowledge the missing file and run the rest, which turns that failure
207
- into a recorded skip:
360
+ **Anyone can check a document against the published contracts, forever,
361
+ offline.** The contracts, fixtures, and dry-run validator all ship in the
362
+ package, so conformance needs no account, no network, and no MNSTRY
363
+ involvement.
208
364
 
209
- ```bash
210
- ATELIER_ALLOW_MISSING_DENYLIST=1 npm test # 508 pass, 0 fail, 1 skipped
211
- ```
365
+ Admission is a narrower, opt-in decision: whether a MNSTRY governed runtime
366
+ accepts a document for delivery to the people it serves. That is what
367
+ admission buys — delivery through a runtime that enforces consent and
368
+ visibility at serve time — and it takes the form of a signed MNSTRY
369
+ attestation against criteria this package publishes (`docs/attestation.md`).
370
+ The criteria are public, the checker is private, and the rejection message
371
+ is part of the contract. You can build on the Atelier without ever talking
372
+ to MNSTRY, and a document MNSTRY declines can still be fully conformant.
373
+ <!-- atelier:block:conformance-admission:end -->
212
374
 
213
- ## Command reference
375
+ ## Install and go deeper
376
+
377
+ Node.js `>=22.18.0 <23` is required. Pin the prerelease while the package
378
+ remains in alpha:
214
379
 
215
380
  ```bash
216
- atelier dry-run ./atelier-export.json
217
- atelier contract check
218
- atelier graph --project ./atelier.project.json
219
- atelier project --project ./atelier.project.json
220
- atelier readiness --project ./atelier.project.json
221
- atelier readiness protocols
222
- atelier readiness journey --project ./atelier.project.json
223
- atelier readiness run mnstry.readiness:identity-map --project ./atelier.project.json
224
- atelier readiness packet --project ./atelier.project.json
225
- atelier readiness export --dry-run --project ./atelier.project.json
226
- atelier boundary check --project ./atelier.project.json
227
- atelier boundary check --staged --project ./atelier.project.json
228
- atelier boundary install-hooks --project ./atelier.project.json
229
- atelier promote --source-repo tenant-private-domain --target-repo project-alpha --kg-id tenant-private-domain:seed
230
- atelier lock write --project ./atelier.project.json
231
- atelier lock check --project ./atelier.project.json
232
- atelier upgrade --dry-run --project ./atelier.project.json
233
- atelier upgrade --apply --project ./atelier.project.json --branch codex/atelier-upgrade-YYYYMMDD
234
- atelier extension-pack validate --project ./atelier.project.json
235
- atelier attestation verify ./attestation.json
236
- atelier feedback create --message "what happened"
237
- atelier announcements list
238
- atelier distribution check --target ./my-distribution
239
- atelier dev --project ./atelier.project.json
381
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.11
240
382
  ```
241
383
 
242
- `upgrade --apply` creates or switches to the requested branch, refuses dirty
243
- authored repos, preserves unrelated user hooks through composed hook files,
244
- runs only registered migrations, refreshes generated projections, and leaves
245
- a Git commit for review. It will not weaken boundary policy, introduce
246
- telemetry, enable non-localhost egress, run model-assisted analysis, or write/import/apply
247
- runtime state.
384
+ Then choose the path that matches what you are building:
385
+
386
+ - [Installation and first run](./docs/install.md)
387
+ - [Design and architecture](./docs/design.md)
388
+ - [Knowledge graph and source model](./docs/knowledge-graph.md)
389
+ - [Local runtime and agent boundary](./docs/atelier-runtime.md)
390
+ - [Distribution contracts](./docs/distributions.md)
391
+ - [Conformance and attestation](./docs/attestation.md)
392
+ - [Continuity commitments](./docs/continuity.md)
393
+ - [Assurance controls and evidence map](./docs/assurance-controls.md)
394
+ - [Upgrade notes](./docs/upgrade.md)
395
+ - [Upgrade with your agent](./docs/guided-upgrades.md)
396
+ - [Obsidian projection](./docs/obsidian.md)
397
+
398
+ ## Status and command reference
399
+
400
+ Current package: `@mnstry/atelier@0.2.0-alpha.11`.
401
+
402
+ The alpha package is usable and contract-tested, but its library API may still
403
+ change before a stable release. Pin the exact version in production toolchains.
404
+
405
+ ```text
406
+ atelier init
407
+ atelier adopt
408
+ atelier setup
409
+ atelier graph
410
+ atelier project
411
+ atelier build
412
+ atelier dev
413
+ atelier generated check
414
+ atelier config check
415
+ atelier extension-pack
416
+ atelier distribution check
417
+ atelier egress check
418
+ atelier boundary
419
+ atelier readiness
420
+ atelier export
421
+ atelier context flow
422
+ atelier support bundle
423
+ atelier feedback
424
+ atelier announcements
425
+ atelier attestation
426
+ atelier promote
427
+ atelier upgrade
428
+ atelier lock
429
+ ```
430
+
431
+ Run `atelier --help` or `atelier <command> --help` for the current flags. The
432
+ full command behavior is also covered by the package's executable tests.
433
+
434
+ ## Contributing and license
435
+
436
+ Contributions are welcome through [the contribution guide](./CONTRIBUTING.md).
437
+ MNSTRY Atelier is released under [Apache-2.0](./LICENSE).
248
438
 
249
- ## Sample fixtures
439
+ ## Experimental hosted vault contract
250
440
 
251
- Fixtures in this package are fictional and generic. Project-specific adapter
252
- fixtures belong in their project repositories, not in the published Atelier
253
- package.
441
+ An optional [private artifact vault service](docs/vault-service.md) supplies a
442
+ provider-independent ownership boundary and explicit Vercel/Cloudflare storage
443
+ bindings. It is not enabled by local CLI commands. Hosting adapters can perform
444
+ network I/O only when explicitly installed and invoked by a consuming host.
445
+ Browser identity integration and hosted acceptance remain unqualified.
254
446
 
255
- ## License and contributing
447
+ ## Experimental Obsidian projection
256
448
 
257
- Apache-2.0. See `LICENSE`, `NOTICE` (attribution obligations that survive
258
- forks), `TRADEMARKS.md` (naming), and `docs/continuity.md` (distribution
259
- continuity commitments). Contributions are accepted under inbound-equals-
260
- outbound Apache-2.0 with a DCO sign-off — `CONTRIBUTING.md` is the working
261
- agreement, including how to contribute without exposing client material or
262
- your own private methodology.
449
+ An opt-in projection publishes readable, linked notes of an enrolled workspace
450
+ into a vault outside every repository, keeps them current, and preserves every
451
+ edit made in the editor before anything is republished. A body edit is applied
452
+ to its source manually or under a scoped policy the user installs; anything
453
+ structural stays a copy-only proposal. Atelier never commits to Git for it.
454
+ It is disabled unless a project enables it, and it is proven on one platform
455
+ and one app version. Read [what it does and its known limits](docs/obsidian.md),
456
+ the [contract](docs/obsidian-contract.md) and the
457
+ [maintenance service](docs/local-services.md) before relying on it. The
458
+ package subpaths are `@mnstry/atelier/obsidian` and
459
+ `@mnstry/atelier/obsidian/*`.
package/SECURITY.md CHANGED
@@ -42,9 +42,14 @@ you have to sign.
42
42
  These are the claims the package makes. Defeating any of them is a
43
43
  vulnerability, and the more quietly it can be defeated, the more severe:
44
44
 
45
- - **Egress.** Any network send path in first-party code, or any way to make
45
+ - **Egress.** Any undocumented network send path, any vault SDK invocation
46
+ without explicit host integration, or any way to make
46
47
  the local sidecar reachable off loopback or serve a policy that authorizes
47
48
  an external origin.
49
+ - **Vault ownership.** Any hosted artifact or asset served without a verified
50
+ owner identity, cross-vault credential use, or publication that bypasses the
51
+ atomic owner/revision check. The experimental contract still requires hosted
52
+ qualification; local conformance tests are not a production safety claim.
48
53
  - **Boundary guard.** Any way to get private or sensitive source into a
49
54
  shared repo, to stage a protected local file, or to promote private-domain
50
55
  material without the required disclosure record — while the guard reports