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

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 (560) hide show
  1. package/CHANGELOG.md +1005 -0
  2. package/README.md +149 -9
  3. package/contracts/atelier-adoption-policy.v2.schema.json +55 -0
  4. package/contracts/atelier-architecture.v1.schema.json +258 -0
  5. package/contracts/atelier-boundary-delegations.v1.schema.json +161 -0
  6. package/contracts/atelier-boundary-owner-keys.v1.schema.json +98 -0
  7. package/contracts/atelier-build.v1.schema.json +1076 -0
  8. package/contracts/atelier-capability.v1.schema.json +1252 -0
  9. package/contracts/atelier-coordination.v1.schema.json +1050 -0
  10. package/contracts/atelier-evidence-navigation.v1.schema.json +603 -0
  11. package/contracts/atelier-harness.v1.schema.json +234 -0
  12. package/contracts/atelier-ingestion.v1.schema.json +806 -0
  13. package/contracts/atelier-inquiry.v1.schema.json +1772 -0
  14. package/contracts/atelier-instruction-adoption.v1.schema.json +490 -0
  15. package/contracts/atelier-interaction.v1.schema.json +553 -0
  16. package/contracts/atelier-judgment.v1.schema.json +690 -0
  17. package/contracts/atelier-knowledge.v1.schema.json +1512 -0
  18. package/contracts/atelier-learning.v1.schema.json +1095 -0
  19. package/contracts/atelier-migration.v3.schema.json +64 -0
  20. package/contracts/atelier-obsidian-generation-manifest.v2.schema.json +372 -0
  21. package/contracts/atelier-personal-workspace-manifest.v1.schema.json +87 -0
  22. package/contracts/atelier-personal-workspace-overlay.v1.schema.json +299 -0
  23. package/contracts/atelier-template-adoption.v1.schema.json +223 -0
  24. package/contracts/atelier-template-profile.v1.schema.json +1168 -0
  25. package/contracts/atelier-trackable.v1.schema.json +781 -0
  26. package/contracts/atelier-upgrade-plan.v3.schema.json +532 -0
  27. package/contracts/compat-baseline.json +1 -1
  28. package/docs/architecture.md +89 -0
  29. package/docs/assurance-controls.md +4 -3
  30. package/docs/blocks/capability-stewardship.md +17 -0
  31. package/docs/blocks/claims.md +16 -3
  32. package/docs/blocks/inquiry-harnesses.md +19 -0
  33. package/docs/blocks/learning-harnesses.md +17 -0
  34. package/docs/capability-stewardship.md +269 -0
  35. package/docs/coordination.md +51 -0
  36. package/docs/decision-practices.md +111 -0
  37. package/docs/decisions.md +29 -0
  38. package/docs/evidence-navigation.md +237 -0
  39. package/docs/exact-upgrades.md +3 -2
  40. package/docs/ingestion.md +181 -0
  41. package/docs/inquiry-harnesses.md +211 -0
  42. package/docs/install.md +80 -3
  43. package/docs/intake-and-guides.md +5 -0
  44. package/docs/integration-contract-decisions.md +24 -2
  45. package/docs/interaction-and-reflection.md +72 -0
  46. package/docs/knowledge-graph.md +20 -0
  47. package/docs/knowledge-health/api.md +30 -0
  48. package/docs/knowledge-health/assessment/api.md +96 -0
  49. package/docs/knowledge-health/assessment/capabilities.md +40 -0
  50. package/docs/knowledge-health/assessment/evaluation.md +27 -0
  51. package/docs/knowledge-health/assessment/facilitator.md +30 -0
  52. package/docs/knowledge-health/assessment/quickstart.md +61 -0
  53. package/docs/knowledge-health/assessment/troubleshooting.md +23 -0
  54. package/docs/knowledge-health/devday/facilitator.md +16 -0
  55. package/docs/knowledge-health/devday/participant-response.md +22 -0
  56. package/docs/knowledge-health/devday/public-default.md +107 -0
  57. package/docs/knowledge-health/devday/quickstart.md +18 -0
  58. package/docs/knowledge-health/devday/support.md +22 -0
  59. package/docs/knowledge-health/exercise.md +17 -0
  60. package/docs/knowledge-health/facilitator.md +20 -0
  61. package/docs/knowledge-health/quickstart.md +94 -0
  62. package/docs/knowledge-health/readme.md +15 -0
  63. package/docs/knowledge-health/support.md +34 -0
  64. package/docs/knowledge-setup.md +248 -0
  65. package/docs/knowledge-workspace.md +264 -0
  66. package/docs/learning-harnesses.md +238 -0
  67. package/docs/learning.md +215 -0
  68. package/docs/local-services.md +242 -26
  69. package/docs/obsidian-contract.md +878 -36
  70. package/docs/obsidian-plugin.md +619 -0
  71. package/docs/obsidian.md +809 -64
  72. package/docs/optional-ingestion.md +83 -0
  73. package/docs/personal-workspace.md +257 -0
  74. package/docs/practical-judgment.md +92 -0
  75. package/docs/progressive-ingestion-acceptance.md +89 -0
  76. package/docs/progressive-ingestion.md +235 -0
  77. package/docs/project-command-inventory.md +1 -0
  78. package/docs/release-engineering.md +56 -1
  79. package/docs/repo-boundary-guard.md +94 -0
  80. package/docs/research-starter-quickstart.md +66 -0
  81. package/docs/research-starter.md +114 -0
  82. package/docs/semantic-ingestion.md +198 -0
  83. package/docs/semantic-operation.md +317 -0
  84. package/docs/skill-steward.md +6 -0
  85. package/docs/template-profile.md +164 -0
  86. package/docs/template-upgrades.md +114 -0
  87. package/docs/trackables.md +111 -0
  88. package/docs/upgrade.md +68 -3
  89. package/fixtures/atelier-architecture/binding/invalid/document.json +19 -0
  90. package/fixtures/atelier-architecture/binding/valid/document.json +19 -0
  91. package/fixtures/atelier-architecture/catalog/invalid/document.json +290 -0
  92. package/fixtures/atelier-architecture/catalog/valid/document.json +343 -0
  93. package/fixtures/atelier-build-contract/attempt/invalid/document.json +20 -0
  94. package/fixtures/atelier-build-contract/attempt/valid/document.json +19 -0
  95. package/fixtures/atelier-build-contract/candidate/invalid/document.json +24 -0
  96. package/fixtures/atelier-build-contract/candidate/valid/document.json +23 -0
  97. package/fixtures/atelier-build-contract/decision/invalid/document.json +31 -0
  98. package/fixtures/atelier-build-contract/decision/valid/document.json +30 -0
  99. package/fixtures/atelier-build-contract/delivery/invalid/document.json +18 -0
  100. package/fixtures/atelier-build-contract/delivery/valid/document.json +17 -0
  101. package/fixtures/atelier-build-contract/gate/invalid/document.json +22 -0
  102. package/fixtures/atelier-build-contract/gate/valid/document.json +21 -0
  103. package/fixtures/atelier-build-contract/ledger/invalid/document.json +270 -0
  104. package/fixtures/atelier-build-contract/ledger/valid/document.json +269 -0
  105. package/fixtures/atelier-build-contract/objective/invalid/document.json +73 -0
  106. package/fixtures/atelier-build-contract/objective/valid/document.json +72 -0
  107. package/fixtures/atelier-build-contract/progress/invalid/document.json +18 -0
  108. package/fixtures/atelier-build-contract/progress/valid/document.json +17 -0
  109. package/fixtures/atelier-capability-contract/adoption/invalid/document.json +71 -0
  110. package/fixtures/atelier-capability-contract/adoption/valid/document.json +70 -0
  111. package/fixtures/atelier-capability-contract/event/invalid/document.json +18 -0
  112. package/fixtures/atelier-capability-contract/event/valid/document.json +17 -0
  113. package/fixtures/atelier-capability-contract/journal/invalid/document.json +382 -0
  114. package/fixtures/atelier-capability-contract/journal/valid/document.json +381 -0
  115. package/fixtures/atelier-capability-contract/notice/invalid/document.json +8 -0
  116. package/fixtures/atelier-capability-contract/notice/valid/document.json +7 -0
  117. package/fixtures/atelier-capability-contract/package/invalid/document.json +59 -0
  118. package/fixtures/atelier-capability-contract/package/valid/document.json +58 -0
  119. package/fixtures/atelier-capability-contract/plan/invalid/document.json +107 -0
  120. package/fixtures/atelier-capability-contract/plan/valid/document.json +106 -0
  121. package/fixtures/atelier-capability-contract/release/invalid/document.json +85 -0
  122. package/fixtures/atelier-capability-contract/release/valid/document.json +84 -0
  123. package/fixtures/atelier-capability-contract/state/invalid/document.json +316 -0
  124. package/fixtures/atelier-capability-contract/state/valid/document.json +315 -0
  125. package/fixtures/atelier-coordination/dependency/invalid/document.json +37 -0
  126. package/fixtures/atelier-coordination/dependency/valid/document.json +36 -0
  127. package/fixtures/atelier-coordination/directive/invalid/document.json +25 -0
  128. package/fixtures/atelier-coordination/directive/valid/document.json +24 -0
  129. package/fixtures/atelier-coordination/disposition/invalid/document.json +34 -0
  130. package/fixtures/atelier-coordination/disposition/valid/document.json +33 -0
  131. package/fixtures/atelier-coordination/outcome/invalid/document.json +39 -0
  132. package/fixtures/atelier-coordination/outcome/valid/document.json +38 -0
  133. package/fixtures/atelier-coordination/recovery/invalid/document.json +34 -0
  134. package/fixtures/atelier-coordination/recovery/valid/document.json +33 -0
  135. package/fixtures/atelier-harness-contract/handoff/invalid/document.json +25 -0
  136. package/fixtures/atelier-harness-contract/handoff/valid/document.json +24 -0
  137. package/fixtures/atelier-ingestion/invalid/authority.json +19 -0
  138. package/fixtures/atelier-ingestion/semantic-baseline.json +26 -0
  139. package/fixtures/atelier-ingestion/semantic-operation.json +75 -0
  140. package/fixtures/atelier-ingestion/valid/plan-input.json +18 -0
  141. package/fixtures/atelier-inquiry-contract/assessment/invalid/document.json +41 -0
  142. package/fixtures/atelier-inquiry-contract/assessment/valid/document.json +40 -0
  143. package/fixtures/atelier-inquiry-contract/bundle/invalid/document.json +51 -0
  144. package/fixtures/atelier-inquiry-contract/bundle/valid/document.json +50 -0
  145. package/fixtures/atelier-inquiry-contract/campaign/invalid/document.json +17 -0
  146. package/fixtures/atelier-inquiry-contract/campaign/valid/document.json +16 -0
  147. package/fixtures/atelier-inquiry-contract/decision/invalid/document.json +22 -0
  148. package/fixtures/atelier-inquiry-contract/decision/valid/document.json +21 -0
  149. package/fixtures/atelier-inquiry-contract/feedback/invalid/document.json +19 -0
  150. package/fixtures/atelier-inquiry-contract/feedback/valid/document.json +18 -0
  151. package/fixtures/atelier-inquiry-contract/handoff/invalid/document.json +92 -0
  152. package/fixtures/atelier-inquiry-contract/handoff/valid/document.json +91 -0
  153. package/fixtures/atelier-inquiry-contract/hypothesis/invalid/document.json +20 -0
  154. package/fixtures/atelier-inquiry-contract/hypothesis/valid/document.json +19 -0
  155. package/fixtures/atelier-inquiry-contract/ledger/invalid/document.json +680 -0
  156. package/fixtures/atelier-inquiry-contract/ledger/valid/document.json +679 -0
  157. package/fixtures/atelier-inquiry-contract/legacy-assessment/invalid/document.json +19 -0
  158. package/fixtures/atelier-inquiry-contract/legacy-assessment/valid/document.json +18 -0
  159. package/fixtures/atelier-inquiry-contract/request/invalid/document.json +50 -0
  160. package/fixtures/atelier-inquiry-contract/request/valid/document.json +49 -0
  161. package/fixtures/atelier-inquiry-contract/source/invalid/document.json +18 -0
  162. package/fixtures/atelier-inquiry-contract/source/valid/document.json +17 -0
  163. package/fixtures/atelier-inquiry-contract/withdrawal/invalid/document.json +16 -0
  164. package/fixtures/atelier-inquiry-contract/withdrawal/valid/document.json +15 -0
  165. package/fixtures/atelier-instruction-adoption/context-receipt/invalid/document.json +18 -0
  166. package/fixtures/atelier-instruction-adoption/context-receipt/valid/document.json +17 -0
  167. package/fixtures/atelier-instruction-adoption/plan/invalid/document.json +63 -0
  168. package/fixtures/atelier-instruction-adoption/plan/valid/document.json +62 -0
  169. package/fixtures/atelier-instruction-adoption/receipt/invalid/document.json +22 -0
  170. package/fixtures/atelier-instruction-adoption/receipt/valid/document.json +21 -0
  171. package/fixtures/atelier-instruction-adoption/state/invalid/document.json +30 -0
  172. package/fixtures/atelier-instruction-adoption/state/valid/document.json +29 -0
  173. package/fixtures/atelier-interaction/act/invalid/document.json +25 -0
  174. package/fixtures/atelier-interaction/act/valid/document.json +24 -0
  175. package/fixtures/atelier-interaction/assessment/invalid/document.json +32 -0
  176. package/fixtures/atelier-interaction/assessment/valid/document.json +31 -0
  177. package/fixtures/atelier-interaction/observation/invalid/document.json +22 -0
  178. package/fixtures/atelier-interaction/observation/valid/document.json +21 -0
  179. package/fixtures/atelier-interaction/policy/invalid/document.json +20 -0
  180. package/fixtures/atelier-interaction/policy/valid/document.json +19 -0
  181. package/fixtures/atelier-judgment/case/invalid/document.json +76 -0
  182. package/fixtures/atelier-judgment/case/valid/document.json +75 -0
  183. package/fixtures/atelier-judgment/decision/invalid/document.json +38 -0
  184. package/fixtures/atelier-judgment/decision/valid/document.json +37 -0
  185. package/fixtures/atelier-judgment/native-decision.md +3 -0
  186. package/fixtures/atelier-judgment/practice-reconsideration/definition.json +92 -0
  187. package/fixtures/atelier-judgment/practice-reconsideration/scenario.json +435 -0
  188. package/fixtures/atelier-knowledge-contract/activation/invalid/document.json +26 -0
  189. package/fixtures/atelier-knowledge-contract/activation/valid/document.json +25 -0
  190. package/fixtures/atelier-knowledge-contract/contribution/invalid/document.json +34 -0
  191. package/fixtures/atelier-knowledge-contract/contribution/valid/document.json +33 -0
  192. package/fixtures/atelier-knowledge-contract/domain/invalid/document.json +41 -0
  193. package/fixtures/atelier-knowledge-contract/domain/valid/document.json +40 -0
  194. package/fixtures/atelier-knowledge-contract/domain-revision/invalid/document.json +46 -0
  195. package/fixtures/atelier-knowledge-contract/domain-revision/valid/document.json +45 -0
  196. package/fixtures/atelier-knowledge-contract/evaluation/invalid/document.json +21 -0
  197. package/fixtures/atelier-knowledge-contract/evaluation/valid/document.json +20 -0
  198. package/fixtures/atelier-knowledge-contract/ledger/invalid/document.json +318 -0
  199. package/fixtures/atelier-knowledge-contract/ledger/valid/document.json +317 -0
  200. package/fixtures/atelier-knowledge-contract/relation/invalid/document.json +25 -0
  201. package/fixtures/atelier-knowledge-contract/relation/valid/document.json +24 -0
  202. package/fixtures/atelier-knowledge-contract/review/invalid/document.json +18 -0
  203. package/fixtures/atelier-knowledge-contract/review/valid/document.json +17 -0
  204. package/fixtures/atelier-knowledge-contract/withdrawal/invalid/document.json +16 -0
  205. package/fixtures/atelier-knowledge-contract/withdrawal/valid/document.json +15 -0
  206. package/fixtures/atelier-learning/invalid/authority.json +14 -0
  207. package/fixtures/atelier-learning/valid/capture.json +13 -0
  208. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/authority-key.json +17 -0
  209. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/nonempty-ext.json +25 -0
  210. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/wrong-schema.json +22 -0
  211. package/fixtures/atelier-personal-workspace-contract/manifest/valid/manifest.json +22 -0
  212. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/authority-key.json +25 -0
  213. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/unknown-top-level-field.json +27 -0
  214. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/wrong-schema.json +24 -0
  215. package/fixtures/atelier-trackable/definition/invalid/document.json +15 -0
  216. package/fixtures/atelier-trackable/definition/valid/document.json +14 -0
  217. package/fixtures/atelier-trackable/request/invalid/document.json +23 -0
  218. package/fixtures/atelier-trackable/request/valid/document.json +22 -0
  219. package/fixtures/boundary-delegations/invalid/authority-key.v1.json +30 -0
  220. package/fixtures/boundary-delegations/invalid/push-operation.v1.json +28 -0
  221. package/fixtures/boundary-delegations/invalid/unsigned.v1.json +25 -0
  222. package/fixtures/boundary-delegations/valid/empty.v1.json +4 -0
  223. package/fixtures/boundary-delegations/valid/signed-operator.v1.json +30 -0
  224. package/fixtures/boundary-owner-keys/invalid/wrong-algorithm.v1.json +15 -0
  225. package/fixtures/boundary-owner-keys/invalid/wrong-curve.v1.json +15 -0
  226. package/fixtures/boundary-owner-keys/valid/one-owner.v1.json +17 -0
  227. package/fixtures/capability-packages/adoption.example.json +70 -0
  228. package/fixtures/capability-packages/evidence-review/capability-package.json +58 -0
  229. package/fixtures/capability-packages/evidence-review/capability-release.json +84 -0
  230. package/fixtures/capability-packages/evidence-review/evaluation.md +15 -0
  231. package/fixtures/capability-packages/evidence-review/skills/evidence-review/SKILL.md +22 -0
  232. package/fixtures/capability-packages/evidence-review/skills/evidence-review/references/ledger.md +7 -0
  233. package/fixtures/capability-packages/research/capability-package.json +88 -0
  234. package/fixtures/capability-packages/research/capability-release.json +134 -0
  235. package/fixtures/capability-packages/research/evaluation.md +15 -0
  236. package/fixtures/capability-packages/research/skills/research-integrate/SKILL.md +29 -0
  237. package/fixtures/capability-packages/research/skills/research-integrate/references/integration.md +10 -0
  238. package/fixtures/capability-packages/research/skills/research-plan/SKILL.md +27 -0
  239. package/fixtures/capability-packages/research/skills/research-plan/references/inquiries.md +26 -0
  240. package/fixtures/capability-packages/research/skills/research-synthesize/SKILL.md +23 -0
  241. package/fixtures/capability-packages/research/skills/research-synthesize/references/synthesis.md +12 -0
  242. package/fixtures/evidence-navigation/invalid/duplicate-operation.json +16 -0
  243. package/fixtures/evidence-navigation/invalid/instruction-kind.json +36 -0
  244. package/fixtures/evidence-navigation/invalid/invalid-digest.json +36 -0
  245. package/fixtures/evidence-navigation/invalid/invalid-time.json +36 -0
  246. package/fixtures/evidence-navigation/invalid/missing-attribution.json +35 -0
  247. package/fixtures/evidence-navigation/invalid/reserved-extension.json +19 -0
  248. package/fixtures/evidence-navigation/invalid/unattributed-acceptance.json +36 -0
  249. package/fixtures/evidence-navigation/invalid/uncoerced-version.json +16 -0
  250. package/fixtures/evidence-navigation/invalid/unknown-currency.json +17 -0
  251. package/fixtures/evidence-navigation/invalid/unknown-selector-field.json +37 -0
  252. package/fixtures/evidence-navigation/invalid/unsupported-operation.json +15 -0
  253. package/fixtures/evidence-navigation/valid/claim.json +36 -0
  254. package/fixtures/evidence-navigation/valid/host.json +16 -0
  255. package/fixtures/evidence-navigation/valid/profile.json +16 -0
  256. package/fixtures/evidence-navigation/valid/snapshot.json +17 -0
  257. package/fixtures/harness-packages/build-harness/capability-package.json +61 -0
  258. package/fixtures/harness-packages/build-harness/capability-release.json +82 -0
  259. package/fixtures/harness-packages/build-harness/evaluation.md +3 -0
  260. package/fixtures/harness-packages/build-harness/skills/atelier-build-harness/SKILL.md +59 -0
  261. package/fixtures/harness-packages/knowledge-harness/capability-package.json +61 -0
  262. package/fixtures/harness-packages/knowledge-harness/capability-release.json +82 -0
  263. package/fixtures/harness-packages/knowledge-harness/evaluation.md +3 -0
  264. package/fixtures/harness-packages/knowledge-harness/skills/atelier-knowledge-harness/SKILL.md +60 -0
  265. package/fixtures/harnesses/learning-cycle.json +780 -0
  266. package/fixtures/inquiry/workshop.json +675 -0
  267. package/fixtures/inquiry-packages/discovery-harness/capability-package.json +61 -0
  268. package/fixtures/inquiry-packages/discovery-harness/capability-release.json +82 -0
  269. package/fixtures/inquiry-packages/discovery-harness/evaluation.md +3 -0
  270. package/fixtures/inquiry-packages/discovery-harness/skills/atelier-discovery-harness/SKILL.md +48 -0
  271. package/fixtures/inquiry-packages/research-harness/capability-package.json +61 -0
  272. package/fixtures/inquiry-packages/research-harness/capability-release.json +82 -0
  273. package/fixtures/inquiry-packages/research-harness/evaluation.md +3 -0
  274. package/fixtures/inquiry-packages/research-harness/skills/atelier-research-harness/SKILL.md +43 -0
  275. package/fixtures/knowledge-health/calibration-suite.json +26 -0
  276. package/fixtures/knowledge-health/calibration-trial.json +37 -0
  277. package/fixtures/knowledge-health/corrected/checklist.md +18 -0
  278. package/fixtures/knowledge-health/devday/participant-record.json +19 -0
  279. package/fixtures/knowledge-health/expected-summary.json +27 -0
  280. package/fixtures/knowledge-health/workshop/README.md +20 -0
  281. package/fixtures/knowledge-health/workshop/atelier.project.json +7 -0
  282. package/fixtures/knowledge-health/workshop/knowledge-plan.json +65 -0
  283. package/fixtures/knowledge-health/workshop/records/checklist.md +18 -0
  284. package/fixtures/knowledge-health/workshop/records/workshop.md +18 -0
  285. package/fixtures/knowledge-health/workshop/repo-access.v1.json +5 -0
  286. package/fixtures/knowledge-health/workspace/atelier.project.json +18 -0
  287. package/fixtures/knowledge-health/workspace/knowledge-plan.json +74 -0
  288. package/fixtures/knowledge-health/workspace/records/checklist.md +18 -0
  289. package/fixtures/knowledge-health/workspace/records/pilot.md +16 -0
  290. package/fixtures/knowledge-health/workspace/repo-access.v1.json +9 -0
  291. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/case-only-collision.v2.json +160 -0
  292. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/flat-note-path.v2.json +160 -0
  293. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/hidden-folder.v2.json +160 -0
  294. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/identity-in-the-body.v2.json +160 -0
  295. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/link-breaking-name.v2.json +160 -0
  296. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-identity-region.v2.json +156 -0
  297. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-layout-version.v2.json +159 -0
  298. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/note-named-like-a-folder.v2.json +160 -0
  299. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/unknown-region-kind.v2.json +160 -0
  300. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/v1-contract-version.v2.json +161 -0
  301. package/fixtures/obsidian/contracts/generation-manifest-v2/valid/three-notes.v2.json +160 -0
  302. package/fixtures/obsidian/edits/workspace.json +1 -1
  303. package/fixtures/obsidian/materialization/expected-full.json +21 -21
  304. package/fixtures/obsidian/materialization/expected-full.layout-1.json +99 -0
  305. package/fixtures/obsidian/materialization/expected-scoped.json +7 -7
  306. package/fixtures/obsidian/materialization/expected-scoped.layout-1.json +39 -0
  307. package/fixtures/personal-workspace/overlay.json +24 -0
  308. package/fixtures/templates/local-library.v1.json +75 -0
  309. package/fixtures/templates/upgrade-contracts/adoption-policy.v2/invalid.json +16 -0
  310. package/fixtures/templates/upgrade-contracts/adoption-policy.v2/valid.json +13 -0
  311. package/fixtures/templates/upgrade-contracts/migration.v3/invalid.json +24 -0
  312. package/fixtures/templates/upgrade-contracts/migration.v3/valid.json +21 -0
  313. package/fixtures/templates/upgrade-contracts/template-adoption.v1/invalid.json +60 -0
  314. package/fixtures/templates/upgrade-contracts/template-adoption.v1/valid.json +57 -0
  315. package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/invalid.json +85 -0
  316. package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/valid.json +82 -0
  317. package/package.json +64 -6
  318. package/plugins/obsidian/main.js +444 -0
  319. package/plugins/obsidian/manifest.json +9 -0
  320. package/plugins/obsidian/styles.css +22 -0
  321. package/skills/claude/atelier-build-harness/SKILL.md +59 -0
  322. package/skills/claude/atelier-coordination/SKILL.md +32 -0
  323. package/skills/claude/atelier-discovery-harness/SKILL.md +48 -0
  324. package/skills/claude/atelier-guided-upgrade/SKILL.md +29 -0
  325. package/skills/claude/atelier-interaction/SKILL.md +34 -0
  326. package/skills/claude/atelier-knowledge-harness/SKILL.md +60 -0
  327. package/skills/claude/atelier-knowledge-setup/SKILL.md +72 -0
  328. package/skills/claude/atelier-practical-judgment/SKILL.md +64 -0
  329. package/skills/claude/atelier-research-harness/SKILL.md +43 -0
  330. package/skills/claude/atelier-skill-steward/SKILL.md +53 -0
  331. package/skills/claude/atelier-trackables/SKILL.md +40 -0
  332. package/skills/codex/atelier-build-harness/SKILL.md +59 -0
  333. package/skills/codex/atelier-coordination/SKILL.md +32 -0
  334. package/skills/codex/atelier-discovery-harness/SKILL.md +48 -0
  335. package/skills/codex/atelier-guided-upgrade/SKILL.md +29 -0
  336. package/skills/codex/atelier-interaction/SKILL.md +34 -0
  337. package/skills/codex/atelier-knowledge-harness/SKILL.md +60 -0
  338. package/skills/codex/atelier-knowledge-setup/SKILL.md +72 -0
  339. package/skills/codex/atelier-practical-judgment/SKILL.md +64 -0
  340. package/skills/codex/atelier-research-harness/SKILL.md +43 -0
  341. package/skills/codex/atelier-skill-steward/SKILL.md +53 -0
  342. package/skills/codex/atelier-trackables/SKILL.md +40 -0
  343. package/src/architecture/catalog.mjs +355 -0
  344. package/src/architecture/index.mjs +93 -0
  345. package/src/boundary/content-rules.mjs +4 -2
  346. package/src/boundary/delegation-command.mjs +158 -0
  347. package/src/boundary/delegation.mjs +396 -0
  348. package/src/boundary/policy.mjs +52 -10
  349. package/src/build/git.mjs +18 -0
  350. package/src/build/index.mjs +3 -0
  351. package/src/build/ledger.mjs +88 -0
  352. package/src/capabilities/adoption.mjs +381 -0
  353. package/src/capabilities/evidence.mjs +140 -0
  354. package/src/capabilities/files.mjs +124 -0
  355. package/src/capabilities/index.mjs +4 -0
  356. package/src/capabilities/instructions.mjs +250 -0
  357. package/src/capabilities/package.mjs +136 -0
  358. package/src/cli/command-failure.mjs +36 -0
  359. package/src/cli/execute-command.mjs +16 -2
  360. package/src/cli/run.mjs +65 -9
  361. package/src/coauthor/store.mjs +43 -2
  362. package/src/collaboration/proposals.mjs +189 -0
  363. package/src/commands/architecture.mjs +27 -0
  364. package/src/commands/boundary.mjs +3 -0
  365. package/src/commands/capability.mjs +73 -0
  366. package/src/commands/enroll.mjs +3 -0
  367. package/src/commands/harness.mjs +79 -0
  368. package/src/commands/ingest.mjs +39 -0
  369. package/src/commands/init.mjs +4 -1
  370. package/src/commands/inquiry.mjs +66 -0
  371. package/src/commands/knowledge-semantic.mjs +128 -0
  372. package/src/commands/knowledge.mjs +119 -0
  373. package/src/commands/learn.mjs +61 -0
  374. package/src/commands/obsidian.mjs +832 -62
  375. package/src/commands/practice.mjs +24 -0
  376. package/src/commands/setup.mjs +22 -2
  377. package/src/commands/trackable.mjs +19 -0
  378. package/src/contracts/corpus.mjs +36 -0
  379. package/src/coordination/index.mjs +110 -0
  380. package/src/egress/forbidden-egress.mjs +2 -0
  381. package/src/evidence-navigation/contracts.mjs +60 -0
  382. package/src/evidence-navigation/evaluate.mjs +69 -0
  383. package/src/evidence-navigation/generation.mjs +22 -0
  384. package/src/evidence-navigation/index.mjs +2 -0
  385. package/src/evidence-navigation/local.mjs +167 -0
  386. package/src/evidence-navigation/schema.generated.mjs +604 -0
  387. package/src/evidence-navigation/types.mjs +12 -0
  388. package/src/export/atelier-export-contract.mjs +35 -8
  389. package/src/graph/enroll.mjs +248 -0
  390. package/src/graph/graph.mjs +17 -1
  391. package/src/graph/knowledge-graph.mjs +58 -8
  392. package/src/harnesses/contracts.mjs +41 -0
  393. package/src/harnesses/exchange.mjs +154 -0
  394. package/src/harnesses/feedback.mjs +16 -0
  395. package/src/harnesses/history.mjs +37 -0
  396. package/src/harnesses/index.mjs +4 -0
  397. package/src/harnesses/store.mjs +29 -0
  398. package/src/ingestion/contracts.mjs +41 -0
  399. package/src/ingestion/evaluation.mjs +119 -0
  400. package/src/ingestion/optional/composition/index.mjs +171 -0
  401. package/src/ingestion/optional/evaluation/index.mjs +219 -0
  402. package/src/ingestion/optional/graphify/composition-binding.mjs +60 -0
  403. package/src/ingestion/optional/graphify/composition_receiving.py +185 -0
  404. package/src/ingestion/optional/graphify/graphify_supplier.py +933 -0
  405. package/src/ingestion/optional/graphify/json_bridge.py +163 -0
  406. package/src/ingestion/optional/graphify/query_receiving.py +209 -0
  407. package/src/ingestion/optional/index.mjs +9 -0
  408. package/src/ingestion/optional/jev/bridge.mjs +166 -0
  409. package/src/ingestion/optional/jev/composition-binding.mjs +116 -0
  410. package/src/ingestion/optional/jev/judgments.mjs +174 -0
  411. package/src/ingestion/optional/jev/native-translation.mjs +32 -0
  412. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/__init__.py +7 -0
  413. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/adapter.py +966 -0
  414. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/artifacts.py +101 -0
  415. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/projection.py +146 -0
  416. package/src/ingestion/optional/lightrag/composition-binding.mjs +67 -0
  417. package/src/ingestion/optional/vanilla/composition-binding.mjs +102 -0
  418. package/src/ingestion/optional/vanilla/index.mjs +218 -0
  419. package/src/ingestion/optional/vanilla/native-normalization.mjs +187 -0
  420. package/src/ingestion/processors.mjs +218 -0
  421. package/src/ingestion/semantic.mjs +203 -0
  422. package/src/ingestion/store.mjs +372 -0
  423. package/src/inquiry/beliefs.mjs +32 -0
  424. package/src/inquiry/contracts.mjs +23 -0
  425. package/src/inquiry/index.mjs +5 -0
  426. package/src/inquiry/ledger.mjs +135 -0
  427. package/src/inquiry/lenses.mjs +15 -0
  428. package/src/inquiry/projection.mjs +77 -0
  429. package/src/inquiry/store.mjs +35 -0
  430. package/src/intake/read-scope.mjs +12 -0
  431. package/src/intake/store.mjs +69 -6
  432. package/src/interaction/index.mjs +91 -0
  433. package/src/judgment/index.mjs +82 -0
  434. package/src/judgment/practice-evaluation.mjs +70 -0
  435. package/src/judgment/practice.mjs +144 -0
  436. package/src/knowledge/context.mjs +217 -0
  437. package/src/knowledge/index.mjs +5 -0
  438. package/src/knowledge/ingestion.mjs +79 -0
  439. package/src/knowledge/intake.mjs +33 -0
  440. package/src/knowledge/ledger.mjs +110 -0
  441. package/src/knowledge/participatory/guidance.mjs +36 -0
  442. package/src/knowledge/participatory/guided-contribution.mjs +44 -0
  443. package/src/knowledge/participatory/index.mjs +2 -0
  444. package/src/knowledge/participatory/installed-workshop.mjs +108 -0
  445. package/src/knowledge/plan.mjs +67 -0
  446. package/src/knowledge/projection.mjs +43 -0
  447. package/src/knowledge/semantic-operation.mjs +567 -0
  448. package/src/knowledge/sessions.mjs +467 -0
  449. package/src/knowledge/workspace.mjs +295 -0
  450. package/src/knowledge-health/assessment.mjs +165 -0
  451. package/src/knowledge-health/capabilities.mjs +350 -0
  452. package/src/knowledge-health/context.mjs +62 -0
  453. package/src/knowledge-health/example.mjs +47 -0
  454. package/src/knowledge-health/index.mjs +10 -0
  455. package/src/knowledge-health/owner-join.mjs +88 -0
  456. package/src/knowledge-health/proof/common.mjs +24 -0
  457. package/src/knowledge-health/proof/installed-check.mjs +100 -0
  458. package/src/knowledge-health/proof/native-readback.mjs +37 -0
  459. package/src/knowledge-health/proof/rehearse.mjs +68 -0
  460. package/src/knowledge-health/proof/validate-participant.mjs +17 -0
  461. package/src/knowledge-health/proof/verify-native-capture.mjs +14 -0
  462. package/src/knowledge-health/proof/workshop-check.mjs +36 -0
  463. package/src/knowledge-health/rule-identity.mjs +44 -0
  464. package/src/knowledge-health/workshop-composition.mjs +19 -0
  465. package/src/knowledge-health/workshop-profile.mjs +176 -0
  466. package/src/knowledge-health/workshop.mjs +99 -0
  467. package/src/learning/adapters.mjs +68 -0
  468. package/src/learning/assistance.mjs +127 -0
  469. package/src/learning/contracts.mjs +65 -0
  470. package/src/learning/store.mjs +272 -0
  471. package/src/personal-workspace/index.mjs +391 -0
  472. package/src/personal-workspace/selection.mjs +385 -0
  473. package/src/project/config.mjs +8 -0
  474. package/src/project/durable-state.mjs +3 -1
  475. package/src/project/file-class.mjs +1 -1
  476. package/src/project/private-state.mjs +10 -1
  477. package/src/projection/obsidian/contracts.mjs +224 -18
  478. package/src/projection/obsidian/edits/apply.mjs +63 -19
  479. package/src/projection/obsidian/edits/regions.mjs +137 -42
  480. package/src/projection/obsidian/materialize/index.mjs +6 -3
  481. package/src/projection/obsidian/materialize/path-registry.mjs +443 -57
  482. package/src/projection/obsidian/materialize/prepare-view.mjs +382 -131
  483. package/src/projection/obsidian/materialize/redaction.mjs +327 -0
  484. package/src/projection/obsidian/materialize/settings.mjs +113 -34
  485. package/src/projection/obsidian/personal-workspace.mjs +436 -0
  486. package/src/projection/obsidian/plugin-bridge/bundle.mjs +50 -0
  487. package/src/projection/obsidian/plugin-bridge/channel.mjs +174 -0
  488. package/src/projection/obsidian/plugin-bridge/index.mjs +10 -0
  489. package/src/projection/obsidian/proposals/adapter.mjs +47 -8
  490. package/src/projection/obsidian/proposals/observation.mjs +20 -7
  491. package/src/projection/obsidian/publication/bridge-script.mjs +11 -5
  492. package/src/projection/obsidian/publication/index.mjs +2 -1
  493. package/src/projection/obsidian/publication/publisher.mjs +312 -36
  494. package/src/projection/obsidian/publication/transport.mjs +63 -8
  495. package/src/projection/obsidian/publication/vault-list.mjs +200 -0
  496. package/src/projection/obsidian/recovery/index.mjs +4 -1
  497. package/src/projection/obsidian/recovery/restart.mjs +3 -1
  498. package/src/projection/obsidian/recovery/store.mjs +168 -8
  499. package/src/projection/obsidian/selection-ui/contribution.mjs +6 -5
  500. package/src/projection/obsidian/selection-ui/focus.mjs +14 -7
  501. package/src/projection/obsidian/selection-ui/selection-state.mjs +2 -2
  502. package/src/projection/obsidian/selection-ui/selection.mjs +8 -3
  503. package/src/readiness/readiness.mjs +10 -3
  504. package/src/reflection/index.mjs +56 -0
  505. package/src/runtime/obsidian/app-capability.mjs +104 -12
  506. package/src/runtime/obsidian/app-production-seams.mjs +161 -42
  507. package/src/runtime/obsidian/app-registration.mjs +313 -0
  508. package/src/runtime/obsidian/app-restart.mjs +154 -0
  509. package/src/runtime/obsidian/engine.mjs +288 -29
  510. package/src/runtime/obsidian/extension-points.mjs +1 -1
  511. package/src/runtime/obsidian/index.mjs +15 -8
  512. package/src/runtime/obsidian/launch-plan.mjs +91 -0
  513. package/src/runtime/obsidian/lifecycle.mjs +193 -22
  514. package/src/runtime/obsidian/login-item.mjs +332 -0
  515. package/src/runtime/obsidian/machine-settings.mjs +119 -12
  516. package/src/runtime/obsidian/opening.mjs +369 -63
  517. package/src/runtime/obsidian/pending-edits.mjs +10 -0
  518. package/src/runtime/obsidian/pipeline.mjs +71 -3
  519. package/src/runtime/obsidian/plugin-channel.mjs +289 -0
  520. package/src/runtime/obsidian/plugin-choice.mjs +182 -0
  521. package/src/runtime/obsidian/plugin-drift.mjs +124 -0
  522. package/src/runtime/obsidian/plugin-presence.mjs +61 -0
  523. package/src/runtime/obsidian/process-identity.mjs +20 -10
  524. package/src/runtime/obsidian/project-views.mjs +282 -0
  525. package/src/runtime/obsidian/questions.mjs +48 -0
  526. package/src/runtime/obsidian/release-watch.mjs +56 -0
  527. package/src/runtime/obsidian/service-main.mjs +113 -17
  528. package/src/runtime/obsidian/service-manager-production.mjs +61 -0
  529. package/src/runtime/obsidian/service-managers.mjs +275 -0
  530. package/src/runtime/obsidian/service-record.mjs +105 -5
  531. package/src/runtime/obsidian/service-server.mjs +50 -12
  532. package/src/runtime/obsidian/service.mjs +134 -7
  533. package/src/runtime/obsidian/startup-adapters.mjs +59 -21
  534. package/src/runtime/obsidian/state-store.mjs +13 -1
  535. package/src/runtime/obsidian/unheld-evidence.mjs +84 -0
  536. package/src/runtime/obsidian/vault-location.mjs +300 -0
  537. package/src/runtime/obsidian/view-counts.mjs +34 -0
  538. package/src/server/local-sidecar.mjs +193 -7
  539. package/src/server/server.mjs +45 -6
  540. package/src/template-bindings/project.mjs +92 -0
  541. package/src/templates/profile.mjs +225 -0
  542. package/src/trackables/domain.mjs +175 -0
  543. package/src/trackables/store.mjs +114 -0
  544. package/src/ui/knowledge-page.mjs +1388 -0
  545. package/src/upgrade/explanation.mjs +1 -1
  546. package/src/upgrade/template-participant.mjs +171 -0
  547. package/src/upgrade/transaction.mjs +72 -25
  548. package/src/upgrade/upgrade.mjs +2 -1
  549. package/templates/external-project-workspace/pack-lifecycle.json +6 -1
  550. package/templates/knowledge-workspace/.gitattributes +2 -0
  551. package/templates/knowledge-workspace/AGENTS.md +27 -0
  552. package/templates/knowledge-workspace/README.md +44 -0
  553. package/templates/knowledge-workspace/atelier.project.json +22 -0
  554. package/templates/knowledge-workspace/gitignore +6 -0
  555. package/templates/knowledge-workspace/knowledge-plan.json +111 -0
  556. package/templates/knowledge-workspace/knowledge-plan.schema.json +281 -0
  557. package/templates/knowledge-workspace/records/forecast.md +22 -0
  558. package/templates/knowledge-workspace/records/inspection.md +25 -0
  559. package/templates/knowledge-workspace/records/telescope.md +24 -0
  560. package/templates/knowledge-workspace/repo-access.v1.json +9 -0
