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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. package/CHANGELOG.md +1005 -0
  2. package/README.md +149 -9
  3. package/contracts/atelier-adoption-policy.v2.schema.json +55 -0
  4. package/contracts/atelier-architecture.v1.schema.json +258 -0
  5. package/contracts/atelier-boundary-delegations.v1.schema.json +161 -0
  6. package/contracts/atelier-boundary-owner-keys.v1.schema.json +98 -0
  7. package/contracts/atelier-build.v1.schema.json +1076 -0
  8. package/contracts/atelier-capability.v1.schema.json +1252 -0
  9. package/contracts/atelier-coordination.v1.schema.json +1050 -0
  10. package/contracts/atelier-evidence-navigation.v1.schema.json +603 -0
  11. package/contracts/atelier-harness.v1.schema.json +234 -0
  12. package/contracts/atelier-ingestion.v1.schema.json +806 -0
  13. package/contracts/atelier-inquiry.v1.schema.json +1772 -0
  14. package/contracts/atelier-instruction-adoption.v1.schema.json +490 -0
  15. package/contracts/atelier-interaction.v1.schema.json +553 -0
  16. package/contracts/atelier-judgment.v1.schema.json +690 -0
  17. package/contracts/atelier-knowledge.v1.schema.json +1512 -0
  18. package/contracts/atelier-learning.v1.schema.json +1095 -0
  19. package/contracts/atelier-migration.v3.schema.json +64 -0
  20. package/contracts/atelier-obsidian-generation-manifest.v2.schema.json +372 -0
  21. package/contracts/atelier-personal-workspace-manifest.v1.schema.json +87 -0
  22. package/contracts/atelier-personal-workspace-overlay.v1.schema.json +299 -0
  23. package/contracts/atelier-template-adoption.v1.schema.json +223 -0
  24. package/contracts/atelier-template-profile.v1.schema.json +1168 -0
  25. package/contracts/atelier-trackable.v1.schema.json +781 -0
  26. package/contracts/atelier-upgrade-plan.v3.schema.json +532 -0
  27. package/contracts/compat-baseline.json +1 -1
  28. package/docs/architecture.md +89 -0
  29. package/docs/assurance-controls.md +4 -3
  30. package/docs/blocks/capability-stewardship.md +17 -0
  31. package/docs/blocks/claims.md +16 -3
  32. package/docs/blocks/inquiry-harnesses.md +19 -0
  33. package/docs/blocks/learning-harnesses.md +17 -0
  34. package/docs/capability-stewardship.md +269 -0
  35. package/docs/coordination.md +51 -0
  36. package/docs/decision-practices.md +111 -0
  37. package/docs/decisions.md +29 -0
  38. package/docs/evidence-navigation.md +237 -0
  39. package/docs/exact-upgrades.md +3 -2
  40. package/docs/ingestion.md +181 -0
  41. package/docs/inquiry-harnesses.md +211 -0
  42. package/docs/install.md +80 -3
  43. package/docs/intake-and-guides.md +5 -0
  44. package/docs/integration-contract-decisions.md +24 -2
  45. package/docs/interaction-and-reflection.md +72 -0
  46. package/docs/knowledge-graph.md +20 -0
  47. package/docs/knowledge-health/api.md +30 -0
  48. package/docs/knowledge-health/assessment/api.md +96 -0
  49. package/docs/knowledge-health/assessment/capabilities.md +40 -0
  50. package/docs/knowledge-health/assessment/evaluation.md +27 -0
  51. package/docs/knowledge-health/assessment/facilitator.md +30 -0
  52. package/docs/knowledge-health/assessment/quickstart.md +61 -0
  53. package/docs/knowledge-health/assessment/troubleshooting.md +23 -0
  54. package/docs/knowledge-health/devday/facilitator.md +16 -0
  55. package/docs/knowledge-health/devday/participant-response.md +22 -0
  56. package/docs/knowledge-health/devday/public-default.md +107 -0
  57. package/docs/knowledge-health/devday/quickstart.md +18 -0
  58. package/docs/knowledge-health/devday/support.md +22 -0
  59. package/docs/knowledge-health/exercise.md +17 -0
  60. package/docs/knowledge-health/facilitator.md +20 -0
  61. package/docs/knowledge-health/quickstart.md +94 -0
  62. package/docs/knowledge-health/readme.md +15 -0
  63. package/docs/knowledge-health/support.md +34 -0
  64. package/docs/knowledge-setup.md +248 -0
  65. package/docs/knowledge-workspace.md +264 -0
  66. package/docs/learning-harnesses.md +238 -0
  67. package/docs/learning.md +215 -0
  68. package/docs/local-services.md +242 -26
  69. package/docs/obsidian-contract.md +878 -36
  70. package/docs/obsidian-plugin.md +619 -0
  71. package/docs/obsidian.md +809 -64
  72. package/docs/optional-ingestion.md +83 -0
  73. package/docs/personal-workspace.md +257 -0
  74. package/docs/practical-judgment.md +92 -0
  75. package/docs/progressive-ingestion-acceptance.md +89 -0
  76. package/docs/progressive-ingestion.md +235 -0
  77. package/docs/project-command-inventory.md +1 -0
  78. package/docs/release-engineering.md +56 -1
  79. package/docs/repo-boundary-guard.md +94 -0
  80. package/docs/research-starter-quickstart.md +66 -0
  81. package/docs/research-starter.md +114 -0
  82. package/docs/semantic-ingestion.md +198 -0
  83. package/docs/semantic-operation.md +317 -0
  84. package/docs/skill-steward.md +6 -0
  85. package/docs/template-profile.md +164 -0
  86. package/docs/template-upgrades.md +114 -0
  87. package/docs/trackables.md +111 -0
  88. package/docs/upgrade.md +68 -3
  89. package/fixtures/atelier-architecture/binding/invalid/document.json +19 -0
  90. package/fixtures/atelier-architecture/binding/valid/document.json +19 -0
  91. package/fixtures/atelier-architecture/catalog/invalid/document.json +290 -0
  92. package/fixtures/atelier-architecture/catalog/valid/document.json +343 -0
  93. package/fixtures/atelier-build-contract/attempt/invalid/document.json +20 -0
  94. package/fixtures/atelier-build-contract/attempt/valid/document.json +19 -0
  95. package/fixtures/atelier-build-contract/candidate/invalid/document.json +24 -0
  96. package/fixtures/atelier-build-contract/candidate/valid/document.json +23 -0
  97. package/fixtures/atelier-build-contract/decision/invalid/document.json +31 -0
  98. package/fixtures/atelier-build-contract/decision/valid/document.json +30 -0
  99. package/fixtures/atelier-build-contract/delivery/invalid/document.json +18 -0
  100. package/fixtures/atelier-build-contract/delivery/valid/document.json +17 -0
  101. package/fixtures/atelier-build-contract/gate/invalid/document.json +22 -0
  102. package/fixtures/atelier-build-contract/gate/valid/document.json +21 -0
  103. package/fixtures/atelier-build-contract/ledger/invalid/document.json +270 -0
  104. package/fixtures/atelier-build-contract/ledger/valid/document.json +269 -0
  105. package/fixtures/atelier-build-contract/objective/invalid/document.json +73 -0
  106. package/fixtures/atelier-build-contract/objective/valid/document.json +72 -0
  107. package/fixtures/atelier-build-contract/progress/invalid/document.json +18 -0
  108. package/fixtures/atelier-build-contract/progress/valid/document.json +17 -0
  109. package/fixtures/atelier-capability-contract/adoption/invalid/document.json +71 -0
  110. package/fixtures/atelier-capability-contract/adoption/valid/document.json +70 -0
  111. package/fixtures/atelier-capability-contract/event/invalid/document.json +18 -0
  112. package/fixtures/atelier-capability-contract/event/valid/document.json +17 -0
  113. package/fixtures/atelier-capability-contract/journal/invalid/document.json +382 -0
  114. package/fixtures/atelier-capability-contract/journal/valid/document.json +381 -0
  115. package/fixtures/atelier-capability-contract/notice/invalid/document.json +8 -0
  116. package/fixtures/atelier-capability-contract/notice/valid/document.json +7 -0
  117. package/fixtures/atelier-capability-contract/package/invalid/document.json +59 -0
  118. package/fixtures/atelier-capability-contract/package/valid/document.json +58 -0
  119. package/fixtures/atelier-capability-contract/plan/invalid/document.json +107 -0
  120. package/fixtures/atelier-capability-contract/plan/valid/document.json +106 -0
  121. package/fixtures/atelier-capability-contract/release/invalid/document.json +85 -0
  122. package/fixtures/atelier-capability-contract/release/valid/document.json +84 -0
  123. package/fixtures/atelier-capability-contract/state/invalid/document.json +316 -0
  124. package/fixtures/atelier-capability-contract/state/valid/document.json +315 -0
  125. package/fixtures/atelier-coordination/dependency/invalid/document.json +37 -0
  126. package/fixtures/atelier-coordination/dependency/valid/document.json +36 -0
  127. package/fixtures/atelier-coordination/directive/invalid/document.json +25 -0
  128. package/fixtures/atelier-coordination/directive/valid/document.json +24 -0
  129. package/fixtures/atelier-coordination/disposition/invalid/document.json +34 -0
  130. package/fixtures/atelier-coordination/disposition/valid/document.json +33 -0
  131. package/fixtures/atelier-coordination/outcome/invalid/document.json +39 -0
  132. package/fixtures/atelier-coordination/outcome/valid/document.json +38 -0
  133. package/fixtures/atelier-coordination/recovery/invalid/document.json +34 -0
  134. package/fixtures/atelier-coordination/recovery/valid/document.json +33 -0
  135. package/fixtures/atelier-harness-contract/handoff/invalid/document.json +25 -0
  136. package/fixtures/atelier-harness-contract/handoff/valid/document.json +24 -0
  137. package/fixtures/atelier-ingestion/invalid/authority.json +19 -0
  138. package/fixtures/atelier-ingestion/semantic-baseline.json +26 -0
  139. package/fixtures/atelier-ingestion/semantic-operation.json +75 -0
  140. package/fixtures/atelier-ingestion/valid/plan-input.json +18 -0
  141. package/fixtures/atelier-inquiry-contract/assessment/invalid/document.json +41 -0
  142. package/fixtures/atelier-inquiry-contract/assessment/valid/document.json +40 -0
  143. package/fixtures/atelier-inquiry-contract/bundle/invalid/document.json +51 -0
  144. package/fixtures/atelier-inquiry-contract/bundle/valid/document.json +50 -0
  145. package/fixtures/atelier-inquiry-contract/campaign/invalid/document.json +17 -0
  146. package/fixtures/atelier-inquiry-contract/campaign/valid/document.json +16 -0
  147. package/fixtures/atelier-inquiry-contract/decision/invalid/document.json +22 -0
  148. package/fixtures/atelier-inquiry-contract/decision/valid/document.json +21 -0
  149. package/fixtures/atelier-inquiry-contract/feedback/invalid/document.json +19 -0
  150. package/fixtures/atelier-inquiry-contract/feedback/valid/document.json +18 -0
  151. package/fixtures/atelier-inquiry-contract/handoff/invalid/document.json +92 -0
  152. package/fixtures/atelier-inquiry-contract/handoff/valid/document.json +91 -0
  153. package/fixtures/atelier-inquiry-contract/hypothesis/invalid/document.json +20 -0
  154. package/fixtures/atelier-inquiry-contract/hypothesis/valid/document.json +19 -0
  155. package/fixtures/atelier-inquiry-contract/ledger/invalid/document.json +680 -0
  156. package/fixtures/atelier-inquiry-contract/ledger/valid/document.json +679 -0
  157. package/fixtures/atelier-inquiry-contract/legacy-assessment/invalid/document.json +19 -0
  158. package/fixtures/atelier-inquiry-contract/legacy-assessment/valid/document.json +18 -0
  159. package/fixtures/atelier-inquiry-contract/request/invalid/document.json +50 -0
  160. package/fixtures/atelier-inquiry-contract/request/valid/document.json +49 -0
  161. package/fixtures/atelier-inquiry-contract/source/invalid/document.json +18 -0
  162. package/fixtures/atelier-inquiry-contract/source/valid/document.json +17 -0
  163. package/fixtures/atelier-inquiry-contract/withdrawal/invalid/document.json +16 -0
  164. package/fixtures/atelier-inquiry-contract/withdrawal/valid/document.json +15 -0
  165. package/fixtures/atelier-instruction-adoption/context-receipt/invalid/document.json +18 -0
  166. package/fixtures/atelier-instruction-adoption/context-receipt/valid/document.json +17 -0
  167. package/fixtures/atelier-instruction-adoption/plan/invalid/document.json +63 -0
  168. package/fixtures/atelier-instruction-adoption/plan/valid/document.json +62 -0
  169. package/fixtures/atelier-instruction-adoption/receipt/invalid/document.json +22 -0
  170. package/fixtures/atelier-instruction-adoption/receipt/valid/document.json +21 -0
  171. package/fixtures/atelier-instruction-adoption/state/invalid/document.json +30 -0
  172. package/fixtures/atelier-instruction-adoption/state/valid/document.json +29 -0
  173. package/fixtures/atelier-interaction/act/invalid/document.json +25 -0
  174. package/fixtures/atelier-interaction/act/valid/document.json +24 -0
  175. package/fixtures/atelier-interaction/assessment/invalid/document.json +32 -0
  176. package/fixtures/atelier-interaction/assessment/valid/document.json +31 -0
  177. package/fixtures/atelier-interaction/observation/invalid/document.json +22 -0
  178. package/fixtures/atelier-interaction/observation/valid/document.json +21 -0
  179. package/fixtures/atelier-interaction/policy/invalid/document.json +20 -0
  180. package/fixtures/atelier-interaction/policy/valid/document.json +19 -0
  181. package/fixtures/atelier-judgment/case/invalid/document.json +76 -0
  182. package/fixtures/atelier-judgment/case/valid/document.json +75 -0
  183. package/fixtures/atelier-judgment/decision/invalid/document.json +38 -0
  184. package/fixtures/atelier-judgment/decision/valid/document.json +37 -0
  185. package/fixtures/atelier-judgment/native-decision.md +3 -0
  186. package/fixtures/atelier-judgment/practice-reconsideration/definition.json +92 -0
  187. package/fixtures/atelier-judgment/practice-reconsideration/scenario.json +435 -0
  188. package/fixtures/atelier-knowledge-contract/activation/invalid/document.json +26 -0
  189. package/fixtures/atelier-knowledge-contract/activation/valid/document.json +25 -0
  190. package/fixtures/atelier-knowledge-contract/contribution/invalid/document.json +34 -0
  191. package/fixtures/atelier-knowledge-contract/contribution/valid/document.json +33 -0
  192. package/fixtures/atelier-knowledge-contract/domain/invalid/document.json +41 -0
  193. package/fixtures/atelier-knowledge-contract/domain/valid/document.json +40 -0
  194. package/fixtures/atelier-knowledge-contract/domain-revision/invalid/document.json +46 -0
  195. package/fixtures/atelier-knowledge-contract/domain-revision/valid/document.json +45 -0
  196. package/fixtures/atelier-knowledge-contract/evaluation/invalid/document.json +21 -0
  197. package/fixtures/atelier-knowledge-contract/evaluation/valid/document.json +20 -0
  198. package/fixtures/atelier-knowledge-contract/ledger/invalid/document.json +318 -0
  199. package/fixtures/atelier-knowledge-contract/ledger/valid/document.json +317 -0
  200. package/fixtures/atelier-knowledge-contract/relation/invalid/document.json +25 -0
  201. package/fixtures/atelier-knowledge-contract/relation/valid/document.json +24 -0
  202. package/fixtures/atelier-knowledge-contract/review/invalid/document.json +18 -0
  203. package/fixtures/atelier-knowledge-contract/review/valid/document.json +17 -0
  204. package/fixtures/atelier-knowledge-contract/withdrawal/invalid/document.json +16 -0
  205. package/fixtures/atelier-knowledge-contract/withdrawal/valid/document.json +15 -0
  206. package/fixtures/atelier-learning/invalid/authority.json +14 -0
  207. package/fixtures/atelier-learning/valid/capture.json +13 -0
  208. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/authority-key.json +17 -0
  209. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/nonempty-ext.json +25 -0
  210. package/fixtures/atelier-personal-workspace-contract/manifest/invalid/wrong-schema.json +22 -0
  211. package/fixtures/atelier-personal-workspace-contract/manifest/valid/manifest.json +22 -0
  212. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/authority-key.json +25 -0
  213. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/unknown-top-level-field.json +27 -0
  214. package/fixtures/atelier-personal-workspace-contract/overlay/invalid/wrong-schema.json +24 -0
  215. package/fixtures/atelier-trackable/definition/invalid/document.json +15 -0
  216. package/fixtures/atelier-trackable/definition/valid/document.json +14 -0
  217. package/fixtures/atelier-trackable/request/invalid/document.json +23 -0
  218. package/fixtures/atelier-trackable/request/valid/document.json +22 -0
  219. package/fixtures/boundary-delegations/invalid/authority-key.v1.json +30 -0
  220. package/fixtures/boundary-delegations/invalid/push-operation.v1.json +28 -0
  221. package/fixtures/boundary-delegations/invalid/unsigned.v1.json +25 -0
  222. package/fixtures/boundary-delegations/valid/empty.v1.json +4 -0
  223. package/fixtures/boundary-delegations/valid/signed-operator.v1.json +30 -0
  224. package/fixtures/boundary-owner-keys/invalid/wrong-algorithm.v1.json +15 -0
  225. package/fixtures/boundary-owner-keys/invalid/wrong-curve.v1.json +15 -0
  226. package/fixtures/boundary-owner-keys/valid/one-owner.v1.json +17 -0
  227. package/fixtures/capability-packages/adoption.example.json +70 -0
  228. package/fixtures/capability-packages/evidence-review/capability-package.json +58 -0
  229. package/fixtures/capability-packages/evidence-review/capability-release.json +84 -0
  230. package/fixtures/capability-packages/evidence-review/evaluation.md +15 -0
  231. package/fixtures/capability-packages/evidence-review/skills/evidence-review/SKILL.md +22 -0
  232. package/fixtures/capability-packages/evidence-review/skills/evidence-review/references/ledger.md +7 -0
  233. package/fixtures/capability-packages/research/capability-package.json +88 -0
  234. package/fixtures/capability-packages/research/capability-release.json +134 -0
  235. package/fixtures/capability-packages/research/evaluation.md +15 -0
  236. package/fixtures/capability-packages/research/skills/research-integrate/SKILL.md +29 -0
  237. package/fixtures/capability-packages/research/skills/research-integrate/references/integration.md +10 -0
  238. package/fixtures/capability-packages/research/skills/research-plan/SKILL.md +27 -0
  239. package/fixtures/capability-packages/research/skills/research-plan/references/inquiries.md +26 -0
  240. package/fixtures/capability-packages/research/skills/research-synthesize/SKILL.md +23 -0
  241. package/fixtures/capability-packages/research/skills/research-synthesize/references/synthesis.md +12 -0
  242. package/fixtures/evidence-navigation/invalid/duplicate-operation.json +16 -0
  243. package/fixtures/evidence-navigation/invalid/instruction-kind.json +36 -0
  244. package/fixtures/evidence-navigation/invalid/invalid-digest.json +36 -0
  245. package/fixtures/evidence-navigation/invalid/invalid-time.json +36 -0
  246. package/fixtures/evidence-navigation/invalid/missing-attribution.json +35 -0
  247. package/fixtures/evidence-navigation/invalid/reserved-extension.json +19 -0
  248. package/fixtures/evidence-navigation/invalid/unattributed-acceptance.json +36 -0
  249. package/fixtures/evidence-navigation/invalid/uncoerced-version.json +16 -0
  250. package/fixtures/evidence-navigation/invalid/unknown-currency.json +17 -0
  251. package/fixtures/evidence-navigation/invalid/unknown-selector-field.json +37 -0
  252. package/fixtures/evidence-navigation/invalid/unsupported-operation.json +15 -0
  253. package/fixtures/evidence-navigation/valid/claim.json +36 -0
  254. package/fixtures/evidence-navigation/valid/host.json +16 -0
  255. package/fixtures/evidence-navigation/valid/profile.json +16 -0
  256. package/fixtures/evidence-navigation/valid/snapshot.json +17 -0
  257. package/fixtures/harness-packages/build-harness/capability-package.json +61 -0
  258. package/fixtures/harness-packages/build-harness/capability-release.json +82 -0
  259. package/fixtures/harness-packages/build-harness/evaluation.md +3 -0
  260. package/fixtures/harness-packages/build-harness/skills/atelier-build-harness/SKILL.md +59 -0
  261. package/fixtures/harness-packages/knowledge-harness/capability-package.json +61 -0
  262. package/fixtures/harness-packages/knowledge-harness/capability-release.json +82 -0
  263. package/fixtures/harness-packages/knowledge-harness/evaluation.md +3 -0
  264. package/fixtures/harness-packages/knowledge-harness/skills/atelier-knowledge-harness/SKILL.md +60 -0
  265. package/fixtures/harnesses/learning-cycle.json +780 -0
  266. package/fixtures/inquiry/workshop.json +675 -0
  267. package/fixtures/inquiry-packages/discovery-harness/capability-package.json +61 -0
  268. package/fixtures/inquiry-packages/discovery-harness/capability-release.json +82 -0
  269. package/fixtures/inquiry-packages/discovery-harness/evaluation.md +3 -0
  270. package/fixtures/inquiry-packages/discovery-harness/skills/atelier-discovery-harness/SKILL.md +48 -0
  271. package/fixtures/inquiry-packages/research-harness/capability-package.json +61 -0
  272. package/fixtures/inquiry-packages/research-harness/capability-release.json +82 -0
  273. package/fixtures/inquiry-packages/research-harness/evaluation.md +3 -0
  274. package/fixtures/inquiry-packages/research-harness/skills/atelier-research-harness/SKILL.md +43 -0
  275. package/fixtures/knowledge-health/calibration-suite.json +26 -0
  276. package/fixtures/knowledge-health/calibration-trial.json +37 -0
  277. package/fixtures/knowledge-health/corrected/checklist.md +18 -0
  278. package/fixtures/knowledge-health/devday/participant-record.json +19 -0
  279. package/fixtures/knowledge-health/expected-summary.json +27 -0
  280. package/fixtures/knowledge-health/workshop/README.md +20 -0
  281. package/fixtures/knowledge-health/workshop/atelier.project.json +7 -0
  282. package/fixtures/knowledge-health/workshop/knowledge-plan.json +65 -0
  283. package/fixtures/knowledge-health/workshop/records/checklist.md +18 -0
  284. package/fixtures/knowledge-health/workshop/records/workshop.md +18 -0
  285. package/fixtures/knowledge-health/workshop/repo-access.v1.json +5 -0
  286. package/fixtures/knowledge-health/workspace/atelier.project.json +18 -0
  287. package/fixtures/knowledge-health/workspace/knowledge-plan.json +74 -0
  288. package/fixtures/knowledge-health/workspace/records/checklist.md +18 -0
  289. package/fixtures/knowledge-health/workspace/records/pilot.md +16 -0
  290. package/fixtures/knowledge-health/workspace/repo-access.v1.json +9 -0
  291. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/case-only-collision.v2.json +160 -0
  292. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/flat-note-path.v2.json +160 -0
  293. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/hidden-folder.v2.json +160 -0
  294. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/identity-in-the-body.v2.json +160 -0
  295. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/link-breaking-name.v2.json +160 -0
  296. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-identity-region.v2.json +156 -0
  297. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-layout-version.v2.json +159 -0
  298. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/note-named-like-a-folder.v2.json +160 -0
  299. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/unknown-region-kind.v2.json +160 -0
  300. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/v1-contract-version.v2.json +161 -0
  301. package/fixtures/obsidian/contracts/generation-manifest-v2/valid/three-notes.v2.json +160 -0
  302. package/fixtures/obsidian/edits/workspace.json +1 -1
  303. package/fixtures/obsidian/materialization/expected-full.json +21 -21
  304. package/fixtures/obsidian/materialization/expected-full.layout-1.json +99 -0
  305. package/fixtures/obsidian/materialization/expected-scoped.json +7 -7
  306. package/fixtures/obsidian/materialization/expected-scoped.layout-1.json +39 -0
  307. package/fixtures/personal-workspace/overlay.json +24 -0
  308. package/fixtures/templates/local-library.v1.json +75 -0
  309. package/fixtures/templates/upgrade-contracts/adoption-policy.v2/invalid.json +16 -0
  310. package/fixtures/templates/upgrade-contracts/adoption-policy.v2/valid.json +13 -0
  311. package/fixtures/templates/upgrade-contracts/migration.v3/invalid.json +24 -0
  312. package/fixtures/templates/upgrade-contracts/migration.v3/valid.json +21 -0
  313. package/fixtures/templates/upgrade-contracts/template-adoption.v1/invalid.json +60 -0
  314. package/fixtures/templates/upgrade-contracts/template-adoption.v1/valid.json +57 -0
  315. package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/invalid.json +85 -0
  316. package/fixtures/templates/upgrade-contracts/upgrade-plan.v3/valid.json +82 -0
  317. package/package.json +64 -6
  318. package/plugins/obsidian/main.js +444 -0
  319. package/plugins/obsidian/manifest.json +9 -0
  320. package/plugins/obsidian/styles.css +22 -0
  321. package/skills/claude/atelier-build-harness/SKILL.md +59 -0
  322. package/skills/claude/atelier-coordination/SKILL.md +32 -0
  323. package/skills/claude/atelier-discovery-harness/SKILL.md +48 -0
  324. package/skills/claude/atelier-guided-upgrade/SKILL.md +29 -0
  325. package/skills/claude/atelier-interaction/SKILL.md +34 -0
  326. package/skills/claude/atelier-knowledge-harness/SKILL.md +60 -0
  327. package/skills/claude/atelier-knowledge-setup/SKILL.md +72 -0
  328. package/skills/claude/atelier-practical-judgment/SKILL.md +64 -0
  329. package/skills/claude/atelier-research-harness/SKILL.md +43 -0
  330. package/skills/claude/atelier-skill-steward/SKILL.md +53 -0
  331. package/skills/claude/atelier-trackables/SKILL.md +40 -0
  332. package/skills/codex/atelier-build-harness/SKILL.md +59 -0
  333. package/skills/codex/atelier-coordination/SKILL.md +32 -0
  334. package/skills/codex/atelier-discovery-harness/SKILL.md +48 -0
  335. package/skills/codex/atelier-guided-upgrade/SKILL.md +29 -0
  336. package/skills/codex/atelier-interaction/SKILL.md +34 -0
  337. package/skills/codex/atelier-knowledge-harness/SKILL.md +60 -0
  338. package/skills/codex/atelier-knowledge-setup/SKILL.md +72 -0
  339. package/skills/codex/atelier-practical-judgment/SKILL.md +64 -0
  340. package/skills/codex/atelier-research-harness/SKILL.md +43 -0
  341. package/skills/codex/atelier-skill-steward/SKILL.md +53 -0
  342. package/skills/codex/atelier-trackables/SKILL.md +40 -0
  343. package/src/architecture/catalog.mjs +355 -0
  344. package/src/architecture/index.mjs +93 -0
  345. package/src/boundary/content-rules.mjs +4 -2
  346. package/src/boundary/delegation-command.mjs +158 -0
  347. package/src/boundary/delegation.mjs +396 -0
  348. package/src/boundary/policy.mjs +52 -10
  349. package/src/build/git.mjs +18 -0
  350. package/src/build/index.mjs +3 -0
  351. package/src/build/ledger.mjs +88 -0
  352. package/src/capabilities/adoption.mjs +381 -0
  353. package/src/capabilities/evidence.mjs +140 -0
  354. package/src/capabilities/files.mjs +124 -0
  355. package/src/capabilities/index.mjs +4 -0
  356. package/src/capabilities/instructions.mjs +250 -0
  357. package/src/capabilities/package.mjs +136 -0
  358. package/src/cli/command-failure.mjs +36 -0
  359. package/src/cli/execute-command.mjs +16 -2
  360. package/src/cli/run.mjs +65 -9
  361. package/src/coauthor/store.mjs +43 -2
  362. package/src/collaboration/proposals.mjs +189 -0
  363. package/src/commands/architecture.mjs +27 -0
  364. package/src/commands/boundary.mjs +3 -0
  365. package/src/commands/capability.mjs +73 -0
  366. package/src/commands/enroll.mjs +3 -0
  367. package/src/commands/harness.mjs +79 -0
  368. package/src/commands/ingest.mjs +39 -0
  369. package/src/commands/init.mjs +4 -1
  370. package/src/commands/inquiry.mjs +66 -0
  371. package/src/commands/knowledge-semantic.mjs +128 -0
  372. package/src/commands/knowledge.mjs +119 -0
  373. package/src/commands/learn.mjs +61 -0
  374. package/src/commands/obsidian.mjs +832 -62
  375. package/src/commands/practice.mjs +24 -0
  376. package/src/commands/setup.mjs +22 -2
  377. package/src/commands/trackable.mjs +19 -0
  378. package/src/contracts/corpus.mjs +36 -0
  379. package/src/coordination/index.mjs +110 -0
  380. package/src/egress/forbidden-egress.mjs +2 -0
  381. package/src/evidence-navigation/contracts.mjs +60 -0
  382. package/src/evidence-navigation/evaluate.mjs +69 -0
  383. package/src/evidence-navigation/generation.mjs +22 -0
  384. package/src/evidence-navigation/index.mjs +2 -0
  385. package/src/evidence-navigation/local.mjs +167 -0
  386. package/src/evidence-navigation/schema.generated.mjs +604 -0
  387. package/src/evidence-navigation/types.mjs +12 -0
  388. package/src/export/atelier-export-contract.mjs +35 -8
  389. package/src/graph/enroll.mjs +248 -0
  390. package/src/graph/graph.mjs +17 -1
  391. package/src/graph/knowledge-graph.mjs +58 -8
  392. package/src/harnesses/contracts.mjs +41 -0
  393. package/src/harnesses/exchange.mjs +154 -0
  394. package/src/harnesses/feedback.mjs +16 -0
  395. package/src/harnesses/history.mjs +37 -0
  396. package/src/harnesses/index.mjs +4 -0
  397. package/src/harnesses/store.mjs +29 -0
  398. package/src/ingestion/contracts.mjs +41 -0
  399. package/src/ingestion/evaluation.mjs +119 -0
  400. package/src/ingestion/optional/composition/index.mjs +171 -0
  401. package/src/ingestion/optional/evaluation/index.mjs +219 -0
  402. package/src/ingestion/optional/graphify/composition-binding.mjs +60 -0
  403. package/src/ingestion/optional/graphify/composition_receiving.py +185 -0
  404. package/src/ingestion/optional/graphify/graphify_supplier.py +933 -0
  405. package/src/ingestion/optional/graphify/json_bridge.py +163 -0
  406. package/src/ingestion/optional/graphify/query_receiving.py +209 -0
  407. package/src/ingestion/optional/index.mjs +9 -0
  408. package/src/ingestion/optional/jev/bridge.mjs +166 -0
  409. package/src/ingestion/optional/jev/composition-binding.mjs +116 -0
  410. package/src/ingestion/optional/jev/judgments.mjs +174 -0
  411. package/src/ingestion/optional/jev/native-translation.mjs +32 -0
  412. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/__init__.py +7 -0
  413. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/adapter.py +966 -0
  414. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/artifacts.py +101 -0
  415. package/src/ingestion/optional/lightrag/atelier_lightrag_supplier/projection.py +146 -0
  416. package/src/ingestion/optional/lightrag/composition-binding.mjs +67 -0
  417. package/src/ingestion/optional/vanilla/composition-binding.mjs +102 -0
  418. package/src/ingestion/optional/vanilla/index.mjs +218 -0
  419. package/src/ingestion/optional/vanilla/native-normalization.mjs +187 -0
  420. package/src/ingestion/processors.mjs +218 -0
  421. package/src/ingestion/semantic.mjs +203 -0
  422. package/src/ingestion/store.mjs +372 -0
  423. package/src/inquiry/beliefs.mjs +32 -0
  424. package/src/inquiry/contracts.mjs +23 -0
  425. package/src/inquiry/index.mjs +5 -0
  426. package/src/inquiry/ledger.mjs +135 -0
  427. package/src/inquiry/lenses.mjs +15 -0
  428. package/src/inquiry/projection.mjs +77 -0
  429. package/src/inquiry/store.mjs +35 -0
  430. package/src/intake/read-scope.mjs +12 -0
  431. package/src/intake/store.mjs +69 -6
  432. package/src/interaction/index.mjs +91 -0
  433. package/src/judgment/index.mjs +82 -0
  434. package/src/judgment/practice-evaluation.mjs +70 -0
  435. package/src/judgment/practice.mjs +144 -0
  436. package/src/knowledge/context.mjs +217 -0
  437. package/src/knowledge/index.mjs +5 -0
  438. package/src/knowledge/ingestion.mjs +79 -0
  439. package/src/knowledge/intake.mjs +33 -0
  440. package/src/knowledge/ledger.mjs +110 -0
  441. package/src/knowledge/participatory/guidance.mjs +36 -0
  442. package/src/knowledge/participatory/guided-contribution.mjs +44 -0
  443. package/src/knowledge/participatory/index.mjs +2 -0
  444. package/src/knowledge/participatory/installed-workshop.mjs +108 -0
  445. package/src/knowledge/plan.mjs +67 -0
  446. package/src/knowledge/projection.mjs +43 -0
  447. package/src/knowledge/semantic-operation.mjs +567 -0
  448. package/src/knowledge/sessions.mjs +467 -0
  449. package/src/knowledge/workspace.mjs +295 -0
  450. package/src/knowledge-health/assessment.mjs +165 -0
  451. package/src/knowledge-health/capabilities.mjs +350 -0
  452. package/src/knowledge-health/context.mjs +62 -0
  453. package/src/knowledge-health/example.mjs +47 -0
  454. package/src/knowledge-health/index.mjs +10 -0
  455. package/src/knowledge-health/owner-join.mjs +88 -0
  456. package/src/knowledge-health/proof/common.mjs +24 -0
  457. package/src/knowledge-health/proof/installed-check.mjs +100 -0
  458. package/src/knowledge-health/proof/native-readback.mjs +37 -0
  459. package/src/knowledge-health/proof/rehearse.mjs +68 -0
  460. package/src/knowledge-health/proof/validate-participant.mjs +17 -0
  461. package/src/knowledge-health/proof/verify-native-capture.mjs +14 -0
  462. package/src/knowledge-health/proof/workshop-check.mjs +36 -0
  463. package/src/knowledge-health/rule-identity.mjs +44 -0
  464. package/src/knowledge-health/workshop-composition.mjs +19 -0
  465. package/src/knowledge-health/workshop-profile.mjs +176 -0
  466. package/src/knowledge-health/workshop.mjs +99 -0
  467. package/src/learning/adapters.mjs +68 -0
  468. package/src/learning/assistance.mjs +127 -0
  469. package/src/learning/contracts.mjs +65 -0
  470. package/src/learning/store.mjs +272 -0
  471. package/src/personal-workspace/index.mjs +391 -0
  472. package/src/personal-workspace/selection.mjs +385 -0
  473. package/src/project/config.mjs +8 -0
  474. package/src/project/durable-state.mjs +3 -1
  475. package/src/project/file-class.mjs +1 -1
  476. package/src/project/private-state.mjs +10 -1
  477. package/src/projection/obsidian/contracts.mjs +224 -18
  478. package/src/projection/obsidian/edits/apply.mjs +63 -19
  479. package/src/projection/obsidian/edits/regions.mjs +137 -42
  480. package/src/projection/obsidian/materialize/index.mjs +6 -3
  481. package/src/projection/obsidian/materialize/path-registry.mjs +443 -57
  482. package/src/projection/obsidian/materialize/prepare-view.mjs +382 -131
  483. package/src/projection/obsidian/materialize/redaction.mjs +327 -0
  484. package/src/projection/obsidian/materialize/settings.mjs +113 -34
  485. package/src/projection/obsidian/personal-workspace.mjs +436 -0
  486. package/src/projection/obsidian/plugin-bridge/bundle.mjs +50 -0
  487. package/src/projection/obsidian/plugin-bridge/channel.mjs +174 -0
  488. package/src/projection/obsidian/plugin-bridge/index.mjs +10 -0
  489. package/src/projection/obsidian/proposals/adapter.mjs +47 -8
  490. package/src/projection/obsidian/proposals/observation.mjs +20 -7
  491. package/src/projection/obsidian/publication/bridge-script.mjs +11 -5
  492. package/src/projection/obsidian/publication/index.mjs +2 -1
  493. package/src/projection/obsidian/publication/publisher.mjs +312 -36
  494. package/src/projection/obsidian/publication/transport.mjs +63 -8
  495. package/src/projection/obsidian/publication/vault-list.mjs +200 -0
  496. package/src/projection/obsidian/recovery/index.mjs +4 -1
  497. package/src/projection/obsidian/recovery/restart.mjs +3 -1
  498. package/src/projection/obsidian/recovery/store.mjs +168 -8
  499. package/src/projection/obsidian/selection-ui/contribution.mjs +6 -5
  500. package/src/projection/obsidian/selection-ui/focus.mjs +14 -7
  501. package/src/projection/obsidian/selection-ui/selection-state.mjs +2 -2
  502. package/src/projection/obsidian/selection-ui/selection.mjs +8 -3
  503. package/src/readiness/readiness.mjs +10 -3
  504. package/src/reflection/index.mjs +56 -0
  505. package/src/runtime/obsidian/app-capability.mjs +104 -12
  506. package/src/runtime/obsidian/app-production-seams.mjs +161 -42
  507. package/src/runtime/obsidian/app-registration.mjs +313 -0
  508. package/src/runtime/obsidian/app-restart.mjs +154 -0
  509. package/src/runtime/obsidian/engine.mjs +288 -29
  510. package/src/runtime/obsidian/extension-points.mjs +1 -1
  511. package/src/runtime/obsidian/index.mjs +15 -8
  512. package/src/runtime/obsidian/launch-plan.mjs +91 -0
  513. package/src/runtime/obsidian/lifecycle.mjs +193 -22
  514. package/src/runtime/obsidian/login-item.mjs +332 -0
  515. package/src/runtime/obsidian/machine-settings.mjs +119 -12
  516. package/src/runtime/obsidian/opening.mjs +369 -63
  517. package/src/runtime/obsidian/pending-edits.mjs +10 -0
  518. package/src/runtime/obsidian/pipeline.mjs +71 -3
  519. package/src/runtime/obsidian/plugin-channel.mjs +289 -0
  520. package/src/runtime/obsidian/plugin-choice.mjs +182 -0
  521. package/src/runtime/obsidian/plugin-drift.mjs +124 -0
  522. package/src/runtime/obsidian/plugin-presence.mjs +61 -0
  523. package/src/runtime/obsidian/process-identity.mjs +20 -10
  524. package/src/runtime/obsidian/project-views.mjs +282 -0
  525. package/src/runtime/obsidian/questions.mjs +48 -0
  526. package/src/runtime/obsidian/release-watch.mjs +56 -0
  527. package/src/runtime/obsidian/service-main.mjs +113 -17
  528. package/src/runtime/obsidian/service-manager-production.mjs +61 -0
  529. package/src/runtime/obsidian/service-managers.mjs +275 -0
  530. package/src/runtime/obsidian/service-record.mjs +105 -5
  531. package/src/runtime/obsidian/service-server.mjs +50 -12
  532. package/src/runtime/obsidian/service.mjs +134 -7
  533. package/src/runtime/obsidian/startup-adapters.mjs +59 -21
  534. package/src/runtime/obsidian/state-store.mjs +13 -1
  535. package/src/runtime/obsidian/unheld-evidence.mjs +84 -0
  536. package/src/runtime/obsidian/vault-location.mjs +300 -0
  537. package/src/runtime/obsidian/view-counts.mjs +34 -0
  538. package/src/server/local-sidecar.mjs +193 -7
  539. package/src/server/server.mjs +45 -6
  540. package/src/template-bindings/project.mjs +92 -0
  541. package/src/templates/profile.mjs +225 -0
  542. package/src/trackables/domain.mjs +175 -0
  543. package/src/trackables/store.mjs +114 -0
  544. package/src/ui/knowledge-page.mjs +1388 -0
  545. package/src/upgrade/explanation.mjs +1 -1
  546. package/src/upgrade/template-participant.mjs +171 -0
  547. package/src/upgrade/transaction.mjs +72 -25
  548. package/src/upgrade/upgrade.mjs +2 -1
  549. package/templates/external-project-workspace/pack-lifecycle.json +6 -1
  550. package/templates/knowledge-workspace/.gitattributes +2 -0
  551. package/templates/knowledge-workspace/AGENTS.md +27 -0
  552. package/templates/knowledge-workspace/README.md +44 -0
  553. package/templates/knowledge-workspace/atelier.project.json +22 -0
  554. package/templates/knowledge-workspace/gitignore +6 -0
  555. package/templates/knowledge-workspace/knowledge-plan.json +111 -0
  556. package/templates/knowledge-workspace/knowledge-plan.schema.json +281 -0
  557. package/templates/knowledge-workspace/records/forecast.md +22 -0
  558. package/templates/knowledge-workspace/records/inspection.md +25 -0
  559. package/templates/knowledge-workspace/records/telescope.md +24 -0
  560. package/templates/knowledge-workspace/repo-access.v1.json +9 -0
