@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
@@ -35,6 +35,11 @@ Portable shapes refuse absolute paths. `atelier-project-config.v1` is
35
35
  unchanged: extension settings are validated by their own schema, and an
36
36
  unknown extension key refuses in the adapter, not in the project validator.
37
37
 
38
+ The `ext-settings` key `ext["mnstry.atelier.personal-workspace"]` is reserved.
39
+ Only a personal-workspace binding sets it, in memory, to name its generation.
40
+ A project whose settings declare it without a binding is refused at every
41
+ build with `personal-binding-lost`.
42
+
38
43
  ## Selection
39
44
 
40
45
  `selectScope({ canonicalSnapshot, profile, selector, expansion })` is the only
@@ -47,6 +52,31 @@ proceeds in canonical-identity order and reports truncation. Relation types are
47
52
  `contradicts`, `belongs_to` and the derived `links_to`. Literal oracles and
48
53
  refusals live in `fixtures/obsidian/contracts/oracles/scope-cases.json`.
49
54
 
55
+ ### Which notes are eligible
56
+
57
+ The eligibility a view is built with is decided by the machine settings of
58
+ the workspace (`eligibilityFor` in `src/runtime/obsidian/pipeline.mjs`), and
59
+ the engine, source apply, the proposal adapter and the selection operation
60
+ all ask it, so they agree on what a view holds. By default
61
+ (`DEFAULT_ELIGIBILITY`, revision
62
+ `classified-documents/v2+assets-embedded-by-eligible-documents/v1`) a node is
63
+ eligible only when the census classified it. When the audience decision is
64
+ `only-you` with `unclassified: shown`, and only then, an unclassified note is
65
+ eligible too, provided its bytes pass the byte lens the emitter reads notes
66
+ with, and it has no front matter or front matter whose every top-level line
67
+ starts at column 0 with a plain `key:` (an ASCII letter or `_`, then ASCII
68
+ letters, digits, `_` and `-`), none of them `kg`, with indented lines only as
69
+ the values of such keys, and in which the graph's own reading finds no `kg`
70
+ key either. A quoted key, a flow or JSON mapping, a complex key, a top-level
71
+ list, an indented root mapping or front matter the graph could not read keeps
72
+ it withheld, since it may carry a `kg.audience` such as `sensitive`
73
+ (`onlyYouEligibility`, revision
74
+ `classified-documents/v2+unclassified-notes-read-as-notes-for-only-you/v4+assets-embedded-by-eligible-documents/v1`).
75
+ An unclassified note carries the `private` audience, which "only you" admits.
76
+ An admitted note is an ordinary member of the view for the redaction guard:
77
+ its identity may appear in generated bytes of that view, and stays forbidden
78
+ in every view it is not part of. Assets follow the documents that embed them.
79
+
50
80
  ### What redaction covers
51
81
 
52
82
  The guarantee: Atelier never generates a reference to a note outside the
@@ -740,6 +770,77 @@ Before 0.2.0-alpha.10 no production reading was ever absent, because the probe
740
770
  found Atelier's own service; from that release this path, and this window, are
741
771
  live.
742
772
 