@@ -0,0 +1,215 @@
1
+ # Learning from corrections and outcomes
2
+
3
+ The learning module records feedback in context, preserves proposals and human
4
+ decisions, and supplies explicitly activated lessons to a named harness. It is
5
+ an experimental local source capability. It requires consumer integration and
6
+ does not establish availability in a published package or installed desktop.
7
+
8
+ A person defines the task and scope, an agent can propose a lesson, and the
9
+ person reviews its wording and consequences. Evidence can be represented before
10
+ acceptance. Only accepted, activated content is eligible for task context.
11
+
12
+ ## Records and authority
13
+
14
+ Four kinds of records describe the main path:
15
+
16
+ 1. An **observation** preserves feedback or a tool outcome, its interpretation,
17
+ provenance reference, project and activity. Source digests are assertions
18
+ supplied by the caller; the store never follows a source reference. A null
19
+ digest explicitly represents unavailable original-byte verification.
20
+ 2. A **lesson proposal** names evidence observations, purpose, principle,
21
+ exceptions and a complete proposed artifact. Artifacts can be instructions,
22
+ skills, principles or descriptions of checks. Check artifacts are inert;
23
+ this module does not turn prose into executable validators.
24
+ 3. A **decision** accepts, rejects or defers one exact proposal digest. The
25
+ digest binds its artifact, scope and cited observation digests. Editing any
26
+ of them requires a new proposal and decision.
27
+ 4. An **activation** binds that decision and artifact to one harness. It makes
28
+ content eligible for subsequent context requests; it neither installs files
29
+ nor grants permissions. Withdrawal is a new record, preserving history.
30
+
31
+ The local CLI accepts an explicit actor assertion. It does not authenticate
32
+ people. A network or multi-user host must resolve actors from its own trusted
33
+ session and enforce access, capture consent and action capabilities before
34
+ calling the library. A field that says `human` is not authentication.
35
+
36
+ Scope always names an exact project. An activity can be an explicitly reviewed
37
+ `*`; context requests always name a concrete activity. There is no global
38
+ workspace-to-workspace inheritance. Only a local human actor may decide,
39
+ activate or withdraw. Capture and proposal creation never confer those powers.
40
+
41
+ Two active artifacts with the same kind and name and different content are
42
+ withheld when their scopes overlap the requested activity. The context result
43
+ explains the conflict. This deterministic slot check does not establish that
44
+ differently named lessons are semantically compatible.
45
+
46
+ ## CLI workflow
47
+
48
+ Run inside the intended Git workspace with `.atelier-local/` ignored and
49
+ untracked. The existing `atelier setup` command can prepare local state for an
50
+ adopted project. Every command reads a JSON object from stdin, up to 256 KiB,
51
+ and prints JSON. Keep request and export files private.
52
+
53
+ For `capture`, `propose`, `decide`, `activate` and `withdraw`, the envelope is:
54
+
55
+ ```json
56
+ {
57
+ "workspaceId": "sample-workspace",
58
+ "actor": { "id": "local-owner", "kind": "human" },
59
+ "requestId": "capture-one",
60
+ "expectedRevision": 0,
61
+ "input": {
62
+ "id": "observation-one",
63
+ "signal": "user-correction",
64
+ "text": "Put shortages first in the inventory summary.",
65
+ "interpretation": "explicit",
66
+ "scope": { "project": "sample-project", "activity": "inventory-summary" },
67
+ "source": { "ref": "manual-user-entry", "digest": null }
68
+ }
69
+ }
70
+ ```
71
+
72
+ Pass this to `atelier learn capture`. Use the returned revision for the next
73
+ write and a new request identifier. Retrying identical request bytes and actor
74
+ returns the original receipt. Reusing an identifier for changed content refuses.
75
+ A stale revision requires reloading and reviewing the current state.
76
+
77
+ The subsequent command inputs are:
78
+
79
+ | Command | Input |
80
+ | --- | --- |
81
+ | `propose` | `id`, `title`, `principle`, `rationale`, `exceptions`, `evidenceIds`, `scope`, `artifact: {kind, name, content}`; optional `supersedes` |
82
+ | `decide` | `lessonId`, returned `lessonDigest`, `verdict: accepted/rejected/deferred`, `reason` |
83
+ | `activate` | New activation `id`, `lessonId`, `lessonDigest`, returned `decisionId`, `harnessId` |
84
+ | `withdraw` | `activationId`, `reason` |
85
+
86
+ For a proposal, an example complete artifact is:
87
+
88
+ ```json
89
+ {
90
+ "kind": "instruction",
91
+ "name": "inventory-summary",
92
+ "content": "For inventory summaries, list shortages before storage locations."
93
+ }
94
+ ```
95
+
96
+ An exception such as “A location audit can lead with storage locations” stays
97
+ beside the artifact in selected context. Skill artifacts contain the complete
98
+ reviewed text; rendering never asks a model to add unreviewed steps.
99
+
100
+ Read commands take `{"workspaceId":"sample-workspace"}`:
101
+
102
+ - `atelier learn list` returns current records and activation states.
103
+ - `atelier learn graph` returns a private graph with typed evidence, proposal,
104
+ decision, activation and withdrawal nodes and their relationships.
105
+ - `atelier learn plan` groups pending evidence by exact scope and suggests a
106
+ processing route. Counts are not independent corroboration or promotion rules.
107
+ - `atelier learn export` returns a digest-bound private history archive. There
108
+ is no automatic send path, canonical graph enrollment or trusted import.
109
+
110
+ `render` and `context` also require a `query`. A render query is
111
+ `{"lessonId":"lesson-one","lessonDigest":"<digest returned by propose>"}`.
112
+ A context query is:
113
+
114
+ ```json
115
+ {
116
+ "workspaceId": "sample-workspace",
117
+ "query": {
118
+ "scope": { "project": "sample-project", "activity": "inventory-summary" },
119
+ "harnessId": "sample-harness"
120
+ }
121
+ }
122
+ ```
123
+
124
+ Pass it to `atelier learn context` at each new task boundary. The response
125
+ includes applicable artifacts, source provenance and exceptions. Proposed,
126
+ rejected, deferred, withdrawn and superseded material is not active guidance.
127
+ The harness remains responsible for instruction hierarchy and actual tool
128
+ permission enforcement. Withdrawing a lesson affects future context selection;
129
+ it cannot erase content a running model already received.
130
+
131
+ An application outcome can be captured with `lessonId` to link subsequent
132
+ feedback back to the lesson. Revision uses a new proposal with `supersedes`.
133
+ The replacement must retain the exact scope and artifact slot. Acceptance alone
134
+ does not replace active content; activating the accepted replacement retires the
135
+ previous activation in that harness atomically. Changing an active lesson's
136
+ decision requires withdrawing its active bindings first.
137
+
138
+ ## Persistence and recovery
139
+
140
+ Private state lives under `.atelier-local/learning`. Immutable events retain a
141
+ content digest, previous digest, request, actor assertion and resulting record.
142
+ Existing private-state helpers provide containment, no-follow regular-file
143
+ checks, exclusive writer ownership and non-overwriting durable publication.
144
+ On POSIX, directories and event files use restrictive `0700` and `0600` modes.
145
+ Windows uses account ACLs; POSIX mode bits do not establish Windows access
146
+ control. The hosting account or application must protect workspace access.
147
+ Ignored Git state prevents accidental enrollment, not access by other local
148
+ users.
149
+ Replay verifies the chain and transitions; projections are rebuilt from it.
150
+
151
+ There are explicit input, event-count and journal-byte ceilings. Unknown files,
152
+ missing events, broken chains and corrupt records refuse. Pending staging files
153
+ are not committed events. A lost reply after a durable write can be reconciled
154
+ by retrying exactly the same request. No automatic compaction or destructive
155
+ history repair occurs. Export before capacity maintenance; do not truncate
156
+ history to make an error disappear.
157
+
158
+ Admission reserves one event and the maximum valid event size for every active
159
+ binding that would remain after the write. Ordinary writes also preserve a
160
+ minimum maintenance margin. This can refuse a new activation before the journal
161
+ is full, ensuring every existing activation retains room for withdrawal.
162
+ Withdrawal consumes its own reservation while preserving the others. This is a
163
+ journal-capacity guarantee; filesystem failure or lost disk space can still
164
+ prevent a durable write.
165
+
166
+ Digests prove internal consistency against the retained bytes, not that an
167
+ authorized person authored them. An owner with filesystem write access can
168
+ replace local state. Multi-user trust and signed admission require independent
169
+ host authority. Retention or deletion of source material must also account for
170
+ private learning text and exports; a source reference is not a deletion policy.
171
+
172
+ ## Optional assistance and compatibility
173
+
174
+ `@mnstry/atelier/learning/assistance` provides mechanical work planning, exact
175
+ bounded evidence batches and a proposal-only adapter driver. The host supplies
176
+ the selected adapter, its qualification evidence, authorization for the exact
177
+ payload and adapter version, and durable budget reservation and settlement.
178
+ The driver makes at most one adapter call for an admitted attempt. Unknown
179
+ completion is retained as unknown; there is no fallback or automatic retry.
180
+ Invalid responses still settle their returned attempt. Unknown usage remains
181
+ unknown. Cancellation, time limits, provider credentials and budget persistence
182
+ belong to the injected host. Tests qualify the adapter contract with synthetic
183
+ implementations; they do not qualify any real model.
184
+
185
+ Returned drafts still need ordinary `propose`, human decision and activation.
186
+ No expensive model pass is required for capture, integrity checks, grouping,
187
+ context selection, rendering, export or withdrawal. Stronger reasoning can be
188
+ reserved for exceptions and conflicting interpretations.
189
+
190
+ `@mnstry/atelier/learning/adapters` converts an existing skill-observation
191
+ receipt into a tool-attributed observation. The original feedback words remain
192
+ explicitly unavailable. A legacy lesson can become a fresh proposal with
193
+ caller-selected local evidence and scope; old acceptance and activation never
194
+ transfer. The existing `atelier feedback` support-report command and
195
+ proposal-only `atelier-claim@v1` contract keep their original meaning.
196
+
197
+ ## Public foundation and hosts
198
+
199
+ The open-source package owns the portable records, validation, local store,
200
+ CLI, evidence graph, context selection, inert rendering and conformance cases.
201
+ Campaigns may stay in their own workspaces; selected references do not change
202
+ their writer ownership. Private evidence projections stay outside committed
203
+ canonical graphs unless an owner explicitly authors an appropriate source.
204
+
205
+ A desktop or other host owns integrated capture, authenticating its caller,
206
+ background jobs, provider access, budgets, review controls and actual harness
207
+ integration. Private feedback, preferences, methods and authored skills remain
208
+ in their owning workspace. A commercial host should consume these contracts
209
+ without making basic local learning or export depend on an account.
210
+
211
+ Run `node --test test/learning-*.test.mjs` on the supported Node version for
212
+ the local acceptance cases. They cover terminal capture through withdrawal
213
+ across process restarts, concurrent/stale writes, source and decision binding,
214
+ conflicts, supersession, retention of history, adapter budgets and refusal paths.
215
+ Installed desktop behavior and real-model quality require their own evidence.
@@ -145,8 +145,9 @@ explicit consent that names its actor.
145
145
  | --- | --- | --- | --- |
