@mnstry/atelier 0.2.0-alpha.12 → 0.2.0-alpha.14

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 (531) hide show
  1. package/CHANGELOG.md +894 -0
  2. package/README.md +159 -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 +267 -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 +210 -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 +237 -0
  65. package/docs/learning.md +215 -0
  66. package/docs/local-services.md +223 -19
  67. package/docs/obsidian-contract.md +246 -15
  68. package/docs/obsidian-plugin.md +252 -7
  69. package/docs/obsidian.md +874 -52
  70. package/docs/optional-ingestion.md +83 -0
  71. package/docs/personal-workspace.md +266 -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 +50 -0
  77. package/docs/repo-boundary-guard.md +120 -3
  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 +318 -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 +219 -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 +76 -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 +60 -5
  300. package/plugins/obsidian/main.js +57 -8
  301. package/plugins/obsidian/manifest.json +1 -1
  302. package/skills/claude/atelier-build-harness/SKILL.md +59 -0
  303. package/skills/claude/atelier-coordination/SKILL.md +32 -0
  304. package/skills/claude/atelier-discovery-harness/SKILL.md +48 -0
  305. package/skills/claude/atelier-guided-upgrade/SKILL.md +29 -0
  306. package/skills/claude/atelier-interaction/SKILL.md +34 -0
  307. package/skills/claude/atelier-knowledge-harness/SKILL.md +60 -0
  308. package/skills/claude/atelier-knowledge-setup/SKILL.md +72 -0
  309. package/skills/claude/atelier-practical-judgment/SKILL.md +64 -0
  310. package/skills/claude/atelier-research-harness/SKILL.md +43 -0
  311. package/skills/claude/atelier-skill-steward/SKILL.md +53 -0
  312. package/skills/claude/atelier-trackables/SKILL.md +40 -0
  313. package/skills/codex/atelier-build-harness/SKILL.md +59 -0
  314. package/skills/codex/atelier-coordination/SKILL.md +32 -0
  315. package/skills/codex/atelier-discovery-harness/SKILL.md +48 -0
  316. package/skills/codex/atelier-guided-upgrade/SKILL.md +29 -0
  317. package/skills/codex/atelier-interaction/SKILL.md +34 -0
  318. package/skills/codex/atelier-knowledge-harness/SKILL.md +60 -0
  319. package/skills/codex/atelier-knowledge-setup/SKILL.md +72 -0
  320. package/skills/codex/atelier-practical-judgment/SKILL.md +64 -0
  321. package/skills/codex/atelier-research-harness/SKILL.md +43 -0
  322. package/skills/codex/atelier-skill-steward/SKILL.md +53 -0
  323. package/skills/codex/atelier-trackables/SKILL.md +40 -0
  324. package/src/architecture/catalog.mjs +355 -0
  325. package/src/architecture/index.mjs +93 -0
  326. package/src/boundary/content-rules.mjs +536 -69
  327. package/src/boundary/delegation-command.mjs +158 -0
  328. package/src/boundary/delegation.mjs +396 -0
  329. package/src/boundary/policy.mjs +185 -64
  330. package/src/build/git.mjs +18 -0
  331. package/src/build/index.mjs +3 -0
  332. package/src/build/ledger.mjs +88 -0
  333. package/src/capabilities/adoption.mjs +381 -0
  334. package/src/capabilities/evidence.mjs +140 -0
  335. package/src/capabilities/files.mjs +124 -0
  336. package/src/capabilities/index.mjs +4 -0
  337. package/src/capabilities/instructions.mjs +250 -0
  338. package/src/capabilities/package.mjs +136 -0
  339. package/src/cli/command-failure.mjs +36 -0
  340. package/src/cli/execute-command.mjs +16 -2
  341. package/src/cli/run.mjs +66 -9
  342. package/src/coauthor/store.mjs +43 -2
  343. package/src/collaboration/proposals.mjs +189 -0
  344. package/src/commands/architecture.mjs +27 -0
  345. package/src/commands/boundary.mjs +3 -0
  346. package/src/commands/capability.mjs +73 -0
  347. package/src/commands/enroll.mjs +3 -0
  348. package/src/commands/harness.mjs +79 -0
  349. package/src/commands/ingest.mjs +39 -0
  350. package/src/commands/init.mjs +4 -1
  351. package/src/commands/inquiry.mjs +66 -0
  352. package/src/commands/knowledge-semantic.mjs +128 -0
  353. package/src/commands/knowledge.mjs +119 -0
  354. package/src/commands/learn.mjs +61 -0
  355. package/src/commands/obsidian.mjs +772 -65
  356. package/src/commands/practice.mjs +24 -0
  357. package/src/commands/setup.mjs +22 -2
  358. package/src/commands/trackable.mjs +19 -0
  359. package/src/contracts/corpus.mjs +30 -0
  360. package/src/coordination/index.mjs +110 -0
  361. package/src/evidence-navigation/contracts.mjs +60 -0
  362. package/src/evidence-navigation/evaluate.mjs +69 -0
  363. package/src/evidence-navigation/generation.mjs +22 -0
  364. package/src/evidence-navigation/index.mjs +2 -0
  365. package/src/evidence-navigation/local.mjs +167 -0
  366. package/src/evidence-navigation/schema.generated.mjs +604 -0
  367. package/src/evidence-navigation/types.mjs +12 -0
  368. package/src/export/atelier-export-contract.mjs +35 -8
  369. package/src/graph/enroll.mjs +248 -0
  370. package/src/graph/graph.mjs +30 -6
  371. package/src/graph/knowledge-graph.mjs +77 -9
  372. package/src/harnesses/contracts.mjs +41 -0
  373. package/src/harnesses/exchange.mjs +154 -0
  374. package/src/harnesses/feedback.mjs +16 -0
  375. package/src/harnesses/history.mjs +37 -0
  376. package/src/harnesses/index.mjs +4 -0
  377. package/src/harnesses/store.mjs +29 -0
  378. package/src/ingestion/contracts.mjs +41 -0
  379. package/src/ingestion/evaluation.mjs +119 -0
  380. package/src/ingestion/optional/composition/index.mjs +171 -0
  381. package/src/ingestion/optional/evaluation/index.mjs +219 -0
  382. package/src/ingestion/optional/graphify/composition-binding.mjs +60 -0
  383. package/src/ingestion/optional/graphify/composition_receiving.py +185 -0
  384. package/src/ingestion/optional/graphify/graphify_supplier.py +938 -0
  385. package/src/ingestion/optional/graphify/json_bridge.py +163 -0
  386. package/src/ingestion/optional/graphify/native-closure-pins.json +275 -0
  387. package/src/ingestion/optional/graphify/native-pins.json +306 -0
  388. package/src/ingestion/optional/graphify/query_receiving.py +209 -0
  389. package/src/ingestion/optional/index.mjs +9 -0
  390. package/src/ingestion/optional/jev/bridge.mjs +166 -0
  391. package/src/ingestion/optional/jev/composition-binding.mjs +116 -0
  392. package/src/ingestion/optional/jev/judgments.mjs +174 -0
  393. package/src/ingestion/optional/jev/native-translation.mjs +32 -0
  394. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/__init__.py +7 -0
  395. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/adapter.py +966 -0
  396. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/artifacts.py +101 -0
  397. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/projection.py +146 -0
  398. package/src/ingestion/optional/lightrag/composition-binding.mjs +67 -0
  399. package/src/ingestion/optional/vanilla/composition-binding.mjs +102 -0
  400. package/src/ingestion/optional/vanilla/index.mjs +218 -0
  401. package/src/ingestion/optional/vanilla/native-normalization.mjs +187 -0
  402. package/src/ingestion/processors.mjs +218 -0
  403. package/src/ingestion/semantic.mjs +203 -0
  404. package/src/ingestion/store.mjs +372 -0
  405. package/src/inquiry/beliefs.mjs +32 -0
  406. package/src/inquiry/contracts.mjs +23 -0
  407. package/src/inquiry/index.mjs +5 -0
  408. package/src/inquiry/ledger.mjs +135 -0
  409. package/src/inquiry/lenses.mjs +15 -0
  410. package/src/inquiry/projection.mjs +77 -0
  411. package/src/inquiry/store.mjs +35 -0
  412. package/src/intake/read-scope.mjs +12 -0
  413. package/src/intake/store.mjs +69 -6
  414. package/src/interaction/index.mjs +91 -0
  415. package/src/judgment/index.mjs +82 -0
  416. package/src/judgment/practice-evaluation.mjs +70 -0
  417. package/src/judgment/practice.mjs +144 -0
  418. package/src/knowledge/context.mjs +217 -0
  419. package/src/knowledge/index.mjs +5 -0
  420. package/src/knowledge/ingestion.mjs +79 -0
  421. package/src/knowledge/intake.mjs +33 -0
  422. package/src/knowledge/ledger.mjs +110 -0
  423. package/src/knowledge/participatory/guidance.mjs +36 -0
  424. package/src/knowledge/participatory/guided-contribution.mjs +44 -0
  425. package/src/knowledge/participatory/index.mjs +2 -0
  426. package/src/knowledge/participatory/installed-workshop.mjs +108 -0
  427. package/src/knowledge/plan.mjs +67 -0
  428. package/src/knowledge/projection.mjs +43 -0
  429. package/src/knowledge/semantic-operation.mjs +567 -0
  430. package/src/knowledge/sessions.mjs +467 -0
  431. package/src/knowledge/workspace.mjs +295 -0
  432. package/src/knowledge-health/assessment.mjs +165 -0
  433. package/src/knowledge-health/capabilities.mjs +350 -0
  434. package/src/knowledge-health/context.mjs +62 -0
  435. package/src/knowledge-health/example.mjs +47 -0
  436. package/src/knowledge-health/index.mjs +10 -0
  437. package/src/knowledge-health/owner-join.mjs +88 -0
  438. package/src/knowledge-health/proof/common.mjs +24 -0
  439. package/src/knowledge-health/proof/installed-check.mjs +100 -0
  440. package/src/knowledge-health/proof/native-readback.mjs +37 -0
  441. package/src/knowledge-health/proof/rehearse.mjs +68 -0
  442. package/src/knowledge-health/proof/validate-participant.mjs +17 -0
  443. package/src/knowledge-health/proof/verify-native-capture.mjs +14 -0
  444. package/src/knowledge-health/proof/workshop-check.mjs +36 -0
  445. package/src/knowledge-health/rule-identity.mjs +49 -0
  446. package/src/knowledge-health/workshop-composition.mjs +19 -0
  447. package/src/knowledge-health/workshop-profile.mjs +176 -0
  448. package/src/knowledge-health/workshop.mjs +99 -0
  449. package/src/learning/adapters.mjs +68 -0
  450. package/src/learning/assistance.mjs +127 -0
  451. package/src/learning/contracts.mjs +65 -0
  452. package/src/learning/store.mjs +272 -0
  453. package/src/personal-workspace/index.mjs +391 -0
  454. package/src/personal-workspace/selection.mjs +401 -0
  455. package/src/project/config.mjs +8 -0
  456. package/src/project/durable-state.mjs +3 -1
  457. package/src/project/file-class.mjs +1 -1
  458. package/src/project/path-match.mjs +2 -1
  459. package/src/projection/obsidian/edits/apply.mjs +55 -16
  460. package/src/projection/obsidian/materialize/prepare-view.mjs +87 -5
  461. package/src/projection/obsidian/personal-workspace.mjs +519 -0
  462. package/src/projection/obsidian/proposals/adapter.mjs +79 -17
  463. package/src/projection/obsidian/proposals/observation.mjs +50 -4
  464. package/src/projection/obsidian/publication/publisher.mjs +214 -18
  465. package/src/projection/obsidian/publication/vault-list.mjs +4 -3
  466. package/src/projection/obsidian/recovery/index.mjs +4 -1
  467. package/src/projection/obsidian/recovery/store.mjs +160 -7
  468. package/src/projection/obsidian/selection-ui/contribution.mjs +6 -5
  469. package/src/projection/project.mjs +3 -2
  470. package/src/readiness/readiness.mjs +10 -3
  471. package/src/reflection/index.mjs +56 -0
  472. package/src/runtime/obsidian/app-production-seams.mjs +48 -16
  473. package/src/runtime/obsidian/app-registration.mjs +175 -28
  474. package/src/runtime/obsidian/app-restart.mjs +154 -0
  475. package/src/runtime/obsidian/engine.mjs +437 -56
  476. package/src/runtime/obsidian/extension-points.mjs +1 -1
  477. package/src/runtime/obsidian/index.mjs +10 -7
  478. package/src/runtime/obsidian/launch-plan.mjs +7 -4
  479. package/src/runtime/obsidian/lifecycle.mjs +108 -23
  480. package/src/runtime/obsidian/login-item.mjs +335 -0
  481. package/src/runtime/obsidian/machine-settings.mjs +119 -12
  482. package/src/runtime/obsidian/observation.mjs +36 -4
  483. package/src/runtime/obsidian/opening.mjs +173 -38
  484. package/src/runtime/obsidian/personal-selection.mjs +125 -0
  485. package/src/runtime/obsidian/pipeline.mjs +115 -6
  486. package/src/runtime/obsidian/plugin-channel.mjs +11 -3
  487. package/src/runtime/obsidian/plugin-choice.mjs +16 -4
  488. package/src/runtime/obsidian/plugin-drift.mjs +59 -11
  489. package/src/runtime/obsidian/plugin-presence.mjs +14 -1
  490. package/src/runtime/obsidian/private-lock.mjs +39 -4
  491. package/src/runtime/obsidian/process-identity.mjs +20 -10
  492. package/src/runtime/obsidian/project-views.mjs +282 -0
  493. package/src/runtime/obsidian/questions.mjs +48 -0
  494. package/src/runtime/obsidian/release-watch.mjs +56 -0
  495. package/src/runtime/obsidian/service-main.mjs +148 -19
  496. package/src/runtime/obsidian/service-manager-production.mjs +61 -0
  497. package/src/runtime/obsidian/service-managers.mjs +275 -0
  498. package/src/runtime/obsidian/service-record.mjs +87 -23
  499. package/src/runtime/obsidian/service.mjs +102 -9
  500. package/src/runtime/obsidian/startup-adapters.mjs +59 -21
  501. package/src/runtime/obsidian/unheld-evidence.mjs +84 -0
  502. package/src/runtime/obsidian/vault-location.mjs +300 -0
  503. package/src/runtime/obsidian/view-counts.mjs +34 -0
  504. package/src/runtime/obsidian/view-permission.mjs +334 -0
  505. package/src/server/local-sidecar.mjs +169 -2
  506. package/src/server/server.mjs +28 -2
  507. package/src/template-bindings/project.mjs +92 -0
  508. package/src/templates/profile.mjs +225 -0
  509. package/src/trackables/domain.mjs +175 -0
  510. package/src/trackables/store.mjs +114 -0
  511. package/src/ui/control-system.mjs +201 -0
  512. package/src/ui/html-primitives.mjs +3 -0
  513. package/src/ui/knowledge-page.mjs +1388 -0
  514. package/src/upgrade/closure-diagnostics.mjs +135 -0
  515. package/src/upgrade/closure.mjs +649 -0
  516. package/src/upgrade/explanation.mjs +1 -1
  517. package/src/upgrade/template-participant.mjs +171 -0
  518. package/src/upgrade/transaction.mjs +72 -25
  519. package/src/upgrade/upgrade.mjs +20 -7
  520. package/templates/external-project-workspace/pack-lifecycle.json +7 -1
  521. package/templates/knowledge-workspace/.gitattributes +2 -0
  522. package/templates/knowledge-workspace/AGENTS.md +27 -0
  523. package/templates/knowledge-workspace/README.md +44 -0
  524. package/templates/knowledge-workspace/atelier.project.json +22 -0
  525. package/templates/knowledge-workspace/gitignore +6 -0
  526. package/templates/knowledge-workspace/knowledge-plan.json +111 -0
  527. package/templates/knowledge-workspace/knowledge-plan.schema.json +281 -0
  528. package/templates/knowledge-workspace/records/forecast.md +22 -0
  529. package/templates/knowledge-workspace/records/inspection.md +25 -0
  530. package/templates/knowledge-workspace/records/telescope.md +24 -0
  531. 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.