773
+ ### First publication into a vault no Obsidian lists
774
+
775
+ A running or unknowable app that cannot be coordinated with still refuses the
776
+ whole publication, with one exception, the `direct-unheld` path. It is chosen
777
+ at path selection only when all of these hold:
778
+
779
+ 1. The view has no committed generation.
780
+ 2. Its vault is the folder allocated for it (`vaultOrigin: 'allocated'`), and
781
+ that folder's device and inode are the ones its record names.
782
+ 3. The app's own settings file (`obsidian.json`) was read, and none of its
783
+ entries is the vault folder, a folder above it or a folder inside it. Both
784
+ sides are compared as written and by their real paths, in any letter case.
785
+ A file that cannot be read is read again, up to three times 50 ms apart,
786
+ because the app rewrites it with a plain write. A missing or unreadable
787
+ file, an entry whose folder is not an absolute path, an entry with a `..`
788
+ segment (the folder it names through a link cannot be placed by its text),
789
+ or a Flatpak or snap build of the app anywhere on the account (its list is
790
+ elsewhere) gives no evidence.
791
+ 4. The platform is macOS or Linux.
792
+
793
+ Any other case gives the refusal it gave before. The maintenance service reads
794
+ the evidence from the file and never asks the app.
795
+
796
+ On this path the publisher writes only creates: a file appears through the
797
+ exclusive link where nothing is, or not at all. A unit that would replace or
798
+ remove a file, or write a settings file over one that is there, refuses as
799
+ `editor-uncoordinated` (blocking) and writes nothing. A settings file that
800
+ already holds exactly what the policy asks is left as it is, which is what an
801
+ interrupted run of this path leaves. A file already at a note path is kept as
802
+ `create-conflict`. The evidence is read again immediately before the first
803
+ unit and whenever two seconds have passed. Once a reading gives none, every
804
+ remaining unit refuses, a kept one included, and nothing is committed. The
805
+ view lock and the vault lock are taken as on every path, and the journal
806
+ records `mode: 'direct-unheld'`. Restart recovery and the late-writer check
807
+ treat it as a `direct` journal.
808
+
809
+ Why this loses nothing a person wrote, whoever holds the vault: no editor can
810
+ hold an unsaved buffer of a file that does not exist; the link either makes
811
+ the whole file appear or fails because something is there, which is kept; and
812
+ an editor that later saves over a created file wins, and is read as an edit.
813
+ The list evidence is for the experience, and it holds only for a run that
814
+ completes: that run is committed before `open` first tells the app about the
815
+ vault. A run that stops partway commits nothing. That happens when the list
816
+ names the folder meanwhile, a settings file with other bytes is already there,
817
+ or an interrupted run left a replacement or a removal. The view then reports
818
+ `editor-uncoordinated` and falls back to the coordinated path: `open` may add
819
+ the vault to the app and open it before it is complete, and what is left,
820
+ every replacement and removal included, is published through the app with its
821
+ usual base and buffer checks. The person may see an incomplete vault then;
822
+ nothing they write is at risk. Lists this account's app does not keep are
823
+ covered by the argument above alone: another user-data folder, another
824
+ machine through a synced folder.
825
+
826
+ A maintenance service whose app does not qualify (its command line off, no
827
+ vault open, a version below the floor) no longer keeps such a view from its
828
+ first publication: the publisher is reached with an adapter that coordinates
829
+ with nothing, and takes this path when every condition holds. When the path
830
+ does not apply, or the run stops partway at a unit refused as
831
+ `editor-uncoordinated`, the view reports the app's refusal, as before. `open`
832
+ then answers that refusal without adding the vault to the app, unless the
833
+ person asks it to restart Obsidian (`--restart-obsidian`): the vault is then
834
+ added and opened, and may be incomplete until the app has published the rest.
835
+ One case opens a vault without that flag: with the app running and no vault
836
+ open, a vault the app already lists is opened by its path, as before this
837
+ path existed, and may be incomplete. A run that stops only on a file in its
838
+ way reports that (`create-conflict`). When it stops for more than one reason,
839
+ one is reported: while the app does not qualify, the app's refusal wins over a
840
+ file in the way, and while it qualifies, the first blocking unit's reason is
841
+ reported. A reason not reported comes back at a later run, and nothing is
842
+ written meanwhile.
843
+
743
844
  ### Proven boundary
744
845
 
745
846
  macOS (Darwin 25, arm64) with Obsidian 1.13.7 (installer 1.12.7), CLI enabled,
@@ -793,9 +894,13 @@ each open item is discharged with its own evidence.
793
894
  Obsidian opens a vault from a link only when the folder is in its own vault
794
895
  list. `atelier obsidian open` puts the view's vault there.
795
896
  Outside its own storage (the data root, which holds the vaults and their
796
- policy-owned `.obsidian/core-plugins.json`), the list is the only file of
797
- another application that Atelier writes; to write it, Atelier writes nothing
798
- else outside the app's user-data directory, and no vault note.
897
+ policy-owned `.obsidian/core-plugins.json`), the settings file that holds the
898
+ list is the only file of another application that Atelier writes, and in it
899
+ only two things: the view's vault entry and the command-line switch `cli`. To
900
+ write it, Atelier writes nothing else outside the app's user-data directory,
901
+ and no vault note. Every write is shown in `open`'s answer
902
+ (`obsidianSettings`: the file, whether it was created, whether the vault was
903
+ added, whether the switch was turned on, and the backup).
799
904
 
