@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,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.
@@ -0,0 +1,167 @@
1
+ # Typed decision proposals
2
+
3
+ The optional `@mnstry/atelier/decisions` API validates finite questions and
4
+ their proposed answers. It performs no provider calls, credential lookup,
5
+ source mutation, or acceptance. A consuming host supplies the provider and
6
+ independently checks authorization before disclosure or use.
7
+
8
+ For a development pilot, pin the reviewed source commit or its verified
9
+ tarball. Check that the installed package exports `./decisions`; an older
10
+ published alpha may not contain this API. A source merge does not publish a
11
+ new registry version.
12
+
13
+ This API is suitable for a small, explicit choice, an ordered score, or a
14
+ Boolean probability. It does not extract missing evidence or generate prose.
15
+ The fixtures describe an invented reading room; their answers and usage are
16
+ synthetic examples, not model evaluation results.
17
+
18
+ ```js
19
+ import {
20
+ decisionRequestDigest,
21
+ validateDecisionRequest,
22
+ validateDecisionResult,
23
+ } from '@mnstry/atelier/decisions'
24
+
25
+ const requestCheck = validateDecisionRequest(request)
26
+ if (!requestCheck.ok) throw new Error('Invalid decision request')
27
+ const digest = decisionRequestDigest(request)
28
+
29
+ // The host obtains a result under its own provider and disclosure policy.
30
+ const resultCheck = validateDecisionResult(request, result)
31
+ if (!resultCheck.ok) throw new Error('Invalid decision result')
32
+ ```
33
+
34
+ The adjacent TypeScript declarations export `DecisionRequest`,
35
+ `DecisionQuestion`, `DecisionResult`, `DecisionAnswer`, `DecisionScope`,
36
+ `DecisionUsage`, and `DecisionValidation`, including the individual question
37
+ and answer variants. Runtime validation remains required for external data.
38
+
39
+ For hosts that need only question and answer validation, use
40
+ `validateDecisionAnswers(questions, answers)`. It checks bounded plain JSON,
41
+ question structure, exact answer keys and types, probability distributions,
42
+ and score expectations. It accepts no state, computes no hash, performs no
43
+ provider execution, and writes nothing. The host supplies its own transient
44
+ request binding and enforces its privacy policy.
45
+
46
+ ```js
47
+ import { validateDecisionAnswers } from '@mnstry/atelier/decisions'
48
+
49
+ const answerCheck = validateDecisionAnswers(questions, answers)
50
+ if (!answerCheck.ok) throw new Error('Invalid decision answers')
51
+ ```
52
+
53
+ This separate API checks evidence reference syntax, uniqueness and bounds,
54
+ but cannot establish membership in a source snapshot that it has not received.
55
+ The request and result validators still enforce that membership. A successful
56
+ answer check establishes neither authorization nor semantic correctness.
57
+
58
+ ## Requests
59
+
60
+ `atelier-decision-request@v1` records a request ID, task, rubric version,
61
+ host-reported scope, state, evidence references, and questions. The
62
+ `scope.workspaceId` and `scope.authorizationRef` fields bind the assessment to
63
+ the host's reported snapshot. They do not authenticate a caller, prove
64
+ consent, or grant access. The host must revalidate current permissions and
65
+ revocation before sending data or acting on a cached result.
66
+
67
+ Each question includes instructions and at least one `evidenceIds` entry
68
+ referring to the request's evidence. Evidence identities are unique; their
69
+ `sourceRef` strings are opaque references preserved for the host. Validation
70
+ does not fetch them or prove that the state faithfully represents a source.
71
+
72
+ | Question | Criteria | Answer |
73
+ | --- | --- | --- |
74
+ | `choice` | A map of 2–64 option IDs to descriptions | A selected option, complete probability map, and provider confidence statistic |
75
+ | `score` | An ordered list of 2–10 descriptions | A zero-index weighted expectation, complete probability list, and provider confidence statistic |
76
+ | `boolean` | Explicit `true` and `false` descriptions | A probability between zero and one |
77
+
78
+ Identifiers are 1–128 ASCII characters, beginning with a letter or digit and
79
+ continuing with letters, digits, `.`, `_`, `:`, or `-`. The names `__proto__`,
80
+ `constructor`, and `prototype` are refused as object keys and identifiers.
81
+ State and descriptions support Unicode; validation does not normalize text.
82
+
83
+ Requests are limited to 64 questions, 256 evidence entries, 32,000 state
84
+ characters, 4,000 instruction characters per question, 2,000 characters per
85
+ criterion, and 2,048 characters per source reference. String limits count
86
+ Unicode code points. Empty state is allowed so the host can record an
87
+ insufficient-evidence abstention; instructions and descriptions must contain
88
+ non-whitespace text.
89
+
90
+ ## Results and integrity
91
+
92
+ `atelier-decision-result@v1` copies the request ID, task, rubric version and
93
+ scope, and carries `requestDigest`, provider ID, concrete model name,
94
+ elapsed milliseconds, and usage. Token counts are nonnegative safe integers;
95
+ `usage: null` records unavailable usage without treating it as zero.
96
+
97
+ `authority` is always `proposal-only`. `mode` is `shadow` or `advisory`;
98
+ neither value grants execution authority. An `assessed` result contains
99
+ exactly the requested answer keys and types. An `abstained` result contains
100
+ an empty answer map and one explicit reason: `insufficient-evidence`,
101
+ `ambiguous`, `no-match`, `budget-exhausted`, `provider-unavailable`, `timeout`,
102
+ `invalid-response`, or `unauthorized`.
103
+
104
+ The validator checks that distributions sum to one within `1e-6`, a chosen
105
+ option has maximum probability, and a score equals its zero-index weighted
106
+ expectation within `1e-6`. Tied maximum choices are valid. Boolean answers
107
+ have no confidence field. Confidence is a provider statistic, not measured
108
+ semantic correctness; a structurally valid high-confidence answer can still
109
+ be wrong. The host owns evaluation data, calibrated thresholds, escalation,
110
+ and fallback behavior. The host must also compare the recorded model with
111
+ its requested concrete model pin; the request contract does not prescribe a
112
+ provider or model.
113
+
114
+ `decisionRequestDigest` returns lowercase SHA-256 over canonical JSON with
115
+ object keys recursively sorted in JavaScript string order. Array order and
116
+ exact Unicode content are retained. It includes the full request, scope,
117
+ evidence, rubric, and optional extensions. Reordering object insertion does
118
+ not change the digest; changing any represented value does. This is local
119
+ integrity evidence, not a signature or proof of provenance. Invalid requests
120
+ throw a generic `TypeError`; validators return `{ ok, errors }` without
121
+ echoing source text, unknown field names, or provider response content.
122
+
123
+ Content hashes can themselves be sensitive. A host whose policy forbids
124
+ hashing a passage must use its own transient request binding instead of this
125
+ digest-bearing envelope. It can reuse the question and answer types without
126
+ calling `decisionRequestDigest` or retaining a full request. The public
127
+ contract does not override the host's privacy policy.
128
+
129
+ ## Closed fields and extensions
130
+
131
+ The standalone JSON Schemas are
132
+ `atelier-decision-request.v1.schema.json` and
133
+ `atelier-decision-result.v1.schema.json`. They validate static shape. Use the
134
+ JavaScript validator as well for request binding, evidence relationships,
135
+ distribution semantics, and bounded in-process JSON.
136
+
137
+ As with other Atelier contracts, the roots allow optional
138
+ `contractVersion: "1.0.0"`, and closed objects allow an optional object-valued
139
+ `ext`. Unknown first-class fields are refused. Namespaced extension members
140
+ are inert metadata: consumers must ignore unrecognized members and must
141
+ never derive authority from them. Dynamic question, choice and answer maps
142
+ contain only their declared entries; they have no reserved metadata entry.
143
+
144
+ Both requests and results, including extensions, are limited to 16,777,216
145
+ canonical JSON bytes, 100,000 values, and 32 levels of nesting below the root.
146
+ Cycles, symbols, sparse arrays, accessors, non-finite numbers, undefined
147
+ values and custom prototypes are refused. Plain objects with a null
148
+ prototype are accepted. No input is mutated.
149
+
150
+ ## Host integration
151
+
152
+ 1. Build bounded questions from already authorized evidence. Preserve all
153
+ source passages and coverage independently of a proposed prioritization.
154
+ 2. Validate the request, then check the host's current consent, destination,
155
+ concrete model pin, input limit, evaluation budget and timeout policy.
156
+ 3. Call a provider through the host adapter. Keep credentials, private
157
+ criteria, raw responses and provider execution outside the public kit.
158
+ 4. Normalize and validate the result against the exact request. Retain full
159
+ distributions and unknown usage; represent failures as explicit
160
+ abstentions without accepting partial answer sets.
161
+ 5. Compare shadow results with an independently labeled evaluation set.
162
+ Enable an advisory consumer only after task-specific acceptance. Keep the
163
+ host's existing behavior as the fallback and recheck authorization on
164
+ cache access.
165
+
166
+ This module does not change the existing analysis adapter's default-disabled
167
+ execution policy or accept a model proposal as an authored fact.
@@ -0,0 +1,159 @@
1
+ # Local exact-plan upgrades
2
+
3
+ The explicit `atelier upgrade plan/apply/status/recover` commands prepare a
4
+ local candidate from an already installed Atelier executor. They preserve an
5
+ adopter's source branch and configuration, show the exact changes, and retain
6
+ local evidence of what was selected and what Git actually committed.
7
+
8
+ Execution in this first slice requires Linux or macOS with working directory
9
+ fsync. Other hosts, including native Windows, refuse before transaction state
10
+ creation; existing Atelier commands remain available. The platform refusal is
11
+ tested separately from the POSIX execution scenarios.
12
+
13
+ This first slice supports **one configuration repository in a linked Git
14
+ worktree**, with its project config and workspace at the root. Its single
15
+ managed repo must point to `.`. It refreshes the lock, graph, HTML projection,
16
+ manifest and readiness output. Generated paths must be distinct paths within
17
+ `atelier-output/`. Distribution branding is retained. External packs, local
18
+ overlays, private readiness runs, submodules, sparse checkouts, attribute/filter
19
+ transformations and runtime/alignment participants are refused. These limits
20
+ are explicit eligibility checks, not assurances about unsupported setups.
21
+
22
+ There is no package installation, network discovery, hook replacement, runtime
23
+ activation, or automatic policy mode. Existing legacy `upgrade --apply` remains
24
+ a separate workflow; it does not acquire these transaction guarantees.
25
+
26
+ ## Enroll and prepare
27
+
28
+ Create a dedicated candidate worktree using your usual Git workflow, then add
29
+ and commit `atelier.adoption-policy.json` there:
30
+
31
+ ```json
32
+ {
33
+ "schema": "mnstry.atelier-adoption-policy@v1",
34
+ "enabled": true,
35
+ "mode": "manual-exact-plan",
36
+ "maxAgeSeconds": 86400,
37
+ "recoveryCoverage": "local-only",
38
+ "allowedEffects": ["lock-and-projections", "git-commit"]
39
+ }
40
+ ```
41
+
42
+ Ignore `.atelier-local/` and keep every file beneath it untracked. Start with a
43
+ clean index and worktree. From the candidate worktree:
44
+
45
+ ```sh
46
+ atelier upgrade plan --save --project ./atelier.project.json
47
+ ```
48
+
49
+ The result names a private saved plan and its `sha256:` confirmation digest.
50
+ Inspect its `writes`: concrete paths, ownership, old/new byte digests and modes,
51
+ and the proposed bytes in base64. `readSet` inventories the entire enrolled
52
+ repository except Git administration and private local state. The plan also
53
+ binds the repository identity, HEAD, branch, policy, Git executable,
54
+ configuration, Git auxiliary ignore/attribute files, hook directory and files, executor and imported dependency bytes,
55
+ and a fixed expiry. Default lifetime is 24 hours; policy may shorten it.
56
+ The Git fingerprint covers the transaction's selected executable. Legacy
57
+ builders also invoke Git from `PATH`; use the same executable there when
58
+ setting `ATELIER_GIT_PATH`. Cross-host output ordering is not guaranteed.
59
+ Executor checkout metadata may affect generated lock provenance; the saved
60
+ plan binds the resulting bytes rather than promising identical regeneration.
61
+
62
+ Inherited `GIT_*` overrides such as an IDE's `GIT_ASKPASS` are refused (apart
63
+ from the documented prompt, pager and optional-lock controls). Prepare from
64
+ an environment without those overrides. Repository, global and system Git
65
+ attribute files must be absent or empty for this slice.
66
+
67
+ Generation uses an isolated private preparation directory and the existing
68
+ builders. Only five registered output paths can be written, and a complete
69
+ before/after inventory checks that boundary. The executor then saves those
70
+ bytes; application does not recalculate or silently replace the selected plan.
71
+ This is a bounded trusted executor, not a sandbox for arbitrary migration code.
72
+ The generated readiness JSON retains absolute local graph and projection paths,
73
+ which may include the account name. Inspect those committed bytes before sharing
74
+ the candidate branch; generating a candidate does not authorize publication.
75
+
76
+ ## Apply the reviewed bytes
77
+
78
+ Use `atelier upgrade explain --plan SAVED_PLAN_PATH --format markdown` to read
79
+ the verified plan's effects, expiry and consent limits. The default JSON format
80
+ contains the same report. Explanation is read-only and never grants approval.
81
+ See [guided upgrades](guided-upgrades.md) for the owner-agent workflow.
82
+
83
+ Use the returned path and digest literally:
84
+
85
+ ```sh
86
+ atelier upgrade apply --plan SAVED_PLAN_PATH --confirm sha256:REVIEWED_DIGEST --project ./atelier.project.json
87
+ ```
88
+
89
+ The digest selects content; it is not an authenticated human signature. Host
90
+ permissions must establish any stronger authority. The command takes an
91
+ exclusive local writer lease, checks current bindings before mutation and at
92
+ safe boundaries, records original bytes and write intents, writes only expected
93
+ preimages, stages only the frozen paths, and runs the existing commit hooks.
94
+ No commit uses `--no-verify`. Hook execution is existing adopter code with its
95
+ normal host privileges, not a new sandbox or a promise of no hook side effects.
96
+ Relevant hook changes invalidate the plan; files or executables that hooks
97
+ consult outside their directory are not transitively fingerprinted.
98
+ Git commit has a 30-second execution budget. A timeout is conservatively
99
+ `recovery-required`, since a hook may already have acted; this budget is not
100
+ a guarantee that all hook descendants terminate within 30 seconds.
101
+
102
+ A successful Git exit is insufficient: the commit's parent, tree and message,
103
+ staged blobs, branch and worktree must match. A refused commit retains its index
104
+ and worktree as `commit-refused`. Unexpected changes become `recovery-required`.
105
+ Neither case causes an automatic retry, reset, hook bypass or success claim.
106
+ Every accepted attempt consumes the plan, including an interrupted attempt.
107
+
108
+ ## Status and recovery evidence
109
+
110
+ ```sh
111
+ atelier upgrade status --operation OPERATION_ID --project ./atelier.project.json
112
+ atelier upgrade recover --operation OPERATION_ID --dry-run --project ./atelier.project.json
113
+ ```
114
+
115
+ The operation ID is the hexadecimal part of the plan digest. Events live in
116
+ `.atelier-local/upgrades/operations/OPERATION_ID/events/`, with original bytes in
117
+ `backups/`. Events are exclusive, fsynced publications with sequence numbers,
118
+ previous-event digests and verified rereads. Missing, truncated or altered events
119
+ refuse success. This is local integrity evidence; a host owner who can replace
120
+ all records can rewrite a chain. It is not externally authenticated provenance.
121
+
122
+ Only a verified terminal receipt asserts completion. The v1 lock retains prior
123
+ migration history, template lineage and successful-upgrade metadata. Its success
124
+ fields deliberately lag the new receipt; the command never writes the hash of
125
+ an uncreated commit into that commit. No automatic metadata refresh is shipped.
126
+
127
+ An interruption after Git commits but before the terminal event remains
128
+ `recovery-required`, even when the commit exists. Recovery dry-run reports
129
+ current HEAD/index evidence, safely restorable bytes and conflicts. Subsequent
130
+ user edits and any moved HEAD prevent automatic restoration. This release offers
131
+ **no recovery mutation**: restoring files or reverting a commit requires a
132
+ separately reviewed operation with current authority. It never resets history.
133
+
134
+ A crash may leave the writer lease in place. Inspect its owner and verify that
135
+ process has stopped before separately handling the stale lease; elapsed time
136
+ alone never releases it. Status and recovery inspection remain available.
137
+ A crash during preparation can also leave a `prepare-*` scratch directory
138
+ under `.atelier-local/upgrades/`. Further preparation and application refuse
139
+ with a stale-preparation diagnostic. Verify the writer has stopped and inspect
140
+ the directory before separately removing only that abandoned scratch directory.
141
+ The command does not delete it automatically or remove plans, receipts or backups.
142
+
143
+ Evidence has no automatic deletion. Inventory limits (4,096 files, 64 MiB) and a
144
+ 32 MiB retained-state admission threshold and 8 MiB saved-plan limit bound this small-workspace slice.
145
+ Exhaustion refuses another operation; export and verify evidence before any
146
+ separate retention maintenance. Ignored state is not backed up or inherited by
147
+ another clone. Enrollment explicitly acknowledges local-only recovery.
148
+
149
+ ## Provenance and acceptance boundaries
150
+
151
+ The plan pins installed executor and dependency bytes. It does not authenticate
152
+ an upstream publisher or verify a newly downloaded release. Release discovery,
153
+ authenticated artifact intake, dependency installation, multi-repository
154
+ transactions and standing automatic consent remain separate future work.
155
+
156
+ A completed transaction means a prepared local candidate commit. It does not
157
+ mean a merged upstream change, CI acceptance, adoption in another workspace,
158
+ published package or activated service. Use the adopter's normal review and
159
+ landing process to accept the candidate.
@@ -0,0 +1,33 @@
1
+ # Pack compatibility for evidence-bound review
2
+
3
+ The closed v1 pack format remains unchanged. An adapter can declare a separate
4
+ `atelier-pack-lifecycle@v1` file through
5
+ `ext["mnstry.atelier"].extensionPackLifecycle`. Each entry binds the pack ID,
6
+ version and content digest to `compatibleRootVersions`, an explicit finite set
7
+ of approved root versions. This conservative compatibility range does not infer
8
+ SemVer compatibility or silently approve a future root version.
9
+
10
+ `atelier review packs` reports admission. `--migration-plan` returns a dry-run
11
+ report referencing the existing extension-pack upgrade registry and its checks.
12
+ A declaration can name an available registry `migrationId`; unknown migrations
13
+ fail qualification. Pack loading never executes extension code or installs
14
+ packages. An owner reviews replacement term/protocol meaning, retains prior
15
+ content, updates declarations and locks, and uses the existing upgrade workflow.
16
+ The plan itself writes nothing. A fresh run is required after a change.
17
+
18
+ | Root/pack state | Historical inspection | New evidence-bound run |
19
+ | --- | --- | --- |
20
+ | Current root explicitly approved; exact active pack | Pinned snapshot | Admitted |
21
+ | Exact deprecated pack, root approved | Pinned snapshot; replacement shown | Admitted with deprecated status |
22
+ | Retired, wrong digest/version or unapproved root | Pinned snapshot | Refused |
23
+ | Legacy pack without lifecycle declaration | Existing readers remain usable | Unqualified; refused |
24
+ | No custom packs | Bundled snapshot | Admitted |
25
+ | Old root predating this feature | Its legacy readers only | No new review protocol supplied by that root |
26
+
27
+ A snapshot contains the actual protocol and source identity used originally.
28
+ Historical inspection does not load today's replacement as yesterday's method.
29
+ Migration IDs describe reviewed owner operations, not autonomous reinterpretation
30
+ or approval. For rollback restore the previous package, pack declarations and
31
+ lock; retain the evidence and contribution ledgers. Existing legacy readiness
32
+ execution remains compatible and does not acquire exact-review qualification
33
+ merely because it can still read the pack.
@@ -0,0 +1,99 @@
1
+ # Upgrade with your agent
2
+
3
+ Ask your agent to prepare an upgrade using the bundled
4
+ `atelier-guided-upgrade` skill. It is available in both packaged skill surfaces.
5
+ For an older installation, the operator first selects and verifies the new
6
+ package. Reading its skill is not permission to install or execute it in your
7
+ working Atelier.
8
+
9
+ > Prepare an Atelier upgrade in an isolated candidate. Preserve my authored
10
+ > work, local customizations and existing approvals. Identify an exact trusted
11
+ > release, explain its effect here and run the appropriate checks. Show me what
12
+ > is ready and ask before applying changes to my working installation, merging
13
+ > or restarting services. Report unsupported configurations explicitly.
14
+
15
+ ## What the owner reviews
16
+
17
+ The agent prepares a short explanation with inspectable evidence:
18
+
19
+ | Item | Required information |
20
+ | --- | --- |
21
+ | Source | Old and selected package identities, source commit when verified, artifact integrity, dependency lock and trust source. |
22
+ | Local impact | Benefit, actual changed paths, preserved customizations, migrations and unsupported participants. |
23
+ | Validation | Exact candidate tested, commands, results, skipped coverage and remaining acceptance checks. |
24
+ | Consent | The specific installation, commit, merge or activation effects requested; prior applicable authority and any new decision. |
25
+ | Recovery | What remains untouched, retained backups and conflicts; whether restoration is manual. |
26
+ | Outcome | Prepared, installed in candidate, committed, merged, running and owner-accepted are distinct states. |
27
+
28
+ Do not attach private authored content to an upstream issue or public release.
29
+ Even generated readiness output can contain account paths. Retain full evidence
30
+ privately and publish only an explicitly approved summary.
31
+
32
+ ## Exact-plan explanation
33
+
34
+ After selecting/installing the executor in an eligible candidate, follow
35
+ [exact upgrades](exact-upgrades.md) for enrollment and preparation. Use the
36
+ verified installed binary (these examples assume a root-local npm install):
37
+
38
+ ```sh
39
+ ./node_modules/.bin/atelier upgrade plan --save --project ./atelier.project.json
40
+ ./node_modules/.bin/atelier upgrade explain --plan SAVED_PLAN_PATH --project ./atelier.project.json
41
+ ./node_modules/.bin/atelier upgrade explain --plan SAVED_PLAN_PATH --format markdown --project ./atelier.project.json
42
+ ```
43
+
44
+ Both explanations derive from the same verified saved plan. They expose paths,
45
+ before/after hashes, executor evidence, expiry and consent limits, without
46
+ printing the proposed base64 contents. Inspect the saved bytes separately.
47
+ The command is read-only: it neither records consent nor regenerates output.
48
+ JSON `bindingsCurrent: false` and `blockers` identify observed staleness even
49
+ when explanation succeeds. `bindingsCurrent: true` is not a reservation or a
50
+ complete application admission; apply performs its full checks again.
51
+
52
+ The owner's decision must bind the displayed plan and effects. An agent records
53
+ the exact words and conversation reference privately with the report digest,
54
+ candidate, target and decision. Use `humanApprovalAuthenticated: false` and
55
+ `recordedBy: agent`; the record is an attestation of the conversation, not a
56
+ cryptographic human signature. Hashes identify content and detect changes. A
57
+ trusted host/harness must enforce any stronger approval boundary. Merely
58
+ writing an approval-looking JSON file grants no authority.
59
+
60
+ ## Existing workspaces outside the first slice
61
+
62
+ A managed subdirectory, multiple repositories, external packs, overlays or an
63
+ unsupported host require a separate operator procedure. Keep those boundaries;
64
+ changing a graph root to `.` can expose previously excluded material. Never
65
+ remove a guard to make the exact planner accept a workspace.
66
+
67
+ Use the consuming repository's documented procedure, retaining the old source
68
+ and lock history, an exact dependency pin and a before/after manifest. Label the
69
+ result as an operator-prepared candidate. The exact transaction receipt and its
70
+ guarantees do not apply. If no procedure exists, prepare a migration proposal and
71
+ stop before application. The legacy flag-based apply command is not an automatic
72
+ substitute for the saved-plan workflow.
73
+
74
+ An isolated snapshot may preserve active local edits for a rehearsal, provided
75
+ its manifest is stable and the original remains untouched. It does not settle
76
+ ownership of those edits or include ignored answer history. Reconcile with the
77
+ active writer before eventual adoption. Test reopening/resuming owned state at
78
+ the actual recipient before claiming owner acceptance.
79
+
80
+ ## Release and pilot checklist
81
+
82
+ Maintainers retain a release candidate with `ATELIER_RELEASE_OUTPUT_DIR` and
83
+ `npm run prepublishOnly`: one archive is audited and exercised by installed
84
+ consumer and distribution smokes. This proves the candidate artifact, not that
85
+ it was published or that an adopter trusts its publisher. Include the candidate
86
+ commit/tree, artifact digest, release notes, supported runtimes, migration limits
87
+ and original review qualifications in the release handoff.
88
+
89
+ The publishing workflow rebuilds and verifies its own retained artifact after
90
+ the release commit lands. Its published integrity is the consumer's installation
91
+ reference; do not substitute a different local tarball's digest. Publication
92
+ uses a separately authorized version tag. An alpha version in source is not
93
+ evidence that npm already contains it.
94
+
95
+ Pilot one explicitly selected workspace: inspect, prepare separately, explain,
96
+ record a real decision, apply the authorized effects, verify and confirm the
97
+ owner can continue their work. Candidate tests alone do not complete that last
98
+ step. Background discovery, unattended installation and automatic recovery are
99
+ not provided by this workflow.