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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/README.md +59 -15
  3. package/SECURITY.md +6 -1
  4. package/contracts/atelier-adoption-policy.v1.schema.json +49 -0
  5. package/contracts/atelier-coauthor.v1.schema.json +163 -0
  6. package/contracts/atelier-decision-request.v1.schema.json +476 -0
  7. package/contracts/atelier-decision-result.v1.schema.json +500 -0
  8. package/contracts/atelier-guide.v1.schema.json +227 -0
  9. package/contracts/atelier-intake.v1.schema.json +151 -0
  10. package/contracts/atelier-migration.v2.schema.json +61 -0
  11. package/contracts/atelier-obsidian-acceptance-receipt.v1.schema.json +211 -0
  12. package/contracts/atelier-obsidian-apply-policy.v1.schema.json +298 -0
  13. package/contracts/atelier-obsidian-corpus-profile.v1.schema.json +98 -0
  14. package/contracts/atelier-obsidian-edit-operation.v1.schema.json +138 -0
  15. package/contracts/atelier-obsidian-ext-settings.v1.schema.json +287 -0
  16. package/contracts/atelier-obsidian-generation-manifest.v1.schema.json +353 -0
  17. package/contracts/atelier-obsidian-proposal-receipt.v1.schema.json +110 -0
  18. package/contracts/atelier-obsidian-publication-journal.v1.schema.json +167 -0
  19. package/contracts/atelier-obsidian-scope.v1.schema.json +264 -0
  20. package/contracts/atelier-obsidian-service-state.v1.schema.json +149 -0
  21. package/contracts/atelier-obsidian-source-snapshot.v1.schema.json +179 -0
  22. package/contracts/atelier-pane-presentation.v1.schema.json +76 -0
  23. package/contracts/atelier-presentation.v1.schema.json +1293 -0
  24. package/contracts/atelier-review.v1.schema.json +1601 -0
  25. package/contracts/atelier-skill-steward.v1.schema.json +692 -0
  26. package/contracts/atelier-upgrade-plan.v2.schema.json +398 -0
  27. package/contracts/atelier-upgrade-receipt.v1.schema.json +99 -0
  28. package/contracts/atelier-vault-publication.v1.schema.json +58 -0
  29. package/docs/assurance-controls.md +9 -1
  30. package/docs/atelier-sync.md +5 -4
  31. package/docs/blocks/claims.md +15 -10
  32. package/docs/blocks/will-not-do.md +4 -1
  33. package/docs/coauthor-session.md +57 -0
  34. package/docs/connected-composition.md +75 -0
  35. package/docs/decisions.md +167 -0
  36. package/docs/exact-upgrades.md +159 -0
  37. package/docs/extension-pack-lifecycle.md +33 -0
  38. package/docs/guided-upgrades.md +99 -0
  39. package/docs/install.md +65 -9
  40. package/docs/intake-and-guides.md +65 -0
  41. package/docs/integration-and-review-plan.md +409 -0
  42. package/docs/integration-contract-decisions.md +22 -0
  43. package/docs/local-review.md +84 -0
  44. package/docs/local-services.md +227 -0
  45. package/docs/local-state.md +107 -0
  46. package/docs/obsidian-contract.md +687 -0
  47. package/docs/obsidian.md +387 -0
  48. package/docs/portable-presentation.md +328 -0
  49. package/docs/presentation-consumer-boundaries.md +75 -0
  50. package/docs/presentation-review-disposition.md +47 -0
  51. package/docs/project-command-inventory.md +38 -0
  52. package/docs/project-options.md +53 -0
  53. package/docs/release-engineering.md +88 -0
  54. package/docs/review-portability.md +55 -0
  55. package/docs/skill-steward.md +156 -0
  56. package/docs/upgrade.md +55 -2
  57. package/docs/vault-service.md +292 -0
  58. package/fixtures/atelier-coauthor/invalid/authority.v1.json +5 -0
  59. package/fixtures/atelier-coauthor/valid/config.v1.json +12 -0
  60. package/fixtures/atelier-guide/invalid/authority.v1.json +11 -0
  61. package/fixtures/atelier-guide/valid/capability.v1.json +10 -0
  62. package/fixtures/atelier-guide/valid/consent.v1.json +11 -0
  63. package/fixtures/atelier-guide/valid/engagement.v1.json +7 -0
  64. package/fixtures/atelier-guide/valid/offer.v1.json +10 -0
  65. package/fixtures/atelier-intake/invalid/authority.v1.json +9 -0
  66. package/fixtures/atelier-intake/valid/attempt.v1.json +8 -0
  67. package/fixtures/atelier-intake/valid/completion.v1.json +9 -0
  68. package/fixtures/atelier-intake/valid/source.v1.json +7 -0
  69. package/fixtures/atelier-review/invalid/authenticated-identity.v1.json +22 -0
  70. package/fixtures/atelier-review/valid/bound.v1.json +229 -0
  71. package/fixtures/atelier-review/valid/bundle.v1.json +267 -0
  72. package/fixtures/atelier-review/valid/contribution.v1.json +22 -0
  73. package/fixtures/atelier-review/valid/lifecycle.v1.json +14 -0
  74. package/fixtures/atelier-skill-steward/audit/invalid/source-mutation.v1.json +26 -0
  75. package/fixtures/atelier-skill-steward/audit/valid/clean.v1.json +26 -0
  76. package/fixtures/atelier-skill-steward/candidates/invalid/workflow-key.v1.json +37 -0
  77. package/fixtures/atelier-skill-steward/candidates/valid/create.v1.json +37 -0
  78. package/fixtures/atelier-skill-steward/lock/invalid/bad-digest.v1.json +18 -0
  79. package/fixtures/atelier-skill-steward/lock/valid/installed.v1.json +23 -0
  80. package/fixtures/atelier-skill-steward/plan/invalid/delete-action.v1.json +33 -0
  81. package/fixtures/atelier-skill-steward/plan/valid/add.v1.json +33 -0
  82. package/fixtures/atelier-upgrade-transaction/adoption-policy/invalid/example.json +12 -0
  83. package/fixtures/atelier-upgrade-transaction/adoption-policy/valid/example.json +11 -0
  84. package/fixtures/atelier-upgrade-transaction/migration/invalid/example.json +20 -0
  85. package/fixtures/atelier-upgrade-transaction/migration/valid/example.json +19 -0
  86. package/fixtures/atelier-upgrade-transaction/upgrade-plan/invalid/example.json +58 -0
  87. package/fixtures/atelier-upgrade-transaction/upgrade-plan/valid/example.json +57 -0
  88. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/invalid/example.json +15 -0
  89. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/valid/example.json +14 -0
  90. package/fixtures/atelier-vault-publication/invalid/publication.json +5 -0
  91. package/fixtures/atelier-vault-publication/valid/publication.json +11 -0
  92. package/fixtures/decisions/request/invalid/unknown-authority.v1.json +61 -0
  93. package/fixtures/decisions/request/valid/triage.v1.json +60 -0
  94. package/fixtures/decisions/result/invalid/execution-authority.v1.json +50 -0
  95. package/fixtures/decisions/result/valid/abstained.v1.json +23 -0
  96. package/fixtures/decisions/result/valid/assessed.v1.json +50 -0
  97. package/fixtures/obsidian/acceptance/ap05-extra-notes.json +14 -0
  98. package/fixtures/obsidian/acceptance/receipts/G07.valid.v1.json +63 -0
  99. package/fixtures/obsidian/acceptance/receipts/G13.valid.v1.json +69 -0
  100. package/fixtures/obsidian/acceptance/receipts/G14.valid.v1.json +62 -0
  101. package/fixtures/obsidian/acceptance/receipts/G15.valid.v1.json +56 -0
  102. package/fixtures/obsidian/acceptance/receipts/G16.valid.v1.json +73 -0
  103. package/fixtures/obsidian/acceptance/receipts/G17.valid.v1.json +75 -0
  104. package/fixtures/obsidian/acceptance/receipts/G18.valid.v1.json +64 -0
  105. package/fixtures/obsidian/acceptance/service-sentinels.json +10 -0
  106. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/duplicate-evidence-name.v1.json +39 -0
  107. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/evidence-by-absolute-path.v1.json +34 -0
  108. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/missing-candidate-tree.v1.json +33 -0
  109. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/no-evidence.v1.json +28 -0
  110. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-outcome.v1.json +34 -0
  111. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-top-level-field.v1.json +35 -0
  112. package/fixtures/obsidian/contracts/acceptance-receipt/valid/node-gate.v1.json +34 -0
  113. package/fixtures/obsidian/contracts/apply-policy/invalid/automatic-without-edit-class.v1.json +27 -0
  114. package/fixtures/obsidian/contracts/apply-policy/invalid/conflict-overwrite.v1.json +29 -0
  115. package/fixtures/obsidian/contracts/apply-policy/invalid/missing-policy-digest.v1.json +28 -0
  116. package/fixtures/obsidian/contracts/apply-policy/invalid/unbounded-batch.v1.json +29 -0
  117. package/fixtures/obsidian/contracts/apply-policy/invalid/unimplemented-edit-class.v1.json +30 -0
  118. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-mode.v1.json +29 -0
  119. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-selector-operator.v1.json +22 -0
  120. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-top-level-field.v1.json +30 -0
  121. package/fixtures/obsidian/contracts/apply-policy/valid/automatic-scoped.v1.json +29 -0
  122. package/fixtures/obsidian/contracts/apply-policy/valid/manual-default.v1.json +20 -0
  123. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-path-in-ext.v1.json +30 -0
  124. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-repository-root.v1.json +27 -0
  125. package/fixtures/obsidian/contracts/corpus-profile/invalid/duplicate-repository-id.v1.json +27 -0
  126. package/fixtures/obsidian/contracts/corpus-profile/invalid/overlapping-managed-roots.v1.json +27 -0
  127. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-enrollment.v1.json +27 -0
  128. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-top-level-field.v1.json +28 -0
  129. package/fixtures/obsidian/contracts/corpus-profile/valid/three-repositories.v1.json +27 -0
  130. package/fixtures/obsidian/contracts/edit-operation/invalid/absolute-recovery-ref.v1.json +21 -0
  131. package/fixtures/obsidian/contracts/edit-operation/invalid/inline-observed-bytes.v1.json +22 -0
  132. package/fixtures/obsidian/contracts/edit-operation/invalid/missing-base-digest.v1.json +20 -0
  133. package/fixtures/obsidian/contracts/edit-operation/invalid/short-idempotency-key.v1.json +21 -0
  134. package/fixtures/obsidian/contracts/edit-operation/invalid/unknown-kind.v1.json +21 -0
  135. package/fixtures/obsidian/contracts/edit-operation/valid/pending-body-replacement.v1.json +21 -0
  136. package/fixtures/obsidian/contracts/ext-settings/invalid/absolute-path-prefix.v1.json +28 -0
  137. package/fixtures/obsidian/contracts/ext-settings/invalid/apply-policy-in-portable-settings.v1.json +30 -0
  138. package/fixtures/obsidian/contracts/ext-settings/invalid/duplicate-scope-id.v1.json +27 -0
  139. package/fixtures/obsidian/contracts/ext-settings/invalid/machine-local-vault-path.v1.json +28 -0
  140. package/fixtures/obsidian/contracts/ext-settings/invalid/service-port-in-portable-settings.v1.json +28 -0
  141. package/fixtures/obsidian/contracts/ext-settings/invalid/unknown-default-scope.v1.json +27 -0
  142. package/fixtures/obsidian/contracts/ext-settings/valid/disabled.v1.json +5 -0
  143. package/fixtures/obsidian/contracts/ext-settings/valid/enabled-with-scopes.v1.json +27 -0
  144. package/fixtures/obsidian/contracts/generation-manifest/invalid/absolute-note-path.v1.json +114 -0
  145. package/fixtures/obsidian/contracts/generation-manifest/invalid/complete-with-unwritten-notes.v1.json +114 -0
  146. package/fixtures/obsidian/contracts/generation-manifest/invalid/derived-link-claimed-declared.v1.json +114 -0
  147. package/fixtures/obsidian/contracts/generation-manifest/invalid/duplicate-note-identity.v1.json +114 -0
  148. package/fixtures/obsidian/contracts/generation-manifest/invalid/in-scope-endpoint-missing.v1.json +114 -0
  149. package/fixtures/obsidian/contracts/generation-manifest/invalid/title-only-note-path.v1.json +114 -0
  150. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-note-field.v1.json +115 -0
  151. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-relation-type.v1.json +114 -0
  152. package/fixtures/obsidian/contracts/generation-manifest/invalid/withheld-endpoint.v1.json +114 -0
  153. package/fixtures/obsidian/contracts/generation-manifest/valid/two-notes.v1.json +114 -0
  154. package/fixtures/obsidian/contracts/oracles/scope-cases.json +412 -0
  155. package/fixtures/obsidian/contracts/proposal-receipt/invalid/accepted-without-proposal-id.v1.json +12 -0
  156. package/fixtures/obsidian/contracts/proposal-receipt/invalid/missing-adapter-operation-id.v1.json +11 -0
  157. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-backpressure-outcome.v1.json +12 -0
  158. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-top-level-field.v1.json +13 -0
  159. package/fixtures/obsidian/contracts/proposal-receipt/valid/accepted-new.v1.json +12 -0
  160. package/fixtures/obsidian/contracts/proposal-receipt/valid/deferred.v1.json +12 -0
  161. package/fixtures/obsidian/contracts/publication-journal/invalid/absolute-recovery-ref.v1.json +47 -0
  162. package/fixtures/obsidian/contracts/publication-journal/invalid/duplicate-sequence.v1.json +47 -0
  163. package/fixtures/obsidian/contracts/publication-journal/invalid/empty-protocol-id.v1.json +47 -0
  164. package/fixtures/obsidian/contracts/publication-journal/invalid/missing-protocol-id.v1.json +46 -0
  165. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-entry-field.v1.json +48 -0
  166. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-state.v1.json +47 -0
  167. package/fixtures/obsidian/contracts/publication-journal/valid/committed.v1.json +47 -0
  168. package/fixtures/obsidian/contracts/publication-journal/valid/updating-after-restart.v1.json +22 -0
  169. package/fixtures/obsidian/contracts/scope/invalid/absolute-path-prefix.v1.json +15 -0
  170. package/fixtures/obsidian/contracts/scope/invalid/duplicate-ids.v1.json +18 -0
  171. package/fixtures/obsidian/contracts/scope/invalid/expansion-without-node-budget.v1.json +40 -0
  172. package/fixtures/obsidian/contracts/scope/invalid/full-mode-with-subset.v1.json +8 -0
  173. package/fixtures/obsidian/contracts/scope/invalid/unknown-mode.v1.json +41 -0
  174. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-key.v1.json +15 -0
  175. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-operator.v1.json +14 -0
  176. package/fixtures/obsidian/contracts/scope/invalid/unknown-top-level-field.v1.json +42 -0
  177. package/fixtures/obsidian/contracts/scope/valid/explicit-empty.v1.json +8 -0
  178. package/fixtures/obsidian/contracts/scope/valid/focus.v1.json +11 -0
  179. package/fixtures/obsidian/contracts/scope/valid/full.v1.json +8 -0
  180. package/fixtures/obsidian/contracts/scope/valid/scoped-set-expression.v1.json +41 -0
  181. package/fixtures/obsidian/contracts/service-state/invalid/hostname-instead-of-literal-loopback.v1.json +23 -0
  182. package/fixtures/obsidian/contracts/service-state/invalid/missing-consent.v1.json +18 -0
  183. package/fixtures/obsidian/contracts/service-state/invalid/privileged-port.v1.json +23 -0
  184. package/fixtures/obsidian/contracts/service-state/invalid/unknown-top-level-field.v1.json +24 -0
  185. package/fixtures/obsidian/contracts/service-state/invalid/wildcard-bind.v1.json +23 -0
  186. package/fixtures/obsidian/contracts/service-state/valid/healthy.v1.json +23 -0
  187. package/fixtures/obsidian/contracts/source-snapshot/invalid/absolute-file-path.v1.json +48 -0
  188. package/fixtures/obsidian/contracts/source-snapshot/invalid/duplicate-repository-id.v1.json +48 -0
  189. package/fixtures/obsidian/contracts/source-snapshot/invalid/mixed-read.v1.json +48 -0
  190. package/fixtures/obsidian/contracts/source-snapshot/invalid/parent-traversal-path.v1.json +48 -0
  191. package/fixtures/obsidian/contracts/source-snapshot/invalid/unknown-file-field.v1.json +49 -0
  192. package/fixtures/obsidian/contracts/source-snapshot/valid/two-repositories.v1.json +48 -0
  193. package/fixtures/obsidian/edits/workspace.json +65 -0
  194. package/fixtures/obsidian/materialization/expected-full.json +99 -0
  195. package/fixtures/obsidian/materialization/expected-scoped.json +39 -0
  196. package/fixtures/obsidian/materialization/workspace.json +54 -0
  197. package/fixtures/obsidian/proposals/expected-shapes.json +11 -0
  198. package/fixtures/ui/presentation/pane.v1.json +7 -0
  199. package/fixtures/ui/presentation/reference.v1.json +293 -0
  200. package/package.json +57 -6
  201. package/skills/claude/atelier-guided-coauthor/SKILL.md +49 -0
  202. package/skills/claude/atelier-guided-upgrade/SKILL.md +97 -0
  203. package/skills/claude/atelier-open/SKILL.md +5 -0
  204. package/skills/claude/atelier-skill-steward/SKILL.md +62 -0
  205. package/skills/claude/mnstry-readiness/SKILL.md +5 -0
  206. package/skills/codex/atelier-guided-coauthor/SKILL.md +49 -0
  207. package/skills/codex/atelier-guided-upgrade/SKILL.md +97 -0
  208. package/skills/codex/atelier-open/SKILL.md +5 -0
  209. package/skills/codex/atelier-skill-steward/SKILL.md +62 -0
  210. package/skills/codex/mnstry-readiness/SKILL.md +5 -0
  211. package/src/access/preview-enforcer.mjs +84 -0
  212. package/src/boundary/policy.mjs +57 -25
  213. package/src/cli/project-options.mjs +58 -0
  214. package/src/cli/run.mjs +43 -3
  215. package/src/coauthor/session.mjs +161 -0
  216. package/src/coauthor/store.mjs +173 -0
  217. package/src/collaboration/event-ledger.mjs +16 -33
  218. package/src/collaboration/inspection-bundle.mjs +223 -0
  219. package/src/collaboration/review-contracts.mjs +25 -0
  220. package/src/collaboration/review-store.mjs +305 -0
  221. package/src/commands/coauthor.mjs +26 -0
  222. package/src/commands/config.mjs +6 -1
  223. package/src/commands/extension-pack.mjs +15 -8
  224. package/src/commands/init.mjs +44 -5
  225. package/src/commands/obsidian.mjs +368 -0
  226. package/src/commands/review.mjs +147 -0
  227. package/src/commands/setup.mjs +51 -14
  228. package/src/commands/skills.mjs +199 -0
  229. package/src/commands/sync.mjs +8 -1
  230. package/src/composition/registry.mjs +27 -0
  231. package/src/composition/wire.mjs +122 -0
  232. package/src/contracts/corpus.mjs +29 -0
  233. package/src/decisions/contracts.d.mts +96 -0
  234. package/src/decisions/contracts.mjs +321 -0
  235. package/src/disclosure/content-scan.mjs +13 -0
  236. package/src/export/atelier-export-contract.mjs +16 -1
  237. package/src/extension-packs/lifecycle.mjs +154 -0
  238. package/src/graph/graph.mjs +64 -2
  239. package/src/graph/knowledge-graph.mjs +548 -24
  240. package/src/guides/contracts.mjs +54 -0
  241. package/src/intake/store.mjs +119 -0
  242. package/src/preview/channel.mjs +89 -0
  243. package/src/project/config.mjs +26 -27
  244. package/src/project/durable-state.mjs +161 -0
  245. package/src/project/file-class.mjs +166 -0
  246. package/src/project/private-state.mjs +11 -1
  247. package/src/projection/obsidian/contracts.mjs +571 -0
  248. package/src/projection/obsidian/edits/align.mjs +169 -0
  249. package/src/projection/obsidian/edits/apply.mjs +889 -0
  250. package/src/projection/obsidian/edits/arbitrate.mjs +414 -0
  251. package/src/projection/obsidian/edits/contribution.mjs +108 -0
  252. package/src/projection/obsidian/edits/index.mjs +19 -0
  253. package/src/projection/obsidian/edits/object-identity.mjs +61 -0
  254. package/src/projection/obsidian/edits/object-store.mjs +517 -0
  255. package/src/projection/obsidian/edits/observe.mjs +123 -0
  256. package/src/projection/obsidian/edits/policy.mjs +123 -0
  257. package/src/projection/obsidian/edits/regions.mjs +648 -0
  258. package/src/projection/obsidian/materialize/byte-lens.mjs +98 -0
  259. package/src/projection/obsidian/materialize/index.mjs +7 -0
  260. package/src/projection/obsidian/materialize/path-registry.mjs +105 -0
  261. package/src/projection/obsidian/materialize/prepare-view.mjs +746 -0
  262. package/src/projection/obsidian/materialize/settings.mjs +57 -0
  263. package/src/projection/obsidian/materialize/stage.mjs +27 -0
  264. package/src/projection/obsidian/proposals/adapter.mjs +572 -0
  265. package/src/projection/obsidian/proposals/backpressure.mjs +113 -0
  266. package/src/projection/obsidian/proposals/contribution.mjs +55 -0
  267. package/src/projection/obsidian/proposals/index.mjs +23 -0
  268. package/src/projection/obsidian/proposals/observation.mjs +216 -0
  269. package/src/projection/obsidian/proposals/queue.mjs +277 -0
  270. package/src/projection/obsidian/proposals/router.mjs +168 -0
  271. package/src/projection/obsidian/publication/bridge-script.mjs +266 -0
  272. package/src/projection/obsidian/publication/exchange.mjs +117 -0
  273. package/src/projection/obsidian/publication/index.mjs +5 -0
  274. package/src/projection/obsidian/publication/publisher.mjs +588 -0
  275. package/src/projection/obsidian/publication/test-seam.mjs +16 -0
  276. package/src/projection/obsidian/publication/transport.mjs +139 -0
  277. package/src/projection/obsidian/recovery/index.mjs +6 -0
  278. package/src/projection/obsidian/recovery/journal.mjs +134 -0
  279. package/src/projection/obsidian/recovery/late-writer.mjs +46 -0
  280. package/src/projection/obsidian/recovery/restart.mjs +316 -0
  281. package/src/projection/obsidian/recovery/store.mjs +234 -0
  282. package/src/projection/obsidian/selection-ui/conflict-view.mjs +91 -0
  283. package/src/projection/obsidian/selection-ui/contribution.mjs +141 -0
  284. package/src/projection/obsidian/selection-ui/focus.mjs +82 -0
  285. package/src/projection/obsidian/selection-ui/index.mjs +12 -0
  286. package/src/projection/obsidian/selection-ui/policy-setup.mjs +107 -0
  287. package/src/projection/obsidian/selection-ui/receipt.mjs +173 -0
  288. package/src/projection/obsidian/selection-ui/selection-state.mjs +122 -0
  289. package/src/projection/obsidian/selection-ui/selection.mjs +109 -0
  290. package/src/projection/project.mjs +28 -19
  291. package/src/readiness-protocols/evidence.mjs +282 -0
  292. package/src/readiness-protocols/runtime.mjs +4 -3
  293. package/src/readiness-protocols/source-read.mjs +39 -0
  294. package/src/runtime/obsidian/app-capability.mjs +110 -0
  295. package/src/runtime/obsidian/app-production-seams.mjs +96 -0
  296. package/src/runtime/obsidian/contributions/proposal-adapter.mjs +4 -0
  297. package/src/runtime/obsidian/contributions/selection-ui.mjs +4 -0
  298. package/src/runtime/obsidian/contributions/source-apply.mjs +4 -0
  299. package/src/runtime/obsidian/contributions.mjs +27 -0
  300. package/src/runtime/obsidian/documents.mjs +37 -0
  301. package/src/runtime/obsidian/enablement.mjs +53 -0
  302. package/src/runtime/obsidian/engine.mjs +532 -0
  303. package/src/runtime/obsidian/errors.mjs +14 -0
  304. package/src/runtime/obsidian/extension-points.mjs +103 -0
  305. package/src/runtime/obsidian/index.mjs +34 -0
  306. package/src/runtime/obsidian/lifecycle.mjs +258 -0
  307. package/src/runtime/obsidian/machine-settings.mjs +260 -0
  308. package/src/runtime/obsidian/observation.mjs +158 -0
  309. package/src/runtime/obsidian/opening.mjs +243 -0
  310. package/src/runtime/obsidian/pending-edits.mjs +141 -0
  311. package/src/runtime/obsidian/pipeline.mjs +122 -0
  312. package/src/runtime/obsidian/private-lock.mjs +156 -0
  313. package/src/runtime/obsidian/process-identity.mjs +58 -0
  314. package/src/runtime/obsidian/service-client.mjs +66 -0
  315. package/src/runtime/obsidian/service-main.mjs +89 -0
  316. package/src/runtime/obsidian/service-record.mjs +169 -0
  317. package/src/runtime/obsidian/service-server.mjs +121 -0
  318. package/src/runtime/obsidian/service.mjs +216 -0
  319. package/src/runtime/obsidian/startup-adapters.mjs +87 -0
  320. package/src/runtime/obsidian/state-store.mjs +180 -0
  321. package/src/runtime/obsidian/sync-notice.mjs +33 -0
  322. package/src/runtime/obsidian/tick-loop.mjs +84 -0
  323. package/src/runtime/obsidian/watchers.mjs +36 -0
  324. package/src/runtime/supervisor.mjs +16 -1
  325. package/src/server/local-sidecar.mjs +44 -0
  326. package/src/server/server.mjs +1 -0
  327. package/src/skills/steward.mjs +780 -0
  328. package/src/ui/presentation/browser.mjs +278 -0
  329. package/src/ui/presentation/contract.mjs +116 -0
  330. package/src/ui/presentation/index.mjs +7 -0
  331. package/src/ui/presentation/native.mjs +153 -0
  332. package/src/ui/presentation/proof.mjs +57 -0
  333. package/src/ui/presentation/schema-check.mjs +30 -0
  334. package/src/ui/presentation/schema.generated.mjs +1371 -0
  335. package/src/ui/presentation/state.mjs +43 -0
  336. package/src/ui/presentation/styles.mjs +67 -0
  337. package/src/ui/presentation/tokens.mjs +74 -0
  338. package/src/ui/presentation/web.mjs +85 -0
  339. package/src/ui/review-page.mjs +32 -0
  340. package/src/upgrade/explanation.mjs +33 -0
  341. package/src/upgrade/provenance.mjs +338 -0
  342. package/src/upgrade/transaction-files.mjs +103 -0
  343. package/src/upgrade/transaction.mjs +475 -0
  344. package/src/upgrade/upgrade.mjs +63 -28
  345. package/src/vault/hosts.mjs +21 -0
  346. package/src/vault/identity.mjs +19 -0
  347. package/src/vault/index.mjs +7 -0
  348. package/src/vault/interface.mjs +11 -0
  349. package/src/vault/metadata.mjs +31 -0
  350. package/src/vault/privacy.mjs +148 -0
  351. package/src/vault/probe.mjs +89 -0
  352. package/src/vault/service.mjs +131 -0
  353. package/src/vault/source.mjs +45 -0
  354. package/src/vault/storage.mjs +23 -0
  355. package/templates/distribution-workspace/.claude/launch.json +6 -2
  356. package/templates/distribution-workspace/gitignore +1 -0
  357. package/templates/distribution-workspace/project/README.md +2 -2
  358. package/templates/external-project-workspace/README.md +45 -0
  359. package/templates/external-project-workspace/answers.example.json +4 -0
  360. package/templates/external-project-workspace/atelier.project.json +40 -0
  361. package/templates/external-project-workspace/boundary-policy.v1.json +60 -0
  362. package/templates/external-project-workspace/gitignore +8 -0
  363. package/templates/external-project-workspace/pack-lifecycle.json +14 -0
  364. package/templates/external-project-workspace/packs/protocols/contract-gate.v1.json +109 -0
  365. package/templates/external-project-workspace/packs/sample-pack.v1.json +48 -0
  366. package/templates/external-project-workspace/repo-access.v1.json +9 -0
  367. package/templates/external-project-workspace/source/README.md +11 -0
  368. package/templates/launch.json +6 -2
  369. package/templates/private-domain-workspace/.claude/launch.json +6 -2
  370. package/templates/private-domain-workspace/domain/README.md +2 -2
  371. package/templates/private-domain-workspace/gitignore +1 -0
  372. package/templates/shared-project-workspace/.claude/launch.json +6 -2
  373. package/templates/shared-project-workspace/gitignore +1 -0
  374. package/templates/shared-project-workspace/project/README.md +2 -2