@@ -0,0 +1,295 @@
1
+ import fs from 'node:fs'
2
+ import path from 'node:path'
3
+ import { commandProject } from '../project/config.mjs'
4
+ import { buildCanonicalGraph, createGraphFileCache } from '../graph/graph.mjs'
5
+ import { openRegularFileNoFollow } from '../project/private-state.mjs'
6
+ import { digest, inspectKnowledgePlan, validateKnowledgePlan } from './plan.mjs'
7
+ import {
8
+ createKnowledgeContext,
9
+ evaluateKnowledgeQuestions,
10
+ } from './context.mjs'
11
+
12
+ export function readKnowledgePlan(project, name = 'knowledge-plan.json') {
13
+ const file = path.resolve(project.configDir, name)
14
+ const fd = openRegularFileNoFollow(file)
15
+ try {
16
+ if (fs.fstatSync(fd).size > 65536)
17
+ throw new Error('knowledge plan exceeds 65536 bytes')
18
+ const buffer = Buffer.alloc(65537)
19
+ let count = 0
20
+ while (count < buffer.length) {
21
+ const read = fs.readSync(fd, buffer, count, buffer.length - count, null)
22
+ if (!read) break
23
+ count += read
24
+ }
25
+ if (count > 65536) throw new Error('knowledge plan exceeds 65536 bytes')
26
+ const bytes = buffer.subarray(0, count)
27
+ const text = new TextDecoder('utf-8', { fatal: true }).decode(bytes)
28
+ const plan = JSON.parse(text)
29
+ const errors = validateKnowledgePlan(plan)
30
+ if (errors.length)
31
+ throw new Error(`invalid knowledge plan: ${errors.join('; ')}`)
32
+ // Raw bytes bind the workspace snapshot. Coauthor's text reader strips a
33
+ // UTF-8 BOM, so its source binding must use the same decoded text digest.
34
+ return { file, plan, sha256: digest(bytes), sourceDigest: digest(text) }
35
+ } finally {
36
+ fs.closeSync(fd)
37
+ }
38
+ }
39
+
40
+ // One small, task-oriented curriculum. Domain definitions and evidence stay in
41
+ // the consuming plan and sources. Prompts are retained in each private session.
42
+ export const KNOWLEDGE_FLOWS = [
43
+ {
44
+ id: 'onboard',
45
+ title: 'Onboard',
46
+ description: 'Choose useful work and establish who can steward it.',
47
+ prompts: [
48
+ [
49
+ 'work',
50
+ 'What decision or deliverable should this workspace improve?',
51
+ 'Name a real task, who needs it, and what a useful result would change.',
52
+ ],
53
+ [
54
+ 'people',
55
+ 'Who owns the sources, maintains the model, and reviews the result?',
56
+ 'Name accountable roles and your own role. A typed name records a local assertion.',
57
+ ],
58
+ [
59
+ 'sources',
60
+ 'Which sources may be processed, and where must their use stop?',
61
+ 'Record source permissions, audiences, excluded material, and correction or withdrawal arrangements.',
62
+ ],
63
+ [
64
+ 'success',
65
+ 'How will you recognize useful work at an acceptable cost?',
66
+ 'Choose an unseen question, a direct-search comparison, and the time, correction, and measured usage you will record.',
67
+ ],
68
+ ],
69
+ },
70
+ {
71
+ id: 'model',
72
+ title: 'Model',
73
+ description: 'Give the smallest useful vocabulary a precise meaning.',
74
+ prompts: [
75
+ [
76
+ 'concept',
77
+ 'Which concept matters to this question, and what does it mean?',
78
+ 'Give its definition, an example, and a counterexample. Reuse a concept before adding another.',
79
+ ],
80
+ [
81
+ 'identity',
82
+ 'How do you distinguish the same thing from two similar things?',
83
+ 'State a stable identity rule, aliases, false-merge risks, and how corrections preserve history.',
84
+ ],
85
+ [
86
+ 'relation',
87
+ 'Which directed relationship makes the evidence useful?',
88
+ 'Name both concepts, a native predicate, its direction, and its precise meaning. Distinguish an observation from an expectation.',
89
+ ],
90
+ [
91
+ 'test',
92
+ 'Which source-supported question would expose a bad model?',
93
+ 'Name decisive passages and unresolved evidence. Propose plan and record changes for the source owner to review.',
94
+ ],
95
+ ],
96
+ },
97
+ {
98
+ id: 'deepen',
99
+ title: 'Deepen',
100
+ description:
101
+ 'Resolve missing evidence, conflicting claims, and gaps in the model.',
102
+ prompts: [
103
+ [
104
+ 'gap',
105
+ 'What can this workspace still not answer reliably?',
106
+ 'Choose a missing relationship, unsupported claim, stale source, contradiction, or unmodeled finding.',
107
+ ],
108
+ [
109
+ 'evidence',
110
+ 'What exactly does the source support?',
111
+ 'Cite record IDs and passages. Preserve speaker, date, negation, uncertainty, and alternative explanations.',
112
+ ],
113
+ [
114
+ 'proposal',
115
+ 'What is the smallest justified correction or addition?',
116
+ 'Propose a concept, relationship, or source correction. State why it helps this question and what could disprove it.',
117
+ ],
118
+ [
119
+ 'review',
120
+ 'Who should review it, and what remains unresolved?',
121
+ 'Record the reviewer, next evidence needed, and a concrete owner handoff. This draft does not apply a source change.',
122
+ ],
123
+ ],
124
+ },
125
+ {
126
+ id: 'apply',
127
+ title: 'Apply',
128
+ description:
129
+ 'Use bounded evidence to produce a useful answer or an explicit abstention.',
130
+ prompts: [
131
+ [
132
+ 'answer',
133
+ 'What answer does the selected evidence support?',
134
+ 'Use source IDs and exact passages. Keep qualifications visible, and say when evidence is insufficient.',
135
+ ],
136
+ [
137
+ 'limits',
138
+ 'What remains uncertain or contradicted?',
139
+ 'Separate recorded facts, inference, proposals, and missing evidence. Do not fill a gap from a forecast.',
140
+ ],
141
+ [
142
+ 'action',
143
+ 'What should happen next, and who owns that decision?',
144
+ 'Name the proposed action or deliverable, prerequisites, recipient, and accountable owner. Saving does not execute it.',
145
+ ],
146
+ [
147
+ 'validation',
148
+ 'What must a reviewer verify before using this result?',
149
+ 'Specify the source checks and the observable outcome that would demonstrate useful work.',
150
+ ],
151
+ ],
152
+ },
153
+ {
154
+ id: 'learn',
155
+ title: 'Learn',
156
+ description: 'Use observed outcomes to improve the next task.',
157
+ prompts: [
158
+ [
159
+ 'outcome',
160
+ 'What actually happened when this result was used?',
161
+ 'Separate intended action, observed outcome, and user acceptance. Cite outcome evidence or say it is not yet observed.',
162
+ ],
163
+ [
164
+ 'quality',
165
+ 'What did the person or agent get right, miss, or need help with?',
166
+ 'Record correctness, abstention, confusion, assistance, and correction effort on an unseen question.',
167
+ ],
168
+ [
169
+ 'cost',
170
+ 'What did the work cost compared with direct source search?',
171
+ 'Record elapsed time, actual input/output/cache tokens, provider cost, and correction minutes. Use unknown for unmeasured values.',
172
+ ],
173
+ [
174
+ 'change',
175
+ 'What should change in the ontology or workflow?',
176
+ 'Propose the smallest useful change, its owner, a regression question, and any lesson suitable for later reviewed reuse.',
177
+ ],
178
+ ],
179
+ },
180
+ ]
181
+
182
+ export function loadKnowledgeWorkspace(
183
+ initial,
184
+ planName = 'knowledge-plan.json'
185
+ ) {
186
+ // Re-read enrollment and local overrides on every operation. Explicit CLI
187
+ // path overrides stay explicit; an edited project is not a cached authority.
188
+ const overrides = initial.repos
189
+ .filter((r) => r.pathSource === 'cli')
190
+ .flatMap((r) => ['--repo-path', `${r.name}=${r.path}`])
191
+ // Normalize the selected workspace directory, not internal plan/source links.
192
+ // /tmp, /var, and user-created workspace aliases resolve to the same binding.
193
+ const configDir = fs.realpathSync(initial.configDir)
194
+ const project = commandProject({
195
+ cwd: configDir,
196
+ argv: [
197
+ '--project',
198
+ path.join(configDir, path.basename(initial.configPath)),
199
+ ...overrides,
200
+ ],
201
+ writeLocalState: false,
202
+ })
203
+ const source = readKnowledgePlan(project, planName)
204
+ const cache = createGraphFileCache()
205
+ const graph = buildCanonicalGraph(project, { fileCache: cache })
206
+ const inventory = [...cache.files]
207
+ .map(([key, value]) => [key, value.digest])
208
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
209
+ const snapshot = digest(
210
+ JSON.stringify({
211
+ plan: source.sha256,
212
+ config: project.config,
213
+ repos: project.repos,
214
+ nodes: graph.nodes,
215
+ edges: graph.edges,
216
+ inventory,
217
+ })
218
+ )
219
+ return { project, ...source, cache, graph, snapshot }
220
+ }
221
+
222
+ export function knowledgeDashboard(workspace) {
223
+ const { project, plan, graph, snapshot } = workspace
224
+ const inspection = inspectKnowledgePlan(plan, graph)
225
+ const evaluation = graph.ok ? evaluateKnowledgeQuestions(workspace) : null
226
+ return {
227
+ schema: 'atelier-knowledge-dashboard/experimental-v1',
228
+ snapshot,
229
+ name: project.config.name,
230
+ purpose: plan.purpose,
231
+ steward: plan.steward,
232
+ reviewer: plan.reviewer,
233
+ governance: plan.governance,
234
+ budget: plan.budget,
235
+ inspection,
236
+ concepts: plan.concepts.map((c) => ({
237
+ ...c,
238
+ coverage: inspection.concepts?.find((x) => x.id === c.id) ?? null,
239
+ })),
240
+ relations: plan.relations.map((r) => ({
241
+ ...r,
242
+ coverage: inspection.relations?.find((x) => x.id === r.id) ?? null,
243
+ })),
244
+ questions: plan.questions,
245
+ evaluation,
246
+ flows: KNOWLEDGE_FLOWS,
247
+ next: !inspection.ok
248
+ ? {
249
+ stage: 'onboard',
250
+ reason: 'Repair the graph diagnostics before relying on context.',
251
+ }
252
+ : inspection.warnings.length
253
+ ? { stage: 'deepen', reason: inspection.warnings[0] }
254
+ : evaluation?.cases.some((c) => c.runs.graph.status === 'abstain-unverified')
255
+ ? {
256
+ stage: 'deepen',
257
+ reason:
258
+ 'Matching evidence was omitted; the abstention cannot be verified. Inspect the listed omissions.',
259
+ }
260
+ : evaluation?.cases.some((c) => c.expect === 'abstain' && c.runs.graph.sourceIds.length)
261
+ ? {
262
+ stage: 'deepen',
263
+ reason:
264
+ 'Matching evidence was retrieved for an expected abstention. Inspect the evidence and review the question.',
265
+ }
266
+ : evaluation?.cases.some(
267
+ (c) =>
268
+ !c.runs.graph.expectedEvidencePresent || c.runs.graph.stale.length
269
+ )
270
+ ? {
271
+ stage: 'deepen',
272
+ reason:
273
+ 'Resolve missing or changed evidence before using the affected answer.',
274
+ }
275
+ : {
276
+ stage: 'apply',
277
+ reason:
278
+ 'Try a useful question, inspect its evidence, and record the result for review.',
279
+ },
280
+ assurance:
281
+ 'Coverage checks describe retrieval. Human judgment, useful outcomes, and measured savings remain to be observed.',
282
+ sourceEditsApplied: false,
283
+ providerCalls: 0,
284
+ }
285
+ }
286
+
287
+ export function knowledgeQuestionContext(workspace, id, mode = 'graph') {
288
+ const question = workspace.plan.questions.find((q) => q.id === id)
289
+ if (!question) throw new Error('unknown knowledge question')
290
+ return createKnowledgeContext({
291
+ ...workspace,
292
+ question: question.question,
293
+ mode,
294
+ })
295
+ }
@@ -0,0 +1,165 @@
1
+ import { createHash } from 'node:crypto'
2
+ import { isDeepStrictEqual } from 'node:util'
3
+
4
+ // Consumer projection only. The injected Atelier checker owns every graph rule.
5
+ // No I/O, accepted knowledge, authoring write, model, or health score lives here.
6
+ export const PROJECTION_VERSION = 'kh-required-direction-projection/r1'
7
+ export const assessmentDigest = bytes => createHash('sha256').update(bytes).digest('hex')
8
+ const clone = value => structuredClone(value)
9
+ const sha = value => typeof value === 'string' && /^[a-f0-9]{64}$/.test(value)
10
+ const text = value => typeof value === 'string' && value.trim().length > 0
11
+ const plain = value => value !== null && typeof value === 'object' && !Array.isArray(value)
12
+ function canonical(value) {
13
+ if (Array.isArray(value)) return value.map(canonical)
14
+ if (plain(value)) return Object.fromEntries(Object.keys(value).sort().map(k => [k, canonical(value[k])]))
15
+ return value
16
+ }
17
+ const digestObject = value => assessmentDigest(JSON.stringify(canonical(value)))
18
+ const requireInput = (condition, message) => { if (!condition) throw new TypeError(message) }
19
+ const safePath = value => text(value) && !value.startsWith('/') && !value.includes('\\')
20
+ && value.split('/').every(part => part && part !== '.' && part !== '..')
21
+ const decode = bytes => new TextDecoder('utf-8', { fatal: true }).decode(bytes)
22
+ function readSetPins(readSet) {
23
+ requireInput(plain(readSet) && plain(readSet.scope) && sha(readSet.scope.projectSha256)
24
+ && sha(readSet.scope.repoAccessSha256) && Array.isArray(readSet.entries), 'Exact project/access/read-set pins required')
25
+ const keys = new Set()
26
+ const entries = readSet.entries.map(entry => {
27
+ requireInput(plain(entry) && text(entry.repo) && safePath(entry.path) && sha(entry.sha256)
28
+ && text(entry.revision), 'Exact source read-set entry required')
29
+ const key = JSON.stringify([entry.repo, entry.path])
30
+ requireInput(!keys.has(key), 'Duplicate read-set source'); keys.add(key)
31
+ return { repo: entry.repo, path: entry.path, sha256: entry.sha256, revision: entry.revision }
32
+ }).sort((a, b) => {
33
+ const left = JSON.stringify([a.repo, a.path]), right = JSON.stringify([b.repo, b.path])
34
+ return left < right ? -1 : left > right ? 1 : 0
35
+ })
36
+ return { scope: clone(readSet.scope), entries }
37
+ }
38
+
39
+ /** Inject the current owner-qualified implementations and their source identity. */
40
+ export function createAssessmentProjector({ inspectKnowledgePlan, splitFrontmatter, parseYamlSubset, check }) {
41
+ requireInput([inspectKnowledgePlan, splitFrontmatter, parseYamlSubset].every(f => typeof f === 'function')
42
+ && plain(check) && text(check.id) && sha(check.sourceSha256)
43
+ && ['version', 'sourceTree', 'sourceBlob', 'schemaBlob', 'graphBlob'].every(k => /^[a-f0-9]{40}$/.test(check[k] ?? '')),
44
+ 'Qualified checker/parser commit/tree/blob identity required')
45
+ const checker = clone(check)
46
+ const metadata = bytes => {
47
+ const split = splitFrontmatter(decode(bytes))
48
+ requireInput(split !== null, 'A typed Markdown frontmatter declaration is required')
49
+ return parseYamlSubset(split.yaml)
50
+ }
51
+
52
+ return function assessRequiredDirection({ planBytes, planSha256, graph, context = null,
53
+ evaluation = null, readSet, relationId, questionId, binding = null, currentSourceBytes = null }) {
54
+ requireInput(planBytes instanceof Uint8Array && sha(planSha256)
55
+ && assessmentDigest(planBytes) === planSha256, 'Current raw plan bytes/hash required')
56
+ const plan = JSON.parse(decode(planBytes))
57
+ requireInput(plain(graph) && typeof graph.ok === 'boolean' && Array.isArray(graph.nodes)
58
+ && Array.isArray(graph.edges) && Array.isArray(graph.errors), 'Canonical graph output required')
59
+ const pins = readSetPins(readSet)
60
+ // Original checker output is never rewritten or reconstructed from warnings.
61
+ const report = inspectKnowledgePlan(plan, graph)
62
+ const original = clone({ report, diagnostics: graph.diagnostics ?? [], graphErrors: graph.errors, context, evaluation })
63
+ requireInput(plain(report) && typeof report.ok === 'boolean' && Array.isArray(report.warnings)
64
+ && Array.isArray(report.errors), 'Unsupported checker output')
65
+ const evidence = { check: clone(checker), planSha256, readSet: pins, readSetSha256: digestObject(pins),
66
+ graphSha256: digestObject(graph), reportSha256: digestObject(report) }
67
+ const result = { projectionVersion: PROJECTION_VERSION, status: 'uncertain',
68
+ structure: report.status ?? 'invalid', coverage: 'unknown', currency: 'unverified',
69
+ semanticQualification: 'not-assessed', semanticSupport: 'unknown', grantsAuthority: false,
70
+ evidence, original, findings: [], refusal: null }
71
+ const refuse = (code, reason) => {
72
+ result.status = 'uncertain'; result.refusal = { code, reason }; return result
73
+ }
74
+ if (!graph.ok || !report.ok) { result.status = 'invalid'; return result }
75
+ requireInput(Array.isArray(report.relations), 'Unsupported relation-check output')
76
+ const relation = plan.relations.find(r => r.id === relationId)
77
+ const question = plan.questions.find(q => q.id === questionId)
78
+ requireInput(relation && question && question.relations.includes(relationId), 'A task-required declared relation must be selected')
79
+ const checked = report.relations.find(r => r.id === relationId)
80
+ requireInput(checked && Number.isSafeInteger(checked.matchingEdges), 'Selected relation has no checker result')
81
+ const warning = `relation ${relationId} has no declared edge in the required direction`
82
+ requireInput(report.warnings.includes(warning) === (checked.matchingEdges === 0), 'Checker relation/warning mismatch')
83
+ evidence.relationId = relationId; evidence.questionId = questionId
84
+
85
+ if (context !== null) {
86
+ requireInput(context.schema === 'atelier-knowledge-context@v1' && plain(context.coverage)
87
+ && Array.isArray(context.omissions) && Array.isArray(context.sources), 'Existing context output required')
88
+ if (context.planSha256 !== planSha256) return refuse('context-plan-stale', 'Context belongs to a different plan')
89
+ if (context.question !== question.question) return refuse('context-question-mismatch', 'Context belongs to a different task question')
90
+ for (const source of context.sources) {
91
+ const pin = pins.entries.find(e => e.repo === source.repo && e.path === source.path)
92
+ if (!pin || pin.sha256 !== source.sha256) return refuse('context-read-set-mismatch', 'Selected context source does not match the read-set')
93
+ }
94
+ result.coverage = context.coverage.omitted > 0 || context.coverage.omissionsUnlisted > 0 ? 'partial' : 'complete'
95
+ if (context.omissions.some(o => o.reason === 'changed-since-census')) {
96
+ result.currency = 'changed'
97
+ return refuse('source-changed-since-census', 'Current context omitted changed source bytes')
98
+ }
99
+ evidence.contextCensusSha256 = context.censusSha256
100
+ evidence.contextSha256 = digestObject(context)
101
+ }
102
+ if (evaluation !== null) {
103
+ requireInput(evaluation.schema === 'atelier-knowledge-evaluation@v1' && Array.isArray(evaluation.cases), 'Existing evaluation output required')
104
+ if (evaluation.planSha256 !== planSha256) return refuse('evaluation-plan-stale', 'Evaluation belongs to a different plan')
105
+ const evaluated = evaluation.cases.find(c => c.id === questionId)?.runs?.graph
106
+ requireInput(evaluated && Array.isArray(evaluated.stale), 'Selected question has no graph evaluation result')
107
+ if (evaluated.stale.length) {
108
+ result.currency = 'changed'
109
+ return refuse('expected-evidence-stale', 'Evaluation retains stale expected source pins')
110
+ }
111
+ evidence.evaluationSha256 = digestObject(evaluation)
112
+ }
113
+
114
+ // Bind even a cleared finding so a stale or missing target never masquerades
115
+ // as verified source correction. Refusals expose no actionable edit target.
116
+ if (!binding || !(currentSourceBytes instanceof Uint8Array)) return refuse('binding-missing', 'Exact source/field binding and current bytes are required')
117
+ const source = binding.source, field = binding.field, authoring = binding.authoring
118
+ if (!plain(source) || !plain(field) || !plain(authoring)) return refuse('binding-missing', 'Source, declaration and existing authoring identity are required')
119
+ const pin = pins.entries.find(e => e.repo === source.repo && e.path === source.path)
120
+ if (!pin || !sha(source.sha256) || !text(source.revision) || source.sha256 !== pin.sha256
121
+ || source.revision !== pin.revision || assessmentDigest(currentSourceBytes) !== source.sha256) {
122
+ result.currency = 'changed'; return refuse('binding-stale', 'Source bytes/revision differ from the bound read-set')
123
+ }
124
+ const node = graph.nodes.find(n => n.id === source.id && n.repo === source.repo && n.path === source.path)
125
+ const from = plan.concepts.find(c => c.id === relation.from)
126
+ if (!node || !node.tags.includes(from.tag)) return refuse('binding-source-mismatch', 'Target is not a source in the selected relation role')
127
+ if (field.format !== 'markdown-inline-array' || field.id !== `kg.relations.${relation.predicate}`
128
+ || field.pointer !== `/kg/relations/${relation.predicate}` || !Number.isSafeInteger(field.start)
129
+ || !Number.isSafeInteger(field.end) || field.start < 0 || field.end <= field.start
130
+ || field.end > currentSourceBytes.length || !text(field.quote) || !/^\[[^\r\n]*\]$/.test(field.quote)) {
131
+ return refuse('unsupported-declaration-profile', 'Only exact inline typed relation-array values are supported')
132
+ }
133
+ if (!['storeId', 'sourceId', 'artifactId', 'fieldId', 'actorBindingId'].every(k => text(authoring[k]))
134
+ || authoring.sourceId !== source.id || authoring.fieldId !== field.id) return refuse('authoring-binding-mismatch', 'Existing opaque authoring binding must match this source and field')
135
+ try {
136
+ const bytes = Buffer.from(currentSourceBytes)
137
+ // Fatal decoding of each segment refuses a split UTF-8 character.
138
+ decode(bytes.subarray(0, field.start)); decode(bytes.subarray(field.end))
139
+ if (decode(bytes.subarray(field.start, field.end)) !== field.quote) return refuse('binding-quote-mismatch', 'Declaration quote differs from exact source bytes')
140
+ const parsed = metadata(bytes), declared = parsed.kg?.relations?.[relation.predicate]
141
+ if (parsed.kg?.id !== node.id || !Array.isArray(declared) || !isDeepStrictEqual(declared, node.relations?.[relation.predicate])) {
142
+ return refuse('binding-declaration-mismatch', 'Typed declaration differs from canonical graph metadata')
143
+ }
144
+ // Prove the byte range is THIS typed value, using the existing parser.
145
+ // A matching quote in prose, another field or an overshadowed key fails.
146
+ const sentinel = `kh-locator-probe-${assessmentDigest(bytes).slice(0, 16)}`
147
+ const probe = Buffer.concat([bytes.subarray(0, field.start), Buffer.from(JSON.stringify([sentinel])), bytes.subarray(field.end)])
148
+ const expected = clone(parsed); expected.kg.relations[relation.predicate] = [sentinel]
149
+ if (!isDeepStrictEqual(metadata(probe), expected)) return refuse('binding-not-declaration', 'Byte range does not uniquely address the selected typed declaration')
150
+ } catch { return refuse('binding-decode-or-profile', 'Source or declaration does not fit the supported exact-byte profile') }
151
+
152
+ result.currency = 'current'
153
+ evidence.bindingSha256 = digestObject(binding)
154
+ evidence.comparisonSha256 = digestObject({ ...evidence, binding })
155
+ result.status = result.coverage === 'partial' ? 'partial'
156
+ : result.coverage === 'unknown' ? 'uncertain' : report.status
157
+ if (checked.matchingEdges === 0) result.findings.push({ referenceKey: `required-direction:${relationId}`,
158
+ originalMessage: warning, check: clone(checker), relation: clone(relation), questionId,
159
+ source: clone(source), declaration: clone(field), authoringBinding: clone(authoring),
160
+ actionable: result.coverage === 'complete', uncertainty: ['semantic-support-unassessed',
161
+ ...(result.coverage !== 'complete' ? ['coverage-incomplete'] : [])],
162
+ action: { kind: 'review-source-declaration', sourceMutation: false, canonicalAcceptance: false } })
163
+ return result
164
+ }
165
+ }