@@ -203,8 +203,19 @@ the child it created. If that proof never arrives it stops only that child, by
203
203
  its process handle, and reports the private operational log,
204
204
  `state/service/service.log`.
205
205
 
206
- A tick is largely synchronous, so a healthy service in a long tick may not
207
- answer health within the deadline. That is `busy`, not `occupied`: it is
206
+ Stretches of a tick are synchronous (walking the directories, reading the
207
+ HTML sources and the sidecars of PDF and Word documents, resolving links and
208
+ assembling the canonical graph, building the whole graph of a project bound to
209
+ a personal workspace, capturing the source snapshot, the
210
+ publisher's restart recovery, its exchange probe, writing the journal, the
211
+ look again at displaced files), so a healthy service in a long one may not
212
+ answer health within the deadline; observing the vault and source files before
213
+ a view is prepared, reading the Markdown sources into the canonical graph,
214
+ preparing
215
+ and publishing a view, and reading it back after a commit yield between files
216
+ and between publication units, and health is answered meanwhile. A service
217
+ that does not answer in time is `busy`, not
218
+ `occupied`: it is
208
219
  never adopted, never stopped and never started over, and a `start` whose own
209
220
  child went straight into a long first tick reports it as started and busy
210
221
  instead of ending it. The command line of another process is read from