@@ -0,0 +1,398 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mnstry.ai/schemas/atelier/atelier-upgrade-plan.v2.schema.json",
4
+ "$comment": "contract revision 2.0.0",
5
+ "title": "mnstry.atelier-upgrade-plan@v2",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema",
10
+ "digest",
11
+ "operation",
12
+ "workspace",
13
+ "repositoryId",
14
+ "configPath",
15
+ "baseHead",
16
+ "baseTree",
17
+ "branch",
18
+ "createdAt",
19
+ "expiresAt",
20
+ "policy",
21
+ "policyDigest",
22
+ "executorDigest",
23
+ "gitDigest",
24
+ "gitConfigDigest",
25
+ "hooksDigest",
26
+ "hooksPath",
27
+ "readSet",
28
+ "migration",
29
+ "writes",
30
+ "releaseEvidence",
31
+ "dependencyInstallation",
32
+ "mode",
33
+ "recoveryCoverage",
34
+ "message",
35
+ "gitAuxDigest"
36
+ ],
37
+ "properties": {
38
+ "schema": {
39
+ "const": "mnstry.atelier-upgrade-plan@v2"
40
+ },
41
+ "digest": {
42
+ "type": "string",
43
+ "pattern": "^sha256:[a-f0-9]{64}$"
44
+ },
45
+ "operation": {
46
+ "const": "prepare-local-candidate"
47
+ },
48
+ "workspace": {
49
+ "type": "string",
50
+ "minLength": 1
51
+ },
52
+ "repositoryId": {
53
+ "type": "string",
54
+ "pattern": "^sha256:[a-f0-9]{64}$"
55
+ },
56
+ "configPath": {
57
+ "type": "string",
58
+ "minLength": 1
59
+ },
60
+ "baseHead": {
61
+ "type": "string",
62
+ "pattern": "^[a-f0-9]{40,64}$"
63
+ },
64
+ "baseTree": {
65
+ "type": "string",
66
+ "pattern": "^[a-f0-9]{40,64}$"
67
+ },
68
+ "branch": {
69
+ "type": "string",
70
+ "minLength": 1
71
+ },
72
+ "createdAt": {
73
+ "type": "string",
74
+ "format": "date-time"
75
+ },
76
+ "expiresAt": {
77
+ "type": "string",
78
+ "format": "date-time"
79
+ },
80
+ "policy": {
81
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
82
+ "$id": "https://mnstry.ai/schemas/atelier/atelier-adoption-policy.v1.schema.json",
83
+ "$comment": "contract revision 1.0.0",
84
+ "title": "mnstry.atelier-adoption-policy@v1",
85
+ "type": "object",
86
+ "additionalProperties": false,
87
+ "required": [
88
+ "schema",
89
+ "enabled",
90
+ "mode",
91
+ "maxAgeSeconds",
92
+ "recoveryCoverage",
93
+ "allowedEffects"
94
+ ],
95
+ "properties": {
96
+ "schema": {
97
+ "const": "mnstry.atelier-adoption-policy@v1"
98
+ },
99
+ "enabled": {
100
+ "type": "boolean"
101
+ },
102
+ "mode": {
103
+ "const": "manual-exact-plan"
104
+ },
105
+ "maxAgeSeconds": {
106
+ "type": "integer",
107
+ "minimum": 1,
108
+ "maximum": 86400
109
+ },
110
+ "recoveryCoverage": {
111
+ "const": "local-only"
112
+ },
113
+ "allowedEffects": {
114
+ "const": [
115
+ "lock-and-projections",
116
+ "git-commit"
117
+ ]
118
+ },
119
+ "ext": {
120
+ "type": "object",
121
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
122
+ },
123
+ "contractVersion": {
124
+ "type": "string",
125
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$"
126
+ }
127
+ }
128
+ },
129
+ "policyDigest": {
130
+ "type": "string",
131
+ "pattern": "^sha256:[a-f0-9]{64}$"
132
+ },
133
+ "executorDigest": {
134
+ "type": "string",
135
+ "pattern": "^sha256:[a-f0-9]{64}$"
136
+ },
137
+ "gitDigest": {
138
+ "type": "string",
139
+ "pattern": "^sha256:[a-f0-9]{64}$"
140
+ },
141
+ "gitConfigDigest": {
142
+ "type": "string",
143
+ "pattern": "^sha256:[a-f0-9]{64}$"
144
+ },
145
+ "hooksDigest": {
146
+ "type": "string",
147
+ "pattern": "^sha256:[a-f0-9]{64}$"
148
+ },
149
+ "hooksPath": {
150
+ "type": "string",
151
+ "minLength": 1
152
+ },
153
+ "readSet": {
154
+ "type": "array",
155
+ "items": {
156
+ "type": "object",
157
+ "additionalProperties": false,
158
+ "required": [
159
+ "path",
160
+ "state"
161
+ ],
162
+ "properties": {
163
+ "path": {
164
+ "type": "string",
165
+ "minLength": 1
166
+ },
167
+ "state": {
168
+ "anyOf": [
169
+ {
170
+ "type": "null"
171
+ },
172
+ {
173
+ "type": "object",
174
+ "additionalProperties": false,
175
+ "required": [
176
+ "digest",
177
+ "mode"
178
+ ],
179
+ "properties": {
180
+ "digest": {
181
+ "type": "string",
182
+ "pattern": "^sha256:[a-f0-9]{64}$"
183
+ },
184
+ "mode": {
185
+ "enum": [
186
+ "100644",
187
+ "100755"
188
+ ]
189
+ },
190
+ "ext": {
191
+ "type": "object",
192
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
193
+ }
194
+ }
195
+ }
196
+ ]
197
+ },
198
+ "ext": {
199
+ "type": "object",
200
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
201
+ }
202
+ }
203
+ }
204
+ },
205
+ "migration": {
206
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
207
+ "$id": "https://mnstry.ai/schemas/atelier/atelier-migration.v2.schema.json",
208
+ "$comment": "contract revision 2.0.0",
209
+ "title": "mnstry.atelier-migration@v2",
210
+ "type": "object",
211
+ "additionalProperties": false,
212
+ "required": [
213
+ "schema",
214
+ "id",
215
+ "executorDigest",
216
+ "readScope",
217
+ "allowedWrites",
218
+ "sideEffects",
219
+ "postChecks"
220
+ ],
221
+ "properties": {
222
+ "schema": {
223
+ "const": "mnstry.atelier-migration@v2"
224
+ },
225
+ "id": {
226
+ "const": "local-lock-projections@1"
227
+ },
228
+ "executorDigest": {
229
+ "type": "string",
230
+ "pattern": "^sha256:[a-f0-9]{64}$"
231
+ },
232
+ "readScope": {
233
+ "const": "whole-enrolled-repository"
234
+ },
235
+ "allowedWrites": {
236
+ "type": "array",
237
+ "items": {
238
+ "type": "string",
239
+ "minLength": 1
240
+ }
241
+ },
242
+ "sideEffects": {
243
+ "const": [
244
+ "git-index",
245
+ "git-commit"
246
+ ]
247
+ },
248
+ "postChecks": {
249
+ "const": [
250
+ "exact-inventory",
251
+ "lock-schema",
252
+ "exact-index",
253
+ "commit-parent-tree-message"
254
+ ]
255
+ },
256
+ "ext": {
257
+ "type": "object",
258
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
259
+ },
260
+ "contractVersion": {
261
+ "type": "string",
262
+ "pattern": "^2\\.[0-9]+\\.[0-9]+$"
263
+ }
264
+ }
265
+ },
266
+ "writes": {
267
+ "type": "array",
268
+ "items": {
269
+ "type": "object",
270
+ "additionalProperties": false,
271
+ "required": [
272
+ "path",
273
+ "owner",
274
+ "action",
275
+ "before",
276
+ "after",
277
+ "content"
278
+ ],
279
+ "properties": {
280
+ "path": {
281
+ "type": "string",
282
+ "minLength": 1
283
+ },
284
+ "owner": {
285
+ "enum": [
286
+ "lock",
287
+ "generated"
288
+ ]
289
+ },
290
+ "action": {
291
+ "enum": [
292
+ "create",
293
+ "update"
294
+ ]
295
+ },
296
+ "before": {
297
+ "anyOf": [
298
+ {
299
+ "type": "null"
300
+ },
301
+ {
302
+ "type": "object",
303
+ "additionalProperties": false,
304
+ "required": [
305
+ "digest",
306
+ "mode"
307
+ ],
308
+ "properties": {
309
+ "digest": {
310
+ "type": "string",
311
+ "pattern": "^sha256:[a-f0-9]{64}$"
312
+ },
313
+ "mode": {
314
+ "enum": [
315
+ "100644",
316
+ "100755"
317
+ ]
318
+ },
319
+ "ext": {
320
+ "type": "object",
321
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
322
+ }
323
+ }
324
+ }
325
+ ]
326
+ },
327
+ "after": {
328
+ "anyOf": [
329
+ {
330
+ "type": "null"
331
+ },
332
+ {
333
+ "type": "object",
334
+ "additionalProperties": false,
335
+ "required": [
336
+ "digest",
337
+ "mode"
338
+ ],
339
+ "properties": {
340
+ "digest": {
341
+ "type": "string",
342
+ "pattern": "^sha256:[a-f0-9]{64}$"
343
+ },
344
+ "mode": {
345
+ "enum": [
346
+ "100644",
347
+ "100755"
348
+ ]
349
+ },
350
+ "ext": {
351
+ "type": "object",
352
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
353
+ }
354
+ }
355
+ }
356
+ ]
357
+ },
358
+ "content": {
359
+ "type": "string",
360
+ "maxLength": 16777216
361
+ },
362
+ "ext": {
363
+ "type": "object",
364
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
365
+ }
366
+ }
367
+ }
368
+ },
369
+ "releaseEvidence": {
370
+ "type": "null"
371
+ },
372
+ "dependencyInstallation": {
373
+ "const": "excluded"
374
+ },
375
+ "mode": {
376
+ "const": "manual-exact-plan"
377
+ },
378
+ "recoveryCoverage": {
379
+ "const": "local-only"
380
+ },
381
+ "message": {
382
+ "type": "string",
383
+ "minLength": 1
384
+ },
385
+ "ext": {
386
+ "type": "object",
387
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
388
+ },
389
+ "contractVersion": {
390
+ "type": "string",
391
+ "pattern": "^2\\.[0-9]+\\.[0-9]+$"
392
+ },
393
+ "gitAuxDigest": {
394
+ "type": "string",
395
+ "pattern": "^sha256:[a-f0-9]{64}$"
396
+ }
397
+ }
398
+ }
@@ -0,0 +1,99 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mnstry.ai/schemas/atelier/atelier-upgrade-receipt.v1.schema.json",
4
+ "$comment": "contract revision 1.0.0",
5
+ "title": "mnstry.atelier-upgrade-receipt@v1",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema",
10
+ "kind",
11
+ "operationId",
12
+ "planDigest",
13
+ "sequence",
14
+ "previous",
15
+ "time",
16
+ "phase",
17
+ "step",
18
+ "expected",
19
+ "observed",
20
+ "confirmation"
21
+ ],
22
+ "properties": {
23
+ "schema": {
24
+ "const": "mnstry.atelier-upgrade-receipt@v1"
25
+ },
26
+ "kind": {
27
+ "const": "private-event"
28
+ },
29
+ "operationId": {
30
+ "type": "string",
31
+ "pattern": "^[a-f0-9]{64}$"
32
+ },
33
+ "planDigest": {
34
+ "type": "string",
35
+ "pattern": "^sha256:[a-f0-9]{64}$"
36
+ },
37
+ "sequence": {
38
+ "type": "integer",
39
+ "minimum": 0
40
+ },
41
+ "previous": {
42
+ "anyOf": [
43
+ {
44
+ "type": "string",
45
+ "pattern": "^sha256:[a-f0-9]{64}$"
46
+ },
47
+ {
48
+ "type": "null"
49
+ }
50
+ ]
51
+ },
52
+ "time": {
53
+ "type": "string",
54
+ "format": "date-time"
55
+ },
56
+ "phase": {
57
+ "enum": [
58
+ "accepted",
59
+ "write-intent",
60
+ "write-complete",
61
+ "stage-intent",
62
+ "commit-intent",
63
+ "completed",
64
+ "commit-refused",
65
+ "recovery-required"
66
+ ]
67
+ },
68
+ "step": {
69
+ "type": [
70
+ "string",
71
+ "null"
72
+ ]
73
+ },
74
+ "expected": {
75
+ "type": [
76
+ "string",
77
+ "null"
78
+ ]
79
+ },
80
+ "observed": {
81
+ "type": [
82
+ "string",
83
+ "null"
84
+ ]
85
+ },
86
+ "confirmation": {
87
+ "type": "string",
88
+ "pattern": "^sha256:[a-f0-9]{64}$"
89
+ },
90
+ "ext": {
91
+ "type": "object",
92
+ "description": "Namespaced annotations only. Unknown members MUST be ignored and convey no authority."
93
+ },
94
+ "contractVersion": {
95
+ "type": "string",
96
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$"
97
+ }
98
+ }
99
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mnstry.ai/schemas/atelier/atelier-vault-publication.v1.schema.json",
4
+ "title": "Private vault publication request",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema",
9
+ "expectedRevision",
10
+ "files"
11
+ ],
12
+ "properties": {
13
+ "schema": {
14
+ "const": "atelier-vault-publication/v1"
15
+ },
16
+ "expectedRevision": {
17
+ "type": "integer",
18
+ "minimum": 0,
19
+ "maximum": 9007199254740990
20
+ },
21
+ "files": {
22
+ "type": "array",
23
+ "minItems": 1,
24
+ "maxItems": 100,
25
+ "items": {
26
+ "type": "object",
27
+ "additionalProperties": false,
28
+ "required": [
29
+ "path",
30
+ "base64"
31
+ ],
32
+ "properties": {
33
+ "path": {
34
+ "type": "string",
35
+ "maxLength": 512,
36
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*(/[A-Za-z0-9][A-Za-z0-9._-]*)*$"
37
+ },
38
+ "base64": {
39
+ "type": "string",
40
+ "maxLength": 4194304,
41
+ "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"
42
+ },
43
+ "ext": {
44
+ "type": "object"
45
+ }
46
+ }
47
+ }
48
+ },
49
+ "contractVersion": {
50
+ "type": "string",
51
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$"
52
+ },
53
+ "ext": {
54
+ "type": "object"
55
+ }
56
+ },
57
+ "$comment": "contract revision 1.0.0; explicit host-bound private artifact publication."
58
+ }
@@ -10,11 +10,19 @@ commit and packed-tarball digest.
10
10
  | Boundary rules cannot silently switch themselves off | `src/boundary/policy.mjs`, `src/boundary/content-rules.mjs`, and generated Git hooks | `boundary:test`; boundary case in `assurance:mutation-smoke` | Repository access remains the source read boundary; an audience label is not encryption |
