@mnstry/atelier 0.2.0-alpha.5 → 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 (383) hide show
  1. package/CHANGELOG.md +191 -0
  2. package/README.md +86 -25
  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/docs/assurance-controls.md +12 -2
  31. package/docs/atelier-runtime.md +13 -2
  32. package/docs/atelier-sync.md +172 -0
  33. package/docs/blocks/claims.md +28 -18
  34. package/docs/blocks/will-not-do.md +12 -3
  35. package/docs/coauthor-session.md +57 -0
  36. package/docs/connected-composition.md +75 -0
  37. package/docs/decisions.md +167 -0
  38. package/docs/exact-upgrades.md +159 -0
  39. package/docs/extension-pack-lifecycle.md +33 -0
  40. package/docs/guided-upgrades.md +99 -0
  41. package/docs/install.md +65 -9
  42. package/docs/intake-and-guides.md +65 -0
  43. package/docs/integration-and-review-plan.md +409 -0
  44. package/docs/integration-contract-decisions.md +22 -0
  45. package/docs/local-review.md +84 -0
  46. package/docs/local-services.md +227 -0
  47. package/docs/local-state.md +107 -0
  48. package/docs/obsidian-contract.md +687 -0
  49. package/docs/obsidian.md +387 -0
  50. package/docs/portable-presentation.md +328 -0
  51. package/docs/presentation-consumer-boundaries.md +75 -0
  52. package/docs/presentation-review-disposition.md +47 -0
  53. package/docs/project-command-inventory.md +38 -0
  54. package/docs/project-options.md +53 -0
  55. package/docs/release-engineering.md +99 -2
  56. package/docs/review-portability.md +55 -0
  57. package/docs/skill-steward.md +156 -0
  58. package/docs/upgrade.md +70 -2
  59. package/docs/vault-service.md +292 -0
  60. package/fixtures/atelier-coauthor/invalid/authority.v1.json +5 -0
  61. package/fixtures/atelier-coauthor/valid/config.v1.json +12 -0
  62. package/fixtures/atelier-guide/invalid/authority.v1.json +11 -0
  63. package/fixtures/atelier-guide/valid/capability.v1.json +10 -0
  64. package/fixtures/atelier-guide/valid/consent.v1.json +11 -0
  65. package/fixtures/atelier-guide/valid/engagement.v1.json +7 -0
  66. package/fixtures/atelier-guide/valid/offer.v1.json +10 -0
  67. package/fixtures/atelier-intake/invalid/authority.v1.json +9 -0
  68. package/fixtures/atelier-intake/valid/attempt.v1.json +8 -0
  69. package/fixtures/atelier-intake/valid/completion.v1.json +9 -0
  70. package/fixtures/atelier-intake/valid/source.v1.json +7 -0
  71. package/fixtures/atelier-repository-observation/invalid/complete-with-blocker.v1.json +18 -0
  72. package/fixtures/atelier-repository-observation/valid/complete-local.v1.json +48 -0
  73. package/fixtures/atelier-review/invalid/authenticated-identity.v1.json +22 -0
  74. package/fixtures/atelier-review/valid/bound.v1.json +229 -0
  75. package/fixtures/atelier-review/valid/bundle.v1.json +267 -0
  76. package/fixtures/atelier-review/valid/contribution.v1.json +22 -0
  77. package/fixtures/atelier-review/valid/lifecycle.v1.json +14 -0
  78. package/fixtures/atelier-skill-steward/audit/invalid/source-mutation.v1.json +26 -0
  79. package/fixtures/atelier-skill-steward/audit/valid/clean.v1.json +26 -0
  80. package/fixtures/atelier-skill-steward/candidates/invalid/workflow-key.v1.json +37 -0
  81. package/fixtures/atelier-skill-steward/candidates/valid/create.v1.json +37 -0
  82. package/fixtures/atelier-skill-steward/lock/invalid/bad-digest.v1.json +18 -0
  83. package/fixtures/atelier-skill-steward/lock/valid/installed.v1.json +23 -0
  84. package/fixtures/atelier-skill-steward/plan/invalid/delete-action.v1.json +33 -0
  85. package/fixtures/atelier-skill-steward/plan/valid/add.v1.json +33 -0
  86. package/fixtures/atelier-upgrade-transaction/adoption-policy/invalid/example.json +12 -0
  87. package/fixtures/atelier-upgrade-transaction/adoption-policy/valid/example.json +11 -0
  88. package/fixtures/atelier-upgrade-transaction/migration/invalid/example.json +20 -0
  89. package/fixtures/atelier-upgrade-transaction/migration/valid/example.json +19 -0
  90. package/fixtures/atelier-upgrade-transaction/upgrade-plan/invalid/example.json +58 -0
  91. package/fixtures/atelier-upgrade-transaction/upgrade-plan/valid/example.json +57 -0
  92. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/invalid/example.json +15 -0
  93. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/valid/example.json +14 -0
  94. package/fixtures/atelier-vault-publication/invalid/publication.json +5 -0
  95. package/fixtures/atelier-vault-publication/valid/publication.json +11 -0
  96. package/fixtures/decisions/request/invalid/unknown-authority.v1.json +61 -0
  97. package/fixtures/decisions/request/valid/triage.v1.json +60 -0
  98. package/fixtures/decisions/result/invalid/execution-authority.v1.json +50 -0
  99. package/fixtures/decisions/result/valid/abstained.v1.json +23 -0
  100. package/fixtures/decisions/result/valid/assessed.v1.json +50 -0
  101. package/fixtures/obsidian/acceptance/ap05-extra-notes.json +14 -0
  102. package/fixtures/obsidian/acceptance/receipts/G07.valid.v1.json +63 -0
  103. package/fixtures/obsidian/acceptance/receipts/G13.valid.v1.json +69 -0
  104. package/fixtures/obsidian/acceptance/receipts/G14.valid.v1.json +62 -0
  105. package/fixtures/obsidian/acceptance/receipts/G15.valid.v1.json +56 -0
  106. package/fixtures/obsidian/acceptance/receipts/G16.valid.v1.json +73 -0
  107. package/fixtures/obsidian/acceptance/receipts/G17.valid.v1.json +75 -0
  108. package/fixtures/obsidian/acceptance/receipts/G18.valid.v1.json +64 -0
  109. package/fixtures/obsidian/acceptance/service-sentinels.json +10 -0
  110. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/duplicate-evidence-name.v1.json +39 -0
  111. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/evidence-by-absolute-path.v1.json +34 -0
  112. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/missing-candidate-tree.v1.json +33 -0
  113. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/no-evidence.v1.json +28 -0
  114. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-outcome.v1.json +34 -0
  115. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-top-level-field.v1.json +35 -0
  116. package/fixtures/obsidian/contracts/acceptance-receipt/valid/node-gate.v1.json +34 -0
  117. package/fixtures/obsidian/contracts/apply-policy/invalid/automatic-without-edit-class.v1.json +27 -0
  118. package/fixtures/obsidian/contracts/apply-policy/invalid/conflict-overwrite.v1.json +29 -0
  119. package/fixtures/obsidian/contracts/apply-policy/invalid/missing-policy-digest.v1.json +28 -0
  120. package/fixtures/obsidian/contracts/apply-policy/invalid/unbounded-batch.v1.json +29 -0
  121. package/fixtures/obsidian/contracts/apply-policy/invalid/unimplemented-edit-class.v1.json +30 -0
  122. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-mode.v1.json +29 -0
  123. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-selector-operator.v1.json +22 -0
  124. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-top-level-field.v1.json +30 -0
  125. package/fixtures/obsidian/contracts/apply-policy/valid/automatic-scoped.v1.json +29 -0
  126. package/fixtures/obsidian/contracts/apply-policy/valid/manual-default.v1.json +20 -0
  127. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-path-in-ext.v1.json +30 -0
  128. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-repository-root.v1.json +27 -0
  129. package/fixtures/obsidian/contracts/corpus-profile/invalid/duplicate-repository-id.v1.json +27 -0
  130. package/fixtures/obsidian/contracts/corpus-profile/invalid/overlapping-managed-roots.v1.json +27 -0
  131. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-enrollment.v1.json +27 -0
  132. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-top-level-field.v1.json +28 -0
  133. package/fixtures/obsidian/contracts/corpus-profile/valid/three-repositories.v1.json +27 -0
  134. package/fixtures/obsidian/contracts/edit-operation/invalid/absolute-recovery-ref.v1.json +21 -0
  135. package/fixtures/obsidian/contracts/edit-operation/invalid/inline-observed-bytes.v1.json +22 -0
  136. package/fixtures/obsidian/contracts/edit-operation/invalid/missing-base-digest.v1.json +20 -0
  137. package/fixtures/obsidian/contracts/edit-operation/invalid/short-idempotency-key.v1.json +21 -0
  138. package/fixtures/obsidian/contracts/edit-operation/invalid/unknown-kind.v1.json +21 -0
  139. package/fixtures/obsidian/contracts/edit-operation/valid/pending-body-replacement.v1.json +21 -0
  140. package/fixtures/obsidian/contracts/ext-settings/invalid/absolute-path-prefix.v1.json +28 -0
  141. package/fixtures/obsidian/contracts/ext-settings/invalid/apply-policy-in-portable-settings.v1.json +30 -0
  142. package/fixtures/obsidian/contracts/ext-settings/invalid/duplicate-scope-id.v1.json +27 -0
  143. package/fixtures/obsidian/contracts/ext-settings/invalid/machine-local-vault-path.v1.json +28 -0
  144. package/fixtures/obsidian/contracts/ext-settings/invalid/service-port-in-portable-settings.v1.json +28 -0
  145. package/fixtures/obsidian/contracts/ext-settings/invalid/unknown-default-scope.v1.json +27 -0
  146. package/fixtures/obsidian/contracts/ext-settings/valid/disabled.v1.json +5 -0
  147. package/fixtures/obsidian/contracts/ext-settings/valid/enabled-with-scopes.v1.json +27 -0
  148. package/fixtures/obsidian/contracts/generation-manifest/invalid/absolute-note-path.v1.json +114 -0
  149. package/fixtures/obsidian/contracts/generation-manifest/invalid/complete-with-unwritten-notes.v1.json +114 -0
  150. package/fixtures/obsidian/contracts/generation-manifest/invalid/derived-link-claimed-declared.v1.json +114 -0
  151. package/fixtures/obsidian/contracts/generation-manifest/invalid/duplicate-note-identity.v1.json +114 -0
  152. package/fixtures/obsidian/contracts/generation-manifest/invalid/in-scope-endpoint-missing.v1.json +114 -0
  153. package/fixtures/obsidian/contracts/generation-manifest/invalid/title-only-note-path.v1.json +114 -0
  154. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-note-field.v1.json +115 -0
  155. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-relation-type.v1.json +114 -0
  156. package/fixtures/obsidian/contracts/generation-manifest/invalid/withheld-endpoint.v1.json +114 -0
  157. package/fixtures/obsidian/contracts/generation-manifest/valid/two-notes.v1.json +114 -0
  158. package/fixtures/obsidian/contracts/oracles/scope-cases.json +412 -0
  159. package/fixtures/obsidian/contracts/proposal-receipt/invalid/accepted-without-proposal-id.v1.json +12 -0
  160. package/fixtures/obsidian/contracts/proposal-receipt/invalid/missing-adapter-operation-id.v1.json +11 -0
  161. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-backpressure-outcome.v1.json +12 -0
  162. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-top-level-field.v1.json +13 -0
  163. package/fixtures/obsidian/contracts/proposal-receipt/valid/accepted-new.v1.json +12 -0
  164. package/fixtures/obsidian/contracts/proposal-receipt/valid/deferred.v1.json +12 -0
  165. package/fixtures/obsidian/contracts/publication-journal/invalid/absolute-recovery-ref.v1.json +47 -0
  166. package/fixtures/obsidian/contracts/publication-journal/invalid/duplicate-sequence.v1.json +47 -0
  167. package/fixtures/obsidian/contracts/publication-journal/invalid/empty-protocol-id.v1.json +47 -0
  168. package/fixtures/obsidian/contracts/publication-journal/invalid/missing-protocol-id.v1.json +46 -0
  169. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-entry-field.v1.json +48 -0
  170. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-state.v1.json +47 -0
  171. package/fixtures/obsidian/contracts/publication-journal/valid/committed.v1.json +47 -0
  172. package/fixtures/obsidian/contracts/publication-journal/valid/updating-after-restart.v1.json +22 -0
  173. package/fixtures/obsidian/contracts/scope/invalid/absolute-path-prefix.v1.json +15 -0
  174. package/fixtures/obsidian/contracts/scope/invalid/duplicate-ids.v1.json +18 -0
  175. package/fixtures/obsidian/contracts/scope/invalid/expansion-without-node-budget.v1.json +40 -0
  176. package/fixtures/obsidian/contracts/scope/invalid/full-mode-with-subset.v1.json +8 -0
  177. package/fixtures/obsidian/contracts/scope/invalid/unknown-mode.v1.json +41 -0
  178. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-key.v1.json +15 -0
  179. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-operator.v1.json +14 -0
  180. package/fixtures/obsidian/contracts/scope/invalid/unknown-top-level-field.v1.json +42 -0
  181. package/fixtures/obsidian/contracts/scope/valid/explicit-empty.v1.json +8 -0
  182. package/fixtures/obsidian/contracts/scope/valid/focus.v1.json +11 -0
  183. package/fixtures/obsidian/contracts/scope/valid/full.v1.json +8 -0
  184. package/fixtures/obsidian/contracts/scope/valid/scoped-set-expression.v1.json +41 -0
  185. package/fixtures/obsidian/contracts/service-state/invalid/hostname-instead-of-literal-loopback.v1.json +23 -0
  186. package/fixtures/obsidian/contracts/service-state/invalid/missing-consent.v1.json +18 -0
  187. package/fixtures/obsidian/contracts/service-state/invalid/privileged-port.v1.json +23 -0
  188. package/fixtures/obsidian/contracts/service-state/invalid/unknown-top-level-field.v1.json +24 -0
  189. package/fixtures/obsidian/contracts/service-state/invalid/wildcard-bind.v1.json +23 -0
  190. package/fixtures/obsidian/contracts/service-state/valid/healthy.v1.json +23 -0
  191. package/fixtures/obsidian/contracts/source-snapshot/invalid/absolute-file-path.v1.json +48 -0
  192. package/fixtures/obsidian/contracts/source-snapshot/invalid/duplicate-repository-id.v1.json +48 -0
  193. package/fixtures/obsidian/contracts/source-snapshot/invalid/mixed-read.v1.json +48 -0
  194. package/fixtures/obsidian/contracts/source-snapshot/invalid/parent-traversal-path.v1.json +48 -0
  195. package/fixtures/obsidian/contracts/source-snapshot/invalid/unknown-file-field.v1.json +49 -0
  196. package/fixtures/obsidian/contracts/source-snapshot/valid/two-repositories.v1.json +48 -0
  197. package/fixtures/obsidian/edits/workspace.json +65 -0
  198. package/fixtures/obsidian/materialization/expected-full.json +99 -0
  199. package/fixtures/obsidian/materialization/expected-scoped.json +39 -0
  200. package/fixtures/obsidian/materialization/workspace.json +54 -0
  201. package/fixtures/obsidian/proposals/expected-shapes.json +11 -0
  202. package/fixtures/ui/presentation/pane.v1.json +7 -0
  203. package/fixtures/ui/presentation/reference.v1.json +293 -0
  204. package/package.json +61 -6
  205. package/skills/claude/atelier-guided-coauthor/SKILL.md +49 -0
  206. package/skills/claude/atelier-guided-upgrade/SKILL.md +97 -0
  207. package/skills/claude/atelier-open/SKILL.md +5 -0
  208. package/skills/claude/atelier-skill-steward/SKILL.md +62 -0
  209. package/skills/claude/mnstry-readiness/SKILL.md +5 -0
  210. package/skills/codex/atelier-guided-coauthor/SKILL.md +49 -0
  211. package/skills/codex/atelier-guided-upgrade/SKILL.md +97 -0
  212. package/skills/codex/atelier-open/SKILL.md +5 -0
  213. package/skills/codex/atelier-skill-steward/SKILL.md +62 -0
  214. package/skills/codex/mnstry-readiness/SKILL.md +5 -0
  215. package/src/access/preview-enforcer.mjs +84 -0
  216. package/src/boundary/content-rules.mjs +9 -4
  217. package/src/boundary/policy.mjs +74 -42
  218. package/src/cli/project-options.mjs +58 -0
  219. package/src/cli/run.mjs +61 -3
  220. package/src/coauthor/session.mjs +161 -0
  221. package/src/coauthor/store.mjs +173 -0
  222. package/src/collaboration/event-ledger.mjs +16 -33
  223. package/src/collaboration/inspection-bundle.mjs +223 -0
  224. package/src/collaboration/review-contracts.mjs +25 -0
  225. package/src/collaboration/review-store.mjs +305 -0
  226. package/src/commands/coauthor.mjs +26 -0
  227. package/src/commands/config.mjs +6 -1
  228. package/src/commands/extension-pack.mjs +15 -8
  229. package/src/commands/init.mjs +44 -5
  230. package/src/commands/obsidian.mjs +368 -0
  231. package/src/commands/review.mjs +147 -0
  232. package/src/commands/setup.mjs +51 -14
  233. package/src/commands/skills.mjs +199 -0
  234. package/src/commands/sync.mjs +107 -0
  235. package/src/composition/registry.mjs +27 -0
  236. package/src/composition/wire.mjs +122 -0
  237. package/src/contracts/corpus.mjs +35 -0
  238. package/src/decisions/contracts.d.mts +96 -0
  239. package/src/decisions/contracts.mjs +321 -0
  240. package/src/disclosure/content-scan.mjs +13 -0
  241. package/src/export/atelier-export-contract.mjs +16 -1
  242. package/src/extension-packs/lifecycle.mjs +154 -0
  243. package/src/graph/graph.mjs +64 -2
  244. package/src/graph/knowledge-graph.mjs +548 -24
  245. package/src/guides/contracts.mjs +54 -0
  246. package/src/index.mjs +29 -0
  247. package/src/intake/store.mjs +119 -0
  248. package/src/preview/channel.mjs +89 -0
  249. package/src/project/config.mjs +50 -49
  250. package/src/project/durable-state.mjs +161 -0
  251. package/src/project/file-class.mjs +166 -0
  252. package/src/project/private-state.mjs +11 -1
  253. package/src/projection/obsidian/contracts.mjs +571 -0
  254. package/src/projection/obsidian/edits/align.mjs +169 -0
  255. package/src/projection/obsidian/edits/apply.mjs +889 -0
  256. package/src/projection/obsidian/edits/arbitrate.mjs +414 -0
  257. package/src/projection/obsidian/edits/contribution.mjs +108 -0
  258. package/src/projection/obsidian/edits/index.mjs +19 -0
  259. package/src/projection/obsidian/edits/object-identity.mjs +61 -0
  260. package/src/projection/obsidian/edits/object-store.mjs +517 -0
  261. package/src/projection/obsidian/edits/observe.mjs +123 -0
  262. package/src/projection/obsidian/edits/policy.mjs +123 -0
  263. package/src/projection/obsidian/edits/regions.mjs +648 -0
  264. package/src/projection/obsidian/materialize/byte-lens.mjs +98 -0
  265. package/src/projection/obsidian/materialize/index.mjs +7 -0
  266. package/src/projection/obsidian/materialize/path-registry.mjs +105 -0
  267. package/src/projection/obsidian/materialize/prepare-view.mjs +746 -0
  268. package/src/projection/obsidian/materialize/settings.mjs +57 -0
  269. package/src/projection/obsidian/materialize/stage.mjs +27 -0
  270. package/src/projection/obsidian/proposals/adapter.mjs +572 -0
  271. package/src/projection/obsidian/proposals/backpressure.mjs +113 -0
  272. package/src/projection/obsidian/proposals/contribution.mjs +55 -0
  273. package/src/projection/obsidian/proposals/index.mjs +23 -0
  274. package/src/projection/obsidian/proposals/observation.mjs +216 -0
  275. package/src/projection/obsidian/proposals/queue.mjs +277 -0
  276. package/src/projection/obsidian/proposals/router.mjs +168 -0
  277. package/src/projection/obsidian/publication/bridge-script.mjs +266 -0
  278. package/src/projection/obsidian/publication/exchange.mjs +117 -0
  279. package/src/projection/obsidian/publication/index.mjs +5 -0
  280. package/src/projection/obsidian/publication/publisher.mjs +588 -0
  281. package/src/projection/obsidian/publication/test-seam.mjs +16 -0
  282. package/src/projection/obsidian/publication/transport.mjs +139 -0
  283. package/src/projection/obsidian/recovery/index.mjs +6 -0
  284. package/src/projection/obsidian/recovery/journal.mjs +134 -0
  285. package/src/projection/obsidian/recovery/late-writer.mjs +46 -0
  286. package/src/projection/obsidian/recovery/restart.mjs +316 -0
  287. package/src/projection/obsidian/recovery/store.mjs +234 -0
  288. package/src/projection/obsidian/selection-ui/conflict-view.mjs +91 -0
  289. package/src/projection/obsidian/selection-ui/contribution.mjs +141 -0
  290. package/src/projection/obsidian/selection-ui/focus.mjs +82 -0
  291. package/src/projection/obsidian/selection-ui/index.mjs +12 -0
  292. package/src/projection/obsidian/selection-ui/policy-setup.mjs +107 -0
  293. package/src/projection/obsidian/selection-ui/receipt.mjs +173 -0
  294. package/src/projection/obsidian/selection-ui/selection-state.mjs +122 -0
  295. package/src/projection/obsidian/selection-ui/selection.mjs +109 -0
  296. package/src/projection/project.mjs +28 -19
  297. package/src/readiness-protocols/evidence.mjs +282 -0
  298. package/src/readiness-protocols/runtime.mjs +4 -3
  299. package/src/readiness-protocols/source-read.mjs +39 -0
  300. package/src/runtime/git-adapter.mjs +189 -0
  301. package/src/runtime/local-state.mjs +439 -0
  302. package/src/runtime/obsidian/app-capability.mjs +110 -0
  303. package/src/runtime/obsidian/app-production-seams.mjs +96 -0
  304. package/src/runtime/obsidian/contributions/proposal-adapter.mjs +4 -0
  305. package/src/runtime/obsidian/contributions/selection-ui.mjs +4 -0
  306. package/src/runtime/obsidian/contributions/source-apply.mjs +4 -0
  307. package/src/runtime/obsidian/contributions.mjs +27 -0
  308. package/src/runtime/obsidian/documents.mjs +37 -0
  309. package/src/runtime/obsidian/enablement.mjs +53 -0
  310. package/src/runtime/obsidian/engine.mjs +532 -0
  311. package/src/runtime/obsidian/errors.mjs +14 -0
  312. package/src/runtime/obsidian/extension-points.mjs +103 -0
  313. package/src/runtime/obsidian/index.mjs +34 -0
  314. package/src/runtime/obsidian/lifecycle.mjs +258 -0
  315. package/src/runtime/obsidian/machine-settings.mjs +260 -0
  316. package/src/runtime/obsidian/observation.mjs +158 -0
  317. package/src/runtime/obsidian/opening.mjs +243 -0
  318. package/src/runtime/obsidian/pending-edits.mjs +141 -0
  319. package/src/runtime/obsidian/pipeline.mjs +122 -0
  320. package/src/runtime/obsidian/private-lock.mjs +156 -0
  321. package/src/runtime/obsidian/process-identity.mjs +58 -0
  322. package/src/runtime/obsidian/service-client.mjs +66 -0
  323. package/src/runtime/obsidian/service-main.mjs +89 -0
  324. package/src/runtime/obsidian/service-record.mjs +169 -0
  325. package/src/runtime/obsidian/service-server.mjs +121 -0
  326. package/src/runtime/obsidian/service.mjs +216 -0
  327. package/src/runtime/obsidian/startup-adapters.mjs +87 -0
  328. package/src/runtime/obsidian/state-store.mjs +180 -0
  329. package/src/runtime/obsidian/sync-notice.mjs +33 -0
  330. package/src/runtime/obsidian/tick-loop.mjs +84 -0
  331. package/src/runtime/obsidian/watchers.mjs +36 -0
  332. package/src/runtime/repository-observation.mjs +491 -0
  333. package/src/runtime/supervisor.mjs +803 -0
  334. package/src/server/local-sidecar.mjs +44 -0
  335. package/src/server/server.mjs +1 -0
  336. package/src/skills/steward.mjs +780 -0
  337. package/src/ui/presentation/browser.mjs +278 -0
  338. package/src/ui/presentation/contract.mjs +116 -0
  339. package/src/ui/presentation/index.mjs +7 -0
  340. package/src/ui/presentation/native.mjs +153 -0
  341. package/src/ui/presentation/proof.mjs +57 -0
  342. package/src/ui/presentation/schema-check.mjs +30 -0
  343. package/src/ui/presentation/schema.generated.mjs +1371 -0
  344. package/src/ui/presentation/state.mjs +43 -0
  345. package/src/ui/presentation/styles.mjs +67 -0
  346. package/src/ui/presentation/tokens.mjs +74 -0
  347. package/src/ui/presentation/web.mjs +85 -0
  348. package/src/ui/review-page.mjs +32 -0
  349. package/src/upgrade/explanation.mjs +33 -0
  350. package/src/upgrade/provenance.mjs +338 -0
  351. package/src/upgrade/transaction-files.mjs +103 -0
  352. package/src/upgrade/transaction.mjs +475 -0
  353. package/src/upgrade/upgrade.mjs +63 -28
  354. package/src/vault/hosts.mjs +21 -0
  355. package/src/vault/identity.mjs +19 -0
  356. package/src/vault/index.mjs +7 -0
  357. package/src/vault/interface.mjs +11 -0
  358. package/src/vault/metadata.mjs +31 -0
  359. package/src/vault/privacy.mjs +148 -0
  360. package/src/vault/probe.mjs +89 -0
  361. package/src/vault/service.mjs +131 -0
  362. package/src/vault/source.mjs +45 -0
  363. package/src/vault/storage.mjs +23 -0
  364. package/templates/distribution-workspace/.claude/launch.json +6 -2
  365. package/templates/distribution-workspace/gitignore +1 -0
  366. package/templates/distribution-workspace/project/README.md +2 -2
  367. package/templates/external-project-workspace/README.md +45 -0
  368. package/templates/external-project-workspace/answers.example.json +4 -0
  369. package/templates/external-project-workspace/atelier.project.json +40 -0
  370. package/templates/external-project-workspace/boundary-policy.v1.json +60 -0
  371. package/templates/external-project-workspace/gitignore +8 -0
  372. package/templates/external-project-workspace/pack-lifecycle.json +14 -0
  373. package/templates/external-project-workspace/packs/protocols/contract-gate.v1.json +109 -0
  374. package/templates/external-project-workspace/packs/sample-pack.v1.json +48 -0
  375. package/templates/external-project-workspace/repo-access.v1.json +9 -0
  376. package/templates/external-project-workspace/source/README.md +11 -0
  377. package/templates/launch.json +6 -2
  378. package/templates/private-domain-workspace/.claude/launch.json +6 -2
  379. package/templates/private-domain-workspace/domain/README.md +2 -2
  380. package/templates/private-domain-workspace/gitignore +1 -0
  381. package/templates/shared-project-workspace/.claude/launch.json +6 -2
  382. package/templates/shared-project-workspace/gitignore +1 -0
  383. package/templates/shared-project-workspace/project/README.md +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,196 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0-alpha.8
