oh-my-knowledge 0.32.0 → 0.34.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 (729) hide show
  1. package/README.md +29 -14
  2. package/README.zh.md +32 -17
  3. package/dist/analysis/coverage-analyzer.d.ts +0 -1
  4. package/dist/analysis/coverage-analyzer.js +0 -1
  5. package/dist/analysis/failure-clusterer.d.ts +0 -1
  6. package/dist/analysis/failure-clusterer.js +0 -1
  7. package/dist/analysis/gap-analyzer.d.ts +0 -1
  8. package/dist/analysis/gap-analyzer.js +0 -1
  9. package/dist/analysis/hedging-classifier.d.ts +0 -1
  10. package/dist/analysis/hedging-classifier.js +1 -2
  11. package/dist/analysis/report-diagnostics.d.ts +0 -1
  12. package/dist/analysis/report-diagnostics.js +0 -1
  13. package/dist/analysis/sample-diagnostics.d.ts +1 -2
  14. package/dist/analysis/sample-diagnostics.js +18 -19
  15. package/dist/analysis/saturation.d.ts +8 -1
  16. package/dist/analysis/saturation.js +12 -5
  17. package/dist/assets/agent-skills/omk/SKILL.md +197 -0
  18. package/dist/assets/agent-skills/omk/references/commands.md +547 -0
  19. package/dist/authoring/evolver.d.ts +169 -4
  20. package/dist/authoring/evolver.js +287 -15
  21. package/dist/authoring/generator.d.ts +29 -2
  22. package/dist/authoring/generator.js +113 -1
  23. package/dist/authoring/sample-fixer.d.ts +0 -1
  24. package/dist/authoring/sample-fixer.js +0 -1
  25. package/dist/cli/commands/doctor.d.ts +2 -1
  26. package/dist/cli/commands/doctor.js +24 -6
  27. package/dist/cli/commands/eval/gold/compare.d.ts +0 -1
  28. package/dist/cli/commands/eval/gold/compare.js +0 -1
  29. package/dist/cli/commands/eval/gold/index.d.ts +0 -1
  30. package/dist/cli/commands/eval/gold/index.js +0 -1
  31. package/dist/cli/commands/eval/gold/init.d.ts +0 -1
  32. package/dist/cli/commands/eval/gold/init.js +0 -1
  33. package/dist/cli/commands/eval/gold/validate.d.ts +0 -1
  34. package/dist/cli/commands/eval/gold/validate.js +0 -1
  35. package/dist/cli/commands/eval/index.d.ts +2 -1
  36. package/dist/cli/commands/eval/index.js +23 -11
  37. package/dist/cli/commands/evolve.d.ts +7 -1
  38. package/dist/cli/commands/evolve.js +93 -6
  39. package/dist/cli/commands/init.d.ts +0 -1
  40. package/dist/cli/commands/init.js +0 -1
  41. package/dist/cli/commands/install.d.ts +22 -0
  42. package/dist/cli/commands/install.js +411 -0
  43. package/dist/cli/commands/observe/inbox.d.ts +0 -1
  44. package/dist/cli/commands/observe/inbox.js +0 -1
  45. package/dist/cli/commands/observe/index.d.ts +0 -1
  46. package/dist/cli/commands/observe/index.js +6 -3
  47. package/dist/cli/commands/observe/ingest.d.ts +0 -1
  48. package/dist/cli/commands/observe/ingest.js +0 -1
  49. package/dist/cli/commands/observe/show.d.ts +0 -1
  50. package/dist/cli/commands/observe/show.js +0 -1
  51. package/dist/cli/commands/sample.d.ts +2 -1
  52. package/dist/cli/commands/sample.js +100 -9
  53. package/dist/cli/commands/studio.d.ts +0 -1
  54. package/dist/cli/commands/studio.js +0 -1
  55. package/dist/cli/index.d.ts +0 -1
  56. package/dist/cli/index.js +1 -2
  57. package/dist/cli/lib/cli-exit.d.ts +0 -1
  58. package/dist/cli/lib/cli-exit.js +0 -1
  59. package/dist/cli/lib/cmd-flags.d.ts +11 -1
  60. package/dist/cli/lib/cmd-flags.js +0 -1
  61. package/dist/cli/lib/i18n-dict/common.d.ts +1 -2
  62. package/dist/cli/lib/i18n-dict/common.js +18 -3
  63. package/dist/cli/lib/i18n-dict/evolve.d.ts +1 -2
  64. package/dist/cli/lib/i18n-dict/evolve.js +24 -1
  65. package/dist/cli/lib/i18n-dict/gen.d.ts +0 -1
  66. package/dist/cli/lib/i18n-dict/gen.js +0 -1
  67. package/dist/cli/lib/i18n-dict/help.d.ts +0 -1
  68. package/dist/cli/lib/i18n-dict/help.js +0 -1
  69. package/dist/cli/lib/i18n-dict/init.d.ts +0 -1
  70. package/dist/cli/lib/i18n-dict/init.js +0 -1
  71. package/dist/cli/lib/i18n-dict/install.d.ts +3 -0
  72. package/dist/cli/lib/i18n-dict/install.js +90 -0
  73. package/dist/cli/lib/i18n-dict/run.d.ts +0 -1
  74. package/dist/cli/lib/i18n-dict/run.js +0 -1
  75. package/dist/cli/lib/i18n-dict/types.d.ts +0 -1
  76. package/dist/cli/lib/i18n-dict/types.js +0 -1
  77. package/dist/cli/lib/i18n-dict.d.ts +2 -2
  78. package/dist/cli/lib/i18n-dict.js +2 -1
  79. package/dist/cli/lib/i18n.d.ts +0 -1
  80. package/dist/cli/lib/i18n.js +0 -1
  81. package/dist/cli/lib/parse-run-config/judge-models.d.ts +0 -1
  82. package/dist/cli/lib/parse-run-config/judge-models.js +0 -1
  83. package/dist/cli/lib/parse-run-config/samples-discovery.d.ts +0 -1
  84. package/dist/cli/lib/parse-run-config/samples-discovery.js +1 -4
  85. package/dist/cli/lib/parse-run-config/variant-resolution.d.ts +8 -4
  86. package/dist/cli/lib/parse-run-config/variant-resolution.js +46 -14
  87. package/dist/cli/lib/parse-run-config.d.ts +0 -1
  88. package/dist/cli/lib/parse-run-config.js +1 -2
  89. package/dist/cli/lib/progress.d.ts +0 -1
  90. package/dist/cli/lib/progress.js +0 -1
  91. package/dist/cli/lib/resolve-skill-input.d.ts +0 -1
  92. package/dist/cli/lib/resolve-skill-input.js +7 -6
  93. package/dist/cli/lib/run-tally.d.ts +0 -1
  94. package/dist/cli/lib/run-tally.js +1 -2
  95. package/dist/cli/lib/shared.d.ts +0 -1
  96. package/dist/cli/lib/shared.js +1 -2
  97. package/dist/cli/lib/update-check.d.ts +65 -1
  98. package/dist/cli/lib/update-check.js +220 -32
  99. package/dist/cli/lib/update-fetch-worker.d.ts +1 -0
  100. package/dist/cli/lib/update-fetch-worker.js +34 -0
  101. package/dist/cli/oclif/base-command.d.ts +0 -1
  102. package/dist/cli/oclif/base-command.js +0 -1
  103. package/dist/cli/oclif/help.d.ts +0 -1
  104. package/dist/cli/oclif/help.js +0 -1
  105. package/dist/cli/oclif/i18n.d.ts +0 -1
  106. package/dist/cli/oclif/i18n.js +0 -1
  107. package/dist/cli/oclif/parsers.d.ts +0 -1
  108. package/dist/cli/oclif/parsers.js +0 -1
  109. package/dist/cli/oclif/projection.d.ts +0 -1
  110. package/dist/cli/oclif/projection.js +0 -1
  111. package/dist/cli/oclif/run.d.ts +0 -1
  112. package/dist/cli/oclif/run.js +0 -1
  113. package/dist/diagnosis/observe-mapper.d.ts +2 -3
  114. package/dist/diagnosis/observe-mapper.js +6 -7
  115. package/dist/diagnosis/observe-producer.d.ts +0 -1
  116. package/dist/diagnosis/observe-producer.js +3 -4
  117. package/dist/diagnosis/studio-projection.d.ts +0 -1
  118. package/dist/diagnosis/studio-projection.js +0 -1
  119. package/dist/diagnosis/types.d.ts +0 -1
  120. package/dist/diagnosis/types.js +0 -1
  121. package/dist/doctor/fixer.d.ts +0 -1
  122. package/dist/doctor/fixer.js +0 -1
  123. package/dist/doctor/health/builtin-dimensions.d.ts +0 -1
  124. package/dist/doctor/health/builtin-dimensions.js +0 -1
  125. package/dist/doctor/health/composer.d.ts +0 -1
  126. package/dist/doctor/health/composer.js +1 -2
  127. package/dist/doctor/health/dimension-registry.d.ts +0 -1
  128. package/dist/doctor/health/dimension-registry.js +0 -1
  129. package/dist/doctor/health/dimension-spec.d.ts +0 -1
  130. package/dist/doctor/health/dimension-spec.js +0 -1
  131. package/dist/doctor/health/load-custom-dimensions.d.ts +1 -0
  132. package/dist/doctor/health/load-custom-dimensions.js +30 -0
  133. package/dist/doctor/health/parser.d.ts +0 -1
  134. package/dist/doctor/health/parser.js +0 -1
  135. package/dist/doctor/health/prompt-builder.d.ts +0 -1
  136. package/dist/doctor/health/prompt-builder.js +0 -1
  137. package/dist/doctor/health/register.d.ts +0 -1
  138. package/dist/doctor/health/register.js +0 -1
  139. package/dist/doctor/index.d.ts +0 -1
  140. package/dist/doctor/index.js +1 -2
  141. package/dist/doctor/messages.d.ts +0 -1
  142. package/dist/doctor/messages.js +1 -2
  143. package/dist/doctor/preflight.d.ts +0 -1
  144. package/dist/doctor/preflight.js +0 -1
  145. package/dist/doctor/renderer.d.ts +0 -1
  146. package/dist/doctor/renderer.js +0 -1
  147. package/dist/doctor/rules.d.ts +0 -1
  148. package/dist/doctor/rules.js +0 -1
  149. package/dist/eval-core/bootstrap.d.ts +8 -1
  150. package/dist/eval-core/bootstrap.js +11 -4
  151. package/dist/eval-core/cache.d.ts +0 -1
  152. package/dist/eval-core/cache.js +0 -1
  153. package/dist/eval-core/comparability.d.ts +0 -1
  154. package/dist/eval-core/comparability.js +3 -4
  155. package/dist/eval-core/dependency-checker.d.ts +0 -1
  156. package/dist/eval-core/dependency-checker.js +2 -2
  157. package/dist/eval-core/evaluation-execution.d.ts +0 -1
  158. package/dist/eval-core/evaluation-execution.js +0 -1
  159. package/dist/eval-core/evaluation-job.d.ts +0 -1
  160. package/dist/eval-core/evaluation-job.js +0 -1
  161. package/dist/eval-core/evaluation-reporting.d.ts +0 -1
  162. package/dist/eval-core/evaluation-reporting.js +9 -8
  163. package/dist/eval-core/execution-strategy.d.ts +0 -1
  164. package/dist/eval-core/execution-strategy.js +6 -3
  165. package/dist/eval-core/fact-checker.d.ts +0 -1
  166. package/dist/eval-core/fact-checker.js +0 -1
  167. package/dist/eval-core/layer-gates.d.ts +0 -1
  168. package/dist/eval-core/layer-gates.js +0 -1
  169. package/dist/eval-core/mocks-runtime.d.ts +0 -1
  170. package/dist/eval-core/mocks-runtime.js +0 -1
  171. package/dist/eval-core/schema.d.ts +0 -1
  172. package/dist/eval-core/schema.js +0 -1
  173. package/dist/eval-core/statistics.d.ts +0 -1
  174. package/dist/eval-core/statistics.js +0 -1
  175. package/dist/eval-core/task-planner.d.ts +0 -1
  176. package/dist/eval-core/task-planner.js +0 -1
  177. package/dist/eval-core/verdict.d.ts +21 -4
  178. package/dist/eval-core/verdict.js +54 -5
  179. package/dist/eval-workflows/batch-evaluation-workflow.d.ts +18 -3
  180. package/dist/eval-workflows/batch-evaluation-workflow.js +31 -15
  181. package/dist/eval-workflows/evaluation-pipeline/preflight-warnings.d.ts +0 -1
  182. package/dist/eval-workflows/evaluation-pipeline/preflight-warnings.js +0 -1
  183. package/dist/eval-workflows/evaluation-pipeline/report-finalize.d.ts +0 -1
  184. package/dist/eval-workflows/evaluation-pipeline/report-finalize.js +0 -1
  185. package/dist/eval-workflows/evaluation-pipeline/run-state.d.ts +0 -1
  186. package/dist/eval-workflows/evaluation-pipeline/run-state.js +0 -1
  187. package/dist/eval-workflows/evaluation-pipeline/test-set-hash.d.ts +0 -1
  188. package/dist/eval-workflows/evaluation-pipeline/test-set-hash.js +0 -1
  189. package/dist/eval-workflows/evaluation-pipeline.d.ts +0 -1
  190. package/dist/eval-workflows/evaluation-pipeline.js +0 -1
  191. package/dist/eval-workflows/evaluation-preparation.d.ts +1 -5
  192. package/dist/eval-workflows/evaluation-preparation.js +20 -16
  193. package/dist/eval-workflows/messages.d.ts +0 -1
  194. package/dist/eval-workflows/messages.js +0 -1
  195. package/dist/eval-workflows/run-evaluation.d.ts +4 -9
  196. package/dist/eval-workflows/run-evaluation.js +16 -26
  197. package/dist/executors/anthropic-api.d.ts +0 -1
  198. package/dist/executors/anthropic-api.js +1 -2
  199. package/dist/executors/claude-cli.d.ts +0 -1
  200. package/dist/executors/claude-cli.js +0 -1
  201. package/dist/executors/claude-sdk-trace.d.ts +0 -1
  202. package/dist/executors/claude-sdk-trace.js +0 -1
  203. package/dist/executors/claude-sdk.d.ts +0 -1
  204. package/dist/executors/claude-sdk.js +0 -1
  205. package/dist/executors/codex-cli-trace.d.ts +0 -1
  206. package/dist/executors/codex-cli-trace.js +0 -1
  207. package/dist/executors/codex-cli.d.ts +0 -1
  208. package/dist/executors/codex-cli.js +0 -1
  209. package/dist/executors/codex-sdk.d.ts +0 -1
  210. package/dist/executors/codex-sdk.js +0 -1
  211. package/dist/executors/gemini.d.ts +0 -1
  212. package/dist/executors/gemini.js +0 -1
  213. package/dist/executors/index.d.ts +0 -1
  214. package/dist/executors/index.js +0 -1
  215. package/dist/executors/openai-api.d.ts +0 -1
  216. package/dist/executors/openai-api.js +0 -1
  217. package/dist/executors/runtime-fingerprint.d.ts +0 -1
  218. package/dist/executors/runtime-fingerprint.js +2 -3
  219. package/dist/executors/script.d.ts +0 -1
  220. package/dist/executors/script.js +0 -1
  221. package/dist/executors/shared.d.ts +0 -2
  222. package/dist/executors/shared.js +0 -1
  223. package/dist/grading/assertions.d.ts +0 -1
  224. package/dist/grading/assertions.js +0 -1
  225. package/dist/grading/debias-validate.d.ts +0 -1
  226. package/dist/grading/debias-validate.js +0 -1
  227. package/dist/grading/diagnostic.d.ts +0 -1
  228. package/dist/grading/diagnostic.js +0 -1
  229. package/dist/grading/gold-cli.d.ts +0 -1
  230. package/dist/grading/gold-cli.js +0 -1
  231. package/dist/grading/gold-dataset.d.ts +0 -1
  232. package/dist/grading/gold-dataset.js +0 -1
  233. package/dist/grading/human-gold.d.ts +0 -1
  234. package/dist/grading/human-gold.js +0 -1
  235. package/dist/grading/index.d.ts +0 -1
  236. package/dist/grading/index.js +0 -1
  237. package/dist/grading/judge.d.ts +0 -1
  238. package/dist/grading/judge.js +0 -1
  239. package/dist/grading/layered-scores.d.ts +0 -1
  240. package/dist/grading/layered-scores.js +0 -1
  241. package/dist/inputs/eval-config.d.ts +0 -1
  242. package/dist/inputs/eval-config.js +3 -2
  243. package/dist/inputs/load-samples.d.ts +0 -1
  244. package/dist/inputs/load-samples.js +0 -1
  245. package/dist/inputs/mcp-resolver.d.ts +0 -1
  246. package/dist/inputs/mcp-resolver.js +0 -1
  247. package/dist/inputs/skill-loader.d.ts +99 -7
  248. package/dist/inputs/skill-loader.js +325 -45
  249. package/dist/inputs/source-resolver.d.ts +28 -0
  250. package/dist/inputs/source-resolver.js +125 -0
  251. package/dist/inputs/url-fetcher.d.ts +0 -1
  252. package/dist/inputs/url-fetcher.js +0 -1
  253. package/dist/managed/index.d.ts +5 -0
  254. package/dist/managed/index.js +5 -0
  255. package/dist/managed/store.d.ts +76 -0
  256. package/dist/managed/store.js +260 -0
  257. package/dist/observability/experience-frontmatter.d.ts +0 -1
  258. package/dist/observability/experience-frontmatter.js +0 -1
  259. package/dist/observability/experience.d.ts +1 -2
  260. package/dist/observability/experience.js +1 -2
  261. package/dist/observability/feedback-matchers.d.ts +0 -1
  262. package/dist/observability/feedback-matchers.js +0 -1
  263. package/dist/observability/feedback-projection.d.ts +0 -1
  264. package/dist/observability/feedback-projection.js +0 -1
  265. package/dist/observability/inbox-view-model.d.ts +0 -1
  266. package/dist/observability/inbox-view-model.js +0 -1
  267. package/dist/observability/inbox.d.ts +0 -1
  268. package/dist/observability/inbox.js +2 -3
  269. package/dist/observability/problem-patterns.d.ts +0 -1
  270. package/dist/observability/problem-patterns.js +0 -1
  271. package/dist/observability/resolved-review.d.ts +0 -1
  272. package/dist/observability/resolved-review.js +4 -5
  273. package/dist/observability/review-state.d.ts +0 -1
  274. package/dist/observability/review-state.js +3 -4
  275. package/dist/observability/skill-chain-advisories.d.ts +0 -1
  276. package/dist/observability/skill-chain-advisories.js +0 -1
  277. package/dist/observability/skill-chain.d.ts +0 -1
  278. package/dist/observability/skill-chain.js +5 -6
  279. package/dist/observability/skill-health-analyzer.d.ts +13 -1
  280. package/dist/observability/skill-health-analyzer.js +17 -3
  281. package/dist/observability/soft-standards/constants.d.ts +0 -1
  282. package/dist/observability/soft-standards/constants.js +0 -1
  283. package/dist/observability/soft-standards/index.d.ts +0 -1
  284. package/dist/observability/soft-standards/index.js +0 -1
  285. package/dist/observability/soft-standards/llm-extractor.d.ts +0 -1
  286. package/dist/observability/soft-standards/llm-extractor.js +7 -8
  287. package/dist/observability/soft-standards/runtime-evaluator.d.ts +0 -1
  288. package/dist/observability/soft-standards/runtime-evaluator.js +2 -3
  289. package/dist/observability/soft-standards/skill-standards-store.d.ts +0 -1
  290. package/dist/observability/soft-standards/skill-standards-store.js +5 -6
  291. package/dist/observability/soft-standards/types.d.ts +10 -11
  292. package/dist/observability/soft-standards/types.js +0 -1
  293. package/dist/observability/text-signals.d.ts +0 -1
  294. package/dist/observability/text-signals.js +0 -1
  295. package/dist/observability/trace-adapter.d.ts +0 -1
  296. package/dist/observability/trace-adapter.js +0 -1
  297. package/dist/observability/trace-attribution.d.ts +0 -1
  298. package/dist/observability/trace-attribution.js +0 -1
  299. package/dist/observability/trace-segmenter.d.ts +0 -1
  300. package/dist/observability/trace-segmenter.js +0 -1
  301. package/dist/observability/trace-source.d.ts +0 -1
  302. package/dist/observability/trace-source.js +0 -1
  303. package/dist/renderer/html-renderer.d.ts +0 -1
  304. package/dist/renderer/html-renderer.js +4 -5
  305. package/dist/renderer/layout.d.ts +0 -1
  306. package/dist/renderer/layout.js +2 -1
  307. package/dist/renderer/observation-inbox/helpers.d.ts +0 -1
  308. package/dist/renderer/observation-inbox/helpers.js +0 -1
  309. package/dist/renderer/observation-inbox/styles.d.ts +0 -1
  310. package/dist/renderer/observation-inbox/styles.js +0 -1
  311. package/dist/renderer/observation-inbox-renderer.d.ts +0 -1
  312. package/dist/renderer/observation-inbox-renderer.js +13 -14
  313. package/dist/renderer/skill-detail-renderer.d.ts +0 -1
  314. package/dist/renderer/skill-detail-renderer.js +101 -23
  315. package/dist/renderer/skill-health-renderer.d.ts +0 -1
  316. package/dist/renderer/skill-health-renderer.js +33 -5
  317. package/dist/renderer/skill-list-renderer.d.ts +0 -1
  318. package/dist/renderer/skill-list-renderer.js +18 -7
  319. package/dist/renderer/summary.d.ts +0 -1
  320. package/dist/renderer/summary.js +21 -10
  321. package/dist/renderer/table.d.ts +0 -1
  322. package/dist/renderer/table.js +0 -1
  323. package/dist/renderer/test-view.d.ts +0 -1
  324. package/dist/renderer/test-view.js +0 -1
  325. package/dist/renderer/trends.d.ts +0 -1
  326. package/dist/renderer/trends.js +0 -1
  327. package/dist/server/job-store.d.ts +0 -1
  328. package/dist/server/job-store.js +0 -1
  329. package/dist/server/report-server.d.ts +0 -1
  330. package/dist/server/report-server.js +10 -4
  331. package/dist/server/report-store.d.ts +1 -2
  332. package/dist/server/report-store.js +6 -7
  333. package/dist/server/skill-index.d.ts +0 -1
  334. package/dist/server/skill-index.js +7 -5
  335. package/dist/server/skill-insights.d.ts +0 -1
  336. package/dist/server/skill-insights.js +41 -14
  337. package/dist/shared/hard-rules.d.ts +0 -1
  338. package/dist/shared/hard-rules.js +0 -1
  339. package/dist/shared/llm-prompts/index.d.ts +0 -1
  340. package/dist/shared/llm-prompts/index.js +0 -1
  341. package/dist/shared/llm-prompts/skill-health.d.ts +0 -1
  342. package/dist/shared/llm-prompts/skill-health.js +0 -1
  343. package/dist/shared/time.d.ts +0 -1
  344. package/dist/shared/time.js +0 -1
  345. package/dist/shared/tool-search.d.ts +0 -1
  346. package/dist/shared/tool-search.js +0 -1
  347. package/dist/types/dependencies.d.ts +0 -1
  348. package/dist/types/dependencies.js +0 -1
  349. package/dist/types/diagnosis.d.ts +0 -1
  350. package/dist/types/diagnosis.js +0 -1
  351. package/dist/types/doctor.d.ts +4 -5
  352. package/dist/types/doctor.js +2 -3
  353. package/dist/types/eval.d.ts +2 -1
  354. package/dist/types/eval.js +0 -1
  355. package/dist/types/executor.d.ts +1 -2
  356. package/dist/types/executor.js +0 -1
  357. package/dist/types/index.d.ts +1 -1
  358. package/dist/types/index.js +1 -1
  359. package/dist/types/judge.d.ts +0 -1
  360. package/dist/types/judge.js +0 -1
  361. package/dist/types/managed.d.ts +85 -0
  362. package/dist/types/managed.js +1 -0
  363. package/dist/types/observability.d.ts +5 -6
  364. package/dist/types/observability.js +0 -1
  365. package/dist/types/report.d.ts +2 -3
  366. package/dist/types/report.js +0 -1
  367. package/dist/types/shared.d.ts +0 -1
  368. package/dist/types/shared.js +0 -1
  369. package/dist/types/skill-index.d.ts +3 -1
  370. package/dist/types/skill-index.js +0 -1
  371. package/dist/types/storage.d.ts +0 -1
  372. package/dist/types/storage.js +0 -1
  373. package/dist/util/safe-slice.d.ts +0 -1
  374. package/dist/util/safe-slice.js +0 -1
  375. package/package.json +10 -5
  376. package/dist/analysis/coverage-analyzer.d.ts.map +0 -1
  377. package/dist/analysis/coverage-analyzer.js.map +0 -1
  378. package/dist/analysis/failure-clusterer.d.ts.map +0 -1
  379. package/dist/analysis/failure-clusterer.js.map +0 -1
  380. package/dist/analysis/gap-analyzer.d.ts.map +0 -1
  381. package/dist/analysis/gap-analyzer.js.map +0 -1
  382. package/dist/analysis/hedging-classifier.d.ts.map +0 -1
  383. package/dist/analysis/hedging-classifier.js.map +0 -1
  384. package/dist/analysis/report-diagnostics.d.ts.map +0 -1
  385. package/dist/analysis/report-diagnostics.js.map +0 -1
  386. package/dist/analysis/sample-diagnostics.d.ts.map +0 -1
  387. package/dist/analysis/sample-diagnostics.js.map +0 -1
  388. package/dist/analysis/saturation.d.ts.map +0 -1
  389. package/dist/analysis/saturation.js.map +0 -1
  390. package/dist/authoring/evolver.d.ts.map +0 -1
  391. package/dist/authoring/evolver.js.map +0 -1
  392. package/dist/authoring/generator.d.ts.map +0 -1
  393. package/dist/authoring/generator.js.map +0 -1
  394. package/dist/authoring/sample-fixer.d.ts.map +0 -1
  395. package/dist/authoring/sample-fixer.js.map +0 -1
  396. package/dist/cli/commands/doctor.d.ts.map +0 -1
  397. package/dist/cli/commands/doctor.js.map +0 -1
  398. package/dist/cli/commands/eval/gold/compare.d.ts.map +0 -1
  399. package/dist/cli/commands/eval/gold/compare.js.map +0 -1
  400. package/dist/cli/commands/eval/gold/index.d.ts.map +0 -1
  401. package/dist/cli/commands/eval/gold/index.js.map +0 -1
  402. package/dist/cli/commands/eval/gold/init.d.ts.map +0 -1
  403. package/dist/cli/commands/eval/gold/init.js.map +0 -1
  404. package/dist/cli/commands/eval/gold/validate.d.ts.map +0 -1
  405. package/dist/cli/commands/eval/gold/validate.js.map +0 -1
  406. package/dist/cli/commands/eval/index.d.ts.map +0 -1
  407. package/dist/cli/commands/eval/index.js.map +0 -1
  408. package/dist/cli/commands/evolve.d.ts.map +0 -1
  409. package/dist/cli/commands/evolve.js.map +0 -1
  410. package/dist/cli/commands/init.d.ts.map +0 -1
  411. package/dist/cli/commands/init.js.map +0 -1
  412. package/dist/cli/commands/observe/inbox.d.ts.map +0 -1
  413. package/dist/cli/commands/observe/inbox.js.map +0 -1
  414. package/dist/cli/commands/observe/index.d.ts.map +0 -1
  415. package/dist/cli/commands/observe/index.js.map +0 -1
  416. package/dist/cli/commands/observe/ingest.d.ts.map +0 -1
  417. package/dist/cli/commands/observe/ingest.js.map +0 -1
  418. package/dist/cli/commands/observe/show.d.ts.map +0 -1
  419. package/dist/cli/commands/observe/show.js.map +0 -1
  420. package/dist/cli/commands/sample.d.ts.map +0 -1
  421. package/dist/cli/commands/sample.js.map +0 -1
  422. package/dist/cli/commands/studio.d.ts.map +0 -1
  423. package/dist/cli/commands/studio.js.map +0 -1
  424. package/dist/cli/index.d.ts.map +0 -1
  425. package/dist/cli/index.js.map +0 -1
  426. package/dist/cli/lib/cli-exit.d.ts.map +0 -1
  427. package/dist/cli/lib/cli-exit.js.map +0 -1
  428. package/dist/cli/lib/cmd-flags.d.ts.map +0 -1
  429. package/dist/cli/lib/cmd-flags.js.map +0 -1
  430. package/dist/cli/lib/i18n-dict/common.d.ts.map +0 -1
  431. package/dist/cli/lib/i18n-dict/common.js.map +0 -1
  432. package/dist/cli/lib/i18n-dict/evolve.d.ts.map +0 -1
  433. package/dist/cli/lib/i18n-dict/evolve.js.map +0 -1
  434. package/dist/cli/lib/i18n-dict/gen.d.ts.map +0 -1
  435. package/dist/cli/lib/i18n-dict/gen.js.map +0 -1
  436. package/dist/cli/lib/i18n-dict/help.d.ts.map +0 -1
  437. package/dist/cli/lib/i18n-dict/help.js.map +0 -1
  438. package/dist/cli/lib/i18n-dict/init.d.ts.map +0 -1
  439. package/dist/cli/lib/i18n-dict/init.js.map +0 -1
  440. package/dist/cli/lib/i18n-dict/run.d.ts.map +0 -1
  441. package/dist/cli/lib/i18n-dict/run.js.map +0 -1
  442. package/dist/cli/lib/i18n-dict/types.d.ts.map +0 -1
  443. package/dist/cli/lib/i18n-dict/types.js.map +0 -1
  444. package/dist/cli/lib/i18n-dict.d.ts.map +0 -1
  445. package/dist/cli/lib/i18n-dict.js.map +0 -1
  446. package/dist/cli/lib/i18n.d.ts.map +0 -1
  447. package/dist/cli/lib/i18n.js.map +0 -1
  448. package/dist/cli/lib/parse-run-config/judge-models.d.ts.map +0 -1
  449. package/dist/cli/lib/parse-run-config/judge-models.js.map +0 -1
  450. package/dist/cli/lib/parse-run-config/samples-discovery.d.ts.map +0 -1
  451. package/dist/cli/lib/parse-run-config/samples-discovery.js.map +0 -1
  452. package/dist/cli/lib/parse-run-config/variant-resolution.d.ts.map +0 -1
  453. package/dist/cli/lib/parse-run-config/variant-resolution.js.map +0 -1
  454. package/dist/cli/lib/parse-run-config.d.ts.map +0 -1
  455. package/dist/cli/lib/parse-run-config.js.map +0 -1
  456. package/dist/cli/lib/progress.d.ts.map +0 -1
  457. package/dist/cli/lib/progress.js.map +0 -1
  458. package/dist/cli/lib/resolve-skill-input.d.ts.map +0 -1
  459. package/dist/cli/lib/resolve-skill-input.js.map +0 -1
  460. package/dist/cli/lib/run-tally.d.ts.map +0 -1
  461. package/dist/cli/lib/run-tally.js.map +0 -1
  462. package/dist/cli/lib/shared.d.ts.map +0 -1
  463. package/dist/cli/lib/shared.js.map +0 -1
  464. package/dist/cli/lib/update-check.d.ts.map +0 -1
  465. package/dist/cli/lib/update-check.js.map +0 -1
  466. package/dist/cli/oclif/base-command.d.ts.map +0 -1
  467. package/dist/cli/oclif/base-command.js.map +0 -1
  468. package/dist/cli/oclif/help.d.ts.map +0 -1
  469. package/dist/cli/oclif/help.js.map +0 -1
  470. package/dist/cli/oclif/i18n.d.ts.map +0 -1
  471. package/dist/cli/oclif/i18n.js.map +0 -1
  472. package/dist/cli/oclif/parsers.d.ts.map +0 -1
  473. package/dist/cli/oclif/parsers.js.map +0 -1
  474. package/dist/cli/oclif/projection.d.ts.map +0 -1
  475. package/dist/cli/oclif/projection.js.map +0 -1
  476. package/dist/cli/oclif/run.d.ts.map +0 -1
  477. package/dist/cli/oclif/run.js.map +0 -1
  478. package/dist/diagnosis/observe-mapper.d.ts.map +0 -1
  479. package/dist/diagnosis/observe-mapper.js.map +0 -1
  480. package/dist/diagnosis/observe-producer.d.ts.map +0 -1
  481. package/dist/diagnosis/observe-producer.js.map +0 -1
  482. package/dist/diagnosis/studio-projection.d.ts.map +0 -1
  483. package/dist/diagnosis/studio-projection.js.map +0 -1
  484. package/dist/diagnosis/types.d.ts.map +0 -1
  485. package/dist/diagnosis/types.js.map +0 -1
  486. package/dist/doctor/fixer.d.ts.map +0 -1
  487. package/dist/doctor/fixer.js.map +0 -1
  488. package/dist/doctor/health/builtin-dimensions.d.ts.map +0 -1
  489. package/dist/doctor/health/builtin-dimensions.js.map +0 -1
  490. package/dist/doctor/health/composer.d.ts.map +0 -1
  491. package/dist/doctor/health/composer.js.map +0 -1
  492. package/dist/doctor/health/dimension-registry.d.ts.map +0 -1
  493. package/dist/doctor/health/dimension-registry.js.map +0 -1
  494. package/dist/doctor/health/dimension-spec.d.ts.map +0 -1
  495. package/dist/doctor/health/dimension-spec.js.map +0 -1
  496. package/dist/doctor/health/parser.d.ts.map +0 -1
  497. package/dist/doctor/health/parser.js.map +0 -1
  498. package/dist/doctor/health/prompt-builder.d.ts.map +0 -1
  499. package/dist/doctor/health/prompt-builder.js.map +0 -1
  500. package/dist/doctor/health/register.d.ts.map +0 -1
  501. package/dist/doctor/health/register.js.map +0 -1
  502. package/dist/doctor/index.d.ts.map +0 -1
  503. package/dist/doctor/index.js.map +0 -1
  504. package/dist/doctor/messages.d.ts.map +0 -1
  505. package/dist/doctor/messages.js.map +0 -1
  506. package/dist/doctor/preflight.d.ts.map +0 -1
  507. package/dist/doctor/preflight.js.map +0 -1
  508. package/dist/doctor/renderer.d.ts.map +0 -1
  509. package/dist/doctor/renderer.js.map +0 -1
  510. package/dist/doctor/rules.d.ts.map +0 -1
  511. package/dist/doctor/rules.js.map +0 -1
  512. package/dist/eval-core/bootstrap.d.ts.map +0 -1
  513. package/dist/eval-core/bootstrap.js.map +0 -1
  514. package/dist/eval-core/cache.d.ts.map +0 -1
  515. package/dist/eval-core/cache.js.map +0 -1
  516. package/dist/eval-core/comparability.d.ts.map +0 -1
  517. package/dist/eval-core/comparability.js.map +0 -1
  518. package/dist/eval-core/dependency-checker.d.ts.map +0 -1
  519. package/dist/eval-core/dependency-checker.js.map +0 -1
  520. package/dist/eval-core/evaluation-execution.d.ts.map +0 -1
  521. package/dist/eval-core/evaluation-execution.js.map +0 -1
  522. package/dist/eval-core/evaluation-job.d.ts.map +0 -1
  523. package/dist/eval-core/evaluation-job.js.map +0 -1
  524. package/dist/eval-core/evaluation-reporting.d.ts.map +0 -1
  525. package/dist/eval-core/evaluation-reporting.js.map +0 -1
  526. package/dist/eval-core/execution-strategy.d.ts.map +0 -1
  527. package/dist/eval-core/execution-strategy.js.map +0 -1
  528. package/dist/eval-core/fact-checker.d.ts.map +0 -1
  529. package/dist/eval-core/fact-checker.js.map +0 -1
  530. package/dist/eval-core/layer-gates.d.ts.map +0 -1
  531. package/dist/eval-core/layer-gates.js.map +0 -1
  532. package/dist/eval-core/mocks-runtime.d.ts.map +0 -1
  533. package/dist/eval-core/mocks-runtime.js.map +0 -1
  534. package/dist/eval-core/schema.d.ts.map +0 -1
  535. package/dist/eval-core/schema.js.map +0 -1
  536. package/dist/eval-core/statistics.d.ts.map +0 -1
  537. package/dist/eval-core/statistics.js.map +0 -1
  538. package/dist/eval-core/task-planner.d.ts.map +0 -1
  539. package/dist/eval-core/task-planner.js.map +0 -1
  540. package/dist/eval-core/verdict.d.ts.map +0 -1
  541. package/dist/eval-core/verdict.js.map +0 -1
  542. package/dist/eval-workflows/batch-evaluation-workflow.d.ts.map +0 -1
  543. package/dist/eval-workflows/batch-evaluation-workflow.js.map +0 -1
  544. package/dist/eval-workflows/evaluation-pipeline/preflight-warnings.d.ts.map +0 -1
  545. package/dist/eval-workflows/evaluation-pipeline/preflight-warnings.js.map +0 -1
  546. package/dist/eval-workflows/evaluation-pipeline/report-finalize.d.ts.map +0 -1
  547. package/dist/eval-workflows/evaluation-pipeline/report-finalize.js.map +0 -1
  548. package/dist/eval-workflows/evaluation-pipeline/run-state.d.ts.map +0 -1
  549. package/dist/eval-workflows/evaluation-pipeline/run-state.js.map +0 -1
  550. package/dist/eval-workflows/evaluation-pipeline/test-set-hash.d.ts.map +0 -1
  551. package/dist/eval-workflows/evaluation-pipeline/test-set-hash.js.map +0 -1
  552. package/dist/eval-workflows/evaluation-pipeline.d.ts.map +0 -1
  553. package/dist/eval-workflows/evaluation-pipeline.js.map +0 -1
  554. package/dist/eval-workflows/evaluation-preparation.d.ts.map +0 -1
  555. package/dist/eval-workflows/evaluation-preparation.js.map +0 -1
  556. package/dist/eval-workflows/messages.d.ts.map +0 -1
  557. package/dist/eval-workflows/messages.js.map +0 -1
  558. package/dist/eval-workflows/run-evaluation.d.ts.map +0 -1
  559. package/dist/eval-workflows/run-evaluation.js.map +0 -1
  560. package/dist/executors/anthropic-api.d.ts.map +0 -1
  561. package/dist/executors/anthropic-api.js.map +0 -1
  562. package/dist/executors/claude-cli.d.ts.map +0 -1
  563. package/dist/executors/claude-cli.js.map +0 -1
  564. package/dist/executors/claude-sdk-trace.d.ts.map +0 -1
  565. package/dist/executors/claude-sdk-trace.js.map +0 -1
  566. package/dist/executors/claude-sdk.d.ts.map +0 -1
  567. package/dist/executors/claude-sdk.js.map +0 -1
  568. package/dist/executors/codex-cli-trace.d.ts.map +0 -1
  569. package/dist/executors/codex-cli-trace.js.map +0 -1
  570. package/dist/executors/codex-cli.d.ts.map +0 -1
  571. package/dist/executors/codex-cli.js.map +0 -1
  572. package/dist/executors/codex-sdk.d.ts.map +0 -1
  573. package/dist/executors/codex-sdk.js.map +0 -1
  574. package/dist/executors/gemini.d.ts.map +0 -1
  575. package/dist/executors/gemini.js.map +0 -1
  576. package/dist/executors/index.d.ts.map +0 -1
  577. package/dist/executors/index.js.map +0 -1
  578. package/dist/executors/openai-api.d.ts.map +0 -1
  579. package/dist/executors/openai-api.js.map +0 -1
  580. package/dist/executors/runtime-fingerprint.d.ts.map +0 -1
  581. package/dist/executors/runtime-fingerprint.js.map +0 -1
  582. package/dist/executors/script.d.ts.map +0 -1
  583. package/dist/executors/script.js.map +0 -1
  584. package/dist/executors/shared.d.ts.map +0 -1
  585. package/dist/executors/shared.js.map +0 -1
  586. package/dist/grading/assertions.d.ts.map +0 -1
  587. package/dist/grading/assertions.js.map +0 -1
  588. package/dist/grading/debias-validate.d.ts.map +0 -1
  589. package/dist/grading/debias-validate.js.map +0 -1
  590. package/dist/grading/diagnostic.d.ts.map +0 -1
  591. package/dist/grading/diagnostic.js.map +0 -1
  592. package/dist/grading/gold-cli.d.ts.map +0 -1
  593. package/dist/grading/gold-cli.js.map +0 -1
  594. package/dist/grading/gold-dataset.d.ts.map +0 -1
  595. package/dist/grading/gold-dataset.js.map +0 -1
  596. package/dist/grading/human-gold.d.ts.map +0 -1
  597. package/dist/grading/human-gold.js.map +0 -1
  598. package/dist/grading/index.d.ts.map +0 -1
  599. package/dist/grading/index.js.map +0 -1
  600. package/dist/grading/judge.d.ts.map +0 -1
  601. package/dist/grading/judge.js.map +0 -1
  602. package/dist/grading/layered-scores.d.ts.map +0 -1
  603. package/dist/grading/layered-scores.js.map +0 -1
  604. package/dist/inputs/eval-config.d.ts.map +0 -1
  605. package/dist/inputs/eval-config.js.map +0 -1
  606. package/dist/inputs/load-samples.d.ts.map +0 -1
  607. package/dist/inputs/load-samples.js.map +0 -1
  608. package/dist/inputs/mcp-resolver.d.ts.map +0 -1
  609. package/dist/inputs/mcp-resolver.js.map +0 -1
  610. package/dist/inputs/skill-loader.d.ts.map +0 -1
  611. package/dist/inputs/skill-loader.js.map +0 -1
  612. package/dist/inputs/url-fetcher.d.ts.map +0 -1
  613. package/dist/inputs/url-fetcher.js.map +0 -1
  614. package/dist/observability/experience-frontmatter.d.ts.map +0 -1
  615. package/dist/observability/experience-frontmatter.js.map +0 -1
  616. package/dist/observability/experience.d.ts.map +0 -1
  617. package/dist/observability/experience.js.map +0 -1
  618. package/dist/observability/feedback-matchers.d.ts.map +0 -1
  619. package/dist/observability/feedback-matchers.js.map +0 -1
  620. package/dist/observability/feedback-projection.d.ts.map +0 -1
  621. package/dist/observability/feedback-projection.js.map +0 -1
  622. package/dist/observability/inbox-view-model.d.ts.map +0 -1
  623. package/dist/observability/inbox-view-model.js.map +0 -1
  624. package/dist/observability/inbox.d.ts.map +0 -1
  625. package/dist/observability/inbox.js.map +0 -1
  626. package/dist/observability/problem-patterns.d.ts.map +0 -1
  627. package/dist/observability/problem-patterns.js.map +0 -1
  628. package/dist/observability/resolved-review.d.ts.map +0 -1
  629. package/dist/observability/resolved-review.js.map +0 -1
  630. package/dist/observability/review-state.d.ts.map +0 -1
  631. package/dist/observability/review-state.js.map +0 -1
  632. package/dist/observability/skill-chain-advisories.d.ts.map +0 -1
  633. package/dist/observability/skill-chain-advisories.js.map +0 -1
  634. package/dist/observability/skill-chain.d.ts.map +0 -1
  635. package/dist/observability/skill-chain.js.map +0 -1
  636. package/dist/observability/skill-health-analyzer.d.ts.map +0 -1
  637. package/dist/observability/skill-health-analyzer.js.map +0 -1
  638. package/dist/observability/soft-standards/constants.d.ts.map +0 -1
  639. package/dist/observability/soft-standards/constants.js.map +0 -1
  640. package/dist/observability/soft-standards/index.d.ts.map +0 -1
  641. package/dist/observability/soft-standards/index.js.map +0 -1
  642. package/dist/observability/soft-standards/llm-extractor.d.ts.map +0 -1
  643. package/dist/observability/soft-standards/llm-extractor.js.map +0 -1
  644. package/dist/observability/soft-standards/runtime-evaluator.d.ts.map +0 -1
  645. package/dist/observability/soft-standards/runtime-evaluator.js.map +0 -1
  646. package/dist/observability/soft-standards/skill-standards-store.d.ts.map +0 -1
  647. package/dist/observability/soft-standards/skill-standards-store.js.map +0 -1
  648. package/dist/observability/soft-standards/types.d.ts.map +0 -1
  649. package/dist/observability/soft-standards/types.js.map +0 -1
  650. package/dist/observability/text-signals.d.ts.map +0 -1
  651. package/dist/observability/text-signals.js.map +0 -1
  652. package/dist/observability/trace-adapter.d.ts.map +0 -1
  653. package/dist/observability/trace-adapter.js.map +0 -1
  654. package/dist/observability/trace-attribution.d.ts.map +0 -1
  655. package/dist/observability/trace-attribution.js.map +0 -1
  656. package/dist/observability/trace-segmenter.d.ts.map +0 -1
  657. package/dist/observability/trace-segmenter.js.map +0 -1
  658. package/dist/observability/trace-source.d.ts.map +0 -1
  659. package/dist/observability/trace-source.js.map +0 -1
  660. package/dist/renderer/html-renderer.d.ts.map +0 -1
  661. package/dist/renderer/html-renderer.js.map +0 -1
  662. package/dist/renderer/layout.d.ts.map +0 -1
  663. package/dist/renderer/layout.js.map +0 -1
  664. package/dist/renderer/observation-inbox/helpers.d.ts.map +0 -1
  665. package/dist/renderer/observation-inbox/helpers.js.map +0 -1
  666. package/dist/renderer/observation-inbox/styles.d.ts.map +0 -1
  667. package/dist/renderer/observation-inbox/styles.js.map +0 -1
  668. package/dist/renderer/observation-inbox-renderer.d.ts.map +0 -1
  669. package/dist/renderer/observation-inbox-renderer.js.map +0 -1
  670. package/dist/renderer/skill-detail-renderer.d.ts.map +0 -1
  671. package/dist/renderer/skill-detail-renderer.js.map +0 -1
  672. package/dist/renderer/skill-health-renderer.d.ts.map +0 -1
  673. package/dist/renderer/skill-health-renderer.js.map +0 -1
  674. package/dist/renderer/skill-list-renderer.d.ts.map +0 -1
  675. package/dist/renderer/skill-list-renderer.js.map +0 -1
  676. package/dist/renderer/summary.d.ts.map +0 -1
  677. package/dist/renderer/summary.js.map +0 -1
  678. package/dist/renderer/table.d.ts.map +0 -1
  679. package/dist/renderer/table.js.map +0 -1
  680. package/dist/renderer/test-view.d.ts.map +0 -1
  681. package/dist/renderer/test-view.js.map +0 -1
  682. package/dist/renderer/trends.d.ts.map +0 -1
  683. package/dist/renderer/trends.js.map +0 -1
  684. package/dist/server/job-store.d.ts.map +0 -1
  685. package/dist/server/job-store.js.map +0 -1
  686. package/dist/server/report-server.d.ts.map +0 -1
  687. package/dist/server/report-server.js.map +0 -1
  688. package/dist/server/report-store.d.ts.map +0 -1
  689. package/dist/server/report-store.js.map +0 -1
  690. package/dist/server/skill-index.d.ts.map +0 -1
  691. package/dist/server/skill-index.js.map +0 -1
  692. package/dist/server/skill-insights.d.ts.map +0 -1
  693. package/dist/server/skill-insights.js.map +0 -1
  694. package/dist/shared/hard-rules.d.ts.map +0 -1
  695. package/dist/shared/hard-rules.js.map +0 -1
  696. package/dist/shared/llm-prompts/index.d.ts.map +0 -1
  697. package/dist/shared/llm-prompts/index.js.map +0 -1
  698. package/dist/shared/llm-prompts/skill-health.d.ts.map +0 -1
  699. package/dist/shared/llm-prompts/skill-health.js.map +0 -1
  700. package/dist/shared/time.d.ts.map +0 -1
  701. package/dist/shared/time.js.map +0 -1
  702. package/dist/shared/tool-search.d.ts.map +0 -1
  703. package/dist/shared/tool-search.js.map +0 -1
  704. package/dist/types/dependencies.d.ts.map +0 -1
  705. package/dist/types/dependencies.js.map +0 -1
  706. package/dist/types/diagnosis.d.ts.map +0 -1
  707. package/dist/types/diagnosis.js.map +0 -1
  708. package/dist/types/doctor.d.ts.map +0 -1
  709. package/dist/types/doctor.js.map +0 -1
  710. package/dist/types/eval.d.ts.map +0 -1
  711. package/dist/types/eval.js.map +0 -1
  712. package/dist/types/executor.d.ts.map +0 -1
  713. package/dist/types/executor.js.map +0 -1
  714. package/dist/types/index.d.ts.map +0 -1
  715. package/dist/types/index.js.map +0 -1
  716. package/dist/types/judge.d.ts.map +0 -1
  717. package/dist/types/judge.js.map +0 -1
  718. package/dist/types/observability.d.ts.map +0 -1
  719. package/dist/types/observability.js.map +0 -1
  720. package/dist/types/report.d.ts.map +0 -1
  721. package/dist/types/report.js.map +0 -1
  722. package/dist/types/shared.d.ts.map +0 -1
  723. package/dist/types/shared.js.map +0 -1
  724. package/dist/types/skill-index.d.ts.map +0 -1
  725. package/dist/types/skill-index.js.map +0 -1
  726. package/dist/types/storage.d.ts.map +0 -1
  727. package/dist/types/storage.js.map +0 -1
  728. package/dist/util/safe-slice.d.ts.map +0 -1
  729. package/dist/util/safe-slice.js.map +0 -1