11
11
  | A clean boundary verdict uses complete evidence | Typed Git reads with diff and binary budgets; incomplete reads become blocking diagnostics; Sync requires the enrolled root to be scanned, uses its digest-bound Git for actor and staged evidence, and disables network actor fallback | `test/boundary-content-rules.test.mjs`; Sync boundary-scope, pinned-Git, and no-network actor refusal cases | Budgets intentionally refuse evidence too large to inspect rather than claiming it is clean |
12
12
  | Graph classification has one meaning | `src/graph/knowledge-graph.mjs` is canonical; `src/graph/graph.mjs` adapts its result | `graph:test`; graph case in `assurance:mutation-smoke` | Unclassified Markdown is retained as private diagnostic material, not admitted as governed content |
13
- | The package has no undisclosed runtime egress path | Canonical forbidden-egress scanner plus exact packed-file inventory in `release:audit`; Atelier Sync confines network Git to bounded fetch and an exact-plan, non-force push | egress tests, marker-inventory test, runtime fetch/push refusal tests, and egress case in `assurance:mutation-smoke` | Data-only files are not interpreted; reviewed `gh` actor resolution and explicitly enrolled Git fetch/push are documented subprocess exceptions |
13
+ | The package has no undisclosed runtime egress path | Canonical forbidden-egress scanner plus exact packed-file inventory in `release:audit`; Atelier Sync confines network Git to bounded fetch and an exact-plan, non-force push | egress tests, marker-inventory test, runtime fetch/push refusal tests, and egress case in `assurance:mutation-smoke` | Data-only files are not interpreted; reviewed `gh` actor resolution and explicitly enrolled Git fetch/push are documented subprocess exceptions. Optional host-bound vault SDK and transport I/O is outside the lexical scanner model; trusted provider configuration, denial probes and hosted qualification are separate controls. |
14
14
  | User-confirmed repository writes match what was reviewed | Content-bound, expiring plan identifiers; fresh complete observations; exact staged and written-tree blob/mode manifests; post-hook tree, single-parent, and message verification with compare-and-swap rollback; refusal of prior unpublished commits; and an exact verified-object push after HEAD/target revalidation with tag following and recursive submodule publication disabled | `sync:test` plan, expiry, hook/index, late-HEAD, ahead-branch, remote-ref, remote-drift, and evidence-failure cases | Ordinary Git hooks may run, but a hook cannot substitute a different commit object for publication |