@@ -268,7 +279,35 @@ A tick that fails for a reason nobody typed (a full disk, a crash inside a
268
279
  step) does not end the service. Its error code is kept in
269
280
  `state/service/last-error.json`, its message only in the private log; the
270
281
  delay before the next attempt doubles up to a ceiling, and the next tick
271
- proceeds.
282
+ proceeds. It starts as the first tick of the service does, loading the project
283
+ again and looking at every view, so nothing the failed tick saw and did not
284
+ act on is lost. A tick whose engine lock could not be given back at its end
285
+ (its released ticket could not be written) fails too: its error is recorded
286
+ and the loop backs off, and its work was already recorded before the release.
287
+ The lock stays this service's, and the next tick gives it back before it takes
288
+ it again, instead of finding its own ticket and answering `busy` until the
289
+ service is started again.
290
+
291
+ A view refused for a file-system error does not fail the tick. Examples are
292
+ a vault folder that could not be allocated or placed (`vault-location-unusable`),
293
+ a configuration file that could not be read again during the tick, a source
294
+ removed while it was read (both `mixed-read`) and candidates that could not be
295
+ staged (`staging-failed`). The view's freshness names only the refusal, so the
296
+ service writes a `view-refused` line to its private log for each such view
297
+ whose refusal carries a file-system error's code, at most 64 a tick: the view,
298
+ the refusal's code and the error's code (`EACCES`, `EIO`, `ENOENT`, `ENOSPC`).
299
+ Only codes shaped as a file-system error's are written, never a message. A view
300
+ the next tick names for the same reason is not written again, so a folder that
301
+ stays unwritable (tried at every tick) is written once. It is written again when
302
+ its reason changes, or after a tick that failed or did not name it: a tick that
303
+ did not refuse it, refused it for no file-system error, had named 64 other
304
+ views first, or was refused as a whole. When removing the staged candidates
305
+ afterwards fails too, the line also names that error's code as `cleanupCause`,
306
+ and a line is written for that alone when the refusal names no error of its
307
+ own. That failure does not replace the refusal. What could not be removed
308
+ stays where it was: in `staging/`, or at its exchange path under `recovery/`
309
+ once the publication's journal is written. The restart recovery of the next
310
+ publication removes the latter.
272
311
 