146
146
  | Health | `GET /health` | none | service name, workspace identity, runtime identifier, PID, loopback host and port, executable digest, start time, status |
147
147
  | Status | `GET /status` | bearer | the health fields, loop state, last tick, last error code, and per-view freshness with held notes counted, not named |
148
- | Tick now | `POST /tick` | bearer | the state of the tick that ran |
148
+ | Tick now | `POST /tick` | bearer | the state of the tick that ran. The body may also name one view (`scopeId`, a contract identifier), which that tick prepares and publishes once more, asking the app again |
149
149
  | Stop | `POST /stop` | bearer | an acknowledgement naming the runtime and PID, then the service ends |
150
+ | Plugin challenge, hello, lease, release, status | `POST /plugin/challenge`, `/plugin/hello`, `/plugin/lease`, `/plugin/release`, `/plugin/status` | a handshake over one vault's key, which never crosses the wire | Atelier's Obsidian plugin inside that vault: presence and read-only status of that one view ([obsidian-plugin.md](obsidian-plugin.md)) |
150
151
 
151
152
  Health carries no path, no note title, no source name and no withheld
152
153
  identity. There is no other operation: no file serving, no command, no
@@ -159,13 +160,29 @@ The listener refuses a request before looking its operation up when:
159
160
  also refuses a name that resolves to loopback;