15
15
  | Resident Sync state cannot escape or grow without bound | Contained private directories, no-follow/identity-checked leaves, a 4,096-entry observation ceiling, bounded state projection, nonce-bound locks with aged abandoned-claim recovery, lock-directory identity validation and an ambiguous live-PID maximum age, consumed plans under age/file/byte ceilings, and corruption-recovering hash-chained traces with per-event/resident ceilings | `sync:test` observation/state ceilings, redirected-state/lock, plan lifecycle, concurrent enrollment/recovery, corruption, and trace ceilings | Machine-local state is diagnostic convenience; Git and readable repository files remain authoritative |
16
16
  | Local review serves only generated publication output | Loopback-only bind, required `atelier.manifest.json`, realpath containment, enrolled safe types, POSIX no-follow plus cross-platform leaf type/identity validation for local state, and host/fetch-site/origin/method/nonce checks | `server:security:test`; sidecar case in `assurance:mutation-smoke` | The sidecar is a local review tool, not user authentication or runtime authorization |
17
17
  | Collaboration cannot become a hidden apply path | Proposal authority is capability-derived; records are typed; POSIX ledger and snapshot leaves are no-follow, while every platform rejects redirected leaves and validates opened file identity when available; ledger reads are bounded, one-pass for lists, and corrupt tails fail closed | `collaboration:test` and ledger ceiling/performance tests | Collaboration remains copy-only proposal metadata; snapshots are rebuildable projections and Git review owns source changes |
