@dailephd/my-dev-kit-lab 0.2.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 (250) hide show
  1. package/README.md +272 -0
  2. package/benchmarks/contracts/benchmark-project-profiles.json +1199 -0
  3. package/benchmarks/contracts/todo-behavior.md +70 -0
  4. package/benchmarks/contracts/todo-benchmark-case.json +227 -0
  5. package/benchmarks/projects/README.md +34 -0
  6. package/benchmarks/projects/task-analytics-large-mixed/README.md +1 -0
  7. package/benchmarks/projects/task-analytics-large-mixed/py/task_analytics/__init__.py +3 -0
  8. package/benchmarks/projects/task-analytics-large-mixed/py/task_analytics/fixtures.py +6 -0
  9. package/benchmarks/projects/task-analytics-large-mixed/py/task_analytics/metrics.py +29 -0
  10. package/benchmarks/projects/task-analytics-large-mixed/py/task_analytics/models.py +21 -0
  11. package/benchmarks/projects/task-analytics-large-mixed/py/task_analytics/parser.py +16 -0
  12. package/benchmarks/projects/task-analytics-large-mixed/py/task_analytics/pipeline.py +9 -0
  13. package/benchmarks/projects/task-analytics-large-mixed/py/task_analytics/quality.py +8 -0
  14. package/benchmarks/projects/task-analytics-large-mixed/py/task_analytics/reporting.py +11 -0
  15. package/benchmarks/projects/task-analytics-large-mixed/py/tests/test_metrics.py +19 -0
  16. package/benchmarks/projects/task-analytics-large-mixed/py/tests/test_parser.py +15 -0
  17. package/benchmarks/projects/task-analytics-large-mixed/py/tests/test_quality.py +19 -0
  18. package/benchmarks/projects/task-analytics-large-mixed/py/tests/test_reporting.py +15 -0
  19. package/benchmarks/projects/task-analytics-large-mixed/ts/package.json +12 -0
  20. package/benchmarks/projects/task-analytics-large-mixed/ts/src/index.ts +11 -0
  21. package/benchmarks/projects/task-analytics-large-mixed/ts/src/models/analyticsSnapshot.ts +20 -0
  22. package/benchmarks/projects/task-analytics-large-mixed/ts/src/models/project.ts +5 -0
  23. package/benchmarks/projects/task-analytics-large-mixed/ts/src/models/task.ts +10 -0
  24. package/benchmarks/projects/task-analytics-large-mixed/ts/src/reporting/buildProjectLeaderboard.ts +7 -0
  25. package/benchmarks/projects/task-analytics-large-mixed/ts/src/reporting/formatTaskHealthReport.ts +13 -0
  26. package/benchmarks/projects/task-analytics-large-mixed/ts/src/services/buildAnalyticsSnapshot.ts +39 -0
  27. package/benchmarks/projects/task-analytics-large-mixed/ts/src/services/completeTask.ts +10 -0
  28. package/benchmarks/projects/task-analytics-large-mixed/ts/src/services/createTask.ts +21 -0
  29. package/benchmarks/projects/task-analytics-large-mixed/ts/src/services/listTasksByProject.ts +6 -0
  30. package/benchmarks/projects/task-analytics-large-mixed/ts/src/store/projectStore.ts +20 -0
  31. package/benchmarks/projects/task-analytics-large-mixed/ts/src/store/taskStore.ts +44 -0
  32. package/benchmarks/projects/task-analytics-large-mixed/ts/src/validation/projectValidation.ts +12 -0
  33. package/benchmarks/projects/task-analytics-large-mixed/ts/src/validation/taskValidation.ts +18 -0
  34. package/benchmarks/projects/task-analytics-large-mixed/ts/tests/buildAnalyticsSnapshot.test.ts +48 -0
  35. package/benchmarks/projects/task-analytics-large-mixed/ts/tests/completeTask.test.ts +21 -0
  36. package/benchmarks/projects/task-analytics-large-mixed/ts/tests/createTask.test.ts +31 -0
  37. package/benchmarks/projects/task-analytics-large-mixed/ts/tests/listTasksByProject.test.ts +18 -0
  38. package/benchmarks/projects/task-analytics-large-mixed/ts/tests/reporting.test.ts +19 -0
  39. package/benchmarks/projects/task-analytics-large-mixed/ts/tsconfig.json +12 -0
  40. package/benchmarks/projects/task-analytics-large-mixed/ts/vitest.config.ts +5 -0
  41. package/benchmarks/projects/task-workflow-medium-ts/README.md +1 -0
  42. package/benchmarks/projects/task-workflow-medium-ts/package.json +12 -0
  43. package/benchmarks/projects/task-workflow-medium-ts/src/index.ts +9 -0
  44. package/benchmarks/projects/task-workflow-medium-ts/src/models/project.ts +6 -0
  45. package/benchmarks/projects/task-workflow-medium-ts/src/models/task.ts +39 -0
  46. package/benchmarks/projects/task-workflow-medium-ts/src/services/completeTask.ts +15 -0
  47. package/benchmarks/projects/task-workflow-medium-ts/src/services/createTask.ts +26 -0
  48. package/benchmarks/projects/task-workflow-medium-ts/src/services/filterTasks.ts +17 -0
  49. package/benchmarks/projects/task-workflow-medium-ts/src/services/importTasks.ts +33 -0
  50. package/benchmarks/projects/task-workflow-medium-ts/src/services/summarizeTasks.ts +30 -0
  51. package/benchmarks/projects/task-workflow-medium-ts/src/store/taskStore.ts +76 -0
  52. package/benchmarks/projects/task-workflow-medium-ts/src/utils/deterministicId.ts +3 -0
  53. package/benchmarks/projects/task-workflow-medium-ts/src/validation/taskValidation.ts +45 -0
  54. package/benchmarks/projects/task-workflow-medium-ts/tests/completeTask.test.ts +16 -0
  55. package/benchmarks/projects/task-workflow-medium-ts/tests/createTask.test.ts +21 -0
  56. package/benchmarks/projects/task-workflow-medium-ts/tests/filterTasks.test.ts +18 -0
  57. package/benchmarks/projects/task-workflow-medium-ts/tests/importTasks.test.ts +22 -0
  58. package/benchmarks/projects/task-workflow-medium-ts/tests/summarizeTasks.test.ts +29 -0
  59. package/benchmarks/projects/task-workflow-medium-ts/tsconfig.json +12 -0
  60. package/benchmarks/projects/task-workflow-medium-ts/vitest.config.ts +5 -0
  61. package/benchmarks/projects/todo-js/README.md +3 -0
  62. package/benchmarks/projects/todo-js/package.json +11 -0
  63. package/benchmarks/projects/todo-js/src/index.js +2 -0
  64. package/benchmarks/projects/todo-js/src/taskService.js +37 -0
  65. package/benchmarks/projects/todo-js/src/taskStore.js +28 -0
  66. package/benchmarks/projects/todo-js/tests/taskService.test.js +45 -0
  67. package/benchmarks/projects/todo-js/vitest.config.js +5 -0
  68. package/benchmarks/projects/todo-mixed-ts-py/README.md +3 -0
  69. package/benchmarks/projects/todo-mixed-ts-py/package.json +13 -0
  70. package/benchmarks/projects/todo-mixed-ts-py/python/task_service.py +76 -0
  71. package/benchmarks/projects/todo-mixed-ts-py/src/taskCli.ts +38 -0
  72. package/benchmarks/projects/todo-mixed-ts-py/tests/mixedBoundary.test.ts +18 -0
  73. package/benchmarks/projects/todo-mixed-ts-py/tsconfig.json +12 -0
  74. package/benchmarks/projects/todo-mixed-ts-py/vitest.config.ts +5 -0
  75. package/benchmarks/projects/todo-python/README.md +3 -0
  76. package/benchmarks/projects/todo-python/src/__init__.py +4 -0
  77. package/benchmarks/projects/todo-python/src/task_service.py +32 -0
  78. package/benchmarks/projects/todo-python/src/task_store.py +28 -0
  79. package/benchmarks/projects/todo-python/tests/test_task_service.py +52 -0
  80. package/benchmarks/projects/todo-ts/README.md +3 -0
  81. package/benchmarks/projects/todo-ts/package.json +12 -0
  82. package/benchmarks/projects/todo-ts/src/index.ts +2 -0
  83. package/benchmarks/projects/todo-ts/src/taskService.ts +41 -0
  84. package/benchmarks/projects/todo-ts/src/taskStore.ts +34 -0
  85. package/benchmarks/projects/todo-ts/tests/taskService.test.ts +45 -0
  86. package/benchmarks/projects/todo-ts/tsconfig.json +12 -0
  87. package/benchmarks/projects/todo-ts/vitest.config.ts +5 -0
  88. package/dist/scripts/build-gallery.js +3 -0
  89. package/dist/scripts/capture-demo-report.js +3 -0
  90. package/dist/scripts/evaluate-token-savings.js +2 -0
  91. package/dist/scripts/experiments/describeExperiment.js +143 -0
  92. package/dist/scripts/experiments/listExperiments.js +44 -0
  93. package/dist/scripts/experiments/runExperiment.js +199 -0
  94. package/dist/scripts/generate-experiment-plots.js +3 -0
  95. package/dist/scripts/generate-prompt-variants.js +2 -0
  96. package/dist/scripts/render-experiment-report.js +2 -0
  97. package/dist/scripts/run-agent-prompt.js +2 -0
  98. package/dist/scripts/run-controlled-experiment.js +2 -0
  99. package/dist/scripts/run-final-demo.js +3 -0
  100. package/dist/scripts/run-lab-demo.js +5 -0
  101. package/dist/scripts/run-visualization-demos.js +3 -0
  102. package/dist/scripts/security/runCodeql.js +57 -0
  103. package/dist/scripts/security/runDependencyChecks.js +57 -0
  104. package/dist/scripts/security/runFuzzSmoke.js +29 -0
  105. package/dist/scripts/security/runPackageChecks.js +56 -0
  106. package/dist/scripts/security/runSemgrep.js +63 -0
  107. package/dist/scripts/security/validate.js +117 -0
  108. package/dist/scripts/verify-benchmarks.js +202 -0
  109. package/dist/src/agents/adapters/claudeAdapter.js +37 -0
  110. package/dist/src/agents/adapters/codexAdapter.js +110 -0
  111. package/dist/src/agents/adapters/fakeAgentAdapter.js +101 -0
  112. package/dist/src/agents/agentRegistry.js +21 -0
  113. package/dist/src/agents/index.js +7 -0
  114. package/dist/src/agents/parseAgentTokenUsage.js +137 -0
  115. package/dist/src/agents/runAgentPrompt.js +38 -0
  116. package/dist/src/agents/types.js +1 -0
  117. package/dist/src/commands/buildGalleryCommand.js +56 -0
  118. package/dist/src/commands/captureDemoReport.js +116 -0
  119. package/dist/src/commands/evaluateTokenSavings.js +175 -0
  120. package/dist/src/commands/generateExperimentPlotsCommand.js +38 -0
  121. package/dist/src/commands/generatePromptVariants.js +67 -0
  122. package/dist/src/commands/renderExperimentReportCommand.js +131 -0
  123. package/dist/src/commands/runAgentPromptCommand.js +132 -0
  124. package/dist/src/commands/runControlledExperimentCommand.js +174 -0
  125. package/dist/src/commands/runFinalDemoCommand.js +123 -0
  126. package/dist/src/commands/runLabDemo.js +62 -0
  127. package/dist/src/commands/runVisualizationDemosCommand.js +67 -0
  128. package/dist/src/core/commandLine.js +59 -0
  129. package/dist/src/core/countTokens.js +8 -0
  130. package/dist/src/core/fileGlobs.js +100 -0
  131. package/dist/src/core/localProjectTarget.js +75 -0
  132. package/dist/src/core/pathSafety.js +19 -0
  133. package/dist/src/core/pythonCommand.js +30 -0
  134. package/dist/src/core/resolveCommand.js +110 -0
  135. package/dist/src/core/runMeasuredCommand.js +143 -0
  136. package/dist/src/evaluation/benchmarkMetadata.js +207 -0
  137. package/dist/src/evaluation/buildExperimentMatrix.js +75 -0
  138. package/dist/src/evaluation/classifyAgentRunOutcome.js +40 -0
  139. package/dist/src/evaluation/compareExperimentRuns.js +79 -0
  140. package/dist/src/evaluation/compareTokenSavings.js +47 -0
  141. package/dist/src/evaluation/controlledExperimentTypes.js +1 -0
  142. package/dist/src/evaluation/index.js +18 -0
  143. package/dist/src/evaluation/parseAgentAnswer.js +230 -0
  144. package/dist/src/evaluation/projectComplexity.js +126 -0
  145. package/dist/src/evaluation/projectFileTree.js +83 -0
  146. package/dist/src/evaluation/readEvaluationCases.js +59 -0
  147. package/dist/src/evaluation/renderTokenSavingsReportInput.js +55 -0
  148. package/dist/src/evaluation/runControlledExperiment.js +158 -0
  149. package/dist/src/evaluation/runMyDevKitRetrieval.js +197 -0
  150. package/dist/src/evaluation/runRawFullFileBaseline.js +31 -0
  151. package/dist/src/evaluation/scoreCorrectness.js +127 -0
  152. package/dist/src/evaluation/types.js +1 -0
  153. package/dist/src/evaluation/writeExperimentArtifacts.js +104 -0
  154. package/dist/src/evaluation/writeTokenSavingsArtifacts.js +57 -0
  155. package/dist/src/experiments/config.js +24 -0
  156. package/dist/src/experiments/defaultRegistry.js +7 -0
  157. package/dist/src/experiments/errors.js +18 -0
  158. package/dist/src/experiments/index.js +9 -0
  159. package/dist/src/experiments/outputPaths.js +25 -0
  160. package/dist/src/experiments/plugins/contextStrategyComparison/config.js +37 -0
  161. package/dist/src/experiments/plugins/contextStrategyComparison/index.js +3 -0
  162. package/dist/src/experiments/plugins/contextStrategyComparison/plugin.js +83 -0
  163. package/dist/src/experiments/plugins/contextStrategyComparison/resultMapping.js +260 -0
  164. package/dist/src/experiments/plugins/index.js +1 -0
  165. package/dist/src/experiments/registry.js +43 -0
  166. package/dist/src/experiments/results.js +48 -0
  167. package/dist/src/experiments/runner.js +181 -0
  168. package/dist/src/experiments/target.js +8 -0
  169. package/dist/src/experiments/types.js +1 -0
  170. package/dist/src/gallery/index.js +2 -0
  171. package/dist/src/gallery/types.js +1 -0
  172. package/dist/src/gallery/writeGalleryManifest.js +214 -0
  173. package/dist/src/index.js +12 -0
  174. package/dist/src/plots/buildExperimentPlotData.js +137 -0
  175. package/dist/src/plots/index.js +4 -0
  176. package/dist/src/plots/renderSvgChart.js +82 -0
  177. package/dist/src/plots/types.js +1 -0
  178. package/dist/src/plots/writePlotArtifacts.js +46 -0
  179. package/dist/src/prompts/buildPromptContext.js +68 -0
  180. package/dist/src/prompts/generateMyDevKitPrompt.js +106 -0
  181. package/dist/src/prompts/generatePromptVariants.js +36 -0
  182. package/dist/src/prompts/generateRawFullFilePrompt.js +97 -0
  183. package/dist/src/prompts/index.js +7 -0
  184. package/dist/src/prompts/measurePromptComplexity.js +41 -0
  185. package/dist/src/prompts/types.js +1 -0
  186. package/dist/src/prompts/writePromptArtifacts.js +43 -0
  187. package/dist/src/report/buildExperimentReportInput.js +339 -0
  188. package/dist/src/report/experimentReportTypes.js +1 -0
  189. package/dist/src/report/experiments/buildPluginExperimentReport.js +153 -0
  190. package/dist/src/report/experiments/experimentReportModel.js +1 -0
  191. package/dist/src/report/experiments/index.js +4 -0
  192. package/dist/src/report/experiments/renderPluginExperimentReportHtml.js +133 -0
  193. package/dist/src/report/experiments/writePluginExperimentReports.js +30 -0
  194. package/dist/src/report/index.js +8 -0
  195. package/dist/src/report/renderExperimentHtmlReport.js +354 -0
  196. package/dist/src/report/renderHtmlReport.js +103 -0
  197. package/dist/src/report/types.js +10 -0
  198. package/dist/src/report/writeExperimentReportArtifacts.js +38 -0
  199. package/dist/src/report/writeReportArtifacts.js +39 -0
  200. package/dist/src/screenshot/captureReportScreenshot.js +75 -0
  201. package/dist/src/screenshot/index.js +2 -0
  202. package/dist/src/screenshot/types.js +1 -0
  203. package/dist/src/securityValidation/artifacts.js +15 -0
  204. package/dist/src/securityValidation/cliAdversarial/adversarialCliConfig.js +38 -0
  205. package/dist/src/securityValidation/cliAdversarial/dataVolumeChecks.js +194 -0
  206. package/dist/src/securityValidation/cliAdversarial/jsonStdoutChecks.js +359 -0
  207. package/dist/src/securityValidation/cliAdversarial/malformedArtifactChecks.js +284 -0
  208. package/dist/src/securityValidation/cliAdversarial/malformedArtifactFixtures.js +79 -0
  209. package/dist/src/securityValidation/cliAdversarial/pathBoundaryChecks.js +431 -0
  210. package/dist/src/securityValidation/cliAdversarial/pathCases.js +144 -0
  211. package/dist/src/securityValidation/cliAdversarial/readOnlyBoundaryChecks.js +294 -0
  212. package/dist/src/securityValidation/cliAdversarial/runAdversarialCheck.js +149 -0
  213. package/dist/src/securityValidation/cliAdversarial/subprocessSafetyChecks.js +214 -0
  214. package/dist/src/securityValidation/cliAdversarial/tempWorkspace.js +160 -0
  215. package/dist/src/securityValidation/commandRunner.js +136 -0
  216. package/dist/src/securityValidation/config.js +39 -0
  217. package/dist/src/securityValidation/dependencies/parseNpmAudit.js +115 -0
  218. package/dist/src/securityValidation/dependencies/parseNpmLs.js +71 -0
  219. package/dist/src/securityValidation/dependencies/parseNpmOutdated.js +41 -0
  220. package/dist/src/securityValidation/dependencies/runDependencyChecks.js +239 -0
  221. package/dist/src/securityValidation/dependencies/runOsvScanner.js +43 -0
  222. package/dist/src/securityValidation/fuzz/fuzzHarness.js +61 -0
  223. package/dist/src/securityValidation/fuzz/fuzzTargets.js +204 -0
  224. package/dist/src/securityValidation/fuzz/randomInput.js +0 -0
  225. package/dist/src/securityValidation/index.js +34 -0
  226. package/dist/src/securityValidation/packageChecks/forbiddenPackageContents.js +67 -0
  227. package/dist/src/securityValidation/packageChecks/parseNpmPackDryRun.js +56 -0
  228. package/dist/src/securityValidation/packageChecks/runPackageChecks.js +88 -0
  229. package/dist/src/securityValidation/report/renderSecurityReport.js +248 -0
  230. package/dist/src/securityValidation/report/securityReportTypes.js +1 -0
  231. package/dist/src/securityValidation/staticScans/codeql.js +66 -0
  232. package/dist/src/securityValidation/staticScans/semgrep.js +180 -0
  233. package/dist/src/securityValidation/testMatrix.js +535 -0
  234. package/dist/src/securityValidation/types.js +34 -0
  235. package/dist/src/securityValidation/validate/resolveTarget.js +32 -0
  236. package/dist/src/securityValidation/validate/runSecurityValidation.js +169 -0
  237. package/dist/src/securityValidation/validate/verdict.js +73 -0
  238. package/dist/src/visualizationDemos/buildMyDevKitVisualizationCommands.js +59 -0
  239. package/dist/src/visualizationDemos/index.js +4 -0
  240. package/dist/src/visualizationDemos/runVisualizationDemos.js +82 -0
  241. package/dist/src/visualizationDemos/types.js +1 -0
  242. package/dist/src/visualizationDemos/writeVisualizationDemoArtifacts.js +25 -0
  243. package/docs/METRICS.md +286 -0
  244. package/examples/demo-report-input.json +78 -0
  245. package/examples/lab-demo-cases.json +35 -0
  246. package/examples/real-agent-campaign-cases.json +118 -0
  247. package/examples/token-savings-cases.json +122 -0
  248. package/package.json +91 -0
  249. package/tests/fixtures/fake-adversarial-cli.js +152 -0
  250. package/tests/fixtures/fake-my-dev-kit-cli.js +83 -0