273
312
  ### Cases that need a person
274
313
 
@@ -282,15 +321,153 @@ proceeds.
282
321
  accepts a connection and does not answer in time proves nothing.
283
322
  `inspectPrivateGenerationLock` reports the holder without changing anything.
284
323
 
285
- ### Operating-system startup
324
+ ### Operating-system startup: the login item
286
325
 
287
326
  `buildStartupAdapter` returns the text of a launchd user agent (macOS) or a
288
327
  systemd user unit (Linux) from the values it is given. It writes no file,
289
328
  installs nothing, runs no service manager and looks nothing up on the machine.
290
329
  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.
330
+ `startup-platform-unqualified`. The unit runs the service entry with
331
+ `--startup` in the root directory, with the search path it is given, and is
332
+ restarted after a crash or a non-zero exit but never after a clean one:
333
+
334
+ | Key | launchd | systemd |
335
+ | --- | --- | --- |
336
+ | Program | `ProgramArguments`: Node, the entry, `--startup`, `--project`, `--data-root`, `--workspace-id`, `--adapter` | `ExecStart`, the same words |
337
+ | Search path | `EnvironmentVariables` `PATH` | `Environment="PATH=…"` |
338
+ | Directory | `WorkingDirectory` `/` | `WorkingDirectory=/` |
339
+ | Start | `RunAtLoad` | `WantedBy=default.target` |
340
+ | Restart | `KeepAlive` `SuccessfulExit` false, `ThrottleInterval` 60 | `Restart=on-failure`, `RestartSec=60`, `RestartPreventExitStatus=2` |
341
+ | Stop | `ExitTimeOut` 60 (a tick in flight gets 30 s) | `TimeoutStopSec=60` |
342
+ | Process type | `Standard`: the service's budgets were measured without background I/O throttling | – |
343
+ | Output | `StandardOutPath`, `StandardErrorPath`: `state/service/login-item.log` | `StandardOutput`, `StandardError`: `append:` the same file |
344
+
345
+ Installing one is an explicit request (`service unit --install`), never a
346
+ side effect (`src/runtime/obsidian/login-item.mjs`):
347
+
348
+ 1. The entry is the one of the package installed for the project, found as
349
+ Node finds a package from the project's folder and named by that path,
350
+ not its real path, so an upgrade or a re-pointed link is what the next
351
+ start runs. Without one, the command's own package is used unless it lies
352
+ in a package runner's cache (npx, pnpm dlx, bunx) or a temporary folder:
353
+ `login-item-needs-installed-package`. Node is named by its real path, so a
354
+ version manager's per-shell link is never named. The search path keeps
355
+ absolute entries once, and none in a temporary folder. The unit always
356
+ names the data root the workspace was resolved under (the flag, the
357
+ pointer, the overlay's preference or the platform default, such as
358
+ `$XDG_DATA_HOME/atelier`) and the workspace identity, because the
359
+ manager's environment carries only the search path: the service at login
360
+ finds the same workspace, and, when the project no longer leads to it (it
361
+ moved, or its pointer is gone), records its refusal in the workspace the
362
+ unit names, if that exists.
363
+ 2. The consent is recorded before the unit is loaded, because the manager
364
+ starts the service as soon as it loads it: `--consent-actor ID`; for a
365
+ person at a terminal, the actor already recorded for the workspace or else
366
+ the account's name (asking for the login item there is that person's
367
+ consent); or a recorded consent that already covers startup. Otherwise
368
+ `startup-consent-required`. Its coverage becomes `service-and-startup`.
369
+ A proven service of an earlier release than the entry the unit will run
370
+ is stopped then, as `service stop` stops it, so the unit's own start at
371
+ load runs that entry instead of refusing beside the earlier one; if the
372
+ manager then refuses the unit, the entry is started as a child for this
373
+ session.
374
+ 3. The injected service manager (`service-managers.mjs`) writes the unit
375
+ atomically with mode 0644 and loads it. launchd: bootout of a loaded job
376
+ (it keeps the definition it was loaded with), a bounded wait until launchd
377
+ lets it go, then `bootstrap gui/<uid>`. systemd: `daemon-reload`, `enable`.
378
+ A unit file written where none was is removed again when the manager
379
+ does not take it, since launchd loads every property list in
380
+ `~/Library/LaunchAgents` at login.
381
+ A manager that refuses the unit takes the consent back to the one recorded
382
+ before; when none was, the consent just recorded stays for the actor, but
383
+ covers the service alone.
384
+ 4. `state/service/login-item.json` (`atelier-obsidian-login-item/v1`) records
385
+ the label, allocated once and kept, the unit file, the digest of its text,
386
+ the program and the search path. The answer is remembered as the
387
+ `loginItem` decision of the machine settings (`on`), by the actor named or
388
+ the person at the terminal; `--adapter=obsidian-cli`, when given, is
389
+ remembered as for `service start`.
390
+
391
+ The production manager (`service-manager-production.mjs`) is the only code
392
+ that runs `launchctl` or `systemctl` or writes into `~/Library/LaunchAgents`
393
+ or the user's systemd folder. It is imported only by the command entry, and
394
+ refuses under the Node test runner (`real-login-item-under-test`) and when
395
+ HOME is not the account's own home directory (`login-item-home-mismatch`):
396
+ a unit is registered in the account's real session whatever HOME says, so a
397
+ private HOME never installs one.
398
+
399
+ Once installed, `startService` starts the service through the manager
400
+ (`launchctl kickstart -p`, `systemctl --user start`) instead of spawning a
401
+ child, so two starts never compete, and accepts the runtime that proves itself
402
+ with a record naming the digest of the entry the unit runs; the runtime
403
+ identifier is the service's own there. As for a child, it waits for that
404
+ runtime to be healthy and answers `busy` only when the wait is over and the
405
+ runtime is still in its first tick. A listener that has not written its
406
+ record yet is waited for as that service, never adopted. On the way, a unit
407
+ whose text differs from what would be written now, keeping the recorded
408
+ search path, is written and loaded again (`loginItem: { refreshed: true }`).
409
+ The manager is asked first whether the person switched the item off (System
410
+ Settings on macOS, `systemctl --user disable` on Linux); one that is off is
411
+ neither written again, reloaded, enabled nor started through the manager
412
+ (`login-item-switched-off`). A unit that is switched off, whose file is gone,
413
+ or that the manager does not have loaded (no user systemd), is not forced: a
414
+ child is started for that command only, and the answer says why (`loginItem:
415
+ { via: 'child', reason }`). `requestServiceTick` replaces an outdated service the same way,
416
+ and so does `startService` with `replaceOutdated` (`service start`): a proven
417
+ runtime of an earlier release is stopped through its own listener, under the
418
+ start lock, and the installed entry started in its place
419
+ (`replaced: 'outdated'`); one of a later release is left running and
420
+ answered as `release: 'later'`.
421
+
422
+ Which release is installed is read from the entry that would be started
423
+ (`runtimeRelease`): the digest of that entry, and `readReleaseIdentity({
424
+ root })` of the package that entry's path names (its root is the folder above
425
+ `src/runtime/obsidian/service-main.mjs`, read without resolving links), read
426
+ now and never cached. With a login item that is the project's own package,
427
+ whatever package the command runs from, and a re-pointed link or a `file:`
428
+ install is read where it leads now. An entry that is not a package's service
429
+ entry (a test entry) is measured against this package's own release,
430
+ `releaseIdentity()`, the cached form a service records when it starts. Both
431
+ cover the package version and every file under `src/`, `contracts/` and
432
+ `plugins/`; a package without `plugins/` reads as one with an empty one.
433
+
434
+ Under `--startup` the service:
435
+
436
+ - writes its log into its own bounded `service.log`, as under `start`; the
437
+ unit's output file receives only what happens before that log is open;
438
+ - exits 0 on a refusal as well (another runtime of this workspace answers, no
439
+ consent that covers startup, an occupied port, arguments it cannot use), so
440
+ its manager does not start it again every minute, and records how the start
441
+ ended in `state/service/last-startup.json`
442
+ (`atelier-obsidian-last-startup/v1`: `at`, `outcome` `started` or
443
+ `refused`, `code`); `status` reports a refusal while the service is not
444
+ running. A refusal here is any error that carries a code, Node's system
445
+ errors included (`EACCES`, `EADDRNOTAVAIL` or `EMFILE` from listening,
446
+ `EPERM` where macOS privacy settings deny a folder): those, too, wait for
447
+ the next login or `open` instead of a restart every minute. Only an error
448
+ without a code exits 1 and is restarted;
449
+ - records the path it was started by beside its real path
450
+ (`executable.ext.invokedAs`), so the busy proof reads a process table that
451
+ names the entry through a link;
452
+ - after every tick, compares the release on disk, read through the path it
453
+ was started by, with the one it started with (`readReleaseIdentity`: the
454
+ package version and a digest of every file under `src/`, `contracts/` and
455
+ `plugins/`). The files' status is
456
+ compared first and the digest computed only when that differs; a package
457
+ that cannot be read is not a change yet. When they differ, the service
458
+ finishes the tick, removes its record and exits 75, which its manager
459
+ restarts on the new release.
460
+
461
+ `service unit --remove` lowers the consent to the service alone first, so a
462
+ unit a failed removal left behind could only refuse, then unloads it (launchd
463
+ `bootout`, systemd `disable --now`, which stop a service it runs) and deletes
464
+ the file and the record, and remembers `off`. It then starts the service again
465
+ at once as a detached child for this session, under the consent now recorded,
466
+ when the adapter is given or remembered; otherwise the next `open` starts it.
467
+ `uninstall` removes the login item and stops the proven service, remembers
468
+ `off`, starts nothing, and keeps the vaults, the private state, the project
469
+ file and Obsidian's vault list. Removing Obsidian's vault entries is not part
470
+ of it.
294
471
 