18
+ | The Obsidian maintenance service is reachable from this machine only, and only by its owner | Bind and client are restricted to the literal `127.0.0.1` or `::1`; `Host` must be the exact bound authority; cross-site `Origin` and `Sec-Fetch-Site` are refused; four fixed operations with exact paths and methods; status, tick and stop need a per-runtime random bearer kept only in the mode-0600 record; payloads are bounded and name their runtime; health carries no path or title | `test/obsidian-maintenance.test.mjs` listener, disclosure and unauthorised-request cases, each with a deliberately broken listener that must fail | A local process running as the same user can read the record; the bearer is ownership proof between local processes, not user authentication |
19
+ | A maintenance service is stopped or reported as running only when it is proven to be this workspace's own | Record and health must agree on service name, workspace, runtime identifier, PID, executable digest and loopback address; anything else on the port is `occupied`; a reused PID is never signalled; a malformed or foreign record refuses; `start` stops only the child it created, by handle | Unowned and silent listener, wrong-identity, PID-reuse, stale-record, malformed-record, idempotent and concurrent start, and launcher-survival cases, with mutation controls | Status probes have a deadline: a service busy in a long synchronous tick can be reported `occupied` until it answers |
20
+ | Maintenance never sweeps recovery or staging, and one workspace has one ticking engine | The service deletes only its generated record; the engine and the publisher own every other write; a hard kill is settled by the publisher's journaled restart recovery; each tick holds a private per-workspace lock taken from a holder only with proof of abandonment | Directory-listing oracles across start, ticks, stop, hard kill and stale record; hard kill between exchange and manifest commit; lock exclusion and takeover cases; each with a mutation control | A live lock holder that recorded no health address needs a person; a tick that outlasts the shutdown grace period ends with the process and is settled on the next start |
21
+ | Source application policy is re-read before every automatic apply | The engine authorizes from disk immediately before each dispatch; manual mode never reaches the apply operation; the service keeps this on every tick; the apply operation reads the installed policy again at its decision and immediately before the write, recomputes its digest and evaluates its selector over the current canonical graph; `policy install` verifies that digest and names the expected one; whether this machine may see the object is asked before anything else, so an absent and a withheld object get one answer | Revocation, manual-mode and apply-unavailable cases in `test/obsidian-maintenance.test.mjs`; policy, refusal-table and late-revocation cases in `test/obsidian-edits.test.mjs`, each with a deliberately broken rule that must fail | A policy is private configuration of one machine; whoever can write that private state can install one |
22
+ | Applying an edit to a source file cannot lose another program's bytes | One operation for a person and for a policy: exact identity, path and digest checks at commit; the write is an atomic exchange, never a check followed by a rename; displaced bytes that are not the base are exchanged back and retained; the old source stays as a backup that is looked at again for late writers; write-ahead record and intent before the exchange; restart recovery decides from digests only, and so does an exchange that reports a failure; generated regions never reach a source: the tail is intact, or removed with the end of the authored text proven, and anything else refuses; every git directory is refused, nested, respelled or relocated; the hold on an edited note lifts only on a read of the note at that moment; no git command that writes | `test/obsidian-edits.test.mjs`: end to end through the real engine, a refusal table with a whole-project byte and `git status` oracle, a real second process writing in three styles and four timings with both outcomes asserted, a crash at every durable step, a disclosure walk, a generated tail cut at every byte offset from both sides and a fuzz over the whole note; every oracle has a mutation control | macOS arm64 on APFS only; refuses where no atomic exchange exists; the source becomes a new file (permission bits kept, hard links refused); a late writer's bytes are retained and surfaced, never merged; a hard link made after the path check is not detected; a fragment of generated text shorter than eight bytes left inside an edited body cannot be told from typing |
23
+ | A structural edit made in a vault becomes one copy-only proposal and never a source change | The proposal adapter routes by whole identity to the existing store of the enrolled repository or refuses typed and writes nothing; it records the operation in private immutable state first, looks in the persisted store for its operation identity before creating, under a private per-repository lock taken over only with proof; it preflights the ledger limits, defers `ledger-full`, refuses `proposal-too-large` and `ledger-corrupt`, bounds batches and retries, and never compacts; a proposal holds codes, offsets and digests and no note text; acceptance is shown and never acted on | `test/obsidian-proposals.test.mjs`: routing table with a whole-project byte and `git status` oracle, identity survival against the real store, a crash at every step, two real processes, generated ledgers at 256 KiB, 16 MiB and 10,000 events and an invalid line, a no-busy-loop count of store reads, a disclosure walk; engine cases in `test/obsidian-maintenance.test.mjs`; every oracle has a mutation control | In manual mode an operation exists only after apply has looked at the edit; a refused or exhausted operation waits for a person; the store directory lives in the repository and must be git-ignored; two workspaces that enrol one repository create one proposal each |
24
+ | Opening a view reports `current` only for the exact, verified, present generation and a qualified app | `open` needs a tick of the proven service after the request, a persisted `current`, an independent read-back of the trusted pointer and every note, and an app at or above the minimum version that answers for that vault; every other outcome is typed, distinct and exits non-zero; the app and the operating system are reached only through injected seams, and the production ones only behind `--adapter=obsidian-cli` | `test/obsidian-open.test.mjs`: outcome table, read-back, app-floor, busy and read-only cases, each with a deliberately broken rule that must fail; a spawn guard and a production-seam import check | The production probe and launcher are not exercised against a real app here; `indexing` relies on an undocumented readiness field until acceptance qualifies it |
25
+ | Operating-system startup is never installed implicitly | `buildStartupAdapter` is pure text generation; Windows refuses typed; the service refuses `--startup` without a consent that covers startup | Builder purity oracle (no filesystem, process or home-directory access; no machine path beyond its inputs) and startup-consent refusal | Generated units have not been qualified against real launchd or systemd hosts |
18
26
  | Expected operator failures are actionable without leaking internals | Typed project/JSON diagnostics and the CLI execution wrapper | `test/cli-brand.test.mjs` | Unexpected stacks require the operator to opt in with `ATELIER_DEBUG=1` |
