@mnstry/atelier 0.2.0-alpha.12 → 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 (516) hide show
  1. package/CHANGELOG.md +661 -0
  2. package/README.md +142 -6
  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-personal-workspace-manifest.v1.schema.json +87 -0
  21. package/contracts/atelier-personal-workspace-overlay.v1.schema.json +299 -0
  22. package/contracts/atelier-template-adoption.v1.schema.json +223 -0
  23. package/contracts/atelier-template-profile.v1.schema.json +1168 -0
  24. package/contracts/atelier-trackable.v1.schema.json +781 -0
  25. package/contracts/atelier-upgrade-plan.v3.schema.json +532 -0
  26. package/docs/architecture.md +89 -0
  27. package/docs/assurance-controls.md +2 -2
  28. package/docs/blocks/capability-stewardship.md +17 -0
  29. package/docs/blocks/claims.md +16 -3
  30. package/docs/blocks/inquiry-harnesses.md +19 -0
  31. package/docs/blocks/learning-harnesses.md +17 -0
  32. package/docs/capability-stewardship.md +269 -0
  33. package/docs/coordination.md +51 -0
  34. package/docs/decision-practices.md +111 -0
  35. package/docs/decisions.md +29 -0
  36. package/docs/evidence-navigation.md +237 -0
  37. package/docs/exact-upgrades.md +3 -2
  38. package/docs/ingestion.md +181 -0
  39. package/docs/inquiry-harnesses.md +211 -0
  40. package/docs/install.md +80 -3
  41. package/docs/intake-and-guides.md +5 -0
  42. package/docs/integration-contract-decisions.md +24 -2
  43. package/docs/interaction-and-reflection.md +72 -0
  44. package/docs/knowledge-graph.md +20 -0
  45. package/docs/knowledge-health/api.md +30 -0
  46. package/docs/knowledge-health/assessment/api.md +96 -0
  47. package/docs/knowledge-health/assessment/capabilities.md +40 -0
  48. package/docs/knowledge-health/assessment/evaluation.md +27 -0
  49. package/docs/knowledge-health/assessment/facilitator.md +30 -0
  50. package/docs/knowledge-health/assessment/quickstart.md +61 -0
  51. package/docs/knowledge-health/assessment/troubleshooting.md +23 -0
  52. package/docs/knowledge-health/devday/facilitator.md +16 -0
  53. package/docs/knowledge-health/devday/participant-response.md +22 -0
  54. package/docs/knowledge-health/devday/public-default.md +107 -0
  55. package/docs/knowledge-health/devday/quickstart.md +18 -0
  56. package/docs/knowledge-health/devday/support.md +22 -0
  57. package/docs/knowledge-health/exercise.md +17 -0
  58. package/docs/knowledge-health/facilitator.md +20 -0
  59. package/docs/knowledge-health/quickstart.md +94 -0
  60. package/docs/knowledge-health/readme.md +15 -0
  61. package/docs/knowledge-health/support.md +34 -0
  62. package/docs/knowledge-setup.md +248 -0
  63. package/docs/knowledge-workspace.md +264 -0
  64. package/docs/learning-harnesses.md +238 -0
  65. package/docs/learning.md +215 -0
  66. package/docs/local-services.md +181 -16
  67. package/docs/obsidian-contract.md +223 -15
  68. package/docs/obsidian-plugin.md +38 -4
  69. package/docs/obsidian.md +613 -51
  70. package/docs/optional-ingestion.md +83 -0
  71. package/docs/personal-workspace.md +257 -0
  72. package/docs/practical-judgment.md +92 -0
  73. package/docs/progressive-ingestion-acceptance.md +89 -0
  74. package/docs/progressive-ingestion.md +235 -0
  75. package/docs/project-command-inventory.md +1 -0
  76. package/docs/release-engineering.md +49 -0
  77. package/docs/repo-boundary-guard.md +94 -0
  78. package/docs/research-starter-quickstart.md +66 -0
  79. package/docs/research-starter.md +114 -0
  80. package/docs/semantic-ingestion.md +198 -0
  81. package/docs/semantic-operation.md +317 -0
  82. package/docs/skill-steward.md +6 -0
  83. package/docs/template-profile.md +164 -0
  84. package/docs/template-upgrades.md +114 -0
  85. package/docs/trackables.md +111 -0
  86. package/docs/upgrade.md +47 -2
  87. package/fixtures/atelier-architecture/binding/invalid/document.json +19 -0
  88. package/fixtures/atelier-architecture/binding/valid/document.json +19 -0
  89. package/fixtures/atelier-architecture/catalog/invalid/document.json +290 -0
  90. package/fixtures/atelier-architecture/catalog/valid/document.json +343 -0
  91. package/fixtures/atelier-build-contract/attempt/invalid/document.json +20 -0
  92. package/fixtures/atelier-build-contract/attempt/valid/document.json +19 -0
  93. package/fixtures/atelier-build-contract/candidate/invalid/document.json +24 -0
  94. package/fixtures/atelier-build-contract/candidate/valid/document.json +23 -0
  95. package/fixtures/atelier-build-contract/decision/invalid/document.json +31 -0
  96. package/fixtures/atelier-build-contract/decision/valid/document.json +30 -0
  97. package/fixtures/atelier-build-contract/delivery/invalid/document.json +18 -0
  98. package/fixtures/atelier-build-contract/delivery/valid/document.json +17 -0
  99. package/fixtures/atelier-build-contract/gate/invalid/document.json +22 -0
  100. package/fixtures/atelier-build-contract/gate/valid/document.json +21 -0
  101. package/fixtures/atelier-build-contract/ledger/invalid/document.json +270 -0
  102. package/fixtures/atelier-build-contract/ledger/valid/document.json +269 -0
  103. package/fixtures/atelier-build-contract/objective/invalid/document.json +73 -0
  104. package/fixtures/atelier-build-contract/objective/valid/document.json +72 -0
  105. package/fixtures/atelier-build-contract/progress/invalid/document.json +18 -0
  106. package/fixtures/atelier-build-contract/progress/valid/document.json +17 -0
  107. package/fixtures/atelier-capability-contract/adoption/invalid/document.json +71 -0
  108. package/fixtures/atelier-capability-contract/adoption/valid/document.json +70 -0
  109. package/fixtures/atelier-capability-contract/event/invalid/document.json +18 -0
  110. package/fixtures/atelier-capability-contract/event/valid/document.json +17 -0
  111. package/fixtures/atelier-capability-contract/journal/invalid/document.json +382 -0
  112. package/fixtures/atelier-capability-contract/journal/valid/document.json +381 -0
  113. package/fixtures/atelier-capability-contract/notice/invalid/document.json +8 -0
  114. package/fixtures/atelier-capability-contract/notice/valid/document.json +7 -0
  115. package/fixtures/atelier-capability-contract/package/invalid/document.json +59 -0
  116. package/fixtures/atelier-capability-contract/package/valid/document.json +58 -0
  117. package/fixtures/atelier-capability-contract/plan/invalid/document.json +107 -0
  118. package/fixtures/atelier-capability-contract/plan/valid/document.json +106 -0
  119. package/fixtures/atelier-capability-contract/release/invalid/document.json +85 -0
  120. package/fixtures/atelier-capability-contract/release/valid/document.json +84 -0
  121. package/fixtures/atelier-capability-contract/state/invalid/document.json +316 -0
  122. package/fixtures/atelier-capability-contract/state/valid/document.json +315 -0
  123. package/fixtures/atelier-coordination/dependency/invalid/document.json +37 -0
  124. package/fixtures/atelier-coordination/dependency/valid/document.json +36 -0
  125. package/fixtures/atelier-coordination/directive/invalid/document.json +25 -0
  126. package/fixtures/atelier-coordination/directive/valid/document.json +24 -0
  127. package/fixtures/atelier-coordination/disposition/invalid/document.json +34 -0
  128. package/fixtures/atelier-coordination/disposition/valid/document.json +33 -0
  129. package/fixtures/atelier-coordination/outcome/invalid/document.json +39 -0
  130. package/fixtures/atelier-coordination/outcome/valid/document.json +38 -0
  131. package/fixtures/atelier-coordination/recovery/invalid/document.json +34 -0
  132. package/fixtures/atelier-coordination/recovery/valid/document.json +33 -0
  133. package/fixtures/atelier-harness-contract/handoff/invalid/document.json +25 -0
  134. package/fixtures/atelier-harness-contract/handoff/valid/document.json +24 -0
  135. package/fixtures/atelier-ingestion/invalid/authority.json +19 -0
  136. package/fixtures/atelier-ingestion/semantic-baseline.json +26 -0
  137. package/fixtures/atelier-ingestion/semantic-operation.json +75 -0
  138. package/fixtures/atelier-ingestion/valid/plan-input.json +18 -0
  139. package/fixtures/atelier-inquiry-contract/assessment/invalid/document.json +41 -0
  140. package/fixtures/atelier-inquiry-contract/assessment/valid/document.json +40 -0
  141. package/fixtures/atelier-inquiry-contract/bundle/invalid/document.json +51 -0
  142. package/fixtures/atelier-inquiry-contract/bundle/valid/document.json +50 -0
  143. package/fixtures/atelier-inquiry-contract/campaign/invalid/document.json +17 -0
  144. package/fixtures/atelier-inquiry-contract/campaign/valid/document.json +16 -0
  145. package/fixtures/atelier-inquiry-contract/decision/invalid/document.json +22 -0
  146. package/fixtures/atelier-inquiry-contract/decision/valid/document.json +21 -0
  147. package/fixtures/atelier-inquiry-contract/feedback/invalid/document.json +19 -0
  148. package/fixtures/atelier-inquiry-contract/feedback/valid/document.json +18 -0
  149. package/fixtures/atelier-inquiry-contract/handoff/invalid/document.json +92 -0
  150. package/fixtures/atelier-inquiry-contract/handoff/valid/document.json +91 -0
  151. package/fixtures/atelier-inquiry-contract/hypothesis/invalid/document.json +20 -0
  152. package/fixtures/atelier-inquiry-contract/hypothesis/valid/document.json +19 -0
  153. package/fixtures/atelier-inquiry-contract/ledger/invalid/document.json +680 -0
  154. package/fixtures/atelier-inquiry-contract/ledger/valid/document.json +679 -0
  155. package/fixtures/atelier-inquiry-contract/legacy-assessment/invalid/document.json +19 -0
  156. package/fixtures/atelier-inquiry-contract/legacy-assessment/valid/document.json +18 -0
  157. package/fixtures/atelier-inquiry-contract/request/invalid/document.json +50 -0
  158. package/fixtures/atelier-inquiry-contract/request/valid/document.json +49 -0
  159. package/fixtures/atelier-inquiry-contract/source/invalid/document.json +18 -0
  160. package/fixtures/atelier-inquiry-contract/source/valid/document.json +17 -0
  161. package/fixtures/atelier-inquiry-contract/withdrawal/invalid/document.json +16 -0
  162. package/fixtures/atelier-inquiry-contract/withdrawal/valid/document.json +15 -0
  163. package/fixtures/atelier-instruction-adoption/context-receipt/invalid/document.json +18 -0
  164. package/fixtures/atelier-instruction-adoption/context-receipt/valid/document.json +17 -0
  165. package/fixtures/atelier-instruction-adoption/plan/invalid/document.json +63 -0
  166. package/fixtures/atelier-instruction-adoption/plan/valid/document.json +62 -0
  167. package/fixtures/atelier-instruction-adoption/receipt/invalid/document.json +22 -0
  168. package/fixtures/atelier-instruction-adoption/receipt/valid/document.json +21 -0
  169. package/fixtures/atelier-instruction-adoption/state/invalid/document.json +30 -0
  170. package/fixtures/atelier-instruction-adoption/state/valid/document.json +29 -0
  171. package/fixtures/atelier-interaction/act/invalid/document.json +25 -0
  172. package/fixtures/atelier-interaction/act/valid/document.json +24 -0
  173. package/fixtures/atelier-interaction/assessment/invalid/document.json +32 -0
  174. package/fixtures/atelier-interaction/assessment/valid/document.json +31 -0
  175. package/fixtures/atelier-interaction/observation/invalid/document.json +22 -0
  176. package/fixtures/atelier-interaction/observation/valid/document.json +21 -0
  177. package/fixtures/atelier-interaction/policy/invalid/document.json +20 -0
  178. package/fixtures/atelier-interaction/policy/valid/document.json +19 -0
  179. package/fixtures/atelier-judgment/case/invalid/document.json +76 -0
  180. package/fixtures/atelier-judgment/case/valid/document.json +75 -0
  181. package/fixtures/atelier-judgment/decision/invalid/document.json +38 -0
  182. package/fixtures/atelier-judgment/decision/valid/document.json +37 -0
  183. package/fixtures/atelier-judgment/native-decision.md +3 -0
  184. package/fixtures/atelier-judgment/practice-reconsideration/definition.json +92 -0
  185. package/fixtures/atelier-judgment/practice-reconsideration/scenario.json +435 -0
  186. package/fixtures/atelier-knowledge-contract/activation/invalid/document.json +26 -0
  187. package/fixtures/atelier-knowledge-contract/activation/valid/document.json +25 -0
  188. package/fixtures/atelier-knowledge-contract/contribution/invalid/document.json +34 -0
  189. package/fixtures/atelier-knowledge-contract/contribution/valid/document.json +33 -0
  190. package/fixtures/atelier-knowledge-contract/domain/invalid/document.json +41 -0
  191. package/fixtures/atelier-knowledge-contract/domain/valid/document.json +40 -0
  192. package/fixtures/atelier-knowledge-contract/domain-revision/invalid/document.json +46 -0
  193. package/fixtures/atelier-knowledge-contract/domain-revision/valid/document.json +45 -0
  194. package/fixtures/atelier-knowledge-contract/evaluation/invalid/document.json +21 -0
  195. package/fixtures/atelier-knowledge-contract/evaluation/valid/document.json +20 -0
  196. package/fixtures/atelier-knowledge-contract/ledger/invalid/document.json +318 -0
  197. package/fixtures/atelier-knowledge-contract/ledger/valid/document.json +317 -0
  198. package/fixtures/atelier-knowledge-contract/relation/invalid/document.json +25 -0
  199. package/fixtures/atelier-knowledge-contract/relation/valid/document.json +24 -0
  200. package/fixtures/atelier-knowledge-contract/review/invalid/document.json +18 -0
  201. package/fixtures/atelier-knowledge-contract/review/valid/document.json +17 -0
  202. package/fixtures/atelier-knowledge-contract/withdrawal/invalid/document.json +16 -0
  203. package/fixtures/atelier-knowledge-contract/withdrawal/valid/document.json +15 -0
  204. package/fixtures/atelier-learning/invalid/authority.json +14 -0
  205. package/fixtures/atelier-learning/valid/capture.json +13 -0
  206. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/authority-key.json +17 -0
  207. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/nonempty-ext.json +25 -0
  208. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/wrong-schema.json +22 -0
  209. package/fixtures/atelier-personal-workspace-contract/manifest/valid/manifest.json +22 -0
  210. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/authority-key.json +25 -0
  211. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/unknown-top-level-field.json +27 -0
  212. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/wrong-schema.json +24 -0
  213. package/fixtures/atelier-trackable/definition/invalid/document.json +15 -0
  214. package/fixtures/atelier-trackable/definition/valid/document.json +14 -0
  215. package/fixtures/atelier-trackable/request/invalid/document.json +23 -0
  216. package/fixtures/atelier-trackable/request/valid/document.json +22 -0
  217. package/fixtures/boundary-delegations/invalid/authority-key.v1.json +30 -0
  218. package/fixtures/boundary-delegations/invalid/push-operation.v1.json +28 -0
  219. package/fixtures/boundary-delegations/invalid/unsigned.v1.json +25 -0
  220. package/fixtures/boundary-delegations/valid/empty.v1.json +4 -0
  221. package/fixtures/boundary-delegations/valid/signed-operator.v1.json +30 -0
  222. package/fixtures/boundary-owner-keys/invalid/wrong-algorithm.v1.json +15 -0
  223. package/fixtures/boundary-owner-keys/invalid/wrong-curve.v1.json +15 -0
  224. package/fixtures/boundary-owner-keys/valid/one-owner.v1.json +17 -0
  225. package/fixtures/capability-packages/adoption.example.json +70 -0
  226. package/fixtures/capability-packages/evidence-review/capability-package.json +58 -0
  227. package/fixtures/capability-packages/evidence-review/capability-release.json +84 -0
  228. package/fixtures/capability-packages/evidence-review/evaluation.md +15 -0
  229. package/fixtures/capability-packages/evidence-review/skills/evidence-review/SKILL.md +22 -0
  230. package/fixtures/capability-packages/evidence-review/skills/evidence-review/references/ledger.md +7 -0
  231. package/fixtures/capability-packages/research/capability-package.json +88 -0
  232. package/fixtures/capability-packages/research/capability-release.json +134 -0
  233. package/fixtures/capability-packages/research/evaluation.md +15 -0
  234. package/fixtures/capability-packages/research/skills/research-integrate/SKILL.md +29 -0
  235. package/fixtures/capability-packages/research/skills/research-integrate/references/integration.md +10 -0
  236. package/fixtures/capability-packages/research/skills/research-plan/SKILL.md +27 -0
  237. package/fixtures/capability-packages/research/skills/research-plan/references/inquiries.md +26 -0
  238. package/fixtures/capability-packages/research/skills/research-synthesize/SKILL.md +23 -0
  239. package/fixtures/capability-packages/research/skills/research-synthesize/references/synthesis.md +12 -0
  240. package/fixtures/evidence-navigation/invalid/duplicate-operation.json +16 -0
  241. package/fixtures/evidence-navigation/invalid/instruction-kind.json +36 -0
  242. package/fixtures/evidence-navigation/invalid/invalid-digest.json +36 -0
  243. package/fixtures/evidence-navigation/invalid/invalid-time.json +36 -0
  244. package/fixtures/evidence-navigation/invalid/missing-attribution.json +35 -0
  245. package/fixtures/evidence-navigation/invalid/reserved-extension.json +19 -0
  246. package/fixtures/evidence-navigation/invalid/unattributed-acceptance.json +36 -0
  247. package/fixtures/evidence-navigation/invalid/uncoerced-version.json +16 -0
  248. package/fixtures/evidence-navigation/invalid/unknown-currency.json +17 -0
  249. package/fixtures/evidence-navigation/invalid/unknown-selector-field.json +37 -0
  250. package/fixtures/evidence-navigation/invalid/unsupported-operation.json +15 -0
  251. package/fixtures/evidence-navigation/valid/claim.json +36 -0
  252. package/fixtures/evidence-navigation/valid/host.json +16 -0
  253. package/fixtures/evidence-navigation/valid/profile.json +16 -0
  254. package/fixtures/evidence-navigation/valid/snapshot.json +17 -0
  255. package/fixtures/harness-packages/build-harness/capability-package.json +61 -0
  256. package/fixtures/harness-packages/build-harness/capability-release.json +82 -0
  257. package/fixtures/harness-packages/build-harness/evaluation.md +3 -0
  258. package/fixtures/harness-packages/build-harness/skills/atelier-build-harness/SKILL.md +59 -0
  259. package/fixtures/harness-packages/knowledge-harness/capability-package.json +61 -0
  260. package/fixtures/harness-packages/knowledge-harness/capability-release.json +82 -0
  261. package/fixtures/harness-packages/knowledge-harness/evaluation.md +3 -0
  262. package/fixtures/harness-packages/knowledge-harness/skills/atelier-knowledge-harness/SKILL.md +60 -0
  263. package/fixtures/harnesses/learning-cycle.json +780 -0
  264. package/fixtures/inquiry/workshop.json +675 -0
  265. package/fixtures/inquiry-packages/discovery-harness/capability-package.json +61 -0
  266. package/fixtures/inquiry-packages/discovery-harness/capability-release.json +82 -0
  267. package/fixtures/inquiry-packages/discovery-harness/evaluation.md +3 -0
  268. package/fixtures/inquiry-packages/discovery-harness/skills/atelier-discovery-harness/SKILL.md +48 -0
  269. package/fixtures/inquiry-packages/research-harness/capability-package.json +61 -0
  270. package/fixtures/inquiry-packages/research-harness/capability-release.json +82 -0
  271. package/fixtures/inquiry-packages/research-harness/evaluation.md +3 -0
  272. package/fixtures/inquiry-packages/research-harness/skills/atelier-research-harness/SKILL.md +43 -0
  273. package/fixtures/knowledge-health/calibration-suite.json +26 -0
  274. package/fixtures/knowledge-health/calibration-trial.json +37 -0
  275. package/fixtures/knowledge-health/corrected/checklist.md +18 -0
  276. package/fixtures/knowledge-health/devday/participant-record.json +19 -0
  277. package/fixtures/knowledge-health/expected-summary.json +27 -0
  278. package/fixtures/knowledge-health/workshop/README.md +20 -0
  279. package/fixtures/knowledge-health/workshop/atelier.project.json +7 -0
  280. package/fixtures/knowledge-health/workshop/knowledge-plan.json +65 -0
  281. package/fixtures/knowledge-health/workshop/records/checklist.md +18 -0
  282. package/fixtures/knowledge-health/workshop/records/workshop.md +18 -0
  283. package/fixtures/knowledge-health/workshop/repo-access.v1.json +5 -0
  284. package/fixtures/knowledge-health/workspace/atelier.project.json +18 -0
  285. package/fixtures/knowledge-health/workspace/knowledge-plan.json +74 -0
  286. package/fixtures/knowledge-health/workspace/records/checklist.md +18 -0
  287. package/fixtures/knowledge-health/workspace/records/pilot.md +16 -0
  288. package/fixtures/knowledge-health/workspace/repo-access.v1.json +9 -0
  289. package/fixtures/personal-workspace/overlay.json +24 -0
  290. package/fixtures/templates/local-library.v1.json +75 -0
  291. package/fixtures/templates/upgrade-contracts/adoption-policy.v2/invalid.json +16 -0
  292. package/fixtures/templates/upgrade-contracts/adoption-policy.v2/valid.json +13 -0
  293. package/fixtures/templates/upgrade-contracts/migration.v3/invalid.json +24 -0
  294. package/fixtures/templates/upgrade-contracts/migration.v3/valid.json +21 -0
  295. package/fixtures/templates/upgrade-contracts/template-adoption.v1/invalid.json +60 -0
  296. package/fixtures/templates/upgrade-contracts/template-adoption.v1/valid.json +57 -0
  297. package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/invalid.json +85 -0
  298. package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/valid.json +82 -0
  299. package/package.json +59 -5
  300. package/skills/claude/atelier-build-harness/SKILL.md +59 -0
  301. package/skills/claude/atelier-coordination/SKILL.md +32 -0
  302. package/skills/claude/atelier-discovery-harness/SKILL.md +48 -0
  303. package/skills/claude/atelier-guided-upgrade/SKILL.md +29 -0
  304. package/skills/claude/atelier-interaction/SKILL.md +34 -0
  305. package/skills/claude/atelier-knowledge-harness/SKILL.md +60 -0
  306. package/skills/claude/atelier-knowledge-setup/SKILL.md +72 -0
  307. package/skills/claude/atelier-practical-judgment/SKILL.md +64 -0
  308. package/skills/claude/atelier-research-harness/SKILL.md +43 -0
  309. package/skills/claude/atelier-skill-steward/SKILL.md +53 -0
  310. package/skills/claude/atelier-trackables/SKILL.md +40 -0
  311. package/skills/codex/atelier-build-harness/SKILL.md +59 -0
  312. package/skills/codex/atelier-coordination/SKILL.md +32 -0
  313. package/skills/codex/atelier-discovery-harness/SKILL.md +48 -0
  314. package/skills/codex/atelier-guided-upgrade/SKILL.md +29 -0
  315. package/skills/codex/atelier-interaction/SKILL.md +34 -0
  316. package/skills/codex/atelier-knowledge-harness/SKILL.md +60 -0
  317. package/skills/codex/atelier-knowledge-setup/SKILL.md +72 -0
  318. package/skills/codex/atelier-practical-judgment/SKILL.md +64 -0
  319. package/skills/codex/atelier-research-harness/SKILL.md +43 -0
  320. package/skills/codex/atelier-skill-steward/SKILL.md +53 -0
  321. package/skills/codex/atelier-trackables/SKILL.md +40 -0
  322. package/src/architecture/catalog.mjs +355 -0
  323. package/src/architecture/index.mjs +93 -0
  324. package/src/boundary/content-rules.mjs +4 -2
  325. package/src/boundary/delegation-command.mjs +158 -0
  326. package/src/boundary/delegation.mjs +396 -0
  327. package/src/boundary/policy.mjs +52 -10
  328. package/src/build/git.mjs +18 -0
  329. package/src/build/index.mjs +3 -0
  330. package/src/build/ledger.mjs +88 -0
  331. package/src/capabilities/adoption.mjs +381 -0
  332. package/src/capabilities/evidence.mjs +140 -0
  333. package/src/capabilities/files.mjs +124 -0
  334. package/src/capabilities/index.mjs +4 -0
  335. package/src/capabilities/instructions.mjs +250 -0
  336. package/src/capabilities/package.mjs +136 -0
  337. package/src/cli/command-failure.mjs +36 -0
  338. package/src/cli/execute-command.mjs +16 -2
  339. package/src/cli/run.mjs +65 -9
  340. package/src/coauthor/store.mjs +43 -2
  341. package/src/collaboration/proposals.mjs +189 -0
  342. package/src/commands/architecture.mjs +27 -0
  343. package/src/commands/boundary.mjs +3 -0
  344. package/src/commands/capability.mjs +73 -0
  345. package/src/commands/enroll.mjs +3 -0
  346. package/src/commands/harness.mjs +79 -0
  347. package/src/commands/ingest.mjs +39 -0
  348. package/src/commands/init.mjs +4 -1
  349. package/src/commands/inquiry.mjs +66 -0
  350. package/src/commands/knowledge-semantic.mjs +128 -0
  351. package/src/commands/knowledge.mjs +119 -0
  352. package/src/commands/learn.mjs +61 -0
  353. package/src/commands/obsidian.mjs +754 -63
  354. package/src/commands/practice.mjs +24 -0
  355. package/src/commands/setup.mjs +22 -2
  356. package/src/commands/trackable.mjs +19 -0
  357. package/src/contracts/corpus.mjs +30 -0
  358. package/src/coordination/index.mjs +110 -0
  359. package/src/evidence-navigation/contracts.mjs +60 -0
  360. package/src/evidence-navigation/evaluate.mjs +69 -0
  361. package/src/evidence-navigation/generation.mjs +22 -0
  362. package/src/evidence-navigation/index.mjs +2 -0
  363. package/src/evidence-navigation/local.mjs +167 -0
  364. package/src/evidence-navigation/schema.generated.mjs +604 -0
  365. package/src/evidence-navigation/types.mjs +12 -0
  366. package/src/export/atelier-export-contract.mjs +35 -8
  367. package/src/graph/enroll.mjs +248 -0
  368. package/src/graph/graph.mjs +17 -1
  369. package/src/graph/knowledge-graph.mjs +58 -8
  370. package/src/harnesses/contracts.mjs +41 -0
  371. package/src/harnesses/exchange.mjs +154 -0
  372. package/src/harnesses/feedback.mjs +16 -0
  373. package/src/harnesses/history.mjs +37 -0
  374. package/src/harnesses/index.mjs +4 -0
  375. package/src/harnesses/store.mjs +29 -0
  376. package/src/ingestion/contracts.mjs +41 -0
  377. package/src/ingestion/evaluation.mjs +119 -0
  378. package/src/ingestion/optional/composition/index.mjs +171 -0
  379. package/src/ingestion/optional/evaluation/index.mjs +219 -0
  380. package/src/ingestion/optional/graphify/composition-binding.mjs +60 -0
  381. package/src/ingestion/optional/graphify/composition_receiving.py +185 -0
  382. package/src/ingestion/optional/graphify/graphify_supplier.py +933 -0
  383. package/src/ingestion/optional/graphify/json_bridge.py +163 -0
  384. package/src/ingestion/optional/graphify/query_receiving.py +209 -0
  385. package/src/ingestion/optional/index.mjs +9 -0
  386. package/src/ingestion/optional/jev/bridge.mjs +166 -0
  387. package/src/ingestion/optional/jev/composition-binding.mjs +116 -0
  388. package/src/ingestion/optional/jev/judgments.mjs +174 -0
  389. package/src/ingestion/optional/jev/native-translation.mjs +32 -0
  390. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/__init__.py +7 -0
  391. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/adapter.py +966 -0
  392. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/artifacts.py +101 -0
  393. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/projection.py +146 -0
  394. package/src/ingestion/optional/lightrag/composition-binding.mjs +67 -0
  395. package/src/ingestion/optional/vanilla/composition-binding.mjs +102 -0
  396. package/src/ingestion/optional/vanilla/index.mjs +218 -0
  397. package/src/ingestion/optional/vanilla/native-normalization.mjs +187 -0
  398. package/src/ingestion/processors.mjs +218 -0
  399. package/src/ingestion/semantic.mjs +203 -0
  400. package/src/ingestion/store.mjs +372 -0
  401. package/src/inquiry/beliefs.mjs +32 -0
  402. package/src/inquiry/contracts.mjs +23 -0
  403. package/src/inquiry/index.mjs +5 -0
  404. package/src/inquiry/ledger.mjs +135 -0
  405. package/src/inquiry/lenses.mjs +15 -0
  406. package/src/inquiry/projection.mjs +77 -0
  407. package/src/inquiry/store.mjs +35 -0
  408. package/src/intake/read-scope.mjs +12 -0
  409. package/src/intake/store.mjs +69 -6
  410. package/src/interaction/index.mjs +91 -0
  411. package/src/judgment/index.mjs +82 -0
  412. package/src/judgment/practice-evaluation.mjs +70 -0
  413. package/src/judgment/practice.mjs +144 -0
  414. package/src/knowledge/context.mjs +217 -0
  415. package/src/knowledge/index.mjs +5 -0
  416. package/src/knowledge/ingestion.mjs +79 -0
  417. package/src/knowledge/intake.mjs +33 -0
  418. package/src/knowledge/ledger.mjs +110 -0
  419. package/src/knowledge/participatory/guidance.mjs +36 -0
  420. package/src/knowledge/participatory/guided-contribution.mjs +44 -0
  421. package/src/knowledge/participatory/index.mjs +2 -0
  422. package/src/knowledge/participatory/installed-workshop.mjs +108 -0
  423. package/src/knowledge/plan.mjs +67 -0
  424. package/src/knowledge/projection.mjs +43 -0
  425. package/src/knowledge/semantic-operation.mjs +567 -0
  426. package/src/knowledge/sessions.mjs +467 -0
  427. package/src/knowledge/workspace.mjs +295 -0
  428. package/src/knowledge-health/assessment.mjs +165 -0
  429. package/src/knowledge-health/capabilities.mjs +350 -0
  430. package/src/knowledge-health/context.mjs +62 -0
  431. package/src/knowledge-health/example.mjs +47 -0
  432. package/src/knowledge-health/index.mjs +10 -0
  433. package/src/knowledge-health/owner-join.mjs +88 -0
  434. package/src/knowledge-health/proof/common.mjs +24 -0
  435. package/src/knowledge-health/proof/installed-check.mjs +100 -0
  436. package/src/knowledge-health/proof/native-readback.mjs +37 -0
  437. package/src/knowledge-health/proof/rehearse.mjs +68 -0
  438. package/src/knowledge-health/proof/validate-participant.mjs +17 -0
  439. package/src/knowledge-health/proof/verify-native-capture.mjs +14 -0
  440. package/src/knowledge-health/proof/workshop-check.mjs +36 -0
  441. package/src/knowledge-health/rule-identity.mjs +44 -0
  442. package/src/knowledge-health/workshop-composition.mjs +19 -0
  443. package/src/knowledge-health/workshop-profile.mjs +176 -0
  444. package/src/knowledge-health/workshop.mjs +99 -0
  445. package/src/learning/adapters.mjs +68 -0
  446. package/src/learning/assistance.mjs +127 -0
  447. package/src/learning/contracts.mjs +65 -0
  448. package/src/learning/store.mjs +272 -0
  449. package/src/personal-workspace/index.mjs +391 -0
  450. package/src/personal-workspace/selection.mjs +385 -0
  451. package/src/project/config.mjs +8 -0
  452. package/src/project/durable-state.mjs +3 -1
  453. package/src/project/file-class.mjs +1 -1
  454. package/src/projection/obsidian/edits/apply.mjs +55 -16
  455. package/src/projection/obsidian/personal-workspace.mjs +436 -0
  456. package/src/projection/obsidian/proposals/adapter.mjs +47 -8
  457. package/src/projection/obsidian/proposals/observation.mjs +10 -2
  458. package/src/projection/obsidian/publication/publisher.mjs +142 -13
  459. package/src/projection/obsidian/publication/vault-list.mjs +4 -3
  460. package/src/projection/obsidian/recovery/index.mjs +4 -1
  461. package/src/projection/obsidian/recovery/store.mjs +160 -7
  462. package/src/projection/obsidian/selection-ui/contribution.mjs +6 -5
  463. package/src/readiness/readiness.mjs +10 -3
  464. package/src/reflection/index.mjs +56 -0
  465. package/src/runtime/obsidian/app-production-seams.mjs +48 -16
  466. package/src/runtime/obsidian/app-registration.mjs +175 -28
  467. package/src/runtime/obsidian/app-restart.mjs +154 -0
  468. package/src/runtime/obsidian/engine.mjs +163 -20
  469. package/src/runtime/obsidian/extension-points.mjs +1 -1
  470. package/src/runtime/obsidian/index.mjs +10 -7
  471. package/src/runtime/obsidian/launch-plan.mjs +7 -4
  472. package/src/runtime/obsidian/lifecycle.mjs +92 -12
  473. package/src/runtime/obsidian/login-item.mjs +332 -0
  474. package/src/runtime/obsidian/machine-settings.mjs +119 -12
  475. package/src/runtime/obsidian/opening.mjs +171 -37
  476. package/src/runtime/obsidian/pipeline.mjs +71 -3
  477. package/src/runtime/obsidian/plugin-channel.mjs +11 -3
  478. package/src/runtime/obsidian/plugin-choice.mjs +16 -4
  479. package/src/runtime/obsidian/plugin-drift.mjs +59 -11
  480. package/src/runtime/obsidian/plugin-presence.mjs +14 -1
  481. package/src/runtime/obsidian/process-identity.mjs +20 -10
  482. package/src/runtime/obsidian/project-views.mjs +282 -0
  483. package/src/runtime/obsidian/questions.mjs +48 -0
  484. package/src/runtime/obsidian/release-watch.mjs +56 -0
  485. package/src/runtime/obsidian/service-main.mjs +99 -16
  486. package/src/runtime/obsidian/service-manager-production.mjs +61 -0
  487. package/src/runtime/obsidian/service-managers.mjs +275 -0
  488. package/src/runtime/obsidian/service-record.mjs +87 -23
  489. package/src/runtime/obsidian/service.mjs +36 -3
  490. package/src/runtime/obsidian/startup-adapters.mjs +59 -21
  491. package/src/runtime/obsidian/unheld-evidence.mjs +84 -0
  492. package/src/runtime/obsidian/vault-location.mjs +300 -0
  493. package/src/runtime/obsidian/view-counts.mjs +34 -0
  494. package/src/server/local-sidecar.mjs +169 -2
  495. package/src/server/server.mjs +28 -2
  496. package/src/template-bindings/project.mjs +92 -0
  497. package/src/templates/profile.mjs +225 -0
  498. package/src/trackables/domain.mjs +175 -0
  499. package/src/trackables/store.mjs +114 -0
  500. package/src/ui/knowledge-page.mjs +1388 -0
  501. package/src/upgrade/explanation.mjs +1 -1
  502. package/src/upgrade/template-participant.mjs +171 -0
  503. package/src/upgrade/transaction.mjs +72 -25
  504. package/src/upgrade/upgrade.mjs +1 -0
  505. package/templates/external-project-workspace/pack-lifecycle.json +6 -1
  506. package/templates/knowledge-workspace/.gitattributes +2 -0
  507. package/templates/knowledge-workspace/AGENTS.md +27 -0
  508. package/templates/knowledge-workspace/README.md +44 -0
  509. package/templates/knowledge-workspace/atelier.project.json +22 -0
  510. package/templates/knowledge-workspace/gitignore +6 -0
  511. package/templates/knowledge-workspace/knowledge-plan.json +111 -0
  512. package/templates/knowledge-workspace/knowledge-plan.schema.json +281 -0
  513. package/templates/knowledge-workspace/records/forecast.md +22 -0
  514. package/templates/knowledge-workspace/records/inspection.md +25 -0
  515. package/templates/knowledge-workspace/records/telescope.md +24 -0
  516. 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.