800
905
  **The file.** `obsidian.json` in the app's user-data directory:
801
906
  `$HOME/Library/Application Support/obsidian/` on macOS and
@@ -833,7 +938,14 @@ root under another name is not recognised.
833
938
  **While Obsidian runs with no vault open**, its command line answers nothing
834
939
  and the file is still the running app's: it is read, never written. A vault
835
940
  it already lists is opened by path; one it does not is refused as
836
- `no-vault-open`.
941
+ `no-vault-open`, unless the person asked for a restart (below).
942
+
943
+ **While Obsidian runs with its command line off**, it answers every command
944
+ but a link with "Command line interface is not enabled", read as
945
+ `app-cli-unavailable` / `cli-turned-off`. The file is the running app's, which
946
+ holds the switch in memory and writes it back with its list, so it is not
947
+ written; the switch is turned on only while no Obsidian runs, or through the
948
+ restart below.
837
949
 
838
950
  **Never inside another vault.** In every state, a vault inside a folder the
839
951
  list has as a vault already (compared as written, against the vault root and
@@ -879,19 +991,21 @@ then:
879
991
  a JSON object whose `vaults`, when present, is an object, of at most 4 MiB.
880
992
  A file with a second name (a hard link) is refused as
881
993
  `obsidian-settings-unsafe`: the replacement would leave that name with the
882
- old list. A missing
883
- directory or file means Obsidian has not run on this account and is
884
- refused (`obsidian-settings-missing`): the file is never created. The other
994
+ old list. A missing file means Obsidian never started on this account; it
995
+ is created as described under "Obsidian never started" below. The other
885
996
  refusals are `obsidian-settings-unsafe`, `obsidian-settings-not-owned`,
886
997
  `obsidian-settings-unreadable` and `obsidian-settings-not-object`.
887
- 3. A vault whose real path an entry already has is left as it is; nothing is
888
- written. A vault inside a folder an entry has is refused
889
- (`vault-inside-another-vault`).
998
+ 3. A vault whose real path an entry already has is left as it is. When `cli`
999
+ is already `true` too, nothing is written. A vault inside a folder an
1000
+ entry has is refused (`vault-inside-another-vault`).
890
1001
  4. The new document is the file's object with one entry added under a fresh
891
1002
  random 16-hex id that no entry has: `{ path: <the vault root's real path>,
892
- ts: <now, ms>, open: true }`. Every other key and every other entry is kept
893
- in its place, as values. A document that would be larger than 4 MiB is
894
- refused (`obsidian-settings-too-large`).
1003
+ ts: <now, ms>, open: true }`, unless the vault is listed already, and with
1004
+ `cli` set to `true` when it is not (the command-line switch: in its place
1005
+ when the file has the key, otherwise last, as the app adds it). Every
1006
+ other key and every other entry is kept in its place, as values. A
1007
+ document that would be larger than 4 MiB is refused
1008
+ (`obsidian-settings-too-large`).
895
1009
  5. A temporary file in the same directory is written with the file's mode and
896
1010
  fsynced; the bytes as they were are written, fsynced, to
897
1011
  `obsidian.json.atelier-backup-<UTC time>` beside it.
@@ -912,6 +1026,91 @@ then:
912
1026
 
913
1027
  Every refusal writes nothing and leaves nothing behind: a temporary file or
914
1028
  backup created on the way is removed again whichever later step fails.
1029
+
1030
+ **Obsidian never started.** When the file does not exist and the process
1031
+ table says, positively, `absent` (read before, and again immediately before
1032
+ the file appears), the file is created, and only then:
1033
+
1034
+ 1. The user-data directory must be this user's own real directory. When it
1035
+ does not exist, it is created with mode 0700, only inside an existing
1036
+ parent directory that is this user's own and no link; a missing parent is
1037
+ `obsidian-settings-missing`, and nothing is created above the directory.
1038
+ 2. The content is exactly `{ "vaults": { "<16 hex>": { "path": <the vault
1039
+ root's real path>, "ts": <now, ms>, "open": true } }, "cli": true }`, mode
1040
+ 0600. The app reads the file at start-up (a missing or unreadable one reads
1041
+ as no settings) and opens every vault flagged open, so a plain start opens
1042
+ this one, with its command line on.
1043
+ 3. The bytes are written and fsynced to a temporary file in the directory,
1044
+ which is then hard-linked to `obsidian.json` and removed: the file appears
1045
+ complete or not at all, and the link fails on any file there, one the app
1046
+ wrote meanwhile included, which is kept (`obsidian-settings-changed`). The
1047
+ directory is fsynced. There is nothing to back up.
1048
+ 4. An app that appears before the link refuses (`app-may-be-running`); one
1049
+ that appears right after it leaves the addition unconfirmed, as in step 7
1050
+ above. A refusal removes the temporary file and a directory created on the
1051
+ way.
1052
+
1053
+ `open` answers `registration.how: 'created-settings'` for it.
1054
+
1055
+ **Restart, only when the person asks** (`open --restart-obsidian`; never
1056
+ implied, and refused by every other operation). Only in the two states above
1057
+ where the app runs and cannot be reached: its command line off, or no vault
1058
+ open and the view's vault not in its list. Module:
1059
+ `src/runtime/obsidian/app-restart.mjs`.
1060
+
1061
+ 0. Read-only, before anything is sent (`settingsWriteOutlook`): the view's
1062
+ vault folder exists, the settings file reads as in step 2 above (no
1063
+ Flatpak or snap build), has one name, would stay within 4 MiB with the
1064
+ entry, and lists no vault at a folder above the vault's. A file that does
1065
+ not exist (the app has shown only its starter window, which writes none)
1066
+ is the create case, checked as "Obsidian never started" checks before it
1067
+ writes (step 1 there); it is created after the quit. Otherwise `open`
1068
+ answers that refusal and the app keeps running. Once the main process is
1069
+ proven (step 2 below), right before the first signal, a copy of an existing
1070
+ file is kept beside it under the backup name (`backupObsidianSettings`,
1071
+ fsynced, the file's mode; `restart.settingsCopy`); a copy that cannot be
1072
+ kept sends nothing. The write in the same run does not prune that copy
1073
+ (`keepBackups`); a later write prunes it as step 7 says.
1074
+ 1. The app's main process is proven from the process table
1075
+ (`ps -ww -A -o pid=,ppid=,uid=,comm=`; a uid is signed, since macOS shows
1076
+ `nobody` as -2): every Obsidian process (the names the process probe
1077
+ counts) runs as this user, exactly one names the app bundle's main
1078
+ executable by an absolute path (`…/Contents/MacOS/Obsidian`), and every
1079
+ other one is its child. `comm` is the process's argv[0], not a verified
1080
+ image: a process of the same user could take that name, which proves
1081
+ nothing while the real app runs too (two main processes). Otherwise nothing
1082
+ is sent (`app-main-process-unproven`, with `restart.detail`).
1083
+ 2. That process is read again (`ps -o ppid=,uid=,lstart=,comm=`): it must be
1084
+ this user's, under the parent the table showed, with the same name, and
1085
+ read the same twice in a row; then it, and only it, gets SIGTERM, which
1086
+ Electron handles as a quit. The app closes every window, keeping the
1087
+ vaults that were open flagged open, and its helpers end (1.13.7, checked on
1088
+ an isolated instance).
1089
+ 3. The process probe must say `absent` within 30 seconds. On macOS the main
1090
+ process can stay after the first SIGTERM, with no window (seen on
1091
+ an isolated 1.13.7, with vaults open and with only the starter window).
1092
+ Electron handles only the first SIGTERM as a quit; a second one ends the
1093
+ process at once, without its quit handlers. It is sent once, only when the
1094
+ table shows that same process alone (no helper) and it reads the same, at
1095
+ two readings at least 5 seconds apart. There is never a third signal, and
1096
+ never another kind; `restart.signals` counts the signals delivered.
1097
+ Otherwise `open` answers `launch-failed` / `app-did-not-quit`, writes
1098
+ nothing and starts nothing.
1099
+ 4. The file is written as above, with the vault and the switch.
1100
+ 5. The app is started plainly (`open -b md.obsidian`) by the launch steps
1101
+ below, and reopens its vaults and this one. An answer given after the quit
1102
+ and before the launch (the file could not take the vault, say) starts the
1103
+ app plainly first, as it was; a start that fails is said, with the next
1104
+ step to start it by hand.
1105
+
1106
+ The answer carries `restart: { asked, state, quit, signalled, pid, signals,
1107
+ settingsCopy, startedAgain }`, and `reason` and `detail` when it did not quit.
1108
+ An `open` interrupted between the quit and the start leaves the app quit (a
1109
+ known limit). At a terminal the restart still needs the flag; the question the
1110
+ design asks in that state comes with the first-run command. Qualified on macOS only; elsewhere the answer is
1111
+ `restart-platform-unqualified`, since a quit app there is started with a
1112
+ link, which would drop the other vaults' reopen flags.
1113
+
915
1114
  `open` then shows the vault by the steps of `launchPlan`
916
1115
  (`src/runtime/obsidian/launch-plan.mjs`, carried out by `runLaunchPlan`),
917
1116
  naming it `obsidian://open?vault=<id>` when the id reaches it first (a path is
@@ -925,7 +1124,13 @@ plainly (`open -b md.obsidian`), which reopens every vault the list flags open
925
1124
  tool once the app itself answers the tool (`appAnswered`: a version or one of
926
1125
  the app's own lines; the tool's "unable to find Obsidian" while the app starts
927
1126
  does not count). A link is never handed to the operating system for an app
928
- this launch started, since that would reach it while it starts. An app started with a link would delete the
1127
+ this launch started, since that would reach it while it starts. A link the
1128
+ started app did not take is left to it when the list flags the vault open,
1129
+ since the plain start reopens it; for a listed vault that is closed, which a
1130
+ plain start does not reopen, the link is handed once more, through the tool
1131
+ only (this launch started the app), one wait round later, before `open`
1132
+ answers `launch-failed` /
1133
+ `app-did-not-answer-for-this-vault`. An app started with a link would delete the
929
1134
  reopen flag of every other vault without a window (1.13.7, checked on an
930
1135
  isolated instance). On Linux a quit app is started with the link, a known
931
1136
  limit. With its command line turned off the app answers every other command
@@ -1095,6 +1300,7 @@ today) it refuses `exchange-unavailable`. Both write nothing.
1095
1300
  | `interrupted-before-exchange`, `apply-interrupted-needs-person` | what restart recovery decided for an interrupted apply |
1096
1301
  | `recovery-state-unreadable` | a candidate, backup or source path of an interrupted apply may not be looked at or read; nothing is settled from a read this process was denied, that record is reported with its intent still open, and every other one is still settled |
1097
1302
  | `apply-outcome-unknown` | the source was exchanged and the settlement from digests could not be carried out; the source may have been changed, the intent stays open and `apply recover` decides |
1303
+ | `personal-overlay-proposals-only` | the note is a private note of a personal workspace, whose file belongs to a module-owned generation; nothing is written there. The proposal adapter's observation answers the same edit with `personal-overlay-not-proposed`, and records nothing |
1098
1304
 
1099
1305
  A path that another program removes or replaces between two steps, before the
1100
1306
  intent is recorded, answers one of these refusals (`source-missing`,
@@ -1317,7 +1523,9 @@ line, 16 MiB, 10,000 events, and an unreadable line refuses every append.
1317
1523
  | `ledger-corrupt` | refused, for that repository only; other repositories progress in the same tick |
1318
1524
  | `store-unavailable` | the store cannot be read or is locked now; waits like a full one |
1319
1525
 
1320
- A waiting operation is tried at most 8 times, 60 seconds after the first attempt
1526
+ For a personal workspace whose graph the engine has not confirmed yet, a due
1527
+ operation is left as it is (`personal-validation-pending`), and that tick is not
1528
+ counted as an attempt. A waiting operation is tried at most 8 times, 60 seconds after the first attempt
1321
1529
  and twice as long after each, up to an hour. At most 8 operations per repository
1322
1530
  and 64 unexamined edits are looked at per tick. A repository holds at most 4096
1323
1531
  operations, 256 of them open, 64 records of 16 KiB each; a full queue refuses
@@ -104,18 +104,48 @@ at the maintenance service's next tick, with nothing changed at the view's
104
104
  sources: the service compares the plugin files each committed generation pins
105
105
  with the disk, has a view whose files differ prepared again, and a generation
106
106
  that is already committed is published again, as it is, with its notes kept.
107
- A drift left for the person is asked about once, and again once it changes;
107
+ A drift left for the person is asked about once, and again once it changes.
108
+ What a publication could not change is not asked about again: a drift that
109
+ publishing cannot repair (the data file of a vault root that is a link, say)
110
+ is asked about at most once more after a publication that left it, which
111
+ writes no vault file (the view is prepared again and takes the vault's lock,
112
+ and for that tick shows as `stale`, then `updating`, before it is `current`
113
+ again), and not again after that. A plugin file
114
+ another writer removes or changes after the publication, even while the same
115
+ tick goes on, unless it holds again what it held before the tick under the
116
+ same pin and vault root, and a path
117
+ the person repairs before the tick ends (the vault root made private,
118
+ say), is asked about at the next look and written;
108
119
  where the plugin is turned off in the vault, a pinned file that is gone is no
109
120
  drift. Publishing a committed generation again needs the app when one runs;
110
121
  if that app does not qualify, nothing is written, the view stays `current`
111
122
  (a committed generation needs no app, so an app that cannot be qualified
112
123
  never makes a current view stale), and the file is written at a later
113
124
  attempt, on the retry schedule of an unsettled view, once the app
114
- qualifies. (The settings files are held to the same rule for a file nobody
125
+ qualifies. A drift that publishing would only leave for the person again
126
+ (the data file of a vault root that is a link or not private, a folder where
127
+ a file goes) is no reason to publish again and needs no app: the path is
128
+ left as it is, and the view keeps its plain reason. Nothing in `status` or
129
+ `open` names such a path yet; without its data file the plugin cannot reach
130
+ the service, so it shows as not present (`no-live-lease`). A few paths the
131
+ publisher leaves for the person still count as a drift here, and wait for the
132
+ app as one: a file nobody may read, a parent folder that cannot be looked
133
+ into, and a vault root Atelier keeps whose mode cannot be changed. Until the app qualifies, a
134
+ view waiting for it has the reason
135
+ `verified-by-read-back-plugin-waits-for-app` rather than
136
+ `verified-by-read-back`, and `status` and `open` add `plugin files wait for
137
+ the app` to the plugin line (`files: "waits-for-app"` in `--json`), with a
138
+ next step for the plugin. (The settings files are held to the same rule for a file nobody
115
139
  may read.) A plugin file that another program changes while a publication runs
116
140
  is a race and is handled like one on a note: that publication does not
117
141
  commit, the view is tried again, and the file is planned from the disk anew
118
142
  (`plugin-file-changed`); nothing reads a plugin file as an edit of a note.
143
+ The view is then `publisher-conflict`, and its next step in `status` and
144
+ `open` names that file as what stopped the publication (changed by another
145
+ program or by the person; one change is enough), rather than asking the
146
+ person to close another publisher; the same holds for a settings file
147
+ (`settings-changed`). The reason is the first unit that stopped the
148
+ publication, so other causes are not ruled out.
119
149
  Upgrades replace the plugin files the same way. The plugin's version in
120
150
  `manifest.json` changes whenever its code does, and the test suite holds the
121
151
  two together: the app keeps running the `main.js` it loaded until it reloads
@@ -423,10 +453,14 @@ answer decides wherever it gives one:
423
453
  and opens by path the vault the app lists. Where the settings file does
424
454
  not show it (a sandboxed build, say), or where it lists it and, once the
425
455
  vault is opened, the command line still does not answer for it while only
426
- the plugin reports the version, `open` answers at once
456
+ the plugin reports the version, `open` answers
427
457
  `app-cli-unavailable` / `vault-open-cli-silent`: the plugin shows the vault
428
458
  open, so the command line is what did not answer, and waiting for the app
429
- would change nothing.
459
+ would change nothing. After a launch that answer is given at the second
460
+ such round in a row, not the first: one tool call that timed out while the
461
+ app was busy opening its window looks the same once, and `open` then goes
462
+ on waiting for the vault. A wait that ends right after one such round gives
463
+ the same answer.
430
464
  - Whether an app runs is the process table's answer, which says no only when
431
465
  it finds no Obsidian process at all. A lease outlives its app by up to the
432
466
  lease time (six seconds after a crash), and any process that holds the