19
27
  | Published APIs do not disappear silently | Tag-derived subpath and named-export baseline plus version/tag identity refusal | `public-api:compat`; `test/public-api-compat.test.mjs` | Additive API checks do not decide whether a new version number is appropriate |
20
28
  | The published artifact is the artifact tested | `release:candidate` packs once, binds SHA-256, sends that exact archive through allowlist/content audit, bare-consumer install, all-export import, and branded distribution smoke, then the trusted-publishing workflow retains and publishes that same tarball path | `release:audit`, `consumer:smoke`, `distribution:smoke`, `assurance:mutation-smoke`, `publish-workflow.test.mjs` | Passing gates does not publish, deploy, or constitute an external reviewer’s approval |
@@ -42,13 +42,14 @@ runtime object.
42
42
  - A commit plan cannot absorb pre-existing staged work. It stages only literal,
43
43
  explicitly reviewed paths.
44
44
  - Configured Atelier boundary policy is checked against the staged change set
45
- before commit creation using the enrolled Git executable. When that policy
46
- declares private-domain ownership, actor verification is blocking even in
45
+ before commit creation using the enrolled Git executable. When the enrolled project
46
+ operates a private-domain repository with a declared owner, actor verification is blocking even in
47
47
  legacy-warning mode. The Sync path disables the boundary command's optional