4
+
5
+ ### Added
6
+
7
+ - Add portable, typed advisory decision requests and results under
8
+ `@mnstry/atelier/decisions`, with versioned schemas, invented fixtures and
9
+ offline validation of evidence bindings, distributions and abstention.
10
+ Provider execution, credentials, budgets and authorization stay with the
11
+ host. See `docs/decisions.md`.
12
+ - Add an experimental, opt-in Obsidian projection. A project that enables
13
+ `ext["mnstry.atelier.obsidian"]` and declares views (`full`, `scoped` or
14
+ `focus`, with an optional bounded expansion) gets readable, linked notes of
15
+ the enrolled workspace in a vault outside every repository, under private
16
+ per-workspace storage. Nothing is published for a project that does not
17
+ enable it. See `docs/obsidian.md`, `docs/obsidian-contract.md` and
18
+ `docs/local-services.md`.
19
+ - Add eleven closed `atelier-obsidian-*.v1` schemas with valid and invalid
20
+ fixtures, each exported under its own `./contracts/` path.
21
+ - Add deterministic materialization: note paths made of a readable title and a
22
+ stable identity suffix, exact byte regions that invert to their source,
23
+ embedded assets, and audience and eligibility rules that fail closed. No
24
+ audience is admitted by default, which publishes an empty view.
25
+ - Add publication that coordinates with a running editor through conditional
26
+ operations, with journals, restart recovery and late-writer rechecks, so
27
+ that a concurrent write by a person or the app is retained rather than
28
+ overwritten. It depends on an atomic file exchange and is proven on macOS
29
+ arm64 with one app version; see the contract for what is open.
30
+ - Add a per-workspace loopback maintenance service and the noninteractive
31
+ `atelier obsidian` command (`status`, `scope`, `audience`, `mode`, `policy`,
32
+ `service`, `open`, `apply`, `proposals`, `conflicts`, `apply-policy`,
33
+ `selection`). Reaching the installed app or the operating system is never a
34
+ default: it needs `--adapter=obsidian-cli`. The app must be version 1.13.7
35
+ or later.
36
+ - Ship the selection contribution on the command: the one-line loader module
37
+ `src/runtime/obsidian/contributions/selection-ui.mjs` puts `selection`,
38
+ `conflicts` and `apply-policy` on `atelier obsidian`, beside `apply` and
39
+ `proposals`. The usage text names every contributed operation, and a
40
+ contributed operation declares under `options` which shared options it
41
+ takes, so `--actor` is refused everywhere but `apply run`.
42
+ - Preserve every edit made in the vault before anything is republished. A
43
+ body replacement is applied to its source manually, or automatically under
44
+ a scoped policy the user installs and can revoke; revocation is read again
45
+ before every write. An edit that is not a body replacement becomes a
46
+ copy-only proposal in the owning repository's proposal store and is never
47
+ applied. Atelier makes no Git commit for any of it.
48
+ - Add selection binding, apply-policy setup, a read-only conflict view and an
49
+ acceptance-receipt validator that is labelled schema validation only and
50
+ closes no gate.
51
+ - Add the package subpaths `./obsidian`, `./obsidian/contracts`,
52
+ `./obsidian/materialize`, `./obsidian/publication`, `./obsidian/recovery`,
53
+ `./obsidian/edits`, `./obsidian/proposals` and `./obsidian/selection`. The
54
+ package root exports nothing of the projection. Names ending
55
+ `ForOracleTests` are test mutation controls, not a supported API.
56
+ - `release:audit` now requires the Obsidian runtime, schemas and documents in
57
+ the tarball, requires every declared export to name a packed file, and
58
+ refuses scripts, tests, experiments, receipt directories, application
59
+ archives, receipts that name a real host or operator, and fixtures above 262,144
60
+ bytes. The path allowlist is unchanged. A package proof packs the tarball,
61
+ imports the subpaths from a bare consumer and publishes a synthetic
62
+ workspace into a temporary vault with no app.
63
+ - Known limits: Windows refuses publication and source apply because no atomic
64
+ exchange is known; the real-app suite has not been run on Linux, and x86_64
65
+ has not been run anywhere; macOS publication needs the stock system perl;
66
+ the app version has a floor and no ceiling; a vault body edit to a note
67
+ whose source uses CRLF becomes a proposal rather than an apply. No adopter
68
+ acceptance is recorded.
69
+
70
+ ### Changed
71
+
72
+ - The resolver that produces `links_to` edges is now shared by the graph and
73
+ the projection, and its behaviour changed in five classes. Graph artifacts a
74
+ consumer has committed may differ after upgrading in exactly these classes
75
+ and no others; each is pinned in `test/graph-knowledge-graph.test.mjs` and
76
+ listed in `docs/obsidian-contract.md`. Regenerate committed graph artifacts
77
+ after upgrading and review the difference.
78
+ 1. Links inside fenced code (backtick or tilde, any info string, up to three
79
+ spaces of indent, CRLF, CommonMark fence-length rules), inside inline
80
+ code and inside front matter no longer produce edges. Two stray backticks
81
+ that happen to pair across a link count as inline code, and links after
82
+ an unbalanced fence that runs to the end of the file are inside code.
83
+ 2. A link to a directory resolves to that directory's `README.md`, then
84
+ `index.md`, testing eligibility per candidate. A link to a parent
85
+ directory now resolves where the earlier reader missed it.
86
+ 3. A link that climbs above its own repository root and re-enters through
87
+ the checkout's directory name is reported as leaving the enrolled roots,
88
+ as before. It is never turned into a repository-local edge.
89
+ 4. Malformed percent-encoding in a link is a `link-href-malformed` finding.
90
+ It no longer throws out of the graph build.
91
+ 5. The workspace graph, not repository artifacts, additionally carries
92
+ wikilink edges and cross-repository Markdown-link edges, de-duplicated.
93
+
94
+ ## 0.2.0-alpha.7
95
+
96
+ - Add a guided owner-agent upgrade skill and read-only `upgrade explain`
97
+ reports derived from saved plans. Retain consent and provenance limits,
98
+ distinguish staged installation from adoption, and route unsupported
99
+ workspaces through their existing operator procedure.
100
+
101
+ - Add explicit saved-plan local upgrade transactions with private receipts,
102
+ existing commit hooks and recovery inspection. Refuse unsupported Git
103
+ attributes before generated writes and explain abandoned preparation state.
104
+ - `lock write` now preserves valid migration and template history and refuses
105
+ a malformed previous lock. Inspect and repair or separately archive the
106
+ invalid lock before retrying; history is no longer silently overwritten.
107
+
108
+ - Add a source-only Astro reference consumer for build-time presentation tokens,
109
+ no-script reading/navigation, local-only form validation and cross-browser proof.
110
+ Keep public-page mechanics consumer-owned; add no Astro runtime dependency.
111
+ - Patch the existing fast-uri dependency and override to 3.1.7. Clarify ordinary
112
+ web-link navigation versus native host navigation requests.
113
+
114
+ - Validate proposed and retained adoption configurations together with their
115
+ policy before writing; refuse an existing default policy during blank init.
116
+ Compare manifests using their serialized JSON representation so omitted
117
+ optional fields do not make freshly generated output stale.
118
+ - Migration: unset or correct globally exported `MNSTRY_ATELIER_ACTOR` values
119
+ that are not declared in the current policy. Invalid explicit selectors now
120
+ refuse even shared-only and legacy-warning checks.
121
+
122
+ - Correct shared-only attribution so ambient platform identities cannot invent
123
+ an ownership requirement or trigger a network lookup. Preserve legacy-warning
124
+ semantics for derived identities; Sync remains strict. Match platform logins
125
+ only to declared logins, refuse prototype-name omissions and duplicate repos.
126
+ - Share manifest generation between project and upgrade, store a relative graph
127
+ path, and compare parsed content independently of object-key order.
128
+ - Resolve preview commands through the scoped package from root or parent installs;
129
+ qualify both layouts with installed health/page smoke tests. Existing preview
130
+ configs require an explicit user update.
131
+ - Validate retained adoption policy/lock state before writing, refuse implicit
132
+ drift acceptance, detect null-digest policy drift, and refuse init collisions
133
+ so retries cannot overwrite authored files or reset the lock.
134
+
135
+ - Repair starter document classifications, shared adoption policy validity and
136
+ initial adoption locks. Existing locks are retained so adoption cannot accept
137
+ managed-file drift implicitly.
138
+ - Resolve template previews through the locally installed scoped package.
139
+ - Refuse unknown or ambiguous actor declarations, prioritize platform login over
140
+ Git metadata, and never infer the current operator from commit history. Shared
141
+ policy declarations do not require ownership of private repos outside the
142
+ configured workspace. These checks remain attribution, not authentication.
143
+ - Check the generated projection manifest as well as its HTML for staleness.
144
+
145
+ - Add evidence-thresholded skill stewardship and exact-plan local projections;
146
+ refuse unmanaged collisions, managed drift and cross-workspace confirmations.
147
+ - Add bounded immutable source copies and extraction attempt receipts, retaining
148
+ originals and separating byte integrity from semantic acceptance.
149
+ - Add inert guide offers, revocable engagement and exact-payload consent contracts.
150
+ No remote execution, commercial authority or proprietary implementation ships.
151
+ See issues #33 and #34 and the skill stewardship and intake/guide documentation.
152
+
153
+ - Add experimental source-bound coauthor sessions, a private draft store, JSON
154
+ stdin CLI and portable guided-coauthor skill. Preserve original answers,
155
+ confirmation, durable receipts, bounded recovery and source-change refusal;
156
+ no canonical source edits or publication authority are introduced.
157
+ - Add an external-project adapter starter with declared source boundaries,
158
+ namespaced synthetic protocols, local-state exclusions and compatibility policy.
159
+ - Add evidence-bound local review runs, per-claim decisions, source-owner
160
+ handoffs, passage responses and reading-position recovery. Current decisions
161
+ refuse changed evidence and stale versions; local typed names remain asserted
162
+ identities and no source edits are applied automatically.
163
+ - Report installed provenance as declared origin, observed bytes or verified
164
+ checkout binding. Compare working bytes with commit objects, including Git
165
+ index hints, sanitize remote metadata, and fail exact-source checks when the
166
+ binding is unresolved. Piped provenance output is no longer truncated.
167
+ - Remove unsupported numeric claim confidence and explain legacy readiness
168
+ scores as input completeness. Supply the required run import-safety field.
169
+ - Add pack lifecycle qualification and dry-run migration guidance plus explicit,
170
+ disclosure-checked historical inspection bundles that never transfer approval.
171
+ - Extend the existing installed consumer gate across moved source layouts,
172
+ durable contributions, stale refusal and inspection-only portability.
173
+
174
+ ## 0.2.0-alpha.6
175
+
176
+ - Share project-location parsing with extension-pack commands, including
177
+ repeated `--repo-path NAME=PATH` overrides and both argument forms. Malformed
178
+ shared options now fail before local-state creation. Add path-free resolution
179
+ diagnostics with `config check --explain`; read boundaries remain declared
180
+ by the project.
181
+ - Add Deliverable Zero for Atelier Sync: explicit single-repository
182
+ enrollment, a pinned direct-process Git adapter, executable repository
183
+ completeness observations, fast-forward-only reconciliation, per-repository
184
+ locking, hash-chained local operation traces, pause/resume control, and a
185
+ two-phase user-confirmed commit-and-publish path. No desktop shell, watcher
186
+ dependency, semantic conflict resolution, force operation, browser apply
187
+ endpoint, telemetry, or hidden upload is introduced.
188
+ - Raise the Sync Git floor to 2.40 so default global and system attributes can
189
+ be observed, bind publication to the single resolved push URL, refuse URL
190
+ rewrite ambiguity, strip every inherited `GIT_*` process control, keep
191
+ read-only commands mutation-free, and return non-zero exits for paused status
192
+ and failed publication.
193
+
3
194
  ## 0.2.0-alpha.5