295
472
  The service entry refuses to run without an explicitly selected editor
296
473
  adapter. Public Atelier tests start only a test entry whose adapter reports
@@ -298,29 +475,56 @@ that no app runs, in temporary directories, on ephemeral loopback ports.
298
475
 
299
476
  ### The `obsidian` command
300
477
 
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.
478
+ `atelier obsidian <operation>` is the command-line surface over all of the
479
+ above. Every input is an argument. With `--json` it prints exactly one JSON
480
+ document, for a refusal too.
303
481
  Exit codes: 0 done, 1 an error nobody typed, 2 a typed refusal or a usage
304
482
  error, 3 the operation ran and its answer is not success.
305
483
 
306
484
  | Operation | What it does | Writes |
307
485
  | --- | --- | --- |
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 |
486
+ | `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 |
487
+ | `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 |
488
+ | `scope list`, `scope show ID` (also `view list`, `view show ID`) | the declared views | nothing |
489
+ | `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 |
490
+ | `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 |
491
+ | `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
492
  | `mode show`, `mode set manual\|automatic` | `automatic` refuses without an installed, matching, active automatic policy | private machine settings |
312
493
  | `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 |
494
+ | `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 |
495
+ | `service unit --print` | the text `service unit --install` would write now | nothing |
496
+ | `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 |
497
+ | `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 |
498
+ | `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
499
  | `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
500
 
317
501
  Reaching the installed app or the operating system is never a default.
318
502
  `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