48
48
  network `gh api user` fallback and fails closed when local actor evidence is
49
49
  insufficient. Commit history is provenance, not current-user identity, and
50
- is not accepted as actor evidence on this path. Policies without a declared private-domain owner do not invent
51
- an actor requirement. Ordinary Git hooks still run; the resulting commit tree,
50
+ is not accepted as actor evidence on this path. Shared-only checks skip derived actor lookup, including ambient platform
51
+ identities. Invalid explicit selectors are still refused. Ownership is scoped
52
+ to configured repository names; it does not authenticate repository identity. Ordinary Git hooks still run; the resulting commit tree,
52
53
  single parent, and message must equal the reviewed authority or the local
53
54
  commit is rolled back and publication is refused.
54
55
  - Push is present only when the reviewed plan requested it, the branch had no
@@ -2,20 +2,25 @@ This package makes three promises. None of them asks for your trust — each
2
2
  one names the command that proves it.
3
3
 
4
4
  **There is no silent egress; every network path is named.** There is no
5
- telemetry, update check, crash reporting, managed-runtime upload, or model
6
- provider path in the package. The exceptions are explicit: `boundary check`
7
- may invoke `gh api user` after no declared actor matches an explicit `--actor`,
8
- `MNSTRY_ATELIER_ACTOR`, `GITHUB_ACTOR`, or a configured Git email; repository
9
- identity checks may invoke `gh api repos/...` to resolve a canonical GitHub
10
- identity. Those authenticated requests use your own `gh` credentials. A
11
- recognized explicit actor prevents the boundary actor fallback; recorded
12
- repository identities let identity checks keep working when the provider is
13
- unavailable. Explicitly enrolled Atelier Sync may also run bounded Git fetches
5
+ telemetry, update check, crash reporting, or model provider path in the package.
6
+ The optional vault API adds explicit host-bound artifact uploads and reads; it
7
+ is never activated by local authoring commands. Its injected storage, database
8
+ and identity SDKs may use the network and require separate hosted qualification. The exceptions are explicit: `boundary check` and
9
+ `upgrade` (including `--dry-run` and `--apply`) may invoke `gh api user` only when
10
+ an operated private-domain repository needs owner attribution, no explicit selector or `GITHUB_ACTOR` was supplied, and no
11
+ configured Git email maps to an actor. Shared-only boundary checks skip derived
12
+ identity lookup. Invalid explicit selectors are refused without fallback;
13
+ platform logins must uniquely match declared login mappings. Repository identity
14
+ checks may invoke `gh api repos/...` to resolve a canonical GitHub identity.
15
+ Those authenticated requests use your own `gh` credentials. Recorded repository
16
+ identities let identity checks keep working when the provider is unavailable.
17
+ See `docs/install.md` for the full attribution precedence and mode semantics.
18
+ Explicitly enrolled Atelier Sync may also run bounded Git fetches
14
19
  for observation/reconciliation and one non-force push only when the exact