@@ -48,9 +48,21 @@ function fmtDateShort(ts) {
48
48
  return '';
49
49
  }
50
50
  }
51
+ /** Underpowered observe (very few segments) must not paint a hard red/yellow band — the
52
+ * analyzer's confidence guard means the band is indicative only, so Studio treats it as
53
+ * a neutral (gray) signal with a caveat rather than a hard health verdict. */
54
+ function effectiveObserveBand(observe) {
55
+ if (!observe)
56
+ return 'gray';
57
+ return observe.confidence === 'underpowered' ? 'gray' : observe.healthBand;
58
+ }
51
59
  export function assessHealth(entry, insights, lang) {
52
- const ran = [entry.doctor, entry.eval, entry.observe].filter(Boolean).length;
53
- // 三大维度都没跑过时,如果 Diagnosis 已经给出 high/medium 信号(例如只跑了 `omk observe ingest`
60
+ // underpowered observe 的色带仅供参考,不能算作一个「可信维度」:否则只有 observe、且段数过少时,
61
+ // 要么被 hasFail 硬标红,要么在去掉 band 惩罚后从 excellent 兜底翻成硬绿「健康」—— 两个方向都是
62
+ // 拿低 N 数据下硬结论。没有任何可信维度时,诚实口径是中性灰「未评估」,把判断权交回给 Diagnosis 信号。
63
+ const obsTrustworthy = entry.observe != null && entry.observe.confidence !== 'underpowered';
64
+ const ran = [entry.doctor, entry.eval, obsTrustworthy ? entry.observe : null].filter(Boolean).length;
65
+ // 没有任何可信维度时,如果 Diagnosis 已经给出 high/medium 信号(例如只跑了 `omk observe ingest`
54
66
  // 拿到 `skill_md_not_found`),仍然要把卡片标红/黄,而不是落到灰色「未评估」。
55
67
  // 否则 Diagnosis 作为 Studio 数据源的价值会被 UI 口径吞掉:红色筛选筛不到,
56
68
  // 用户看不到「这个 skill 有待优化项,但卡片仍灰」的矛盾态。
@@ -84,19 +96,21 @@ export function assessHealth(entry, insights, lang) {
84
96
  }
85
97
  }