4
195
 
5
196
  - Harden boundary enforcement so path globs use segment-aware matching, an
package/README.md CHANGED
@@ -12,7 +12,7 @@ The Atelier adds that missing layer without taking the work away from you. It
12
12
  turns a repository into an ontology-governed knowledge graph, gives rules the
13
13
  power to refuse invalid states, and produces bounded views for people, teams,
14
14
  agents, and tools. Git remains the source of record. Your files remain readable.
15
- The runtime remains local.
15
+ The authoring runtime remains local; optional vault adapters run in an explicitly configured host.
16
16
 
17
17
  That makes the same repository useful at several levels:
18
18
 
@@ -33,6 +33,12 @@ its definition or ceiling.
33
33
 
34
34
  ## From files to a working system
35
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
+
36
42
  ```text
37
43
  files you own
38
44
  ↓ declare identity, type, audience, and relationships
@@ -48,7 +54,7 @@ governed projections
48
54
  You can see the complete loop in a disposable sample workspace:
49
55
 
50
56
  ```bash
51
- npm install --save-dev @mnstry/atelier@0.2.0-alpha.5
57
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.8
52
58
  npx mnstry-atelier init --fixture=sample-workspace --target ./sample
53
59
  npx mnstry-atelier graph --project ./sample/atelier.project.json
