@sanity/ailf 0.1.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 (530) hide show
  1. package/README.md +89 -0
  2. package/bin/ailf.js +64 -0
  3. package/canonical/grader-references/README.md +88 -0
  4. package/canonical/grader-references/groq.yaml +234 -0
  5. package/canonical/grader-references/studio-setup.yaml +275 -0
  6. package/canonical/reference-solutions/.gitkeep +1 -0
  7. package/canonical/reference-solutions/frameworks/nuxt.ts +119 -0
  8. package/canonical/reference-solutions/frameworks/remix.tsx +100 -0
  9. package/canonical/reference-solutions/functions/publish-webhook.ts +60 -0
  10. package/canonical/reference-solutions/groq/advanced-filtering.ts +379 -0
  11. package/canonical/reference-solutions/groq/blog-queries.ts +137 -0
  12. package/canonical/reference-solutions/groq/joins-references.ts +300 -0
  13. package/canonical/reference-solutions/nextjs/app-router-integration.tsx +128 -0
  14. package/canonical/reference-solutions/studio-setup/blog-schema.ts +143 -0
  15. package/canonical/reference-solutions/studio-setup/custom-tool.tsx +78 -0
  16. package/canonical/reference-solutions/visual-editing/live-preview.tsx +137 -0
  17. package/canonical/reference-solutions/visual-editing/presentation-nextjs.tsx +130 -0
  18. package/config/airbyte/ai_literacy_framework.connector.yaml +639 -0
  19. package/config/bigquery/README.md +74 -0
  20. package/config/bigquery/views/area_scores.sql +87 -0
  21. package/config/bigquery/views/reports.sql +49 -0
  22. package/config/features.yaml +116 -0
  23. package/config/models.yaml +115 -0
  24. package/config/prompts.yaml +75 -0
  25. package/config/rubrics.yaml +62 -0
  26. package/config/schedules.yaml +43 -0
  27. package/config/sinks.yaml +54 -0
  28. package/config/sources.yaml +51 -0
  29. package/config/thresholds.yaml +49 -0
  30. package/dist/_vendor/ailf-core/examples/index.d.ts +190 -0
  31. package/dist/_vendor/ailf-core/examples/index.js +285 -0
  32. package/dist/_vendor/ailf-core/index.d.ts +17 -0
  33. package/dist/_vendor/ailf-core/index.js +17 -0
  34. package/dist/_vendor/ailf-core/ports/cache-store.d.ts +72 -0
  35. package/dist/_vendor/ailf-core/ports/cache-store.js +17 -0
  36. package/dist/_vendor/ailf-core/ports/config-source.d.ts +33 -0
  37. package/dist/_vendor/ailf-core/ports/config-source.js +15 -0
  38. package/dist/_vendor/ailf-core/ports/context.d.ts +172 -0
  39. package/dist/_vendor/ailf-core/ports/context.js +14 -0
  40. package/dist/_vendor/ailf-core/ports/doc-fetcher.d.ts +131 -0
  41. package/dist/_vendor/ailf-core/ports/doc-fetcher.js +12 -0
  42. package/dist/_vendor/ailf-core/ports/eval-runner.d.ts +24 -0
  43. package/dist/_vendor/ailf-core/ports/eval-runner.js +8 -0
  44. package/dist/_vendor/ailf-core/ports/index.d.ts +15 -0
  45. package/dist/_vendor/ailf-core/ports/index.js +7 -0
  46. package/dist/_vendor/ailf-core/ports/logger.d.ts +36 -0
  47. package/dist/_vendor/ailf-core/ports/logger.js +11 -0
  48. package/dist/_vendor/ailf-core/ports/pipeline-step.d.ts +46 -0
  49. package/dist/_vendor/ailf-core/ports/pipeline-step.js +8 -0
  50. package/dist/_vendor/ailf-core/ports/task-source.d.ts +159 -0
  51. package/dist/_vendor/ailf-core/ports/task-source.js +72 -0
  52. package/dist/_vendor/ailf-core/schemas/callback-payload.d.ts +24 -0
  53. package/dist/_vendor/ailf-core/schemas/callback-payload.js +29 -0
  54. package/dist/_vendor/ailf-core/schemas/eval-config.d.ts +55 -0
  55. package/dist/_vendor/ailf-core/schemas/eval-config.js +78 -0
  56. package/dist/_vendor/ailf-core/schemas/index.d.ts +16 -0
  57. package/dist/_vendor/ailf-core/schemas/index.js +16 -0
  58. package/dist/_vendor/ailf-core/schemas/pipeline-request.d.ts +125 -0
  59. package/dist/_vendor/ailf-core/schemas/pipeline-request.js +67 -0
  60. package/dist/_vendor/ailf-core/schemas/pipeline.d.ts +531 -0
  61. package/dist/_vendor/ailf-core/schemas/pipeline.js +318 -0
  62. package/dist/_vendor/ailf-core/schemas/schedules.d.ts +68 -0
  63. package/dist/_vendor/ailf-core/schemas/schedules.js +74 -0
  64. package/dist/_vendor/ailf-core/schemas/sinks.d.ts +207 -0
  65. package/dist/_vendor/ailf-core/schemas/sinks.js +108 -0
  66. package/dist/_vendor/ailf-core/services/comparison-formatters.d.ts +18 -0
  67. package/dist/_vendor/ailf-core/services/comparison-formatters.js +189 -0
  68. package/dist/_vendor/ailf-core/services/config-helpers.d.ts +41 -0
  69. package/dist/_vendor/ailf-core/services/config-helpers.js +86 -0
  70. package/dist/_vendor/ailf-core/services/index.d.ts +12 -0
  71. package/dist/_vendor/ailf-core/services/index.js +12 -0
  72. package/dist/_vendor/ailf-core/services/scoring.d.ts +49 -0
  73. package/dist/_vendor/ailf-core/services/scoring.js +222 -0
  74. package/dist/_vendor/ailf-core/types/index.d.ts +1082 -0
  75. package/dist/_vendor/ailf-core/types/index.js +21 -0
  76. package/dist/_vendor/ailf-core/types/scoring-input.d.ts +54 -0
  77. package/dist/_vendor/ailf-core/types/scoring-input.js +9 -0
  78. package/dist/_vendor/ailf-shared/dimension-names.d.ts +21 -0
  79. package/dist/_vendor/ailf-shared/dimension-names.js +27 -0
  80. package/dist/_vendor/ailf-shared/document-ref.d.ts +29 -0
  81. package/dist/_vendor/ailf-shared/document-ref.js +1 -0
  82. package/dist/_vendor/ailf-shared/eval-modes.d.ts +12 -0
  83. package/dist/_vendor/ailf-shared/eval-modes.js +8 -0
  84. package/dist/_vendor/ailf-shared/index.d.ts +16 -0
  85. package/dist/_vendor/ailf-shared/index.js +16 -0
  86. package/dist/_vendor/ailf-shared/noise-threshold.d.ts +9 -0
  87. package/dist/_vendor/ailf-shared/noise-threshold.js +9 -0
  88. package/dist/_vendor/ailf-shared/score-grades.d.ts +17 -0
  89. package/dist/_vendor/ailf-shared/score-grades.js +23 -0
  90. package/dist/adapters/cache/content-lake-cache.d.ts +24 -0
  91. package/dist/adapters/cache/content-lake-cache.js +59 -0
  92. package/dist/adapters/cache/filesystem-cache.d.ts +18 -0
  93. package/dist/adapters/cache/filesystem-cache.js +54 -0
  94. package/dist/adapters/cache/index.d.ts +2 -0
  95. package/dist/adapters/cache/index.js +2 -0
  96. package/dist/adapters/config-sources/cli-config-adapter.d.ts +17 -0
  97. package/dist/adapters/config-sources/cli-config-adapter.js +23 -0
  98. package/dist/adapters/config-sources/file-config-adapter.d.ts +26 -0
  99. package/dist/adapters/config-sources/file-config-adapter.js +96 -0
  100. package/dist/adapters/config-sources/index.d.ts +2 -0
  101. package/dist/adapters/config-sources/index.js +2 -0
  102. package/dist/adapters/doc-fetchers/index.d.ts +1 -0
  103. package/dist/adapters/doc-fetchers/index.js +1 -0
  104. package/dist/adapters/doc-fetchers/sanity-doc-fetcher.d.ts +76 -0
  105. package/dist/adapters/doc-fetchers/sanity-doc-fetcher.js +620 -0
  106. package/dist/adapters/eval-runners/index.d.ts +1 -0
  107. package/dist/adapters/eval-runners/index.js +1 -0
  108. package/dist/adapters/eval-runners/promptfoo-eval-adapter.d.ts +14 -0
  109. package/dist/adapters/eval-runners/promptfoo-eval-adapter.js +63 -0
  110. package/dist/adapters/index.d.ts +12 -0
  111. package/dist/adapters/index.js +12 -0
  112. package/dist/adapters/loggers/console-logger.d.ts +22 -0
  113. package/dist/adapters/loggers/console-logger.js +54 -0
  114. package/dist/adapters/loggers/index.d.ts +9 -0
  115. package/dist/adapters/loggers/index.js +9 -0
  116. package/dist/adapters/loggers/json-logger.d.ts +18 -0
  117. package/dist/adapters/loggers/json-logger.js +33 -0
  118. package/dist/adapters/loggers/quiet-logger.d.ts +16 -0
  119. package/dist/adapters/loggers/quiet-logger.js +30 -0
  120. package/dist/adapters/task-sources/composite-task-source.d.ts +20 -0
  121. package/dist/adapters/task-sources/composite-task-source.js +59 -0
  122. package/dist/adapters/task-sources/content-lake-task-source.d.ts +20 -0
  123. package/dist/adapters/task-sources/content-lake-task-source.js +219 -0
  124. package/dist/adapters/task-sources/index.d.ts +7 -0
  125. package/dist/adapters/task-sources/index.js +7 -0
  126. package/dist/adapters/task-sources/repo-schemas.d.ts +245 -0
  127. package/dist/adapters/task-sources/repo-schemas.js +234 -0
  128. package/dist/adapters/task-sources/repo-task-source.d.ts +22 -0
  129. package/dist/adapters/task-sources/repo-task-source.js +104 -0
  130. package/dist/adapters/task-sources/repo-trigger.d.ts +52 -0
  131. package/dist/adapters/task-sources/repo-trigger.js +153 -0
  132. package/dist/adapters/task-sources/repo-validation.d.ts +49 -0
  133. package/dist/adapters/task-sources/repo-validation.js +164 -0
  134. package/dist/adapters/task-sources/yaml-task-source.d.ts +18 -0
  135. package/dist/adapters/task-sources/yaml-task-source.js +136 -0
  136. package/dist/agent-observer/agentic-provider.d.ts +132 -0
  137. package/dist/agent-observer/agentic-provider.js +983 -0
  138. package/dist/agent-observer/classifier.d.ts +62 -0
  139. package/dist/agent-observer/classifier.js +269 -0
  140. package/dist/agent-observer/index.d.ts +7 -0
  141. package/dist/agent-observer/index.js +4 -0
  142. package/dist/agent-observer/pricing.d.ts +35 -0
  143. package/dist/agent-observer/pricing.js +82 -0
  144. package/dist/agent-observer/provider.d.ts +77 -0
  145. package/dist/agent-observer/provider.js +151 -0
  146. package/dist/agent-observer/proxy.d.ts +91 -0
  147. package/dist/agent-observer/proxy.js +321 -0
  148. package/dist/agent-observer/test-imports.d.ts +7 -0
  149. package/dist/agent-observer/test-imports.js +185 -0
  150. package/dist/agent-observer/types.d.ts +137 -0
  151. package/dist/agent-observer/types.js +16 -0
  152. package/dist/assertions/source-isolation.d.ts +72 -0
  153. package/dist/assertions/source-isolation.js +117 -0
  154. package/dist/cli.d.ts +24 -0
  155. package/dist/cli.js +199 -0
  156. package/dist/commands/agent-report.d.ts +5 -0
  157. package/dist/commands/agent-report.js +69 -0
  158. package/dist/commands/baseline.d.ts +9 -0
  159. package/dist/commands/baseline.js +141 -0
  160. package/dist/commands/cache.d.ts +13 -0
  161. package/dist/commands/cache.js +135 -0
  162. package/dist/commands/calculate-scores.d.ts +8 -0
  163. package/dist/commands/calculate-scores.js +48 -0
  164. package/dist/commands/compare.d.ts +8 -0
  165. package/dist/commands/compare.js +120 -0
  166. package/dist/commands/completion.d.ts +18 -0
  167. package/dist/commands/completion.js +260 -0
  168. package/dist/commands/coverage-audit.d.ts +7 -0
  169. package/dist/commands/coverage-audit.js +40 -0
  170. package/dist/commands/discovery-report.d.ts +10 -0
  171. package/dist/commands/discovery-report.js +44 -0
  172. package/dist/commands/eval.d.ts +9 -0
  173. package/dist/commands/eval.js +35 -0
  174. package/dist/commands/explain-handler.d.ts +34 -0
  175. package/dist/commands/explain-handler.js +719 -0
  176. package/dist/commands/fetch-docs.d.ts +8 -0
  177. package/dist/commands/fetch-docs.js +128 -0
  178. package/dist/commands/generate-configs.d.ts +8 -0
  179. package/dist/commands/generate-configs.js +46 -0
  180. package/dist/commands/grader/index.d.ts +11 -0
  181. package/dist/commands/grader/index.js +118 -0
  182. package/dist/commands/init.d.ts +19 -0
  183. package/dist/commands/init.js +150 -0
  184. package/dist/commands/interactive.d.ts +12 -0
  185. package/dist/commands/interactive.js +238 -0
  186. package/dist/commands/lookup-doc.d.ts +15 -0
  187. package/dist/commands/lookup-doc.js +84 -0
  188. package/dist/commands/measure-retrieval.d.ts +5 -0
  189. package/dist/commands/measure-retrieval.js +65 -0
  190. package/dist/commands/pipeline-action.d.ts +71 -0
  191. package/dist/commands/pipeline-action.js +305 -0
  192. package/dist/commands/pipeline.d.ts +62 -0
  193. package/dist/commands/pipeline.js +53 -0
  194. package/dist/commands/pr-comment.d.ts +8 -0
  195. package/dist/commands/pr-comment.js +47 -0
  196. package/dist/commands/publish.d.ts +26 -0
  197. package/dist/commands/publish.js +253 -0
  198. package/dist/commands/readiness-report.d.ts +10 -0
  199. package/dist/commands/readiness-report.js +104 -0
  200. package/dist/commands/shared/options.d.ts +29 -0
  201. package/dist/commands/shared/options.js +57 -0
  202. package/dist/commands/update-quality-scores.d.ts +5 -0
  203. package/dist/commands/update-quality-scores.js +20 -0
  204. package/dist/commands/validate-tasks.d.ts +16 -0
  205. package/dist/commands/validate-tasks.js +93 -0
  206. package/dist/commands/validate.d.ts +9 -0
  207. package/dist/commands/validate.js +73 -0
  208. package/dist/commands/webhook-server.d.ts +5 -0
  209. package/dist/commands/webhook-server.js +30 -0
  210. package/dist/commands/weekly-digest.d.ts +10 -0
  211. package/dist/commands/weekly-digest.js +104 -0
  212. package/dist/composition-root.d.ts +26 -0
  213. package/dist/composition-root.js +107 -0
  214. package/dist/interpolate.d.ts +26 -0
  215. package/dist/interpolate.js +70 -0
  216. package/dist/job-store.d.ts +104 -0
  217. package/dist/job-store.js +188 -0
  218. package/dist/lib/agent-behavior-report.d.ts +8 -0
  219. package/dist/lib/agent-behavior-report.js +185 -0
  220. package/dist/lib/baseline.d.ts +19 -0
  221. package/dist/lib/baseline.js +153 -0
  222. package/dist/lib/calculate-scores.d.ts +23 -0
  223. package/dist/lib/calculate-scores.js +42 -0
  224. package/dist/lib/compare.d.ts +18 -0
  225. package/dist/lib/compare.js +170 -0
  226. package/dist/lib/coverage-audit.d.ts +4 -0
  227. package/dist/lib/coverage-audit.js +42 -0
  228. package/dist/lib/discovery-report.d.ts +13 -0
  229. package/dist/lib/discovery-report.js +57 -0
  230. package/dist/lib/fetch-docs.d.ts +30 -0
  231. package/dist/lib/fetch-docs.js +171 -0
  232. package/dist/lib/generate-configs.d.ts +25 -0
  233. package/dist/lib/generate-configs.js +42 -0
  234. package/dist/lib/grader-api.d.ts +21 -0
  235. package/dist/lib/grader-api.js +34 -0
  236. package/dist/lib/grader-compare.d.ts +19 -0
  237. package/dist/lib/grader-compare.js +91 -0
  238. package/dist/lib/grader-consistency.d.ts +27 -0
  239. package/dist/lib/grader-consistency.js +79 -0
  240. package/dist/lib/grader-sensitivity.d.ts +19 -0
  241. package/dist/lib/grader-sensitivity.js +75 -0
  242. package/dist/lib/grader-validate.d.ts +19 -0
  243. package/dist/lib/grader-validate.js +78 -0
  244. package/dist/lib/measure-retrieval.d.ts +14 -0
  245. package/dist/lib/measure-retrieval.js +71 -0
  246. package/dist/lib/pr-comment.d.ts +16 -0
  247. package/dist/lib/pr-comment.js +28 -0
  248. package/dist/lib/readiness-report.d.ts +13 -0
  249. package/dist/lib/readiness-report.js +108 -0
  250. package/dist/lib/webhook-server.d.ts +11 -0
  251. package/dist/lib/webhook-server.js +24 -0
  252. package/dist/lib/weekly-digest.d.ts +24 -0
  253. package/dist/lib/weekly-digest.js +148 -0
  254. package/dist/orchestration/build-app-context.d.ts +27 -0
  255. package/dist/orchestration/build-app-context.js +81 -0
  256. package/dist/orchestration/build-step-sequence.d.ts +15 -0
  257. package/dist/orchestration/build-step-sequence.js +84 -0
  258. package/dist/orchestration/config-to-source-overrides.d.ts +9 -0
  259. package/dist/orchestration/config-to-source-overrides.js +28 -0
  260. package/dist/orchestration/env-bridge.d.ts +21 -0
  261. package/dist/orchestration/env-bridge.js +66 -0
  262. package/dist/orchestration/index.d.ts +11 -0
  263. package/dist/orchestration/index.js +11 -0
  264. package/dist/orchestration/pipeline-orchestrator.d.ts +24 -0
  265. package/dist/orchestration/pipeline-orchestrator.js +153 -0
  266. package/dist/orchestration/step-runner.d.ts +20 -0
  267. package/dist/orchestration/step-runner.js +88 -0
  268. package/dist/orchestration/steps/calculate-scores-step.d.ts +13 -0
  269. package/dist/orchestration/steps/calculate-scores-step.js +95 -0
  270. package/dist/orchestration/steps/callback-step.d.ts +24 -0
  271. package/dist/orchestration/steps/callback-step.js +76 -0
  272. package/dist/orchestration/steps/compare-step.d.ts +14 -0
  273. package/dist/orchestration/steps/compare-step.js +92 -0
  274. package/dist/orchestration/steps/discovery-report-step.d.ts +13 -0
  275. package/dist/orchestration/steps/discovery-report-step.js +55 -0
  276. package/dist/orchestration/steps/fetch-docs-shell.d.ts +17 -0
  277. package/dist/orchestration/steps/fetch-docs-shell.js +30 -0
  278. package/dist/orchestration/steps/fetch-docs-step.d.ts +14 -0
  279. package/dist/orchestration/steps/fetch-docs-step.js +135 -0
  280. package/dist/orchestration/steps/gap-analysis-step.d.ts +16 -0
  281. package/dist/orchestration/steps/gap-analysis-step.js +136 -0
  282. package/dist/orchestration/steps/generate-configs-step.d.ts +14 -0
  283. package/dist/orchestration/steps/generate-configs-step.js +85 -0
  284. package/dist/orchestration/steps/grader-consistency-step.d.ts +13 -0
  285. package/dist/orchestration/steps/grader-consistency-step.js +64 -0
  286. package/dist/orchestration/steps/index.d.ts +19 -0
  287. package/dist/orchestration/steps/index.js +19 -0
  288. package/dist/orchestration/steps/mirror-repo-tasks-step.d.ts +21 -0
  289. package/dist/orchestration/steps/mirror-repo-tasks-step.js +94 -0
  290. package/dist/orchestration/steps/publish-report-step.d.ts +26 -0
  291. package/dist/orchestration/steps/publish-report-step.js +216 -0
  292. package/dist/orchestration/steps/readiness-step.d.ts +13 -0
  293. package/dist/orchestration/steps/readiness-step.js +91 -0
  294. package/dist/orchestration/steps/report-step.d.ts +12 -0
  295. package/dist/orchestration/steps/report-step.js +49 -0
  296. package/dist/orchestration/steps/run-eval-step.d.ts +17 -0
  297. package/dist/orchestration/steps/run-eval-step.js +195 -0
  298. package/dist/orchestration/steps/validate-step.d.ts +12 -0
  299. package/dist/orchestration/steps/validate-step.js +41 -0
  300. package/dist/pipeline/agent-behavior-report.d.ts +53 -0
  301. package/dist/pipeline/agent-behavior-report.js +132 -0
  302. package/dist/pipeline/attribution.d.ts +47 -0
  303. package/dist/pipeline/attribution.js +226 -0
  304. package/dist/pipeline/baseline.d.ts +37 -0
  305. package/dist/pipeline/baseline.js +141 -0
  306. package/dist/pipeline/cache.d.ts +101 -0
  307. package/dist/pipeline/cache.js +283 -0
  308. package/dist/pipeline/calculate-scores.d.ts +102 -0
  309. package/dist/pipeline/calculate-scores.js +1128 -0
  310. package/dist/pipeline/callback-delivery.d.ts +50 -0
  311. package/dist/pipeline/callback-delivery.js +89 -0
  312. package/dist/pipeline/checks.d.ts +39 -0
  313. package/dist/pipeline/checks.js +280 -0
  314. package/dist/pipeline/classify-url.d.ts +61 -0
  315. package/dist/pipeline/classify-url.js +93 -0
  316. package/dist/pipeline/compare.d.ts +31 -0
  317. package/dist/pipeline/compare.js +208 -0
  318. package/dist/pipeline/coverage-audit.d.ts +39 -0
  319. package/dist/pipeline/coverage-audit.js +165 -0
  320. package/dist/pipeline/degradations.d.ts +85 -0
  321. package/dist/pipeline/degradations.js +242 -0
  322. package/dist/pipeline/discovery-report.d.ts +55 -0
  323. package/dist/pipeline/discovery-report.js +178 -0
  324. package/dist/pipeline/eval-constants.d.ts +68 -0
  325. package/dist/pipeline/eval-constants.js +111 -0
  326. package/dist/pipeline/eval-fingerprint.d.ts +66 -0
  327. package/dist/pipeline/eval-fingerprint.js +175 -0
  328. package/dist/pipeline/expand-tasks.d.ts +220 -0
  329. package/dist/pipeline/expand-tasks.js +421 -0
  330. package/dist/pipeline/failure-modes.d.ts +46 -0
  331. package/dist/pipeline/failure-modes.js +348 -0
  332. package/dist/pipeline/fetch-url-content.d.ts +44 -0
  333. package/dist/pipeline/fetch-url-content.js +93 -0
  334. package/dist/pipeline/gap-analysis.d.ts +48 -0
  335. package/dist/pipeline/gap-analysis.js +231 -0
  336. package/dist/pipeline/generate-configs.d.ts +72 -0
  337. package/dist/pipeline/generate-configs.js +395 -0
  338. package/dist/pipeline/grader-api.d.ts +49 -0
  339. package/dist/pipeline/grader-api.js +200 -0
  340. package/dist/pipeline/grader-compare-runner.d.ts +44 -0
  341. package/dist/pipeline/grader-compare-runner.js +301 -0
  342. package/dist/pipeline/grader-comparison.d.ts +111 -0
  343. package/dist/pipeline/grader-comparison.js +161 -0
  344. package/dist/pipeline/grader-consistency-runner.d.ts +60 -0
  345. package/dist/pipeline/grader-consistency-runner.js +270 -0
  346. package/dist/pipeline/grader-consistency.d.ts +103 -0
  347. package/dist/pipeline/grader-consistency.js +146 -0
  348. package/dist/pipeline/grader-sensitivity-runner.d.ts +40 -0
  349. package/dist/pipeline/grader-sensitivity-runner.js +282 -0
  350. package/dist/pipeline/grader-sensitivity.d.ts +94 -0
  351. package/dist/pipeline/grader-sensitivity.js +144 -0
  352. package/dist/pipeline/grader-validate-runner.d.ts +38 -0
  353. package/dist/pipeline/grader-validate-runner.js +229 -0
  354. package/dist/pipeline/grader-validation.d.ts +107 -0
  355. package/dist/pipeline/grader-validation.js +169 -0
  356. package/dist/pipeline/map-request-to-config.d.ts +19 -0
  357. package/dist/pipeline/map-request-to-config.js +80 -0
  358. package/dist/pipeline/measure-retrieval.d.ts +59 -0
  359. package/dist/pipeline/measure-retrieval.js +111 -0
  360. package/dist/pipeline/mirror-repo-tasks.d.ts +86 -0
  361. package/dist/pipeline/mirror-repo-tasks.js +350 -0
  362. package/dist/pipeline/plan-format.d.ts +33 -0
  363. package/dist/pipeline/plan-format.js +202 -0
  364. package/dist/pipeline/plan.d.ts +169 -0
  365. package/dist/pipeline/plan.js +708 -0
  366. package/dist/pipeline/pr-comment.d.ts +19 -0
  367. package/dist/pipeline/pr-comment.js +502 -0
  368. package/dist/pipeline/probe.d.ts +52 -0
  369. package/dist/pipeline/probe.js +390 -0
  370. package/dist/pipeline/provenance.d.ts +47 -0
  371. package/dist/pipeline/provenance.js +146 -0
  372. package/dist/pipeline/readiness-report.d.ts +87 -0
  373. package/dist/pipeline/readiness-report.js +205 -0
  374. package/dist/pipeline/release-classification.d.ts +54 -0
  375. package/dist/pipeline/release-classification.js +238 -0
  376. package/dist/pipeline/release-report.d.ts +37 -0
  377. package/dist/pipeline/release-report.js +222 -0
  378. package/dist/pipeline/repo-eval-comment.d.ts +37 -0
  379. package/dist/pipeline/repo-eval-comment.js +165 -0
  380. package/dist/pipeline/repo-threshold-evaluator.d.ts +89 -0
  381. package/dist/pipeline/repo-threshold-evaluator.js +162 -0
  382. package/dist/pipeline/resolve-mappings.d.ts +35 -0
  383. package/dist/pipeline/resolve-mappings.js +72 -0
  384. package/dist/pipeline/retrieval-metrics.d.ts +39 -0
  385. package/dist/pipeline/retrieval-metrics.js +136 -0
  386. package/dist/pipeline/reverse-mapping.d.ts +67 -0
  387. package/dist/pipeline/reverse-mapping.js +88 -0
  388. package/dist/pipeline/schemas.d.ts +9 -0
  389. package/dist/pipeline/schemas.js +9 -0
  390. package/dist/pipeline/steps/calculate-scores-step.d.ts +11 -0
  391. package/dist/pipeline/steps/calculate-scores-step.js +89 -0
  392. package/dist/pipeline/steps/compare-step.d.ts +18 -0
  393. package/dist/pipeline/steps/compare-step.js +90 -0
  394. package/dist/pipeline/steps/eval-step.d.ts +53 -0
  395. package/dist/pipeline/steps/eval-step.js +347 -0
  396. package/dist/pipeline/steps/fetch-docs-step.d.ts +11 -0
  397. package/dist/pipeline/steps/fetch-docs-step.js +84 -0
  398. package/dist/pipeline/steps/generate-configs-step.d.ts +11 -0
  399. package/dist/pipeline/steps/generate-configs-step.js +98 -0
  400. package/dist/pipeline/steps/grader-consistency-step.d.ts +21 -0
  401. package/dist/pipeline/steps/grader-consistency-step.js +74 -0
  402. package/dist/pipeline/steps/publish-report-step.d.ts +57 -0
  403. package/dist/pipeline/steps/publish-report-step.js +243 -0
  404. package/dist/pipeline/steps/report-step.d.ts +13 -0
  405. package/dist/pipeline/steps/report-step.js +56 -0
  406. package/dist/pipeline/steps/update-scores-step.d.ts +11 -0
  407. package/dist/pipeline/steps/update-scores-step.js +42 -0
  408. package/dist/pipeline/targeted-loo.d.ts +88 -0
  409. package/dist/pipeline/targeted-loo.js +203 -0
  410. package/dist/pipeline/thresholds.d.ts +27 -0
  411. package/dist/pipeline/thresholds.js +245 -0
  412. package/dist/pipeline/types.d.ts +10 -0
  413. package/dist/pipeline/types.js +10 -0
  414. package/dist/pipeline/validate.d.ts +67 -0
  415. package/dist/pipeline/validate.js +406 -0
  416. package/dist/pipeline/webhook-server.d.ts +37 -0
  417. package/dist/pipeline/webhook-server.js +133 -0
  418. package/dist/report-store.d.ts +84 -0
  419. package/dist/report-store.js +208 -0
  420. package/dist/sanity/client.d.ts +38 -0
  421. package/dist/sanity/client.js +86 -0
  422. package/dist/sanity/portable-text.d.ts +11 -0
  423. package/dist/sanity/portable-text.js +211 -0
  424. package/dist/sanity/queries.d.ts +133 -0
  425. package/dist/sanity/queries.js +300 -0
  426. package/dist/schedules/digest.d.ts +116 -0
  427. package/dist/schedules/digest.js +156 -0
  428. package/dist/schedules/index.d.ts +12 -0
  429. package/dist/schedules/index.js +10 -0
  430. package/dist/schedules/loader.d.ts +31 -0
  431. package/dist/schedules/loader.js +73 -0
  432. package/dist/schedules/schema.d.ts +9 -0
  433. package/dist/schedules/schema.js +9 -0
  434. package/dist/scripts/agent-behavior-report.d.ts +19 -0
  435. package/dist/scripts/agent-behavior-report.js +315 -0
  436. package/dist/scripts/baseline.d.ts +43 -0
  437. package/dist/scripts/baseline.js +267 -0
  438. package/dist/scripts/calculate-scores.d.ts +166 -0
  439. package/dist/scripts/calculate-scores.js +1296 -0
  440. package/dist/scripts/compare.d.ts +22 -0
  441. package/dist/scripts/compare.js +334 -0
  442. package/dist/scripts/coverage-audit.d.ts +44 -0
  443. package/dist/scripts/coverage-audit.js +209 -0
  444. package/dist/scripts/debug-eval.d.ts +19 -0
  445. package/dist/scripts/debug-eval.js +73 -0
  446. package/dist/scripts/discovery-report.d.ts +58 -0
  447. package/dist/scripts/discovery-report.js +250 -0
  448. package/dist/scripts/fetch-docs.d.ts +35 -0
  449. package/dist/scripts/fetch-docs.js +472 -0
  450. package/dist/scripts/generate-configs.d.ts +66 -0
  451. package/dist/scripts/generate-configs.js +459 -0
  452. package/dist/scripts/grader-api.d.ts +27 -0
  453. package/dist/scripts/grader-api.js +206 -0
  454. package/dist/scripts/grader-compare.d.ts +22 -0
  455. package/dist/scripts/grader-compare.js +368 -0
  456. package/dist/scripts/grader-consistency.d.ts +20 -0
  457. package/dist/scripts/grader-consistency.js +313 -0
  458. package/dist/scripts/grader-sensitivity.d.ts +22 -0
  459. package/dist/scripts/grader-sensitivity.js +354 -0
  460. package/dist/scripts/grader-validate.d.ts +19 -0
  461. package/dist/scripts/grader-validate.js +267 -0
  462. package/dist/scripts/measure-retrieval.d.ts +10 -0
  463. package/dist/scripts/measure-retrieval.js +145 -0
  464. package/dist/scripts/migrate-tasks-to-content-lake.d.ts +24 -0
  465. package/dist/scripts/migrate-tasks-to-content-lake.js +327 -0
  466. package/dist/scripts/pipeline.d.ts +76 -0
  467. package/dist/scripts/pipeline.js +1031 -0
  468. package/dist/scripts/pr-comment.d.ts +10 -0
  469. package/dist/scripts/pr-comment.js +510 -0
  470. package/dist/scripts/readiness-report.d.ts +88 -0
  471. package/dist/scripts/readiness-report.js +342 -0
  472. package/dist/scripts/update-quality-scores.d.ts +15 -0
  473. package/dist/scripts/update-quality-scores.js +184 -0
  474. package/dist/scripts/validate-task-sources.d.ts +21 -0
  475. package/dist/scripts/validate-task-sources.js +210 -0
  476. package/dist/scripts/validate.d.ts +13 -0
  477. package/dist/scripts/validate.js +79 -0
  478. package/dist/scripts/webhook-server.d.ts +26 -0
  479. package/dist/scripts/webhook-server.js +147 -0
  480. package/dist/scripts/weekly-digest.d.ts +24 -0
  481. package/dist/scripts/weekly-digest.js +144 -0
  482. package/dist/sinks/bigquery/index.d.ts +131 -0
  483. package/dist/sinks/bigquery/index.js +222 -0
  484. package/dist/sinks/format-slack.d.ts +64 -0
  485. package/dist/sinks/format-slack.js +306 -0
  486. package/dist/sinks/index.d.ts +23 -0
  487. package/dist/sinks/index.js +18 -0
  488. package/dist/sinks/loader.d.ts +18 -0
  489. package/dist/sinks/loader.js +82 -0
  490. package/dist/sinks/retry.d.ts +24 -0
  491. package/dist/sinks/retry.js +52 -0
  492. package/dist/sinks/schema.d.ts +9 -0
  493. package/dist/sinks/schema.js +9 -0
  494. package/dist/sinks/slack/format.d.ts +65 -0
  495. package/dist/sinks/slack/format.js +327 -0
  496. package/dist/sinks/slack/index.d.ts +27 -0
  497. package/dist/sinks/slack/index.js +78 -0
  498. package/dist/sinks/slack-sink.d.ts +27 -0
  499. package/dist/sinks/slack-sink.js +78 -0
  500. package/dist/sinks/types.d.ts +59 -0
  501. package/dist/sinks/types.js +44 -0
  502. package/dist/sinks/webhook/index.d.ts +19 -0
  503. package/dist/sinks/webhook/index.js +50 -0
  504. package/dist/sinks/webhook-sink.d.ts +19 -0
  505. package/dist/sinks/webhook-sink.js +50 -0
  506. package/dist/sources.d.ts +104 -0
  507. package/dist/sources.js +292 -0
  508. package/dist/webhook/budget.d.ts +42 -0
  509. package/dist/webhook/budget.js +60 -0
  510. package/dist/webhook/debounce.d.ts +67 -0
  511. package/dist/webhook/debounce.js +76 -0
  512. package/dist/webhook/dispatch.d.ts +45 -0
  513. package/dist/webhook/dispatch.js +84 -0
  514. package/dist/webhook/eval-request-handler.d.ts +87 -0
  515. package/dist/webhook/eval-request-handler.js +181 -0
  516. package/dist/webhook/handler.d.ts +88 -0
  517. package/dist/webhook/handler.js +203 -0
  518. package/dist/webhook/index.d.ts +17 -0
  519. package/dist/webhook/index.js +12 -0
  520. package/dist/webhook/types.d.ts +109 -0
  521. package/dist/webhook/types.js +10 -0
  522. package/package.json +72 -0
  523. package/tasks/.expanded.agentic.yaml +51 -0
  524. package/tasks/.expanded.yaml +66 -0
  525. package/tasks/frameworks.yaml +98 -0
  526. package/tasks/functions.yaml +51 -0
  527. package/tasks/groq.yaml +216 -0
  528. package/tasks/nextjs-live.yaml +62 -0
  529. package/tasks/studio-setup.yaml +111 -0
  530. package/tasks/visual-editing.yaml +120 -0