86
98
  let observePct = null;
87
- if (entry.observe) {
99
+ if (entry.observe && obsTrustworthy) {
100
+ // underpowered observe 不进参考分:低 N 的 coverage / band 都仅供参考,平均进硬分会污染口径。
88
101
  const coverage = (1 - entry.observe.gapRate) * 100;
89
- const bandMul = entry.observe.healthBand === 'red' ? 0.6 : entry.observe.healthBand === 'yellow' ? 0.85 : 1;
102
+ const obsBand = effectiveObserveBand(entry.observe);
103
+ const bandMul = obsBand === 'red' ? 0.6 : obsBand === 'yellow' ? 0.85 : 1;
90
104
  observePct = coverage * bandMul;
91
105
  }
92
106
  const dims = [doctorPct, evalPct, observePct].filter((x) => x != null);
93
107
  const score = dims.length > 0 ? Math.round(dims.reduce((s, x) => s + x, 0) / dims.length) : null;
94
108
  const hasFail = (entry.doctor != null && entry.doctor.failCount > 0)
95
109
  || (entry.eval != null && entry.eval.failCount > 0)
96
- || (entry.observe != null && entry.observe.healthBand === 'red');
110
+ || (effectiveObserveBand(entry.observe) === 'red');
97
111
  const hasWarn = (entry.doctor != null && entry.doctor.warnCount > 0)
98
112
  || (entry.eval != null && entry.eval.compositeScore != null && entry.eval.compositeScore < 3.5)
99
- || (entry.observe != null && entry.observe.healthBand === 'yellow');
113
+ || (effectiveObserveBand(entry.observe) === 'yellow');
100
114
  if (highCount > 0 || hasFail) {
101
115
  return { grade: 'unhealthy', score, label: lang === 'zh' ? '不健康' : 'Unhealthy', emoji: '🔴', color: 'red' };
102
116
  }
@@ -146,8 +160,13 @@ function renderHealthSummary(entry, insights, lang) {
146
160
  issues.push(lang === 'zh' ? `eval 通过率 ${pct}%(${entry.eval.failCount} 条挂)` : `eval ${pct}% pass (${entry.eval.failCount} fail)`);
147
161
  }
148
162
  }
