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.
- evalkit/__init__.py +0 -0
- evalkit/api/__init__.py +0 -0
- evalkit/api/access.py +74 -0
- evalkit/api/agents.py +159 -0
- evalkit/api/app.py +360 -0
- evalkit/api/auth.py +225 -0
- evalkit/api/cli_dist.py +10 -0
- evalkit/api/datasets.py +169 -0
- evalkit/api/deps.py +79 -0
- evalkit/api/download.py +15 -0
- evalkit/api/evaluators.py +121 -0
- evalkit/api/experiments.py +616 -0
- evalkit/api/fixtures.py +95 -0
- evalkit/api/harness_check.py +48 -0
- evalkit/api/imports.py +180 -0
- evalkit/api/limits.py +84 -0
- evalkit/api/llm_providers.py +120 -0
- evalkit/api/mcp/__init__.py +0 -0
- evalkit/api/mcp/auth.py +100 -0
- evalkit/api/mcp/descriptions.py +336 -0
- evalkit/api/mcp/models.py +259 -0
- evalkit/api/mcp/server.py +101 -0
- evalkit/api/mcp/tools.py +844 -0
- evalkit/api/meta.py +19 -0
- evalkit/api/otel.py +350 -0
- evalkit/api/pull.py +197 -0
- evalkit/api/review.py +271 -0
- evalkit/api/runs.py +555 -0
- evalkit/api/server_keys.py +44 -0
- evalkit/api/tokens.py +51 -0
- evalkit/api/trace_imports.py +173 -0
- evalkit/api/trace_sources.py +49 -0
- evalkit/api/traces.py +196 -0
- evalkit/api/users.py +72 -0
- evalkit/api/workspaces.py +131 -0
- evalkit/bundled/contracts/atif-accepted.json +5 -0
- evalkit/bundled/contracts/custom-evaluator-api-v1.json +243 -0
- evalkit/bundled/contracts/harness-api-v1.json +938 -0
- evalkit/bundled/contracts/span-mapping-v1.json +314 -0
- evalkit/bundled/docs/concepts.md +26 -0
- evalkit/bundled/docs/config.md +38 -0
- evalkit/bundled/docs/harness-api.md +44 -0
- evalkit/bundled/docs/install.md +60 -0
- evalkit/bundled/docs/login.md +36 -0
- evalkit/bundled/docs/mappings.md +136 -0
- evalkit/bundled/docs/mcp.md +44 -0
- evalkit/bundled/docs/quickstart.md +142 -0
- evalkit/bundled/docs/sdk-runs.md +171 -0
- evalkit/bundled/docs/tracing.md +171 -0
- evalkit/bundled/docs/try-locally.md +288 -0
- evalkit/bundled/docs/workspaces.md +45 -0
- evalkit/bundled/skills/authoring-eval-cases/SKILL.md +387 -0
- evalkit/bundled/skills/authoring-eval-cases/references/overlays.md +83 -0
- evalkit/bundled/skills/authoring-eval-cases/references/tool-checks.md +71 -0
- evalkit/bundled/skills/connect-traces/SKILL.md +296 -0
- evalkit/bundled/skills/connect-traces/references/gen_ai.json +42 -0
- evalkit/bundled/skills/connect-traces/references/openinference.json +35 -0
- evalkit/bundled/skills/connect-traces/references/span-mapping-schema.md +88 -0
- evalkit/bundled/skills/eval-driven-development/SKILL.md +458 -0
- evalkit/bundled/skills/eval-driven-development/references/analyze-run.md +97 -0
- evalkit/bundled/skills/eval-driven-development/references/diagnose.md +130 -0
- evalkit/bundled/skills/eval-driven-development/references/synthesize-cases.md +87 -0
- evalkit/bundled/skills/eval-driven-development/references/synthesize.md +165 -0
- evalkit/bundled/skills/evalkit-deployment/SKILL.md +332 -0
- evalkit/bundled/skills/evalkit-deployment/config.example.yaml +49 -0
- evalkit/bundled/skills/evalkit-deployment/docker-compose.yml +51 -0
- evalkit/bundled/skills/evalkit-deployment/references/config-and-deploy.md +333 -0
- evalkit/bundled/skills/evalkit-deployment/references/harness-api.md +139 -0
- evalkit/bundled/skills/evalkit-deployment/try/.env.example +11 -0
- evalkit/bundled/skills/evalkit-deployment/try/agent.py +131 -0
- evalkit/bundled/skills/evalkit-deployment/try/cases/acme/balance-sheet/cases.yaml +25 -0
- evalkit/bundled/skills/evalkit-deployment/try/cases/acme/income-statement/cases.yaml +43 -0
- evalkit/bundled/skills/evalkit-deployment/try/config.yaml +17 -0
- evalkit/bundled/skills/evalkit-deployment/try/docker-compose.yml +82 -0
- evalkit/bundled/skills/evalkit-deployment/try/evalkit.yaml +4 -0
- evalkit/bundled/skills/evalkit-deployment/try/mapping.json +42 -0
- evalkit/bundled/skills/evalkit-deployment/try/run.py +33 -0
- evalkit/bundled/skills/evalkit-usage/SKILL.md +509 -0
- evalkit/bundled/skills/evalkit-usage/references/suite-fixtures.md +42 -0
- evalkit/bundled/ui/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- evalkit/bundled/ui/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- evalkit/bundled/ui/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- evalkit/bundled/ui/assets/abap-08VXUWAP.js +1 -0
- evalkit/bundled/ui/assets/apex-BWPQTe0t.js +1 -0
- evalkit/bundled/ui/assets/azcli-Bc_sGQ0U.js +1 -0
- evalkit/bundled/ui/assets/bat-i0X4ZdIN.js +1 -0
- evalkit/bundled/ui/assets/bicep-B5-_aFwp.js +2 -0
- evalkit/bundled/ui/assets/cameligo-DMUM7wLl.js +1 -0
- evalkit/bundled/ui/assets/clojure-Cm7r79vr.js +1 -0
- evalkit/bundled/ui/assets/codicon-DF1abBS2.ttf +0 -0
- evalkit/bundled/ui/assets/coffee-Ba7i2nA0.js +1 -0
- evalkit/bundled/ui/assets/cpp-C7h46wYY.js +1 -0
- evalkit/bundled/ui/assets/csharp-BKxtCVv1.js +1 -0
- evalkit/bundled/ui/assets/csp-bTuwJoIa.js +1 -0
- evalkit/bundled/ui/assets/css-DIMkf-bt.js +3 -0
- evalkit/bundled/ui/assets/css.worker-DwfUZ3fB.js +96 -0
- evalkit/bundled/ui/assets/cssMode-C97l1pbB.js +1 -0
- evalkit/bundled/ui/assets/cypher-CVaqCwHa.js +1 -0
- evalkit/bundled/ui/assets/dart-onAF5SnQ.js +1 -0
- evalkit/bundled/ui/assets/dockerfile-DZFCIeNp.js +1 -0
- evalkit/bundled/ui/assets/ecl-94qehhXe.js +1 -0
- evalkit/bundled/ui/assets/editor-DjpsE8to.css +1 -0
- evalkit/bundled/ui/assets/editor.api-NTesIxw5.js +908 -0
- evalkit/bundled/ui/assets/editor.worker-CRz__AKW.js +33 -0
- evalkit/bundled/ui/assets/elixir-6RTg0lbw.js +1 -0
- evalkit/bundled/ui/assets/flow9-C5_-GSwl.js +1 -0
- evalkit/bundled/ui/assets/freemarker2-BWqEFagp.js +3 -0
- evalkit/bundled/ui/assets/fsharp-C8Ef5oNN.js +1 -0
- evalkit/bundled/ui/assets/go-C-y9NEjX.js +1 -0
- evalkit/bundled/ui/assets/graphql-fmXr3nnJ.js +1 -0
- evalkit/bundled/ui/assets/handlebars-DkIF-whN.js +1 -0
- evalkit/bundled/ui/assets/hcl-CpzslTdj.js +1 -0
- evalkit/bundled/ui/assets/html-C_rpeQXJ.js +1 -0
- evalkit/bundled/ui/assets/html.worker-D9ugpX4y.js +509 -0
- evalkit/bundled/ui/assets/htmlMode-B0YIq3DF.js +1 -0
- evalkit/bundled/ui/assets/index-Cw-jBH6M.js +736 -0
- evalkit/bundled/ui/assets/index-DKtoQZtm.css +1 -0
- evalkit/bundled/ui/assets/ini-sBoK_t0W.js +1 -0
- evalkit/bundled/ui/assets/java-BEtHBSE6.js +1 -0
- evalkit/bundled/ui/assets/javascript-D4EGhYA6.js +1 -0
- evalkit/bundled/ui/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- evalkit/bundled/ui/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- evalkit/bundled/ui/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- evalkit/bundled/ui/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- evalkit/bundled/ui/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- evalkit/bundled/ui/assets/json.worker-CV9fqkUp.js +65 -0
- evalkit/bundled/ui/assets/jsonMode-pQjSfIH6.js +7 -0
- evalkit/bundled/ui/assets/julia-Bri6UV-V.js +1 -0
- evalkit/bundled/ui/assets/kotlin-BOotOW0E.js +1 -0
- evalkit/bundled/ui/assets/less-B9JPFI3C.js +2 -0
- evalkit/bundled/ui/assets/lexon-CfSJPG6W.js +1 -0
- evalkit/bundled/ui/assets/liquid-DbrvoYjD.js +1 -0
- evalkit/bundled/ui/assets/lspLanguageFeatures-D0B7cH6y.js +4 -0
- evalkit/bundled/ui/assets/lua-CsQS60Ue.js +1 -0
- evalkit/bundled/ui/assets/m3-D-oSqn_W.js +1 -0
- evalkit/bundled/ui/assets/markdown-Cimd5fb3.js +1 -0
- evalkit/bundled/ui/assets/mdx-B0HrujLR.js +1 -0
- evalkit/bundled/ui/assets/mips-CIPQ_RoX.js +1 -0
- evalkit/bundled/ui/assets/monacoEditor-DsoPncxW.js +68 -0
- evalkit/bundled/ui/assets/monacoEditor-n7clI0si.css +1 -0
- evalkit/bundled/ui/assets/msdax-DauUninz.js +1 -0
- evalkit/bundled/ui/assets/mysql-SOo6toE5.js +1 -0
- evalkit/bundled/ui/assets/objective-c-FvmIjYaQ.js +1 -0
- evalkit/bundled/ui/assets/pascal-DrH0SRf2.js +1 -0
- evalkit/bundled/ui/assets/pascaligo-D-ptJ9y-.js +1 -0
- evalkit/bundled/ui/assets/perl-oz_6vUea.js +1 -0
- evalkit/bundled/ui/assets/pgsql-DTj74zXo.js +1 -0
- evalkit/bundled/ui/assets/php-nr791fC2.js +1 -0
- evalkit/bundled/ui/assets/pla-CopQ2nXW.js +1 -0
- evalkit/bundled/ui/assets/postiats-43DmfD33.js +1 -0
- evalkit/bundled/ui/assets/powerquery-D3hlyOfw.js +1 -0
- evalkit/bundled/ui/assets/powershell-DmHpPYUd.js +1 -0
- evalkit/bundled/ui/assets/protobuf-C531GsRP.js +2 -0
- evalkit/bundled/ui/assets/pug-Z5eAx3Zn.js +1 -0
- evalkit/bundled/ui/assets/python-CieHVM9n.js +1 -0
- evalkit/bundled/ui/assets/qsharp-DkqhCAOL.js +1 -0
- evalkit/bundled/ui/assets/r-BwWrilGY.js +1 -0
- evalkit/bundled/ui/assets/razor-sLewSMyp.js +1 -0
- evalkit/bundled/ui/assets/redis-ClamHrr6.js +1 -0
- evalkit/bundled/ui/assets/redshift-DT7zqm-g.js +1 -0
- evalkit/bundled/ui/assets/restructuredtext-BYgofb2h.js +1 -0
- evalkit/bundled/ui/assets/ruby-DezsRK8O.js +1 -0
- evalkit/bundled/ui/assets/rust-DdL9SqIa.js +1 -0
- evalkit/bundled/ui/assets/sb-CcwsVR0C.js +1 -0
- evalkit/bundled/ui/assets/scala-DHpiXF5c.js +1 -0
- evalkit/bundled/ui/assets/scheme-BeGwcela.js +1 -0
- evalkit/bundled/ui/assets/scss-gp-XZpBa.js +3 -0
- evalkit/bundled/ui/assets/shell-CC2rA5mh.js +1 -0
- evalkit/bundled/ui/assets/solidity-BEEn4gHE.js +1 -0
- evalkit/bundled/ui/assets/sophia-CRfGWb83.js +1 -0
- evalkit/bundled/ui/assets/sparql-D_Lu-MrJ.js +1 -0
- evalkit/bundled/ui/assets/sql-NEE52Syq.js +1 -0
- evalkit/bundled/ui/assets/st-DbInun42.js +1 -0
- evalkit/bundled/ui/assets/swift-Bxkupp3x.js +1 -0
- evalkit/bundled/ui/assets/systemverilog-Bz4Y3fRF.js +1 -0
- evalkit/bundled/ui/assets/tcl-DISqw1ZD.js +1 -0
- evalkit/bundled/ui/assets/ts.worker-DIAQkoB3.js +67741 -0
- evalkit/bundled/ui/assets/tsMode-BcVQ1nu0.js +11 -0
- evalkit/bundled/ui/assets/twig-De2hgUGE.js +1 -0
- evalkit/bundled/ui/assets/typescript-CUvNWd9p.js +1 -0
- evalkit/bundled/ui/assets/typespec-B8J7ngcE.js +1 -0
- evalkit/bundled/ui/assets/vb-DV3o63ZY.js +1 -0
- evalkit/bundled/ui/assets/wgsl-DpFanUEy.js +298 -0
- evalkit/bundled/ui/assets/workers-CwpYQtzp.js +1 -0
- evalkit/bundled/ui/assets/xml-C1HnXMdF.js +1 -0
- evalkit/bundled/ui/assets/yaml-D7Ey3HQu.js +1 -0
- evalkit/bundled/ui/favicon.svg +6 -0
- evalkit/bundled/ui/index.html +14 -0
- evalkit/cli/__init__.py +0 -0
- evalkit/cli/admin_commands.py +590 -0
- evalkit/cli/client.py +67 -0
- evalkit/cli/init_server.py +165 -0
- evalkit/cli/local_run.py +195 -0
- evalkit/cli/main.py +1365 -0
- evalkit/cli/runs_commands.py +539 -0
- evalkit/cli/server_commands.py +130 -0
- evalkit/cli/skill_targets.py +43 -0
- evalkit/cli/tokens_commands.py +52 -0
- evalkit/cli/traces_commands.py +332 -0
- evalkit/cli/update.py +85 -0
- evalkit/client/__init__.py +0 -0
- evalkit/client/agents.py +25 -0
- evalkit/client/api.py +193 -0
- evalkit/client/blob.py +104 -0
- evalkit/client/connection.py +88 -0
- evalkit/client/evaluators.py +11 -0
- evalkit/client/sessions.py +17 -0
- evalkit/client/store.py +139 -0
- evalkit/client/summary.py +46 -0
- evalkit/client/sync.py +198 -0
- evalkit/config.py +227 -0
- evalkit/contracts/__init__.py +0 -0
- evalkit/contracts/atif.py +115 -0
- evalkit/contracts/cases.py +456 -0
- evalkit/contracts/custom_evaluator.py +58 -0
- evalkit/contracts/enums.py +86 -0
- evalkit/contracts/esf.py +120 -0
- evalkit/contracts/harness.py +281 -0
- evalkit/contracts/notes.json +4 -0
- evalkit/contracts/notes.py +7 -0
- evalkit/contracts/settings.py +41 -0
- evalkit/core/__init__.py +0 -0
- evalkit/core/access.py +75 -0
- evalkit/core/agents.py +65 -0
- evalkit/core/blob.py +46 -0
- evalkit/core/capabilities.py +36 -0
- evalkit/core/costmap.py +90 -0
- evalkit/core/custom_eval.py +50 -0
- evalkit/core/data/cost_map.json +81546 -0
- evalkit/core/endpoints.py +31 -0
- evalkit/core/evaluators/__init__.py +29 -0
- evalkit/core/evaluators/base.py +121 -0
- evalkit/core/evaluators/gauges.py +84 -0
- evalkit/core/evaluators/presentation.py +166 -0
- evalkit/core/evaluators/response_time.py +21 -0
- evalkit/core/evaluators/rubrics.py +494 -0
- evalkit/core/evaluators/tool_trajectory.py +187 -0
- evalkit/core/evaluators/trajectory_rubrics.py +198 -0
- evalkit/core/fixtures.py +57 -0
- evalkit/core/harness.py +227 -0
- evalkit/core/harness_check.py +191 -0
- evalkit/core/importer.py +257 -0
- evalkit/core/judge.py +78 -0
- evalkit/core/lint.py +265 -0
- evalkit/core/overlays.py +76 -0
- evalkit/core/paths.py +25 -0
- evalkit/core/promotion.py +94 -0
- evalkit/core/pull.py +198 -0
- evalkit/core/python_eval.py +59 -0
- evalkit/core/remote_evaluators.py +32 -0
- evalkit/core/review.py +220 -0
- evalkit/core/run_digest.py +421 -0
- evalkit/core/runner.py +995 -0
- evalkit/core/scorecard.py +255 -0
- evalkit/core/traces/__init__.py +0 -0
- evalkit/core/traces/convert.py +336 -0
- evalkit/core/traces/importer.py +113 -0
- evalkit/core/traces/mapping.py +385 -0
- evalkit/core/traces/poll.py +38 -0
- evalkit/core/traces/raw.py +21 -0
- evalkit/core/traces/sessions.py +172 -0
- evalkit/core/traces/settle.py +14 -0
- evalkit/core/traces/sources/__init__.py +19 -0
- evalkit/core/traces/sources/base.py +25 -0
- evalkit/core/traces/sources/phoenix.py +121 -0
- evalkit/core/trajectory.py +248 -0
- evalkit/core/workspace.py +30 -0
- evalkit/credentials.py +119 -0
- evalkit/db/__init__.py +0 -0
- evalkit/db/agents.py +289 -0
- evalkit/db/alembic/env.py +90 -0
- evalkit/db/alembic/script.py.mako +28 -0
- evalkit/db/alembic/versions/0011_baseline.py +1002 -0
- evalkit/db/alembic/versions/0012_ticket_token_kind.py +27 -0
- evalkit/db/alembic/versions/0013_keys_and_llm_providers.py +67 -0
- evalkit/db/cases.py +608 -0
- evalkit/db/crypto.py +12 -0
- evalkit/db/evaluators.py +156 -0
- evalkit/db/experiments.py +363 -0
- evalkit/db/fixture_blobs.py +91 -0
- evalkit/db/keys.py +78 -0
- evalkit/db/llm_providers.py +176 -0
- evalkit/db/locks.py +6 -0
- evalkit/db/mappings.py +168 -0
- evalkit/db/models.py +567 -0
- evalkit/db/promotion.py +271 -0
- evalkit/db/rekey.py +46 -0
- evalkit/db/review.py +250 -0
- evalkit/db/review_state.py +50 -0
- evalkit/db/runs.py +533 -0
- evalkit/db/scorecard.py +300 -0
- evalkit/db/session.py +71 -0
- evalkit/db/sessions.py +90 -0
- evalkit/db/spans.py +360 -0
- evalkit/db/store.py +209 -0
- evalkit/db/tokens.py +100 -0
- evalkit/db/trace_imports.py +308 -0
- evalkit/db/trace_sources.py +131 -0
- evalkit/db/users.py +186 -0
- evalkit/db/workspaces.py +232 -0
- evalkit/paths.py +33 -0
- evalkit/sdk/__init__.py +29 -0
- evalkit/sdk/binding.py +69 -0
- evalkit/sdk/evaluators.py +56 -0
- evalkit/sdk/runner.py +957 -0
- evalkit/sdk/tracing.py +166 -0
- evalkit/store/__init__.py +0 -0
- evalkit/store/base.py +354 -0
- evalkit/store/blob.py +69 -0
- evalkit/version.py +44 -0
- evalkit_py-0.2.0.dev12.dist-info/METADATA +205 -0
- evalkit_py-0.2.0.dev12.dist-info/RECORD +371 -0
- evalkit_py-0.2.0.dev12.dist-info/WHEEL +4 -0
- evalkit_py-0.2.0.dev12.dist-info/entry_points.txt +2 -0
- 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.
|