160
161
  - `Sec-Fetch-Site` is present and is neither `none` nor `same-origin`, or
161
162
  `Origin` is present and is not the listener itself;
162
- - the path is not one of the four, exactly and without a query, or the method
163
+ - the path is not one of the nine, exactly and without a query, or the method
163
164
  is not that path's method.
164
165
 
165
166
  Status, tick and stop additionally refuse without the bearer of the running
166
167
  runtime. A `POST` payload is a JSON object of at most 1 KiB that names the
167
168
  runtime identifier it is meant for, so a request aimed at an earlier runtime on
168
- the same port does nothing.
169
+ the same port does nothing (409, `request-names-another-runtime`). A tick may
170
+ also name one view by its `scopeId`, which must be a contract identifier as
171
+ the scope contract defines it (400, `request-invalid`); any other member, and a
172
+ `scopeId` on a stop, is refused (400, `request-member-unknown`). A refused
173
+ request runs nothing.
174
+
175
+ The plugin commands carry no credential in a header, and refuse one. The key
176
+ of a vault the workspace maintains is random per view and kept owner-only in
177
+ private state and in that vault's plugin data file; it never crosses the
178
+ wire. The service answers a challenge only for a key it holds, with a proof
179
+ over its own exact address, before the plugin sends anything that names the
180
+ vault; the plugin then proves the same key, and every later command and answer
181
+ is sealed with a key for that session, with a counter that only goes up. What
182
+ a session grants is the plugin commands for that one view and nothing else:
183
+ the runtime bearer is not accepted there, and a vault's key is not accepted by
184
+ status, tick or stop. A plugin payload is a JSON object of at most 1 KiB with
185
+ exactly the fields of its command.
169
186
 