54
60
  npx mnstry-atelier project --project ./sample/atelier.project.json
@@ -187,6 +193,12 @@ session context, capability envelopes, and proposed changes, but it does not
187
193
  apply those proposals or grant direct write access. It is a local context and
188
194
  control layer that another interface can build on, not an autonomous editor.
189
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
+
190
202
  ### 5. The repository can power another product
191
203
 
192
204
  The CLI is one interface. The package is also a library, and its contracts are
@@ -230,6 +242,12 @@ executable API reference. [Distribution contracts](./docs/distributions.md) expl
230
242
  how a governed subset can be packaged for another surface without widening its
231
243
  audience.
232
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
+
233
251
  ## Where the Atelier stops
234
252
 
235
253
  The open package owns repository-side structure and proof. A managed runtime
@@ -251,24 +269,34 @@ trust boundary.
251
269
  This package makes three promises. None of them asks for your trust — each
252
270
  one names the command that proves it.
253
271
 
254
- **Nothing leaves your machine, with one exception you can see.** There is no
255
- telemetry, no update check, no crash reporting, and no send path anywhere in
256
- the package. The exceptions are explicit: `boundary check` may invoke `gh api
257
- user` after no declared actor matches an explicit `--actor`,
258
- `MNSTRY_ATELIER_ACTOR`, `GITHUB_ACTOR`, or a configured Git email; repository
259
- identity checks may invoke `gh api repos/...` to resolve a canonical GitHub
260
- identity. Those authenticated requests use your own `gh` credentials. A
261
- recognized explicit actor prevents the boundary actor fallback; recorded
262
- repository identities let identity checks keep working when the provider is
263
- unavailable. The only network client
264
- refuses non-loopback URLs, the served pages carry a policy that authorizes no
265
- external origin, and release audit scans every executable or markup file in
266
- the exact `npm pack` inventory for egress primitives. The standalone gate also
267
- scans executable and markup files under `src/`, `bin/`, `scripts/`,
268
- `templates/`, `examples/`, and `skills/`. Two limits worth stating plainly:
269
- the egress control does not interpret data-only `.json` or `.md` files, and it
270
- does not model `child_process`; the two reviewed `gh` paths above are therefore
271
- documented exceptions rather than scanner detections:
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:
272
300
 
