@zigrivers/scaffold 3.27.0 → 3.29.0

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 (698) hide show
  1. package/README.md +5 -1
  2. package/content/guides/.gitkeep +0 -0
  3. package/content/guides/index.html +1188 -0
  4. package/content/guides/mmr/.diagrams/diagram-0.svg +1 -0
  5. package/content/guides/mmr/.diagrams/manifest.json +3 -0
  6. package/content/guides/mmr/index.html +1728 -0
  7. package/content/guides/mmr/index.md +403 -0
  8. package/content/knowledge/VERSION +1 -0
  9. package/content/knowledge/backend/backend-api-design.md +8 -0
  10. package/content/knowledge/backend/backend-architecture.md +8 -0
  11. package/content/knowledge/backend/backend-async-patterns.md +7 -0
  12. package/content/knowledge/backend/backend-auth-patterns.md +9 -0
  13. package/content/knowledge/backend/backend-conventions.md +6 -0
  14. package/content/knowledge/backend/backend-data-modeling.md +7 -0
  15. package/content/knowledge/backend/backend-deployment.md +8 -0
  16. package/content/knowledge/backend/backend-dev-environment.md +5 -0
  17. package/content/knowledge/backend/backend-fintech-broker-integration.md +6 -0
  18. package/content/knowledge/backend/backend-fintech-compliance.md +10 -2
  19. package/content/knowledge/backend/backend-fintech-data-modeling.md +6 -0
  20. package/content/knowledge/backend/backend-fintech-ledger.md +6 -0
  21. package/content/knowledge/backend/backend-fintech-observability.md +6 -0
  22. package/content/knowledge/backend/backend-fintech-order-lifecycle.md +6 -0
  23. package/content/knowledge/backend/backend-fintech-risk-management.md +6 -0
  24. package/content/knowledge/backend/backend-fintech-testing.md +6 -0
  25. package/content/knowledge/backend/backend-observability.md +7 -0
  26. package/content/knowledge/backend/backend-project-structure.md +6 -0
  27. package/content/knowledge/backend/backend-requirements.md +6 -0
  28. package/content/knowledge/backend/backend-security.md +7 -0
  29. package/content/knowledge/backend/backend-testing.md +7 -0
  30. package/content/knowledge/backend/backend-worker-patterns.md +6 -0
  31. package/content/knowledge/browser-extension/browser-extension-architecture.md +6 -0
  32. package/content/knowledge/browser-extension/browser-extension-content-scripts.md +6 -0
  33. package/content/knowledge/browser-extension/browser-extension-conventions.md +6 -0
  34. package/content/knowledge/browser-extension/browser-extension-cross-browser.md +6 -0
  35. package/content/knowledge/browser-extension/browser-extension-dev-environment.md +6 -0
  36. package/content/knowledge/browser-extension/browser-extension-manifest.md +6 -0
  37. package/content/knowledge/browser-extension/browser-extension-project-structure.md +6 -0
  38. package/content/knowledge/browser-extension/browser-extension-requirements.md +6 -0
  39. package/content/knowledge/browser-extension/browser-extension-security.md +7 -0
  40. package/content/knowledge/browser-extension/browser-extension-service-workers.md +6 -0
  41. package/content/knowledge/browser-extension/browser-extension-store-submission.md +6 -0
  42. package/content/knowledge/browser-extension/browser-extension-testing.md +6 -0
  43. package/content/knowledge/cli/cli-architecture.md +4 -0
  44. package/content/knowledge/cli/cli-conventions.md +4 -0
  45. package/content/knowledge/cli/cli-dev-environment.md +5 -0
  46. package/content/knowledge/cli/cli-distribution-patterns.md +5 -0
  47. package/content/knowledge/cli/cli-interactivity-patterns.md +4 -0
  48. package/content/knowledge/cli/cli-output-patterns.md +4 -0
  49. package/content/knowledge/cli/cli-project-structure.md +4 -0
  50. package/content/knowledge/cli/cli-requirements.md +4 -0
  51. package/content/knowledge/cli/cli-shell-integration.md +4 -0
  52. package/content/knowledge/cli/cli-testing.md +4 -0
  53. package/content/knowledge/core/adr-craft.md +8 -0
  54. package/content/knowledge/core/ai-memory-management.md +23 -0
  55. package/content/knowledge/core/api-design.md +6 -0
  56. package/content/knowledge/core/automated-review-tooling.md +8 -0
  57. package/content/knowledge/core/claude-md-patterns.md +10 -2
  58. package/content/knowledge/core/coding-conventions.md +10 -2
  59. package/content/knowledge/core/database-design.md +8 -0
  60. package/content/knowledge/core/design-system-tokens.md +8 -0
  61. package/content/knowledge/core/dev-environment.md +4 -0
  62. package/content/knowledge/core/domain-modeling.md +6 -0
  63. package/content/knowledge/core/eval-craft.md +6 -0
  64. package/content/knowledge/core/git-workflow-patterns.md +8 -0
  65. package/content/knowledge/core/multi-model-research-dispatch.md +6 -0
  66. package/content/knowledge/core/multi-model-review-dispatch.md +6 -0
  67. package/content/knowledge/core/multi-service-api-contracts.md +5 -0
  68. package/content/knowledge/core/multi-service-architecture.md +5 -0
  69. package/content/knowledge/core/multi-service-auth.md +6 -0
  70. package/content/knowledge/core/multi-service-data-ownership.md +8 -0
  71. package/content/knowledge/core/multi-service-observability.md +8 -0
  72. package/content/knowledge/core/multi-service-resilience.md +5 -0
  73. package/content/knowledge/core/multi-service-task-decomposition.md +8 -0
  74. package/content/knowledge/core/multi-service-testing.md +5 -0
  75. package/content/knowledge/core/operations-runbook.md +8 -0
  76. package/content/knowledge/core/project-structure-patterns.md +4 -0
  77. package/content/knowledge/core/review-step-template.md +4 -0
  78. package/content/knowledge/core/security-best-practices.md +6 -0
  79. package/content/knowledge/core/system-architecture.md +6 -0
  80. package/content/knowledge/core/task-decomposition.md +9 -4
  81. package/content/knowledge/core/task-tracking.md +128 -29
  82. package/content/knowledge/core/tech-stack-selection.md +8 -0
  83. package/content/knowledge/core/test-skeleton-generation.md +4 -0
  84. package/content/knowledge/core/testing-strategy.md +8 -0
  85. package/content/knowledge/core/user-stories.md +9 -1
  86. package/content/knowledge/core/user-story-innovation.md +4 -0
  87. package/content/knowledge/core/ux-specification.md +5 -0
  88. package/content/knowledge/data-pipeline/data-pipeline-architecture.md +5 -0
  89. package/content/knowledge/data-pipeline/data-pipeline-batch-patterns.md +4 -0
  90. package/content/knowledge/data-pipeline/data-pipeline-conventions.md +4 -0
  91. package/content/knowledge/data-pipeline/data-pipeline-dev-environment.md +4 -0
  92. package/content/knowledge/data-pipeline/data-pipeline-orchestration.md +4 -0
  93. package/content/knowledge/data-pipeline/data-pipeline-project-structure.md +4 -0
  94. package/content/knowledge/data-pipeline/data-pipeline-quality.md +4 -0
  95. package/content/knowledge/data-pipeline/data-pipeline-requirements.md +4 -0
  96. package/content/knowledge/data-pipeline/data-pipeline-schema-management.md +4 -0
  97. package/content/knowledge/data-pipeline/data-pipeline-security.md +4 -0
  98. package/content/knowledge/data-pipeline/data-pipeline-streaming-patterns.md +4 -0
  99. package/content/knowledge/data-pipeline/data-pipeline-testing.md +4 -0
  100. package/content/knowledge/data-science/data-science-architecture.md +5 -0
  101. package/content/knowledge/data-science/data-science-conventions.md +6 -0
  102. package/content/knowledge/data-science/data-science-data-versioning.md +6 -0
  103. package/content/knowledge/data-science/data-science-dev-environment.md +6 -0
  104. package/content/knowledge/data-science/data-science-experiment-tracking.md +8 -0
  105. package/content/knowledge/data-science/data-science-model-evaluation.md +5 -0
  106. package/content/knowledge/data-science/data-science-notebook-discipline.md +5 -0
  107. package/content/knowledge/data-science/data-science-observability.md +6 -0
  108. package/content/knowledge/data-science/data-science-project-structure.md +5 -0
  109. package/content/knowledge/data-science/data-science-reproducibility.md +8 -0
  110. package/content/knowledge/data-science/data-science-requirements.md +5 -0
  111. package/content/knowledge/data-science/data-science-security.md +8 -0
  112. package/content/knowledge/data-science/data-science-testing.md +5 -0
  113. package/content/knowledge/execution/enhancement-workflow.md +4 -0
  114. package/content/knowledge/execution/multi-agent-coordination.md +129 -0
  115. package/content/knowledge/execution/task-claiming-strategy.md +19 -3
  116. package/content/knowledge/execution/tdd-execution-loop.md +5 -0
  117. package/content/knowledge/execution/worktree-management.md +10 -3
  118. package/content/knowledge/finalization/apply-fixes-and-freeze.md +4 -0
  119. package/content/knowledge/finalization/developer-onboarding.md +4 -0
  120. package/content/knowledge/finalization/implementation-playbook.md +4 -0
  121. package/content/knowledge/game/game-accessibility.md +4 -0
  122. package/content/knowledge/game/game-ai-patterns.md +4 -0
  123. package/content/knowledge/game/game-asset-pipeline.md +4 -0
  124. package/content/knowledge/game/game-audio-design.md +4 -0
  125. package/content/knowledge/game/game-binary-vcs-strategy.md +5 -0
  126. package/content/knowledge/game/game-design-document.md +4 -0
  127. package/content/knowledge/game/game-domain-patterns.md +4 -0
  128. package/content/knowledge/game/game-economy-design.md +4 -0
  129. package/content/knowledge/game/game-engine-selection.md +4 -0
  130. package/content/knowledge/game/game-ideation.md +4 -0
  131. package/content/knowledge/game/game-input-systems.md +4 -0
  132. package/content/knowledge/game/game-level-content-design.md +4 -0
  133. package/content/knowledge/game/game-liveops-analytics.md +4 -0
  134. package/content/knowledge/game/game-localization.md +4 -0
  135. package/content/knowledge/game/game-milestone-definitions.md +4 -0
  136. package/content/knowledge/game/game-modding-ugc.md +4 -0
  137. package/content/knowledge/game/game-narrative-design.md +4 -0
  138. package/content/knowledge/game/game-networking.md +4 -0
  139. package/content/knowledge/game/game-performance-budgeting.md +4 -0
  140. package/content/knowledge/game/game-platform-certification.md +6 -0
  141. package/content/knowledge/game/game-project-structure.md +4 -0
  142. package/content/knowledge/game/game-save-systems.md +4 -0
  143. package/content/knowledge/game/game-testing-strategy.md +4 -0
  144. package/content/knowledge/game/game-ui-patterns.md +4 -0
  145. package/content/knowledge/game/game-vr-ar-design.md +6 -0
  146. package/content/knowledge/library/library-api-design.md +4 -0
  147. package/content/knowledge/library/library-architecture.md +4 -0
  148. package/content/knowledge/library/library-bundling.md +4 -0
  149. package/content/knowledge/library/library-conventions.md +5 -0
  150. package/content/knowledge/library/library-dev-environment.md +4 -0
  151. package/content/knowledge/library/library-documentation.md +4 -0
  152. package/content/knowledge/library/library-project-structure.md +4 -0
  153. package/content/knowledge/library/library-requirements.md +4 -0
  154. package/content/knowledge/library/library-security.md +4 -0
  155. package/content/knowledge/library/library-testing.md +4 -0
  156. package/content/knowledge/library/library-type-definitions.md +4 -0
  157. package/content/knowledge/library/library-versioning.md +5 -0
  158. package/content/knowledge/ml/ml-architecture.md +4 -0
  159. package/content/knowledge/ml/ml-conventions.md +4 -0
  160. package/content/knowledge/ml/ml-dev-environment.md +4 -0
  161. package/content/knowledge/ml/ml-experiment-tracking.md +6 -0
  162. package/content/knowledge/ml/ml-model-evaluation.md +4 -0
  163. package/content/knowledge/ml/ml-observability.md +5 -0
  164. package/content/knowledge/ml/ml-project-structure.md +4 -0
  165. package/content/knowledge/ml/ml-requirements.md +4 -0
  166. package/content/knowledge/ml/ml-security.md +5 -0
  167. package/content/knowledge/ml/ml-serving-patterns.md +4 -0
  168. package/content/knowledge/ml/ml-testing.md +4 -0
  169. package/content/knowledge/ml/ml-training-patterns.md +4 -0
  170. package/content/knowledge/mobile-app/mobile-app-architecture.md +6 -0
  171. package/content/knowledge/mobile-app/mobile-app-conventions.md +6 -0
  172. package/content/knowledge/mobile-app/mobile-app-deployment.md +6 -0
  173. package/content/knowledge/mobile-app/mobile-app-dev-environment.md +6 -0
  174. package/content/knowledge/mobile-app/mobile-app-distribution.md +6 -0
  175. package/content/knowledge/mobile-app/mobile-app-observability.md +7 -0
  176. package/content/knowledge/mobile-app/mobile-app-offline-patterns.md +7 -0
  177. package/content/knowledge/mobile-app/mobile-app-project-structure.md +6 -0
  178. package/content/knowledge/mobile-app/mobile-app-push-notifications.md +6 -0
  179. package/content/knowledge/mobile-app/mobile-app-requirements.md +7 -0
  180. package/content/knowledge/mobile-app/mobile-app-security.md +8 -0
  181. package/content/knowledge/mobile-app/mobile-app-testing.md +6 -0
  182. package/content/knowledge/product/gap-analysis.md +4 -0
  183. package/content/knowledge/product/ideation-craft.md +4 -0
  184. package/content/knowledge/product/prd-craft.md +4 -0
  185. package/content/knowledge/product/prd-innovation.md +4 -0
  186. package/content/knowledge/product/vision-craft.md +4 -0
  187. package/content/knowledge/product/vision-innovation.md +4 -0
  188. package/content/knowledge/research/research-architecture.md +4 -0
  189. package/content/knowledge/research/research-conventions.md +6 -0
  190. package/content/knowledge/research/research-dev-environment.md +6 -0
  191. package/content/knowledge/research/research-experiment-loop.md +4 -0
  192. package/content/knowledge/research/research-experiment-tracking.md +6 -0
  193. package/content/knowledge/research/research-ml-architecture-search.md +4 -0
  194. package/content/knowledge/research/research-ml-evaluation.md +4 -0
  195. package/content/knowledge/research/research-ml-experiment-tracking.md +6 -0
  196. package/content/knowledge/research/research-ml-training-patterns.md +4 -0
  197. package/content/knowledge/research/research-observability.md +5 -0
  198. package/content/knowledge/research/research-overfitting-prevention.md +5 -0
  199. package/content/knowledge/research/research-project-structure.md +5 -0
  200. package/content/knowledge/research/research-quant-backtesting.md +4 -0
  201. package/content/knowledge/research/research-quant-market-data.md +4 -0
  202. package/content/knowledge/research/research-quant-metrics.md +4 -0
  203. package/content/knowledge/research/research-quant-requirements.md +4 -0
  204. package/content/knowledge/research/research-quant-risk.md +4 -0
  205. package/content/knowledge/research/research-quant-strategy-patterns.md +4 -0
  206. package/content/knowledge/research/research-requirements.md +5 -0
  207. package/content/knowledge/research/research-security.md +5 -0
  208. package/content/knowledge/research/research-sim-compute-management.md +4 -0
  209. package/content/knowledge/research/research-sim-engine-patterns.md +4 -0
  210. package/content/knowledge/research/research-sim-parameter-spaces.md +4 -0
  211. package/content/knowledge/research/research-sim-validation.md +4 -0
  212. package/content/knowledge/research/research-testing.md +5 -0
  213. package/content/knowledge/review/review-adr.md +6 -0
  214. package/content/knowledge/review/review-api-design.md +6 -0
  215. package/content/knowledge/review/review-art-bible.md +4 -0
  216. package/content/knowledge/review/review-database-design.md +5 -0
  217. package/content/knowledge/review/review-domain-modeling.md +5 -0
  218. package/content/knowledge/review/review-game-design.md +4 -0
  219. package/content/knowledge/review/review-game-economy.md +4 -0
  220. package/content/knowledge/review/review-game-ui.md +5 -0
  221. package/content/knowledge/review/review-implementation-tasks.md +5 -0
  222. package/content/knowledge/review/review-methodology.md +4 -0
  223. package/content/knowledge/review/review-netcode.md +4 -0
  224. package/content/knowledge/review/review-operations.md +6 -0
  225. package/content/knowledge/review/review-platform-cert.md +4 -0
  226. package/content/knowledge/review/review-prd.md +4 -0
  227. package/content/knowledge/review/review-security.md +7 -0
  228. package/content/knowledge/review/review-system-architecture.md +6 -0
  229. package/content/knowledge/review/review-testing-strategy.md +6 -0
  230. package/content/knowledge/review/review-user-stories.md +5 -0
  231. package/content/knowledge/review/review-ux-specification.md +6 -0
  232. package/content/knowledge/review/review-vision.md +4 -0
  233. package/content/knowledge/tools/post-implementation-review-methodology.md +4 -0
  234. package/content/knowledge/tools/release-management.md +5 -0
  235. package/content/knowledge/tools/session-analysis.md +4 -0
  236. package/content/knowledge/tools/version-strategy.md +4 -0
  237. package/content/knowledge/validation/critical-path-analysis.md +4 -0
  238. package/content/knowledge/validation/cross-phase-consistency.md +4 -0
  239. package/content/knowledge/validation/decision-completeness.md +5 -0
  240. package/content/knowledge/validation/dependency-validation.md +4 -0
  241. package/content/knowledge/validation/implementability-review.md +4 -0
  242. package/content/knowledge/validation/scope-management.md +4 -0
  243. package/content/knowledge/validation/traceability.md +4 -0
  244. package/content/knowledge/web-app/web-app-api-patterns.md +6 -0
  245. package/content/knowledge/web-app/web-app-architecture.md +6 -0
  246. package/content/knowledge/web-app/web-app-auth-patterns.md +9 -0
  247. package/content/knowledge/web-app/web-app-conventions.md +5 -0
  248. package/content/knowledge/web-app/web-app-data-patterns.md +6 -0
  249. package/content/knowledge/web-app/web-app-deployment-workflow.md +6 -0
  250. package/content/knowledge/web-app/web-app-deployment.md +6 -0
  251. package/content/knowledge/web-app/web-app-design-system.md +6 -0
  252. package/content/knowledge/web-app/web-app-dev-environment.md +6 -0
  253. package/content/knowledge/web-app/web-app-observability.md +6 -0
  254. package/content/knowledge/web-app/web-app-project-structure.md +5 -0
  255. package/content/knowledge/web-app/web-app-rendering-strategies.md +6 -0
  256. package/content/knowledge/web-app/web-app-requirements.md +6 -0
  257. package/content/knowledge/web-app/web-app-security.md +8 -0
  258. package/content/knowledge/web-app/web-app-session-patterns.md +7 -0
  259. package/content/knowledge/web-app/web-app-testing.md +6 -0
  260. package/content/knowledge/web-app/web-app-ux-patterns.md +6 -0
  261. package/content/knowledge/web3/web3-access-control.md +8 -0
  262. package/content/knowledge/web3/web3-architecture.md +7 -0
  263. package/content/knowledge/web3/web3-audit-workflow.md +7 -0
  264. package/content/knowledge/web3/web3-common-vulnerabilities.md +8 -0
  265. package/content/knowledge/web3/web3-conventions.md +6 -0
  266. package/content/knowledge/web3/web3-deployment-and-verification.md +7 -0
  267. package/content/knowledge/web3/web3-dev-environment.md +6 -0
  268. package/content/knowledge/web3/web3-gas-optimization.md +7 -0
  269. package/content/knowledge/web3/web3-oracles-and-external-data.md +7 -0
  270. package/content/knowledge/web3/web3-project-structure.md +6 -0
  271. package/content/knowledge/web3/web3-requirements.md +6 -0
  272. package/content/knowledge/web3/web3-security.md +8 -0
  273. package/content/knowledge/web3/web3-testing.md +6 -0
  274. package/content/knowledge/web3/web3-upgradeability.md +7 -0
  275. package/content/pipeline/build/multi-agent-resume.md +27 -7
  276. package/content/pipeline/build/multi-agent-start.md +35 -7
  277. package/content/pipeline/build/new-enhancement.md +8 -1
  278. package/content/pipeline/build/quick-task.md +9 -0
  279. package/content/pipeline/build/single-agent-resume.md +11 -4
  280. package/content/pipeline/build/single-agent-start.md +13 -4
  281. package/content/pipeline/consolidation/workflow-audit.md +1 -1
  282. package/content/pipeline/environment/git-workflow.md +2 -2
  283. package/content/pipeline/foundation/beads.md +148 -22
  284. package/content/pipeline/foundation/coding-standards.md +1 -1
  285. package/content/tools/knowledge-audit-entry.md +79 -0
  286. package/content/tools/post-implementation-review.md +6 -6
  287. package/content/tools/prompt-pipeline.md +1 -1
  288. package/content/tools/release.md +5 -5
  289. package/content/tools/review-code.md +388 -17
  290. package/content/tools/review-pr.md +381 -21
  291. package/content/tools/version-bump.md +5 -5
  292. package/dist/cli/commands/dashboard.d.ts +1 -1
  293. package/dist/cli/commands/dashboard.d.ts.map +1 -1
  294. package/dist/cli/commands/dashboard.js +10 -10
  295. package/dist/cli/commands/dashboard.js.map +1 -1
  296. package/dist/cli/commands/dashboard.test.js +1 -1
  297. package/dist/cli/commands/dashboard.test.js.map +1 -1
  298. package/dist/cli/commands/guides.d.ts +24 -0
  299. package/dist/cli/commands/guides.d.ts.map +1 -0
  300. package/dist/cli/commands/guides.js +103 -0
  301. package/dist/cli/commands/guides.js.map +1 -0
  302. package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.d.ts +9 -0
  303. package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.d.ts.map +1 -0
  304. package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.js +112 -0
  305. package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.js.map +1 -0
  306. package/dist/cli/commands/knowledge-freshness-audit-apply.d.ts +8 -0
  307. package/dist/cli/commands/knowledge-freshness-audit-apply.d.ts.map +1 -0
  308. package/dist/cli/commands/knowledge-freshness-audit-apply.js +96 -0
  309. package/dist/cli/commands/knowledge-freshness-audit-apply.js.map +1 -0
  310. package/dist/cli/commands/knowledge-freshness-audit-prefilter.d.ts +7 -0
  311. package/dist/cli/commands/knowledge-freshness-audit-prefilter.d.ts.map +1 -0
  312. package/dist/cli/commands/knowledge-freshness-audit-prefilter.js +42 -0
  313. package/dist/cli/commands/knowledge-freshness-audit-prefilter.js.map +1 -0
  314. package/dist/cli/commands/knowledge-freshness-audit-run-entry.d.ts +9 -0
  315. package/dist/cli/commands/knowledge-freshness-audit-run-entry.d.ts.map +1 -0
  316. package/dist/cli/commands/knowledge-freshness-audit-run-entry.js +63 -0
  317. package/dist/cli/commands/knowledge-freshness-audit-run-entry.js.map +1 -0
  318. package/dist/cli/commands/knowledge-freshness-bump-version.d.ts +8 -0
  319. package/dist/cli/commands/knowledge-freshness-bump-version.d.ts.map +1 -0
  320. package/dist/cli/commands/knowledge-freshness-bump-version.js +34 -0
  321. package/dist/cli/commands/knowledge-freshness-bump-version.js.map +1 -0
  322. package/dist/cli/commands/knowledge-freshness-deep-guidance-check.d.ts +7 -0
  323. package/dist/cli/commands/knowledge-freshness-deep-guidance-check.d.ts.map +1 -0
  324. package/dist/cli/commands/knowledge-freshness-deep-guidance-check.js +51 -0
  325. package/dist/cli/commands/knowledge-freshness-deep-guidance-check.js.map +1 -0
  326. package/dist/cli/commands/knowledge-freshness-link-check.d.ts +7 -0
  327. package/dist/cli/commands/knowledge-freshness-link-check.d.ts.map +1 -0
  328. package/dist/cli/commands/knowledge-freshness-link-check.js +57 -0
  329. package/dist/cli/commands/knowledge-freshness-link-check.js.map +1 -0
  330. package/dist/cli/commands/knowledge-freshness-lint-unsourced.d.ts +8 -0
  331. package/dist/cli/commands/knowledge-freshness-lint-unsourced.d.ts.map +1 -0
  332. package/dist/cli/commands/knowledge-freshness-lint-unsourced.js +58 -0
  333. package/dist/cli/commands/knowledge-freshness-lint-unsourced.js.map +1 -0
  334. package/dist/cli/commands/knowledge-freshness.d.ts +4 -0
  335. package/dist/cli/commands/knowledge-freshness.d.ts.map +1 -0
  336. package/dist/cli/commands/knowledge-freshness.js +25 -0
  337. package/dist/cli/commands/knowledge-freshness.js.map +1 -0
  338. package/dist/cli/commands/observe.d.ts +6 -0
  339. package/dist/cli/commands/observe.d.ts.map +1 -1
  340. package/dist/cli/commands/observe.js +22 -1
  341. package/dist/cli/commands/observe.js.map +1 -1
  342. package/dist/cli/commands/observe.test.js +82 -0
  343. package/dist/cli/commands/observe.test.js.map +1 -1
  344. package/dist/cli/commands/validate-knowledge.d.ts +4 -0
  345. package/dist/cli/commands/validate-knowledge.d.ts.map +1 -0
  346. package/dist/cli/commands/validate-knowledge.js +32 -0
  347. package/dist/cli/commands/validate-knowledge.js.map +1 -0
  348. package/dist/cli/index.d.ts.map +1 -1
  349. package/dist/cli/index.js +6 -0
  350. package/dist/cli/index.js.map +1 -1
  351. package/dist/core/adapters/claude-code.d.ts.map +1 -1
  352. package/dist/core/adapters/claude-code.js +6 -3
  353. package/dist/core/adapters/claude-code.js.map +1 -1
  354. package/dist/core/adapters/claude-code.test.js +45 -1
  355. package/dist/core/adapters/claude-code.test.js.map +1 -1
  356. package/dist/core/assembly/engine.d.ts.map +1 -1
  357. package/dist/core/assembly/engine.js +7 -3
  358. package/dist/core/assembly/engine.js.map +1 -1
  359. package/dist/core/assembly/engine.test.js +45 -1
  360. package/dist/core/assembly/engine.test.js.map +1 -1
  361. package/dist/core/assembly/gap-signal-tail.d.ts +18 -0
  362. package/dist/core/assembly/gap-signal-tail.d.ts.map +1 -0
  363. package/dist/core/assembly/gap-signal-tail.js +43 -0
  364. package/dist/core/assembly/gap-signal-tail.js.map +1 -0
  365. package/dist/core/assembly/gap-signal-tail.test.d.ts +2 -0
  366. package/dist/core/assembly/gap-signal-tail.test.d.ts.map +1 -0
  367. package/dist/core/assembly/gap-signal-tail.test.js +49 -0
  368. package/dist/core/assembly/gap-signal-tail.test.js.map +1 -0
  369. package/dist/core/assembly/knowledge-loader.d.ts +11 -0
  370. package/dist/core/assembly/knowledge-loader.d.ts.map +1 -1
  371. package/dist/core/assembly/knowledge-loader.js +54 -1
  372. package/dist/core/assembly/knowledge-loader.js.map +1 -1
  373. package/dist/core/assembly/knowledge-loader.test.js +73 -0
  374. package/dist/core/assembly/knowledge-loader.test.js.map +1 -1
  375. package/dist/guides/build.d.ts +12 -0
  376. package/dist/guides/build.d.ts.map +1 -0
  377. package/dist/guides/build.js +50 -0
  378. package/dist/guides/build.js.map +1 -0
  379. package/dist/guides/build.test.d.ts +2 -0
  380. package/dist/guides/build.test.d.ts.map +1 -0
  381. package/dist/guides/build.test.js +74 -0
  382. package/dist/guides/build.test.js.map +1 -0
  383. package/dist/guides/chrome.d.ts +24 -0
  384. package/dist/guides/chrome.d.ts.map +1 -0
  385. package/dist/guides/chrome.js +118 -0
  386. package/dist/guides/chrome.js.map +1 -0
  387. package/dist/guides/cli-guides.test.d.ts +2 -0
  388. package/dist/guides/cli-guides.test.d.ts.map +1 -0
  389. package/dist/guides/cli-guides.test.js +41 -0
  390. package/dist/guides/cli-guides.test.js.map +1 -0
  391. package/dist/guides/dashboard-theme.css +1073 -0
  392. package/dist/guides/directives-callout.test.d.ts +2 -0
  393. package/dist/guides/directives-callout.test.d.ts.map +1 -0
  394. package/dist/guides/directives-callout.test.js +22 -0
  395. package/dist/guides/directives-callout.test.js.map +1 -0
  396. package/dist/guides/directives-chart.test.d.ts +2 -0
  397. package/dist/guides/directives-chart.test.d.ts.map +1 -0
  398. package/dist/guides/directives-chart.test.js +25 -0
  399. package/dist/guides/directives-chart.test.js.map +1 -0
  400. package/dist/guides/directives-filter-table.test.d.ts +2 -0
  401. package/dist/guides/directives-filter-table.test.d.ts.map +1 -0
  402. package/dist/guides/directives-filter-table.test.js +22 -0
  403. package/dist/guides/directives-filter-table.test.js.map +1 -0
  404. package/dist/guides/directives-sev.test.d.ts +2 -0
  405. package/dist/guides/directives-sev.test.d.ts.map +1 -0
  406. package/dist/guides/directives-sev.test.js +15 -0
  407. package/dist/guides/directives-sev.test.js.map +1 -0
  408. package/dist/guides/directives-tabs.test.d.ts +2 -0
  409. package/dist/guides/directives-tabs.test.d.ts.map +1 -0
  410. package/dist/guides/directives-tabs.test.js +52 -0
  411. package/dist/guides/directives-tabs.test.js.map +1 -0
  412. package/dist/guides/directives.d.ts +7 -0
  413. package/dist/guides/directives.d.ts.map +1 -0
  414. package/dist/guides/directives.js +158 -0
  415. package/dist/guides/directives.js.map +1 -0
  416. package/dist/guides/fs-guides.test.d.ts +2 -0
  417. package/dist/guides/fs-guides.test.d.ts.map +1 -0
  418. package/dist/guides/fs-guides.test.js +14 -0
  419. package/dist/guides/fs-guides.test.js.map +1 -0
  420. package/dist/guides/index-page.d.ts +3 -0
  421. package/dist/guides/index-page.d.ts.map +1 -0
  422. package/dist/guides/index-page.js +14 -0
  423. package/dist/guides/index-page.js.map +1 -0
  424. package/dist/guides/lint.d.ts +6 -0
  425. package/dist/guides/lint.d.ts.map +1 -0
  426. package/dist/guides/lint.js +27 -0
  427. package/dist/guides/lint.js.map +1 -0
  428. package/dist/guides/lint.test.d.ts +2 -0
  429. package/dist/guides/lint.test.d.ts.map +1 -0
  430. package/dist/guides/lint.test.js +24 -0
  431. package/dist/guides/lint.test.js.map +1 -0
  432. package/dist/guides/loader.d.ts +4 -0
  433. package/dist/guides/loader.d.ts.map +1 -0
  434. package/dist/guides/loader.js +63 -0
  435. package/dist/guides/loader.js.map +1 -0
  436. package/dist/guides/loader.test.d.ts +2 -0
  437. package/dist/guides/loader.test.d.ts.map +1 -0
  438. package/dist/guides/loader.test.js +85 -0
  439. package/dist/guides/loader.test.js.map +1 -0
  440. package/dist/guides/mermaid-sanitize.test.d.ts +2 -0
  441. package/dist/guides/mermaid-sanitize.test.d.ts.map +1 -0
  442. package/dist/guides/mermaid-sanitize.test.js +57 -0
  443. package/dist/guides/mermaid-sanitize.test.js.map +1 -0
  444. package/dist/guides/mermaid.d.ts +18 -0
  445. package/dist/guides/mermaid.d.ts.map +1 -0
  446. package/dist/guides/mermaid.js +137 -0
  447. package/dist/guides/mermaid.js.map +1 -0
  448. package/dist/guides/mermaid.test.d.ts +2 -0
  449. package/dist/guides/mermaid.test.d.ts.map +1 -0
  450. package/dist/guides/mermaid.test.js +105 -0
  451. package/dist/guides/mermaid.test.js.map +1 -0
  452. package/dist/guides/render.d.ts +12 -0
  453. package/dist/guides/render.d.ts.map +1 -0
  454. package/dist/guides/render.js +58 -0
  455. package/dist/guides/render.js.map +1 -0
  456. package/dist/guides/render.test.d.ts +2 -0
  457. package/dist/guides/render.test.d.ts.map +1 -0
  458. package/dist/guides/render.test.js +46 -0
  459. package/dist/guides/render.test.js.map +1 -0
  460. package/dist/guides/sanitize.d.ts +3 -0
  461. package/dist/guides/sanitize.d.ts.map +1 -0
  462. package/dist/guides/sanitize.js +76 -0
  463. package/dist/guides/sanitize.js.map +1 -0
  464. package/dist/guides/sanitize.test.d.ts +2 -0
  465. package/dist/guides/sanitize.test.d.ts.map +1 -0
  466. package/dist/guides/sanitize.test.js +45 -0
  467. package/dist/guides/sanitize.test.js.map +1 -0
  468. package/dist/guides/template.d.ts +11 -0
  469. package/dist/guides/template.d.ts.map +1 -0
  470. package/dist/guides/template.js +38 -0
  471. package/dist/guides/template.js.map +1 -0
  472. package/dist/guides/template.test.d.ts +2 -0
  473. package/dist/guides/template.test.d.ts.map +1 -0
  474. package/dist/guides/template.test.js +41 -0
  475. package/dist/guides/template.test.js.map +1 -0
  476. package/dist/guides/types.d.ts +20 -0
  477. package/dist/guides/types.d.ts.map +1 -0
  478. package/dist/guides/types.js +2 -0
  479. package/dist/guides/types.js.map +1 -0
  480. package/dist/knowledge-freshness/audit-apply-pr.d.ts +64 -0
  481. package/dist/knowledge-freshness/audit-apply-pr.d.ts.map +1 -0
  482. package/dist/knowledge-freshness/audit-apply-pr.js +309 -0
  483. package/dist/knowledge-freshness/audit-apply-pr.js.map +1 -0
  484. package/dist/knowledge-freshness/audit-apply-pr.test.d.ts +2 -0
  485. package/dist/knowledge-freshness/audit-apply-pr.test.d.ts.map +1 -0
  486. package/dist/knowledge-freshness/audit-apply-pr.test.js +211 -0
  487. package/dist/knowledge-freshness/audit-apply-pr.test.js.map +1 -0
  488. package/dist/knowledge-freshness/audit-apply.d.ts +16 -0
  489. package/dist/knowledge-freshness/audit-apply.d.ts.map +1 -0
  490. package/dist/knowledge-freshness/audit-apply.js +193 -0
  491. package/dist/knowledge-freshness/audit-apply.js.map +1 -0
  492. package/dist/knowledge-freshness/audit-apply.test.d.ts +2 -0
  493. package/dist/knowledge-freshness/audit-apply.test.d.ts.map +1 -0
  494. package/dist/knowledge-freshness/audit-apply.test.js +482 -0
  495. package/dist/knowledge-freshness/audit-apply.test.js.map +1 -0
  496. package/dist/knowledge-freshness/audit-prefilter.d.ts +12 -0
  497. package/dist/knowledge-freshness/audit-prefilter.d.ts.map +1 -0
  498. package/dist/knowledge-freshness/audit-prefilter.js +74 -0
  499. package/dist/knowledge-freshness/audit-prefilter.js.map +1 -0
  500. package/dist/knowledge-freshness/audit-prefilter.test.d.ts +2 -0
  501. package/dist/knowledge-freshness/audit-prefilter.test.d.ts.map +1 -0
  502. package/dist/knowledge-freshness/audit-prefilter.test.js +78 -0
  503. package/dist/knowledge-freshness/audit-prefilter.test.js.map +1 -0
  504. package/dist/knowledge-freshness/audit-runner.d.ts +135 -0
  505. package/dist/knowledge-freshness/audit-runner.d.ts.map +1 -0
  506. package/dist/knowledge-freshness/audit-runner.js +168 -0
  507. package/dist/knowledge-freshness/audit-runner.js.map +1 -0
  508. package/dist/knowledge-freshness/audit-runner.test.d.ts +2 -0
  509. package/dist/knowledge-freshness/audit-runner.test.d.ts.map +1 -0
  510. package/dist/knowledge-freshness/audit-runner.test.js +130 -0
  511. package/dist/knowledge-freshness/audit-runner.test.js.map +1 -0
  512. package/dist/knowledge-freshness/bump-version.d.ts +24 -0
  513. package/dist/knowledge-freshness/bump-version.d.ts.map +1 -0
  514. package/dist/knowledge-freshness/bump-version.js +69 -0
  515. package/dist/knowledge-freshness/bump-version.js.map +1 -0
  516. package/dist/knowledge-freshness/bump-version.test.d.ts +2 -0
  517. package/dist/knowledge-freshness/bump-version.test.d.ts.map +1 -0
  518. package/dist/knowledge-freshness/bump-version.test.js +82 -0
  519. package/dist/knowledge-freshness/bump-version.test.js.map +1 -0
  520. package/dist/knowledge-freshness/gates/anti-over-rewrite.d.ts +86 -0
  521. package/dist/knowledge-freshness/gates/anti-over-rewrite.d.ts.map +1 -0
  522. package/dist/knowledge-freshness/gates/anti-over-rewrite.js +210 -0
  523. package/dist/knowledge-freshness/gates/anti-over-rewrite.js.map +1 -0
  524. package/dist/knowledge-freshness/gates/anti-over-rewrite.test.d.ts +2 -0
  525. package/dist/knowledge-freshness/gates/anti-over-rewrite.test.d.ts.map +1 -0
  526. package/dist/knowledge-freshness/gates/anti-over-rewrite.test.js +115 -0
  527. package/dist/knowledge-freshness/gates/anti-over-rewrite.test.js.map +1 -0
  528. package/dist/knowledge-freshness/gates/changed-files.d.ts +53 -0
  529. package/dist/knowledge-freshness/gates/changed-files.d.ts.map +1 -0
  530. package/dist/knowledge-freshness/gates/changed-files.js +128 -0
  531. package/dist/knowledge-freshness/gates/changed-files.js.map +1 -0
  532. package/dist/knowledge-freshness/gates/deep-guidance-check.d.ts +23 -0
  533. package/dist/knowledge-freshness/gates/deep-guidance-check.d.ts.map +1 -0
  534. package/dist/knowledge-freshness/gates/deep-guidance-check.js +27 -0
  535. package/dist/knowledge-freshness/gates/deep-guidance-check.js.map +1 -0
  536. package/dist/knowledge-freshness/gates/deep-guidance-check.test.d.ts +2 -0
  537. package/dist/knowledge-freshness/gates/deep-guidance-check.test.d.ts.map +1 -0
  538. package/dist/knowledge-freshness/gates/deep-guidance-check.test.js +23 -0
  539. package/dist/knowledge-freshness/gates/deep-guidance-check.test.js.map +1 -0
  540. package/dist/knowledge-freshness/gates/link-check.d.ts +55 -0
  541. package/dist/knowledge-freshness/gates/link-check.d.ts.map +1 -0
  542. package/dist/knowledge-freshness/gates/link-check.js +161 -0
  543. package/dist/knowledge-freshness/gates/link-check.js.map +1 -0
  544. package/dist/knowledge-freshness/gates/link-check.test.d.ts +2 -0
  545. package/dist/knowledge-freshness/gates/link-check.test.d.ts.map +1 -0
  546. package/dist/knowledge-freshness/gates/link-check.test.js +76 -0
  547. package/dist/knowledge-freshness/gates/link-check.test.js.map +1 -0
  548. package/dist/knowledge-freshness/gates/lint-unsourced.d.ts +40 -0
  549. package/dist/knowledge-freshness/gates/lint-unsourced.d.ts.map +1 -0
  550. package/dist/knowledge-freshness/gates/lint-unsourced.js +143 -0
  551. package/dist/knowledge-freshness/gates/lint-unsourced.js.map +1 -0
  552. package/dist/knowledge-freshness/gates/lint-unsourced.test.d.ts +2 -0
  553. package/dist/knowledge-freshness/gates/lint-unsourced.test.d.ts.map +1 -0
  554. package/dist/knowledge-freshness/gates/lint-unsourced.test.js +68 -0
  555. package/dist/knowledge-freshness/gates/lint-unsourced.test.js.map +1 -0
  556. package/dist/knowledge-freshness/gates/parse-entry.d.ts +25 -0
  557. package/dist/knowledge-freshness/gates/parse-entry.d.ts.map +1 -0
  558. package/dist/knowledge-freshness/gates/parse-entry.js +41 -0
  559. package/dist/knowledge-freshness/gates/parse-entry.js.map +1 -0
  560. package/dist/knowledge-freshness/gates/parse-entry.test.d.ts +2 -0
  561. package/dist/knowledge-freshness/gates/parse-entry.test.d.ts.map +1 -0
  562. package/dist/knowledge-freshness/gates/parse-entry.test.js +34 -0
  563. package/dist/knowledge-freshness/gates/parse-entry.test.js.map +1 -0
  564. package/dist/knowledge-freshness/providers/anthropic.d.ts +33 -0
  565. package/dist/knowledge-freshness/providers/anthropic.d.ts.map +1 -0
  566. package/dist/knowledge-freshness/providers/anthropic.js +36 -0
  567. package/dist/knowledge-freshness/providers/anthropic.js.map +1 -0
  568. package/dist/knowledge-freshness/providers/anthropic.test.d.ts +2 -0
  569. package/dist/knowledge-freshness/providers/anthropic.test.d.ts.map +1 -0
  570. package/dist/knowledge-freshness/providers/anthropic.test.js +32 -0
  571. package/dist/knowledge-freshness/providers/anthropic.test.js.map +1 -0
  572. package/dist/knowledge-freshness/providers/deepseek.d.ts +33 -0
  573. package/dist/knowledge-freshness/providers/deepseek.d.ts.map +1 -0
  574. package/dist/knowledge-freshness/providers/deepseek.js +157 -0
  575. package/dist/knowledge-freshness/providers/deepseek.js.map +1 -0
  576. package/dist/knowledge-freshness/providers/deepseek.test.d.ts +2 -0
  577. package/dist/knowledge-freshness/providers/deepseek.test.d.ts.map +1 -0
  578. package/dist/knowledge-freshness/providers/deepseek.test.js +142 -0
  579. package/dist/knowledge-freshness/providers/deepseek.test.js.map +1 -0
  580. package/dist/knowledge-freshness/providers/index.d.ts +41 -0
  581. package/dist/knowledge-freshness/providers/index.d.ts.map +1 -0
  582. package/dist/knowledge-freshness/providers/index.js +108 -0
  583. package/dist/knowledge-freshness/providers/index.js.map +1 -0
  584. package/dist/knowledge-freshness/providers/index.test.d.ts +2 -0
  585. package/dist/knowledge-freshness/providers/index.test.d.ts.map +1 -0
  586. package/dist/knowledge-freshness/providers/index.test.js +97 -0
  587. package/dist/knowledge-freshness/providers/index.test.js.map +1 -0
  588. package/dist/knowledge-freshness/source-hash.d.ts +39 -0
  589. package/dist/knowledge-freshness/source-hash.d.ts.map +1 -0
  590. package/dist/knowledge-freshness/source-hash.js +180 -0
  591. package/dist/knowledge-freshness/source-hash.js.map +1 -0
  592. package/dist/knowledge-freshness/source-hash.test.d.ts +2 -0
  593. package/dist/knowledge-freshness/source-hash.test.d.ts.map +1 -0
  594. package/dist/knowledge-freshness/source-hash.test.js +63 -0
  595. package/dist/knowledge-freshness/source-hash.test.js.map +1 -0
  596. package/dist/knowledge-freshness/source-url-validator.d.ts +57 -0
  597. package/dist/knowledge-freshness/source-url-validator.d.ts.map +1 -0
  598. package/dist/knowledge-freshness/source-url-validator.js +304 -0
  599. package/dist/knowledge-freshness/source-url-validator.js.map +1 -0
  600. package/dist/knowledge-freshness/source-url-validator.test.d.ts +2 -0
  601. package/dist/knowledge-freshness/source-url-validator.test.d.ts.map +1 -0
  602. package/dist/knowledge-freshness/source-url-validator.test.js +167 -0
  603. package/dist/knowledge-freshness/source-url-validator.test.js.map +1 -0
  604. package/dist/observability/adapters/beads.d.ts +4 -0
  605. package/dist/observability/adapters/beads.d.ts.map +1 -1
  606. package/dist/observability/adapters/beads.js +25 -2
  607. package/dist/observability/adapters/beads.js.map +1 -1
  608. package/dist/observability/adapters/beads.test.js +40 -2
  609. package/dist/observability/adapters/beads.test.js.map +1 -1
  610. package/dist/observability/checks/lens-i-knowledge-gaps.d.ts +3 -0
  611. package/dist/observability/checks/lens-i-knowledge-gaps.d.ts.map +1 -0
  612. package/dist/observability/checks/lens-i-knowledge-gaps.js +165 -0
  613. package/dist/observability/checks/lens-i-knowledge-gaps.js.map +1 -0
  614. package/dist/observability/checks/lens-i-knowledge-gaps.test.d.ts +2 -0
  615. package/dist/observability/checks/lens-i-knowledge-gaps.test.d.ts.map +1 -0
  616. package/dist/observability/checks/lens-i-knowledge-gaps.test.js +421 -0
  617. package/dist/observability/checks/lens-i-knowledge-gaps.test.js.map +1 -0
  618. package/dist/observability/checks/lens-i-lessons-scanner.d.ts +16 -0
  619. package/dist/observability/checks/lens-i-lessons-scanner.d.ts.map +1 -0
  620. package/dist/observability/checks/lens-i-lessons-scanner.js +106 -0
  621. package/dist/observability/checks/lens-i-lessons-scanner.js.map +1 -0
  622. package/dist/observability/checks/lens-i-lessons-scanner.test.d.ts +2 -0
  623. package/dist/observability/checks/lens-i-lessons-scanner.test.d.ts.map +1 -0
  624. package/dist/observability/checks/lens-i-lessons-scanner.test.js +174 -0
  625. package/dist/observability/checks/lens-i-lessons-scanner.test.js.map +1 -0
  626. package/dist/observability/engine/api.d.ts +4 -0
  627. package/dist/observability/engine/api.d.ts.map +1 -1
  628. package/dist/observability/engine/api.js +17 -1
  629. package/dist/observability/engine/api.js.map +1 -1
  630. package/dist/observability/engine/checks/observability-config.d.ts +4 -0
  631. package/dist/observability/engine/checks/observability-config.d.ts.map +1 -1
  632. package/dist/observability/engine/checks/observability-config.js +1 -0
  633. package/dist/observability/engine/checks/observability-config.js.map +1 -1
  634. package/dist/observability/engine/checks/registry.d.ts.map +1 -1
  635. package/dist/observability/engine/checks/registry.js +7 -0
  636. package/dist/observability/engine/checks/registry.js.map +1 -1
  637. package/dist/observability/engine/checks/registry.test.js +3 -2
  638. package/dist/observability/engine/checks/registry.test.js.map +1 -1
  639. package/dist/observability/engine/checks/runner.d.ts +30 -0
  640. package/dist/observability/engine/checks/runner.d.ts.map +1 -1
  641. package/dist/observability/engine/checks/runner.js +8 -1
  642. package/dist/observability/engine/checks/runner.js.map +1 -1
  643. package/dist/observability/engine/checks/runner.test.js +74 -0
  644. package/dist/observability/engine/checks/runner.test.js.map +1 -1
  645. package/dist/observability/engine/event-schemas.d.ts.map +1 -1
  646. package/dist/observability/engine/event-schemas.js +41 -3
  647. package/dist/observability/engine/event-schemas.js.map +1 -1
  648. package/dist/observability/engine/event-schemas.test.js +105 -0
  649. package/dist/observability/engine/event-schemas.test.js.map +1 -1
  650. package/dist/observability/engine/fix-flow.d.ts +7 -0
  651. package/dist/observability/engine/fix-flow.d.ts.map +1 -1
  652. package/dist/observability/engine/fix-flow.js +5 -3
  653. package/dist/observability/engine/fix-flow.js.map +1 -1
  654. package/dist/observability/engine/knowledge-root-integration.test.d.ts +2 -0
  655. package/dist/observability/engine/knowledge-root-integration.test.d.ts.map +1 -0
  656. package/dist/observability/engine/knowledge-root-integration.test.js +103 -0
  657. package/dist/observability/engine/knowledge-root-integration.test.js.map +1 -0
  658. package/dist/observability/engine/ledger-writer.d.ts +11 -1
  659. package/dist/observability/engine/ledger-writer.d.ts.map +1 -1
  660. package/dist/observability/engine/ledger-writer.js +6 -0
  661. package/dist/observability/engine/ledger-writer.js.map +1 -1
  662. package/dist/observability/engine/llm-dispatcher.d.ts.map +1 -1
  663. package/dist/observability/engine/llm-dispatcher.js +36 -5
  664. package/dist/observability/engine/llm-dispatcher.js.map +1 -1
  665. package/dist/observability/engine/llm-dispatcher.test.js +23 -0
  666. package/dist/observability/engine/llm-dispatcher.test.js.map +1 -1
  667. package/dist/observability/engine/types.d.ts +20 -1
  668. package/dist/observability/engine/types.d.ts.map +1 -1
  669. package/dist/observability/engine/types.test.js +1 -1
  670. package/dist/observability/engine/types.test.js.map +1 -1
  671. package/dist/observability/knowledge-index.d.ts +145 -0
  672. package/dist/observability/knowledge-index.d.ts.map +1 -0
  673. package/dist/observability/knowledge-index.js +353 -0
  674. package/dist/observability/knowledge-index.js.map +1 -0
  675. package/dist/observability/knowledge-index.test.d.ts +2 -0
  676. package/dist/observability/knowledge-index.test.d.ts.map +1 -0
  677. package/dist/observability/knowledge-index.test.js +364 -0
  678. package/dist/observability/knowledge-index.test.js.map +1 -0
  679. package/dist/observability/renderers/markdown.d.ts.map +1 -1
  680. package/dist/observability/renderers/markdown.js +14 -0
  681. package/dist/observability/renderers/markdown.js.map +1 -1
  682. package/dist/observability/renderers/markdown.test.js +30 -0
  683. package/dist/observability/renderers/markdown.test.js.map +1 -1
  684. package/dist/types/assembly.d.ts +10 -0
  685. package/dist/types/assembly.d.ts.map +1 -1
  686. package/dist/utils/fs.d.ts +6 -0
  687. package/dist/utils/fs.d.ts.map +1 -1
  688. package/dist/utils/fs.js +13 -0
  689. package/dist/utils/fs.js.map +1 -1
  690. package/dist/validation/knowledge-frontmatter-validator.d.ts +15 -0
  691. package/dist/validation/knowledge-frontmatter-validator.d.ts.map +1 -0
  692. package/dist/validation/knowledge-frontmatter-validator.js +131 -0
  693. package/dist/validation/knowledge-frontmatter-validator.js.map +1 -0
  694. package/dist/validation/knowledge-frontmatter-validator.test.d.ts +2 -0
  695. package/dist/validation/knowledge-frontmatter-validator.test.d.ts.map +1 -0
  696. package/dist/validation/knowledge-frontmatter-validator.test.js +66 -0
  697. package/dist/validation/knowledge-frontmatter-validator.test.js.map +1 -0
  698. package/package.json +13 -4
