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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/CHANGELOG.md +413 -0
  2. package/README.md +402 -205
  3. package/SECURITY.md +6 -1
  4. package/contracts/atelier-adoption-policy.v1.schema.json +49 -0
  5. package/contracts/atelier-coauthor.v1.schema.json +163 -0
  6. package/contracts/atelier-decision-request.v1.schema.json +476 -0
  7. package/contracts/atelier-decision-result.v1.schema.json +500 -0
  8. package/contracts/atelier-guide.v1.schema.json +227 -0
  9. package/contracts/atelier-intake.v1.schema.json +151 -0
  10. package/contracts/atelier-migration.v2.schema.json +61 -0
  11. package/contracts/atelier-obsidian-acceptance-receipt.v1.schema.json +211 -0
  12. package/contracts/atelier-obsidian-apply-policy.v1.schema.json +298 -0
  13. package/contracts/atelier-obsidian-corpus-profile.v1.schema.json +98 -0
  14. package/contracts/atelier-obsidian-edit-operation.v1.schema.json +138 -0
  15. package/contracts/atelier-obsidian-ext-settings.v1.schema.json +287 -0
  16. package/contracts/atelier-obsidian-generation-manifest.v1.schema.json +353 -0
  17. package/contracts/atelier-obsidian-proposal-receipt.v1.schema.json +110 -0
  18. package/contracts/atelier-obsidian-publication-journal.v1.schema.json +167 -0
  19. package/contracts/atelier-obsidian-scope.v1.schema.json +264 -0
  20. package/contracts/atelier-obsidian-service-state.v1.schema.json +149 -0
  21. package/contracts/atelier-obsidian-source-snapshot.v1.schema.json +179 -0
  22. package/contracts/atelier-pane-presentation.v1.schema.json +76 -0
  23. package/contracts/atelier-presentation.v1.schema.json +1293 -0
  24. package/contracts/atelier-repository-observation.v1.schema.json +163 -0
  25. package/contracts/atelier-review.v1.schema.json +1601 -0
  26. package/contracts/atelier-skill-steward.v1.schema.json +692 -0
  27. package/contracts/atelier-upgrade-plan.v2.schema.json +398 -0
  28. package/contracts/atelier-upgrade-receipt.v1.schema.json +99 -0
  29. package/contracts/atelier-vault-publication.v1.schema.json +58 -0
  30. package/contracts/public-api-baseline.json +57 -0
  31. package/docs/assurance-controls.md +49 -0
  32. package/docs/atelier-runtime.md +28 -2
  33. package/docs/atelier-sync.md +172 -0
  34. package/docs/blocks/audience-visibility.md +9 -0
  35. package/docs/blocks/claims.md +61 -0
  36. package/docs/blocks/conformance-admission.md +15 -0
  37. package/docs/blocks/will-not-do.md +18 -0
  38. package/docs/coauthor-session.md +57 -0
  39. package/docs/connected-composition.md +75 -0
  40. package/docs/continuity.md +3 -4
  41. package/docs/decisions.md +167 -0
  42. package/docs/design.md +167 -0
  43. package/docs/exact-upgrades.md +159 -0
  44. package/docs/extension-pack-lifecycle.md +33 -0
  45. package/docs/guided-upgrades.md +99 -0
  46. package/docs/install.md +99 -16
  47. package/docs/intake-and-guides.md +65 -0
  48. package/docs/integration-and-review-plan.md +409 -0
  49. package/docs/integration-contract-decisions.md +22 -0
  50. package/docs/knowledge-graph.md +8 -4
  51. package/docs/local-review.md +84 -0
  52. package/docs/local-services.md +328 -0
  53. package/docs/local-state.md +107 -0
  54. package/docs/obsidian-contract.md +698 -0
  55. package/docs/obsidian.md +484 -0
  56. package/docs/portable-presentation.md +328 -0
  57. package/docs/presentation-consumer-boundaries.md +75 -0
  58. package/docs/presentation-review-disposition.md +47 -0
  59. package/docs/project-command-inventory.md +38 -0
  60. package/docs/project-options.md +53 -0
  61. package/docs/release-engineering.md +174 -12
  62. package/docs/repo-boundary-guard.md +12 -2
  63. package/docs/review-portability.md +55 -0
  64. package/docs/skill-steward.md +156 -0
  65. package/docs/upgrade.md +155 -5
  66. package/docs/vault-service.md +292 -0
  67. package/fixtures/atelier-coauthor/invalid/authority.v1.json +5 -0
  68. package/fixtures/atelier-coauthor/valid/config.v1.json +12 -0
  69. package/fixtures/atelier-guide/invalid/authority.v1.json +11 -0
  70. package/fixtures/atelier-guide/valid/capability.v1.json +10 -0
  71. package/fixtures/atelier-guide/valid/consent.v1.json +11 -0
  72. package/fixtures/atelier-guide/valid/engagement.v1.json +7 -0
  73. package/fixtures/atelier-guide/valid/offer.v1.json +10 -0
  74. package/fixtures/atelier-intake/invalid/authority.v1.json +9 -0
  75. package/fixtures/atelier-intake/valid/attempt.v1.json +8 -0
  76. package/fixtures/atelier-intake/valid/completion.v1.json +9 -0
  77. package/fixtures/atelier-intake/valid/source.v1.json +7 -0
  78. package/fixtures/atelier-repository-observation/invalid/complete-with-blocker.v1.json +18 -0
  79. package/fixtures/atelier-repository-observation/valid/complete-local.v1.json +48 -0
  80. package/fixtures/atelier-review/invalid/authenticated-identity.v1.json +22 -0
  81. package/fixtures/atelier-review/valid/bound.v1.json +229 -0
  82. package/fixtures/atelier-review/valid/bundle.v1.json +267 -0
  83. package/fixtures/atelier-review/valid/contribution.v1.json +22 -0
  84. package/fixtures/atelier-review/valid/lifecycle.v1.json +14 -0
  85. package/fixtures/atelier-skill-steward/audit/invalid/source-mutation.v1.json +26 -0
  86. package/fixtures/atelier-skill-steward/audit/valid/clean.v1.json +26 -0
  87. package/fixtures/atelier-skill-steward/candidates/invalid/workflow-key.v1.json +37 -0
  88. package/fixtures/atelier-skill-steward/candidates/valid/create.v1.json +37 -0
  89. package/fixtures/atelier-skill-steward/lock/invalid/bad-digest.v1.json +18 -0
  90. package/fixtures/atelier-skill-steward/lock/valid/installed.v1.json +23 -0
  91. package/fixtures/atelier-skill-steward/plan/invalid/delete-action.v1.json +33 -0
  92. package/fixtures/atelier-skill-steward/plan/valid/add.v1.json +33 -0
  93. package/fixtures/atelier-upgrade-transaction/adoption-policy/invalid/example.json +12 -0
  94. package/fixtures/atelier-upgrade-transaction/adoption-policy/valid/example.json +11 -0
  95. package/fixtures/atelier-upgrade-transaction/migration/invalid/example.json +20 -0
  96. package/fixtures/atelier-upgrade-transaction/migration/valid/example.json +19 -0
  97. package/fixtures/atelier-upgrade-transaction/upgrade-plan/invalid/example.json +58 -0
  98. package/fixtures/atelier-upgrade-transaction/upgrade-plan/valid/example.json +57 -0
  99. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/invalid/example.json +15 -0
  100. package/fixtures/atelier-upgrade-transaction/upgrade-receipt/valid/example.json +14 -0
  101. package/fixtures/atelier-vault-publication/invalid/publication.json +5 -0
  102. package/fixtures/atelier-vault-publication/valid/publication.json +11 -0
  103. package/fixtures/decisions/request/invalid/unknown-authority.v1.json +61 -0
  104. package/fixtures/decisions/request/valid/triage.v1.json +60 -0
  105. package/fixtures/decisions/result/invalid/execution-authority.v1.json +50 -0
  106. package/fixtures/decisions/result/valid/abstained.v1.json +23 -0
  107. package/fixtures/decisions/result/valid/assessed.v1.json +50 -0
  108. package/fixtures/obsidian/acceptance/ap05-extra-notes.json +14 -0
  109. package/fixtures/obsidian/acceptance/receipts/G07.valid.v1.json +63 -0
  110. package/fixtures/obsidian/acceptance/receipts/G13.valid.v1.json +69 -0
  111. package/fixtures/obsidian/acceptance/receipts/G14.valid.v1.json +62 -0
  112. package/fixtures/obsidian/acceptance/receipts/G15.valid.v1.json +56 -0
  113. package/fixtures/obsidian/acceptance/receipts/G16.valid.v1.json +73 -0
  114. package/fixtures/obsidian/acceptance/receipts/G17.valid.v1.json +75 -0
  115. package/fixtures/obsidian/acceptance/receipts/G18.valid.v1.json +64 -0
  116. package/fixtures/obsidian/acceptance/service-sentinels.json +10 -0
  117. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/duplicate-evidence-name.v1.json +39 -0
  118. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/evidence-by-absolute-path.v1.json +34 -0
  119. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/missing-candidate-tree.v1.json +33 -0
  120. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/no-evidence.v1.json +28 -0
  121. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-outcome.v1.json +34 -0
  122. package/fixtures/obsidian/contracts/acceptance-receipt/invalid/unknown-top-level-field.v1.json +35 -0
  123. package/fixtures/obsidian/contracts/acceptance-receipt/valid/node-gate.v1.json +34 -0
  124. package/fixtures/obsidian/contracts/apply-policy/invalid/automatic-without-edit-class.v1.json +27 -0
  125. package/fixtures/obsidian/contracts/apply-policy/invalid/conflict-overwrite.v1.json +29 -0
  126. package/fixtures/obsidian/contracts/apply-policy/invalid/missing-policy-digest.v1.json +28 -0
  127. package/fixtures/obsidian/contracts/apply-policy/invalid/unbounded-batch.v1.json +29 -0
  128. package/fixtures/obsidian/contracts/apply-policy/invalid/unimplemented-edit-class.v1.json +30 -0
  129. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-mode.v1.json +29 -0
  130. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-selector-operator.v1.json +22 -0
  131. package/fixtures/obsidian/contracts/apply-policy/invalid/unknown-top-level-field.v1.json +30 -0
  132. package/fixtures/obsidian/contracts/apply-policy/valid/automatic-scoped.v1.json +29 -0
  133. package/fixtures/obsidian/contracts/apply-policy/valid/manual-default.v1.json +20 -0
  134. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-path-in-ext.v1.json +30 -0
  135. package/fixtures/obsidian/contracts/corpus-profile/invalid/absolute-repository-root.v1.json +27 -0
  136. package/fixtures/obsidian/contracts/corpus-profile/invalid/duplicate-repository-id.v1.json +27 -0
  137. package/fixtures/obsidian/contracts/corpus-profile/invalid/overlapping-managed-roots.v1.json +27 -0
  138. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-enrollment.v1.json +27 -0
  139. package/fixtures/obsidian/contracts/corpus-profile/invalid/unknown-top-level-field.v1.json +28 -0
  140. package/fixtures/obsidian/contracts/corpus-profile/valid/three-repositories.v1.json +27 -0
  141. package/fixtures/obsidian/contracts/edit-operation/invalid/absolute-recovery-ref.v1.json +21 -0
  142. package/fixtures/obsidian/contracts/edit-operation/invalid/inline-observed-bytes.v1.json +22 -0
  143. package/fixtures/obsidian/contracts/edit-operation/invalid/missing-base-digest.v1.json +20 -0
  144. package/fixtures/obsidian/contracts/edit-operation/invalid/short-idempotency-key.v1.json +21 -0
  145. package/fixtures/obsidian/contracts/edit-operation/invalid/unknown-kind.v1.json +21 -0
  146. package/fixtures/obsidian/contracts/edit-operation/valid/pending-body-replacement.v1.json +21 -0
  147. package/fixtures/obsidian/contracts/ext-settings/invalid/absolute-path-prefix.v1.json +28 -0
  148. package/fixtures/obsidian/contracts/ext-settings/invalid/apply-policy-in-portable-settings.v1.json +30 -0
  149. package/fixtures/obsidian/contracts/ext-settings/invalid/duplicate-scope-id.v1.json +27 -0
  150. package/fixtures/obsidian/contracts/ext-settings/invalid/machine-local-vault-path.v1.json +28 -0
  151. package/fixtures/obsidian/contracts/ext-settings/invalid/service-port-in-portable-settings.v1.json +28 -0
  152. package/fixtures/obsidian/contracts/ext-settings/invalid/unknown-default-scope.v1.json +27 -0
  153. package/fixtures/obsidian/contracts/ext-settings/valid/disabled.v1.json +5 -0
  154. package/fixtures/obsidian/contracts/ext-settings/valid/enabled-with-scopes.v1.json +27 -0
  155. package/fixtures/obsidian/contracts/generation-manifest/invalid/absolute-note-path.v1.json +114 -0
  156. package/fixtures/obsidian/contracts/generation-manifest/invalid/complete-with-unwritten-notes.v1.json +114 -0
  157. package/fixtures/obsidian/contracts/generation-manifest/invalid/derived-link-claimed-declared.v1.json +114 -0
  158. package/fixtures/obsidian/contracts/generation-manifest/invalid/duplicate-note-identity.v1.json +114 -0
  159. package/fixtures/obsidian/contracts/generation-manifest/invalid/in-scope-endpoint-missing.v1.json +114 -0
  160. package/fixtures/obsidian/contracts/generation-manifest/invalid/title-only-note-path.v1.json +114 -0
  161. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-note-field.v1.json +115 -0
  162. package/fixtures/obsidian/contracts/generation-manifest/invalid/unknown-relation-type.v1.json +114 -0
  163. package/fixtures/obsidian/contracts/generation-manifest/invalid/withheld-endpoint.v1.json +114 -0
  164. package/fixtures/obsidian/contracts/generation-manifest/valid/two-notes.v1.json +114 -0
  165. package/fixtures/obsidian/contracts/oracles/scope-cases.json +412 -0
  166. package/fixtures/obsidian/contracts/proposal-receipt/invalid/accepted-without-proposal-id.v1.json +12 -0
  167. package/fixtures/obsidian/contracts/proposal-receipt/invalid/missing-adapter-operation-id.v1.json +11 -0
  168. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-backpressure-outcome.v1.json +12 -0
  169. package/fixtures/obsidian/contracts/proposal-receipt/invalid/unknown-top-level-field.v1.json +13 -0
  170. package/fixtures/obsidian/contracts/proposal-receipt/valid/accepted-new.v1.json +12 -0
  171. package/fixtures/obsidian/contracts/proposal-receipt/valid/deferred.v1.json +12 -0
  172. package/fixtures/obsidian/contracts/publication-journal/invalid/absolute-recovery-ref.v1.json +47 -0
  173. package/fixtures/obsidian/contracts/publication-journal/invalid/duplicate-sequence.v1.json +47 -0
  174. package/fixtures/obsidian/contracts/publication-journal/invalid/empty-protocol-id.v1.json +47 -0
  175. package/fixtures/obsidian/contracts/publication-journal/invalid/missing-protocol-id.v1.json +46 -0
  176. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-entry-field.v1.json +48 -0
  177. package/fixtures/obsidian/contracts/publication-journal/invalid/unknown-state.v1.json +47 -0
  178. package/fixtures/obsidian/contracts/publication-journal/valid/committed.v1.json +47 -0
  179. package/fixtures/obsidian/contracts/publication-journal/valid/updating-after-restart.v1.json +22 -0
  180. package/fixtures/obsidian/contracts/scope/invalid/absolute-path-prefix.v1.json +15 -0
  181. package/fixtures/obsidian/contracts/scope/invalid/duplicate-ids.v1.json +18 -0
  182. package/fixtures/obsidian/contracts/scope/invalid/expansion-without-node-budget.v1.json +40 -0
  183. package/fixtures/obsidian/contracts/scope/invalid/full-mode-with-subset.v1.json +8 -0
  184. package/fixtures/obsidian/contracts/scope/invalid/unknown-mode.v1.json +41 -0
  185. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-key.v1.json +15 -0
  186. package/fixtures/obsidian/contracts/scope/invalid/unknown-selector-operator.v1.json +14 -0
  187. package/fixtures/obsidian/contracts/scope/invalid/unknown-top-level-field.v1.json +42 -0
  188. package/fixtures/obsidian/contracts/scope/valid/explicit-empty.v1.json +8 -0
  189. package/fixtures/obsidian/contracts/scope/valid/focus.v1.json +11 -0
  190. package/fixtures/obsidian/contracts/scope/valid/full.v1.json +8 -0
  191. package/fixtures/obsidian/contracts/scope/valid/scoped-set-expression.v1.json +41 -0
  192. package/fixtures/obsidian/contracts/service-state/invalid/hostname-instead-of-literal-loopback.v1.json +23 -0
  193. package/fixtures/obsidian/contracts/service-state/invalid/missing-consent.v1.json +18 -0
  194. package/fixtures/obsidian/contracts/service-state/invalid/privileged-port.v1.json +23 -0
  195. package/fixtures/obsidian/contracts/service-state/invalid/unknown-top-level-field.v1.json +24 -0
  196. package/fixtures/obsidian/contracts/service-state/invalid/wildcard-bind.v1.json +23 -0
  197. package/fixtures/obsidian/contracts/service-state/valid/healthy.v1.json +23 -0
  198. package/fixtures/obsidian/contracts/source-snapshot/invalid/absolute-file-path.v1.json +48 -0
  199. package/fixtures/obsidian/contracts/source-snapshot/invalid/duplicate-repository-id.v1.json +48 -0
  200. package/fixtures/obsidian/contracts/source-snapshot/invalid/mixed-read.v1.json +48 -0
  201. package/fixtures/obsidian/contracts/source-snapshot/invalid/parent-traversal-path.v1.json +48 -0
  202. package/fixtures/obsidian/contracts/source-snapshot/invalid/unknown-file-field.v1.json +49 -0
  203. package/fixtures/obsidian/contracts/source-snapshot/valid/two-repositories.v1.json +48 -0
  204. package/fixtures/obsidian/edits/workspace.json +65 -0
  205. package/fixtures/obsidian/materialization/expected-full.json +99 -0
  206. package/fixtures/obsidian/materialization/expected-scoped.json +39 -0
  207. package/fixtures/obsidian/materialization/workspace.json +54 -0
  208. package/fixtures/obsidian/proposals/expected-shapes.json +11 -0
  209. package/fixtures/projects/sample-workspace/content/source.html.kg.json +4 -1
  210. package/fixtures/projects/source-formats-workspace/content/data.json.kg.json +4 -1
  211. package/fixtures/projects/source-formats-workspace/content/logo.png.kg.json +4 -1
  212. package/fixtures/projects/source-formats-workspace/content/metrics.csv.kg.json +4 -1
  213. package/fixtures/projects/source-formats-workspace/content/pipeline.yaml.kg.json +4 -1
  214. package/fixtures/ui/presentation/pane.v1.json +7 -0
  215. package/fixtures/ui/presentation/reference.v1.json +293 -0
  216. package/package.json +86 -10
  217. package/skills/claude/atelier-guided-coauthor/SKILL.md +49 -0
  218. package/skills/claude/atelier-guided-upgrade/SKILL.md +97 -0
  219. package/skills/claude/atelier-local-service/SKILL.md +47 -0
  220. package/skills/claude/atelier-open/SKILL.md +11 -5
  221. package/skills/claude/atelier-public-boundary/SKILL.md +31 -0
  222. package/skills/claude/atelier-skill-steward/SKILL.md +62 -0
  223. package/skills/claude/mnstry-readiness/SKILL.md +5 -0
  224. package/skills/codex/atelier-guided-coauthor/SKILL.md +49 -0
  225. package/skills/codex/atelier-guided-upgrade/SKILL.md +97 -0
  226. package/skills/codex/atelier-local-service/SKILL.md +47 -0
  227. package/skills/codex/atelier-open/SKILL.md +11 -5
  228. package/skills/codex/atelier-public-boundary/SKILL.md +31 -0
  229. package/skills/codex/atelier-skill-steward/SKILL.md +62 -0
  230. package/skills/codex/mnstry-readiness/SKILL.md +5 -0
  231. package/src/access/preview-enforcer.mjs +84 -0
  232. package/src/boundary/content-rules.mjs +283 -20
  233. package/src/boundary/policy.mjs +213 -91
  234. package/src/cli/execute-command.mjs +36 -0
  235. package/src/cli/project-options.mjs +58 -0
  236. package/src/cli/run.mjs +78 -10
  237. package/src/coauthor/session.mjs +161 -0
  238. package/src/coauthor/store.mjs +173 -0
  239. package/src/collaboration/event-ledger.mjs +348 -0
  240. package/src/collaboration/index.mjs +17 -0
  241. package/src/collaboration/inspection-bundle.mjs +223 -0
  242. package/src/collaboration/proposals.mjs +265 -65
  243. package/src/collaboration/review-contracts.mjs +25 -0
  244. package/src/collaboration/review-store.mjs +305 -0
  245. package/src/commands/attestation.mjs +20 -6
  246. package/src/commands/coauthor.mjs +26 -0
  247. package/src/commands/config.mjs +6 -1
  248. package/src/commands/disclosure.mjs +133 -0
  249. package/src/commands/distribution.mjs +2 -1
  250. package/src/commands/extension-pack.mjs +17 -9
  251. package/src/commands/init.mjs +46 -6
  252. package/src/commands/obsidian.mjs +371 -0
  253. package/src/commands/review.mjs +147 -0
  254. package/src/commands/server.mjs +1 -4
  255. package/src/commands/setup.mjs +51 -14
  256. package/src/commands/skills.mjs +199 -0
  257. package/src/commands/sync.mjs +107 -0
  258. package/src/composition/registry.mjs +27 -0
  259. package/src/composition/wire.mjs +122 -0
  260. package/src/contracts/corpus.mjs +35 -0
  261. package/src/decisions/contracts.d.mts +96 -0
  262. package/src/decisions/contracts.mjs +321 -0
  263. package/src/disclosure/content-scan.mjs +206 -0
  264. package/src/egress/check.mjs +7 -38
  265. package/src/egress/forbidden-egress.mjs +32 -18
  266. package/src/export/atelier-export-contract.mjs +16 -1
  267. package/src/extension-packs/lifecycle.mjs +154 -0
  268. package/src/graph/graph.mjs +176 -316
  269. package/src/graph/knowledge-graph.mjs +643 -43
  270. package/src/guides/contracts.mjs +54 -0
  271. package/src/harness/context-client.mjs +9 -1
  272. package/src/index.mjs +41 -0
  273. package/src/intake/store.mjs +119 -0
  274. package/src/preview/channel.mjs +89 -0
  275. package/src/project/config.mjs +112 -52
  276. package/src/project/durable-state.mjs +161 -0
  277. package/src/project/file-class.mjs +180 -0
  278. package/src/project/package-root.mjs +10 -0
  279. package/src/project/path-match.mjs +38 -15
  280. package/src/project/private-state.mjs +120 -0
  281. package/src/projection/obsidian/contracts.mjs +571 -0
  282. package/src/projection/obsidian/edits/align.mjs +169 -0
  283. package/src/projection/obsidian/edits/apply.mjs +889 -0
  284. package/src/projection/obsidian/edits/arbitrate.mjs +414 -0
  285. package/src/projection/obsidian/edits/contribution.mjs +108 -0
  286. package/src/projection/obsidian/edits/index.mjs +19 -0
  287. package/src/projection/obsidian/edits/object-identity.mjs +61 -0
  288. package/src/projection/obsidian/edits/object-store.mjs +517 -0
  289. package/src/projection/obsidian/edits/observe.mjs +123 -0
  290. package/src/projection/obsidian/edits/policy.mjs +123 -0
  291. package/src/projection/obsidian/edits/regions.mjs +648 -0
  292. package/src/projection/obsidian/materialize/byte-lens.mjs +98 -0
  293. package/src/projection/obsidian/materialize/index.mjs +7 -0
  294. package/src/projection/obsidian/materialize/path-registry.mjs +105 -0
  295. package/src/projection/obsidian/materialize/prepare-view.mjs +746 -0
  296. package/src/projection/obsidian/materialize/settings.mjs +57 -0
  297. package/src/projection/obsidian/materialize/stage.mjs +27 -0
  298. package/src/projection/obsidian/proposals/adapter.mjs +572 -0
  299. package/src/projection/obsidian/proposals/backpressure.mjs +113 -0
  300. package/src/projection/obsidian/proposals/contribution.mjs +55 -0
  301. package/src/projection/obsidian/proposals/index.mjs +23 -0
  302. package/src/projection/obsidian/proposals/observation.mjs +216 -0
  303. package/src/projection/obsidian/proposals/queue.mjs +277 -0
  304. package/src/projection/obsidian/proposals/router.mjs +168 -0
  305. package/src/projection/obsidian/publication/bridge-script.mjs +266 -0
  306. package/src/projection/obsidian/publication/exchange.mjs +117 -0
  307. package/src/projection/obsidian/publication/index.mjs +5 -0
  308. package/src/projection/obsidian/publication/publisher.mjs +588 -0
  309. package/src/projection/obsidian/publication/test-seam.mjs +16 -0
  310. package/src/projection/obsidian/publication/transport.mjs +212 -0
  311. package/src/projection/obsidian/recovery/index.mjs +6 -0
  312. package/src/projection/obsidian/recovery/journal.mjs +134 -0
  313. package/src/projection/obsidian/recovery/late-writer.mjs +46 -0
  314. package/src/projection/obsidian/recovery/restart.mjs +316 -0
  315. package/src/projection/obsidian/recovery/store.mjs +234 -0
  316. package/src/projection/obsidian/selection-ui/conflict-view.mjs +91 -0
  317. package/src/projection/obsidian/selection-ui/contribution.mjs +141 -0
  318. package/src/projection/obsidian/selection-ui/focus.mjs +82 -0
  319. package/src/projection/obsidian/selection-ui/index.mjs +12 -0
  320. package/src/projection/obsidian/selection-ui/policy-setup.mjs +107 -0
  321. package/src/projection/obsidian/selection-ui/receipt.mjs +173 -0
  322. package/src/projection/obsidian/selection-ui/selection-state.mjs +122 -0
  323. package/src/projection/obsidian/selection-ui/selection.mjs +109 -0
  324. package/src/projection/project.mjs +28 -19
  325. package/src/readiness-protocols/evidence.mjs +282 -0
  326. package/src/readiness-protocols/runtime.mjs +4 -3
  327. package/src/readiness-protocols/source-read.mjs +39 -0
  328. package/src/runtime/git-adapter.mjs +189 -0
  329. package/src/runtime/local-state.mjs +439 -0
  330. package/src/runtime/obsidian/app-capability.mjs +138 -0
  331. package/src/runtime/obsidian/app-production-seams.mjs +107 -0
  332. package/src/runtime/obsidian/contributions/proposal-adapter.mjs +4 -0
  333. package/src/runtime/obsidian/contributions/selection-ui.mjs +4 -0
  334. package/src/runtime/obsidian/contributions/source-apply.mjs +4 -0
  335. package/src/runtime/obsidian/contributions.mjs +27 -0
  336. package/src/runtime/obsidian/documents.mjs +37 -0
  337. package/src/runtime/obsidian/enablement.mjs +53 -0
  338. package/src/runtime/obsidian/engine.mjs +532 -0
  339. package/src/runtime/obsidian/errors.mjs +14 -0
  340. package/src/runtime/obsidian/extension-points.mjs +103 -0
  341. package/src/runtime/obsidian/index.mjs +34 -0
  342. package/src/runtime/obsidian/lifecycle.mjs +258 -0
  343. package/src/runtime/obsidian/machine-settings.mjs +260 -0
  344. package/src/runtime/obsidian/observation.mjs +158 -0
  345. package/src/runtime/obsidian/opening.mjs +280 -0
  346. package/src/runtime/obsidian/pending-edits.mjs +141 -0
  347. package/src/runtime/obsidian/pipeline.mjs +122 -0
  348. package/src/runtime/obsidian/private-lock.mjs +156 -0
  349. package/src/runtime/obsidian/process-identity.mjs +58 -0
  350. package/src/runtime/obsidian/service-client.mjs +66 -0
  351. package/src/runtime/obsidian/service-entry-path.mjs +9 -0
  352. package/src/runtime/obsidian/service-main.mjs +93 -0
  353. package/src/runtime/obsidian/service-record.mjs +169 -0
  354. package/src/runtime/obsidian/service-server.mjs +121 -0
  355. package/src/runtime/obsidian/service.mjs +216 -0
  356. package/src/runtime/obsidian/startup-adapters.mjs +87 -0
  357. package/src/runtime/obsidian/state-store.mjs +180 -0
  358. package/src/runtime/obsidian/sync-notice.mjs +33 -0
  359. package/src/runtime/obsidian/tick-loop.mjs +84 -0
  360. package/src/runtime/obsidian/watchers.mjs +36 -0
  361. package/src/runtime/repository-observation.mjs +491 -0
  362. package/src/runtime/supervisor.mjs +803 -0
  363. package/src/server/local-sidecar.mjs +125 -59
  364. package/src/server/security.mjs +89 -4
  365. package/src/server/server.mjs +4 -2
  366. package/src/skills/steward.mjs +780 -0
  367. package/src/support/feedback-report.mjs +4 -3
  368. package/src/ui/presentation/browser.mjs +278 -0
  369. package/src/ui/presentation/contract.mjs +116 -0
  370. package/src/ui/presentation/index.mjs +7 -0
  371. package/src/ui/presentation/native.mjs +153 -0
  372. package/src/ui/presentation/proof.mjs +57 -0
  373. package/src/ui/presentation/schema-check.mjs +30 -0
  374. package/src/ui/presentation/schema.generated.mjs +1371 -0
  375. package/src/ui/presentation/state.mjs +43 -0
  376. package/src/ui/presentation/styles.mjs +67 -0
  377. package/src/ui/presentation/tokens.mjs +74 -0
  378. package/src/ui/presentation/web.mjs +85 -0
  379. package/src/ui/review-page.mjs +32 -0
  380. package/src/upgrade/explanation.mjs +33 -0
  381. package/src/upgrade/provenance.mjs +338 -0
  382. package/src/upgrade/transaction-files.mjs +103 -0
  383. package/src/upgrade/transaction.mjs +475 -0
  384. package/src/upgrade/upgrade.mjs +65 -29
  385. package/src/vault/hosts.mjs +21 -0
  386. package/src/vault/identity.mjs +19 -0
  387. package/src/vault/index.mjs +7 -0
  388. package/src/vault/interface.mjs +11 -0
  389. package/src/vault/metadata.mjs +31 -0
  390. package/src/vault/privacy.mjs +148 -0
  391. package/src/vault/probe.mjs +89 -0
  392. package/src/vault/service.mjs +131 -0
  393. package/src/vault/source.mjs +45 -0
  394. package/src/vault/storage.mjs +23 -0
  395. package/templates/distribution-workspace/.claude/launch.json +6 -2
  396. package/templates/distribution-workspace/gitignore +1 -0
  397. package/templates/distribution-workspace/project/README.md +2 -2
  398. package/templates/external-project-workspace/README.md +45 -0
  399. package/templates/external-project-workspace/answers.example.json +4 -0
  400. package/templates/external-project-workspace/atelier.project.json +40 -0
  401. package/templates/external-project-workspace/boundary-policy.v1.json +60 -0
  402. package/templates/external-project-workspace/gitignore +8 -0
  403. package/templates/external-project-workspace/pack-lifecycle.json +14 -0
  404. package/templates/external-project-workspace/packs/protocols/contract-gate.v1.json +109 -0
  405. package/templates/external-project-workspace/packs/sample-pack.v1.json +48 -0
  406. package/templates/external-project-workspace/repo-access.v1.json +9 -0
  407. package/templates/external-project-workspace/source/README.md +11 -0
  408. package/templates/launch.json +6 -2
  409. package/templates/private-domain-workspace/.claude/launch.json +6 -2
  410. package/templates/private-domain-workspace/domain/README.md +2 -2
  411. package/templates/private-domain-workspace/gitignore +1 -0
  412. package/templates/shared-project-workspace/.claude/launch.json +6 -2
  413. package/templates/shared-project-workspace/gitignore +1 -0
  414. package/templates/shared-project-workspace/project/README.md +2 -2