@@ -0,0 +1,205 @@
1
+ /**
2
+ * pipeline/readiness-report.ts
3
+ *
4
+ * Pure computation module for launch readiness reports.
5
+ *
6
+ * Combines threshold evaluation, ceiling decomposition, and gap analysis
7
+ * into a single actionable readiness checklist for a given feature area.
8
+ *
9
+ * This module has NO side effects — no file I/O, no process.argv, no env vars.
10
+ * Callers (command handlers, orchestration steps) handle I/O and pass data in.
11
+ *
12
+ * Exports pure functions:
13
+ * - generateReadinessReport() — builds the structured report
14
+ * - formatReadinessMarkdown() — renders the report as markdown
15
+ *
16
+ * @see docs/exec-plans/completed/scenario-matrix-implementation/phase-5-readiness-thresholds.md
17
+ * @see docs/exec-plans/active/eliminate-lib-layer.md
18
+ */
19
+ import { evaluateThresholds } from "./thresholds.js";
20
+ // ---------------------------------------------------------------------------
21
+ // Pure functions (exported for testing)
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Format a readiness report as markdown.
25
+ *
26
+ * Pure function — takes a structured report and returns a markdown string.
27
+ */
28
+ export function formatReadinessMarkdown(report) {
29
+ const lines = [];
30
+ const areaLabel = formatAreaLabel(report.area);
31
+ // Header
32
+ const statusEmoji = report.pass ? "✅" : "❌";
33
+ const statusLabel = report.pass ? "READY" : "NOT READY";
34
+ lines.push(`## 🚀 Launch Readiness: ${areaLabel}`);
35
+ lines.push("");
36
+ lines.push(`**Overall:** ${statusEmoji} ${statusLabel} (${fmt(report.score)}/100, threshold: ${report.threshold})`);
37
+ lines.push("");
38
+ // Dimension Checklist
39
+ lines.push("### Dimension Checklist");
40
+ lines.push("");
41
+ lines.push("| Dimension | Score | Threshold | Status |");
42
+ lines.push("|---|---|---|---|");
43
+ for (const dim of report.dimensions) {
44
+ const status = dim.pass ? "✅ Meets threshold" : "❌ Below threshold";
45
+ lines.push(`| ${dim.dimension} | ${fmt(dim.score)} | ${fmt(dim.threshold)} | ${status} |`);
46
+ }
47
+ lines.push("");
48
+ // Ceiling Analysis
49
+ lines.push("### Ceiling Analysis");
50
+ lines.push("");
51
+ lines.push("| Metric | Value | Assessment |");
52
+ lines.push("|---|---|---|");
53
+ const ceilingAssessment = report.ceiling.ceilingScore >= 60
54
+ ? "✅ Docs enable reasonable performance"
55
+ : "⚠️ Below 60 — docs need improvement";
56
+ lines.push(`| Ceiling Score | ${fmt(report.ceiling.ceilingScore)} | ${ceilingAssessment} |`);
57
+ const floorAssessment = report.ceiling.floorScore >= 30
58
+ ? "Model has moderate baseline knowledge"
59
+ : "Model has limited baseline knowledge";
60
+ lines.push(`| Floor Score | ${fmt(report.ceiling.floorScore)} | ${floorAssessment} |`);
61
+ const liftSign = report.ceiling.docLift >= 0 ? "+" : "";
62
+ const liftAssessment = report.ceiling.docLift < 0
63
+ ? "❌ Docs are hurting performance"
64
+ : report.ceiling.docLift >= 10
65
+ ? "✅ Docs add significant value"
66
+ : "⚠️ Docs add minimal value";
67
+ lines.push(`| Doc Lift | ${liftSign}${fmt(report.ceiling.docLift)} | ${liftAssessment} |`);
68
+ lines.push(`| Doc Quality Gap | ${fmt(report.ceiling.docQualityGap)} | ${report.ceiling.docQualityGap > 30 ? "Room for improvement via documentation" : "✅ Docs are high quality"} |`);
69
+ lines.push("");
70
+ // Failing Criteria (only shown when there are violations)
71
+ if (report.violations.length > 0) {
72
+ lines.push("### Failing Criteria");
73
+ for (let i = 0; i < report.violations.length; i++) {
74
+ const v = report.violations[i];
75
+ lines.push(`${i + 1}. **${v.description}**`);
76
+ }
77
+ lines.push("");
78
+ lines.push("### Recommendation");
79
+ const count = report.violations.length;
80
+ const itemWord = count === 1 ? "item" : "items";
81
+ lines.push(`Fix the ${count} ${itemWord} above and re-evaluate.`);
82
+ lines.push("");
83
+ }
84
+ // Gap Analysis (if available)
85
+ if (report.gaps.length > 0) {
86
+ lines.push("### Gap Analysis");
87
+ lines.push("");
88
+ lines.push("| Failure Mode | Est. Lift | Confidence | Remediation |");
89
+ lines.push("|---|---|---|---|");
90
+ for (const gap of report.gaps) {
91
+ const confIcon = gap.confidence === "high"
92
+ ? "🟢"
93
+ : gap.confidence === "medium"
94
+ ? "🟡"
95
+ : "🔴";
96
+ lines.push(`| ${gap.failureMode} | +${gap.estimatedLift.toFixed(1)} | ${confIcon} ${gap.confidence} | ${gap.remediation} |`);
97
+ }
98
+ lines.push("");
99
+ }
100
+ // Historical Progress (if available)
101
+ if (report.history.length > 0) {
102
+ lines.push("### Historical Progress");
103
+ lines.push("");
104
+ lines.push("| Date | Score | Tag |");
105
+ lines.push("|---|---|---|");
106
+ for (const entry of report.history) {
107
+ const date = entry.timestamp.slice(0, 10);
108
+ const tag = entry.tag ?? "—";
109
+ lines.push(`| ${date} | ${fmt(entry.score)} | ${tag} |`);
110
+ }
111
+ // Show current score as the last row
112
+ lines.push(`| ${new Date().toISOString().slice(0, 10)} | ${fmt(report.score)} | *current* |`);
113
+ lines.push("");
114
+ }
115
+ return lines.join("\n");
116
+ }
117
+ /**
118
+ * Generate a structured readiness report for a given feature area.
119
+ *
120
+ * This is a pure function — it takes all data as parameters and produces
121
+ * a structured report. No I/O.
122
+ */
123
+ export function generateReadinessReport(opts) {
124
+ const { area, gapAnalysis, history = [], scoreSummary, thresholdConfig, } = opts;
125
+ // Find the area's scores
126
+ const areaScore = scoreSummary.scores.find((s) => s.feature === area);
127
+ if (!areaScore) {
128
+ throw new Error(`Area "${area}" not found in score summary. Available areas: ${scoreSummary.scores.map((s) => s.feature).join(", ")}`);
129
+ }
130
+ // Evaluate thresholds for the full summary (to get violations)
131
+ const thresholdEvaluation = evaluateThresholds(scoreSummary, thresholdConfig);
132
+ // Filter violations to only this area
133
+ const areaViolations = thresholdEvaluation.violations.filter((v) => v.area === area);
134
+ // Resolve per-area thresholds (with defaults)
135
+ const areaOverrides = thresholdConfig.areas?.[area];
136
+ const compositeThreshold = areaOverrides?.composite ?? thresholdConfig.defaults.composite;
137
+ const dimDefaults = thresholdConfig.defaults.dimensions ?? {};
138
+ const dimOverrides = areaOverrides?.dimensions ?? {};
139
+ // Build dimension checks
140
+ const dimensions = [
141
+ {
142
+ dimension: "Task Completion",
143
+ pass: areaScore.taskCompletion >=
144
+ (dimOverrides["task-completion"] ??
145
+ dimDefaults["task-completion"] ??
146
+ 0),
147
+ score: areaScore.taskCompletion,
148
+ threshold: dimOverrides["task-completion"] ?? dimDefaults["task-completion"] ?? 0,
149
+ },
150
+ {
151
+ dimension: "Code Correctness",
152
+ pass: areaScore.codeCorrectness >=
153
+ (dimOverrides["code-correctness"] ??
154
+ dimDefaults["code-correctness"] ??
155
+ 0),
156
+ score: areaScore.codeCorrectness,
157
+ threshold: dimOverrides["code-correctness"] ??
158
+ dimDefaults["code-correctness"] ??
159
+ 0,
160
+ },
161
+ {
162
+ dimension: "Doc Coverage",
163
+ pass: areaScore.docCoverage >=
164
+ (dimOverrides["doc-coverage"] ?? dimDefaults["doc-coverage"] ?? 0),
165
+ score: areaScore.docCoverage,
166
+ threshold: dimOverrides["doc-coverage"] ?? dimDefaults["doc-coverage"] ?? 0,
167
+ },
168
+ ];
169
+ // Filter gap analysis to this area
170
+ const areaGaps = gapAnalysis?.gaps.filter((g) => g.area === area) ?? [];
171
+ // Ceiling decomposition
172
+ const ceiling = {
173
+ ceilingScore: areaScore.ceilingScore,
174
+ docLift: areaScore.docLift,
175
+ docQualityGap: areaScore.docQualityGap,
176
+ floorScore: areaScore.floorScore,
177
+ };
178
+ const pass = areaViolations.length === 0;
179
+ return {
180
+ area,
181
+ ceiling,
182
+ dimensions,
183
+ gaps: areaGaps,
184
+ history,
185
+ pass,
186
+ score: areaScore.totalScore,
187
+ threshold: compositeThreshold,
188
+ thresholdEvaluation,
189
+ violations: areaViolations,
190
+ };
191
+ }
192
+ // ---------------------------------------------------------------------------
193
+ // Formatting helpers (private)
194
+ // ---------------------------------------------------------------------------
195
+ /** Format a score for display (round to nearest integer) */
196
+ function fmt(n) {
197
+ return String(Math.round(n));
198
+ }
199
+ /** Convert kebab-case area name to title case */
200
+ function formatAreaLabel(area) {
201
+ return area
202
+ .split("-")
203
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
204
+ .join(" ");
205
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * pipeline/release-classification.ts
3
+ *
4
+ * Classifies documents in a content release for evaluation tier assignment.
5
+ *
6
+ * Phase 4a of the Scenario Matrix implementation.
7
+ *
8
+ * Given a ReleaseImpact (added/modified/removed/unchanged) and the task
9
+ * mappings, this module classifies each document as:
10
+ *
11
+ * - **Tier A**: New document in an area that has existing evaluation tasks.
12
+ * The document can be injected into existing task contexts and evaluated.
13
+ * - **Tier B**: New document in an area with no evaluation tasks.
14
+ * Only a directional probe is possible (no scored evaluation).
15
+ * - **not-applicable**: Updated, removed, or unchanged documents (these
16
+ * follow the standard before/after comparison flow from Phase 2).
17
+ *
18
+ * @see docs/exec-plans/completed/scenario-matrix-implementation/phase-4-content-release-integration.md
19
+ */
20
+ import type { ClassifiedReleaseDocument, ProductFeature, ReleaseClassification } from "./types.js";
21
+ import type { ReverseMapping } from "./reverse-mapping.js";
22
+ /**
23
+ * Classify all documents in a content release for evaluation.
24
+ *
25
+ * @param releaseImpact - Added/modified/removed/unchanged slugs from the release
26
+ * @param reverseMapping - Slug → affected area/task mapping
27
+ * @param featureAreas - Set of area names that have task files
28
+ * @param features - Product feature registry (optional, for section-based area inference)
29
+ * @returns Release classification with per-document tier assignment
30
+ */
31
+ export declare function classifyRelease(releaseImpact: {
32
+ added: string[];
33
+ modified: string[];
34
+ removed: string[];
35
+ unchanged?: string[];
36
+ }, reverseMapping: ReverseMapping, featureAreas: Set<string>, features?: ProductFeature[]): ReleaseClassification;
37
+ /**
38
+ * Format a release classification for console output.
39
+ */
40
+ export declare function formatReleaseClassificationConsole(classification: ReleaseClassification): string;
41
+ /**
42
+ * Format a release classification as markdown for PR comments.
43
+ */
44
+ export declare function formatReleaseClassificationMarkdown(classification: ReleaseClassification): string;
45
+ /**
46
+ * Extract Tier A documents — new documents that can be injected into
47
+ * existing task contexts for evaluation.
48
+ */
49
+ export declare function getTierADocuments(classification: ReleaseClassification): ClassifiedReleaseDocument[];
50
+ /**
51
+ * Extract Tier B documents — new documents in areas without tasks,
52
+ * suitable for directional probes only.
53
+ */
54
+ export declare function getTierBDocuments(classification: ReleaseClassification): ClassifiedReleaseDocument[];
@@ -0,0 +1,238 @@
1
+ /**
2
+ * pipeline/release-classification.ts
3
+ *
4
+ * Classifies documents in a content release for evaluation tier assignment.
5
+ *
6
+ * Phase 4a of the Scenario Matrix implementation.
7
+ *
8
+ * Given a ReleaseImpact (added/modified/removed/unchanged) and the task
9
+ * mappings, this module classifies each document as:
10
+ *
11
+ * - **Tier A**: New document in an area that has existing evaluation tasks.
12
+ * The document can be injected into existing task contexts and evaluated.
13
+ * - **Tier B**: New document in an area with no evaluation tasks.
14
+ * Only a directional probe is possible (no scored evaluation).
15
+ * - **not-applicable**: Updated, removed, or unchanged documents (these
16
+ * follow the standard before/after comparison flow from Phase 2).
17
+ *
18
+ * @see docs/exec-plans/completed/scenario-matrix-implementation/phase-4-content-release-integration.md
19
+ */
20
+ // ---------------------------------------------------------------------------
21
+ // Public API
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Classify all documents in a content release for evaluation.
25
+ *
26
+ * @param releaseImpact - Added/modified/removed/unchanged slugs from the release
27
+ * @param reverseMapping - Slug → affected area/task mapping
28
+ * @param featureAreas - Set of area names that have task files
29
+ * @param features - Product feature registry (optional, for section-based area inference)
30
+ * @returns Release classification with per-document tier assignment
31
+ */
32
+ export function classifyRelease(releaseImpact, reverseMapping, featureAreas, features) {
33
+ const documents = [];
34
+ // Build a section → area lookup from features registry
35
+ const sectionToAreas = buildSectionMapping(features);
36
+ // Classify added documents (new in the release)
37
+ for (const slug of releaseImpact.added) {
38
+ const doc = classifyDocument(slug, "new", reverseMapping, featureAreas, sectionToAreas);
39
+ documents.push(doc);
40
+ }
41
+ // Classify modified documents (updated in the release)
42
+ for (const slug of releaseImpact.modified) {
43
+ const doc = classifyDocument(slug, "updated", reverseMapping, featureAreas, sectionToAreas);
44
+ documents.push(doc);
45
+ }
46
+ // Classify removed documents
47
+ for (const slug of releaseImpact.removed) {
48
+ const doc = classifyDocument(slug, "removed", reverseMapping, featureAreas, sectionToAreas);
49
+ documents.push(doc);
50
+ }
51
+ // Compute summary
52
+ const tierA = documents.filter((d) => d.tier === "A").length;
53
+ const tierB = documents.filter((d) => d.tier === "B").length;
54
+ const tracked = documents.filter((d) => d.tracked).length;
55
+ const updated = documents.filter((d) => d.changeType === "updated").length;
56
+ const untracked = documents.filter((d) => !d.tracked).length;
57
+ return {
58
+ documents,
59
+ generatedAt: new Date().toISOString(),
60
+ summary: {
61
+ tierA,
62
+ tierB,
63
+ total: documents.length,
64
+ tracked,
65
+ untracked,
66
+ updated,
67
+ },
68
+ };
69
+ }
70
+ /**
71
+ * Format a release classification for console output.
72
+ */
73
+ export function formatReleaseClassificationConsole(classification) {
74
+ const lines = [];
75
+ const { summary } = classification;
76
+ lines.push("📦 RELEASE DOCUMENT CLASSIFICATION");
77
+ lines.push("");
78
+ lines.push(` ${summary.total} documents: ${summary.tracked} tracked, ${summary.untracked} untracked`);
79
+ if (summary.tierA > 0 || summary.tierB > 0) {
80
+ lines.push(` New documents: ${summary.tierA} Tier A (evaluable), ${summary.tierB} Tier B (probe only)`);
81
+ }
82
+ lines.push("");
83
+ // Group by change type
84
+ const byType = groupByChangeType(classification.documents);
85
+ if (byType.new.length > 0) {
86
+ lines.push(" NEW DOCUMENTS:");
87
+ for (const doc of byType.new) {
88
+ const tierLabel = doc.tier === "A" ? "Tier A" : "Tier B";
89
+ const areas = doc.affectedAreas.length > 0
90
+ ? doc.affectedAreas.join(", ")
91
+ : "(no matching area)";
92
+ lines.push(` ${tierIcon(doc.tier)} ${doc.slug} → ${tierLabel} [${areas}]`);
93
+ }
94
+ lines.push("");
95
+ }
96
+ if (byType.updated.length > 0) {
97
+ lines.push(" UPDATED DOCUMENTS:");
98
+ for (const doc of byType.updated) {
99
+ const tracked = doc.tracked ? "tracked" : "untracked";
100
+ const areas = doc.affectedAreas.length > 0
101
+ ? doc.affectedAreas.join(", ")
102
+ : "(no tasks)";
103
+ lines.push(` 📝 ${doc.slug} → ${tracked} [${areas}]`);
104
+ }
105
+ lines.push("");
106
+ }
107
+ if (byType.removed.length > 0) {
108
+ lines.push(" REMOVED DOCUMENTS:");
109
+ for (const doc of byType.removed) {
110
+ lines.push(` 🗑️ ${doc.slug}`);
111
+ }
112
+ lines.push("");
113
+ }
114
+ return lines.join("\n");
115
+ }
116
+ /**
117
+ * Format a release classification as markdown for PR comments.
118
+ */
119
+ export function formatReleaseClassificationMarkdown(classification) {
120
+ const lines = [];
121
+ const { summary } = classification;
122
+ lines.push("### 📦 Release Document Classification");
123
+ lines.push("");
124
+ lines.push(`**${summary.total} documents**: ${summary.tracked} tracked, ${summary.untracked} untracked`);
125
+ lines.push("");
126
+ if (classification.documents.length > 0) {
127
+ lines.push("| Document | Change | Tier | Areas |");
128
+ lines.push("|----------|--------|------|-------|");
129
+ for (const doc of classification.documents) {
130
+ const tierLabel = doc.tier === "A" ? "🟢 A" : doc.tier === "B" ? "🟡 B" : "—";
131
+ const areas = doc.affectedAreas.length > 0 ? doc.affectedAreas.join(", ") : "—";
132
+ lines.push(`| \`${doc.slug}\` | ${doc.changeType} | ${tierLabel} | ${areas} |`);
133
+ }
134
+ lines.push("");
135
+ }
136
+ return lines.join("\n");
137
+ }
138
+ // ---------------------------------------------------------------------------
139
+ // Formatting
140
+ // ---------------------------------------------------------------------------
141
+ /**
142
+ * Extract Tier A documents — new documents that can be injected into
143
+ * existing task contexts for evaluation.
144
+ */
145
+ export function getTierADocuments(classification) {
146
+ return classification.documents.filter((d) => d.tier === "A");
147
+ }
148
+ /**
149
+ * Extract Tier B documents — new documents in areas without tasks,
150
+ * suitable for directional probes only.
151
+ */
152
+ export function getTierBDocuments(classification) {
153
+ return classification.documents.filter((d) => d.tier === "B");
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ // Internal helpers
157
+ // ---------------------------------------------------------------------------
158
+ /** Build a section → area names lookup from the feature registry */
159
+ function buildSectionMapping(features) {
160
+ const mapping = new Map();
161
+ if (!features)
162
+ return mapping;
163
+ for (const feature of features) {
164
+ if (feature.status !== "covered" || !feature.area)
165
+ continue;
166
+ for (const section of feature.sections) {
167
+ const existing = mapping.get(section) ?? [];
168
+ if (!existing.includes(feature.area)) {
169
+ existing.push(feature.area);
170
+ }
171
+ mapping.set(section, existing);
172
+ }
173
+ }
174
+ return mapping;
175
+ }
176
+ /** Classify a single document */
177
+ function classifyDocument(slug, changeType, reverseMapping, featureAreas, _sectionToAreas) {
178
+ const targets = reverseMapping.get(slug) ?? [];
179
+ const affectedAreas = [...new Set(targets.map((t) => t.area))].sort();
180
+ const tracked = targets.length > 0;
181
+ // Determine tier for new documents
182
+ let tier = "not-applicable";
183
+ if (changeType === "new") {
184
+ if (affectedAreas.length > 0) {
185
+ // New doc matches existing tasks → Tier A
186
+ tier = "A";
187
+ }
188
+ else {
189
+ // Check if any feature area exists for this document
190
+ // Try to infer area from slug prefix
191
+ const inferredArea = inferAreaFromSlug(slug, featureAreas);
192
+ if (inferredArea) {
193
+ tier = "A";
194
+ affectedAreas.push(inferredArea);
195
+ }
196
+ else {
197
+ tier = "B";
198
+ }
199
+ }
200
+ }
201
+ return {
202
+ affectedAreas,
203
+ changeType,
204
+ slug,
205
+ tier,
206
+ tracked,
207
+ };
208
+ }
209
+ /** Group documents by change type */
210
+ function groupByChangeType(docs) {
211
+ return {
212
+ new: docs.filter((d) => d.changeType === "new"),
213
+ removed: docs.filter((d) => d.changeType === "removed"),
214
+ updated: docs.filter((d) => d.changeType === "updated"),
215
+ };
216
+ }
217
+ /** Try to infer a feature area from a document slug prefix */
218
+ function inferAreaFromSlug(slug, featureAreas) {
219
+ // Try progressively shorter prefixes of the slug
220
+ const parts = slug.split("-");
221
+ for (let i = parts.length; i >= 1; i--) {
222
+ const candidate = parts.slice(0, i).join("-");
223
+ if (featureAreas.has(candidate))
224
+ return candidate;
225
+ }
226
+ return undefined;
227
+ }
228
+ /** Get icon for a tier */
229
+ function tierIcon(tier) {
230
+ switch (tier) {
231
+ case "A":
232
+ return "🟢";
233
+ case "B":
234
+ return "🟡";
235
+ case "not-applicable":
236
+ return "⚪";
237
+ }
238
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * pipeline/release-report.ts
3
+ *
4
+ * Cross-area release impact reports.
5
+ *
6
+ * Phase 4c of the Scenario Matrix implementation.
7
+ *
8
+ * Consolidates impact data from multi-area content releases into a single
9
+ * report that combines document classification (4a), before/after deltas (2b),
10
+ * attribution (2c), and probe results (4b) into the document × area × task
11
+ * impact matrix specified by Scenario 2.4.
12
+ *
13
+ * @see docs/exec-plans/completed/scenario-matrix-implementation/phase-4-content-release-integration.md
14
+ */
15
+ import type { AttributionReport, ComparisonReport, ProbeResult, ReleaseClassification, ReleaseImpactReport } from "./types.js";
16
+ /**
17
+ * Build a cross-area release impact report.
18
+ *
19
+ * Combines classification, comparison, attribution, and probe data into
20
+ * a single consolidated report.
21
+ *
22
+ * @param classification - Document classification from Phase 4a
23
+ * @param comparison - Before/after comparison (if available)
24
+ * @param attribution - Per-document attribution (if available)
25
+ * @param probes - Tier B probe results (if any)
26
+ * @param noiseThreshold - Threshold for "unchanged" classification
27
+ * @returns Consolidated release impact report
28
+ */
29
+ export declare function buildReleaseImpactReport(classification: ReleaseClassification, comparison?: ComparisonReport, attribution?: AttributionReport, probes?: ProbeResult[], noiseThreshold?: number): ReleaseImpactReport;
30
+ /**
31
+ * Format a release impact report for console output.
32
+ */
33
+ export declare function formatReleaseImpactConsole(report: ReleaseImpactReport): string;
34
+ /**
35
+ * Format a release impact report as markdown.
36
+ */
37
+ export declare function formatReleaseImpactMarkdown(report: ReleaseImpactReport): string;