@@ -0,0 +1,69 @@
1
+ // Knowledge-base VERSION bump logic.
2
+ //
3
+ // Pure functions only — no I/O, no git, no GH. The workflow in
4
+ // .github/workflows/knowledge-freshness-version-bump.yml reads
5
+ // content/knowledge/VERSION, calls `deriveBumpKind` from the PR title/body,
6
+ // calls `bumpSemver` to compute the next version, and writes it back.
7
+ //
8
+ // We intentionally do not depend on a SemVer library — the bump rules here
9
+ // are a tiny subset (major/minor/patch on `X.Y.Z` with no prerelease tags).
10
+ /**
11
+ * Derive the bump kind from a Conventional Commits-flavored PR title and body.
12
+ *
13
+ * Rules (first match wins):
14
+ * 1. `BREAKING CHANGE:` token anywhere in title or body → major
15
+ * 2. `feat(knowledge):` or `feat(knowledge-freshness):` title prefix → minor
16
+ * 3. `chore(knowledge):` or `chore(knowledge-freshness):` title prefix → patch
17
+ * 4. Anything else → patch (the workflow logs a `::notice::` for this case)
18
+ *
19
+ * Title matching is case-sensitive against the literal prefix (Conventional
20
+ * Commits canonicalizes to lowercase). The BREAKING CHANGE token is matched
21
+ * case-sensitively as well — that's the canonical form.
22
+ */
23
+ export function deriveBumpKind(prTitle, prBody) {
24
+ // BREAKING CHANGE wins over everything else, even if title is `feat(...)`.
25
+ //
26
+ // Round-2 F-002: the body match MUST be anchored to start-of-line. A
27
+ // freshness PR's body contains an LLM-generated findings table where an
28
+ // evidence URL or excerpt that happens to mention "BREAKING CHANGE:"
29
+ // would otherwise trigger an accidental major bump. The canonical
30
+ // Conventional Commits "BREAKING CHANGE:" footer lives on its own line.
31
+ const breakingInBody = /^BREAKING CHANGE:/m.test(prBody);
32
+ if (prTitle.includes('BREAKING CHANGE:') || breakingInBody) {
33
+ return 'major';
34
+ }
35
+ if (prTitle.startsWith('feat(knowledge):') || prTitle.startsWith('feat(knowledge-freshness):')) {
36
+ return 'minor';
37
+ }
38
+ if (prTitle.startsWith('chore(knowledge):') || prTitle.startsWith('chore(knowledge-freshness):')) {
39
+ return 'patch';
40
+ }
41
+ return 'patch';
42
+ }
43
+ /**
44
+ * Bump a `X.Y.Z` SemVer string by the given kind. Throws on invalid input.
45
+ *
46
+ * - `major`: `X.Y.Z` → `(X+1).0.0`
47
+ * - `minor`: `X.Y.Z` → `X.(Y+1).0`
48
+ * - `patch`: `X.Y.Z` → `X.Y.(Z+1)`
49
+ */
50
+ export function bumpSemver(current, kind) {
51
+ // Trim because VERSION files routinely have a trailing newline.
52
+ const trimmed = current.trim();
53
+ const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(trimmed);
54
+ if (!match) {
55
+ throw new Error(`bumpSemver: invalid SemVer "${current}" (expected X.Y.Z)`);
56
+ }
57
+ const major = Number(match[1]);
58
+ const minor = Number(match[2]);
59
+ const patch = Number(match[3]);
60
+ switch (kind) {
61
+ case 'major':
62
+ return `${major + 1}.0.0`;
63
+ case 'minor':
64
+ return `${major}.${minor + 1}.0`;
65
+ case 'patch':
66
+ return `${major}.${minor}.${patch + 1}`;
67
+ }
68
+ }
69
+ //# sourceMappingURL=bump-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bump-version.js","sourceRoot":"","sources":["../../src/knowledge-freshness/bump-version.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,EAAE;AACF,+DAA+D;AAC/D,+DAA+D;AAC/D,4EAA4E;AAC5E,sEAAsE;AACtE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAI5E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,MAAc;IAC5D,2EAA2E;IAC3E,EAAE;IACF,qEAAqE;IACrE,wEAAwE;IACxE,qEAAqE;IACrE,kEAAkE;IAClE,wEAAwE;IACxE,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,cAAc,EAAE,CAAC;QAC3D,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC;QAC/F,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,6BAA6B,CAAC,EAAE,CAAC;QACjG,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,IAAc;IACxD,gEAAgE;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,oBAAoB,CAAC,CAAA;IAC7E,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,QAAQ,IAAI,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,GAAG,KAAK,GAAG,CAAC,MAAM,CAAA;QAC3B,KAAK,OAAO;YACV,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,CAAA;QAClC,KAAK,OAAO;YACV,OAAO,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAA;IACzC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bump-version.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bump-version.test.d.ts","sourceRoot":"","sources":["../../src/knowledge-freshness/bump-version.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { deriveBumpKind, bumpSemver } from './bump-version.js';
3
+ describe('deriveBumpKind', () => {
4
+ it('returns major when BREAKING CHANGE appears in title', () => {
5
+ expect(deriveBumpKind('feat(knowledge): rework API BREAKING CHANGE: drops X', '')).toBe('major');
6
+ });
7
+ it('returns major when BREAKING CHANGE appears at the start of a body line', () => {
8
+ expect(deriveBumpKind('feat(knowledge): new entry', 'Body line\nBREAKING CHANGE: removes Y')).toBe('major');
9
+ });
10
+ it('does NOT return major when BREAKING CHANGE appears mid-line (round-2 F-002)', () => {
11
+ // A freshness PR body's findings table can quote evidence containing the
12
+ // string "BREAKING CHANGE:" inside a cell. That must NOT trigger major.
13
+ const body = '| P1 | citation: "see the BREAKING CHANGE: removed-deprecated section above" |';
14
+ expect(deriveBumpKind('chore(knowledge): refresh X', body)).toBe('patch');
15
+ });
16
+ it('does NOT return major when BREAKING CHANGE is preceded by whitespace or > (quoted)', () => {
17
+ expect(deriveBumpKind('chore(knowledge): X', '> BREAKING CHANGE: from external doc')).toBe('patch');
18
+ expect(deriveBumpKind('chore(knowledge): X', ' BREAKING CHANGE: indented')).toBe('patch');
19
+ });
20
+ it('returns minor for feat(knowledge): prefix', () => {
21
+ expect(deriveBumpKind('feat(knowledge): add new entry for Z', '')).toBe('minor');
22
+ });
23
+ it('returns minor for feat(knowledge-freshness): prefix', () => {
24
+ expect(deriveBumpKind('feat(knowledge-freshness): new workflow', '')).toBe('minor');
25
+ });
26
+ it('returns patch for chore(knowledge): prefix', () => {
27
+ expect(deriveBumpKind('chore(knowledge): refresh React entry against v19', '')).toBe('patch');
28
+ });
29
+ it('returns patch for chore(knowledge-freshness): prefix', () => {
30
+ expect(deriveBumpKind('chore(knowledge-freshness): tweak cadence', '')).toBe('patch');
31
+ });
32
+ it('defaults to patch for unrecognized prefixes', () => {
33
+ expect(deriveBumpKind('docs: tweak README', '')).toBe('patch');
34
+ expect(deriveBumpKind('fix: nit', '')).toBe('patch');
35
+ expect(deriveBumpKind('', '')).toBe('patch');
36
+ });
37
+ });
38
+ describe('bumpSemver', () => {
39
+ it('bumps patch', () => {
40
+ expect(bumpSemver('0.1.0', 'patch')).toBe('0.1.1');
41
+ expect(bumpSemver('1.2.3', 'patch')).toBe('1.2.4');
42
+ });
43
+ it('bumps minor and resets patch', () => {
44
+ expect(bumpSemver('0.1.5', 'minor')).toBe('0.2.0');
45
+ expect(bumpSemver('1.2.3', 'minor')).toBe('1.3.0');
46
+ });
47
+ it('bumps major and resets minor and patch', () => {
48
+ expect(bumpSemver('0.1.5', 'major')).toBe('1.0.0');
49
+ expect(bumpSemver('2.4.7', 'major')).toBe('3.0.0');
50
+ });
51
+ it('tolerates trailing newline / whitespace from a VERSION file', () => {
52
+ expect(bumpSemver('0.1.0\n', 'patch')).toBe('0.1.1');
53
+ expect(bumpSemver(' 1.0.0 ', 'minor')).toBe('1.1.0');
54
+ });
55
+ it('throws on invalid SemVer input', () => {
56
+ expect(() => bumpSemver('1.0', 'patch')).toThrow(/invalid SemVer/);
57
+ expect(() => bumpSemver('1.0.0-beta', 'patch')).toThrow(/invalid SemVer/);
58
+ expect(() => bumpSemver('vNotASemver', 'patch')).toThrow(/invalid SemVer/);
59
+ expect(() => bumpSemver('', 'patch')).toThrow(/invalid SemVer/);
60
+ });
61
+ });
62
+ describe('end-to-end fixture: simulated merged PR title → version diff', () => {
63
+ it('chore(knowledge) PR bumps patch', () => {
64
+ const title = 'chore(knowledge): refresh React entry against v19';
65
+ const body = '';
66
+ const kind = deriveBumpKind(title, body);
67
+ expect(bumpSemver('0.1.0', kind)).toBe('0.1.1');
68
+ });
69
+ it('feat(knowledge-freshness) PR bumps minor', () => {
70
+ const title = 'feat(knowledge-freshness): add Postgres entry';
71
+ const body = 'New entry';
72
+ const kind = deriveBumpKind(title, body);
73
+ expect(bumpSemver('0.1.0', kind)).toBe('0.2.0');
74
+ });
75
+ it('BREAKING CHANGE PR bumps major', () => {
76
+ const title = 'feat(knowledge): drop deprecated entries';
77
+ const body = 'Cleanup.\n\nBREAKING CHANGE: removes 5 entries';
78
+ const kind = deriveBumpKind(title, body);
79
+ expect(bumpSemver('0.1.0', kind)).toBe('1.0.0');
80
+ });
81
+ });
82
+ //# sourceMappingURL=bump-version.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bump-version.test.js","sourceRoot":"","sources":["../../src/knowledge-freshness/bump-version.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ export interface ChurnInput {
2
+ file: string;
3
+ /** Raw post-change file contents (used to read volatility + total lines). */
4
+ content: string;
5
+ /** Added lines from the diff for this file (entire file). */
6
+ addedCount: number;
7
+ /** Removed lines from the diff for this file (entire file). */
8
+ removedCount: number;
9
+ /** Added lines from the diff that are in the BODY (post-frontmatter) region. */
10
+ bodyAddedCount?: number;
11
+ /** Removed lines from the diff that are in the BODY (post-frontmatter) region. */
12
+ bodyRemovedCount?: number;
13
+ }
14
+ export interface ChurnFinding {
15
+ file: string;
16
+ volatility: 'stable' | 'evolving' | 'fast-moving' | null;
17
+ totalLines: number;
18
+ addedCount: number;
19
+ removedCount: number;
20
+ churnPct: number;
21
+ /** True if this counts as a blocking failure (stable + over-threshold + no override). */
22
+ blocking: boolean;
23
+ /** True if the PR body contained the override marker. */
24
+ overridden: boolean;
25
+ }
26
+ export interface ChurnOptions {
27
+ /**
28
+ * Labels currently applied to the PR. The gate honors the literal label
29
+ * `override:anti-over-rewrite` (F-005). PR-body markers are explicitly
30
+ * NOT honored because the bot can write the body but cannot apply labels.
31
+ */
32
+ prLabels?: string[];
33
+ }
34
+ export declare function evaluateChurn(inputs: ChurnInput[], opts?: ChurnOptions): ChurnFinding[];
35
+ /**
36
+ * Parse a unified diff into per-file add/remove counts. Mirrors
37
+ * `lint-unsourced.parseUnifiedDiff` in scope (knowledge entries only) so the
38
+ * two gates pull the same set of files from the same diff input.
39
+ */
40
+ export interface ChurnDiffResult {
41
+ file: string;
42
+ addedCount: number;
43
+ removedCount: number;
44
+ bodyAddedCount: number;
45
+ bodyRemovedCount: number;
46
+ }
47
+ /**
48
+ * Parse a unified diff into per-file add/remove counts. Returns raw counts;
49
+ * body-only counts are derived later by `splitChurnByRegion` because they
50
+ * require access to the post-change file content (to know where the
51
+ * frontmatter ends).
52
+ *
53
+ * Round-7 F-001 replaces the round-6 state-machine approach (which
54
+ * incorrectly flipped on the FIRST `---` line — i.e., the opening
55
+ * boundary — instead of the second / closing one, miscounting most
56
+ * frontmatter as body churn). The line-number-based filter in
57
+ * splitChurnByRegion is more robust because it relies on the actual
58
+ * file content, not on diff-content patterns.
59
+ */
60
+ export declare function parseUnifiedDiffForChurn(diff: string): ChurnDiffResult[];
61
+ /**
62
+ * Per-file content pair used by `splitChurnByRegion` to derive separate
63
+ * frontmatter boundaries for added (new file) and removed (old file)
64
+ * sides of the diff. Round-8 F-003 introduced the asymmetry: when
65
+ * audit-apply ADDS frontmatter fields (hash / retrieved on first audit),
66
+ * the new frontmatter is taller than the old, so using the new boundary
67
+ * for `-` lines mis-classifies the first body lines as frontmatter and
68
+ * under-counts removal churn.
69
+ */
70
+ export interface ChurnFileContent {
71
+ /** Post-change file content (the head / working-tree version). */
72
+ newContent: string;
73
+ /** Pre-change file content (the base / origin/main version). Optional. */
74
+ oldContent?: string;
75
+ }
76
+ /**
77
+ * Given the raw diff and per-file pre/post-change content, return body-only
78
+ * add/remove counts. An added line is "body" iff its new-file line number
79
+ * is past the NEW frontmatter end; a removed line is "body" iff its
80
+ * old-file line number is past the OLD frontmatter end.
81
+ */
82
+ export declare function splitChurnByRegion(diff: string, fileContents: Map<string, ChurnFileContent | string>): Map<string, {
83
+ bodyAddedCount: number;
84
+ bodyRemovedCount: number;
85
+ }>;
86
+ //# sourceMappingURL=anti-over-rewrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-over-rewrite.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/anti-over-rewrite.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAA;IACpB,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,IAAI,CAAA;IACxD,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,yFAAyF;IACzF,QAAQ,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,YAAY,EAAE,CAqC3F;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAoBxE;AA2CD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,GACnD,GAAG,CAAC,MAAM,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAiDnE"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Anti-over-rewrite gate (spec §A.5): for `volatility: stable` entries, fail
3
+ * if the diff's add+remove line count exceeds 20% of the entry's total line
4
+ * count. For `evolving` and `fast-moving` entries we still compute the churn
5
+ * percentage and surface it as a notice, but never fail.
6
+ *
7
+ * The override is a maintainer-applied PR label `override:anti-over-rewrite`
8
+ * — NOT a PR-body marker. F-005 (round-1 Phase 2 MMR review): a marker in
9
+ * the PR body could be prompt-injected via LLM-generated verdict text from
10
+ * a malicious source. Labels are applied by GitHub users with write access,
11
+ * so they're trustworthy.
12
+ */
13
+ import { parseEntry } from './parse-entry.js';
14
+ const STABLE_THRESHOLD = 0.20;
15
+ const OVERRIDE_LABEL = 'override:anti-over-rewrite';
16
+ export function evaluateChurn(inputs, opts = {}) {
17
+ const overridden = Array.isArray(opts.prLabels) && opts.prLabels.includes(OVERRIDE_LABEL);
18
+ const out = [];
19
+ for (const input of inputs) {
20
+ let volatility = null;
21
+ let bodyLines = input.content.split('\n').length;
22
+ try {
23
+ const parsed = parseEntry(input.content);
24
+ volatility = parsed.volatility;
25
+ bodyLines = parsed.body.split('\n').length;
26
+ }
27
+ catch { /* missing FM → null volatility; bodyLines stays as full file */ }
28
+ // Round-6 F-002: the 20% threshold applies to BODY churn only. A
29
+ // `current` verdict refreshes 3 frontmatter fields (~6 lines of diff)
30
+ // and touches no body — without excluding frontmatter changes, a
31
+ // stable entry under ~30 lines would trip the threshold on every
32
+ // metadata-only refresh PR. The diff parser exposes bodyAdded/Removed
33
+ // alongside the total counts so we can compute the right denominator
34
+ // and numerator here.
35
+ const bodyAdded = input.bodyAddedCount ?? input.addedCount;
36
+ const bodyRemoved = input.bodyRemovedCount ?? input.removedCount;
37
+ const totalLines = input.content.split('\n').length;
38
+ const totalBodyChurn = bodyAdded + bodyRemoved;
39
+ const churnPct = bodyLines > 0 ? totalBodyChurn / bodyLines : 0;
40
+ const overThreshold = churnPct > STABLE_THRESHOLD;
41
+ const blocking = volatility === 'stable' && overThreshold && !overridden;
42
+ out.push({
43
+ file: input.file,
44
+ volatility,
45
+ totalLines,
46
+ addedCount: input.addedCount,
47
+ removedCount: input.removedCount,
48
+ churnPct,
49
+ blocking,
50
+ overridden: overridden && volatility === 'stable' && overThreshold,
51
+ });
52
+ }
53
+ return out;
54
+ }
55
+ /**
56
+ * Parse a unified diff into per-file add/remove counts. Returns raw counts;
57
+ * body-only counts are derived later by `splitChurnByRegion` because they
58
+ * require access to the post-change file content (to know where the
59
+ * frontmatter ends).
60
+ *
61
+ * Round-7 F-001 replaces the round-6 state-machine approach (which
62
+ * incorrectly flipped on the FIRST `---` line — i.e., the opening
63
+ * boundary — instead of the second / closing one, miscounting most
64
+ * frontmatter as body churn). The line-number-based filter in
65
+ * splitChurnByRegion is more robust because it relies on the actual
66
+ * file content, not on diff-content patterns.
67
+ */
68
+ export function parseUnifiedDiffForChurn(diff) {
69
+ const perFileHunks = parseHunks(diff);
70
+ const out = [];
71
+ for (const [file, hunks] of perFileHunks) {
72
+ let added = 0, removed = 0;
73
+ for (const h of hunks) {
74
+ for (const line of h.lines) {
75
+ if (line.startsWith('+') && !line.startsWith('+++'))
76
+ added++;
77
+ else if (line.startsWith('-') && !line.startsWith('---'))
78
+ removed++;
79
+ }
80
+ }
81
+ out.push({
82
+ file,
83
+ addedCount: added, removedCount: removed,
84
+ // bodyAdded/Removed left at zero here; the caller calls
85
+ // splitChurnByRegion() with the new-file content to fill them in.
86
+ bodyAddedCount: 0, bodyRemovedCount: 0,
87
+ });
88
+ }
89
+ return out;
90
+ }
91
+ function parseHunks(diff) {
92
+ const out = new Map();
93
+ const lines = diff.split('\n');
94
+ let i = 0;
95
+ let currentFile = null;
96
+ let currentHunks = [];
97
+ while (i < lines.length) {
98
+ const line = lines[i];
99
+ if (line.startsWith('diff --git ')) {
100
+ if (currentFile)
101
+ out.set(currentFile, currentHunks);
102
+ const m = line.match(/^diff --git a\/(.+) b\/(.+)$/);
103
+ const file = m ? m[2] : '';
104
+ currentFile = (file.startsWith('content/knowledge/') && file.endsWith('.md')) ? file : null;
105
+ currentHunks = [];
106
+ i++;
107
+ continue;
108
+ }
109
+ if (currentFile && line.startsWith('@@')) {
110
+ const hh = line.match(/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)?/);
111
+ if (!hh) {
112
+ i++;
113
+ continue;
114
+ }
115
+ const hunk = {
116
+ oldStart: parseInt(hh[1], 10),
117
+ newStart: parseInt(hh[2], 10),
118
+ lines: [],
119
+ };
120
+ i++;
121
+ while (i < lines.length && !lines[i].startsWith('@@') && !lines[i].startsWith('diff --git ')) {
122
+ hunk.lines.push(lines[i]);
123
+ i++;
124
+ }
125
+ currentHunks.push(hunk);
126
+ continue;
127
+ }
128
+ i++;
129
+ }
130
+ if (currentFile)
131
+ out.set(currentFile, currentHunks);
132
+ return out;
133
+ }
134
+ /**
135
+ * Given the raw diff and per-file pre/post-change content, return body-only
136
+ * add/remove counts. An added line is "body" iff its new-file line number
137
+ * is past the NEW frontmatter end; a removed line is "body" iff its
138
+ * old-file line number is past the OLD frontmatter end.
139
+ */
140
+ export function splitChurnByRegion(diff, fileContents) {
141
+ const perFile = parseHunks(diff);
142
+ const out = new Map();
143
+ for (const [file, hunks] of perFile) {
144
+ const entry = fileContents.get(file);
145
+ let newContent = '';
146
+ let oldContent;
147
+ if (typeof entry === 'string') {
148
+ // Back-compat shape: just the new content. Old boundary unknown;
149
+ // we'll fall back to the new boundary for `-` lines (round-8 F-003
150
+ // documented residual: this is the over-count direction, never
151
+ // under-count — safe).
152
+ newContent = entry;
153
+ }
154
+ else if (entry) {
155
+ newContent = entry.newContent;
156
+ oldContent = entry.oldContent;
157
+ }
158
+ const newFmEnd = findFrontmatterEndLineNumber(newContent);
159
+ const oldFmEnd = oldContent !== undefined
160
+ ? findFrontmatterEndLineNumber(oldContent)
161
+ : newFmEnd;
162
+ let bodyAdded = 0, bodyRemoved = 0;
163
+ for (const hunk of hunks) {
164
+ // Walk through the hunk, tracking the running line number on each
165
+ // side. Context lines (' ') advance both sides. '+' advances only
166
+ // the new side. '-' advances only the old side.
167
+ let newLineNo = hunk.newStart;
168
+ let oldLineNo = hunk.oldStart;
169
+ for (const l of hunk.lines) {
170
+ if (l.startsWith('+') && !l.startsWith('+++')) {
171
+ if (newLineNo > newFmEnd)
172
+ bodyAdded++;
173
+ newLineNo++;
174
+ }
175
+ else if (l.startsWith('-') && !l.startsWith('---')) {
176
+ if (oldLineNo > oldFmEnd)
177
+ bodyRemoved++;
178
+ oldLineNo++;
179
+ }
180
+ else if (l.startsWith(' ') || l === '') {
181
+ // Round-9 F-001: empty diff lines (where trailing whitespace was
182
+ // stripped from a blank context line) must still advance both
183
+ // counters. Without this, line numbers drift mid-hunk and the
184
+ // body/frontmatter classification breaks.
185
+ newLineNo++;
186
+ oldLineNo++;
187
+ }
188
+ // → no line numbers consumed.
189
+ }
190
+ }
191
+ out.set(file, { bodyAddedCount: bodyAdded, bodyRemovedCount: bodyRemoved });
192
+ }
193
+ return out;
194
+ }
195
+ /**
196
+ * Return the 1-indexed line number of the closing frontmatter `---`. If
197
+ * the file has no frontmatter or it's malformed, returns 0 so every
198
+ * line is treated as body.
199
+ */
200
+ function findFrontmatterEndLineNumber(content) {
201
+ const lines = content.split(/\r?\n/);
202
+ if (lines[0]?.trim() !== '---')
203
+ return 0;
204
+ for (let n = 1; n < lines.length; n++) {
205
+ if (lines[n].trim() === '---')
206
+ return n + 1; // 1-indexed
207
+ }
208
+ return 0;
209
+ }
210
+ //# sourceMappingURL=anti-over-rewrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-over-rewrite.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/anti-over-rewrite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=anti-over-rewrite.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-over-rewrite.test.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/anti-over-rewrite.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { evaluateChurn, parseUnifiedDiffForChurn, splitChurnByRegion } from './anti-over-rewrite.js';
3
+ function makeContent(volatility, bodyLines) {
4
+ const body = Array.from({ length: bodyLines }, (_, i) => `body line ${i + 1}`).join('\n');
5
+ return `---\nname: x\nvolatility: ${volatility}\n---\n${body}\n`;
6
+ }
7
+ describe('evaluateChurn', () => {
8
+ it('blocks a stable entry with >20% churn and no override', () => {
9
+ const content = makeContent('stable', 100);
10
+ // 100 body lines + frontmatter ≈ 105 total. 30 churn → 28%.
11
+ const out = evaluateChurn([
12
+ { file: 'x.md', content, addedCount: 15, removedCount: 15 },
13
+ ]);
14
+ expect(out[0].blocking).toBe(true);
15
+ });
16
+ it('does not block when maintainer applied the override label', () => {
17
+ const content = makeContent('stable', 100);
18
+ const out = evaluateChurn([{ file: 'x.md', content, addedCount: 15, removedCount: 15 }], { prLabels: ['knowledge-freshness', 'override:anti-over-rewrite'] });
19
+ expect(out[0].blocking).toBe(false);
20
+ expect(out[0].overridden).toBe(true);
21
+ });
22
+ it('DOES still block when only a PR-body marker is present (no label)', () => {
23
+ // F-005: the gate explicitly does not honor PR-body markers, which a
24
+ // prompt-injected source body could plant. Only the maintainer-applied
25
+ // label is trusted.
26
+ const content = makeContent('stable', 100);
27
+ const out = evaluateChurn([{ file: 'x.md', content, addedCount: 15, removedCount: 15 }], { prLabels: [] });
28
+ expect(out[0].blocking).toBe(true);
29
+ expect(out[0].overridden).toBe(false);
30
+ });
31
+ it('does not block evolving entries even at high churn', () => {
32
+ const content = makeContent('evolving', 100);
33
+ const out = evaluateChurn([
34
+ { file: 'x.md', content, addedCount: 40, removedCount: 40 },
35
+ ]);
36
+ expect(out[0].blocking).toBe(false);
37
+ });
38
+ it('passes stable entries under threshold', () => {
39
+ const content = makeContent('stable', 100);
40
+ const out = evaluateChurn([
41
+ { file: 'x.md', content, addedCount: 5, removedCount: 5 },
42
+ ]);
43
+ expect(out[0].blocking).toBe(false);
44
+ });
45
+ });
46
+ describe('parseUnifiedDiffForChurn', () => {
47
+ it('counts adds and removes per knowledge file', () => {
48
+ const diff = [
49
+ 'diff --git a/content/knowledge/x/y.md b/content/knowledge/x/y.md',
50
+ '--- a/content/knowledge/x/y.md',
51
+ '+++ b/content/knowledge/x/y.md',
52
+ '@@ -1,3 +1,3 @@',
53
+ '-old',
54
+ '+new',
55
+ ' same',
56
+ '-gone',
57
+ '+came',
58
+ ].join('\n');
59
+ const out = parseUnifiedDiffForChurn(diff);
60
+ // Hunk starts at line 1 → state begins 'inside' frontmatter; none of the
61
+ // diff content contains `---` boundaries to flip to 'after', so body
62
+ // counts stay zero. The total counts reflect the raw diff.
63
+ expect(out).toEqual([{
64
+ file: 'content/knowledge/x/y.md',
65
+ addedCount: 2, removedCount: 2,
66
+ bodyAddedCount: 0, bodyRemovedCount: 0,
67
+ }]);
68
+ });
69
+ it('counts body adds/removes separately from frontmatter ones (round-6 F-002, round-7 F-001)', () => {
70
+ // A diff where the closing --- appears, transitioning frontmatter→body.
71
+ // Frontmatter changes (last-reviewed) should NOT count toward body churn.
72
+ const diff = [
73
+ 'diff --git a/content/knowledge/core/x.md b/content/knowledge/core/x.md',
74
+ '--- a/content/knowledge/core/x.md',
75
+ '+++ b/content/knowledge/core/x.md',
76
+ '@@ -1,8 +1,8 @@',
77
+ ' ---',
78
+ ' name: x',
79
+ ' description: y',
80
+ '-last-reviewed: null',
81
+ '+last-reviewed: 2026-05-25',
82
+ ' ---',
83
+ '',
84
+ '-old body line',
85
+ '+new body line',
86
+ ].join('\n');
87
+ const raw = parseUnifiedDiffForChurn(diff);
88
+ expect(raw).toEqual([{
89
+ file: 'content/knowledge/core/x.md',
90
+ addedCount: 2, removedCount: 2,
91
+ // parseUnifiedDiffForChurn alone returns 0 here — body counts are
92
+ // computed by splitChurnByRegion which needs the post-change content.
93
+ bodyAddedCount: 0, bodyRemovedCount: 0,
94
+ }]);
95
+ // The post-change file content has the closing --- on line 5,
96
+ // body starts on line 6. The diff's body line (`new body line`) lands
97
+ // at new-file line 7 (after blank line 6).
98
+ const newContent = [
99
+ '---',
100
+ 'name: x',
101
+ 'description: y',
102
+ 'last-reviewed: 2026-05-25',
103
+ '---',
104
+ '',
105
+ 'new body line',
106
+ ].join('\n');
107
+ // F-001 round-7: splitChurnByRegion uses parseEntry-derived line
108
+ // numbers instead of the buggy diff-content state machine.
109
+ const splits = splitChurnByRegion(diff, new Map([['content/knowledge/core/x.md', newContent]]));
110
+ expect(splits.get('content/knowledge/core/x.md')).toEqual({
111
+ bodyAddedCount: 1, bodyRemovedCount: 1, // only the body line pair
112
+ });
113
+ });
114
+ });
115
+ //# sourceMappingURL=anti-over-rewrite.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-over-rewrite.test.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/anti-over-rewrite.test.ts"],"names":[],"mappings":"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"}