@@ -0,0 +1,286 @@
1
+ # Metrics
2
+
3
+ This document is the canonical metric glossary for my-dev-kit-lab. It defines every metric that appears in benchmark profiles, prompt variants, controlled experiment artifacts, and rendered reports.
4
+
5
+ Related documentation:
6
+ - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) — how metrics flow through the pipeline
7
+ - [docs/TUTORIAL.md](docs/TUTORIAL.md) — how to read token savings and correctness scores in the report
8
+ - [docs/CURRENT_STATE.md](docs/CURRENT_STATE.md) — current baseline and limitations
9
+
10
+ ## Metric interpretation quick reference
11
+
12
+ | Metric | Positive means | Negative means | N/A means |
13
+ |---|---|---|---|
14
+ | `tokenSavings` | my-dev-kit used fewer tokens | my-dev-kit used more tokens | Token totals unavailable for one or both runs |
15
+ | `correctnessScore` | More answer-key facts matched | Fewer answer-key facts matched | Run did not complete |
16
+ | `complexityScore` | Higher project complexity | Lower project complexity | — |
17
+
18
+ **Token savings notes:**
19
+ - A positive token savings value means the my-dev-kit-guided strategy used fewer tokens than raw-full-file for that run pair.
20
+ - A negative token savings value means my-dev-kit-guided used more tokens. This can happen on small projects where raw-full-file is cheaper.
21
+ - Token savings are only computed when both paired runs expose token totals. Claude does not expose token totals. Codex may expose token totals but can produce timeouts or invalid-output runs.
22
+ - Token counts in fake-agent runs are estimated using `Math.ceil(characterCount / 4)`. These are context-size estimates, not provider billing totals.
23
+
24
+ **Correctness scoring notes:**
25
+ - Correctness is scored deterministically against benchmark answer keys. It is not semantic LLM judging.
26
+ - A run passes if it meets or exceeds the `minimumCorrectFacts` threshold defined in the answer key.
27
+
28
+ **Complexity score notes:**
29
+ - The complexity score is a heuristic 0-100 weighted score. Higher scores indicate projects where raw full-file reading is less attractive.
30
+ - Small projects may show negative token savings because raw-full-file is cheaper when the entire project fits easily in context.
31
+ - Larger, more localized tasks are where my-dev-kit is expected to become more useful.
32
+
33
+ ## Project Complexity Metrics
34
+
35
+ - `fileCount`
36
+ Meaning: total non-generated files captured in the benchmark file tree.
37
+ Appears in: `benchmarks/contracts/benchmark-project-profiles.json`, experiment report project sections.
38
+ Formula: count of file entries in `src/evaluation/projectFileTree.ts`.
39
+ Interpretation: higher means more total files to scan.
40
+ Caveat: includes config and docs files, not only source.
41
+ - `sourceFileCount`
42
+ Meaning: number of source-role files in the benchmark project.
43
+ Appears in: project profiles and reports.
44
+ Formula: file-tree entries where role is `source`.
45
+ Interpretation: higher means broader implementation surface.
46
+ Caveat: role detection is path-based.
47
+ - `testFileCount`
48
+ Meaning: number of test-role files in the benchmark project.
49
+ Appears in: project profiles and reports.
50
+ Formula: file-tree entries where role is `test`.
51
+ Interpretation: higher can increase raw full-file context size.
52
+ Caveat: test helpers outside test roots still depend on role detection.
53
+ - `totalLinesOfCode`
54
+ Meaning: approximate code lines across source and test files.
55
+ Appears in: project profiles and reports.
56
+ Formula: nonblank, non-comment lines counted by `countApproximateCodeLines`.
57
+ Interpretation: higher means more code context overall.
58
+ Caveat: this is approximate and language-agnostic.
59
+ - `sourceLinesOfCode`
60
+ Meaning: approximate code lines across source files only.
61
+ Appears in: project profiles and reports.
62
+ Formula: approximate code-line count over source-role files.
63
+ Interpretation: higher usually means more production logic.
64
+ Caveat: comment stripping is simple.
65
+ - `testLinesOfCode`
66
+ Meaning: approximate code lines across test files only.
67
+ Appears in: project profiles and reports.
68
+ Formula: approximate code-line count over test-role files.
69
+ Interpretation: higher can increase context noise for raw reads.
70
+ Caveat: tests may still be relevant to answer-key tasks.
71
+ - `languageCount`
72
+ Meaning: number of detected code languages in source and test files.
73
+ Appears in: project profiles and reports.
74
+ Formula: unique language count from file-tree metadata.
75
+ Interpretation: higher means more language switching cost.
76
+ Caveat: only known file extensions are counted.
77
+ - `internalImportCount`
78
+ Meaning: approximate count of local/internal imports in source files.
79
+ Appears in: project profiles and reports.
80
+ Formula: import-pattern count from `countInternalImports`.
81
+ Interpretation: higher means more cross-file coupling.
82
+ Caveat: regex-based and approximate.
83
+ - `exportedSymbolEstimate`
84
+ Meaning: approximate count of exported or top-level callable symbols.
85
+ Appears in: project profiles and reports.
86
+ Formula: regex-based count from `countExportedSymbols`.
87
+ Interpretation: higher means more symbol-selection work.
88
+ Caveat: Python counting treats top-level defs/classes as exported.
89
+ - `taskCount`
90
+ Meaning: number of benchmark tasks associated with the project suite or case set used to profile it.
91
+ Appears in: project profiles and reports.
92
+ Formula: provided task stats input during profile generation.
93
+ Interpretation: higher suggests broader benchmark coverage.
94
+ Caveat: this is metadata, not code structure.
95
+ - `expectedRelevantFilesAverage`
96
+ Meaning: average count of expected relevant files across answer-key tasks.
97
+ Appears in: project profiles and reports.
98
+ Formula: average expected-file count from profiled tasks.
99
+ Interpretation: higher means tasks span more files.
100
+ Caveat: depends on case selection quality.
101
+ - `expectedRelevantSymbolsAverage`
102
+ Meaning: average count of expected relevant symbols across answer-key tasks.
103
+ Appears in: project profiles and reports.
104
+ Formula: average expected-symbol count from profiled tasks.
105
+ Interpretation: higher means symbol selection is less trivial.
106
+ Caveat: depends on answer-key breadth.
107
+ - `maxFileLines`
108
+ Meaning: maximum raw line count of any code file in the project.
109
+ Appears in: project profiles and reports.
110
+ Formula: max `lines` value from code-role file-tree entries.
111
+ Interpretation: higher means a single-file read can be heavier.
112
+ Caveat: uses raw line counts, not approximate code lines.
113
+ - `averageFileLines`
114
+ Meaning: average raw line count across code files.
115
+ Appears in: project profiles and reports.
116
+ Formula: average `lines` value across source and test code entries.
117
+ Interpretation: higher means broader files on average.
118
+ Caveat: small files and tests can pull the average down.
119
+ - `complexityScore`
120
+ Meaning: 0-100 weighted project complexity score.
121
+ Appears in: project profiles and experiment reports.
122
+ Formula: `benchmark-project-complexity-v1` in `src/evaluation/projectComplexity.ts`.
123
+ Interpretation: higher means raw full-file reading should be less attractive.
124
+ Caveat: it is heuristic, not a runtime truth metric.
125
+ - `complexityLevel`
126
+ Meaning: bucketed project size label such as `small`, `medium`, or `large`.
127
+ Appears in: project profiles and reports.
128
+ Formula: manually assigned profile label.
129
+ Interpretation: human-readable size category.
130
+ Caveat: coarse label; use the score and metrics for detail.
131
+
132
+ ## Prompt Complexity Metrics
133
+
134
+ - `promptChars`
135
+ Meaning: prompt length in characters.
136
+ Appears in: prompt variants, experiment runs, and prompt report tables.
137
+ Formula: `promptText.length`.
138
+ Interpretation: higher means more instruction payload.
139
+ Caveat: character count is not provider billing.
140
+ - `promptEstimatedTokens`
141
+ Meaning: estimated prompt tokens.
142
+ Appears in: prompt variants and prompt report tables.
143
+ Formula: `estimated_chars_div_4` via `src/core/countTokens.ts`.
144
+ Interpretation: useful for rough relative comparisons.
145
+ Caveat: not provider-reported usage.
146
+ - `instructionCount`
147
+ Meaning: approximate count of instruction-like phrases in the prompt.
148
+ Appears in: prompt report tables.
149
+ Formula: regex count in `measurePromptComplexity`.
150
+ Interpretation: higher means denser instruction framing.
151
+ Caveat: approximate text heuristic.
152
+ - `constraintCount`
153
+ Meaning: approximate count of constraint-like phrases in the prompt.
154
+ Appears in: prompt report tables.
155
+ Formula: regex count in `measurePromptComplexity`.
156
+ Interpretation: higher means tighter behavioral constraints.
157
+ Caveat: approximate text heuristic.
158
+ - `requestedOutputFieldCount`
159
+ Meaning: count of output fields explicitly requested from the agent.
160
+ Appears in: prompt report tables.
161
+ Formula: number of known field names found in the prompt text.
162
+ Interpretation: higher means a more structured answer contract.
163
+ Caveat: limited to predefined field names.
164
+ - `taskStepCount`
165
+ Meaning: count of numbered steps in the prompt body.
166
+ Appears in: prompt report tables.
167
+ Formula: regex count of `1.`, `2.`, and so on.
168
+ Interpretation: higher means more explicit workflow steps.
169
+ Caveat: only numbered steps count.
170
+ - `expectedFactCount`
171
+ Meaning: number of answer-key facts in scope for the prompt.
172
+ Appears in: prompt report tables.
173
+ Formula: answer-key fact count.
174
+ Interpretation: higher means more correctness evidence required.
175
+ Caveat: depends on case design.
176
+ - `expectedFileCount`
177
+ Meaning: number of expected relevant files in the answer key.
178
+ Appears in: prompt report tables.
179
+ Formula: answer-key expected-file count.
180
+ Interpretation: higher means broader context demand.
181
+ Caveat: answer-key driven.
182
+ - `expectedSymbolCount`
183
+ Meaning: number of expected relevant symbols in the answer key.
184
+ Appears in: prompt report tables.
185
+ Formula: answer-key expected-symbol count.
186
+ Interpretation: higher means more symbol-level targeting.
187
+ Caveat: answer-key driven.
188
+ - `requiresGraphGuidedRetrieval`
189
+ Meaning: whether the prompt explicitly requires my-dev-kit retrieval flow.
190
+ Appears in: prompt report tables.
191
+ Formula: `strategy === "my-dev-kit-guided"`.
192
+ Interpretation: `true` means command-guided retrieval is expected.
193
+ Caveat: not a guarantee that the agent followed it.
194
+ - `requiresCommandExecution`
195
+ Meaning: whether the prompt expects command execution.
196
+ Appears in: prompt report tables.
197
+ Formula: `strategy === "my-dev-kit-guided"`.
198
+ Interpretation: `true` means retrieval commands are part of the task.
199
+ Caveat: prompt intent only.
200
+
201
+ ## Experiment And Run Metrics
202
+
203
+ - `durationMs`
204
+ Meaning: measured wall-clock duration of a normalized run.
205
+ Appears in: experiment runs, comparisons, and reports.
206
+ Formula: runtime duration from `runMeasuredCommand` or orchestrator timing.
207
+ Interpretation: lower is faster.
208
+ Caveat: includes local CLI overhead.
209
+ - `status`
210
+ Meaning: normalized run outcome such as `completed`, `failed`, `timeout`, `agent-unavailable`, `agent-limit-reached`, or `invalid-output`.
211
+ Appears in: experiment runs and reports.
212
+ Formula: outcome classification in `src/evaluation/classifyAgentRunOutcome.ts`.
213
+ Interpretation: explains whether a run is usable for comparison.
214
+ Caveat: external account/session failures are not code regressions.
215
+ - `tokenUsageSource`
216
+ Meaning: where token counts came from.
217
+ Appears in: experiment runs and reports.
218
+ Formula: adapter normalization from `src/agents`.
219
+ Interpretation: provider-reported sources are stronger than missing values.
220
+ Caveat: depends on adapter output format.
221
+ - `tokenUsageReliability`
222
+ Meaning: trust label for token usage fields.
223
+ Appears in: experiment runs and reports.
224
+ Formula: adapter normalization from `src/agents`.
225
+ Interpretation: stronger labels mean better comparison quality.
226
+ Caveat: missing or partial token fields reduce reliability.
227
+ - `inputTokens`
228
+ Meaning: provider-reported input token count when available.
229
+ Appears in: experiment runs and reports.
230
+ Formula: parsed from agent output.
231
+ Interpretation: lower means less prompt/context input.
232
+ Caveat: may be unavailable.
233
+ - `outputTokens`
234
+ Meaning: provider-reported output token count when available.
235
+ Appears in: experiment runs and reports.
236
+ Formula: parsed from agent output.
237
+ Interpretation: lower means a shorter generated response.
238
+ Caveat: may be unavailable.
239
+ - `totalTokens`
240
+ Meaning: provider-reported total token count when available.
241
+ Appears in: experiment runs, comparisons, and reports.
242
+ Formula: parsed from agent output or combined provider fields.
243
+ Interpretation: used for token savings comparisons.
244
+ Caveat: prompt estimates do not replace missing totals.
245
+ - `correctnessScore`
246
+ Meaning: deterministic answer-key-based correctness score.
247
+ Appears in: correctness artifacts and reports.
248
+ Formula: `0.25 * fileMatchScore + 0.25 * symbolMatchScore + 0.50 * factMatchScore`.
249
+ Interpretation: higher is better; pass threshold is `>= 0.70` with required fact checks.
250
+ Caveat: not semantic judging.
251
+ - `fileMatchScore`
252
+ Meaning: fraction of expected files found by the parsed answer.
253
+ Appears in: correctness artifacts and reports.
254
+ Formula: expected files found divided by expected files total.
255
+ Interpretation: higher means better file targeting.
256
+ Caveat: exact-file matching is strict.
257
+ - `symbolMatchScore`
258
+ Meaning: fraction of expected symbols found by the parsed answer.
259
+ Appears in: correctness artifacts and reports.
260
+ Formula: expected symbols found divided by expected symbols total.
261
+ Interpretation: higher means better symbol targeting.
262
+ Caveat: depends on parsed answer quality.
263
+ - `factMatchScore`
264
+ Meaning: weighted fraction of expected facts found by the parsed answer.
265
+ Appears in: correctness artifacts and reports.
266
+ Formula: matched fact weights divided by total fact weights.
267
+ Interpretation: higher means better factual correctness coverage.
268
+ Caveat: answer-key fact wording still matters.
269
+ - `tokenSavingsPercent`
270
+ Meaning: percent reduction in total tokens for my-dev-kit versus raw full-file.
271
+ Appears in: experiment comparisons, summaries, and reports.
272
+ Formula: `(rawTotalTokens - myDevKitTotalTokens) / rawTotalTokens * 100`.
273
+ Interpretation: positive means my-dev-kit used fewer tokens; negative means it used more.
274
+ Caveat: only valid when both paired runs expose total tokens.
275
+ - `durationReductionPercent`
276
+ Meaning: percent reduction in wall-clock duration for my-dev-kit versus raw full-file.
277
+ Appears in: experiment comparisons, summaries, and reports.
278
+ Formula: `(rawDurationMs - myDevKitDurationMs) / rawDurationMs * 100`.
279
+ Interpretation: positive means my-dev-kit was faster; negative means it was slower.
280
+ Caveat: local machine noise affects timing.
281
+ - `reliabilityLabel`
282
+ Meaning: comparison-level quality label such as `strong`, `correctness-only`, `partial`, `unavailable`, `limit-reached`, or `failed`.
283
+ Appears in: experiment comparisons and reports.
284
+ Formula: derived from paired run outcomes and metric availability.
285
+ Interpretation: stronger labels mean safer aggregate interpretation.
286
+ Caveat: comparison reliability is not the same as correctness.
@@ -0,0 +1,78 @@
1
+ {
2
+ "reportId": "demo-report",
3
+ "title": "Benchmark Validation Demo Report",
4
+ "projectName": "my-dev-kit-lab",
5
+ "benchmarkProject": "todo-ts",
6
+ "workflowName": "benchmark validation demo",
7
+ "generatedAt": "2026-06-10T15:00:00.000Z",
8
+ "summary": "Deterministic sample report for Prompt 2 report rendering and screenshot capture. This report does not claim token-savings evaluation.",
9
+ "steps": [
10
+ {
11
+ "id": "load-contracts",
12
+ "label": "Load benchmark contracts",
13
+ "command": "npm run verify:benchmarks",
14
+ "status": "pass",
15
+ "durationMs": 42,
16
+ "notes": "Validated benchmark contract structure."
17
+ },
18
+ {
19
+ "id": "run-project-tests",
20
+ "label": "Run benchmark project tests",
21
+ "command": "npm run test:benchmarks",
22
+ "status": "pass",
23
+ "durationMs": 118,
24
+ "notes": "Todo benchmark behavior stayed aligned."
25
+ },
26
+ {
27
+ "id": "prepare-report",
28
+ "label": "Prepare report artifacts",
29
+ "command": "npm run capture-demo-report",
30
+ "status": "pass",
31
+ "durationMs": 35,
32
+ "notes": "No token-savings metrics are reported in this demo."
33
+ }
34
+ ],
35
+ "metrics": [
36
+ {
37
+ "id": "benchmark-project-count",
38
+ "label": "Benchmark projects",
39
+ "value": 4,
40
+ "interpretation": "Prompt 1 benchmark suite is available."
41
+ },
42
+ {
43
+ "id": "step-count",
44
+ "label": "Workflow steps",
45
+ "value": 3,
46
+ "interpretation": "Demo workflow uses a small deterministic sequence."
47
+ },
48
+ {
49
+ "id": "warning-count",
50
+ "label": "Warnings",
51
+ "value": 1,
52
+ "interpretation": "This demo explicitly notes that token comparison is not implemented yet."
53
+ },
54
+ {
55
+ "id": "artifact-count",
56
+ "label": "Artifacts declared",
57
+ "value": 2,
58
+ "interpretation": "JSON and HTML are always expected before optional PNG capture."
59
+ }
60
+ ],
61
+ "artifacts": [
62
+ {
63
+ "id": "report-json",
64
+ "label": "Demo report JSON",
65
+ "path": "lab-output/demo-report/demo-report.json",
66
+ "kind": "json"
67
+ },
68
+ {
69
+ "id": "report-html",
70
+ "label": "Demo report HTML",
71
+ "path": "lab-output/demo-report/demo-report.html",
72
+ "kind": "html"
73
+ }
74
+ ],
75
+ "warnings": [
76
+ "Token-savings evaluation is not implemented in Prompt 2."
77
+ ]
78
+ }
@@ -0,0 +1,35 @@
1
+ [
2
+ {
3
+ "id": "todo-ts-create-task-demo",
4
+ "title": "Todo TS create task demo retrieval",
5
+ "benchmarkProject": "todo-ts",
6
+ "projectProfileRef": "todo-ts",
7
+ "targetRoot": "benchmarks/projects/todo-ts",
8
+ "sourceRoots": ["src", "tests"],
9
+ "query": "create task deterministic id task-1",
10
+ "expectedFiles": ["src/taskService.ts", "src/taskStore.ts"],
11
+ "expectedSymbols": ["createTask", "TaskService"],
12
+ "answerKey": {
13
+ "expectedFiles": ["src/taskService.ts", "src/taskStore.ts"],
14
+ "expectedSymbols": ["createTask", "TaskService"],
15
+ "expectedFacts": [
16
+ {
17
+ "id": "create-deterministic-id",
18
+ "text": "createTask assigns deterministic IDs such as task-1 and task-2.",
19
+ "weight": 1,
20
+ "required": true
21
+ },
22
+ {
23
+ "id": "create-stores-incomplete-task",
24
+ "text": "createTask stores new tasks with completed set to false.",
25
+ "weight": 1,
26
+ "required": true
27
+ }
28
+ ],
29
+ "minimumCorrectFacts": 2,
30
+ "notes": "Demo metadata prepares later correctness scoring without changing the current lab-demo command."
31
+ },
32
+ "rawIncludeGlobs": ["src/**/*", "tests/**/*"],
33
+ "notes": "Small single-case lab demo fixture."
34
+ }
35
+ ]
@@ -0,0 +1,118 @@
1
+ [
2
+ {
3
+ "id": "task-workflow-import-dedup",
4
+ "title": "Task workflow import and dedupe retrieval",
5
+ "benchmarkProject": "task-workflow-medium-ts",
6
+ "projectProfileRef": "task-workflow-medium-ts",
7
+ "targetRoot": "benchmarks/projects/task-workflow-medium-ts",
8
+ "sourceRoots": ["src", "tests"],
9
+ "query": "import tasks duplicate normalized title deterministic id summarize workflow project",
10
+ "expectedFiles": [
11
+ "src/services/importTasks.ts",
12
+ "src/store/taskStore.ts",
13
+ "src/validation/taskValidation.ts"
14
+ ],
15
+ "expectedSymbols": ["importTasks", "validateImportInput", "findDuplicate", "createTask"],
16
+ "answerKey": {
17
+ "expectedFiles": [
18
+ "src/services/importTasks.ts",
19
+ "src/store/taskStore.ts",
20
+ "src/validation/taskValidation.ts"
21
+ ],
22
+ "expectedSymbols": ["importTasks", "validateImportInput", "findDuplicate", "createTask"],
23
+ "expectedFacts": [
24
+ {
25
+ "id": "workflow-import-validates-title-and-project",
26
+ "text": "importTasks validates normalized task titles and project ids before inserting records.",
27
+ "weight": 1,
28
+ "required": true
29
+ },
30
+ {
31
+ "id": "workflow-import-skips-duplicates-by-project-and-normalized-title",
32
+ "text": "importTasks skips duplicates when a task with the same normalized title already exists in the same project.",
33
+ "weight": 1,
34
+ "required": true
35
+ },
36
+ {
37
+ "id": "workflow-import-keeps-deterministic-task-sequences",
38
+ "text": "New imported tasks still receive deterministic ids such as task-1 and task-2 from the shared store sequence.",
39
+ "weight": 1,
40
+ "required": true
41
+ }
42
+ ],
43
+ "minimumCorrectFacts": 3,
44
+ "notes": "This case is intended to require multiple files: service, validation, and store logic."
45
+ },
46
+ "rawIncludeGlobs": ["src/**/*", "tests/**/*"],
47
+ "notes": "Medium project case for real-agent comparison."
48
+ },
49
+ {
50
+ "id": "task-analytics-health-label",
51
+ "title": "Task analytics health label retrieval",
52
+ "benchmarkProject": "task-analytics-large-mixed",
53
+ "projectProfileRef": "task-analytics-large-mixed",
54
+ "targetRoot": "benchmarks/projects/task-analytics-large-mixed",
55
+ "sourceRoots": ["ts/src", "ts/tests", "py/task_analytics", "py/tests"],
56
+ "query": "completion rate stale tasks quality label health report build analytics snapshot mixed language",
57
+ "expectedFiles": [
58
+ "ts/src/services/buildAnalyticsSnapshot.ts",
59
+ "ts/src/reporting/formatTaskHealthReport.ts",
60
+ "py/task_analytics/metrics.py",
61
+ "py/task_analytics/quality.py",
62
+ "py/task_analytics/reporting.py"
63
+ ],
64
+ "expectedSymbols": [
65
+ "buildAnalyticsSnapshot",
66
+ "formatTaskHealthReport",
67
+ "calculate_project_metrics",
68
+ "determine_quality_label",
69
+ "build_health_report"
70
+ ],
71
+ "answerKey": {
72
+ "expectedFiles": [
73
+ "ts/src/services/buildAnalyticsSnapshot.ts",
74
+ "ts/src/reporting/formatTaskHealthReport.ts",
75
+ "py/task_analytics/metrics.py",
76
+ "py/task_analytics/quality.py",
77
+ "py/task_analytics/reporting.py"
78
+ ],
79
+ "expectedSymbols": [
80
+ "buildAnalyticsSnapshot",
81
+ "formatTaskHealthReport",
82
+ "calculate_project_metrics",
83
+ "determine_quality_label",
84
+ "build_health_report"
85
+ ],
86
+ "expectedFacts": [
87
+ {
88
+ "id": "analytics-snapshot-computes-completion-rate",
89
+ "text": "The analytics snapshot computes completionRate as completedTasks divided by totalTasks times 100, rounded to two decimals.",
90
+ "weight": 1,
91
+ "required": true
92
+ },
93
+ {
94
+ "id": "analytics-snapshot-counts-stale-open-tasks",
95
+ "text": "Stale tasks count only open tasks whose updated day is at least ten days behind the current day.",
96
+ "weight": 1,
97
+ "required": true
98
+ },
99
+ {
100
+ "id": "python-quality-labels-healthy-watch-risk",
101
+ "text": "The Python quality layer maps metrics to healthy, watch, or risk labels based on completion rate and stale task thresholds.",
102
+ "weight": 1,
103
+ "required": true
104
+ },
105
+ {
106
+ "id": "python-reporting-renders-quality-lines",
107
+ "text": "The Python report writer emits one line per project with the quality label plus completion, open, and stale counts.",
108
+ "weight": 1,
109
+ "required": true
110
+ }
111
+ ],
112
+ "minimumCorrectFacts": 3,
113
+ "notes": "This case intentionally spans TypeScript snapshot building and Python quality reporting."
114
+ },
115
+ "rawIncludeGlobs": ["ts/src/**/*", "ts/tests/**/*", "py/task_analytics/**/*", "py/tests/**/*"],
116
+ "notes": "Large mixed-language case for real-agent comparison."
117
+ }
118
+ ]
@@ -0,0 +1,122 @@
1
+ [
2
+ {
3
+ "id": "todo-ts-create-task",
4
+ "title": "Todo TS create task retrieval",
5
+ "benchmarkProject": "todo-ts",
6
+ "projectProfileRef": "todo-ts",
7
+ "targetRoot": "benchmarks/projects/todo-ts",
8
+ "sourceRoots": ["src", "tests"],
9
+ "query": "create task deterministic id task-1",
10
+ "expectedFiles": ["src/taskService.ts", "src/taskStore.ts"],
11
+ "expectedSymbols": ["createTask", "TaskService"],
12
+ "answerKey": {
13
+ "expectedFiles": ["src/taskService.ts", "src/taskStore.ts"],
14
+ "expectedSymbols": ["createTask", "TaskService"],
15
+ "expectedFacts": [
16
+ {
17
+ "id": "create-deterministic-id",
18
+ "text": "createTask assigns deterministic IDs such as task-1 and task-2.",
19
+ "weight": 1,
20
+ "required": true
21
+ },
22
+ {
23
+ "id": "create-validates-title",
24
+ "text": "createTask validates that the title is not empty or whitespace-only.",
25
+ "weight": 1,
26
+ "required": true
27
+ }
28
+ ],
29
+ "minimumCorrectFacts": 2,
30
+ "notes": "Example metadata is optional for the current token-savings evaluator."
31
+ },
32
+ "rawIncludeGlobs": ["src/**/*", "tests/**/*"],
33
+ "notes": "TypeScript create task path."
34
+ },
35
+ {
36
+ "id": "todo-python-complete-task",
37
+ "title": "Todo Python complete task retrieval",
38
+ "benchmarkProject": "todo-python",
39
+ "projectProfileRef": "todo-python",
40
+ "targetRoot": "benchmarks/projects/todo-python",
41
+ "sourceRoots": ["src", "tests"],
42
+ "query": "complete task by id",
43
+ "expectedFiles": ["src/task_service.py"],
44
+ "expectedSymbols": ["complete_task"],
45
+ "answerKey": {
46
+ "expectedFiles": ["src/task_service.py"],
47
+ "expectedSymbols": ["complete_task"],
48
+ "expectedFacts": [
49
+ {
50
+ "id": "complete-finds-by-id",
51
+ "text": "complete_task locates the matching task by id.",
52
+ "weight": 1,
53
+ "required": true
54
+ },
55
+ {
56
+ "id": "complete-marks-completed",
57
+ "text": "complete_task marks the matching task as completed.",
58
+ "weight": 1,
59
+ "required": true
60
+ }
61
+ ],
62
+ "minimumCorrectFacts": 2
63
+ },
64
+ "rawIncludeGlobs": ["src/**/*", "tests/**/*"]
65
+ },
66
+ {
67
+ "id": "todo-js-open-tasks",
68
+ "title": "Todo JS open tasks retrieval",
69
+ "benchmarkProject": "todo-js",
70
+ "projectProfileRef": "todo-js",
71
+ "targetRoot": "benchmarks/projects/todo-js",
72
+ "sourceRoots": ["src", "tests"],
73
+ "query": "list open tasks incomplete tasks",
74
+ "expectedFiles": ["src/taskService.js"],
75
+ "expectedSymbols": ["listOpenTasks"],
76
+ "answerKey": {
77
+ "expectedFiles": ["src/taskService.js"],
78
+ "expectedSymbols": ["listOpenTasks"],
79
+ "expectedFacts": [
80
+ {
81
+ "id": "open-filters-incomplete",
82
+ "text": "listOpenTasks returns tasks where completed is false.",
83
+ "weight": 1,
84
+ "required": true
85
+ }
86
+ ],
87
+ "minimumCorrectFacts": 1
88
+ },
89
+ "rawIncludeGlobs": ["src/**/*", "tests/**/*"]
90
+ },
91
+ {
92
+ "id": "todo-mixed-summary",
93
+ "title": "Todo mixed summary retrieval",
94
+ "benchmarkProject": "todo-mixed-ts-py",
95
+ "projectProfileRef": "todo-mixed-ts-py",
96
+ "targetRoot": "benchmarks/projects/todo-mixed-ts-py",
97
+ "sourceRoots": ["src", "python", "tests"],
98
+ "query": "summarize tasks total open completed",
99
+ "expectedFiles": ["src/taskCli.ts", "python/task_service.py"],
100
+ "expectedSymbols": ["summarizeTasks", "summarize_tasks"],
101
+ "answerKey": {
102
+ "expectedFiles": ["src/taskCli.ts", "python/task_service.py"],
103
+ "expectedSymbols": ["summarizeTasks", "summarize_tasks"],
104
+ "expectedFacts": [
105
+ {
106
+ "id": "summary-total",
107
+ "text": "Summary reports total task count.",
108
+ "weight": 1,
109
+ "required": true
110
+ },
111
+ {
112
+ "id": "summary-open-completed",
113
+ "text": "Summary reports open and completed task counts.",
114
+ "weight": 1,
115
+ "required": true
116
+ }
117
+ ],
118
+ "minimumCorrectFacts": 2
119
+ },
120
+ "rawIncludeGlobs": ["src/**/*", "python/**/*", "tests/**/*"]
121
+ }
122
+ ]