evalkit-py 0.2.0.dev12__py3-none-any.whl

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 (371) hide show
  1. evalkit/__init__.py +0 -0
  2. evalkit/api/__init__.py +0 -0
  3. evalkit/api/access.py +74 -0
  4. evalkit/api/agents.py +159 -0
  5. evalkit/api/app.py +360 -0
  6. evalkit/api/auth.py +225 -0
  7. evalkit/api/cli_dist.py +10 -0
  8. evalkit/api/datasets.py +169 -0
  9. evalkit/api/deps.py +79 -0
  10. evalkit/api/download.py +15 -0
  11. evalkit/api/evaluators.py +121 -0
  12. evalkit/api/experiments.py +616 -0
  13. evalkit/api/fixtures.py +95 -0
  14. evalkit/api/harness_check.py +48 -0
  15. evalkit/api/imports.py +180 -0
  16. evalkit/api/limits.py +84 -0
  17. evalkit/api/llm_providers.py +120 -0
  18. evalkit/api/mcp/__init__.py +0 -0
  19. evalkit/api/mcp/auth.py +100 -0
  20. evalkit/api/mcp/descriptions.py +336 -0
  21. evalkit/api/mcp/models.py +259 -0
  22. evalkit/api/mcp/server.py +101 -0
  23. evalkit/api/mcp/tools.py +844 -0
  24. evalkit/api/meta.py +19 -0
  25. evalkit/api/otel.py +350 -0
  26. evalkit/api/pull.py +197 -0
  27. evalkit/api/review.py +271 -0
  28. evalkit/api/runs.py +555 -0
  29. evalkit/api/server_keys.py +44 -0
  30. evalkit/api/tokens.py +51 -0
  31. evalkit/api/trace_imports.py +173 -0
  32. evalkit/api/trace_sources.py +49 -0
  33. evalkit/api/traces.py +196 -0
  34. evalkit/api/users.py +72 -0
  35. evalkit/api/workspaces.py +131 -0
  36. evalkit/bundled/contracts/atif-accepted.json +5 -0
  37. evalkit/bundled/contracts/custom-evaluator-api-v1.json +243 -0
  38. evalkit/bundled/contracts/harness-api-v1.json +938 -0
  39. evalkit/bundled/contracts/span-mapping-v1.json +314 -0
  40. evalkit/bundled/docs/concepts.md +26 -0
  41. evalkit/bundled/docs/config.md +38 -0
  42. evalkit/bundled/docs/harness-api.md +44 -0
  43. evalkit/bundled/docs/install.md +60 -0
  44. evalkit/bundled/docs/login.md +36 -0
  45. evalkit/bundled/docs/mappings.md +136 -0
  46. evalkit/bundled/docs/mcp.md +44 -0
  47. evalkit/bundled/docs/quickstart.md +142 -0
  48. evalkit/bundled/docs/sdk-runs.md +171 -0
  49. evalkit/bundled/docs/tracing.md +171 -0
  50. evalkit/bundled/docs/try-locally.md +288 -0
  51. evalkit/bundled/docs/workspaces.md +45 -0
  52. evalkit/bundled/skills/authoring-eval-cases/SKILL.md +387 -0
  53. evalkit/bundled/skills/authoring-eval-cases/references/overlays.md +83 -0
  54. evalkit/bundled/skills/authoring-eval-cases/references/tool-checks.md +71 -0
  55. evalkit/bundled/skills/connect-traces/SKILL.md +296 -0
  56. evalkit/bundled/skills/connect-traces/references/gen_ai.json +42 -0
  57. evalkit/bundled/skills/connect-traces/references/openinference.json +35 -0
  58. evalkit/bundled/skills/connect-traces/references/span-mapping-schema.md +88 -0
  59. evalkit/bundled/skills/eval-driven-development/SKILL.md +458 -0
  60. evalkit/bundled/skills/eval-driven-development/references/analyze-run.md +97 -0
  61. evalkit/bundled/skills/eval-driven-development/references/diagnose.md +130 -0
  62. evalkit/bundled/skills/eval-driven-development/references/synthesize-cases.md +87 -0
  63. evalkit/bundled/skills/eval-driven-development/references/synthesize.md +165 -0
  64. evalkit/bundled/skills/evalkit-deployment/SKILL.md +332 -0
  65. evalkit/bundled/skills/evalkit-deployment/config.example.yaml +49 -0
  66. evalkit/bundled/skills/evalkit-deployment/docker-compose.yml +51 -0
  67. evalkit/bundled/skills/evalkit-deployment/references/config-and-deploy.md +333 -0
  68. evalkit/bundled/skills/evalkit-deployment/references/harness-api.md +139 -0
  69. evalkit/bundled/skills/evalkit-deployment/try/.env.example +11 -0
  70. evalkit/bundled/skills/evalkit-deployment/try/agent.py +131 -0
  71. evalkit/bundled/skills/evalkit-deployment/try/cases/acme/balance-sheet/cases.yaml +25 -0
  72. evalkit/bundled/skills/evalkit-deployment/try/cases/acme/income-statement/cases.yaml +43 -0
  73. evalkit/bundled/skills/evalkit-deployment/try/config.yaml +17 -0
  74. evalkit/bundled/skills/evalkit-deployment/try/docker-compose.yml +82 -0
  75. evalkit/bundled/skills/evalkit-deployment/try/evalkit.yaml +4 -0
  76. evalkit/bundled/skills/evalkit-deployment/try/mapping.json +42 -0
  77. evalkit/bundled/skills/evalkit-deployment/try/run.py +33 -0
  78. evalkit/bundled/skills/evalkit-usage/SKILL.md +509 -0
  79. evalkit/bundled/skills/evalkit-usage/references/suite-fixtures.md +42 -0
  80. evalkit/bundled/ui/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  81. evalkit/bundled/ui/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  82. evalkit/bundled/ui/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  83. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  84. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  85. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  86. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  87. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  88. evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  89. evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  90. evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  91. evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  92. evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  93. evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  94. evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  95. evalkit/bundled/ui/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  96. evalkit/bundled/ui/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  97. evalkit/bundled/ui/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  98. evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  99. evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  100. evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  101. evalkit/bundled/ui/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  102. evalkit/bundled/ui/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  103. evalkit/bundled/ui/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  104. evalkit/bundled/ui/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  105. evalkit/bundled/ui/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  106. evalkit/bundled/ui/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  107. evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  108. evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  109. evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  110. evalkit/bundled/ui/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  111. evalkit/bundled/ui/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  112. evalkit/bundled/ui/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  113. evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  114. evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  115. evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  116. evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  117. evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  118. evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  119. evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  120. evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  121. evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  122. evalkit/bundled/ui/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  123. evalkit/bundled/ui/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  124. evalkit/bundled/ui/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  125. evalkit/bundled/ui/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  126. evalkit/bundled/ui/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  127. evalkit/bundled/ui/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  128. evalkit/bundled/ui/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  129. evalkit/bundled/ui/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  130. evalkit/bundled/ui/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  131. evalkit/bundled/ui/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  132. evalkit/bundled/ui/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  133. evalkit/bundled/ui/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  134. evalkit/bundled/ui/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  135. evalkit/bundled/ui/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  136. evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  137. evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  138. evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  139. evalkit/bundled/ui/assets/abap-08VXUWAP.js +1 -0
  140. evalkit/bundled/ui/assets/apex-BWPQTe0t.js +1 -0
  141. evalkit/bundled/ui/assets/azcli-Bc_sGQ0U.js +1 -0
  142. evalkit/bundled/ui/assets/bat-i0X4ZdIN.js +1 -0
  143. evalkit/bundled/ui/assets/bicep-B5-_aFwp.js +2 -0
  144. evalkit/bundled/ui/assets/cameligo-DMUM7wLl.js +1 -0
  145. evalkit/bundled/ui/assets/clojure-Cm7r79vr.js +1 -0
  146. evalkit/bundled/ui/assets/codicon-DF1abBS2.ttf +0 -0
  147. evalkit/bundled/ui/assets/coffee-Ba7i2nA0.js +1 -0
  148. evalkit/bundled/ui/assets/cpp-C7h46wYY.js +1 -0
  149. evalkit/bundled/ui/assets/csharp-BKxtCVv1.js +1 -0
  150. evalkit/bundled/ui/assets/csp-bTuwJoIa.js +1 -0
  151. evalkit/bundled/ui/assets/css-DIMkf-bt.js +3 -0
  152. evalkit/bundled/ui/assets/css.worker-DwfUZ3fB.js +96 -0
  153. evalkit/bundled/ui/assets/cssMode-C97l1pbB.js +1 -0
  154. evalkit/bundled/ui/assets/cypher-CVaqCwHa.js +1 -0
  155. evalkit/bundled/ui/assets/dart-onAF5SnQ.js +1 -0
  156. evalkit/bundled/ui/assets/dockerfile-DZFCIeNp.js +1 -0
  157. evalkit/bundled/ui/assets/ecl-94qehhXe.js +1 -0
  158. evalkit/bundled/ui/assets/editor-DjpsE8to.css +1 -0
  159. evalkit/bundled/ui/assets/editor.api-NTesIxw5.js +908 -0
  160. evalkit/bundled/ui/assets/editor.worker-CRz__AKW.js +33 -0
  161. evalkit/bundled/ui/assets/elixir-6RTg0lbw.js +1 -0
  162. evalkit/bundled/ui/assets/flow9-C5_-GSwl.js +1 -0
  163. evalkit/bundled/ui/assets/freemarker2-BWqEFagp.js +3 -0
  164. evalkit/bundled/ui/assets/fsharp-C8Ef5oNN.js +1 -0
  165. evalkit/bundled/ui/assets/go-C-y9NEjX.js +1 -0
  166. evalkit/bundled/ui/assets/graphql-fmXr3nnJ.js +1 -0
  167. evalkit/bundled/ui/assets/handlebars-DkIF-whN.js +1 -0
  168. evalkit/bundled/ui/assets/hcl-CpzslTdj.js +1 -0
  169. evalkit/bundled/ui/assets/html-C_rpeQXJ.js +1 -0
  170. evalkit/bundled/ui/assets/html.worker-D9ugpX4y.js +509 -0
  171. evalkit/bundled/ui/assets/htmlMode-B0YIq3DF.js +1 -0
  172. evalkit/bundled/ui/assets/index-Cw-jBH6M.js +736 -0
  173. evalkit/bundled/ui/assets/index-DKtoQZtm.css +1 -0
  174. evalkit/bundled/ui/assets/ini-sBoK_t0W.js +1 -0
  175. evalkit/bundled/ui/assets/java-BEtHBSE6.js +1 -0
  176. evalkit/bundled/ui/assets/javascript-D4EGhYA6.js +1 -0
  177. evalkit/bundled/ui/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  178. evalkit/bundled/ui/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  179. evalkit/bundled/ui/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  180. evalkit/bundled/ui/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  181. evalkit/bundled/ui/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  182. evalkit/bundled/ui/assets/json.worker-CV9fqkUp.js +65 -0
  183. evalkit/bundled/ui/assets/jsonMode-pQjSfIH6.js +7 -0
  184. evalkit/bundled/ui/assets/julia-Bri6UV-V.js +1 -0
  185. evalkit/bundled/ui/assets/kotlin-BOotOW0E.js +1 -0
  186. evalkit/bundled/ui/assets/less-B9JPFI3C.js +2 -0
  187. evalkit/bundled/ui/assets/lexon-CfSJPG6W.js +1 -0
  188. evalkit/bundled/ui/assets/liquid-DbrvoYjD.js +1 -0
  189. evalkit/bundled/ui/assets/lspLanguageFeatures-D0B7cH6y.js +4 -0
  190. evalkit/bundled/ui/assets/lua-CsQS60Ue.js +1 -0
  191. evalkit/bundled/ui/assets/m3-D-oSqn_W.js +1 -0
  192. evalkit/bundled/ui/assets/markdown-Cimd5fb3.js +1 -0
  193. evalkit/bundled/ui/assets/mdx-B0HrujLR.js +1 -0
  194. evalkit/bundled/ui/assets/mips-CIPQ_RoX.js +1 -0
  195. evalkit/bundled/ui/assets/monacoEditor-DsoPncxW.js +68 -0
  196. evalkit/bundled/ui/assets/monacoEditor-n7clI0si.css +1 -0
  197. evalkit/bundled/ui/assets/msdax-DauUninz.js +1 -0
  198. evalkit/bundled/ui/assets/mysql-SOo6toE5.js +1 -0
  199. evalkit/bundled/ui/assets/objective-c-FvmIjYaQ.js +1 -0
  200. evalkit/bundled/ui/assets/pascal-DrH0SRf2.js +1 -0
  201. evalkit/bundled/ui/assets/pascaligo-D-ptJ9y-.js +1 -0
  202. evalkit/bundled/ui/assets/perl-oz_6vUea.js +1 -0
  203. evalkit/bundled/ui/assets/pgsql-DTj74zXo.js +1 -0
  204. evalkit/bundled/ui/assets/php-nr791fC2.js +1 -0
  205. evalkit/bundled/ui/assets/pla-CopQ2nXW.js +1 -0
  206. evalkit/bundled/ui/assets/postiats-43DmfD33.js +1 -0
  207. evalkit/bundled/ui/assets/powerquery-D3hlyOfw.js +1 -0
  208. evalkit/bundled/ui/assets/powershell-DmHpPYUd.js +1 -0
  209. evalkit/bundled/ui/assets/protobuf-C531GsRP.js +2 -0
  210. evalkit/bundled/ui/assets/pug-Z5eAx3Zn.js +1 -0
  211. evalkit/bundled/ui/assets/python-CieHVM9n.js +1 -0
  212. evalkit/bundled/ui/assets/qsharp-DkqhCAOL.js +1 -0
  213. evalkit/bundled/ui/assets/r-BwWrilGY.js +1 -0
  214. evalkit/bundled/ui/assets/razor-sLewSMyp.js +1 -0
  215. evalkit/bundled/ui/assets/redis-ClamHrr6.js +1 -0
  216. evalkit/bundled/ui/assets/redshift-DT7zqm-g.js +1 -0
  217. evalkit/bundled/ui/assets/restructuredtext-BYgofb2h.js +1 -0
  218. evalkit/bundled/ui/assets/ruby-DezsRK8O.js +1 -0
  219. evalkit/bundled/ui/assets/rust-DdL9SqIa.js +1 -0
  220. evalkit/bundled/ui/assets/sb-CcwsVR0C.js +1 -0
  221. evalkit/bundled/ui/assets/scala-DHpiXF5c.js +1 -0
  222. evalkit/bundled/ui/assets/scheme-BeGwcela.js +1 -0
  223. evalkit/bundled/ui/assets/scss-gp-XZpBa.js +3 -0
  224. evalkit/bundled/ui/assets/shell-CC2rA5mh.js +1 -0
  225. evalkit/bundled/ui/assets/solidity-BEEn4gHE.js +1 -0
  226. evalkit/bundled/ui/assets/sophia-CRfGWb83.js +1 -0
  227. evalkit/bundled/ui/assets/sparql-D_Lu-MrJ.js +1 -0
  228. evalkit/bundled/ui/assets/sql-NEE52Syq.js +1 -0
  229. evalkit/bundled/ui/assets/st-DbInun42.js +1 -0
  230. evalkit/bundled/ui/assets/swift-Bxkupp3x.js +1 -0
  231. evalkit/bundled/ui/assets/systemverilog-Bz4Y3fRF.js +1 -0
  232. evalkit/bundled/ui/assets/tcl-DISqw1ZD.js +1 -0
  233. evalkit/bundled/ui/assets/ts.worker-DIAQkoB3.js +67741 -0
  234. evalkit/bundled/ui/assets/tsMode-BcVQ1nu0.js +11 -0
  235. evalkit/bundled/ui/assets/twig-De2hgUGE.js +1 -0
  236. evalkit/bundled/ui/assets/typescript-CUvNWd9p.js +1 -0
  237. evalkit/bundled/ui/assets/typespec-B8J7ngcE.js +1 -0
  238. evalkit/bundled/ui/assets/vb-DV3o63ZY.js +1 -0
  239. evalkit/bundled/ui/assets/wgsl-DpFanUEy.js +298 -0
  240. evalkit/bundled/ui/assets/workers-CwpYQtzp.js +1 -0
  241. evalkit/bundled/ui/assets/xml-C1HnXMdF.js +1 -0
  242. evalkit/bundled/ui/assets/yaml-D7Ey3HQu.js +1 -0
  243. evalkit/bundled/ui/favicon.svg +6 -0
  244. evalkit/bundled/ui/index.html +14 -0
  245. evalkit/cli/__init__.py +0 -0
  246. evalkit/cli/admin_commands.py +590 -0
  247. evalkit/cli/client.py +67 -0
  248. evalkit/cli/init_server.py +165 -0
  249. evalkit/cli/local_run.py +195 -0
  250. evalkit/cli/main.py +1365 -0
  251. evalkit/cli/runs_commands.py +539 -0
  252. evalkit/cli/server_commands.py +130 -0
  253. evalkit/cli/skill_targets.py +43 -0
  254. evalkit/cli/tokens_commands.py +52 -0
  255. evalkit/cli/traces_commands.py +332 -0
  256. evalkit/cli/update.py +85 -0
  257. evalkit/client/__init__.py +0 -0
  258. evalkit/client/agents.py +25 -0
  259. evalkit/client/api.py +193 -0
  260. evalkit/client/blob.py +104 -0
  261. evalkit/client/connection.py +88 -0
  262. evalkit/client/evaluators.py +11 -0
  263. evalkit/client/sessions.py +17 -0
  264. evalkit/client/store.py +139 -0
  265. evalkit/client/summary.py +46 -0
  266. evalkit/client/sync.py +198 -0
  267. evalkit/config.py +227 -0
  268. evalkit/contracts/__init__.py +0 -0
  269. evalkit/contracts/atif.py +115 -0
  270. evalkit/contracts/cases.py +456 -0
  271. evalkit/contracts/custom_evaluator.py +58 -0
  272. evalkit/contracts/enums.py +86 -0
  273. evalkit/contracts/esf.py +120 -0
  274. evalkit/contracts/harness.py +281 -0
  275. evalkit/contracts/notes.json +4 -0
  276. evalkit/contracts/notes.py +7 -0
  277. evalkit/contracts/settings.py +41 -0
  278. evalkit/core/__init__.py +0 -0
  279. evalkit/core/access.py +75 -0
  280. evalkit/core/agents.py +65 -0
  281. evalkit/core/blob.py +46 -0
  282. evalkit/core/capabilities.py +36 -0
  283. evalkit/core/costmap.py +90 -0
  284. evalkit/core/custom_eval.py +50 -0
  285. evalkit/core/data/cost_map.json +81546 -0
  286. evalkit/core/endpoints.py +31 -0
  287. evalkit/core/evaluators/__init__.py +29 -0
  288. evalkit/core/evaluators/base.py +121 -0
  289. evalkit/core/evaluators/gauges.py +84 -0
  290. evalkit/core/evaluators/presentation.py +166 -0
  291. evalkit/core/evaluators/response_time.py +21 -0
  292. evalkit/core/evaluators/rubrics.py +494 -0
  293. evalkit/core/evaluators/tool_trajectory.py +187 -0
  294. evalkit/core/evaluators/trajectory_rubrics.py +198 -0
  295. evalkit/core/fixtures.py +57 -0
  296. evalkit/core/harness.py +227 -0
  297. evalkit/core/harness_check.py +191 -0
  298. evalkit/core/importer.py +257 -0
  299. evalkit/core/judge.py +78 -0
  300. evalkit/core/lint.py +265 -0
  301. evalkit/core/overlays.py +76 -0
  302. evalkit/core/paths.py +25 -0
  303. evalkit/core/promotion.py +94 -0
  304. evalkit/core/pull.py +198 -0
  305. evalkit/core/python_eval.py +59 -0
  306. evalkit/core/remote_evaluators.py +32 -0
  307. evalkit/core/review.py +220 -0
  308. evalkit/core/run_digest.py +421 -0
  309. evalkit/core/runner.py +995 -0
  310. evalkit/core/scorecard.py +255 -0
  311. evalkit/core/traces/__init__.py +0 -0
  312. evalkit/core/traces/convert.py +336 -0
  313. evalkit/core/traces/importer.py +113 -0
  314. evalkit/core/traces/mapping.py +385 -0
  315. evalkit/core/traces/poll.py +38 -0
  316. evalkit/core/traces/raw.py +21 -0
  317. evalkit/core/traces/sessions.py +172 -0
  318. evalkit/core/traces/settle.py +14 -0
  319. evalkit/core/traces/sources/__init__.py +19 -0
  320. evalkit/core/traces/sources/base.py +25 -0
  321. evalkit/core/traces/sources/phoenix.py +121 -0
  322. evalkit/core/trajectory.py +248 -0
  323. evalkit/core/workspace.py +30 -0
  324. evalkit/credentials.py +119 -0
  325. evalkit/db/__init__.py +0 -0
  326. evalkit/db/agents.py +289 -0
  327. evalkit/db/alembic/env.py +90 -0
  328. evalkit/db/alembic/script.py.mako +28 -0
  329. evalkit/db/alembic/versions/0011_baseline.py +1002 -0
  330. evalkit/db/alembic/versions/0012_ticket_token_kind.py +27 -0
  331. evalkit/db/alembic/versions/0013_keys_and_llm_providers.py +67 -0
  332. evalkit/db/cases.py +608 -0
  333. evalkit/db/crypto.py +12 -0
  334. evalkit/db/evaluators.py +156 -0
  335. evalkit/db/experiments.py +363 -0
  336. evalkit/db/fixture_blobs.py +91 -0
  337. evalkit/db/keys.py +78 -0
  338. evalkit/db/llm_providers.py +176 -0
  339. evalkit/db/locks.py +6 -0
  340. evalkit/db/mappings.py +168 -0
  341. evalkit/db/models.py +567 -0
  342. evalkit/db/promotion.py +271 -0
  343. evalkit/db/rekey.py +46 -0
  344. evalkit/db/review.py +250 -0
  345. evalkit/db/review_state.py +50 -0
  346. evalkit/db/runs.py +533 -0
  347. evalkit/db/scorecard.py +300 -0
  348. evalkit/db/session.py +71 -0
  349. evalkit/db/sessions.py +90 -0
  350. evalkit/db/spans.py +360 -0
  351. evalkit/db/store.py +209 -0
  352. evalkit/db/tokens.py +100 -0
  353. evalkit/db/trace_imports.py +308 -0
  354. evalkit/db/trace_sources.py +131 -0
  355. evalkit/db/users.py +186 -0
  356. evalkit/db/workspaces.py +232 -0
  357. evalkit/paths.py +33 -0
  358. evalkit/sdk/__init__.py +29 -0
  359. evalkit/sdk/binding.py +69 -0
  360. evalkit/sdk/evaluators.py +56 -0
  361. evalkit/sdk/runner.py +957 -0
  362. evalkit/sdk/tracing.py +166 -0
  363. evalkit/store/__init__.py +0 -0
  364. evalkit/store/base.py +354 -0
  365. evalkit/store/blob.py +69 -0
  366. evalkit/version.py +44 -0
  367. evalkit_py-0.2.0.dev12.dist-info/METADATA +205 -0
  368. evalkit_py-0.2.0.dev12.dist-info/RECORD +371 -0
  369. evalkit_py-0.2.0.dev12.dist-info/WHEEL +4 -0
  370. evalkit_py-0.2.0.dev12.dist-info/entry_points.txt +2 -0
  371. evalkit_py-0.2.0.dev12.dist-info/licenses/LICENSE +661 -0