@@ -0,0 +1,49 @@
1
+ # Assurance controls and evidence map
2
+
3
+ This ledger maps public trust claims to the control that enforces them, the
4
+ test that challenges the control, and the limit that remains. It describes the
5
+ source tree; a release decision must additionally record the exact candidate
6
+ commit and packed-tarball digest.
7
+
8
+ | Claim | Enforcing control | Defensive evidence | Stated limit |
9
+ | --- | --- | --- | --- |
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
+ | 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
+ | 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. 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
+ | 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
+ | 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
+ | 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
+ | 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 |
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` |
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 |
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 |
29
+
30
+ The release-blocking command is `npm run prepublishOnly`. It includes positive
31
+ regression suites and deliberately broken local fixtures. The latter prove
32
+ that boundary, graph, egress, sidecar, and distribution controls still refuse
33
+ their named failure modes; they do not exercise a live abuse path.
34
+
35
+ ## Exact-candidate evidence
36
+
37
+ At candidate cut, retain all of the following together:
38
+
39
+ 1. the Git commit SHA and a clean working-tree check;
40
+ 2. the `npm pack --json` inventory and tarball SHA-256;
41
+ 3. outputs from syntax, contracts, public-API compatibility, migrations, repository disclosure,
42
+ release audit, full tests, mutation smoke, bare consumer, and distribution
43
+ smoke;
44
+ 4. a defensive review tied to that same commit and digest; and
45
+ 5. explicit human decisions for versioning, publication, deployment, or any
46
+ external communication.
47
+
48
+ Evidence for a different commit or a dirty tree is not evidence for the
49
+ candidate.
@@ -14,6 +14,8 @@ The package owns reusable mechanics:
14
14
  - proposal-only collaboration metadata;
15
15
  - support-bundle dry runs with no send path;
16
16
  - export dry-run validation for `atelier-export@v1`.
17
+ - explicit single-repository enrollment and full-state Git observation;
18
+ - fast-forward-only reconciliation and two-phase user-confirmed commits.
17
19
 
18
20
  Project adapters own project facts: repo roster, source roots, read-boundary
19
21
  config, extension packs, brand language, and generated project outputs.
@@ -28,7 +30,31 @@ runtime authority.
28
30
 
29
31
  ## Safety Posture
30
32
 
31
- The default package posture is no telemetry, no external network egress, no
32
- runtime mutation, no browser apply endpoint, and no model-assisted analysis execution.
33
+ The default package posture is no telemetry, no MNSTRY runtime mutation, no
34
+ browser apply endpoint, and no model-assisted analysis execution. Conformance
35
+ is offline. The only documented subprocess network paths are the bounded `gh`
36
+ actor-resolution fallback and explicitly enrolled Atelier Sync Git fetch and
37
+ user-confirmed non-force push operations.
33
38
  Provider analysis output may only enter as proposed `atelier-claim@v1` records
34
39
  until explicitly reviewed by the project owner.
40
+
41
+ `atelier dev` is narrower than a general static server. It refuses non-loopback
42
+ bind hosts, requires a generated `atelier.manifest.json`, and publishes only
43
+ manifest-enrolled HTML, script, style, and image files that remain inside the
44
+ workspace after realpath resolution. Hidden paths, local state, secret-shaped
45
+ names, symlinks, unknown file types, and unenrolled files are unavailable.
46
+ Reads validate the loopback host and fetch metadata; mutations additionally
47
+ require an allowed method, exact same origin, and the session nonce.
48
+
49
+ Collaboration endpoints are copy-only: they create or review proposal records;
50
+ they do not apply source changes. Authority is derived from declared
51
+ capabilities and apply endpoints, never inferred from action-like prose. A
52
+ partially corrupt ledger returns typed incomplete evidence and blocks a clean
53
+ claim. Ledger reads and records are bounded, appends are locked, and retention
54
+ changes happen only through explicit compaction.
55
+
56
+ The local Git supervisor is a separate mechanical authority surface. It may
57
+ create a repository commit only from an unchanged, bounded plan after the user
58
+ repeats its exact operation id. That repository write is not a MNSTRY runtime
59
+ mutation and does not grant proposal apply authority to the browser sidecar.
60
+ See [Atelier Sync: Deliverable Zero](./atelier-sync.md).
@@ -0,0 +1,172 @@
1
+ # Atelier Sync: Deliverable Zero
2
+
3
+ Atelier Sync is the collaborator-facing name for the resident repository
4
+ supervisor. Deliverable Zero is deliberately headless: it proves the Git,
5
+ filesystem, state-machine, recovery, and user-authority boundaries before a
6
+ tray shell or installer is allowed to make the product feel finished.
7
+
8
+ This is repository mechanics, not MNSTRY runtime authority. A Git commit
9
+ changes the enrolled repository. It does not mutate MNSTRY identity, consent,
10
+ visibility, provisioning, commerce, sessions, audit, or any other managed
11
+ runtime object.
12
+
13
+ ## Authority contract
14
+
15
+ - Enrollment names exactly one repository. Atelier never scans a home folder.
16
+ - One resolved absolute system Git executable, version, and executable digest
17
+ owns Git semantics for the enrollment. Every inherited `GIT_*` variable is
18
+ stripped from supervised Git calls before Atelier adds its small fixed
19
+ safety environment. Custom SSH transport belongs in the user's SSH config;
20
+ credentials continue through ordinary Git credential helpers. Git `2.40.0`
21
+ or newer is required so global and system attribute provenance is observable.
22
+ - Every cycle observes the full repository. There is no watcher correctness
23
+ dependency in Deliverable Zero.
24
+ - Fetch and fast-forward-only reconciliation are mechanical operations.
25
+ - Commit creation is a two-phase, user-confirmed operation. Planning records
26
+ the head, branch, complete status digest, exact file paths, commit message,
27
+ reviewed blob/mode manifest, diff summary, and exact optional upstream push
28
+ identity. The push identity digest covers the single resolved, normalized,
29
+ credential-free execution destination; persisted display evidence likewise
30
+ strips authentication material, query strings, and fragments. Multiple push
31
+ URLs and `url.*.insteadOf`/`pushInsteadOf` rewrites are refused as ambiguous.
32
+ Every authoritative field is bound into the operation id.
33
+ Execution requires that exact id and refuses if the plan, repository,
34
+ staged bytes/modes, written tree, commit parent/message, or publish target
35
+ changed. A publish plan is refused while any earlier local commit remains
36
+ unpublished, and publication names the exact verified commit object rather
37
+ than a movable `HEAD` ref. Plans expire after 24 hours, are consumed by a
38
+ definitive execution attempt, and are held under resident file/count
39
+ ceilings. Expired, malformed, or oversized retained plan files are removed
40
+ under the repository lock before those ceilings are enforced; redirected
41
+ plan state remains a hard refusal.
42
+ - A commit plan cannot absorb pre-existing staged work. It stages only literal,
43
+ explicitly reviewed paths.
44
+ - Configured Atelier boundary policy is checked against the staged change set
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
+ legacy-warning mode. The Sync path disables the boundary command's optional
48
+ network `gh api user` fallback and fails closed when local actor evidence is
49
+ insufficient. Commit history is provenance, not current-user identity, and
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,
53
+ single parent, and message must equal the reviewed authority or the local
54
+ commit is rolled back and publication is refused.
55
+ - Push is present only when the reviewed plan requested it, the branch had no
56
+ prior unpublished commits, and HEAD still names the exact verified commit.
57
+ Atelier re-resolves the single push URL immediately before publication and
58
+ pushes the exact commit object directly to that reviewed destination. Push is
59
+ never forced, never follows tags, and never recursively publishes submodule
60
+ refs. When fetch and push resolve to the same credential-free identity,
61
+ Atelier refreshes the exact remote-tracking branch and re-observes before it
62
+ reports `committed-and-published`. A distinct configured push URL is honored,
63
+ but remains an explicit attention state because it cannot prove the fetch
64
+ upstream synchronized. A failed push or post-push tracking refresh preserves
65
+ the local commit, creates one stable attention state, and returns a non-zero
66
+ command exit.
67
+ - Semantic conflict resolution, merge commits, rebase, reset, force push,
68
+ browser apply, broad path scans, telemetry, and hidden upload are absent.
69
+
70
+ ## Repository completeness
71
+
72
+ `atelier sync status` emits a supervisor envelope whose `state.observation`
73
+ contains the current `atelier-repository-observation@v1` document. That
74
+ observation cannot report `complete: true` when any of these are unresolved:
75
+
76
+ - lexically identifiable provider-managed, UNC/network, WSL-cross-boundary, or
77
+ unclassified external filesystem roots (mapped-drive classification remains
78
+ an operating-system integration concern for the signed beta);
79
+ - an unsupported Git engine or bare repository;
80
+ - sparse checkout, partial clone, or shallow repository state;
81
+ - tracked paths carrying `assume-unchanged` or `skip-worktree` index flags;
82
+ - missing or unhealthy submodules;
83
+ - required Git LFS content without a working LFS integration, including LFS
84
+ semantics declared by tracked or untracked worktree attributes, repository
85
+ info attributes, and default global or system attributes;
86
+ - an unclassified custom clean, smudge, or process filter;
87
+ - a configured `core.hooksPath` whose executable behavior is outside the
88
+ reviewed repository contract;
89
+ - a remote URL whose authentication shape cannot be classified;
90
+ - multiple push destinations or any configured Git URL rewrite rule;
91
+ - any required Git evidence read that fails, times out, exceeds its budget, or
92
+ cannot be parsed.
93
+ - a change set above the 4,096-entry resident observation ceiling; or
94
+ - a `core.attributesFile` outside the repository-owned/tracked attributes
95
+ boundary whose filter semantics have not been classified.
96
+
97
+ HTTPS through Git Credential Manager, SSH through the user's existing SSH
98
+ configuration, and local test remotes are classified explicitly. Atelier does
99
+ not collect or store provider credentials.
100
+
101
+ ## Local operation state
102
+
103
+ Ignored `.atelier-local/runtime/` contains:
104
+
105
+ - `enrollment.json` — exact repository and Git engine;
106
+ - `state.json` — a bounded projection of healthy, attention, or paused state;
107
+ - `control.json` — user pause/freeze state;
108
+ - `plans/` — expiring, consumed reviewed commit plans under count/byte ceilings;
109
+ - `operations.ndjson` — sequence- and hash-chained resident trace with explicit
110
+ hash-bound checkpoints before its byte or record ceiling, with a fresh
111
+ digest-linked generation after a torn or corrupt chain; and
112
+ - an atomic per-repository operation lock.
113
+
114
+ Every directory component is containment-checked and every state leaf is
115
+ opened without following redirects where the platform supports it, with leaf
116
+ type and identity checks on every platform. Stale-lock recovery uses an
117
+ exclusive recovery claim, ages out an abandoned recovery claim after the owner
118
+ grace interval, identity-checks the lock directory before and after quarantine,
119
+ and quarantines only the claimed stale directory; it never recursively deletes
120
+ a newly acquired lock. A live PID without durable process identity cannot wedge
121
+ the repository forever: its owner record becomes recoverable after the 24-hour
122
+ maximum operation age. Enrollment takes the same lock as every other
123
+ authoritative state mutation.
124
+
125
+ Deleting this directory removes convenience and diagnostics. It cannot change
126
+ repository meaning. Git plus readable files remain authoritative.
127
+
128
+ ## Engineering commands
129
+
130
+ ```bash
131
+ atelier sync enroll --repo /absolute/path/to/repository
132
+ atelier sync status --repo /absolute/path/to/repository
133
+ atelier sync reconcile --repo /absolute/path/to/repository
134
+ atelier sync run --repo /absolute/path/to/repository --once
135
+
136
+ atelier sync plan \
137
+ --repo /absolute/path/to/repository \
138
+ --path docs/decision.md \
139
+ --message "docs: record decision" \
140
+ --publish
141
+
142
+ # Repeat the exact operation id printed by plan:
143
+ atelier sync commit \
144
+ --repo /absolute/path/to/repository \
145
+ --operation operation-... \
146
+ --confirm operation-...
147
+ ```
148
+
149
+ `status`, `audit`, `reconcile`, `run --once`, and `commit` return a non-zero
150
+ process exit when their result is not healthy, so automation cannot treat a
151
+ paused state, attention state, or failed publication as success merely because
152
+ JSON was emitted.
153
+
154
+ The future native shell may label the final two commands **Commit & sync**.
155
+ It must not bypass either phase.
156
+
157
+ The repeated operation id is a visible user-intent confirmation gate, not an
158
+ authorization secret. Local software able to read and modify the repository is
159
+ inside the same operating-system trust domain; the control prevents implicit
160
+ or stale execution, not a hostile process with the user's filesystem access.
161
+
162
+ ## Evidence boundary
163
+
164
+ Deliverable Zero proves the headless supervisor contract on Linux and macOS,
165
+ with Windows CI covering the portable observation, state, and direct-process
166
+ contract. POSIX executable-wrapper substitution is explicitly skipped on
167
+ Windows; native Windows wrapper-injection proof, signed installation,
168
+ background launch at user login, Windows Home/Pro device behavior, macOS
169
+ notarization, and a nontechnical-user workflow belong to the signed
170
+ collaborator beta. Repositories without an initial commit are not supported by
171
+ this deliverable. A Git executable upgrade changes enrolled identity and
172
+ requires re-enrollment.
@@ -0,0 +1,9 @@
1
+ The `audience` field in the header is the load-bearing word. It declares who
2
+ a source is written for — `public`, `team`, `operator`, `staff`, `private`,
3
+ or `sensitive` — and the machinery downstream refuses to let material travel
4
+ further than its audience allows. Runtime and export `visibility` is a
5
+ separate vocabulary (`private`, `shared`, `platform`, `public`) describing
6
+ runtime exposure, and the validators reject every crossing between the two.
7
+ Above all: a public export that references a source whose audience is not
8
+ public is refused. That check is fixture-pinned and mutation-tested —
9
+ deleting its enforcement fails tests, not documentation.
@@ -0,0 +1,61 @@
1
+ This package makes three promises. None of them asks for your trust — each
2
+ one names the command that proves it.
3
+
4
+ **There is no silent egress; every network path is named.** There is no
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
19
+ for observation/reconciliation and one non-force push only when the exact
20
+ reviewed commit plan requested and confirmed it, no earlier local commit is
21
+ waiting to be published, and HEAD still names the verified commit object. Sync
22
+ never uses the network actor fallback, follows tags, or recursively publishes
23
+ submodule refs. The local authoring HTTP client
24
+ refuses non-loopback URLs, the served pages authorize no external origin, and
25
+ release audit scans every executable or markup file in the exact `npm pack`
26
+ inventory for egress primitives. The standalone gate also scans executable and
27
+ markup files under `src/`, `bin/`, `scripts/`, `templates/`, `examples/`, and
28
+ `skills/`. Two limits worth stating plainly: the egress control does not
29
+ interpret data-only `.json` or `.md` files, and it does not model
30
+ `child_process`; the reviewed `gh` and enrolled Git paths above are documented
31
+ subprocess exceptions rather than scanner detections:
32
+
33
+ ```bash
34
+ npm run egress:check
35
+ ```
36
+
37
+ **Compatibility is checked by machinery, not memory.** Documents valid
38
+ against the `v0.2.0-alpha.0` contracts stay valid: every change is checked
39
+ against the baseline tag's validators, and schema widening outside `ext`
40
+ containers is refused by a schema-vs-schema differ. Breaking changes require
41
+ a new contract version and a recorded migration. Known limit: the differ
42
+ compares schemas structurally and does not resolve `$ref` pointers, so a
43
+ `$ref` retargeted at a looser definition is not caught by this gate — the
44
+ fixture tests catch that for contracts with negative fixtures, and closing
45
+ the gap in the differ is tracked work:
46
+
47
+ ```bash
48
+ npm run contract:compat
49
+ ```
50
+
51
+ **Conformance works offline, forever.** Validating a document against the
52
+ published contracts needs this package and nothing else — no account, no
53
+ service, no network:
54
+
55
+ ```bash
56
+ atelier dry-run ./atelier-export.json
57
+ ```
58
+
59
+ `docs/continuity.md` records the distribution commitments behind these
60
+ claims, including the perpetual Apache-2.0 grant on every tagged release you
61
+ receive.
@@ -0,0 +1,15 @@
1
+ The Atelier export format is MNSTRY's format, offered openly.
2
+
3
+ **Anyone can check a document against the published contracts, forever,
4
+ offline.** The contracts, fixtures, and dry-run validator all ship in the
5
+ package, so conformance needs no account, no network, and no MNSTRY
6
+ involvement.
7
+
8
+ Admission is a narrower, opt-in decision: whether a MNSTRY governed runtime
9
+ accepts a document for delivery to the people it serves. That is what
10
+ admission buys — delivery through a runtime that enforces consent and
11
+ visibility at serve time — and it takes the form of a signed MNSTRY
12
+ attestation against criteria this package publishes (`docs/attestation.md`).
13
+ The criteria are public, the checker is private, and the rejection message
14
+ is part of the contract. You can build on the Atelier without ever talking
15
+ to MNSTRY, and a document MNSTRY declines can still be fully conformant.
@@ -0,0 +1,18 @@
1
+ - It does not write to a MNSTRY runtime database.
2
+ - It does not import, provision, publish, or send project content to a MNSTRY
3
+ managed runtime.
4
+ - Conformance remains offline. Local CLI network access is limited to the documented
5
+ `gh` actor-resolution fallback and explicitly enrolled Atelier Sync Git
6
+ operations: bounded fetch for observation/reconciliation, and non-force push
7
+ only when the exact reviewed commit plan requested and confirmed it, no
8
+ earlier local commit remains unpublished, and HEAD still names the verified
9
+ commit object; Sync does not use network actor fallback, follow tags, or
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.
14
+ - It does not execute model-assisted analysis or any model provider.
15
+ - It does not include client project content.
16
+
17
+ These limits are the design. An authoring tool for private material earns
18
+ trust by what it refuses to be able to do.
@@ -0,0 +1,57 @@
1
+ # Experimental portable coauthor session
2
+
3
+ Tracked by issue #33. The experimental reducer is exported at
4
+ `@mnstry/atelier/coauthor`; the private draft adapter at `@mnstry/atelier/coauthor/store`.
5
+ The `atelier coauthor start|read|event|recover` CLI consumes one JSON request on
6
+ stdin. Run it from the intended Git workspace; `.atelier-local/` must be ignored
7
+ and untracked. The shipped `atelier-guided-coauthor` skill guides harness use.
8
+ This local candidate has not been published or accepted by a real author.
9
+
10
+ The harness supplies a session id and an ordered list of consumer-owned field
11
+ ids, each bound to an immutable source reference and SHA-256 digest. The pure
12
+ reducer accepts revision-bound events and returns a new state plus effects.
13
+ It does not access files, render a browser, contact a model or authorize writes.
14
+
15
+ An answer remains in history. Every proposed wording change requires explicit
16
+ confirmation before saving. Answer-and-continue intent survives confirmation;
17
+ advance occurs only after a matching receipt. Pause retains the current phase.
18
+ Rejection restores the original answer. Undo of an already saved value is not
19
+ implemented: consumers must not advertise it or delete history to simulate it.
20
+
21
+ ## Adapter obligations
22
+
23
+ - Keep reducer state inside the trusted adapter; untrusted callers submit
24
+ intents, never snapshots or save receipts. Rehydrate from validated events
25
+ with `replaySession`, using the original immutable configuration.
26
+ - Authenticate and authorize actors outside this module. Session identifiers
27
+ and matching digests are correlation data, not proof of identity or authority.
28
+ - Persist accepted events through the existing consumer ledger. This module's
29
+ in-memory history is a replay projection, not a second durable database.
30
+ - Before executing `write-field`, verify source identity and containment and
31
+ apply the consumer's compare-and-swap write policy. Key execution by session
32
+ id plus request id. Retry uses the same key; duplicate delivery must not
33
+ perform another write. Reconcile a pending write after a restart rather than
34
+ blindly replaying historical effects.
35
+ - Emit a receipt only after durable persistence and readback of the exact
36
+ target field's UTF-8 value. The receipt binds session, request, field, source
37
+ reference, source digest and value digest. A digest match alone does not
38
+ establish that these adapter duties occurred.
39
+ - A failure remains visible. One explicit retry is allowed; subsequent failures
40
+ require adapter reconciliation. A valid late receipt can resolve recovery.
41
+ - Persist the accepted receipt event before showing saved state. This module
42
+ grants no canonical publication, release, remote execution or guide access.
43
+
44
+ The supplied store reuses the collaboration ledger implementation, in a separate
45
+ coauthor stream that is never mixed into legacy proposal aggregates. It verifies
46
+ contiguous versions and previous-event identity; compaction that drops history
47
+ is refused. It writes immutable private draft values, then replays a readback-bound
48
+ receipt before showing saved state. It never edits selected source files.
49
+ Workspace-local Git checks are the only subprocess use; no network is added.
50
+ Operation locks serialize this adapter's writers. A leftover lock requires
51
+ operator inspection, never automatic removal of an unknown writer's lock.
52
+
53
+ `start` takes `{config: {id, fields}}`; `read` and `recover` take `{sessionId}`;
54
+ `event` takes `{sessionId, event}`. A receipt or failure event submitted through
55
+ the CLI is refused. Source changes block new writes, not reading old history.
56
+ Configuration and saved drafts have the additive `atelier-coauthor.v1` schema;
57
+ source path containment and duplicate fields are checked by the adapter as well.
@@ -0,0 +1,75 @@
1
+ # Connected composition: synthetic foundation
2
+
3
+ Status: experimental, opt-in source prototype. Not an accepted public API,
4
+ production auth integration, published release, or certification of a private
5
+ host. Existing package exports and contracts remain unchanged.
6
+
7
+ ## Bounded implementation
8
+
9
+ Owned additions: `src/composition/`, `src/access/`, `src/preview/`,
10
+ `examples/connected-composition/`, `test/connected-composition*.test.mjs`, and
11
+ `scripts/prove-connected-composition.mjs`. This document records the reservation.
12
+ No existing sidecar, vault, coauthor, presentation, keyboard or business module
13
+ is changed. The prototype starts from the frozen presentation supplier and is a
14
+ separate candidate; its local proof cannot satisfy that supplier's CI gate.
15
+
16
+ The public root supplies placement validation, an opt-in trusted-host enforcement
17
+ helper and a two-origin preview channel. A private host supplies identity,
18
+ membership, delegation, policy, registry/source resolution, services, result
19
+ filtering and audit storage. Auth adapters can differ without changing placements.
20
+ White-label and self-provisioned hosts remain possible; no hosting infrastructure
21
+ or tenant provisioning is implemented here.
22
+
23
+ The example uses two invented auth adapters and an in-memory collection service.
24
+ It is intentionally not an auth provider. Only preview-plane synthetic reads and
25
+ an explicitly enabled reversible sandbox action are supported. No production
26
+ plane, live network transport, credential, payment or irreversible action exists.
27
+
28
+ ## Implementation sequence and acceptance
29
+
30
+ 1. Closed, byte/depth/count-bounded JSON parsing, placement and action schemas;
31
+ exact source-byte and immutable definition/renderer digests.
32
+ 2. Trusted channel authentication, complete decision binding, agent attenuation,
33
+ fail-closed revalidation before service and before output; bounded projection.
34
+ 3. Independent fake service authorization, expected-version/idempotency behavior,
35
+ with accurate uncertainty rather than invented rollback after an effect.
36
+ 4. Exact-origin/source/nonce MessageChannel handshake and generation/source/sequence
37
+ guards; old mounts and pending responses cleared on change or logout.
38
+ 5. An Astro page retaining useful static content without JavaScript or an account;
39
+ isolated dynamic preview, ordinary native controls, narrow responsive layout.
40
+ 6. Focused control tests, three desktop browser engines, source-edit/build/refresh,
41
+ fake adapter switch/logout, scoped agent refusal and no secret projection.
42
+
43
+ The browser receives proposals and filtered results, never a trusted session,
44
+ decision or service port. This separation protects against an untrusted preview,
45
+ not a malicious host constructor. A real service must independently authorize
46
+ and atomically own effect/version/idempotency receipts. Types and callback names
47
+ are not security boundaries. A compromised private service or dishonest projector
48
+ is outside this root helper's assurance.
49
+
50
+ No general source writer is added. The browser does not get filesystem tools.
51
+ The proof harness edits only its disposable authored fixture and rebuilds it.
52
+ Existing coauthor draft persistence and canonical source promotion stay owned by
53
+ their existing workflows. There is no duplicate placement database.
54
+
55
+ ## Proposal alignment
56
+
57
+ The wire retains the `proposal-v1` discriminators from the reviewed placement
58
+ proposal, with an executable closed action validator added. The implementation
59
+ is `connected-composition/experimental-v1`, not a proposal acceptance event.
60
+ An action's full request digest is additionally bound to authorization, so an
61
+ identifier cannot silently stand for a changed payload. The projector returns
62
+ only filtered data; the root constructs all public state metadata itself.
63
+ Audit intake uses `pending` and output settlement uses `prepared`, not
64
+ `delivered`: returning a prepared result is not a browser delivery acknowledgement.
65
+ Preview lifecycle generations are mount-local and never serialize host session
66
+ generation or identity. Real hosts must map invalidation into channel disposal.
67
+ The first resolver intentionally admits exactly one data binding and a web
68
+ projection. Multi-resource composition, other host projections and a published
69
+ package export require their own accepted contracts; parsing their proposed
70
+ shape alone is not runtime admission.
71
+
72
+ Missing completion gates: owner validation of real host adapters and source
73
+ promotion integration, service-specific transaction/reconciliation proof,
74
+ assistive-technology and actual native/device tests, private adopter acceptance,
75
+ maintainer integration and recognized CI. None is implied by this prototype.
@@ -21,10 +21,9 @@ NOTICE attribution obligation and the trademark limits in `TRADEMARKS.md`).
21
21
  tag you fetched, with full Apache-2.0 rights over it. MNSTRY will not ask
22
22
  for deletion of received tagged source and has no license mechanism to do
23
23
  so.
24
- 2. **npm publication at public release.** When the package's public flip
25
- happens, tagged releases will be published to the npm registry under
26
- `@mnstry/atelier` with public access, making the registry — not repository
27
- permission — the distribution channel of record.
24
+ 2. **npm publication.** Tagged releases are published to the npm registry
25
+ under `@mnstry/atelier` with public access, making the registry — not
26
+ repository permission — the distribution channel of record.
28
27
  3. **Contract compatibility by machinery.** From tag `v0.2.0-alpha.0`
29
28
  onward, the published contracts are under a compatibility gate
30
29
  (`npm run contract:compat`): documents valid against the baseline tag must