170
187
  ### Status values and refusal cases
171
188
 
@@ -178,8 +195,9 @@ the same port does nothing.
178
195
  | `stale-record` | the recorded address is closed and the recorded PID is gone | starts; the new service replaces the record once it listens | refuses; nothing is proven to stop |
179
196
  | `pid-not-ours` | the recorded address is closed and a process has the recorded PID (the number was reused, or a process outlived its listener) | starts; that PID is never signalled | refuses; that PID is never signalled |
180
197
 
181
- `start` is serialized per workspace, spawns the service without a shell, and
182
- detaches it only when asked for a service that survives the launching command.
198
+ `start` is serialized per workspace, spawns the service without a shell, in
199
+ the root directory rather than the one the command runs in, and detaches it
200
+ only when asked for a service that survives the launching command.
183
201
  It waits for health to echo the runtime identifier it generated and the PID of
184
202
  the child it created. If that proof never arrives it stops only that child, by
185
203
  its process handle, and reports the private operational log,
@@ -198,6 +216,39 @@ to end and removes only the generated record. It never looks a process up by
198
216
  port, name or pattern. Ending a proven runtime that ignores the request is
199
217
  opt-in and is proven again immediately before the signal.
200
218
 
219
+ A runtime of an earlier release is replaced by a command that asks for a tick
220
+ with the start options of the installed entry (`requestServiceTick({ service
221
+ })`; `open` does). Every runtime records at its start the release it runs
222
+ (`executable.ext.release` in its record): the package version and a digest of
223
+ every runtime module it ships (`src/` and `contracts/`, by path and content),
224
+ and of the plugin it publishes into every vault (`plugins/`; none where a
225
+ package has no such folder).
226
+ A runtime of an earlier release proves itself `healthy` but records an earlier
227
+ version than this package's, this version with an entry module or modules of
228
+ other content, or no release at all (releases up to the one that began
229
+ recording it); or it refuses a tick that names a view, as releases up to
230
+ 0.2.0-alpha.11 do (their `POST` payload has exactly one member). Versions are
231
+ ordered as semantic versions, a prerelease below its release
232
+ (`0.2.0-alpha.11` < `0.2.0-alpha.12` < `0.2.0`; `releaseStanding` in
233
+ `lifecycle.mjs`). It is stopped as `stop` stops it and the installed entry is
234
+ started, detached, under the consent already recorded; the answer carries
235
+ `restarted: "outdated"`, and `open` shows `service: restarted (outdated)`. A
236
+ runtime that records a later version, or another version that cannot be
237
+ ordered against the installed one, is never
238
+ replaced by this release, nor asked for the tick: the answer is
239
+ `service-other-release` (`open`: `service-unavailable`, with the next step
240
+ `atelier obsidian service stop`, then open again). So two installations used
241
+ on one workspace, a global and a project-local one for example, do not replace
242
+ each other's runtime on every open; within one version, other content is
243
+ replaced. The same version string is compared by content even when it cannot
244
+ be ordered (a fork's `dev`, say), so the runtime `open` just started is always
245
+ this release and "service stop, then open" cannot loop. A listener of now refuses a tick only when it names another runtime,
246
+ which happens when a concurrent command replaced the runtime between the check
247
+ and the request: the record is read again, the runtime that took its place is
248
+ asked, and nothing is restarted. A `busy` runtime is not stopped, and anything
249
+ that is not a proven runtime of this workspace is never stopped. Without the
250
+ start options the runtime is only reported (`service-outdated`).
251
+
201
252
  The service itself refuses to start beside a runtime of the same workspace
202
253
  that proves itself, and ends cleanly when its record no longer names it. Two
203
254
  engines can never tick one workspace together: each tick holds a private
@@ -231,15 +282,153 @@ proceeds.
231
282
  accepts a connection and does not answer in time proves nothing.
232
283
  `inspectPrivateGenerationLock` reports the holder without changing anything.
233
284
 
234
- ### Operating-system startup
285
+ ### Operating-system startup: the login item
235
286
 
236
287
  `buildStartupAdapter` returns the text of a launchd user agent (macOS) or a
237
288
  systemd user unit (Linux) from the values it is given. It writes no file,
238
289
  installs nothing, runs no service manager and looks nothing up on the machine.
239
290
  Windows startup has not been qualified and refuses with
240
- `startup-platform-unqualified`. Installing a unit is a separate system change
241
- that needs explicit user authorization; the service refuses to run with
242
- `--startup` unless the recorded consent covers startup.
291
+ `startup-platform-unqualified`. The unit runs the service entry with
292
+ `--startup` in the root directory, with the search path it is given, and is
293
+ restarted after a crash or a non-zero exit but never after a clean one:
294
+
295
+ | Key | launchd | systemd |
296
+ | --- | --- | --- |
297
+ | Program | `ProgramArguments`: Node, the entry, `--startup`, `--project`, `--data-root`, `--workspace-id`, `--adapter` | `ExecStart`, the same words |
298
+ | Search path | `EnvironmentVariables` `PATH` | `Environment="PATH=…"` |
299
+ | Directory | `WorkingDirectory` `/` | `WorkingDirectory=/` |
300
+ | Start | `RunAtLoad` | `WantedBy=default.target` |
301
+ | Restart | `KeepAlive` `SuccessfulExit` false, `ThrottleInterval` 60 | `Restart=on-failure`, `RestartSec=60`, `RestartPreventExitStatus=2` |
302
+ | Stop | `ExitTimeOut` 60 (a tick in flight gets 30 s) | `TimeoutStopSec=60` |
303
+ | Process type | `Standard`: the service's budgets were measured without background I/O throttling | – |
304
+ | Output | `StandardOutPath`, `StandardErrorPath`: `state/service/login-item.log` | `StandardOutput`, `StandardError`: `append:` the same file |
305
+
306
+ Installing one is an explicit request (`service unit --install`), never a
307
+ side effect (`src/runtime/obsidian/login-item.mjs`):
308
+
309
+ 1. The entry is the one of the package installed for the project, found as
310
+ Node finds a package from the project's folder and named by that path,
311
+ not its real path, so an upgrade or a re-pointed link is what the next
312
+ start runs. Without one, the command's own package is used unless it lies
313
+ in a package runner's cache (npx, pnpm dlx, bunx) or a temporary folder:
314
+ `login-item-needs-installed-package`. Node is named by its real path, so a
315
+ version manager's per-shell link is never named. The search path keeps
316
+ absolute entries once, and none in a temporary folder. The unit always
317
+ names the data root the workspace was resolved under (the flag, the
318
+ pointer, the overlay's preference or the platform default, such as
319
+ `$XDG_DATA_HOME/atelier`) and the workspace identity, because the
320
+ manager's environment carries only the search path: the service at login
321
+ finds the same workspace, and, when the project no longer leads to it (it
322
+ moved, or its pointer is gone), records its refusal in the workspace the
323
+ unit names, if that exists.
324
+ 2. The consent is recorded before the unit is loaded, because the manager
325
+ starts the service as soon as it loads it: `--consent-actor ID`; for a
326
+ person at a terminal, the actor already recorded for the workspace or else
327
+ the account's name (asking for the login item there is that person's
328
+ consent); or a recorded consent that already covers startup. Otherwise
329
+ `startup-consent-required`. Its coverage becomes `service-and-startup`.
330
+ A proven service of an earlier release than the entry the unit will run
331
+ is stopped then, as `service stop` stops it, so the unit's own start at
332
+ load runs that entry instead of refusing beside the earlier one; if the
333
+ manager then refuses the unit, the entry is started as a child for this
334
+ session.
335
+ 3. The injected service manager (`service-managers.mjs`) writes the unit
336
+ atomically with mode 0644 and loads it. launchd: bootout of a loaded job
337
+ (it keeps the definition it was loaded with), a bounded wait until launchd
338
+ lets it go, then `bootstrap gui/<uid>`. systemd: `daemon-reload`, `enable`.
339
+ A unit file written where none was is removed again when the manager
340
+ does not take it, since launchd loads every property list in
341
+ `~/Library/LaunchAgents` at login.
342
+ A manager that refuses the unit takes the consent back to the one recorded
343
+ before; when none was, the consent just recorded stays for the actor, but
344
+ covers the service alone.
345
+ 4. `state/service/login-item.json` (`atelier-obsidian-login-item/v1`) records
346
+ the label, allocated once and kept, the unit file, the digest of its text,
347
+ the program and the search path. The answer is remembered as the
348
+ `loginItem` decision of the machine settings (`on`), by the actor named or
349
+ the person at the terminal; `--adapter=obsidian-cli`, when given, is
350
+ remembered as for `service start`.
351
+
352
+ The production manager (`service-manager-production.mjs`) is the only code
353
+ that runs `launchctl` or `systemctl` or writes into `~/Library/LaunchAgents`
354
+ or the user's systemd folder. It is imported only by the command entry, and
355
+ refuses under the Node test runner (`real-login-item-under-test`) and when
356
+ HOME is not the account's own home directory (`login-item-home-mismatch`):
357
+ a unit is registered in the account's real session whatever HOME says, so a
358
+ private HOME never installs one.
359
+
360
+ Once installed, `startService` starts the service through the manager
361
+ (`launchctl kickstart -p`, `systemctl --user start`) instead of spawning a
362
+ child, so two starts never compete, and accepts the runtime that proves itself
363
+ with a record naming the digest of the entry the unit runs; the runtime
364
+ identifier is the service's own there. As for a child, it waits for that
365
+ runtime to be healthy and answers `busy` only when the wait is over and the
366
+ runtime is still in its first tick. A listener that has not written its
367
+ record yet is waited for as that service, never adopted. On the way, a unit
368
+ whose text differs from what would be written now, keeping the recorded
369
+ search path, is written and loaded again (`loginItem: { refreshed: true }`).
370
+ The manager is asked first whether the person switched the item off (System
371
+ Settings on macOS, `systemctl --user disable` on Linux); one that is off is
372
+ neither written again, reloaded, enabled nor started through the manager
373
+ (`login-item-switched-off`). A unit that is switched off, whose file is gone,
374
+ or that the manager does not have loaded (no user systemd), is not forced: a
375
+ child is started for that command only, and the answer says why (`loginItem:
376
+ { via: 'child', reason }`). `requestServiceTick` replaces an outdated service the same way,
377
+ and so does `startService` with `replaceOutdated` (`service start`): a proven
378
+ runtime of an earlier release is stopped through its own listener, under the
379
+ start lock, and the installed entry started in its place
380
+ (`replaced: 'outdated'`); one of a later release is left running and
381
+ answered as `release: 'later'`.
382
+
383
+ Which release is installed is read from the entry that would be started
384
+ (`runtimeRelease`): the digest of that entry, and `readReleaseIdentity({
385
+ root })` of the package that entry's path names (its root is the folder above
386
+ `src/runtime/obsidian/service-main.mjs`, read without resolving links), read
387
+ now and never cached. With a login item that is the project's own package,
388
+ whatever package the command runs from, and a re-pointed link or a `file:`
389
+ install is read where it leads now. An entry that is not a package's service
390
+ entry (a test entry) is measured against this package's own release,
391
+ `releaseIdentity()`, the cached form a service records when it starts. Both
392
+ cover the package version and every file under `src/`, `contracts/` and
393
+ `plugins/`; a package without `plugins/` reads as one with an empty one.
394
+
395
+ Under `--startup` the service:
396
+
397
+ - writes its log into its own bounded `service.log`, as under `start`; the
398
+ unit's output file receives only what happens before that log is open;
399
+ - exits 0 on a refusal as well (another runtime of this workspace answers, no
400
+ consent that covers startup, an occupied port, arguments it cannot use), so
401
+ its manager does not start it again every minute, and records how the start
402
+ ended in `state/service/last-startup.json`
403
+ (`atelier-obsidian-last-startup/v1`: `at`, `outcome` `started` or
404
+ `refused`, `code`); `status` reports a refusal while the service is not
405
+ running. A refusal here is any error that carries a code, Node's system
406
+ errors included (`EACCES`, `EADDRNOTAVAIL` or `EMFILE` from listening,
407
+ `EPERM` where macOS privacy settings deny a folder): those, too, wait for
408
+ the next login or `open` instead of a restart every minute. Only an error
409
+ without a code exits 1 and is restarted;
410
+ - records the path it was started by beside its real path
411
+ (`executable.ext.invokedAs`), so the busy proof reads a process table that
412
+ names the entry through a link;
413
+ - after every tick, compares the release on disk, read through the path it
414
+ was started by, with the one it started with (`readReleaseIdentity`: the
415
+ package version and a digest of every file under `src/`, `contracts/` and
416
+ `plugins/`). The files' status is
417
+ compared first and the digest computed only when that differs; a package
418
+ that cannot be read is not a change yet. When they differ, the service
419
+ finishes the tick, removes its record and exits 75, which its manager
420
+ restarts on the new release.
421
+
422
+ `service unit --remove` lowers the consent to the service alone first, so a
423
+ unit a failed removal left behind could only refuse, then unloads it (launchd
424
+ `bootout`, systemd `disable --now`, which stop a service it runs) and deletes
425
+ the file and the record, and remembers `off`. It then starts the service again
426
+ at once as a detached child for this session, under the consent now recorded,
427
+ when the adapter is given or remembered; otherwise the next `open` starts it.
428
+ `uninstall` removes the login item and stops the proven service, remembers
429
+ `off`, starts nothing, and keeps the vaults, the private state, the project
430
+ file and Obsidian's vault list. Removing Obsidian's vault entries is not part
431
+ of it.
243
432
 