@@ -0,0 +1,130 @@
1
+ # Diagnose one eval failure
2
+
3
+ Instructions for diagnosing **one** eval failure (one failing case) from its
4
+ pulled run directories and returning one structured JSON finding (root cause +
5
+ surface + evidence). On agents with subagent support, dispatch these
6
+ instructions as a read-only subagent, one per failing case; otherwise follow
7
+ them inline, one failure at a time. Input: the absolute paths of the case's
8
+ `runs/<run_id>/` directories produced by `evalkit runs pull --experiment`
9
+ (one per repetition), plus the repo checkout(s) of the agent under test.
10
+
11
+ ## What you may touch
12
+
13
+ - **Read access to the entire repo.** Use read-only inspection (`cat`,
14
+ `grep`, `jq`, `ls`, `git log`/`git show` — never anything that writes).
15
+ - **Hard rule: never modify the code repo.** No writes, no edits. You may
16
+ write throwaway scratch scripts under a temp dir to reproduce or probe a
17
+ root cause — but never create, edit, move, or delete anything inside the
18
+ repository. Your finding IS your final output; you have no repo-write step.
19
+
20
+ ## How to diagnose
21
+
22
+ 1. Read every file in each run directory. Weigh every section:
23
+ - `case.json` (`input`, `expected`, `evaluators`) and `evaluations.json` —
24
+ what went wrong on the surface and which evaluator(s) scored low and why (read
25
+ each `explanation`; judge-backed evaluators pack per-item verdicts into
26
+ it as JSON).
27
+ - each run's `trajectory.json` — its ATIF trajectory. Steps run in
28
+ `step_id` order; each step's `tool_calls` carry structured `arguments`,
29
+ their results are in `observation.results` (matched by `source_call_id`;
30
+ `extra.is_error: true` marks a failed call, `extra.error_type` its kind
31
+ when the harness sets it), and `timestamp` shows where time went.
32
+ Delegated work is in `subagent_trajectories`, one trajectory per
33
+ subagent. When a result was shortened by the harness, the full output is
34
+ at its `extra.full_output_path`; fetch it with `evalkit runs files <pull
35
+ dir> <run_id> --path <that path>` (see the run's files below).
36
+ **This is the strongest signal for *why* it failed.** Look for: retry
37
+ loops (same call re-issued after a non-fatal error), discovery overhead
38
+ (probing for a schema or identifier that should be derivable first-try),
39
+ wrong-then-right argument values, dead-end pivots. Treat these as
40
+ diagnosable in their own right: a tool the model can't call correctly the
41
+ first time is a real defect even when the run eventually recovers. Record
42
+ each shape in `trajectory_patterns` and localize the surface that would
43
+ make the correct call derivable first-try.
44
+ - `run.json` `status`, `answer`, `metrics` and `error` — timeouts, token blowups,
45
+ run crashes. `metrics.by_trajectory` splits tokens, cost and tool calls
46
+ per trajectory: `main`, then one entry per subagent keyed like the
47
+ evidence refs below, each with its `agent` name.
48
+ - the run's files — its deliverables and other workspace files;
49
+ read them (including images, which enter your context) to judge the
50
+ deliverable directly. `evalkit runs pull` does not fetch them. When you
51
+ need them, `evalkit runs files <pull dir> <run_id>` lists the tree, and
52
+ `--path <file or folder>` fetches only those into
53
+ `runs/<run_id>/files/<path>`.
54
+ 2. Trace the surface (skill / tool / prompt / data) responsible. Open the
55
+ actual files in the repo to confirm — cite concrete paths.
56
+ 3. The run is history: it shows the agent as of `run.json` `started_at`, and
57
+ the repo may have moved on. Run `git log --since=<started_at> -- <surface
58
+ file>` (and `git log -S '<text from the trajectory>'` for prompt or tool
59
+ text) and read any commit that touches the surface. Commit dates reset on
60
+ rebase and squash merge, so also read the last few commits on the surface
61
+ file (`git log -n 10 -- <file>`) whatever their date. If a later commit
62
+ already fixes the failure, fill `already_addressed` with its sha and one
63
+ line on what it changed, and keep `suggested_direction` to "re-run to
64
+ confirm".
65
+ 4. If the capability the case needs does not exist at all, that is
66
+ `root_cause: absent` / `surface.kind: absent` — the build-new-capability
67
+ case.
68
+ 5. When the surface is a skill or another authored prompt, judge it against
69
+ the authoring standards too — a bloated, coupled, or weakly-described skill
70
+ is itself a candidate root cause (`skill-gap` / `prompt-ambiguity`).
71
+
72
+ ## Output — return ONLY this JSON object
73
+
74
+ No prose before or after. A single JSON object matching this schema exactly:
75
+
76
+ ```json
77
+ {
78
+ "case_id": "<from case.json>",
79
+ "verdict": "failed | borderline",
80
+ "root_cause": "skill-gap | tool-wrong-shape | tool-wrong-data | tool-call-inefficiency | prompt-ambiguity | hallucination | data-missing | absent | unknown",
81
+ "surface": {"kind": "skill | tool | prompt | mcp | data | absent", "name": "<surface name>", "file": "<repo path or null>"},
82
+ "evidence": [
83
+ {"type": "trajectory-span | evaluator | artifact | prose", "ref": "<main:<step_id> or <trajectory_id>:<step_id> / evaluator name / artifact path>", "detail": "<one specific line>"}
84
+ ],
85
+ "trajectory_patterns": ["<short label of a recurring shape, e.g. 'lookup -> latest_lookup retry, +1 turn'>"],
86
+ "confidence": 0.0,
87
+ "already_addressed": null,
88
+ "coverage_gap": null,
89
+ "suggested_direction": "<one or two sentences: where the fix likely belongs and why — direction, not a diff>"
90
+ }
91
+ ```
92
+
93
+ Rules for the finding:
94
+
95
+ - Every `evidence` entry must cite something concrete (a step as
96
+ `main:<step_id>` or `<trajectory_id>:<step_id>` — `subagent_trajectories[<n>]:<step_id>`
97
+ when the subagent has no `trajectory_id` — an evaluator name, an artifact
98
+ path, a quoted line). No vague evidence.
99
+ - Use `root_cause: tool-call-inefficiency` when the defect is *how* the agent
100
+ reached a right-or-close answer — retried/errored/redundant calls or
101
+ discovery overhead — rather than a wrong final call shape
102
+ (`tool-wrong-shape`) or wrong data (`tool-wrong-data`). Point `surface` at
103
+ the tool description or skill that would remove the wasted turns, and
104
+ populate `trajectory_patterns`.
105
+ - `surface.file` must be a path that exists in the repo, or `null` if you
106
+ genuinely cannot localize it (then set `root_cause: unknown` or `absent`).
107
+ - If a run's `run.json` has a non-null `error` (the agent run's own error), set
108
+ `root_cause: unknown`, `verdict: failed`, and put the error in `evidence`.
109
+ - If a run's `run.json` has a non-null `pull_error`, evalkit could not fetch
110
+ it in full and there is no `trajectory.json`; diagnose from the other runs
111
+ of the case, and if none is complete, set `root_cause: unknown` and cite the
112
+ `pull_error`.
113
+ - `confidence` is your own 0–1 estimate.
114
+ - `already_addressed` is `null`, or `{"commit": "<sha>", "detail": "<what it
115
+ changed>"}` when a commit made after the run already changes the failing
116
+ surface in a way that fixes it.
117
+ - `coverage_gap` is `null`, or `{"kind": "uncovered_scenario | wrong_case",
118
+ "note": "<one line>"}`. Use `uncovered_scenario` when the failure shows a
119
+ nearby scenario no case in the suite asserts (search the suite's case YAML
120
+ before saying so). Use `wrong_case` when the expected answer is not
121
+ derivable from the data or the domain, so the case itself needs fixing. A
122
+ coverage gap never replaces the diagnosis; fill the rest of the finding as
123
+ usual.
124
+
125
+ ## EDD-infra note (optional, after the JSON)
126
+
127
+ If — and only if — you found a gap in the **eval setup itself** (data you
128
+ needed that the run directory did not contain, a missing evaluator signal, etc.), add
129
+ one short line after the JSON beginning `EDD-infra note:`. A nudge, not a
130
+ report. Otherwise omit it entirely.
@@ -0,0 +1,87 @@
1
+ # Synthesize a case plan
2
+
3
+ Instructions for turning a batch of app-run observations into one ranked case
4
+ plan. Run once per batch — as a subagent where supported, else inline.
5
+ Inputs: the `observations/` directory (one JSON per run, from
6
+ `analyze-run.md`), the batch's `index.json`, the target suite directory (the
7
+ case YAML the new cases will join), and the path to write
8
+ (`<dir>/case-plan.md`).
9
+
10
+ ## What you may touch
11
+
12
+ - **Read access to the entire repo and the suite directory.**
13
+ - **Writing is allowed for exactly one file: the case plan path you were
14
+ given.** Don't write case YAML; M5 does that with the developer.
15
+
16
+ ## Your job
17
+
18
+ 1. Read every observation and `index.json`.
19
+ 2. Cluster the `failed` and `degraded` observations into patterns. Two
20
+ observations share a pattern when they have the same `task_type`, the same
21
+ failure `kind`, and the evidence points at the same root cause (the same
22
+ surface misbehaving the same way). Name each pattern in plain words.
23
+ 3. Score each pattern:
24
+
25
+ ```
26
+ frequency = runs in the pattern / all observations
27
+ impact = highest weight among its failures:
28
+ wrong_answer 4, refusal 3, missing_step 3, wrong_tool 2,
29
+ inefficiency 1, presentation 1
30
+ score = frequency × impact
31
+ fixed = every failing run in the pattern has fixed_since set
32
+ ```
33
+
34
+ 4. Check coverage: read the suite's case YAML and find cases that already
35
+ assert the pattern's ideal behaviour. Drop a pattern that is fully covered;
36
+ keep a partly covered one and say which part no case asserts.
37
+ 5. Rank by score, highest first. Within the same score, unfixed patterns come
38
+ before fixed ones.
39
+ 6. Propose 2–3 varied cases per pattern from the observations' case seeds.
40
+ 7. Write the plan.
41
+
42
+ ## Case plan format
43
+
44
+ ```
45
+ # Case plan — <agent>, <since> to <until>
46
+
47
+ <N> runs analyzed: <f> failed, <d> degraded, <o> ok, <u> unclear. <P> patterns.
48
+
49
+ ## Pattern 1 — <plain name> [<k> of <N> runs · impact <i>]
50
+ Runs: <run_id>, <run_id>, …
51
+ Surface: <kind> <file or "not located">
52
+ Already covered by: none | <case id> (partly: <what is missing>)
53
+ Fixed since the runs: no | yes, <sha> "<what changed>" (expected green)
54
+ Proposed cases:
55
+ - id: <kebab-id> type: <task_type> ground truth: known | NEEDS DEVELOPER
56
+ input: <time-anchored input>
57
+ asserts: <the ideal behaviour, one line>
58
+ Level: blackbox rubrics; overlay <check> if the check names harness tools
59
+
60
+ ## Healthy
61
+ - <task_type>: no failures in <n> runs
62
+
63
+ ## Unclear or low confidence
64
+ - <run_id>: <why>
65
+ ```
66
+
67
+ ## Rules for proposed cases
68
+
69
+ - Generalise: each case states the ideal behaviour for a new, time-anchored
70
+ input. Never copy a user's run, words or data into a case; that overfits to
71
+ one run and puts user data into a suite.
72
+ - Assert what correct output looks like for this input and every sibling like
73
+ it, not only that today's failure is absent.
74
+ - `ground truth: NEEDS DEVELOPER` when the correct answer can't be checked
75
+ from the runs' tool results or the agent's data sources. Never guess.
76
+ - Blackbox first. A check that names tools or skills belongs in an overlay
77
+ (see the authoring skill's `references/overlays.md`).
78
+ - A fixed pattern still gets cases: they guard the fix. Mark it "expected
79
+ green" with the commit.
80
+ - Unclear and low-confidence observations are listed, never clustered or
81
+ turned into cases.
82
+
83
+ ## EDD-infra note (optional, at the end of the plan)
84
+
85
+ If the batch showed a gap in the eval setup itself (runs missing data you
86
+ needed, a check evalkit should offer), add one line starting `EDD-infra
87
+ note:`. Otherwise omit it.
@@ -0,0 +1,165 @@
1
+ # Synthesize a fix proposal
2
+
3
+ Instructions for synthesizing one consolidated fix proposal from the per-case
4
+ findings produced by the diagnose step. Run once per experiment — as a
5
+ subagent where supported, else inline. Inputs: the `findings/` directory (one
6
+ `<case_id>.json` per failure), the `index.json` path, and the path to write
7
+ the proposal (`<review-dir>/proposals.md`).
8
+
9
+ ## What you may touch
10
+
11
+ - **Read access to the entire repo** (read-only inspection).
12
+ - **Writing is allowed for exactly one file: the proposal path you were
13
+ given.** Do not write or edit anything else.
14
+
15
+ ## Your job
16
+
17
+ 1. Read every finding in `findings/` and `index.json`.
18
+ 2. Group findings two ways:
19
+ - by `(surface, root_cause)` — the direct fixes;
20
+ - by cross-cutting `trajectory_patterns` that recur across cases even when
21
+ surfaces differ (these are the highest-leverage skill/prompt improvements
22
+ — treat them as first-class). Tool-call inefficiency belongs here: the
23
+ fix is usually a clearer, self-contained tool description — better arg
24
+ docs, an example call, sharper error messages — so the correct, minimal
25
+ call is derivable the first time. Make the tool stand on its own rather
26
+ than leaning on a companion skill, and never a per-case patch.
27
+ 3. For each group, open the cited files and pin the exact change: path +
28
+ section + concrete content or diff. Verify the path exists.
29
+ 4. Fix at the right surface. Propose **creating** a new skill / tool / handler
30
+ only for `surface.kind == absent` / `root_cause: absent` where no existing
31
+ surface can host the capability, or where the developer explicitly asked
32
+ for a new one; otherwise change the existing tool interface, skill, or
33
+ prompt. When you do propose a new surface, name it, place it, sketch its
34
+ contract, and call it out as a new-surface proposal so the human can
35
+ confirm.
36
+ 5. Write the proposal to the given path.
37
+
38
+ ## Interpreting the findings
39
+
40
+ Findings are not uniform inputs — read their flags before grouping:
41
+
42
+ - **`confidence`** weights a finding inside its group: a group built only on
43
+ low-confidence findings is itself weak — say so in the group's diagnosis.
44
+ - **`verdict: borderline`** findings support a group but don't justify one on
45
+ their own; list a borderline-only pattern under the summary, not as a fix
46
+ group.
47
+ - **`already_addressed`** findings name a commit made after the run that
48
+ already fixes the failure. Keep them out of fix groups; list them under
49
+ "Already fixed since the run — re-run to confirm" with the commit and case
50
+ id. Before writing any group, also check `git log` since the oldest run in
51
+ the group for changes to its surface, so the proposal never repeats a fix
52
+ that has already landed.
53
+ - **`coverage_gap`** findings say a scenario has no case, or the case itself
54
+ is wrong. Collect them into the "Case proposals" section, one entry each,
55
+ apart from the fix groups; they are never applied as agent changes. A
56
+ finding can carry both a fix and a coverage gap; then it appears in both.
57
+ - **`root_cause: unknown`** findings (including run-crash cases) don't belong
58
+ in any fix group. Collect them into an escalation list at the end of the
59
+ proposal with their evidence.
60
+ - **`EDD-infra note:` lines** attached to findings are about the eval setup,
61
+ not the agent. Carry them through verbatim into your own EDD-infra section
62
+ at the end — never convert one into a proposed agent fix.
63
+
64
+ ## Constraints on proposed prompt text — read carefully
65
+
66
+ The repo is full context for *your reasoning*, but the **content you propose
67
+ to write into any application prompt surface must stay general-purpose**. This
68
+ governs proposed text for skills, tool descriptions, system-prompt parts, and
69
+ any agent prompt strings:
70
+
71
+ - **No eval / golden-dataset awareness.** Never write "the eval expects…",
72
+ "the reference answer uses…", "to match the scorer…", or mention evals,
73
+ regression tests, or expected outputs. These surfaces must not know they are
74
+ evaluated. Justify every recipe on intrinsic data/workflow correctness.
75
+ - **No calling-application concepts.** These surfaces do not know who invokes
76
+ them. Refer to intent abstractly: "the query", "the request".
77
+ - **Keep surfaces decoupled.** A skill, a tool description, and a prompt part
78
+ must each stand on its own. Don't hard-code one surface into another —
79
+ cross-references couple the surfaces, so changing one silently breaks the
80
+ other. Describe a capability by its intent, not by naming the other surface
81
+ that provides it.
82
+ - **Minimal, generic, declarative.** Prefer extending an existing section over
83
+ adding a new top-level one. No examples that smuggle in eval-only nuance.
84
+
85
+ **Fix from first principles, not case by case.** A failure shows you the
86
+ case's expected answer. Justify every proposed instruction by how the
87
+ data/domain actually works — never by the fact that you've seen that answer.
88
+ Test each one: *would it still be correct to someone who had never seen this
89
+ eval's expected answer?*
90
+
91
+ - **Yes** → it's a real, general improvement; propose it. (e.g. "the current
92
+ rating is in `latest_rating`; `rating` is historical" — true about the data,
93
+ regardless of any eval.)
94
+ - **No, but a general rule does explain it** → you've written a case-specific
95
+ patch. Don't propose that — generalize it to the underlying principle that
96
+ produces the right answer for this case *and* every sibling.
97
+ - **No, and no general rule explains it** → the expected answer isn't
98
+ derivable from the data/domain at all, which means the eval case itself is
99
+ likely the bug. Don't bake the specific answer into any prompt; surface it
100
+ to the developer as a possibly-wrong case (a dataset fix), and mark the
101
+ proposal `unverified`.
102
+
103
+ ## Prompt-change guidelines (apply to every proposed prompt edit)
104
+
105
+ 1. **Describe, don't legislate.** The first fix states facts about the
106
+ mechanism — what a tool does, what state the world is in afterwards — not
107
+ imperative rules. Strong wording (NEVER / ALWAYS / MUST) is an escalation,
108
+ not a default register.
109
+ 2. **Escalate only on observed persistence.** Reach for rule-style wording
110
+ only after a re-run shows the failure survived the descriptive fix; cite
111
+ the experiment that justified the escalation.
112
+ 3. **Prefer deterministic guards over prompt text.** If a tool can reject the
113
+ bad call, add the guard — prompt wording then only has to explain, not
114
+ enforce.
115
+ 4. **Error messages are prompts.** When rejecting a call, echo the inputs the
116
+ caller actually sent, name the offending value, and state the shape a
117
+ correct call has.
118
+
119
+ ## Output — `proposals.md`
120
+
121
+ ```markdown
122
+ # Fix proposals — <experiment>
123
+
124
+ ## Summary
125
+ - N failures total
126
+ - By root cause: skill-gap (X), tool-wrong-shape (Y), absent (Z), ...
127
+ - Recurring trajectory patterns: <one line each>
128
+
129
+ ## Cross-cutting trajectory fixes (highest leverage)
130
+
131
+ ### <pattern label>
132
+ **Cases:** `id-1`, `id-2`, ...
133
+ **Pattern:** <1–2 lines: the recurring shape + its cost in turns/latency>
134
+ **Proposed change** — **File:** `<path>` — under `<section>`:
135
+ > <concrete content / diff>
136
+
137
+ ## <root-cause> · <surface>
138
+
139
+ **Cases:** `id-a`, `id-b`
140
+ **Diagnosis:** <1 paragraph>
141
+ **Proposed change** — **File:** `<path>` — under `<section>`:
142
+ > <concrete content / diff>
143
+ **Verified against repo:** yes | unverified (<why>)
144
+
145
+ (repeat per group)
146
+
147
+ ## Case proposals
148
+
149
+ - `<case_id>` · uncovered_scenario | wrong_case — <the note>; suggested case:
150
+ <one line, or "fix the case: <what is wrong>">
151
+
152
+ ## Already fixed since the run — re-run to confirm
153
+
154
+ - `<case_id>` · `<commit>` — <what it changed>
155
+ ```
156
+
157
+ Rules: be code-shaped, not advisory — "add this rule under section X" beats
158
+ "improve the skill". Every change cites a real path. Mark anything you could
159
+ not check against actual code as `unverified` with the reason.
160
+
161
+ ## EDD-infra note (optional, at the end)
162
+
163
+ If you hit a gap in the **eval setup itself** while synthesizing, add one
164
+ short `EDD-infra note:` line at the very end. A nudge, not a report. Otherwise
165
+ omit.