149
- if (entry.observe && entry.observe.healthBand !== 'green') {
150
- issues.push(lang === 'zh' ? `observe ${BAND_DOT[entry.observe.healthBand]}` : `observe ${BAND_DOT[entry.observe.healthBand]}`);
163
+ const obIssueBand = effectiveObserveBand(entry.observe);
164
+ if (entry.observe && obIssueBand !== 'green' && obIssueBand !== 'gray') {
165
+ issues.push(lang === 'zh' ? `observe ${BAND_DOT[obIssueBand]}` : `observe ${BAND_DOT[obIssueBand]}`);
166
+ }
167
+ if (entry.observe && entry.observe.confidence === 'underpowered') {
168
+ // 低 N observe 既不算「全绿」也不下硬结论,跟列表口径一致标注仅供参考,避免摘要谎报三视角全绿。
169
+ issues.push(lang === 'zh' ? 'observe 样本不足(仅供参考)' : 'observe low N (indicative)');
151
170
  }
152
171
  const high = insights.filter((i) => i.severity === 'high').length;
153
172
  const med = insights.filter((i) => i.severity === 'medium').length;
@@ -246,12 +265,12 @@ function renderSampleBody(s, lang) {
246
265
  }
247
266
  const suggestionBlock = sugParts.length > 0
248
267
  ? `<div class="si-sb-block si-sb-block--suggest">
249
- <div class="si-sb-label">💡 ${lang === 'zh' ? '建议(针对这条样本)' : 'Suggestion (per-sample)'}</div>
268
+ <div class="si-sb-label">💡 ${lang === 'zh' ? '建议(针对这条用例)' : 'Suggestion (per-sample)'}</div>
250
269
  <div class="si-sb-text">${sugParts.join('')}</div>
251
270
  </div>`
252
271
  : `<div class="si-sb-block si-sb-block--suggest si-sb-block--empty">
253
- <div class="si-sb-label">💡 ${lang === 'zh' ? '建议(针对这条样本)' : 'Suggestion (per-sample)'}</div>
254
- <div class="si-sb-text si-sb-empty">${lang === 'zh' ? '诊断 LLM 没给出针对这条样本的建议(可能输出截断或样本本身是诱错样本,无需改动)' : 'Diagnostic LLM did not return a per-sample suggestion'}</div>
272
+ <div class="si-sb-label">💡 ${lang === 'zh' ? '建议(针对这条用例)' : 'Suggestion (per-sample)'}</div>
273
+ <div class="si-sb-text si-sb-empty">${lang === 'zh' ? '诊断 LLM 没给出针对这条用例的建议(可能输出截断或用例本身是诱错样本,无需改动)' : 'Diagnostic LLM did not return a per-sample suggestion'}</div>
255
274
  </div>`;
256
275
  return `<div class="si-sb">
257
276
  ${block('📝', lang === 'zh' ? '用例 prompt' : 'Prompt', s.prompt, 'prompt')}
@@ -748,6 +767,14 @@ details[open] > .sd-warn-toggle::before { content:'▾ ' }
748
767
  .si-fs-id { font-size:11px;background:var(--bg-surface);padding:1px 5px;border-radius:3px;color:#9c4a3f;font-weight:600 }
749
768
  .si-fs-mode { font-size:10.5px;color:#b08030;background:rgba(176,128,48,.14);padding:1px 6px;border-radius:8px;font-weight:500 }
750
769
  .si-fs-summary { color:var(--text-secondary);font-size:12px;flex-basis:100% }
770
+
771
+ /* Eval history table */
772
+ .si-eval-history-table { width:100%;border-collapse:collapse;font-size:13px;margin-top:8px }
773
+ .si-eval-history-table th { text-align:left;padding:6px 10px;border-bottom:2px solid var(--border);color:var(--text-muted);font-weight:500 }
774
+ .si-eval-history-table td { padding:6px 10px;border-bottom:1px solid var(--border-soft) }
775
+ .si-eval-history-table tr:hover td { background:var(--bg-soft) }
776
+ .si-eval-history-table a { color:var(--link);text-decoration:none;font-size:12px }
777
+ .si-eval-history-table a:hover { text-decoration:underline }
751
778
  `;
752
779
  // ────────── chart.js init script ──────────
753
780
  const TREND_INIT_SCRIPT = `
@@ -909,13 +936,19 @@ function renderViewSummaryCards(entry, lang) {
909
936
  ? `${entry.eval.totalSamples} ${lang === 'zh' ? '用例' : 'samples'} · ${Math.round((entry.eval.passCount / (entry.eval.passCount + entry.eval.failCount)) * 100)}%${entry.eval.compositeScore != null ? ` · ${entry.eval.compositeScore.toFixed(2)}/5` : ''}`
910
937
  : (lang === 'zh' ? '未运行' : 'not run');
911
938
  // observe
912
- const obsBand = entry.observe?.healthBand ?? 'gray';
939
+ const obsBand = effectiveObserveBand(entry.observe);
913
940
  const obsColor = obsBand === 'green' ? '#5e8252' : obsBand === 'yellow' ? '#b08030' : obsBand === 'red' ? '#9c4a3f' : '#a8a8a8';
914
941
  const obsPct = entry.observe ? (1 - entry.observe.gapRate) * 100 : null;
915
- const obsStabilityRates = entry.observeHistory.map((h) => (1 - h.gapRate) * 100);
916
- const obsStat = entry.observe
917
- ? `${entry.observe.segmentCount} ${lang === 'zh' ? '段' : 'segs'} · ${((1 - entry.observe.gapRate) * 100).toFixed(0)}% ${lang === 'zh' ? '稳定' : 'stable'}`
918
- : (lang === 'zh' ? '未运行' : 'not run');
942
+ // underpowered 历史点不进趋势 spark:低 N 的 stability 仅供参考,不该当作可信趋势顶点(口径同参考分)。
943
+ const obsStabilityRates = entry.observeHistory
944
+ .filter((h) => h.confidence !== 'underpowered')
945
+ .map((h) => (1 - h.gapRate) * 100);
946
+ const obsStat = !entry.observe
947
+ ? (lang === 'zh' ? '未运行' : 'not run')
948
+ // 低 N 不报「X% 稳定」硬指标,只标段数 + 仅供参考,跟列表卡口径一致。
949
+ : entry.observe.confidence === 'underpowered'
950
+ ? `${entry.observe.segmentCount} ${lang === 'zh' ? '段 · 样本不足' : 'segs · low N'}`
951
+ : `${entry.observe.segmentCount} ${lang === 'zh' ? '段' : 'segs'} · ${((1 - entry.observe.gapRate) * 100).toFixed(0)}% ${lang === 'zh' ? '稳定' : 'stable'}`;
919
952
  const node = (icon, label, sublabel, band, pct, color, stat, sparkRates, anchor) => `<a class="si-vs si-vs--${band}" href="#${anchor}">
920
953
  ${renderDonutRing(pct, color, `${label} ${sublabel}`)}
921
954
  <div class="si-vs-h">
@@ -931,7 +964,7 @@ function renderViewSummaryCards(entry, lang) {
931
964
  ${node('👁', lang === 'zh' ? '线上观测' : 'Live stability', '(observe)', obsBand, obsPct, obsColor, obsStat, obsStabilityRates, 'section-observe')}`;
932
965
  }
933
966
  /** doctor section:展示告警 / 失败规则;通过的规则折叠到底部 */
934
- function renderDoctorSection(snap, lang) {
967
+ function renderDoctorSection(snap, history, lang) {
935
968
  if (!snap) {
936
969
  return `<section id="section-doctor" class="si-sect si-sect--gray">
937
970
  <div class="si-sect-h">🩺 ${lang === 'zh' ? '健康度 (doctor)' : 'Structure (doctor)'}</div>
@@ -1005,10 +1038,52 @@ function renderDoctorSection(snap, lang) {
1005
1038
  </details>`
1006
1039
  : ''}
1007
1040
  </div>
1041
+ ${renderDoctorHistory(history, lang)}
1008
1042
  </section>`;
1009
1043
  }
1044
+ /** eval history: 历史评测记录列表(折叠) */
1045
+ function renderEvalHistory(history, langQ, lang) {
1046
+ if (history.length < 2)
1047
+ return '';
1048
+ const rows = [...history].reverse().map((h) => {
1049
+ const date = h.timestamp ? new Date(h.timestamp).toLocaleString(lang === 'zh' ? 'zh-CN' : 'en-US', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) : '-';
1050
+ const score = h.compositeScore != null ? h.compositeScore.toFixed(2) : '-';
1051
+ const status = h.failCount === 0 ? '✅' : `❌ ${h.failCount} fail`;
1052
+ const link = `<a href="/reports/${e(h.reportId)}${langQ}">${e(h.reportId)}</a>`;
1053
+ return `<tr><td>${date}</td><td>${score}</td><td>${h.passCount}/${h.totalSamples}</td><td>${status}</td><td>${link}</td></tr>`;
1054
+ }).join('\n');
1055
+ return `<details class="si-sect-fold">
1056
+ <summary>${lang === 'zh' ? `▸ 历史评测记录 (${history.length} 次)` : `▸ Eval history (${history.length} runs)`}</summary>
1057
+ <div class="si-sect-fold-body">
1058
+ <table class="si-eval-history-table">
1059
+ <thead><tr><th>${lang === 'zh' ? '时间' : 'Time'}</th><th>${lang === 'zh' ? '分数' : 'Score'}</th><th>${lang === 'zh' ? '通过' : 'Pass'}</th><th>${lang === 'zh' ? '状态' : 'Status'}</th><th>${lang === 'zh' ? '报告' : 'Report'}</th></tr></thead>
1060
+ <tbody>${rows}</tbody>
1061
+ </table>
1062
+ </div>
1063
+ </details>`;
1064
+ }
1065
+ /** doctor history: 历史检查记录列表(折叠) */
1066
+ function renderDoctorHistory(history, lang) {
1067
+ if (history.length < 2)
1068
+ return '';
1069
+ const rows = [...history].reverse().map((h) => {
1070
+ const date = h.timestamp ? new Date(h.timestamp).toLocaleString(lang === 'zh' ? 'zh-CN' : 'en-US', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) : '-';
1071
+ const statusIcon = h.status === 'pass' ? '✅' : h.status === 'warn' ? '⚠️' : '❌';
1072
+ const detail = `${h.passCount}✓ ${h.warnCount}⚠ ${h.failCount}✗`;
1073
+ return `<tr><td>${date}</td><td>${statusIcon} ${e(h.status)}</td><td>${detail}</td></tr>`;
1074
+ }).join('\n');
1075
+ return `<details class="si-sect-fold">
1076
+ <summary>${lang === 'zh' ? `▸ 历史检查记录 (${history.length} 次)` : `▸ Doctor history (${history.length} runs)`}</summary>
1077
+ <div class="si-sect-fold-body">
1078
+ <table class="si-eval-history-table">
1079
+ <thead><tr><th>${lang === 'zh' ? '时间' : 'Time'}</th><th>${lang === 'zh' ? '状态' : 'Status'}</th><th>${lang === 'zh' ? '明细' : 'Detail'}</th></tr></thead>
1080
+ <tbody>${rows}</tbody>
1081
+ </table>
1082
+ </div>
1083
+ </details>`;
1084
+ }
1010
1085
  /** eval section:失败 sample 列表(默认折叠,展开看 prompt/期望/实际/建议) */
1011
- function renderEvalSection(snap, evalReport, langQ, lang) {
1086
+ function renderEvalSection(snap, evalReport, history, langQ, lang) {
1012
1087
  if (!snap) {
1013
1088
  return `<section id="section-eval" class="si-sect si-sect--gray">
1014
1089
  <div class="si-sect-h">🧪 ${lang === 'zh' ? '评测结果 (eval)' : 'Test score (eval)'}</div>
@@ -1165,6 +1240,7 @@ function renderEvalSection(snap, evalReport, langQ, lang) {
1165
1240
  ${failedBlock}
1166
1241
  ${passedFold}
1167
1242
  ${tripwireFold}
1243
+ ${renderEvalHistory(history, langQ, lang)}
1168
1244
  <a class="si-sect-link" href="/reports/${e(snap.reportId)}${langQ}">${lang === 'zh' ? '完整 A/B 报告 →' : 'Full A/B report →'}</a>
1169
1245
  </div>
1170
1246
  </section>`;
@@ -1201,10 +1277,13 @@ function renderObserveSection(snap, langQ, lang) {
1201
1277
  const body = alerts.length > 0
1202
1278
  ? alerts.join('')
1203
1279
  : `<div class="si-sect-allpass">✓ ${lang === 'zh' ? '生产观测健康' : 'production observation healthy'}</div>`;
1204
- return `<section id="section-observe" class="si-sect si-sect--${snap.healthBand}">
1280
+ const obsCaveat = snap.confidence === 'underpowered'
1281
+ ? (lang === 'zh' ? ' · ⚠ 样本不足,色带仅供参考' : ' · ⚠ low N, band indicative')
1282
+ : '';
1283
+ return `<section id="section-observe" class="si-sect si-sect--${effectiveObserveBand(snap)}">
1205
1284
  <div class="si-sect-h">
1206
1285
  <span class="si-sect-title">👁 ${lang === 'zh' ? '线上观测 (observe)' : 'Live stability (observe)'}</span>
1207
- <span class="si-sect-meta">${snap.segmentCount} ${lang === 'zh' ? '段' : 'segs'} · gap ${gapPct}% · ${lang === 'zh' ? '工具失败率' : 'tool fail'} ${failPct}% · ${relTime(snap.generatedAt, lang)}</span>
1286
+ <span class="si-sect-meta">${snap.segmentCount} ${lang === 'zh' ? '段' : 'segs'} · gap ${gapPct}% · ${lang === 'zh' ? '工具失败率' : 'tool fail'} ${failPct}% · ${relTime(snap.generatedAt, lang)}${obsCaveat}</span>
1208
1287
  </div>
1209
1288
  <div class="si-sect-body">
1210
1289
  ${body}
@@ -1233,12 +1312,11 @@ export function renderSkillDetail(entry, evalReport, lang = DEFAULT_LANG, insigh
1233
1312
  </section>
1234
1313
  </div>
1235
1314
 
1236
- ${renderDoctorSection(entry.doctor, lang)}
1237
- ${renderEvalSection(entry.eval, evalReport, langQ, lang)}
1315
+ ${renderDoctorSection(entry.doctor, entry.doctorHistory, lang)}
1316
+ ${renderEvalSection(entry.eval, evalReport, entry.evalHistory, langQ, lang)}
1238
1317
  ${renderObserveSection(entry.observe, langQ, lang)}
1239
1318
  </main>
1240
1319
  <style>${SKILL_DETAIL_CSS}</style>
1241
1320
  ${TREND_INIT_SCRIPT}
1242
1321
  `, lang);
1243
1322
  }
1244
- //# sourceMappingURL=skill-detail-renderer.js.map
@@ -17,4 +17,3 @@ import type { Lang } from '../types/index.js';
17
17
  * 主入口: 生成完整 HTML。
18
18
  */
19
19
  export declare function renderSkillHealthReport(report: SkillHealthReport, lang?: Lang): string;
20
- //# sourceMappingURL=skill-health-renderer.d.ts.map
@@ -11,6 +11,7 @@
11
11
  * - layout.ts 的整体 HTML skeleton + CSS (ki-card / ki-col / ki-bar 全部现成)
12
12
  * - 报告视觉和 eval HTML 保持一致,读者无学习成本切换
13
13
  */
14
+ import { confidenceOf } from '../observability/skill-health-analyzer.js';
14
15
  import { COLORS, e, layout, t } from './layout.js';
15
16
  const HEALTH_BAND_COLOR = {
16
17
  green: 'var(--green)',
@@ -37,8 +38,25 @@ function fmtTimeRange(from, to) {
37
38
  */
38
39
  function renderHeader(report, lang) {
39
40
  const { meta, overall } = report;
40
- const bandColor = HEALTH_BAND_COLOR[overall.healthBand];
41
- const bandLabel = HEALTH_BAND_LABEL[overall.healthBand][lang === 'zh' ? 'zh' : 'en'];
41
+ // Statistical-confidence guard: below the segment threshold a hard health band
42
+ // overstates certainty (1 segment + 1 failure judged the same as 50). When the
43
+ // overall confidence is not high, mute the colour and append an N caveat.
44
+ // Legacy reports (pre-confidence) fall back to deriving from segmentCount, so old
45
+ // JSON never renders `undefined confidence`.
46
+ const confidence = overall.confidence ?? confidenceOf(meta.segmentCount);
47
+ const lowConfidence = confidence !== 'high';
48
+ const bandColor = confidence === 'underpowered'
49
+ ? 'var(--text-faint)'
50
+ : HEALTH_BAND_COLOR[overall.healthBand];
51
+ // underpowered 时色带已静音为灰,标签也不报硬结论(需关注 / 健康),改为「样本不足」,跟灰底 + caveat 一致。
52
+ const bandLabel = confidence === 'underpowered'
53
+ ? (lang === 'zh' ? '样本不足' : 'Insufficient N')
54
+ : HEALTH_BAND_LABEL[overall.healthBand][lang === 'zh' ? 'zh' : 'en'];
55
+ const confCaveat = lowConfidence
56
+ ? `<div class="card-sub" style="color:var(--text-faint)">${lang === 'zh'
57
+ ? `⚠ 样本量 ${meta.segmentCount} 段,可信度${confidence === 'underpowered' ? '不足' : '偏低'},色带仅供参考`
58
+ : `⚠ N=${meta.segmentCount} segments — ${confidence} confidence; band is indicative`}</div>`
59
+ : '';
42
60
  const tracePath = e(meta.tracePath);
43
61
  const kbPath = meta.kbPath ? e(meta.kbPath) : '—';
44
62
  const timeRange = fmtTimeRange(meta.timeRange.from, meta.timeRange.to);
@@ -54,6 +72,7 @@ function renderHeader(report, lang) {
54
72
  <div class="card-label">${lang === 'zh' ? '整体健康度' : 'Overall health'}</div>
55
73
  <div class="card-value" style="color:${bandColor}">${bandLabel}</div>
56
74
  <div class="card-sub">${lang === 'zh' ? '加权盲区' : 'weighted gap'} ${fmtPct(overall.weightedGapRate, 1)} · ${lang === 'zh' ? '原始盲区' : 'raw gap'} ${fmtPct(overall.gapRate, 1)}</div>
75
+ ${confCaveat}
57
76
  </div>
58
77
  <div class="card">
59
78
  <div class="card-label">${lang === 'zh' ? '会话 / 段 / 工具调用' : 'Sessions / Segments / Tool calls'}</div>
@@ -85,7 +104,12 @@ function renderSkillCard(skill, variantColor, lang) {
85
104
  const cov = skill.coverage;
86
105
  const gapPct = Math.round(gap.gapRate * 100);
87
106
  const weightedPct = Math.round(gap.weightedGapRate * 100);
88
- const gapColor = gapPct >= 30 ? 'var(--red)' : gapPct >= 10 ? 'var(--yellow)' : 'var(--green)';
107
+ // Sample-size guard (legacy reports derive from segmentCount): an underpowered skill
108
+ // (very few segments) must not render a hard red gap bar.
109
+ const confidence = skill.confidence ?? confidenceOf(skill.segmentCount);
110
+ const gapColor = confidence === 'underpowered'
111
+ ? 'var(--text-faint)'
112
+ : gapPct >= 30 ? 'var(--red)' : gapPct >= 10 ? 'var(--yellow)' : 'var(--green)';
89
113
  const covPct = cov ? Math.round(cov.fileCoverageRate * 100) : 0;
90
114
  const covColor = covPct >= 80 ? 'var(--green)' : covPct >= 50 ? 'var(--yellow)' : 'var(--red)';
91
115
  // ─── 左栏: 使用量 + coverage ─────────────────────
@@ -114,7 +138,12 @@ function renderSkillCard(skill, variantColor, lang) {
114
138
  const weightedHintBase = softShare >= 10
115
139
  ? `<strong>${lang === 'zh' ? '加权盲区' : 'weighted gap'} ${weightedPct}%</strong> · ${softShare}% ${lang === 'zh' ? '为软信号(建议复核)' : 'soft signals (review)'}`
116
140
  : `<strong>${lang === 'zh' ? '加权盲区' : 'weighted gap'} ${weightedPct}%</strong> · ${lang === 'zh' ? '以硬证据为主' : 'mostly hard evidence'}`;
117
- const weightedHint = weightedHintBase + instabilityNote;
141
+ const confNote = confidence !== 'high'
142
+ ? ` · <span style="color:var(--text-faint)">${lang === 'zh'
143
+ ? `${skill.segmentCount} 段,可信度${confidence === 'underpowered' ? '不足,仅供参考' : '偏低'}`
144
+ : `N=${skill.segmentCount}, ${confidence} confidence`}</span>`
145
+ : '';
146
+ const weightedHint = weightedHintBase + instabilityNote + confNote;
118
147
  const signalBadges = Object.entries(gap.byType)
119
148
  .filter(([, n]) => n > 0)
120
149
  .map(([k, n]) => {
@@ -250,4 +279,3 @@ export function renderSkillHealthReport(report, lang = 'zh') {
250
279
  ].filter(Boolean).join('\n');
251
280
  return layout(title, body, lang);
252
281
  }
253
- //# sourceMappingURL=skill-health-renderer.js.map
@@ -1,3 +1,2 @@
1
1
  import type { Lang, SkillIndex } from '../types/index.js';
2
2
  export declare function renderSkillList(idx: SkillIndex, lang?: Lang): string;
3
- //# sourceMappingURL=skill-list-renderer.d.ts.map
@@ -74,10 +74,16 @@ function renderHealthSummary(entry, insights, lang) {
74
74
  }
75
75
  }
76
76
  if (entry.observe) {
77
- const labels = lang === 'zh'
78
- ? { green: '稳定', yellow: '波动', red: '不稳' }
79
- : { green: 'stable', yellow: 'flaky', red: 'unstable' };
80
- parts.push(lang === 'zh' ? `observe ${labels[entry.observe.healthBand]}` : `observe ${labels[entry.observe.healthBand]}`);
77
+ if (entry.observe.confidence === 'underpowered') {
78
+ // Too few segments to claim stable/flaky/unstable — surface as indicative only.
79
+ parts.push(lang === 'zh' ? 'observe 样本不足(仅供参考)' : 'observe low N (indicative)');
80
+ }
81
+ else {
82
+ const labels = lang === 'zh'
83
+ ? { green: '稳定', yellow: '波动', red: '不稳' }
84
+ : { green: 'stable', yellow: 'flaky', red: 'unstable' };
85
+ parts.push(`observe ${labels[entry.observe.healthBand]}`);
86
+ }
81
87
  }
82
88
  if (parts.length === 0) {
83
89
  // Diagnosis-only skill(例如只跑了 observe ingest 拿到 skill_md_not_found):没有三大
@@ -103,8 +109,14 @@ function renderMetrics(entry, lang) {
103
109
  items.push(`<span class="sl-metric">🧪 ${entry.eval.totalSamples} ${lang === 'zh' ? '用例' : 'samples'} · ${pct}% · ${score}/5</span>`);
104
110
  }
105
111
  if (entry.observe) {
106
- const stab = ((1 - entry.observe.gapRate) * 100).toFixed(0);
107
- items.push(`<span class="sl-metric">👁 ${entry.observe.segmentCount} ${lang === 'zh' ? '段' : 'segs'} · ${stab}% ${lang === 'zh' ? '稳定' : 'stable'}</span>`);
112
+ if (entry.observe.confidence === 'underpowered') {
113
+ // 段数过少,不报「X% 稳定」硬指标 —— 只标段数 + 仅供参考,跟摘要口径一致,避免同一张卡自相矛盾。
114
+ items.push(`<span class="sl-metric">👁 ${entry.observe.segmentCount} ${lang === 'zh' ? '段 · 样本不足' : 'segs · low N'}</span>`);
115
+ }
116
+ else {
117
+ const stab = ((1 - entry.observe.gapRate) * 100).toFixed(0);
118
+ items.push(`<span class="sl-metric">👁 ${entry.observe.segmentCount} ${lang === 'zh' ? '段' : 'segs'} · ${stab}% ${lang === 'zh' ? '稳定' : 'stable'}</span>`);
119
+ }
108
120
  }
109
121
  return items.join('');
110
122
  }
@@ -331,4 +343,3 @@ export function renderSkillList(idx, lang = DEFAULT_LANG) {
331
343
  </script>
332
344
  `, lang);
333
345
  }
334
- //# sourceMappingURL=skill-list-renderer.js.map
@@ -65,4 +65,3 @@ export declare function renderCoverageSection(coverage: Record<string, Knowledge
65
65
  */
66
66
  export declare function renderKnowledgeInteractionSection(coverage: Record<string, KnowledgeCoverage> | undefined, gapReports: Record<string, GapReport> | undefined, lang: Lang): string;
67
67
  export declare function renderGapSection(gapReports: Record<string, GapReport> | undefined, lang: Lang): string;
68
- //# sourceMappingURL=summary.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { e, fmtNum, fmtCost, fmtDuration, COLORS, t } from './layout.js';
2
2
  import { generateAnalysisSummary } from '../analysis/report-diagnostics.js';
3
3
  import { pValueCategory } from '../eval-core/statistics.js';
4
- import { computeVerdict } from '../eval-core/verdict.js';
4
+ import { computeVerdict, ENSEMBLE_STRONG_PEARSON, ENSEMBLE_DISSENT_PEARSON } from '../eval-core/verdict.js';
5
5
  /**
6
6
  * Verdict pill — sticky banner at the top of the HTML report giving the same
7
7
  * one-line conclusion as the `omk eval` CLI. Both surfaces share the
@@ -659,7 +659,7 @@ export function renderScoringModal(id, lang) {
659
659
  const usageSection = lang === 'zh' ? '推荐用法' : 'Recommended usage';
660
660
  const docsLink = lang === 'zh'
661
661
  ? '完整推导 / 五层评分管道架构 / 多层 gate 与综合分的关系:<a href="https://github.com/lizhiyao/oh-my-knowledge/blob/main/docs/zh/specs/scoring.md" target="_blank" rel="noopener">docs/zh/specs/scoring.md</a>'
662
- : 'Full derivation / five-layer scoring pipeline / multi-layer gate & composite relationship: <a href="https://github.com/lizhiyao/oh-my-knowledge/blob/main/docs/zh/specs/scoring.md" target="_blank" rel="noopener">docs/zh/specs/scoring.md</a>';
662
+ : 'Full derivation / five-layer scoring pipeline / multi-layer gate & composite relationship: <a href="https://github.com/lizhiyao/oh-my-knowledge/blob/main/docs/specs/scoring.md" target="_blank" rel="noopener">docs/specs/scoring.md</a>';
663
663
  return `<div id="${id}" class="modal-overlay" role="dialog" aria-modal="true" aria-labelledby="${id}-title" onclick="if(event.target===this)closeModal('${id}')">
664
664
  <div class="modal-content">
665
665
  <div class="modal-header">
@@ -694,7 +694,7 @@ export function renderJudgeAgreementBlock(variants, summary, lang) {
694
694
  const ag = s.judgeAgreement;
695
695
  const judgeList = (s.judgeModels || []).map((j) => `<code>${e(`${j.executor}:${j.model}`)}</code>`).join(', ');
696
696
  const pearsonCell = ag.pearson != null
697
- ? `<span title="${t('pearsonDesc', lang)}" style="color:${ag.pearson >= 0.7 ? 'var(--green)' : ag.pearson >= 0.4 ? 'var(--yellow)' : 'var(--red)'}"><strong>${ag.pearson}</strong></span>`
697
+ ? `<span title="${t('pearsonDesc', lang)}" style="color:${ag.pearson >= ENSEMBLE_STRONG_PEARSON ? 'var(--green)' : ag.pearson >= ENSEMBLE_DISSENT_PEARSON ? 'var(--yellow)' : 'var(--red)'}"><strong>${ag.pearson}</strong></span>`
698
698
  : `<span style="color:var(--text-muted)">—</span>`;
699
699
  const madCell = `<span title="${t('madDesc', lang)}" style="color:${ag.meanAbsDiff < 0.5 ? 'var(--green)' : ag.meanAbsDiff < 1.5 ? 'var(--yellow)' : 'var(--red)'}"><strong>${ag.meanAbsDiff}</strong></span>`;
700
700
  return `<tr>
@@ -732,12 +732,22 @@ function badgeIcon(status) {
732
732
  }
733
733
  }
734
734
  function computeJudgeAgreementBadge(variants, summary, lang) {
735
- const treatment = variants[1] ?? variants[0];
736
- const ag = summary[treatment]?.judgeAgreement;
737
- if (!ag || ag.pearson == null)
735
+ // Match the verdict's ensemble-dissent perspective: consider every compared
736
+ // variant (control + treatments), not just the treatment, and surface the worst
737
+ // agreement. Otherwise the hero verdict can downgrade to CAUTIOUS on a low control
738
+ // Pearson while this badge stays green on a high treatment Pearson — contradictory
739
+ // methodology signals in the same report. Thresholds come from the shared bands.
740
+ let p = null;
741
+ for (const v of variants) {
742
+ const pearson = summary[v]?.judgeAgreement?.pearson;
743
+ if (pearson == null)
744
+ continue;
745
+ if (p == null || pearson < p)
746
+ p = pearson;
747
+ }
748
+ if (p == null)
738
749
  return null;
739
- const p = ag.pearson;
740
- const status = p >= 0.7 ? 'pass' : p >= 0.4 ? 'warn' : 'fail';
750
+ const status = p >= ENSEMBLE_STRONG_PEARSON ? 'pass' : p >= ENSEMBLE_DISSENT_PEARSON ? 'warn' : 'fail';
741
751
  const verdict = status === 'pass'
742
752
  ? (lang === 'zh' ? '评委一致' : 'judges agree')
743
753
  : status === 'warn'
@@ -747,7 +757,9 @@ function computeJudgeAgreementBadge(variants, summary, lang) {
747
757
  key: 'judge',
748
758
  label: verdict,
749
759
  status,
750
- detail: lang === 'zh' ? `Pearson ${p}(≥0.7 一致 / 0.4-0.7 偏弱 / <0.4 分歧)` : `Pearson ${p} (≥0.7 agree / 0.4-0.7 weak / <0.4 diverge)`,
760
+ detail: lang === 'zh'
761
+ ? `Pearson ${p}(≥${ENSEMBLE_STRONG_PEARSON} 一致 / ${ENSEMBLE_DISSENT_PEARSON}-${ENSEMBLE_STRONG_PEARSON} 偏弱 / <${ENSEMBLE_DISSENT_PEARSON} 分歧)`
762
+ : `Pearson ${p} (≥${ENSEMBLE_STRONG_PEARSON} agree / ${ENSEMBLE_DISSENT_PEARSON}-${ENSEMBLE_STRONG_PEARSON} weak / <${ENSEMBLE_DISSENT_PEARSON} diverge)`,
751
763
  };
752
764
  }
753
765
  function computeSignificanceBadge(report, lang) {
@@ -1893,4 +1905,3 @@ export function renderGapSection(gapReports, lang) {
1893
1905
  </section>
1894
1906
  `;
1895
1907
  }
1896
- //# sourceMappingURL=summary.js.map
@@ -1,3 +1,2 @@
1
1
  import type { Lang, ResultEntry } from '../types/index.js';
2
2
  export declare function renderSampleTable(variants: string[], results: ResultEntry[], lang: Lang): string;
3
- //# sourceMappingURL=table.d.ts.map
@@ -238,4 +238,3 @@ export function renderSampleTable(variants, results, lang) {
238
238
  .sc-empty { color:var(--text-muted);font-style:italic;padding:14px 0 }
239
239
  </style>`;
240
240
  }
241
- //# sourceMappingURL=table.js.map
@@ -63,4 +63,3 @@ export declare function renderTestView(report: EvaluationReport, lang: Lang): st
63
63
  export declare const TEST_VIEW_CSS = "\n/* tv-root: \u6D45\u8272\u5C9B,scoped \u8986\u76D6\u5916\u5C42\u6DF1\u8272 layout */\n.tv-root {\n --tv-bg:#fbfaf7; --tv-bg-card:#ffffff; --tv-bg-soft:rgba(58,58,58,.025);\n --tv-text:#3a3a3a; --tv-text-2:#7a7a7a; --tv-text-3:#a8a8a8;\n --tv-divider:#e8e3da;\n /* \u52A0\u5927 pass / fail / tripwire \u7684\u8272\u76F8\u8DDD\u79BB + \u6697\u5EA6\u5DEE,\u907F\u514D\u8FDC\u770B\u96F7\u540C\u3002\n pass: \u9F20\u5C3E\u8349\u7EFF(\u6697\u4E00\u6863,\u9760\u8FD1\u6797\u5730);fail: \u7816\u7EA2\u571F\u9676(\u6697\u4E00\u6863,\u8FDC\u79BB pink);tripwire: \u7D2B\u7F57\u5170(\u72EC\u7ACB\u8272\u76F8)\u3002 */\n --tv-pass:#5e8252; --tv-fail:#9c4a3f; --tv-tripwire:#7a6b89;\n --tv-pass-soft:rgba(94,130,82,.10); --tv-fail-soft:rgba(156,74,63,.10); --tv-tripwire-soft:rgba(122,107,137,.10);\n --tv-accent:#5a7a93; --tv-warn:#b08030;\n --tv-shadow:0 1px 3px rgba(58,58,58,.06);\n --tv-shadow-hover:0 2px 8px rgba(58,58,58,.10);\n background:var(--tv-bg); color:var(--tv-text);\n padding:32px 0; margin:-16px 0 0; border-radius:6px;\n font-family:-apple-system,BlinkMacSystemFont,\"PingFang SC\",\"Microsoft YaHei\",\"Segoe UI\",sans-serif;\n font-size:15px; line-height:1.75;\n}\n/* Variant tabs \u2014 \u663E\u5F0F reset \u6D4F\u89C8\u5668\u9ED8\u8BA4 button \u6837\u5F0F(border-radius / outline / appearance)\n \u9632\u6B62 layout \u90A3\u8FB9\u7684\u5168\u5C40 button \u89C4\u5219\u7ED9\u5E95\u90E8\u52A0\u4E86\u5947\u602A\u5706\u89D2\u548C\u6DF1\u8272\u80CC\u666F\u3002 */\n.tv-root .tv-variant-tabs { display:flex;gap:0;margin:0 0 24px;border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-vtab { padding:12px 20px;background:transparent;border:none;border-radius:0;cursor:pointer;color:var(--tv-text-2);border-bottom:2px solid transparent;font-size:14px;font-family:inherit;font-weight:500;outline:none;appearance:none;-webkit-appearance:none;margin-bottom:-1px }\n.tv-root .tv-vtab:hover { color:var(--tv-text) }\n.tv-root .tv-vtab--active { color:var(--tv-text);border-bottom-color:var(--tv-accent);font-weight:600 }\n.tv-root .tv-vtab:focus-visible { outline:2px solid var(--tv-accent);outline-offset:-4px;border-radius:4px }\n/* tv-variant-panel: \u4E0D\u6253\u6A2A\u5411 padding,\u5185\u5BB9\u76F4\u63A5\u5BF9\u9F50 .tv-root \u8FB9\u754C,\u8DDF\u5916\u5C42 omk-view-panel \u7684 h1/subtitle \u540C\u57FA\u7EBF\u3002 */\n/* Stats \u2014 \u66F4\u6241\u5E73\u7684\u6570\u5B57+\u6807\u7B7E\u5E03\u5C40 */\n.tv-root .tv-variant-stats { display:flex;gap:32px;margin:0 0 24px;font-size:14px;color:var(--tv-text-2);align-items:baseline }\n.tv-root .tv-stat { display:flex;align-items:baseline;gap:6px }\n.tv-root .tv-stat-num { color:var(--tv-text);font-weight:600;font-size:18px;font-variant-numeric:tabular-nums }\n.tv-root .tv-stat--pass .tv-stat-num { color:var(--tv-pass) }\n.tv-root .tv-stat--fail .tv-stat-num { color:var(--tv-fail) }\n.tv-root .tv-stat--tripwire .tv-stat-num { color:var(--tv-tripwire) }\n/* Group separator */\n.tv-root .tv-group-sep { display:flex;align-items:center;gap:14px;margin:32px 0 16px;color:var(--tv-text-3);font-size:12px;text-transform:uppercase;letter-spacing:0.08em;font-weight:500 }\n.tv-root .tv-group-sep::after { content:'';flex:1;height:1px;background:var(--tv-divider) }\n/* Pass rows \u2014 one-line list,\u5DE6\u8FB9\u4E00\u9053\u6DE1 sage \u8272\u6761\u505A\"\u901A\u8FC7\"\u6697\u793A */\n.tv-root .tv-rows { display:flex;flex-direction:column;gap:6px;margin:0 }\n.tv-root .tv-row { background:var(--tv-bg-card);border-radius:6px;box-shadow:var(--tv-shadow);transition:box-shadow .15s;border-left:3px solid var(--tv-pass) }\n.tv-root .tv-row:hover { box-shadow:var(--tv-shadow-hover) }\n.tv-root .tv-row[open] { box-shadow:var(--tv-shadow-hover) }\n.tv-root .tv-row-h { display:flex;align-items:center;gap:14px;padding:14px 20px;cursor:pointer;list-style:none;font-size:15px }\n.tv-root .tv-row-h::-webkit-details-marker { display:none }\n.tv-root .tv-row-h::after { content:'\u203A';margin-left:8px;color:var(--tv-text-3);font-size:18px;transition:transform .15s }\n.tv-root .tv-row[open] .tv-row-h::after { transform:rotate(90deg) }\n/* Cards (fail / tripwire) \u2014 \u9ED8\u8BA4\u6298\u53E0,\u8DDF pass row \u4E00\u81F4;\u5934\u90E8\u4E0B\u9762\u52A0\u4E00\u884C preview \u8BA9\u6298\u53E0\u6001\u4E5F\u6709\u4FE1\u606F\u5BC6\u5EA6 */\n.tv-root .tv-card { background:var(--tv-bg-card);border-radius:8px;box-shadow:var(--tv-shadow);margin:0 0 12px;transition:box-shadow .15s }\n.tv-root .tv-card:hover { box-shadow:var(--tv-shadow-hover) }\n.tv-root .tv-card--fail { border-left:3px solid var(--tv-fail) }\n.tv-root .tv-card--tripwire { border-left:3px solid var(--tv-tripwire) }\n.tv-root .tv-card-h { display:flex;align-items:center;gap:14px;padding:16px 22px;cursor:pointer;list-style:none;font-size:15px }\n.tv-root .tv-card-h::-webkit-details-marker { display:none }\n.tv-root .tv-card-h::after { content:'\u203A';margin-left:8px;color:var(--tv-text-3);font-size:18px;transition:transform .15s }\n.tv-root .tv-card[open] .tv-card-h::after { transform:rotate(90deg) }\n.tv-root .tv-card[open] .tv-card-h { border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-card-preview { padding:0 22px 14px;color:var(--tv-text-2);font-size:14px;line-height:1.7;border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-card[open] .tv-card-preview { display:none }\n/* Status dots \u2014 \u7528\u5F62\u72B6 + \u8272 + \u5B57\u7B26\u7684\u4E09\u91CD\u533A\u5206,\u907F\u514D\u8272\u76F2 / \u8FDC\u770B\u96F7\u540C\u3002\n pass: \u5B9E\u5FC3\u5706 sage;fail: \u7EA2 \u2717 \u5B57\u7B26(\u66F4\u663E\u773C);tripwire: \u7D2B\u8272 \u25C6 \u83F1\u5F62\u3002 */\n.tv-root .tv-dot { display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;font-size:14px;font-weight:700;line-height:1 }\n.tv-root .tv-dot--pass::before { content:'';width:10px;height:10px;border-radius:50%;background:var(--tv-pass);box-shadow:0 0 0 3px var(--tv-pass-soft) }\n.tv-root .tv-dot--fail::before { content:'\u2717';color:var(--tv-fail);font-size:16px;font-weight:700 }\n.tv-root .tv-dot--tripwire::before { content:'\u25C6';color:var(--tv-tripwire);font-size:13px }\n.tv-root .tv-id { font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,Consolas,monospace;font-size:13px;color:var(--tv-text-3) }\n.tv-root .tv-title { flex:1;font-size:15px;color:var(--tv-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap }\n.tv-root .tv-meta { font-size:13px;color:var(--tv-text-3);font-variant-numeric:tabular-nums;font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,monospace }\n/* Body padding */\n.tv-root .tv-card-body, .tv-root .tv-row-body { padding:22px }\n/* Tripwire banner \u2014 \u5361\u7247\u9876\u90E8\u7684\u7D2B\u8272\u89E3\u91CA\u5E26 */\n.tv-root .tv-tripwire-banner { margin:-22px -22px 20px;padding:18px 22px;background:rgba(139,124,147,.08);border-radius:8px 8px 0 0;border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-tripwire-banner-title { font-size:14px;font-weight:600;color:var(--tv-tripwire);margin-bottom:6px;letter-spacing:0.02em }\n.tv-root .tv-tripwire-banner-body { font-size:14px;color:var(--tv-text-2);line-height:1.7 }\n/* Diagnosis \u2014 \u4E00\u6BB5\u767D\u8BDD + \u5355\u4E00\u84DD\u8272\u5EFA\u8BAE\u5757 + \u6298\u53E0\u7EC6\u8282 */\n.tv-root .tv-diag { margin:4px 0 16px }\n.tv-root .tv-diag-text { font-size:15px;line-height:1.75;color:var(--tv-text);margin:0 0 16px }\n.tv-root .tv-suggestion { background:rgba(90,122,147,.06);border-left:3px solid var(--tv-accent);padding:14px 18px;margin:12px 0;border-radius:0 4px 4px 0 }\n.tv-root .tv-suggestion-label { display:inline-block;color:var(--tv-accent);font-weight:600;font-size:13px;margin-right:8px;letter-spacing:0.02em }\n.tv-root .tv-suggestion-body { margin:6px 0 0;font-size:14.5px;line-height:1.7;color:var(--tv-text) }\n.tv-root .tv-diag-details { margin-top:14px }\n.tv-root .tv-diag-details > summary { cursor:pointer;font-size:13px;color:var(--tv-text-2);list-style:none }\n.tv-root .tv-diag-details > summary::-webkit-details-marker { display:none }\n.tv-root .tv-diag-details > summary::before { content:'\u25B8 ';color:var(--tv-text-3);display:inline-block;width:16px }\n.tv-root .tv-diag-details[open] > summary::before { content:'\u25BE ' }\n.tv-root .tv-diag-details-body { padding:10px 0 0 16px;font-size:14px;line-height:1.7;color:var(--tv-text-2) }\n.tv-root .tv-diag-details-body p { margin:6px 0 }\n.tv-root .tv-diag-details-body strong { color:var(--tv-text);margin-right:6px }\n/* RootCause inline pill */\n.tv-root .tv-diag-rc-pill { font-size:11px;padding:2px 8px;border-radius:10px;background:var(--tv-bg-soft);color:var(--tv-text-2);margin-right:6px;display:inline-block }\n.tv-root .tv-diag-rc--tripwire_intentional { background:rgba(139,124,147,.12);color:var(--tv-tripwire) }\n.tv-root .tv-diag-rc--sample_design { background:rgba(90,122,147,.10);color:var(--tv-accent) }\n.tv-root .tv-diag-rc--skill_doc_unclear, .tv-diag-rc--skill_doc_missing, .tv-root .tv-diag-rc--llm_misread { background:rgba(176,128,48,.10);color:var(--tv-warn) }\n/* Failure-mode chips \u2014 \u4E2D\u6587\u6807\u7B7E,\u663E\u8457\u5C55\u793A\u5728 summary \u4E0B */\n.tv-root .tv-diag-modes { display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0 14px }\n.tv-root .tv-diag-modes-label { font-size:12px;color:var(--tv-text-2);margin-right:4px }\n.tv-root .tv-diag-mode-pill { font-size:12px;padding:3px 10px;border-radius:11px;background:var(--tv-bg-soft);color:var(--tv-text);font-weight:500 }\n.tv-root .tv-diag-mode--workflow-skip { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--hardcoded { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--hallucination { background:rgba(180,75,75,.14);color:#b44b4b }\n.tv-root .tv-diag-mode--tool-misuse { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--env-blocked { background:rgba(90,122,147,.12);color:var(--tv-accent) }\n.tv-root .tv-diag-mode--misread { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--other { background:var(--tv-bg-soft);color:var(--tv-text-2) }\n/* Workflow checklist \u2014 \u9ED8\u8BA4\u5C55\u5F00,\u653E\u5728 suggestion \u4E4B\u4E0A,\u76F4\u89C2\u5C55\u793A LLM \u8D70\u5BF9\u54EA\u51E0\u6B65 */\n.tv-root .tv-diag-workflow { margin:14px 0;padding:12px 14px;background:var(--tv-bg-soft);border-radius:6px }\n.tv-root .tv-diag-workflow-title { font-size:13px;font-weight:600;color:var(--tv-text);margin:0 0 10px;letter-spacing:0.02em }\n.tv-root .tv-diag-workflow-list { list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px }\n.tv-root .tv-diag-workflow-item { display:flex;align-items:flex-start;gap:10px;line-height:1.6 }\n.tv-root .tv-diag-workflow-icon { flex-shrink:0;font-weight:700;font-size:14px;width:16px;text-align:center;margin-top:2px }\n.tv-root .tv-diag-workflow-item--pass .tv-diag-workflow-icon { color:#3a8a3a }\n.tv-root .tv-diag-workflow-item--fail .tv-diag-workflow-icon { color:#b44b4b }\n.tv-root .tv-diag-workflow-body { display:flex;flex-direction:column;gap:2px;flex:1 }\n.tv-root .tv-diag-workflow-step { font-size:14px;color:var(--tv-text) }\n.tv-root .tv-diag-workflow-evidence { font-size:12.5px;color:var(--tv-text-2);line-height:1.55 }\n.tv-root .tv-diag-workflow-item--fail .tv-diag-workflow-step { color:#b44b4b }\n/* Partial salvage \u63D0\u793A */\n.tv-root .tv-diag-partial { font-size:12px;color:var(--tv-text-3);margin:0 0 8px;font-style:italic }\n/* Sub-sections \u2014 design / trace / assertions, \u5168\u90E8\u9ED8\u8BA4\u6298\u53E0 */\n.tv-root .tv-section { margin-top:6px;border-top:1px solid var(--tv-divider);padding-top:14px }\n.tv-root .tv-section > summary { cursor:pointer;font-size:14px;font-weight:500;color:var(--tv-text);padding:6px 0;list-style:none }\n.tv-root .tv-section > summary::-webkit-details-marker { display:none }\n.tv-root .tv-section > summary::before { content:'\u25B8 ';color:var(--tv-text-3);display:inline-block;width:16px;font-weight:400 }\n.tv-root .tv-section[open] > summary::before { content:'\u25BE ' }\n.tv-root .tv-section-stat { font-weight:400;color:var(--tv-text-3);margin-left:6px;font-size:13px }\n.tv-root .tv-section-body { padding:14px 0 0 16px;font-size:14.5px;line-height:1.7 }\n/* Design fields */\n.tv-root .tv-prompt, .tv-root .tv-rubric { font-size:14.5px;line-height:1.75;margin:8px 0;color:var(--tv-text-2) }\n.tv-root .tv-prompt strong, .tv-root .tv-rubric strong { color:var(--tv-text);margin-right:6px;font-weight:600 }\n.tv-root .tv-meta-pills { margin:10px 0;display:flex;flex-wrap:wrap;gap:8px }\n.tv-root .tv-meta-pill { font-size:12px;padding:3px 10px;background:var(--tv-bg-soft);border-radius:10px;color:var(--tv-text-2);font-family:\"SF Mono\",Menlo,monospace }\n.tv-root .tv-expected { margin-top:12px }\n.tv-root .tv-expected-h { font-size:13px;color:var(--tv-text-2);margin-bottom:6px }\n.tv-root .tv-expect-line { font-size:13px;font-family:\"SF Mono\",Menlo,monospace;color:var(--tv-text-2);padding:3px 0;line-height:1.6 }\n.tv-root .tv-collapsible { margin-top:10px;font-size:13px }\n.tv-root .tv-collapsible > summary { cursor:pointer;color:var(--tv-text-2) }\n/* Mocks */\n.tv-root .tv-mocks { margin-top:8px }\n.tv-root .tv-mock-line { font-size:12px;font-family:\"SF Mono\",Menlo,monospace;padding:3px 0;display:flex;flex-wrap:wrap;gap:6px;align-items:center;line-height:1.6 }\n.tv-root .tv-mock-idx { color:var(--tv-text-3);font-weight:600 }\n.tv-root .tv-mock-tool { background:var(--tv-bg-soft);padding:2px 6px;border-radius:3px }\n.tv-root .tv-mock-match, .tv-root .tv-mock-return { color:var(--tv-text-2);overflow:hidden;text-overflow:ellipsis;max-width:340px;white-space:nowrap }\n.tv-root .tv-mock-arrow { color:var(--tv-text-3) }\n/* Trace turns */\n.tv-root .tv-turn { margin:10px 0;padding:12px 16px;background:var(--tv-bg-soft);border-radius:4px;border-left:2px solid var(--tv-divider) }\n.tv-root .tv-turn-h { font-size:14px;font-weight:500;color:var(--tv-text);margin-bottom:6px }\n.tv-root .tv-turn-dur { color:var(--tv-text-3);font-weight:400;font-size:12px;margin-left:6px }\n.tv-root .tv-thinking { margin:6px 0;font-size:13px }\n.tv-root .tv-thinking summary { cursor:pointer;color:var(--tv-text-3);font-style:italic }\n.tv-root .tv-thinking-body { padding:10px 14px;background:rgba(58,58,58,.04);border-radius:4px;color:var(--tv-text-2);white-space:pre-wrap;font-size:13px;line-height:1.7;margin-top:6px }\n/* Tool calls */\n.tv-root .tv-call { margin:6px 0;padding:10px 14px;background:rgba(58,58,58,.03);border-radius:4px;font-size:13px }\n.tv-root .tv-call--err { border-left:2px solid var(--tv-fail) }\n.tv-root .tv-call-h { font-weight:500;color:var(--tv-text);margin-bottom:4px;font-size:14px }\n.tv-root .tv-call details { margin:4px 0;font-size:12px }\n.tv-root .tv-call summary { cursor:pointer;color:var(--tv-text-3);padding:2px 0 }\n.tv-root .tv-pre { font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,Consolas,monospace;font-size:13px;background:rgba(58,58,58,.04);padding:10px 14px;border-radius:4px;overflow:auto;max-height:320px;white-space:pre-wrap;margin:4px 0;color:var(--tv-text-2);line-height:1.55 }\n.tv-root .tv-mock-badge { font-size:12px;color:var(--tv-pass);background:rgba(125,155,118,.12);padding:2px 8px;border-radius:10px;margin-left:8px }\n.tv-root .tv-trace-assert { font-size:13px;font-family:\"SF Mono\",Menlo,monospace;padding:3px 0;margin-top:6px;line-height:1.5 }\n.tv-root .tv-trace-assert.tv-assert--fail { color:var(--tv-fail) }\n.tv-root .tv-trace-assert.tv-assert--pass { color:var(--tv-text-2) }\n/* Final answer */\n.tv-root .tv-final { margin-top:14px }\n.tv-root .tv-final-h { font-size:14px;font-weight:500;color:var(--tv-text);margin-bottom:6px }\n/* Assertions */\n.tv-root .tv-assert { font-size:14px;font-family:\"SF Mono\",Menlo,monospace;padding:5px 0;line-height:1.6 }\n.tv-root .tv-assert--pass { color:var(--tv-text-2) }\n.tv-root .tv-assert--fail { color:var(--tv-fail) }\n.tv-root .tv-assert-value { background:rgba(58,58,58,.04);padding:2px 6px;border-radius:3px;margin:0 2px }\n.tv-root .tv-turn-tag { font-size:12px;color:var(--tv-text-3);margin-left:8px;font-style:italic;font-family:-apple-system,sans-serif }\n.tv-root .tv-turn-tag--ok { color:var(--tv-pass) }\n.tv-root .tv-turn-tag--miss { color:var(--tv-fail) }\n.tv-root .tv-assert-msg { font-size:13px;color:var(--tv-text-3);margin-left:20px;margin-top:3px }\n/* Empty/warn states */\n.tv-root .tv-empty, .tv-root .tv-empty-page { color:var(--tv-text-3);font-style:italic;padding:14px 0;font-size:14px }\n.tv-root .tv-warn { color:var(--tv-warn);background:rgba(176,128,48,.08);padding:14px 18px;border-radius:4px;margin:8px 24px;font-size:14px;line-height:1.7 }\n";
64
64
  /** 单测视角配套 JS:variant 切换 + view tab 切换。挂在 layout 末尾。 */
65
65
  export declare const TEST_VIEW_JS = "\nfunction omkSwitchVariant(btn) {\n var target = btn.getAttribute('data-target');\n var tabs = btn.parentElement.querySelectorAll('.tv-vtab');\n tabs.forEach(function(t){ t.classList.toggle('tv-vtab--active', t === btn); });\n var panels = btn.parentElement.parentElement.querySelectorAll('.tv-variant-panel');\n panels.forEach(function(p){ p.hidden = (p.getAttribute('data-variant') !== target); });\n}\nfunction omkSwitchView(name) {\n var tabs = document.querySelectorAll('.omk-view-tab');\n tabs.forEach(function(t){ t.classList.toggle('omk-view-tab--active', t.getAttribute('data-view') === name); });\n var panels = document.querySelectorAll('.omk-view-panel');\n panels.forEach(function(p){ p.hidden = (p.getAttribute('data-view') !== name); });\n}\n";
66
- //# sourceMappingURL=test-view.d.ts.map
@@ -902,4 +902,3 @@ function omkSwitchView(name) {
902
902
  panels.forEach(function(p){ p.hidden = (p.getAttribute('data-view') !== name); });
903
903
  }
904
904
  `;
905
- //# sourceMappingURL=test-view.js.map
@@ -3,4 +3,3 @@ import type { Lang, Report } from '../types/index.js';
3
3
  * Render full trends page for a variant.
4
4
  */
5
5
  export declare function renderTrendsBody(variantName: string, runs: Report[], lang?: Lang): string;
6
- //# sourceMappingURL=trends.d.ts.map
@@ -128,4 +128,3 @@ export function renderTrendsBody(variantName, runs, lang = 'zh') {
128
128
  ${table}
129
129
  `;
130
130
  }
131
- //# sourceMappingURL=trends.js.map
@@ -1,4 +1,3 @@
1
1
  import type { JobStore } from '../types/index.js';
2
2
  export declare const DEFAULT_JOBS_DIR: string;
3
3
  export declare function createFileJobStore(dir: string): JobStore;
4
- //# sourceMappingURL=job-store.d.ts.map
@@ -65,4 +65,3 @@ export function createFileJobStore(dir) {
65
65
  }
66
66
  return { list, get, save, update, remove, exists };
67
67
  }
68
- //# sourceMappingURL=job-store.js.map
@@ -20,4 +20,3 @@ interface ReportServer {
20
20
  export declare function formatListenError(p: number, err: unknown): Error | null;
21
21
  export declare function createReportServer({ port, host: hostOption, reportsDir, analysesDir, doctorsDir, observationsDir, jobsDir, store, jobStore }?: ReportServerOptions): ReportServer;
22
22
  export {};
23
- //# sourceMappingURL=report-server.d.ts.map
@@ -12,6 +12,7 @@ import { DEFAULT_LANG, t, layout } from '../renderer/layout.js';
12
12
  import { buildSkillIndex } from './skill-index.js';
13
13
  import { createFileJobStore, DEFAULT_JOBS_DIR } from './job-store.js';
14
14
  import { createFileStore, queryJob, queryJobList, queryRun, queryRunList, queryTrend } from './report-store.js';
15
+ import { confidenceOf } from '../observability/skill-health-analyzer.js';
15
16
  import { DEFAULT_OBSERVATIONS_DIR, findObservationInboxItem, formatObservationShow, queryObservationInbox } from '../observability/inbox.js';
16
17
  import { buildObservationInboxViewModel } from '../observability/inbox-view-model.js';
17
18
  import { activeStudioDiagnostics } from '../diagnosis/studio-projection.js';
@@ -58,6 +59,8 @@ function listAnalyses(dir) {
58
59
  segmentCount: data.meta.segmentCount,
59
60
  skillCount: Object.keys(data.bySkill || {}).length,
60
61
  healthBand: data.overall.healthBand,
62
+ // 旧 JSON 缺 confidence 时按 segmentCount 兜底,跟 Studio / CLI 口径一致。
63
+ confidence: data.overall.confidence ?? confidenceOf(data.meta.segmentCount),
61
64
  });
62
65
  }
63
66
  catch { /* skip corrupt */ }
@@ -328,14 +331,18 @@ function renderAnalysisList(items, lang = DEFAULT_LANG) {
328
331
  </main>`
329
332
  : (() => {
330
333
  const rows = items.map((it) => {
331
- const badgeColor = it.healthBand === 'red' ? 'var(--red)' : it.healthBand === 'yellow' ? 'var(--yellow)' : 'var(--green)';
334
+ // 低 N 报告的色带仅供参考:列表入口圆点改中性灰,避免点进去才看到「样本不足」的口径错位。
335
+ const underpowered = it.confidence === 'underpowered';
336
+ const badgeColor = underpowered
337
+ ? 'var(--text-faint)'
338
+ : it.healthBand === 'red' ? 'var(--red)' : it.healthBand === 'yellow' ? 'var(--yellow)' : 'var(--green)';
332
339
  const enc = encodeURIComponent(it.id);
333
340
  return `<li style="padding:10px 14px;border-bottom:1px solid var(--border);list-style:none;display:flex;align-items:center;gap:12px">
334
341
  <span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:${badgeColor}"></span>
335
342
  <label style="font-size:11px;color:var(--text-muted);display:flex;align-items:center;gap:3px"><input type="radio" name="from" value="${enc}" onchange="updateCompare()"> <span data-i18n="analysesFromLabel">${t('analysesFromLabel', lang)}</span></label>
336
343
  <label style="font-size:11px;color:var(--text-muted);display:flex;align-items:center;gap:3px"><input type="radio" name="to" value="${enc}" onchange="updateCompare()"> <span data-i18n="analysesToLabel">${t('analysesToLabel', lang)}</span></label>
337
344
  <a href="/analyses/${enc}${langQ}" style="color:var(--accent);text-decoration:none;flex:1;font-family:ui-monospace,monospace">${it.id}</a>
338
- <span style="color:var(--text-muted);font-size:12px">${it.sessionCount} <span data-i18n="analysesSessions">${t('analysesSessions', lang)}</span> · ${it.segmentCount} <span data-i18n="analysesSegs">${t('analysesSegs', lang)}</span> · ${it.skillCount} <span data-i18n="analysesSkills">${t('analysesSkills', lang)}</span></span>
345
+ <span style="color:var(--text-muted);font-size:12px">${it.sessionCount} <span data-i18n="analysesSessions">${t('analysesSessions', lang)}</span> · ${it.segmentCount} <span data-i18n="analysesSegs">${t('analysesSegs', lang)}</span> · ${it.skillCount} <span data-i18n="analysesSkills">${t('analysesSkills', lang)}</span>${underpowered ? ` · <span data-i18n="analysesLowN" style="color:var(--text-faint)">${t('analysesLowN', lang)}</span>` : ''}</span>
339
346
  </li>`;
340
347
  }).join('');
341
348
  return `
@@ -755,7 +762,7 @@ export function createReportServer({ port, host: hostOption, reportsDir = DEFAUL
755
762
  let evalReport = null;
756
763
  if (entry.eval) {
757
764
  const r = await reportStore.get(entry.eval.reportId);
758
- if (r && r.kind === 'evaluation')
765
+ if (r && r.reportKind === 'evaluation')
759
766
  evalReport = r;
760
767
  }
761
768
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
@@ -889,4 +896,3 @@ function skillDerivedStandardStatusFromVerdict(verdict) {
889
896
  return 'pending_review';
890
897
  return null;
891
898
  }
892
- //# sourceMappingURL=report-server.js.map
@@ -20,7 +20,7 @@ export declare function queryJobList(jobStore: JobStore, query?: JobQuery): Prom
20
20
  export declare function queryJob(jobStore: JobStore, id: string): Promise<EvaluationJob | null>;
21
21
  export interface RunListItem {
22
22
  id: string;
23
- kind: ReportDocument['kind'];
23
+ reportKind: ReportDocument['reportKind'];
24
24
  meta: ReportDocument['meta'];
25
25
  summary?: EvaluationReport['summary'];
26
26
  items?: BatchEvaluationReport['items'];
@@ -43,4 +43,3 @@ export interface TrendQueryResult {
43
43
  export declare function queryRunList(reportStore: ReportStore): Promise<RunListItem[]>;
44
44
  export declare function queryRun(reportStore: ReportStore, id: string): Promise<ReportDocument | null>;
45
45
  export declare function queryTrend(reportStore: ReportStore, variantName: string): Promise<TrendQueryResult>;
46
- //# sourceMappingURL=report-store.d.ts.map