@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,350 @@
1
+ export const KNOWLEDGE_HEALTH_CAPABILITIES = Object.freeze({
2
+ "schema": "knowledge-health-capability-map@v0",
3
+ "projectionOnly": true,
4
+ "source": {
5
+ "commit": "fcfdbe5ded672d41c717f49e0cfdf68b6060834d",
6
+ "tree": "400e181cd0cb55976f3ef7ab1a1405531dacd521",
7
+ "referenceMode": "Static inventory of the native source at this commit and tree; each reference is pinned by blob. Not a release claim.",
8
+ "supersededQualification": {
9
+ "commit": "b1bdc9279a99f7c884ddfdfe0e2a24315d6f3666",
10
+ "tree": "2797f44baf89007d3808675d897e55a943fc0d65"
11
+ }
12
+ },
13
+ "publishedBaseline": {
14
+ "version": "0.2.0-alpha.12",
15
+ "registryIntegrityVerified": true,
16
+ "sourceVersionLabelIsNotReleaseProof": true
17
+ },
18
+ "capabilities": [
19
+ {
20
+ "id": "canonical-graph",
21
+ "spirals": [
22
+ "S1",
23
+ "S3"
24
+ ],
25
+ "sourceApi": "./graph#buildCanonicalGraph",
26
+ "sourceCommands": [
27
+ "atelier graph --project atelier.project.json",
28
+ "atelier graph --check --project atelier.project.json"
29
+ ],
30
+ "sourceReference": {
31
+ "path": "src/graph/graph.mjs",
32
+ "line": 147,
33
+ "blob": "6bce4e1213098457097e025f8ead53e6b4403336",
34
+ "sha256": "1f01fbeab7e6fcaed127c8fe84c9a48b08f1fec13d21f486c48726715a5bbb92"
35
+ },
36
+ "publishedBaseline": {
37
+ "version": "0.2.0-alpha.12",
38
+ "entryDeclared": true,
39
+ "filePresent": true
40
+ },
41
+ "verification": "Native function used in the relocated receiving rehearsal. CLI syntax/source only; not executed by this supplier.",
42
+ "limits": "Canonical graph includes declared and ordinary-link origins/offsets. Legacy graph artifact/CLI includes declared edges only; --check verifies generated artifact freshness, not semantic truth.",
43
+ "smallestSourceOwnerCorrection": "Keep existing graph implementation. Receive the assessment join; do not replace legacy artifact or claim ordinary links satisfy required direction."
44
+ },
45
+ {
46
+ "id": "typed-plan-check",
47
+ "spirals": [
48
+ "S1"
49
+ ],
50
+ "sourceApi": "internal:inspectKnowledgePlan",
51
+ "sourceCommands": [
52
+ "atelier knowledge check --project atelier.project.json --plan knowledge-plan.json"
53
+ ],
54
+ "sourceReference": {
55
+ "path": "src/knowledge/plan.mjs",
56
+ "line": 34,
57
+ "blob": "b029609a678354f188980acb8954030daa817582",
58
+ "sha256": "7ee8d7d20fcc85264dd484b129eae9a1ab4424b47aae0cce764f9e769fe32336"
59
+ },
60
+ "publishedBaseline": {
61
+ "version": "0.2.0-alpha.12",
62
+ "entryDeclared": false,
63
+ "filePresent": false
64
+ },
65
+ "verification": "Actual rule exercised through the additive installed-export rehearsal.",
66
+ "limits": "Only typed plan/concept tag/native predicate direction. Native warnings can coexist with ok=true and exit 0; no arbitrary prose applicability.",
67
+ "smallestSourceOwnerCorrection": "Receive src/knowledge-health and additive ./knowledge-health export; preserve current rule and warnings. Decide user CI warning policy explicitly."
68
+ },
69
+ {
70
+ "id": "bounded-agent-context",
71
+ "spirals": [
72
+ "S1",
73
+ "S2"
74
+ ],
75
+ "sourceApi": "internal:createKnowledgeContext",
76
+ "sourceCommands": [
77
+ "atelier knowledge context --project atelier.project.json --plan knowledge-plan.json --question \"What supports pilot readiness?\" --mode graph"
78
+ ],
79
+ "sourceReference": {
80
+ "path": "src/knowledge/context.mjs",
81
+ "line": 57,
82
+ "blob": "7d2be260883267277050c6f7f1f0b0cd6888e5a4",
83
+ "sha256": "29a73bc8e1afa498f1ed11e158379317cf738a898a68930d95b90b1f1f395d0d"
84
+ },
85
+ "publishedBaseline": {
86
+ "version": "0.2.0-alpha.12",
87
+ "entryDeclared": false,
88
+ "filePresent": false
89
+ },
90
+ "verification": "Actual native context used in the receiving rehearsal.",
91
+ "limits": "Bounded metadata lexical seeds and declared one-hop neighbors; omissions, unreadable and unlisted counts retained. Text is data. No provider execution, global semantic search or recipient sharing authority.",
92
+ "smallestSourceOwnerCorrection": "Ship existing knowledge command with current source; expose source-bound joins via the additive adapter. No replacement retrieval or graph model."
93
+ },
94
+ {
95
+ "id": "question-evaluation",
96
+ "spirals": [
97
+ "S2"
98
+ ],
99
+ "sourceApi": "internal:evaluateKnowledgeQuestions",
100
+ "sourceCommands": [
101
+ "atelier knowledge evaluate --project atelier.project.json --plan knowledge-plan.json"
102
+ ],
103
+ "sourceReference": {
104
+ "path": "src/knowledge/context.mjs",
105
+ "line": 175,
106
+ "blob": "7d2be260883267277050c6f7f1f0b0cd6888e5a4",
107
+ "sha256": "29a73bc8e1afa498f1ed11e158379317cf738a898a68930d95b90b1f1f395d0d"
108
+ },
109
+ "publishedBaseline": {
110
+ "version": "0.2.0-alpha.12",
111
+ "entryDeclared": false,
112
+ "filePresent": false
113
+ },
114
+ "verification": "Native graph/lexical evaluation used before/after correction.",
115
+ "limits": "Author-specified expected source/relation pins are excluded from retrieval. Stale expectations remain stale. No answer correctness, held-out qualification or human usefulness inference.",
116
+ "smallestSourceOwnerCorrection": "Ship existing evaluator and explain graph versus lexical comparison, appropriate abstention and explicit expected-pin refresh; retain separate human trials."
117
+ },
118
+ {
119
+ "id": "ingestion-evaluation",
120
+ "spirals": [
121
+ "S2"
122
+ ],
123
+ "sourceApi": "./ingestion/evaluation#evaluateIngestionTrial",
124
+ "sourceCommands": [],
125
+ "sourceReference": {
126
+ "path": "src/ingestion/evaluation.mjs",
127
+ "line": 38,
128
+ "blob": "4871eea0e980e3eb518a4cb23dbe97687ffa71c7",
129
+ "sha256": "adcf2f5d61fe0313e82a525ec28cea771d9d9ac1e470acba1da5be571387ba58"
130
+ },
131
+ "publishedBaseline": {
132
+ "version": "0.2.0-alpha.12",
133
+ "entryDeclared": false,
134
+ "filePresent": false
135
+ },
136
+ "verification": "Actual exported function exercised on invented calibration evidence, including duplicate accounting.",
137
+ "limits": "Exact evidence multiset/threshold evaluation; calibration-only never passes held-out gate. Unknown cost/elapsed/human acceptance remain null/unassessed; semanticQualification not-assessed.",
138
+ "smallestSourceOwnerCorrection": "Include current source export/module in next release and the portable example. No new model or held-out answer bank; genuine semantic trial is separately owned."
139
+ },
140
+ {
141
+ "id": "local-ingestion",
142
+ "spirals": [
143
+ "S2"
144
+ ],
145
+ "sourceApi": "./ingestion#createIngestionStore",
146
+ "sourceCommands": [
147
+ "atelier ingest plan",
148
+ "atelier ingest run",
149
+ "atelier ingest status",
150
+ "atelier ingest query"
151
+ ],
152
+ "sourceReference": {
153
+ "path": "src/commands/ingest.mjs",
154
+ "line": 4,
155
+ "blob": "2c5fc628d612968f686990ef39e69fdb6fd701bd",
156
+ "sha256": "380152f2af7e1e0e8d429a8876bc2b413628c902450733a5163eb49781206da9"
157
+ },
158
+ "publishedBaseline": {
159
+ "version": "0.2.0-alpha.12",
160
+ "entryDeclared": false,
161
+ "filePresent": false
162
+ },
163
+ "verification": "Static API/command source inspection only.",
164
+ "limits": "Private local UTF-8 JSON envelope; explicit source/scope/budget, lexical evidence; local text/CSV/JSON processing. No semantic claim acceptance or raw file graph enrollment.",
165
+ "smallestSourceOwnerCorrection": "Reuse current ingestion/store and ./knowledge localKnowledgeContext/contribution paths. Route actual semantic operation and human decisions to existing owners."
166
+ },
167
+ {
168
+ "id": "semantic-operation",
169
+ "spirals": [
170
+ "S2"
171
+ ],
172
+ "sourceApi": "internal:createSemanticOperation",
173
+ "sourceCommands": [],
174
+ "sourceReference": {
175
+ "path": "src/knowledge/semantic-operation.mjs",
176
+ "line": 133,
177
+ "blob": "eb131c7511a45fd0904b4a74a958b04d6436123f",
178
+ "sha256": "fb6fafabb00dbd65890c5b409f6d4562dcf041c84606a1b0c4f8fb3930d09ef2"
179
+ },
180
+ "publishedBaseline": {
181
+ "version": "0.2.0-alpha.12",
182
+ "entryDeclared": false,
183
+ "filePresent": false
184
+ },
185
+ "verification": "Static source inspection only; not executed or provider-qualified.",
186
+ "limits": "Owner-bound recorded callback, source dependency witnesses and reconsideration; proposal-only, semantic acceptance pending. No public ./knowledge export at this source for this function.",
187
+ "smallestSourceOwnerCorrection": "If the Dev Day interpretation path needs it, add the smallest owner-controlled export/wiring and exercise recorded invented lifecycle. Do not substitute a deterministic score for semantic/human evaluation."
188
+ },
189
+ {
190
+ "id": "repository-observation",
191
+ "spirals": [
192
+ "S3"
193
+ ],
194
+ "sourceApi": "./runtime/observation#observeRepository",
195
+ "sourceCommands": [
196
+ "atelier sync status --repo .",
197
+ "atelier sync trace --repo ."
198
+ ],
199
+ "sourceReference": {
200
+ "path": "src/runtime/repository-observation.mjs",
201
+ "line": 419,
202
+ "blob": "89bc5a0fc5eae7830d95b8811faaf664b239d583",
203
+ "sha256": "e6a53f6ce639a53a0888e038b244d26180ec5ef554bc49686dd91d9b3befb069"
204
+ },
205
+ "publishedBaseline": {
206
+ "version": "0.2.0-alpha.12",
207
+ "entryDeclared": true,
208
+ "filePresent": true
209
+ },
210
+ "verification": "Public baseline file/export verified; current source inspected read-only.",
211
+ "limits": "Local Git/head/status/filesystem evidence with blockers and bounded observation. A current Git observation does not prove application adoption, consumption, execution, remote freshness or causal lineage. Sync status/trace use already enrolled runtime state; reconcile/enroll/run are separate effects.",
212
+ "smallestSourceOwnerCorrection": "Join actual observation/status/operation trace with existing harness history/dependency snapshots in a receiving adapter; require explicit owner evidence for declared/adopted/consumed/executed. This context reports unobserved by default."
213
+ },
214
+ {
215
+ "id": "cross-repository-handoff",
216
+ "spirals": [
217
+ "S3"
218
+ ],
219
+ "sourceApi": "./harnesses#verifyHarnessHandoff",
220
+ "sourceCommands": [
221
+ "atelier harness inspect --profile knowledge --history HISTORY.json",
222
+ "atelier harness verify --handoff HANDOFF.json --history HISTORY.json"
223
+ ],
224
+ "sourceReference": {
225
+ "path": "src/commands/harness.mjs",
226
+ "line": 25,
227
+ "blob": "8fc40a7035e76a819c1752e1da2d413a89eb340f",
228
+ "sha256": "885070823aabe350eeabea1e629c6b91eb0462a1f5039e6b0759cdea81593ee6"
229
+ },
230
+ "publishedBaseline": {
231
+ "version": "0.2.0-alpha.12",
232
+ "entryDeclared": false,
233
+ "filePresent": false
234
+ },
235
+ "verification": "Static source inspection only.",
236
+ "limits": "Complete ledgers and explicit repository/profile/records dependency snapshots. Proposal/reported acceptance is not execution authority; no actual adopter chain was observed.",
237
+ "smallestSourceOwnerCorrection": "Reuse existing harness handoff/verify/reconcile and exact repository identities; publish a recorded public invented multi-repository exercise through receiving owner. Keep actual adopter/withdrawal acceptance open."
238
+ },
239
+ {
240
+ "id": "readiness-and-generated-freshness",
241
+ "spirals": [
242
+ "S3",
243
+ "S5"
244
+ ],
245
+ "sourceApi": "./readiness#buildReadiness",
246
+ "sourceCommands": [
247
+ "atelier readiness --project atelier.project.json",
248
+ "atelier readiness --check --project atelier.project.json",
249
+ "atelier generated check --project atelier.project.json"
250
+ ],
251
+ "sourceReference": {
252
+ "path": "src/readiness/readiness.mjs",
253
+ "line": 174,
254
+ "blob": "05f39956a13a8f8435a4709d4512364aa56a5661",
255
+ "sha256": "e5244afa52d01e8342cf1730990c3be6dd93bd6e82aaa8fb0014b6215bace652"
256
+ },
257
+ "publishedBaseline": {
258
+ "version": "0.2.0-alpha.12",
259
+ "entryDeclared": true,
260
+ "filePresent": true
261
+ },
262
+ "verification": "Public baseline file/export verified; static current source inspection only.",
263
+ "limits": "Existing artifact/schema/readiness checks, generated freshness and typed export boundaries. Native support limits and absent runtime evidence remain explicit; no human semantic health score.",
264
+ "smallestSourceOwnerCorrection": "Reuse current readiness/generated tools; wire the source-bound assessment outcome as an explicit input only where owner contract permits, without inferring human acceptance."
265
+ },
266
+ {
267
+ "id": "host-and-authoring",
268
+ "spirals": [
269
+ "S1",
270
+ "S4"
271
+ ],
272
+ "sourceApi": "./coauthor#createSession",
273
+ "sourceCommands": [
274
+ "atelier knowledge dashboard --project atelier.project.json --plan knowledge-plan.json",
275
+ "atelier knowledge session start",
276
+ "atelier dev --project atelier.project.json"
277
+ ],
278
+ "sourceReference": {
279
+ "path": "src/coauthor/session.mjs",
280
+ "line": 22,
281
+ "blob": "990ec8d01116ef289b514f9b590d53317b473b06",
282
+ "sha256": "8321f6c3164f55dbcec1c9e6e09f170ec5411e1ceb0685d32075516a4252b0b6"
283
+ },
284
+ "publishedBaseline": {
285
+ "version": "0.2.0-alpha.12",
286
+ "entryDeclared": true,
287
+ "filePresent": true
288
+ },
289
+ "verification": "Static current source inspection; this assessment supplier does not exercise UI/store/host save.",
290
+ "limits": "Existing native coauthor/store, presentation, Obsidian/sidecar and runtime ownership remain. Keyboard/IME/undo/zoom, actual source apply and participant understanding require the existing host proof owners.",
291
+ "smallestSourceOwnerCorrection": "Receive participatory supplier through existing Authoring writer. Source-bound assessment field binding is a handoff, not an apply operation; preserve one owning editor/save route."
292
+ },
293
+ {
294
+ "id": "normal-knowledge-workspace-init",
295
+ "spirals": [
296
+ "S1",
297
+ "S5"
298
+ ],
299
+ "sourceApi": null,
300
+ "sourceCommands": [
301
+ "atelier init ./workspace --template knowledge-workspace"
302
+ ],
303
+ "sourceReference": {
304
+ "path": "src/commands/init.mjs",
305
+ "line": 104,
306
+ "blob": "986712fb799daf3b8f1c484bf18b521fa6946ad7",
307
+ "sha256": "fb0c30241181ab6695a8690203bd83c561addd9e84392431395e907e5cb5a46d"
308
+ },
309
+ "publishedBaseline": {
310
+ "version": "0.2.0-alpha.12",
311
+ "dispatchAvailable": false,
312
+ "templateAvailable": false
313
+ },
314
+ "verification": "Source dispatch inspected read-only. Published baseline missing path/dispatch confirmed independently by package inspection and the receiving proof owner; not executed on a new registry release.",
315
+ "limits": "Explicit fixture helper does not qualify normal package init or installed hosted journey.",
316
+ "smallestSourceOwnerCorrection": "Ship actual current templates/knowledge-workspace and normal init knowledge-workspace dispatch; bind both to the frozen source and audit/execute normal init from exact official tarball and new published version."
317
+ }
318
+ ],
319
+ "retainedProgrammeToolingGaps": [
320
+ {
321
+ "spiral": "S2",
322
+ "need": "Semantic fidelity, qualifiers/contradiction/identity; optional bounded agent cost/value; private perspective and scoped learning",
323
+ "available": "Native question and ingestion evaluation, semantic operation lifecycle, contribution/learning primitives.",
324
+ "remaining": "Concrete package/UI lifecycle joins and human source-supported semantic trial. No model/held-out execution in this supplier.",
325
+ "owner": "Existing Foundation/Authoring semantic and evaluation owners via coordinator"
326
+ },
327
+ {
328
+ "spiral": "S3",
329
+ "need": "Declared/adopted/consumed/executed tracing; freshness, partial refresh, drift, withdrawal/recovery",
330
+ "available": "Git repository observation, sync status/trace, native source hashes/census omissions, harness ledgers/dependency snapshots.",
331
+ "remaining": "Actual receiving joins and recorded multi-repository use with exact owner evidence; withdrawal/recovery acceptance.",
332
+ "owner": "Existing Reliability/Adoption & proof via coordinator"
333
+ },
334
+ {
335
+ "spiral": "S4",
336
+ "need": "Additional hosts/media/domains, keyboard/IME/text scaling, accessible graph alternative, purposeful scale",
337
+ "available": "Existing source format/graph/presentation/runtime APIs and context byte/document/source budgets.",
338
+ "remaining": "Installed cross-host/media and accessibility/scale measurement. This proof is Node22.18 on macOS only.",
339
+ "owner": "Existing host/Authoring and Journey proof owners"
340
+ },
341
+ {
342
+ "spiral": "S5",
343
+ "need": "Ownership/documentation/rollback/maintenance and full programme closure",
344
+ "available": "Portable typed exercise, API/command map, native recovery/readiness and existing owner routes.",
345
+ "remaining": "Exact audited release, clean npm install, facilitator/participant feedback, ongoing owner receiving, all 22 promises disposition.",
346
+ "owner": "Coordinator, Foundation release and existing proof owners"
347
+ }
348
+ ],
349
+ "grantsAuthority": false
350
+ })
@@ -0,0 +1,62 @@
1
+ import { assessmentDigest } from './assessment.mjs'
2
+
3
+ const clone = value => structuredClone(value)
4
+ const demand = (ok, message) => { if (!ok) throw new TypeError(message) }
5
+ const canonical = value => Array.isArray(value) ? value.map(canonical)
6
+ : value && typeof value === 'object' ? Object.fromEntries(Object.keys(value).sort().map(k => [k, canonical(value[k])])) : value
7
+ export const knowledgeHealthContextDigest = value => assessmentDigest(JSON.stringify(canonical(value)))
8
+
9
+ /** A caller projection of existing outputs, never a canonical model or score. */
10
+ export function knowledgeHealthContext({ assessment, graph, planBytes, agentSuggestions = [], repositoryEvidence = null }) {
11
+ demand(assessment?.projectionVersion === 'kh-required-direction-projection/r1'
12
+ && assessment.grantsAuthority === false && Array.isArray(assessment.findings), 'Source-qualified assessment required')
13
+ demand(Array.isArray(graph?.nodes) && Array.isArray(graph?.edges) && Array.isArray(graph?.diagnostics), 'Existing canonical graph required')
14
+ demand(assessment.evidence.graphSha256 === knowledgeHealthContextDigest(graph), 'Assessment graph identity mismatch')
15
+ demand(planBytes instanceof Uint8Array && assessmentDigest(planBytes) === assessment.evidence.planSha256, 'Assessment raw plan identity mismatch')
16
+ const plan = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(planBytes))
17
+ demand(Array.isArray(plan?.concepts) && Array.isArray(plan?.relations) && Array.isArray(plan?.questions), 'Typed plan required')
18
+ demand(Array.isArray(agentSuggestions) && agentSuggestions.length <= 20, 'At most 20 supplied suggestions')
19
+ const context = assessment.original.context
20
+ const selected = new Map((context?.sources ?? []).map(s => [s.id, s]))
21
+ const suggestions = agentSuggestions.map(suggestion => {
22
+ demand(suggestion && typeof suggestion.text === 'string' && suggestion.text.trim()
23
+ && Buffer.byteLength(suggestion.text) <= 4096 && Array.isArray(suggestion.citations)
24
+ && suggestion.citations.length > 0 && suggestion.citations.length <= 20, 'Bounded suggestion and citations required')
25
+ const p = suggestion.provenance
26
+ demand(p && ['actorId', 'method', 'version', 'recordId'].every(k => typeof p[k] === 'string' && p[k].trim())
27
+ && p.planSha256 === assessment.evidence.planSha256
28
+ && p.readSetSha256 === assessment.evidence.readSetSha256, 'Suggestion provenance must bind this assessment')
29
+ for (const c of suggestion.citations) {
30
+ const source = selected.get(c.id)
31
+ demand(source && c.sha256 === source.sha256, 'Suggestion citation is absent or stale')
32
+ }
33
+ return { text: suggestion.text, citations: clone(suggestion.citations), provenance: clone(p),
34
+ status: 'caller-supplied-unreviewed', semanticSupport: 'unknown', grantsAuthority: false }
35
+ })
36
+ const byCode = Object.fromEntries([...new Set(graph.diagnostics.map(d => d.code ?? 'unspecified'))].sort()
37
+ .map(code => [code, graph.diagnostics.filter(d => (d.code ?? 'unspecified') === code).length]))
38
+ return {
39
+ schema: 'atelier-knowledge-health-context@v0', projection: 'existing-output-view',
40
+ assessment: clone(assessment),
41
+ structure: { scope: 'This enrolled graph and typed plan; counts are observations, not health judgments.',
42
+ records: { observed: graph.nodes.length, unclassified: assessment.original.report.unclassifiedRecords ?? null },
43
+ edges: { observed: graph.edges.length, declared: graph.edges.filter(e => e.origin === 'declared').length,
44
+ ordinaryLinks: graph.edges.filter(e => e.origin === 'ordinary-link').length },
45
+ diagnostics: { observed: graph.diagnostics.length, byCode },
46
+ concepts: { planned: plan.concepts.length, checked: assessment.original.report.concepts?.length ?? null,
47
+ rows: clone(assessment.original.report.concepts ?? []) },
48
+ relations: { planned: plan.relations.length, checked: assessment.original.report.relations?.length ?? null,
49
+ rows: clone(assessment.original.report.relations ?? []) },
50
+ questions: { planned: plan.questions.length, selected: context?.question ?? null } },
51
+ coverage: context ? { state: assessment.coverage, ...clone(context.coverage), selected: context.sources.length,
52
+ omissions: clone(context.omissions), budget: clone(context.budget) } : { state: 'unknown', selected: null },
53
+ semantic: { qualification: 'not-assessed', support: 'unknown', providerCalls: 0,
54
+ measuredCost: null, humanAcceptance: 'unobserved' },
55
+ agentSuggestions: suggestions,
56
+ repository: { state: repositoryEvidence === null ? 'unobserved' : 'caller-supplied-unverified',
57
+ evidence: clone(repositoryEvidence), declared: 'unobserved', adopted: 'unobserved', consumed: 'unobserved', executed: 'unobserved' },
58
+ reproducibility: { ...clone(assessment.evidence),
59
+ graphDigestScope: 'Exact native graph output includes location-dependent options. Relocating changes that digest; source/read-set pins remain independently visible.' },
60
+ grantsAuthority: false,
61
+ }
62
+ }
@@ -0,0 +1,47 @@
1
+ import fs from 'node:fs'
2
+ import path from 'node:path'
3
+ import { fileURLToPath } from 'node:url'
4
+ import { spawnSync } from 'node:child_process'
5
+ import { resolveProjectConfig } from '../project/config.mjs'
6
+ import { assessKnowledgeHealth } from './owner-join.mjs'
7
+ import { assessmentDigest } from './assessment.mjs'
8
+ import { evaluateIngestionTrial } from '../ingestion/evaluation.mjs'
9
+
10
+ /** The caller explicitly creates a disposable example. No existing directory
11
+ * is overwritten, and the assessment operation itself never writes sources. */
12
+ export function initializeExample(destination) {
13
+ const root = path.resolve(destination)
14
+ fs.mkdirSync(root, { recursive: false })
15
+ fs.cpSync(fileURLToPath(new URL('../../fixtures/knowledge-health/workspace/', import.meta.url)), root, { recursive: true, force: false })
16
+ const git = spawnSync('git', ['init', '--quiet'], { cwd: root, encoding: 'utf8', timeout: 15000,
17
+ env: { PATH: process.env.PATH, GIT_CONFIG_NOSYSTEM: '1', GIT_CONFIG_GLOBAL: process.platform === 'win32' ? 'NUL' : '/dev/null' } })
18
+ if (git.status !== 0) throw new Error('Example requires Git on PATH; remove the disposable example and retry after installing Git')
19
+ return root
20
+ }
21
+
22
+ export function assessExample(root) {
23
+ const project = resolveProjectConfig({ cwd: root, argv: ['--project', path.join(root, 'atelier.project.json')],
24
+ env: {}, writeLocalState: false })
25
+ const records = path.join(root, 'records'), sourceBytes = fs.readFileSync(path.join(records, 'checklist.md'))
26
+ const match = sourceBytes.toString('utf8').match(/^ supports: (\[[^\r\n]*\])$/m)
27
+ if (!match) throw new Error('Example declaration must remain an inline typed supports array')
28
+ const prefix = ' supports: ', needle = Buffer.from(match[0]), start = sourceBytes.indexOf(needle) + Buffer.byteLength(prefix)
29
+ const sourceRevisions = ['checklist.md', 'pilot.md'].map(sourcePath => ({ repo: 'records', path: sourcePath,
30
+ revision: `content-sha256:${assessmentDigest(fs.readFileSync(path.join(records, sourcePath)))}` }))
31
+ const revision = sourceRevisions.find(r => r.path === 'checklist.md').revision
32
+ const binding = { source: { id: 'demo:checklist', repo: 'records', path: 'checklist.md',
33
+ sha256: assessmentDigest(sourceBytes), revision },
34
+ field: { id: 'kg.relations.supports', pointer: '/kg/relations/supports', format: 'markdown-inline-array',
35
+ start, end: start + Buffer.byteLength(match[1]), quote: match[1] },
36
+ authoring: { storeId: 'invented-example-store', sourceId: 'demo:checklist', artifactId: 'invented-checklist',
37
+ fieldId: 'kg.relations.supports', actorBindingId: 'invented-example-owner' } }
38
+ return assessKnowledgeHealth({ project, relationId: 'checklist-pilot', questionId: 'readiness',
39
+ sourceRevisions, binding, currentSourceBytes: sourceBytes })
40
+ }
41
+
42
+ /** Recorded invented calibration only. Runs no processor, provider or held-out
43
+ * suite, and keeps the native evaluator's unknown semantic and cost states. */
44
+ export function evaluateKnowledgeHealthCalibration() {
45
+ const read = name => JSON.parse(fs.readFileSync(new URL(`../../fixtures/knowledge-health/${name}.json`, import.meta.url), 'utf8'))
46
+ return evaluateIngestionTrial({ suite: read('calibration-suite'), trial: read('calibration-trial') })
47
+ }
@@ -0,0 +1,10 @@
1
+ export { assessmentDigest, createAssessmentProjector, PROJECTION_VERSION } from './assessment.mjs'
2
+ export { knowledgeHealthContext, knowledgeHealthContextDigest } from './context.mjs'
3
+ export { assessKnowledgeHealth } from './owner-join.mjs'
4
+ export { initializeExample as initializeKnowledgeHealthExample, assessExample as assessKnowledgeHealthExample, evaluateKnowledgeHealthCalibration } from './example.mjs'
5
+ export { KNOWLEDGE_HEALTH_CAPABILITIES } from './capabilities.mjs'
6
+ export { initializeKnowledgeHealthWorkshop, assessKnowledgeHealthWorkshop, prepareKnowledgeHealthWorkshopChoice } from './workshop.mjs'
7
+ export { rehearseInstalledWorkshop } from '../knowledge/participatory/installed-workshop.mjs'
8
+ export { inspectKnowledgePlan, validateKnowledgePlan } from '../knowledge/plan.mjs'
9
+
10
+ export { createPublicWorkshopComposition, inspectPublicWorkshop, preparePublicWorkshopHandoff } from './workshop-composition.mjs'
@@ -0,0 +1,88 @@
1
+ import fs from 'node:fs'
2
+ import path from 'node:path'
3
+ import { isDeepStrictEqual } from 'node:util'
4
+ import { buildCanonicalGraph, createGraphFileCache } from '../graph/graph.mjs'
5
+ import { splitFrontmatter, parseYamlSubset } from '../graph/knowledge-graph.mjs'
6
+ import { inspectKnowledgePlan } from '../knowledge/plan.mjs'
7
+ import { createKnowledgeContext, evaluateKnowledgeQuestions } from '../knowledge/context.mjs'
8
+ import { openRegularFileNoFollow } from '../project/private-state.mjs'
9
+ import { assessmentDigest, createAssessmentProjector } from './assessment.mjs'
10
+ import { knowledgeHealthContext, knowledgeHealthContextDigest } from './context.mjs'
11
+
12
+ // Receiving proposal: place this directory beside the existing owner modules.
13
+ // It joins their functions; it adds no graph rules, root CLI or source writer.
14
+ import { ruleIdentity as identity } from './rule-identity.mjs'
15
+ function verifyRules() {
16
+ for (const pin of identity.files) {
17
+ const bytes = fs.readFileSync(new URL(`../../${pin.path}`, import.meta.url))
18
+ if (assessmentDigest(bytes) !== pin.sha256) throw new Error(`Knowledge Health rule identity drift: ${pin.path}`)
19
+ }
20
+ }
21
+ const pinFor = file => identity.files.find(p => p.path === file)
22
+ const check = { id: 'atelier.inspectKnowledgePlan.required-direction', version: identity.commit,
23
+ sourceTree: identity.tree, sourceBlob: pinFor('src/knowledge/plan.mjs').blob,
24
+ schemaBlob: pinFor('templates/knowledge-workspace/knowledge-plan.schema.json').blob,
25
+ graphBlob: pinFor('src/graph/graph.mjs').blob, sourceSha256: pinFor('src/knowledge/plan.mjs').sha256 }
26
+ const projectAssessment = createAssessmentProjector({ inspectKnowledgePlan, splitFrontmatter, parseYamlSubset, check })
27
+
28
+ function readBounded(file, ceiling) {
29
+ const fd = openRegularFileNoFollow(file)
30
+ try {
31
+ if (fs.fstatSync(fd).size > ceiling) throw new Error('Assessment input exceeds byte ceiling')
32
+ const bytes = Buffer.alloc(ceiling + 1)
33
+ let count = 0, read
34
+ while (count < bytes.length && (read = fs.readSync(fd, bytes, count, bytes.length - count, null)) > 0) count += read
35
+ if (count > ceiling) throw new Error('Assessment input exceeds byte ceiling')
36
+ return bytes.subarray(0, count)
37
+ } finally { fs.closeSync(fd) }
38
+ }
39
+
40
+ /** Read-only assessment of an existing resolved project. Binding and revisions
41
+ * come from the source's owner. A content digest is not a durable store head. */
42
+ export function assessKnowledgeHealth({ project, planPath = 'knowledge-plan.json', relationId, questionId,
43
+ sourceRevisions, binding, currentSourceBytes, maxContextBytes, agentSuggestions = [], repositoryEvidence = null }) {
44
+ verifyRules()
45
+ if (!project?.configPath || !project?.repoAccessPath || !Array.isArray(sourceRevisions)) {
46
+ throw new TypeError('Existing resolved project, explicit access file and source revisions required')
47
+ }
48
+ const file = path.resolve(project.configDir, planPath)
49
+ const planBytes = readBounded(file, 65536), planSha256 = assessmentDigest(planBytes)
50
+ const plan = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(planBytes))
51
+ const configBytes = readBounded(project.configPath, 1048576)
52
+ if (!isDeepStrictEqual(JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(configBytes)), project.config)) {
53
+ throw new TypeError('Resolved project config is stale; resolve it again before assessment')
54
+ }
55
+ const scope = { projectSha256: assessmentDigest(configBytes),
56
+ repoAccessSha256: assessmentDigest(readBounded(project.repoAccessPath, 1048576)),
57
+ resolvedReposSha256: knowledgeHealthContextDigest(project.repos) }
58
+ const revisionKeys = sourceRevisions.map(r => JSON.stringify([r.repo, r.path]))
59
+ if (new Set(revisionKeys).size !== revisionKeys.length) throw new TypeError('Duplicate source revision')
60
+ const revisions = new Map(sourceRevisions.map(r => [JSON.stringify([r.repo, r.path]), r.revision]))
61
+ const cache = createGraphFileCache(), graph = buildCanonicalGraph(project, { fileCache: cache })
62
+ const readSet = { scope, entries: [...cache.files].map(([key, value]) => {
63
+ const [repo, sourcePath] = key.split('\u0000')
64
+ const revision = revisions.get(JSON.stringify([repo, sourcePath]))
65
+ if (typeof revision !== 'string' || !revision.trim()) throw new TypeError('Missing exact source revision')
66
+ return { repo, path: sourcePath, sha256: value.digest, revision }
67
+ }) }
68
+ const native = inspectKnowledgePlan(plan, graph)
69
+ const question = plan.questions?.find(q => q.id === questionId)
70
+ const context = native.ok && graph.ok && question
71
+ ? createKnowledgeContext({ project, plan, sha256: planSha256, graph, cache,
72
+ question: question.question, ...(maxContextBytes === undefined ? {} : { maxBytes: maxContextBytes }) }) : null
73
+ // Expected pins are an evaluation input, not a retrieval input. Never update
74
+ // them because a source was edited: stale evaluation remains visible.
75
+ const evaluation = native.ok && graph.ok ? evaluateKnowledgeQuestions({ project, plan, sha256: planSha256, graph, cache }) : null
76
+ if (scope.projectSha256 !== assessmentDigest(readBounded(project.configPath, 1048576))
77
+ || scope.repoAccessSha256 !== assessmentDigest(readBounded(project.repoAccessPath, 1048576))
78
+ || planSha256 !== assessmentDigest(readBounded(file, 65536))) throw new Error('Assessment scope changed during read; rerun from current inputs')
79
+ const assessment = projectAssessment({ planBytes, planSha256, graph, context, evaluation: null,
80
+ readSet, relationId, questionId, binding, currentSourceBytes })
81
+ // Retrieval evaluation can retain stale baseline expectations after an
82
+ // authorized edit while the current structural reassessment clears. These
83
+ // are separate facts. Caller can feed evaluation to the pure projector when
84
+ // its task specifically requires those frozen expected-evidence pins.
85
+ return { assessment, retrievalEvaluation: evaluation,
86
+ context: Array.isArray(plan.concepts) && Array.isArray(plan.relations) && Array.isArray(plan.questions)
87
+ ? knowledgeHealthContext({ assessment, graph, planBytes, agentSuggestions, repositoryEvidence }) : null }
88
+ }
@@ -0,0 +1,24 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import {createHash} from 'node:crypto';
4
+ import {spawnSync} from 'node:child_process';
5
+ import assert from 'node:assert/strict';
6
+ export const hash=(value,algorithm='sha256',format='hex')=>createHash(algorithm).update(value).digest(format);
7
+ export const readJson=p=>JSON.parse(fs.readFileSync(p,'utf8'));
8
+ export function pin(p){const b=fs.readFileSync(p);return {path:path.resolve(p),sha256:hash(b),bytes:b.length};}
9
+ export function cleanEnvironment(){
10
+ const allowed=['PATH','TMPDIR','TMP','TEMP','LANG','LC_ALL','SystemRoot','COMSPEC'];
11
+ const env=Object.fromEntries(allowed.filter(k=>process.env[k]!==undefined).map(k=>[k,process.env[k]]));
12
+ return {...env,GIT_CONFIG_NOSYSTEM:'1',GIT_CONFIG_GLOBAL:'/dev/null',GIT_TERMINAL_PROMPT:'0'};
13
+ }
14
+ export function run(command,args,{cwd,env=cleanEnvironment(),input,timeout=120000,accept=[0]}={}){
15
+ const out=spawnSync(command,args,{cwd,env,input,encoding:'utf8',timeout,maxBuffer:4*1024*1024});
16
+ const observation={command:path.basename(command),args,status:out.status,signal:out.signal,stdout:out.stdout??'',stderr:out.stderr??'',error:out.error?{code:out.error.code,message:out.error.message}:null};
17
+ if(!accept.includes(out.status)){const e=Error('Consumer command failed: '+path.basename(command)+' '+args.join(' '));e.observation=observation;throw e;}
18
+ return observation;
19
+ }
20
+ export function npm(args,root,extra={}){
21
+ assert.notEqual(process.platform,'win32','This harness has not been qualified on Windows');
22
+ return run('npm',[...args,'--registry=https://registry.npmjs.org','--userconfig='+path.join(root,'config/user.npmrc'),'--globalconfig='+path.join(root,'config/global.npmrc'),'--cache='+path.join(root,'cache'),'--fetch-retries=0','--fetch-timeout=20000'],{cwd:root,...extra});
23
+ }
24
+ export function files(root){const out=[];function walk(dir){for(const e of fs.readdirSync(dir,{withFileTypes:true})){if(e.isDirectory())walk(path.join(dir,e.name));else if(e.isFile())out.push(path.relative(root,path.join(dir,e.name)).replaceAll(path.sep,'/'));}}walk(root);return out.sort();}