503
+ `app-adapter-not-selected` unless `--adapter=obsidian-cli` is given, or was
504
+ given once before to `open` or `service start` of this workspace, which
505
+ remembers it (`selectAdapter`); `service unit --install` refuses the same way.
506
+ The service entry keeps its own explicit rule. The modules that talk to an app
507
+ are loaded only after that selection. A remembered adapter is used only by the
508
+ real command-line entry and never under the Node test runner
509
+ (`remembered-adapter-under-test`). A service manager is the caller's
510
+ (`serviceManager`, or `seams.serviceManager`), or, for the real command-line
511
+ entry only, the production one. Tests pass their own seams and a guard in the
322
512
  test file throws if anything tries to start the app, its command-line tool, an
323
- operating-system opener or a service manager.
513
+ operating-system opener or a service manager, touches the account's real
514
+ LaunchAgents or systemd folder, or starts the `obsidian` command's `open` or
515
+ `service` outside the test runner's context with an environment that leads to
516
+ the developer's app.
517
+
518
+ A person at a terminal is asked one thing, by `view add` only: whether to
519
+ write the change it shows to a file they commit. `--yes` answers beforehand,
520
+ and a question gets no answer after 10 minutes, which writes nothing. The
521
+ first start of the maintenance service records the account's name as the
522
+ actor that allowed it when no `--consent-actor` is given. A person is at a
523
+ terminal when standard input and output are both terminals and neither
524
+ `--json`, `--no-input`, a `CI` environment nor `ATELIER_NONINTERACTIVE=1`
525
+ says otherwise (`isInteractive`); under the test runner the process's own
526
+ terminal is never looked at. A recorded consent is never replaced by a derived
527
+ one.
324
528
 
325
529
  `open` answers one typed outcome, each with a one-line explanation and a next
326
530
  step. Only `current` is success:
@@ -331,7 +535,7 @@ step. Only `current` is success:
331
535
  | `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
536
  | `held-for-your-edit` | an edited note is preserved and held |
333
537
  | `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 |
538
+ | `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
539
  | `publisher-conflict` | another publisher or an uncoordinated editor holds the vault |
336
540
  | `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
541
  | `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 |