244
433
  The service entry refuses to run without an explicitly selected editor
245
434
  adapter. Public Atelier tests start only a test entry whose adapter reports
@@ -247,45 +436,72 @@ that no app runs, in temporary directories, on ephemeral loopback ports.
247
436
 
248
437
  ### The `obsidian` command
249
438
 
250
- `atelier obsidian <operation>` is the noninteractive surface over all of the
251
- above. With `--json` it prints exactly one JSON document, for a refusal too.
439
+ `atelier obsidian <operation>` is the command-line surface over all of the
440
+ above. Every input is an argument. With `--json` it prints exactly one JSON
441
+ document, for a refusal too.
252
442
  Exit codes: 0 done, 1 an error nobody typed, 2 a typed refusal or a usage
253
443
  error, 3 the operation ran and its answer is not success.
254
444
 
255
445
  | Operation | What it does | Writes |
256
446
  | --- | --- | --- |
257
- | `status` | enablement, machine settings, proven service state, per-view freshness, whether an apply operation exists | nothing |
258
- | `scope list`, `scope show ID` | the declared views | nothing |
259
- | `audience show`, `audience set A,B`, `audience clear` | the audiences this machine lets into a view; none by default, which publishes an empty view. A change invalidates every view at the next tick | private machine settings |
447
+ | `status` | enablement, machine settings, what was decided, proven service state, per-view freshness with its diagnostics (a code, the rule and the in-view note concerned, never a value; see [the Obsidian contract](obsidian-contract.md#notes-that-were-laid-out-anyway)), whether an apply operation exists | nothing |
448
+ | `settings` | what this machine remembers for the workspace (who may see, where vaults live, start at login, the adapter), who allowed the service, and how each answer is changed | nothing |
449
+ | `scope list`, `scope show ID` (also `view list`, `view show ID`) | the declared views | nothing |
450
+ | `view add ID (--all \| --folder PATH [--folder PATH ...] [--repo R] \| --tag T) [--expand DEPTH:MAX] [--default] [--allow-empty] [--yes]` | adds a view to the project configuration, after showing the change and how many notes the view would show; refuses a view that would show no note unless `--allow-empty` (see [Adding a view](obsidian.md#adding-a-view)) | `atelier.project.json`, and `.gitignore` when `.atelier-local/` is not ignored. Never committed |
451
+ | `audience show`, `audience set me\|A,B`, `audience clear` | the audiences this machine lets into a view; none by default, which publishes an empty view. `me` is only you: every audience but `sensitive`, which is added by name. The answer is remembered as the person's decision. A change invalidates every view at the next tick | private machine settings |
452
+ | `location show`, `location set DIR [--allow-synced-location]` | where this workspace's vaults live; each view not published yet gets `<project> (<view>)` there at its first publication, and a vault published already stays where it is | private machine settings |
260
453
  | `mode show`, `mode set manual\|automatic` | `automatic` refuses without an installed, matching, active automatic policy | private machine settings |
261
454
  | `policy show`, `policy install FILE`, `policy revoke` | `install` validates against the apply-policy contract and stores the policy owner-only beside the machine settings, never in a project, a repository or a note. `revoke` marks the stored policy revoked, which the engine reads before its very next dispatch, and returns the mode to manual | private machine settings |
262
- | `service start`, `service status`, `service stop` | `startService`, `serviceStatus`, `stopService`. The first start needs `--consent-actor ID` | what the lifecycle writes |
263
- | `service unit --print` | the text `buildStartupAdapter` returns. Installing a unit is not offered | nothing |
264
- | `open [--scope ID]` | starts or reconnects the owned service, asks it for a tick, reads the view back, qualifies the installed app, has the vault opened | what the service writes |
455
+ | `service start`, `service status`, `service stop` | `startService`, `serviceStatus`, `stopService`. The first start records who allowed it: `--consent-actor ID`, or for a person at a terminal the account's name. `service start` replaces a proven service of an earlier release (`replaced: 'outdated'`) and never one of a later release (`release: 'later'`); with a login item it starts the service through it | what the lifecycle writes |
456
+ | `service unit --print` | the text `service unit --install` would write now | nothing |
457
+ | `service unit --install` | installs the login item and starts the service through it (see above). macOS and Linux | the service settings (consent), the unit file, `login-item.json`, the `loginItem` decision |
458
+ | `service unit --remove` | lowers the consent to the service alone, unloads and deletes the unit, and starts the service again as a detached child for this session | the service settings, the unit file, `login-item.json`, the `loginItem` decision |
459
+ | `uninstall` | removes the login item, stops the proven service, and prints where the vaults, the private state, the project file and Obsidian's vault list are; each is kept, and nothing is started again | the login item's files, the `loginItem` decision |
460
+ | `open [--scope ID]` | starts or reconnects the owned service, asks it for a tick, reads the view back, qualifies the installed app, makes the app know the vault (through the app while it runs; in its settings while none runs), has the vault opened, and asks again for a view the app kept from publication | what the service writes; the app's vault list (see [Obsidian's vault list](obsidian-contract.md#obsidians-vault-list)) |
265
461
 
266
462
  Reaching the installed app or the operating system is never a default.
267
463
  `open`, `service start` and `service unit` refuse with
268
- `app-adapter-not-selected` unless `--adapter=obsidian-cli` is given, the same
269
- explicit rule the service entry has, and the modules that talk to an app are
270
- loaded only after that check. Tests pass their own seams and a guard in the
464
+ `app-adapter-not-selected` unless `--adapter=obsidian-cli` is given, or was
465
+ given once before to `open` or `service start` of this workspace, which
466
+ remembers it (`selectAdapter`); `service unit --install` refuses the same way.
467
+ The service entry keeps its own explicit rule. The modules that talk to an app
468
+ are loaded only after that selection. A remembered adapter is used only by the
469
+ real command-line entry and never under the Node test runner
470
+ (`remembered-adapter-under-test`). A service manager is the caller's
471
+ (`serviceManager`, or `seams.serviceManager`), or, for the real command-line
472
+ entry only, the production one. Tests pass their own seams and a guard in the
271
473
  test file throws if anything tries to start the app, its command-line tool, an
272
- operating-system opener or a service manager.
474
+ operating-system opener or a service manager, touches the account's real
475
+ LaunchAgents or systemd folder, or starts the `obsidian` command's `open` or
476
+ `service` outside the test runner's context with an environment that leads to
477
+ the developer's app.
478
+
479
+ A person at a terminal is asked one thing, by `view add` only: whether to
480
+ write the change it shows to a file they commit. `--yes` answers beforehand,
481
+ and a question gets no answer after 10 minutes, which writes nothing. The
482
+ first start of the maintenance service records the account's name as the
483
+ actor that allowed it when no `--consent-actor` is given. A person is at a
484
+ terminal when standard input and output are both terminals and neither
485
+ `--json`, `--no-input`, a `CI` environment nor `ATELIER_NONINTERACTIVE=1`
486
+ says otherwise (`isInteractive`); under the test runner the process's own
487
+ terminal is never looked at. A recorded consent is never replaced by a derived
488
+ one.
273
489
 
274
490
  `open` answers one typed outcome, each with a one-line explanation and a next
275
491
  step. Only `current` is success:
276
492
 
277
493
  | Outcome | Meaning |
278
494
  | --- | --- |
279
- | `current` | the proven service ticked after the request; the view's persisted freshness is `current`; read back independently, the trusted generation is the prepared one and every note has the bytes it was published with; the app meets the minimum version, was asked to open this vault, answers for exactly this vault and has finished reading it |
495
+ | `current` | the proven service ticked after the request; the view's persisted freshness is `current`; read back independently, the trusted generation is the prepared one and every note has the bytes it was published with; the app meets the minimum version, knows this vault as one of its vaults, was asked to open it, answers for exactly this vault and has finished reading it |
280
496
  | `updating` | a publication is under way, a tick outlasted the wait, or a note differs from the trusted generation and has not been looked at yet |
281
497
  | `held-for-your-edit` | an edited note is preserved and held |
282
498
  | `stale-readable` | a last good vault exists and reads back, but is not proven to be the present generation |
283
- | `not-prepared` | no generation of this view has been published |
499
+ | `not-prepared` | no generation of this view can be read back: none was published yet, or its vault cannot be found or used (the reason says which) |
284
500
  | `publisher-conflict` | another publisher or an uncoordinated editor holds the vault |
285
- | `app-missing`, `app-cli-unavailable`, `app-version-unsupported` | no installation; no command-line capability; below the minimum version, or a version that cannot be read (reason `no-vault-open` when the app runs with no vault open and its command line answers nothing else) |
286
- | `launch-failed` | the operating system refused, or the app never answered for this vault |
501
+ | `app-missing`, `app-cli-unavailable`, `app-version-unsupported` | no installation; no command-line capability, or the command line turned off in Obsidian (`cli-turned-off`); below the minimum version, or a version that cannot be read (reason `no-vault-open` when the app runs with no vault open and its command line answers nothing else) |
502
+ | `launch-failed` | the vault could not be added to the app's list (a typed reason names why), the operating system refused, or the app never answered for this vault |
287
503
  | `indexing` | the app answers for this vault and has not finished reading it |
288
- | `service-unavailable` | the service could not be started or is not provably ours (`occupied`, no consent yet, a start that never proved ownership) |
504
+ | `service-unavailable` | the service could not be started or is not provably ours (`occupied`, no consent yet, a start that never proved ownership), or it runs a later release than this command (`service-other-release`) |
289
505
  | `busy` | the service is ours and in a long tick |
290
506
  | `disabled` | the integration is off or not declared |
291
507