@@ -282,15 +282,153 @@ proceeds.
282
282
  accepts a connection and does not answer in time proves nothing.
283
283
  `inspectPrivateGenerationLock` reports the holder without changing anything.
284
284
 
285
- ### Operating-system startup
285
+ ### Operating-system startup: the login item
286
286
 
287
287
  `buildStartupAdapter` returns the text of a launchd user agent (macOS) or a
288
288
  systemd user unit (Linux) from the values it is given. It writes no file,
289
289
  installs nothing, runs no service manager and looks nothing up on the machine.
290
290
  Windows startup has not been qualified and refuses with
291
- `startup-platform-unqualified`. Installing a unit is a separate system change
292
- that needs explicit user authorization; the service refuses to run with
293
- `--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.
294
432
 
295
433
  The service entry refuses to run without an explicitly selected editor
296
434
  adapter. Public Atelier tests start only a test entry whose adapter reports
@@ -298,29 +436,56 @@ that no app runs, in temporary directories, on ephemeral loopback ports.
298
436
 
299
437
  ### The `obsidian` command
300
438
 
301
- `atelier obsidian <operation>` is the noninteractive surface over all of the
302
- 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.
303
442
  Exit codes: 0 done, 1 an error nobody typed, 2 a typed refusal or a usage
304
443
  error, 3 the operation ran and its answer is not success.
305
444
 
306
445
  | Operation | What it does | Writes |
307
446
  | --- | --- | --- |
308
- | `status` | enablement, machine settings, 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 |
309
- | `scope list`, `scope show ID` | the declared views | nothing |
310
- | `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 |
311
453
  | `mode show`, `mode set manual\|automatic` | `automatic` refuses without an installed, matching, active automatic policy | private machine settings |
312
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 |
313
- | `service start`, `service status`, `service stop` | `startService`, `serviceStatus`, `stopService`. The first start needs `--consent-actor ID` | what the lifecycle writes |
314
- | `service unit --print` | the text `buildStartupAdapter` returns. Installing a unit is not offered | nothing |
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 |
315
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)) |
316
461
 
317
462
  Reaching the installed app or the operating system is never a default.
318
463
  `open`, `service start` and `service unit` refuse with
319
- `app-adapter-not-selected` unless `--adapter=obsidian-cli` is given, the same
320
- explicit rule the service entry has, and the modules that talk to an app are
321
- 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
322
473
  test file throws if anything tries to start the app, its command-line tool, an
323
- 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.
324
489
 
325
490
  `open` answers one typed outcome, each with a one-line explanation and a next
326
491
  step. Only `current` is success:
@@ -331,7 +496,7 @@ step. Only `current` is success:
331
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 |
332
497
  | `held-for-your-edit` | an edited note is preserved and held |
333
498
  | `stale-readable` | a last good vault exists and reads back, but is not proven to be the present generation |
334
- | `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) |
335
500
  | `publisher-conflict` | another publisher or an uncoordinated editor holds the vault |
336
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) |
337
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 |