273
301
  ```bash
274
302
  npm run egress:check
@@ -305,9 +333,18 @@ receive.
305
333
 
306
334
  <!-- atelier:block:will-not-do:start -->
307
335
  - It does not write to a MNSTRY runtime database.
308
- - It does not import, provision, publish, or send anything.
309
- - Except for the documented `gh` actor-resolution fallback, it initiates no
310
- external network requests.
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.
311
348
  - It does not execute model-assisted analysis or any model provider.
312
349
  - It does not include client project content.
313
350
 
@@ -341,7 +378,7 @@ Node.js `>=22.18.0 <23` is required. Pin the prerelease while the package
341
378
  remains in alpha:
342
379
 
343
380
  ```bash
344
- npm install --save-dev @mnstry/atelier@0.2.0-alpha.5
381
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.8
345
382
  ```
346
383
 
347
384
  Then choose the path that matches what you are building:
@@ -355,10 +392,12 @@ Then choose the path that matches what you are building:
355
392
  - [Continuity commitments](./docs/continuity.md)
356
393
  - [Assurance controls and evidence map](./docs/assurance-controls.md)
357
394
  - [Upgrade notes](./docs/upgrade.md)
395
+ - [Upgrade with your agent](./docs/guided-upgrades.md)
396
+ - [Obsidian projection](./docs/obsidian.md)
358
397
 
359
398
  ## Status and command reference
360
399
 
361
- Current package: `@mnstry/atelier@0.2.0-alpha.5`.
400
+ Current package: `@mnstry/atelier@0.2.0-alpha.8`.
362
401
 
363
402
  The alpha package is usable and contract-tested, but its library API may still
364
403
  change before a stable release. Pin the exact version in production toolchains.
@@ -396,3 +435,25 @@ full command behavior is also covered by the package's executable tests.
396
435
 
397
436
  Contributions are welcome through [the contribution guide](./CONTRIBUTING.md).
398
437
  MNSTRY Atelier is released under [Apache-2.0](./LICENSE).
438
+
439
+ ## Experimental hosted vault contract
440
+
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.
446
+
447
+ ## Experimental Obsidian projection
448
+
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
@@ -0,0 +1,49 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mnstry.ai/schemas/atelier/atelier-adoption-policy.v1.schema.json",
4
+ "$comment": "contract revision 1.0.0",
5
+ "title": "mnstry.atelier-adoption-policy@v1",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema",
10
+ "enabled",
11
+ "mode",
12
+ "maxAgeSeconds",
13
+ "recoveryCoverage",
14
+ "allowedEffects"
15
+ ],
16
+ "properties": {
17
+ "schema": {
18
+ "const": "mnstry.atelier-adoption-policy@v1"
19
+ },
20
+ "enabled": {
21
+ "type": "boolean"
22
+ },
23
+ "mode": {
24
+ "const": "manual-exact-plan"
25
+ },
26
+ "maxAgeSeconds": {
27
+ "type": "integer",
28
+ "minimum": 1,
29
+ "maximum": 86400
30
+ },
31
+ "recoveryCoverage": {
32
+ "const": "local-only"
33
+ },
34
+ "allowedEffects": {
35
+ "const": [
36
+ "lock-and-projections",
37
+ "git-commit"
38
+ ]
39
+ },
40
+ "ext": {
41
+ "type": "object",
42
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
43
+ },
44
+ "contractVersion": {
45
+ "type": "string",
46
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$"
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,163 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mnstry.ai/schemas/atelier/atelier-coauthor.v1.schema.json",
4
+ "$comment": "contract revision 1.0.0",
5
+ "title": "Private coauthor configuration and draft",
6
+ "oneOf": [
7
+ {
8
+ "$ref": "#/$defs/config"
9
+ },
10
+ {
11
+ "$ref": "#/$defs/draft"
12
+ }
13
+ ],
14
+ "$defs": {
15
+ "config": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "properties": {
19
+ "id": {
20
+ "type": "string",
21
+ "minLength": 1,
22
+ "maxLength": 100000
23
+ },
24
+ "fields": {
25
+ "type": "array",
26
+ "minItems": 1,
27
+ "maxItems": 1000,
28
+ "items": {
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "properties": {
32
+ "id": {
33
+ "type": "string",
34
+ "minLength": 1,
35
+ "maxLength": 100000
36
+ },
37
+ "source": {
38
+ "type": "object",
39
+ "additionalProperties": false,
40
+ "properties": {
41
+ "ref": {
42
+ "type": "string",
43
+ "minLength": 1,
44
+ "maxLength": 100000
45
+ },
46
+ "digest": {
47
+ "type": "string",
48
+ "pattern": "^[a-f0-9]{64}$"
49
+ },
50
+ "ext": {
51
+ "type": "object",
52
+ "description": "Reserved inert metadata; does not grant authority."
53
+ }
54
+ },
55
+ "required": [
56
+ "ref",
57
+ "digest"
58
+ ]
59
+ },
60
+ "ext": {
61
+ "type": "object",
62
+ "description": "Reserved inert metadata; does not grant authority."
63
+ }
64
+ },
65
+ "required": [
66
+ "id",
67
+ "source"
68
+ ]
69
+ }
70
+ },
71
+ "contractVersion": {
72
+ "type": "string",
73
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$"
74
+ },
75
+ "ext": {
76
+ "type": "object",
77
+ "description": "Reserved inert metadata; does not grant authority."
78
+ }
79
+ },
80
+ "required": [
81
+ "id",
82
+ "fields"
83
+ ]
84
+ },
85
+ "draft": {
86
+ "type": "object",
87
+ "additionalProperties": false,
88
+ "properties": {
89
+ "schema": {
90
+ "const": "atelier-coauthor-draft@v1"
91
+ },
92
+ "status": {
93
+ "const": "draft"
94
+ },
95
+ "text": {
96
+ "type": "string",
97
+ "minLength": 1,
98
+ "maxLength": 100000
99
+ },
100
+ "receipt": {
101
+ "type": "object",
102
+ "additionalProperties": false,
103
+ "properties": {
104
+ "sessionId": {
105
+ "type": "string",
106
+ "minLength": 1,
107
+ "maxLength": 100000
108
+ },
109
+ "requestId": {
110
+ "type": "string",
111
+ "minLength": 1,
112
+ "maxLength": 100000
113
+ },
114
+ "fieldId": {
115
+ "type": "string",
116
+ "minLength": 1,
117
+ "maxLength": 100000
118
+ },
119
+ "sourceRef": {
120
+ "type": "string",
121
+ "minLength": 1,
122
+ "maxLength": 100000
123
+ },
124
+ "sourceDigest": {
125
+ "type": "string",
126
+ "pattern": "^[a-f0-9]{64}$"
127
+ },
128
+ "valueDigest": {
129
+ "type": "string",
130
+ "pattern": "^[a-f0-9]{64}$"
131
+ },
132
+ "ext": {
133
+ "type": "object",
134
+ "description": "Reserved inert metadata; does not grant authority."
135
+ }
136
+ },
137
+ "required": [
138
+ "sessionId",
139
+ "requestId",
140
+ "fieldId",
141
+ "sourceRef",
142
+ "sourceDigest",
143
+ "valueDigest"
144
+ ]
145
+ },
146
+ "contractVersion": {
147
+ "type": "string",
148
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$"
149
+ },
150
+ "ext": {
151
+ "type": "object",
152
+ "description": "Reserved inert metadata; does not grant authority."
153
+ }
154
+ },
155
+ "required": [
156
+ "schema",
157
+ "status",
158
+ "text",
159
+ "receipt"
160
+ ]
161
+ }
162
+ }
163
+ }