15
20
  reviewed commit plan requested and confirmed it, no earlier local commit is
16
21
  waiting to be published, and HEAD still names the verified commit object. Sync
17
22
  never uses the network actor fallback, follows tags, or recursively publishes
18
- submodule refs. The package's HTTP client
23
+ submodule refs. The local authoring HTTP client
19
24
  refuses non-loopback URLs, the served pages authorize no external origin, and
20
25
  release audit scans every executable or markup file in the exact `npm pack`
21
26
  inventory for egress primitives. The standalone gate also scans executable and
@@ -1,13 +1,16 @@
1
1
  - It does not write to a MNSTRY runtime database.
2
2
  - It does not import, provision, publish, or send project content to a MNSTRY
3
3
  managed runtime.
4
- - Conformance remains offline. Network access is limited to the documented
4
+ - Conformance remains offline. Local CLI network access is limited to the documented
5
5
  `gh` actor-resolution fallback and explicitly enrolled Atelier Sync Git
6
6
  operations: bounded fetch for observation/reconciliation, and non-force push
7
7
  only when the exact reviewed commit plan requested and confirmed it, no
8
8
  earlier local commit remains unpublished, and HEAD still names the verified
9
9
  commit object; Sync does not use network actor fallback, follow tags, or
10
10
  recursively publish submodule refs.
11
+ - Optional vault adapters use explicitly injected host SDKs and transports. The
12
+ host owns their network access, authentication and infrastructure; importing
13
+ the kit does not create a service or make a network request.
11
14
  - It does not execute model-assisted analysis or any model provider.
12
15
  - It does not include client project content.
13
16