@rpamis/comet 0.4.0-beta.3 → 0.4.0-beta.4
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.
- package/README.md +10 -0
- package/assets/manifest.json +2 -1
- package/assets/skills/comet/SKILL.md +25 -1
- package/assets/skills/comet/reference/comet-yaml-fields.md +5 -2
- package/assets/skills/comet/reference/context-recovery.md +10 -0
- package/assets/skills/comet/reference/scripts.md +47 -15
- package/assets/skills/comet/rules/comet-phase-guard.en.md +8 -0
- package/assets/skills/comet/rules/comet-phase-guard.md +9 -1
- package/assets/skills/comet/scripts/comet-resume-probe.mjs +3 -0
- package/assets/skills/comet/scripts/comet-runtime.mjs +1387 -424
- package/assets/skills/comet-archive/SKILL.md +24 -11
- package/assets/skills/comet-build/SKILL.md +42 -25
- package/assets/skills/comet-design/SKILL.md +1 -0
- package/assets/skills/comet-hotfix/SKILL.md +3 -1
- package/assets/skills/comet-open/SKILL.md +11 -1
- package/assets/skills/comet-tweak/SKILL.md +3 -1
- package/assets/skills/comet-verify/SKILL.md +29 -20
- package/assets/skills-zh/comet/SKILL.md +25 -1
- package/assets/skills-zh/comet/reference/comet-yaml-fields.md +5 -2
- package/assets/skills-zh/comet/reference/context-recovery.md +10 -0
- package/assets/skills-zh/comet/reference/scripts.md +47 -15
- package/assets/skills-zh/comet-archive/SKILL.md +24 -11
- package/assets/skills-zh/comet-build/SKILL.md +42 -25
- package/assets/skills-zh/comet-design/SKILL.md +1 -0
- package/assets/skills-zh/comet-hotfix/SKILL.md +3 -1
- package/assets/skills-zh/comet-open/SKILL.md +11 -1
- package/assets/skills-zh/comet-tweak/SKILL.md +3 -1
- package/assets/skills-zh/comet-verify/SKILL.md +30 -21
- package/dist/app/cli/comet-banner.d.ts +25 -0
- package/dist/app/cli/comet-banner.d.ts.map +1 -0
- package/dist/app/cli/comet-banner.js +265 -0
- package/dist/app/cli/comet-banner.js.map +1 -0
- package/dist/app/cli/index.js +36 -2
- package/dist/app/cli/index.js.map +1 -1
- package/dist/app/commands/classic.d.ts +4 -0
- package/dist/app/commands/classic.d.ts.map +1 -0
- package/dist/app/commands/classic.js +11 -0
- package/dist/app/commands/classic.js.map +1 -0
- package/dist/app/commands/doctor.d.ts.map +1 -1
- package/dist/app/commands/doctor.js +39 -24
- package/dist/app/commands/doctor.js.map +1 -1
- package/dist/app/commands/eval.d.ts.map +1 -1
- package/dist/app/commands/eval.js +57 -20
- package/dist/app/commands/eval.js.map +1 -1
- package/dist/app/commands/i18n.d.ts +1 -1
- package/dist/app/commands/i18n.d.ts.map +1 -1
- package/dist/app/commands/i18n.js +12 -4
- package/dist/app/commands/i18n.js.map +1 -1
- package/dist/app/commands/init.d.ts.map +1 -1
- package/dist/app/commands/init.js +16 -13
- package/dist/app/commands/init.js.map +1 -1
- package/dist/app/commands/project-scope-selection.d.ts +13 -0
- package/dist/app/commands/project-scope-selection.d.ts.map +1 -0
- package/dist/app/commands/project-scope-selection.js +33 -0
- package/dist/app/commands/project-scope-selection.js.map +1 -0
- package/dist/app/commands/resume-probe.d.ts +11 -0
- package/dist/app/commands/resume-probe.d.ts.map +1 -0
- package/dist/app/commands/resume-probe.js +63 -0
- package/dist/app/commands/resume-probe.js.map +1 -0
- package/dist/app/commands/status.d.ts +31 -0
- package/dist/app/commands/status.d.ts.map +1 -1
- package/dist/app/commands/status.js +109 -20
- package/dist/app/commands/status.js.map +1 -1
- package/dist/app/commands/uninstall.d.ts +2 -0
- package/dist/app/commands/uninstall.d.ts.map +1 -1
- package/dist/app/commands/uninstall.js +217 -40
- package/dist/app/commands/uninstall.js.map +1 -1
- package/dist/app/commands/update.d.ts +6 -0
- package/dist/app/commands/update.d.ts.map +1 -1
- package/dist/app/commands/update.js +361 -68
- package/dist/app/commands/update.js.map +1 -1
- package/dist/config/repository-layout.json +4 -2
- package/dist/domains/bundle/bundle-platform.d.ts.map +1 -1
- package/dist/domains/bundle/bundle-platform.js +3 -1
- package/dist/domains/bundle/bundle-platform.js.map +1 -1
- package/dist/domains/bundle/eval-manifest-runtime.d.ts +6 -0
- package/dist/domains/bundle/eval-manifest-runtime.d.ts.map +1 -0
- package/dist/domains/bundle/eval-manifest-runtime.js +58 -0
- package/dist/domains/bundle/eval-manifest-runtime.js.map +1 -0
- package/dist/domains/bundle/types.d.ts +1 -1
- package/dist/domains/bundle/types.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-archive.d.ts +1 -0
- package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-archive.js +35 -38
- package/dist/domains/comet-classic/classic-archive.js.map +1 -1
- package/dist/domains/comet-classic/classic-cli.d.ts +1 -1
- package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-cli.js +3 -0
- package/dist/domains/comet-classic/classic-cli.js.map +1 -1
- package/dist/domains/comet-classic/classic-command-checks.d.ts +20 -0
- package/dist/domains/comet-classic/classic-command-checks.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-command-checks.js +97 -0
- package/dist/domains/comet-classic/classic-command-checks.js.map +1 -0
- package/dist/domains/comet-classic/classic-current-change.d.ts +19 -0
- package/dist/domains/comet-classic/classic-current-change.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-current-change.js +132 -0
- package/dist/domains/comet-classic/classic-current-change.js.map +1 -0
- package/dist/domains/comet-classic/classic-diagnostics.d.ts +2 -1
- package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-diagnostics.js +54 -1
- package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -1
- package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-evidence.js +4 -0
- package/dist/domains/comet-classic/classic-evidence.js.map +1 -1
- package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-guard.js +68 -69
- package/dist/domains/comet-classic/classic-guard.js.map +1 -1
- package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-hook-guard.js +66 -23
- package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -1
- package/dist/domains/comet-classic/classic-project-config.d.ts +16 -0
- package/dist/domains/comet-classic/classic-project-config.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-project-config.js +40 -0
- package/dist/domains/comet-classic/classic-project-config.js.map +1 -0
- package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-resolver.js +3 -3
- package/dist/domains/comet-classic/classic-resolver.js.map +1 -1
- package/dist/domains/comet-classic/classic-resume-probe-command.d.ts +3 -0
- package/dist/domains/comet-classic/classic-resume-probe-command.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe-command.js +58 -0
- package/dist/domains/comet-classic/classic-resume-probe-command.js.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts +2 -0
- package/dist/domains/comet-classic/classic-resume-probe-entry.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe-entry.js +4 -0
- package/dist/domains/comet-classic/classic-resume-probe-entry.js.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe.d.ts +29 -0
- package/dist/domains/comet-classic/classic-resume-probe.d.ts.map +1 -0
- package/dist/domains/comet-classic/classic-resume-probe.js +386 -0
- package/dist/domains/comet-classic/classic-resume-probe.js.map +1 -0
- package/dist/domains/comet-classic/classic-runtime-run.d.ts +2 -1
- package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-runtime-run.js +38 -0
- package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -1
- package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-state-command.js +128 -12
- package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
- package/dist/domains/comet-classic/classic-state.d.ts +3 -1
- package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-state.js +4 -0
- package/dist/domains/comet-classic/classic-state.js.map +1 -1
- package/dist/domains/comet-classic/classic-store.d.ts +4 -1
- package/dist/domains/comet-classic/classic-store.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-store.js +4 -3
- package/dist/domains/comet-classic/classic-store.js.map +1 -1
- package/dist/domains/comet-classic/classic-transitions.d.ts +1 -1
- package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-transitions.js +20 -1
- package/dist/domains/comet-classic/classic-transitions.js.map +1 -1
- package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-validate-command.js +1 -0
- package/dist/domains/comet-classic/classic-validate-command.js.map +1 -1
- package/dist/domains/comet-classic/index.d.ts +3 -0
- package/dist/domains/comet-classic/index.d.ts.map +1 -1
- package/dist/domains/comet-classic/index.js +3 -0
- package/dist/domains/comet-classic/index.js.map +1 -1
- package/dist/domains/dashboard/collector.js +10 -2
- package/dist/domains/dashboard/collector.js.map +1 -1
- package/dist/domains/dashboard/web/assets/{index-CjU3VXVu.js → index-CIvN-PL8.js} +11 -11
- package/dist/domains/dashboard/web/assets/{index-BcO3_QlT.css → index-DcyRPBnT.css} +1 -1
- package/dist/domains/dashboard/web/index.html +2 -2
- package/dist/domains/engine/types.d.ts +1 -1
- package/dist/domains/engine/types.d.ts.map +1 -1
- package/dist/domains/integrations/openspec.d.ts.map +1 -1
- package/dist/domains/integrations/openspec.js +6 -6
- package/dist/domains/integrations/openspec.js.map +1 -1
- package/dist/domains/skill/find.d.ts.map +1 -1
- package/dist/domains/skill/find.js +1 -6
- package/dist/domains/skill/find.js.map +1 -1
- package/dist/domains/skill/managed-markdown.d.ts +14 -0
- package/dist/domains/skill/managed-markdown.d.ts.map +1 -0
- package/dist/domains/skill/managed-markdown.js +126 -0
- package/dist/domains/skill/managed-markdown.js.map +1 -0
- package/dist/domains/skill/platform-install.d.ts +4 -3
- package/dist/domains/skill/platform-install.d.ts.map +1 -1
- package/dist/domains/skill/platform-install.js +96 -26
- package/dist/domains/skill/platform-install.js.map +1 -1
- package/dist/domains/skill/project-instructions.d.ts +22 -0
- package/dist/domains/skill/project-instructions.d.ts.map +1 -0
- package/dist/domains/skill/project-instructions.js +61 -0
- package/dist/domains/skill/project-instructions.js.map +1 -0
- package/dist/domains/skill/uninstall.d.ts +3 -1
- package/dist/domains/skill/uninstall.d.ts.map +1 -1
- package/dist/domains/skill/uninstall.js +86 -39
- package/dist/domains/skill/uninstall.js.map +1 -1
- package/dist/platform/install/detect.d.ts +2 -1
- package/dist/platform/install/detect.d.ts.map +1 -1
- package/dist/platform/install/detect.js +10 -1
- package/dist/platform/install/detect.js.map +1 -1
- package/dist/platform/install/platforms.d.ts +5 -1
- package/dist/platform/install/platforms.d.ts.map +1 -1
- package/dist/platform/install/platforms.js +21 -4
- package/dist/platform/install/platforms.js.map +1 -1
- package/dist/platform/install/project-registry.d.ts +37 -0
- package/dist/platform/install/project-registry.d.ts.map +1 -0
- package/dist/platform/install/project-registry.js +205 -0
- package/dist/platform/install/project-registry.js.map +1 -0
- package/eval/.env +28 -0
- package/eval/.env.example +52 -0
- package/eval/CLAUDE.md +43 -0
- package/eval/README.md +538 -0
- package/eval/langsmith/.env.example +16 -0
- package/eval/langsmith/README.md +93 -0
- package/eval/langsmith/skills/README.md +5 -0
- package/eval/langsmith/tasks/README.md +5 -0
- package/eval/langsmith/tests/conftest.py +187 -0
- package/eval/langsmith/tests/tasks/test_tasks.py +287 -0
- package/eval/langsmith/treatments/README.md +5 -0
- package/eval/local/README.md +80 -0
- package/eval/local/regression_baseline.json +13 -0
- package/eval/local/report-style-demo-assets/quality_cost.en.svg +41 -0
- package/eval/local/report-style-demo-assets/quality_cost.zh.svg +41 -0
- package/eval/local/report-style-demo-assets/rubric_delta.en.svg +56 -0
- package/eval/local/report-style-demo-assets/rubric_delta.zh.svg +56 -0
- package/eval/local/report-style-demo-assets/task_outcomes.en.svg +46 -0
- package/eval/local/report-style-demo-assets/task_outcomes.zh.svg +46 -0
- package/eval/local/report-style-demo.html +867 -0
- package/eval/local/scripts/compare_baselines.py +1018 -0
- package/eval/local/scripts/generate_report_style_demo_charts.py +322 -0
- package/eval/local/scripts/regression_check.py +171 -0
- package/eval/local/scripts/render_readme_benchmark_figures.py +416 -0
- package/eval/local/scripts/rescore_rubric.py +120 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/SKILL.md +282 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/auto-transition.md +27 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/comet-yaml-fields.md +68 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/context-recovery.md +35 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/debug-gate.md +17 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/decision-point.md +20 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/dirty-worktree.md +59 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/file-structure.md +28 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/reference/subagent-dispatch.md +113 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/rules/comet-phase-guard.md +125 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-archive.sh +311 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-env.sh +110 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-guard.sh +778 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-handoff.sh +390 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-hook-guard.sh +336 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-state.sh +1338 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039/scripts/comet-yaml-validate.sh +225 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-archive/SKILL.md +100 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-build/SKILL.md +304 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-design/SKILL.md +263 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-hotfix/SKILL.md +204 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-open/SKILL.md +220 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-tweak/SKILL.md +180 -0
- package/eval/local/skills/benchmarks/039-release/comet-classic-039-verify/SKILL.md +234 -0
- package/eval/local/skills/benchmarks/040-beta/comet/SKILL.md +261 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/auto-transition.md +27 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/comet-yaml-fields.md +73 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/context-recovery.md +45 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/debug-gate.md +33 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/decision-point.md +31 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/dirty-worktree.md +59 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/file-structure.md +28 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/intent-frame.md +74 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/scripts.md +69 -0
- package/eval/local/skills/benchmarks/040-beta/comet/reference/subagent-dispatch.md +169 -0
- package/eval/local/skills/benchmarks/040-beta/comet/rules/comet-phase-guard.md +130 -0
- package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/checks.yaml +6 -0
- package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/guardrails.yaml +13 -0
- package/eval/local/skills/benchmarks/040-beta/comet/runtime/classic/skill.yaml +122 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-archive.mjs +9515 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-env.mjs +15 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-guard.mjs +10173 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-handoff.mjs +9491 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-hook-guard.mjs +9175 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-intent.mjs +404 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-state.mjs +9273 -0
- package/eval/local/skills/benchmarks/040-beta/comet/scripts/comet-yaml-validate.mjs +7627 -0
- package/eval/local/skills/benchmarks/040-beta/comet-archive/SKILL.md +110 -0
- package/eval/local/skills/benchmarks/040-beta/comet-build/SKILL.md +315 -0
- package/eval/local/skills/benchmarks/040-beta/comet-design/SKILL.md +260 -0
- package/eval/local/skills/benchmarks/040-beta/comet-hotfix/SKILL.md +190 -0
- package/eval/local/skills/benchmarks/040-beta/comet-open/SKILL.md +210 -0
- package/eval/local/skills/benchmarks/040-beta/comet-tweak/SKILL.md +183 -0
- package/eval/local/skills/benchmarks/040-beta/comet-verify/SKILL.md +230 -0
- package/eval/local/skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md +12 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-apply-change/SKILL.md +156 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-archive-change/SKILL.md +114 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-continue-change/SKILL.md +118 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-explore/SKILL.md +288 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-ff-change/SKILL.md +101 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-new-change/SKILL.md +74 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-onboard/SKILL.md +554 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-propose/SKILL.md +110 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-sync-specs/SKILL.md +138 -0
- package/eval/local/skills/benchmarks/dependency/openspec/openspec-verify-change/SKILL.md +168 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/SKILL.md +159 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/frame-template.html +213 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/helper.js +167 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/server.cjs +723 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/start-server.sh +209 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/scripts/stop-server.sh +120 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/brainstorming/visual-companion.md +291 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/dispatching-parallel-agents/SKILL.md +185 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/executing-plans/SKILL.md +70 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/finishing-a-development-branch/SKILL.md +241 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/receiving-code-review/SKILL.md +213 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/SKILL.md +103 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/requesting-code-review/code-reviewer.md +172 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/SKILL.md +418 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/implementer-prompt.md +139 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/review-package +44 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/sdd-workspace +22 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/scripts/task-brief +40 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/subagent-driven-development/task-reviewer-prompt.md +188 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/CREATION-LOG.md +119 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/SKILL.md +296 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/condition-based-waiting.md +115 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/defense-in-depth.md +122 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/find-polluter.sh +63 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/root-cause-tracing.md +169 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-academic.md +14 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-1.md +58 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-2.md +68 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/systematic-debugging/test-pressure-3.md +69 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/SKILL.md +371 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/test-driven-development/testing-anti-patterns.md +299 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/using-git-worktrees/SKILL.md +202 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/verification-before-completion/SKILL.md +139 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/SKILL.md +174 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/SKILL.md +689 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/anthropic-best-practices.md +1150 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/graphviz-conventions.dot +172 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/persuasion-principles.md +187 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/render-graphs.js +168 -0
- package/eval/local/skills/benchmarks/dependency/superpowers/writing-skills/testing-skills-with-subagents.md +384 -0
- package/eval/local/tasks/authoring-skill-smoke/environment/Dockerfile +2 -0
- package/eval/local/tasks/authoring-skill-smoke/instruction.md +4 -0
- package/eval/local/tasks/authoring-skill-smoke/task.toml +21 -0
- package/eval/local/tasks/authoring-skill-smoke/validation/test_authoring_skill_smoke.py +54 -0
- package/eval/local/tasks/comet-agent-memory-routing/environment/Dockerfile +28 -0
- package/eval/local/tasks/comet-agent-memory-routing/environment/agent_system.py +40 -0
- package/eval/local/tasks/comet-agent-memory-routing/environment/test_agent_system.py +29 -0
- package/eval/local/tasks/comet-agent-memory-routing/instruction.md +20 -0
- package/eval/local/tasks/comet-agent-memory-routing/task.toml +24 -0
- package/eval/local/tasks/comet-agent-memory-routing/validation/test_agent_memory_routing.py +24 -0
- package/eval/local/tasks/comet-api-cache-ttl/environment/Dockerfile +39 -0
- package/eval/local/tasks/comet-api-cache-ttl/environment/cache.py +39 -0
- package/eval/local/tasks/comet-api-cache-ttl/environment/test_cache.py +81 -0
- package/eval/local/tasks/comet-api-cache-ttl/instruction.md +33 -0
- package/eval/local/tasks/comet-api-cache-ttl/task.toml +24 -0
- package/eval/local/tasks/comet-api-cache-ttl/validation/test_api_cache_ttl.py +58 -0
- package/eval/local/tasks/comet-cross-file-refactor/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-cross-file-refactor/environment/cli.py +13 -0
- package/eval/local/tasks/comet-cross-file-refactor/environment/counting.py +13 -0
- package/eval/local/tasks/comet-cross-file-refactor/environment/test_textkit.py +21 -0
- package/eval/local/tasks/comet-cross-file-refactor/instruction.md +16 -0
- package/eval/local/tasks/comet-cross-file-refactor/task.toml +20 -0
- package/eval/local/tasks/comet-cross-file-refactor/validation/test_cross_file_refactor.py +20 -0
- package/eval/local/tasks/comet-dependency-confusion/environment/Dockerfile +28 -0
- package/eval/local/tasks/comet-dependency-confusion/environment/app.py +8 -0
- package/eval/local/tasks/comet-dependency-confusion/environment/settings_loader.py +14 -0
- package/eval/local/tasks/comet-dependency-confusion/environment/test_settings_service.py +19 -0
- package/eval/local/tasks/comet-dependency-confusion/instruction.md +18 -0
- package/eval/local/tasks/comet-dependency-confusion/task.toml +24 -0
- package/eval/local/tasks/comet-dependency-confusion/validation/test_dependency_confusion.py +24 -0
- package/eval/local/tasks/comet-fix-median/environment/Dockerfile +50 -0
- package/eval/local/tasks/comet-fix-median/environment/stats.py +54 -0
- package/eval/local/tasks/comet-fix-median/environment/test_stats.py +68 -0
- package/eval/local/tasks/comet-fix-median/instruction.md +25 -0
- package/eval/local/tasks/comet-fix-median/task.toml +24 -0
- package/eval/local/tasks/comet-fix-median/validation/test_fix_median.py +60 -0
- package/eval/local/tasks/comet-framework-selection/environment/Dockerfile +28 -0
- package/eval/local/tasks/comet-framework-selection/environment/architecture.py +12 -0
- package/eval/local/tasks/comet-framework-selection/environment/test_architecture.py +30 -0
- package/eval/local/tasks/comet-framework-selection/instruction.md +22 -0
- package/eval/local/tasks/comet-framework-selection/task.toml +24 -0
- package/eval/local/tasks/comet-framework-selection/validation/test_framework_selection.py +24 -0
- package/eval/local/tasks/comet-full-workflow/environment/Dockerfile +53 -0
- package/eval/local/tasks/comet-full-workflow/environment/test_wordcount.py +29 -0
- package/eval/local/tasks/comet-full-workflow/environment/wordcount.py +40 -0
- package/eval/local/tasks/comet-full-workflow/instruction.md +18 -0
- package/eval/local/tasks/comet-full-workflow/task.toml +24 -0
- package/eval/local/tasks/comet-full-workflow/validation/test_full_workflow.py +171 -0
- package/eval/local/tasks/comet-graph-execution-review/environment/Dockerfile +28 -0
- package/eval/local/tasks/comet-graph-execution-review/environment/pipeline.py +19 -0
- package/eval/local/tasks/comet-graph-execution-review/environment/test_pipeline.py +53 -0
- package/eval/local/tasks/comet-graph-execution-review/instruction.md +21 -0
- package/eval/local/tasks/comet-graph-execution-review/task.toml +24 -0
- package/eval/local/tasks/comet-graph-execution-review/validation/test_graph_execution_review.py +24 -0
- package/eval/local/tasks/comet-human-approval-flow/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-human-approval-flow/environment/approvals.py +17 -0
- package/eval/local/tasks/comet-human-approval-flow/environment/test_approvals.py +30 -0
- package/eval/local/tasks/comet-human-approval-flow/instruction.md +15 -0
- package/eval/local/tasks/comet-human-approval-flow/task.toml +20 -0
- package/eval/local/tasks/comet-human-approval-flow/validation/test_human_approval_flow.py +20 -0
- package/eval/local/tasks/comet-layered-streaming-fix/environment/Dockerfile +20 -0
- package/eval/local/tasks/comet-layered-streaming-fix/environment/chat_app.py +19 -0
- package/eval/local/tasks/comet-layered-streaming-fix/environment/test_chat_app.py +15 -0
- package/eval/local/tasks/comet-layered-streaming-fix/instruction.md +14 -0
- package/eval/local/tasks/comet-layered-streaming-fix/task.toml +20 -0
- package/eval/local/tasks/comet-layered-streaming-fix/validation/test_layered_streaming_fix.py +20 -0
- package/eval/local/tasks/comet-noise-distractor/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-noise-distractor/environment/distractor.md +4 -0
- package/eval/local/tasks/comet-noise-distractor/environment/invoice.py +5 -0
- package/eval/local/tasks/comet-noise-distractor/environment/test_invoice.py +18 -0
- package/eval/local/tasks/comet-noise-distractor/instruction.md +17 -0
- package/eval/local/tasks/comet-noise-distractor/task.toml +20 -0
- package/eval/local/tasks/comet-noise-distractor/validation/test_noise_distractor.py +20 -0
- package/eval/local/tasks/comet-observability-env-template/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-observability-env-template/environment/env_writer.py +17 -0
- package/eval/local/tasks/comet-observability-env-template/environment/test_env_writer.py +17 -0
- package/eval/local/tasks/comet-observability-env-template/instruction.md +20 -0
- package/eval/local/tasks/comet-observability-env-template/task.toml +20 -0
- package/eval/local/tasks/comet-observability-env-template/validation/test_observability_env_template.py +46 -0
- package/eval/local/tasks/comet-perf-dedupe/environment/Dockerfile +39 -0
- package/eval/local/tasks/comet-perf-dedupe/environment/dedupe.py +22 -0
- package/eval/local/tasks/comet-perf-dedupe/environment/test_dedupe.py +43 -0
- package/eval/local/tasks/comet-perf-dedupe/instruction.md +25 -0
- package/eval/local/tasks/comet-perf-dedupe/task.toml +24 -0
- package/eval/local/tasks/comet-perf-dedupe/validation/test_perf_dedupe.py +40 -0
- package/eval/local/tasks/comet-persistence-threading/environment/Dockerfile +15 -0
- package/eval/local/tasks/comet-persistence-threading/environment/session_store.py +15 -0
- package/eval/local/tasks/comet-persistence-threading/environment/test_session_store.py +21 -0
- package/eval/local/tasks/comet-persistence-threading/instruction.md +14 -0
- package/eval/local/tasks/comet-persistence-threading/task.toml +20 -0
- package/eval/local/tasks/comet-persistence-threading/validation/test_persistence_threading.py +20 -0
- package/eval/local/tasks/comet-refactor-counter/environment/Dockerfile +39 -0
- package/eval/local/tasks/comet-refactor-counter/environment/test_text_processor.py +57 -0
- package/eval/local/tasks/comet-refactor-counter/environment/text_processor.py +49 -0
- package/eval/local/tasks/comet-refactor-counter/instruction.md +31 -0
- package/eval/local/tasks/comet-refactor-counter/task.toml +24 -0
- package/eval/local/tasks/comet-refactor-counter/validation/test_refactor_counter.py +75 -0
- package/eval/local/tasks/comet-robust-config/environment/Dockerfile +39 -0
- package/eval/local/tasks/comet-robust-config/environment/config_loader.py +56 -0
- package/eval/local/tasks/comet-robust-config/environment/test_config_loader.py +72 -0
- package/eval/local/tasks/comet-robust-config/instruction.md +30 -0
- package/eval/local/tasks/comet-robust-config/task.toml +24 -0
- package/eval/local/tasks/comet-robust-config/validation/test_robust_config.py +37 -0
- package/eval/local/tasks/generic-skill-smoke/environment/Dockerfile +2 -0
- package/eval/local/tasks/generic-skill-smoke/instruction.md +7 -0
- package/eval/local/tasks/generic-skill-smoke/task.toml +21 -0
- package/eval/local/tasks/generic-skill-smoke/validation/test_generic_skill_smoke.py +36 -0
- package/eval/local/tasks/index.yaml +155 -0
- package/eval/local/tasks/workflow-overlay-contract/environment/Dockerfile +5 -0
- package/eval/local/tasks/workflow-overlay-contract/instruction.md +5 -0
- package/eval/local/tasks/workflow-overlay-contract/task.toml +21 -0
- package/eval/local/tasks/workflow-overlay-contract/validation/test_workflow_overlay_contract.py +235 -0
- package/eval/local/tasks/workflow-route-conformance/environment/Dockerfile +2 -0
- package/eval/local/tasks/workflow-route-conformance/instruction.md +5 -0
- package/eval/local/tasks/workflow-route-conformance/task.toml +21 -0
- package/eval/local/tasks/workflow-route-conformance/validation/test_workflow_route_conformance.py +84 -0
- package/eval/local/tests/conftest.py +1148 -0
- package/eval/local/tests/scaffold/test_attribution.py +48 -0
- package/eval/local/tests/scaffold/test_compare_baselines.py +999 -0
- package/eval/local/tests/scaffold/test_conftest_helpers.py +534 -0
- package/eval/local/tests/scaffold/test_evidence.py +15 -0
- package/eval/local/tests/scaffold/test_langsmith_conftest.py +244 -0
- package/eval/local/tests/scaffold/test_logging.py +243 -0
- package/eval/local/tests/scaffold/test_manifests.py +132 -0
- package/eval/local/tests/scaffold/test_profiles.py +866 -0
- package/eval/local/tests/scaffold/test_regression_check.py +19 -0
- package/eval/local/tests/scaffold/test_report_style_demo_charts.py +45 -0
- package/eval/local/tests/scaffold/test_sample_quality.py +211 -0
- package/eval/local/tests/scaffold/test_tasks.py +168 -0
- package/eval/local/tests/scaffold/test_treatments.py +244 -0
- package/eval/local/tests/scaffold/test_utils.py +139 -0
- package/eval/local/tests/tasks/test_tasks.py +445 -0
- package/eval/local/tests/tasks/test_validation_scripts.py +143 -0
- package/eval/local/treatments/comet/comet_full_039.yaml +141 -0
- package/eval/local/treatments/comet/comet_full_040_beta.yaml +140 -0
- package/eval/local/treatments/common/control.yaml +4 -0
- package/eval/pyproject.toml +41 -0
- package/eval/report-html-config.json +6 -0
- package/eval/scaffold/__init__.py +67 -0
- package/eval/scaffold/python/__init__.py +95 -0
- package/eval/scaffold/python/attribution.py +43 -0
- package/eval/scaffold/python/evidence.py +38 -0
- package/eval/scaffold/python/external_data_handler.py +18 -0
- package/eval/scaffold/python/generic_llm_judge.py +235 -0
- package/eval/scaffold/python/judge_config.py +168 -0
- package/eval/scaffold/python/llm_judge.py +191 -0
- package/eval/scaffold/python/logging.py +705 -0
- package/eval/scaffold/python/manifests.py +129 -0
- package/eval/scaffold/python/paper_charts.py +25 -0
- package/eval/scaffold/python/pass_at_k.py +107 -0
- package/eval/scaffold/python/paths.py +56 -0
- package/eval/scaffold/python/profiles.py +127 -0
- package/eval/scaffold/python/report_outputs.py +1391 -0
- package/eval/scaffold/python/sample_quality.py +339 -0
- package/eval/scaffold/python/schema.py +39 -0
- package/eval/scaffold/python/skill_parser.py +469 -0
- package/eval/scaffold/python/tasks.py +330 -0
- package/eval/scaffold/python/treatments.py +271 -0
- package/eval/scaffold/python/utils.py +366 -0
- package/eval/scaffold/python/validation/__init__.py +21 -0
- package/eval/scaffold/python/validation/authoring_rubric.py +326 -0
- package/eval/scaffold/python/validation/comet_workflow.py +187 -0
- package/eval/scaffold/python/validation/core.py +264 -0
- package/eval/scaffold/python/validation/dataset.py +337 -0
- package/eval/scaffold/python/validation/docker.py +106 -0
- package/eval/scaffold/python/validation/evaluator.py +549 -0
- package/eval/scaffold/python/validation/generic_rubric.py +169 -0
- package/eval/scaffold/python/validation/rubric.py +740 -0
- package/eval/scaffold/python/validation/runner.py +237 -0
- package/eval/scaffold/python/validation/scripts.py +58 -0
- package/eval/scaffold/python/validation/tracing.py +313 -0
- package/eval/scaffold/shell/common.sh +126 -0
- package/eval/scaffold/shell/docker.sh +482 -0
- package/eval/scaffold/shell/run-claude-loop.sh +181 -0
- package/eval/scaffold/shell/setup.sh +259 -0
- package/eval/simulator-instruction.md +9 -0
- package/package.json +24 -2
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"""LangSmith eval suite pytest configuration.
|
|
2
|
+
|
|
3
|
+
This suite reuses the local task corpus by default and writes reports under
|
|
4
|
+
eval/langsmith/logs. LangSmith-specific environment checks live here so local
|
|
5
|
+
runs stay free of LangSmith requirements.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import importlib.util
|
|
9
|
+
import os
|
|
10
|
+
import subprocess
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
from dotenv import load_dotenv
|
|
15
|
+
from scaffold.python.utils import _to_bash_path
|
|
16
|
+
|
|
17
|
+
LANGSMITH_ROOT = Path(__file__).resolve().parents[1]
|
|
18
|
+
EVAL_ROOT = LANGSMITH_ROOT.parent
|
|
19
|
+
LOCAL_ROOT = EVAL_ROOT / "local"
|
|
20
|
+
DEFAULT_LANGSMITH_PLUGIN_DIR = EVAL_ROOT / ".cache" / "langsmith-cc-plugin"
|
|
21
|
+
|
|
22
|
+
os.environ.setdefault("BENCH_SUITE_ROOT", str(LANGSMITH_ROOT))
|
|
23
|
+
os.environ.setdefault("BENCH_TASKS_DIR", str(LOCAL_ROOT / "tasks"))
|
|
24
|
+
os.environ.setdefault("BENCH_TREATMENTS_DIR", str(LOCAL_ROOT / "treatments"))
|
|
25
|
+
os.environ.setdefault("BENCH_SKILLS_DIR", str(LOCAL_ROOT / "skills"))
|
|
26
|
+
os.environ.setdefault("BENCH_LOGS_DIR", str(LANGSMITH_ROOT / "logs"))
|
|
27
|
+
# Group every run in this suite under one LangSmith dataset/test-suite by default.
|
|
28
|
+
os.environ.setdefault("LANGSMITH_TEST_SUITE", "comet-skill-eval")
|
|
29
|
+
|
|
30
|
+
load_dotenv(EVAL_ROOT / ".env")
|
|
31
|
+
load_dotenv(LANGSMITH_ROOT / ".env", override=True)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def configure_langsmith_environment() -> None:
|
|
35
|
+
"""Derive Claude Code plugin env from the eval suite's LangSmith config."""
|
|
36
|
+
os.environ.setdefault("LANGSMITH_TRACING", "true")
|
|
37
|
+
os.environ.setdefault(
|
|
38
|
+
"TRACE_TO_LANGSMITH",
|
|
39
|
+
"true" if os.environ.get("LANGSMITH_TRACING", "").lower() == "true" else "false",
|
|
40
|
+
)
|
|
41
|
+
os.environ.setdefault("LANGSMITH_PROJECT", "comet-skill-eval")
|
|
42
|
+
|
|
43
|
+
api_key = os.environ.get("LANGSMITH_API_KEY", "")
|
|
44
|
+
if api_key:
|
|
45
|
+
os.environ.setdefault("CC_LANGSMITH_API_KEY", api_key)
|
|
46
|
+
os.environ.setdefault("CC_LANGSMITH_PROJECT", os.environ["LANGSMITH_PROJECT"])
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
configure_langsmith_environment()
|
|
50
|
+
|
|
51
|
+
_LOCAL_CONFTEST = LOCAL_ROOT / "tests" / "conftest.py"
|
|
52
|
+
_spec = importlib.util.spec_from_file_location("_comet_local_conftest", _LOCAL_CONFTEST)
|
|
53
|
+
_local_conftest = importlib.util.module_from_spec(_spec)
|
|
54
|
+
assert _spec and _spec.loader
|
|
55
|
+
_spec.loader.exec_module(_local_conftest)
|
|
56
|
+
|
|
57
|
+
for _name in dir(_local_conftest):
|
|
58
|
+
if not _name.startswith("__") and _name not in globals():
|
|
59
|
+
globals()[_name] = getattr(_local_conftest, _name)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@pytest.fixture(scope="session", autouse=True)
|
|
63
|
+
def verify_langsmith_environment(request):
|
|
64
|
+
"""Require LangSmith credentials only for non-unit LangSmith eval runs."""
|
|
65
|
+
if _local_conftest._is_unit_tests_only(request.config):
|
|
66
|
+
return
|
|
67
|
+
if not os.environ.get("LANGSMITH_API_KEY"):
|
|
68
|
+
pytest.skip("LANGSMITH_API_KEY not set")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _build_default_langsmith_plugin(target_dir: Path) -> bool:
|
|
72
|
+
"""Build the official Claude Code LangSmith plugin into eval/.cache."""
|
|
73
|
+
target_dir.parent.mkdir(parents=True, exist_ok=True)
|
|
74
|
+
mount_arg = f"{target_dir.parent}:/out"
|
|
75
|
+
command = (
|
|
76
|
+
"set -e; "
|
|
77
|
+
"cd /tmp; "
|
|
78
|
+
"git clone --depth 1 https://github.com/langchain-ai/langsmith-claude-code-plugins; "
|
|
79
|
+
"cd langsmith-claude-code-plugins; "
|
|
80
|
+
"corepack enable; "
|
|
81
|
+
"pnpm install; "
|
|
82
|
+
"pnpm build; "
|
|
83
|
+
"rm -rf /out/langsmith-cc-plugin; "
|
|
84
|
+
"cp -r . /out/langsmith-cc-plugin"
|
|
85
|
+
)
|
|
86
|
+
result = subprocess.run(
|
|
87
|
+
["docker", "run", "--rm", "-v", mount_arg, "node:20", "sh", "-c", command],
|
|
88
|
+
capture_output=True,
|
|
89
|
+
text=True,
|
|
90
|
+
timeout=600,
|
|
91
|
+
)
|
|
92
|
+
if result.returncode == 0:
|
|
93
|
+
return True
|
|
94
|
+
print("[langsmith] failed to auto-build Claude Code tracing plugin.")
|
|
95
|
+
if result.stdout.strip():
|
|
96
|
+
print(result.stdout.strip())
|
|
97
|
+
if result.stderr.strip():
|
|
98
|
+
print(result.stderr.strip())
|
|
99
|
+
return False
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _plugin_dir_env_value(plugin_dir: Path) -> str:
|
|
103
|
+
"""Return a plugin path value that docker.sh can test and mount from bash."""
|
|
104
|
+
return _to_bash_path(plugin_dir)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def provision_langsmith_plugin_dir() -> Path | None:
|
|
108
|
+
"""Resolve or auto-build the official Claude Code LangSmith plugin directory."""
|
|
109
|
+
configure_langsmith_environment()
|
|
110
|
+
if os.environ.get("TRACE_TO_LANGSMITH", "").lower() != "true":
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
explicit_dir = os.environ.get("CC_LANGSMITH_PLUGIN_DIR", "").strip()
|
|
114
|
+
if explicit_dir:
|
|
115
|
+
plugin_dir = Path(explicit_dir)
|
|
116
|
+
if plugin_dir.is_dir():
|
|
117
|
+
os.environ["CC_LANGSMITH_PLUGIN_DIR"] = _plugin_dir_env_value(plugin_dir)
|
|
118
|
+
return plugin_dir
|
|
119
|
+
print(
|
|
120
|
+
f"[langsmith] CC_LANGSMITH_PLUGIN_DIR not a directory ({plugin_dir}); "
|
|
121
|
+
"falling back to the eval plugin cache."
|
|
122
|
+
)
|
|
123
|
+
os.environ.pop("CC_LANGSMITH_PLUGIN_DIR", None)
|
|
124
|
+
|
|
125
|
+
plugin_dir = DEFAULT_LANGSMITH_PLUGIN_DIR
|
|
126
|
+
if plugin_dir.is_dir():
|
|
127
|
+
os.environ["CC_LANGSMITH_PLUGIN_DIR"] = _plugin_dir_env_value(plugin_dir)
|
|
128
|
+
return plugin_dir
|
|
129
|
+
|
|
130
|
+
if os.environ.get("CC_LANGSMITH_PLUGIN_AUTO_BUILD", "true").lower() in {
|
|
131
|
+
"0",
|
|
132
|
+
"false",
|
|
133
|
+
"no",
|
|
134
|
+
}:
|
|
135
|
+
print(
|
|
136
|
+
"[langsmith] trajectory tracing disabled: "
|
|
137
|
+
"CC_LANGSMITH_PLUGIN_AUTO_BUILD=false and no plugin directory was provided."
|
|
138
|
+
)
|
|
139
|
+
return None
|
|
140
|
+
|
|
141
|
+
print(
|
|
142
|
+
"[langsmith] building Claude Code tracing plugin into "
|
|
143
|
+
f"{plugin_dir} via node:20..."
|
|
144
|
+
)
|
|
145
|
+
if _build_default_langsmith_plugin(plugin_dir) and plugin_dir.is_dir():
|
|
146
|
+
os.environ["CC_LANGSMITH_PLUGIN_DIR"] = _plugin_dir_env_value(plugin_dir)
|
|
147
|
+
return plugin_dir
|
|
148
|
+
|
|
149
|
+
os.environ.pop("CC_LANGSMITH_PLUGIN_DIR", None)
|
|
150
|
+
return None
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@pytest.fixture(scope="session", autouse=True)
|
|
154
|
+
def provision_langsmith_tracing(request):
|
|
155
|
+
"""Wire the official langsmith-tracing Claude Code plugin, best-effort.
|
|
156
|
+
|
|
157
|
+
Results logging (rubric scores + treatment comparison) only needs a
|
|
158
|
+
LANGSMITH_API_KEY. Trajectory tracing additionally needs the prebuilt
|
|
159
|
+
``langsmith-tracing`` plugin, provided via ``CC_LANGSMITH_PLUGIN_DIR``
|
|
160
|
+
(host path). When it is missing we log once and continue without the
|
|
161
|
+
nested Claude Code trajectory instead of failing the run.
|
|
162
|
+
"""
|
|
163
|
+
if _local_conftest._is_unit_tests_only(request.config):
|
|
164
|
+
return
|
|
165
|
+
|
|
166
|
+
plugin_dir = provision_langsmith_plugin_dir()
|
|
167
|
+
if plugin_dir:
|
|
168
|
+
print(f"[langsmith] trajectory tracing enabled via plugin: {plugin_dir}")
|
|
169
|
+
else:
|
|
170
|
+
print(
|
|
171
|
+
"[langsmith] trajectory tracing disabled "
|
|
172
|
+
"(rubric + comparison still logged)."
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
@pytest.fixture(scope="session")
|
|
177
|
+
def langsmith_experiment_metadata():
|
|
178
|
+
"""Attach suite metadata to each LangSmith experiment (project).
|
|
179
|
+
|
|
180
|
+
Read by the LangSmith pytest plugin (requires langsmith>=0.7.13); ignored by
|
|
181
|
+
older versions.
|
|
182
|
+
"""
|
|
183
|
+
return {
|
|
184
|
+
"suite": "comet-skill-eval",
|
|
185
|
+
"cc_model": os.environ.get("BENCH_CC_MODEL", "cli-default"),
|
|
186
|
+
"cc_version": os.environ.get("BENCH_CC_VERSION", "latest"),
|
|
187
|
+
}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"""LangSmith suite task runner.
|
|
2
|
+
|
|
3
|
+
Wraps the local task runner with LangSmith's pytest integration. Each
|
|
4
|
+
``(task, treatment)`` run syncs to a LangSmith dataset example + experiment:
|
|
5
|
+
|
|
6
|
+
- ``log_inputs`` / ``log_reference_outputs`` capture the task prompt and the
|
|
7
|
+
ground-truth expectations (expected artifacts, required skills, rubric).
|
|
8
|
+
- ``log_outputs`` captures the run's efficiency metrics and invoked skills.
|
|
9
|
+
- ``log_feedback`` reports each rubric dimension score (and the check pass rate),
|
|
10
|
+
so CONTROL vs skill-injected treatments compare directly in the experiment view.
|
|
11
|
+
- Trajectory tracing (official ``langsmith-tracing`` Claude Code plugin) nests
|
|
12
|
+
under the same run via ``CC_LANGSMITH_PARENT_DOTTED_ORDER`` when a prebuilt
|
|
13
|
+
plugin dir is provided through ``CC_LANGSMITH_PLUGIN_DIR``.
|
|
14
|
+
|
|
15
|
+
The local suite stays completely free of any LangSmith import; this module only
|
|
16
|
+
adds a thin logging wrapper around the unchanged local runner.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import importlib.util
|
|
20
|
+
import json
|
|
21
|
+
import os
|
|
22
|
+
import sys
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
import pytest
|
|
26
|
+
|
|
27
|
+
from scaffold.python.tasks import load_task
|
|
28
|
+
from scaffold.python.logging import TreatmentResult
|
|
29
|
+
|
|
30
|
+
# ---------------------------------------------------------------------------
|
|
31
|
+
# Load the local runner as a module (do NOT re-export its test_task_treatment;
|
|
32
|
+
# we wrap it below). pytest_generate_tests and any non-task unit tests are
|
|
33
|
+
# re-exported unchanged so parametrization and coverage stay identical.
|
|
34
|
+
# ---------------------------------------------------------------------------
|
|
35
|
+
_LOCAL_TEST_TASKS = (
|
|
36
|
+
Path(__file__).resolve().parents[3] / "local" / "tests" / "tasks" / "test_tasks.py"
|
|
37
|
+
)
|
|
38
|
+
_spec = importlib.util.spec_from_file_location("_comet_local_test_tasks", _LOCAL_TEST_TASKS)
|
|
39
|
+
_local_test_tasks = importlib.util.module_from_spec(_spec)
|
|
40
|
+
assert _spec and _spec.loader
|
|
41
|
+
sys.modules[_spec.name] = _local_test_tasks
|
|
42
|
+
_spec.loader.exec_module(_local_test_tasks)
|
|
43
|
+
|
|
44
|
+
pytest_generate_tests = _local_test_tasks.pytest_generate_tests
|
|
45
|
+
for _name in dir(_local_test_tasks):
|
|
46
|
+
if _name.startswith("test_") and _name != "test_task_treatment":
|
|
47
|
+
globals()[_name] = getattr(_local_test_tasks, _name)
|
|
48
|
+
|
|
49
|
+
PYTEST_TIMEOUT = _local_test_tasks.PYTEST_TIMEOUT
|
|
50
|
+
_run_local_task_treatment = _local_test_tasks.test_task_treatment
|
|
51
|
+
|
|
52
|
+
# LangSmith helpers are optional; degrade to a plain pass-through when the
|
|
53
|
+
# ``langsmith`` extra is not installed so collection never crashes.
|
|
54
|
+
try:
|
|
55
|
+
from langsmith import testing as ls_testing
|
|
56
|
+
from langsmith import get_current_run_tree
|
|
57
|
+
from langsmith.testing import _internal as ls_testing_internal
|
|
58
|
+
|
|
59
|
+
_LANGSMITH_AVAILABLE = True
|
|
60
|
+
except Exception: # pragma: no cover - import guard
|
|
61
|
+
ls_testing = None
|
|
62
|
+
get_current_run_tree = None
|
|
63
|
+
ls_testing_internal = None
|
|
64
|
+
_LANGSMITH_AVAILABLE = False
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
from scaffold.python.logging import _rubric_scores as _extract_rubric_scores
|
|
68
|
+
except Exception: # pragma: no cover - fallback if private helper moves
|
|
69
|
+
import re as _re
|
|
70
|
+
|
|
71
|
+
_RUBRIC_RE = _re.compile(r"\[RUBRIC\]\s+(\S+):\s*([0-9.]+)")
|
|
72
|
+
|
|
73
|
+
def _extract_rubric_scores(result):
|
|
74
|
+
scores = {}
|
|
75
|
+
for check in getattr(result, "checks_passed", []):
|
|
76
|
+
match = _RUBRIC_RE.search(check)
|
|
77
|
+
if match:
|
|
78
|
+
try:
|
|
79
|
+
scores[match.group(1)] = float(match.group(2))
|
|
80
|
+
except ValueError:
|
|
81
|
+
continue
|
|
82
|
+
return scores
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# =============================================================================
|
|
86
|
+
# LANGSMITH LOGGING HELPERS (all best-effort; never break the eval run)
|
|
87
|
+
# =============================================================================
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _safe(fn, label=None):
|
|
91
|
+
"""Call a LangSmith logging fn, swallowing errors so tracing never fails a run."""
|
|
92
|
+
try:
|
|
93
|
+
fn()
|
|
94
|
+
except Exception as exc: # pragma: no cover - defensive
|
|
95
|
+
if label:
|
|
96
|
+
print(f"[langsmith] {label} failed: {exc}", file=sys.stderr)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _install_failed_end_run_outputs_patch():
|
|
100
|
+
"""Preserve log_outputs payloads when LangSmith ends a failed pytest run."""
|
|
101
|
+
if not _LANGSMITH_AVAILABLE or ls_testing_internal is None:
|
|
102
|
+
return
|
|
103
|
+
test_case_cls = getattr(ls_testing_internal, "_TestCase", None)
|
|
104
|
+
if test_case_cls is None:
|
|
105
|
+
return
|
|
106
|
+
original = getattr(test_case_cls, "end_run", None)
|
|
107
|
+
if original is None or getattr(original, "_comet_preserve_logged_outputs", False):
|
|
108
|
+
return
|
|
109
|
+
|
|
110
|
+
def end_run(self, run_tree, outputs):
|
|
111
|
+
if outputs is None and getattr(self, "_logged_outputs", None) is not None:
|
|
112
|
+
outputs = self._logged_outputs
|
|
113
|
+
return original(self, run_tree, outputs)
|
|
114
|
+
|
|
115
|
+
end_run._comet_preserve_logged_outputs = True
|
|
116
|
+
end_run._comet_original = original
|
|
117
|
+
test_case_cls.end_run = end_run
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
_install_failed_end_run_outputs_patch()
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _log_inputs_and_reference(task_name, treatment_name):
|
|
124
|
+
if not _LANGSMITH_AVAILABLE:
|
|
125
|
+
return
|
|
126
|
+
try:
|
|
127
|
+
task = load_task(task_name)
|
|
128
|
+
evaluation = task.config.evaluation
|
|
129
|
+
_safe(
|
|
130
|
+
lambda: ls_testing.log_inputs(
|
|
131
|
+
{
|
|
132
|
+
"task": task_name,
|
|
133
|
+
"treatment": treatment_name,
|
|
134
|
+
"difficulty": getattr(task.config.metadata, "difficulty", None),
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
)
|
|
138
|
+
_safe(
|
|
139
|
+
lambda: ls_testing.log_reference_outputs(
|
|
140
|
+
{
|
|
141
|
+
"expected_artifacts": list(evaluation.expected_artifacts or []),
|
|
142
|
+
"required_skills": list(evaluation.required_skills or []),
|
|
143
|
+
"rubric_criteria": list(evaluation.rubric_criteria or []),
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
)
|
|
147
|
+
except Exception: # pragma: no cover - defensive
|
|
148
|
+
pass
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _set_parent_run_env():
|
|
152
|
+
"""Point the Claude Code plugin at this test's run so its trajectory nests here."""
|
|
153
|
+
if not _LANGSMITH_AVAILABLE or get_current_run_tree is None:
|
|
154
|
+
return None
|
|
155
|
+
try:
|
|
156
|
+
run_tree = get_current_run_tree()
|
|
157
|
+
dotted_order = getattr(run_tree, "dotted_order", None) if run_tree else None
|
|
158
|
+
except Exception: # pragma: no cover - defensive
|
|
159
|
+
dotted_order = None
|
|
160
|
+
if dotted_order:
|
|
161
|
+
os.environ["CC_LANGSMITH_PARENT_DOTTED_ORDER"] = dotted_order
|
|
162
|
+
return dotted_order
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _result_from_logger(logger, treatment_name):
|
|
166
|
+
runs = logger.results.get(treatment_name) or []
|
|
167
|
+
if runs:
|
|
168
|
+
return runs[-1]
|
|
169
|
+
|
|
170
|
+
parametrized_suffix = f"-{treatment_name}-"
|
|
171
|
+
for result_name, result_runs in reversed(list(logger.results.items())):
|
|
172
|
+
if result_name == treatment_name or parametrized_suffix in result_name:
|
|
173
|
+
return result_runs[-1] if result_runs else None
|
|
174
|
+
return None
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _iter_result_loggers():
|
|
178
|
+
seen = set()
|
|
179
|
+
candidates = [
|
|
180
|
+
getattr(_local_test_tasks, "conftest", None),
|
|
181
|
+
sys.modules.get("conftest"),
|
|
182
|
+
sys.modules.get("_comet_local_conftest"),
|
|
183
|
+
]
|
|
184
|
+
for module in candidates:
|
|
185
|
+
plugin = getattr(module, "_plugin", None) if module else None
|
|
186
|
+
logger = getattr(plugin, "logger", None) if plugin else None
|
|
187
|
+
if logger is not None and id(logger) not in seen:
|
|
188
|
+
seen.add(id(logger))
|
|
189
|
+
yield logger
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def _latest_report_result(treatment_name):
|
|
193
|
+
logs_dir = Path(os.environ.get("BENCH_LOGS_DIR", ""))
|
|
194
|
+
if not logs_dir:
|
|
195
|
+
return None
|
|
196
|
+
reports_root = logs_dir / "experiments"
|
|
197
|
+
if not reports_root.exists():
|
|
198
|
+
return None
|
|
199
|
+
parametrized_suffix = f"-{treatment_name}-"
|
|
200
|
+
report_files = sorted(
|
|
201
|
+
reports_root.glob("*/reports/*_report.json"),
|
|
202
|
+
key=lambda path: path.stat().st_mtime,
|
|
203
|
+
reverse=True,
|
|
204
|
+
)
|
|
205
|
+
for report_file in report_files:
|
|
206
|
+
try:
|
|
207
|
+
report = json.loads(report_file.read_text())
|
|
208
|
+
except Exception:
|
|
209
|
+
continue
|
|
210
|
+
result_name = report.get("name", "")
|
|
211
|
+
if result_name != treatment_name and parametrized_suffix not in result_name:
|
|
212
|
+
continue
|
|
213
|
+
return TreatmentResult(
|
|
214
|
+
name=result_name,
|
|
215
|
+
passed=report.get("passed", False),
|
|
216
|
+
checks_passed=report.get("checks_passed", []),
|
|
217
|
+
checks_failed=report.get("checks_failed", []),
|
|
218
|
+
events_summary=report.get("events_summary", {}),
|
|
219
|
+
run_id=report.get("run_id", ""),
|
|
220
|
+
)
|
|
221
|
+
return None
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def _latest_result(treatment_name):
|
|
225
|
+
for logger in _iter_result_loggers():
|
|
226
|
+
result = _result_from_logger(logger, treatment_name)
|
|
227
|
+
if result is not None:
|
|
228
|
+
return result
|
|
229
|
+
return _latest_report_result(treatment_name)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _log_outputs_and_feedback(result):
|
|
233
|
+
if not _LANGSMITH_AVAILABLE:
|
|
234
|
+
return
|
|
235
|
+
if result is None:
|
|
236
|
+
print("[langsmith] no local eval result found; outputs/feedback not logged.", file=sys.stderr)
|
|
237
|
+
return
|
|
238
|
+
summary = getattr(result, "events_summary", {}) or {}
|
|
239
|
+
outputs = {
|
|
240
|
+
"run_id": getattr(result, "run_id", ""),
|
|
241
|
+
"passed": getattr(result, "passed", None),
|
|
242
|
+
"checks_passed": len(getattr(result, "checks_passed", [])),
|
|
243
|
+
"checks_failed": len(getattr(result, "checks_failed", [])),
|
|
244
|
+
"num_turns": summary.get("num_turns"),
|
|
245
|
+
"tool_calls": summary.get("tool_calls"),
|
|
246
|
+
"duration_seconds": summary.get("duration_seconds"),
|
|
247
|
+
"total_tokens": summary.get("total_tokens"),
|
|
248
|
+
"total_cost_usd": summary.get("total_cost_usd"),
|
|
249
|
+
"skills_invoked": summary.get("skills_invoked", []),
|
|
250
|
+
}
|
|
251
|
+
_safe(
|
|
252
|
+
lambda: ls_testing.log_outputs(outputs)
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
passed = len(getattr(result, "checks_passed", []))
|
|
256
|
+
failed = len(getattr(result, "checks_failed", []))
|
|
257
|
+
total = passed + failed
|
|
258
|
+
if total:
|
|
259
|
+
_safe(
|
|
260
|
+
lambda: ls_testing.log_feedback(key="checks_pass_rate", score=passed / total),
|
|
261
|
+
label="log_feedback checks_pass_rate",
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
for dim, score in _extract_rubric_scores(result).items():
|
|
265
|
+
_safe(
|
|
266
|
+
lambda d=dim, s=score: ls_testing.log_feedback(key=f"rubric.{d}", score=s),
|
|
267
|
+
label=f"log_feedback rubric.{dim}",
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
# =============================================================================
|
|
272
|
+
# TEST
|
|
273
|
+
# =============================================================================
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
@pytest.mark.timeout(PYTEST_TIMEOUT)
|
|
277
|
+
@pytest.mark.langsmith
|
|
278
|
+
def test_task_treatment(task_name, treatment_name):
|
|
279
|
+
"""Run a task+treatment via the local runner and log results to LangSmith."""
|
|
280
|
+
_log_inputs_and_reference(task_name, treatment_name)
|
|
281
|
+
_set_parent_run_env()
|
|
282
|
+
try:
|
|
283
|
+
_run_local_task_treatment(task_name, treatment_name)
|
|
284
|
+
finally:
|
|
285
|
+
_log_outputs_and_feedback(_latest_result(treatment_name))
|
|
286
|
+
os.environ.pop("CC_LANGSMITH_PARENT_DOTTED_ORDER", None)
|
|
287
|
+
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# 本地评估套件
|
|
2
|
+
|
|
3
|
+
这个套件用于在本机运行 Comet 和任意本地 Skill 的 benchmark,并将日志与 Docker 验证结果保存到本地。
|
|
4
|
+
它不需要 LangSmith 凭证。
|
|
5
|
+
|
|
6
|
+
从 `eval/` 目录运行:
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
uv run pytest local/tests/tasks/test_tasks.py --task=comet-fix-median --treatment=COMET_FULL_040_BETA -v
|
|
10
|
+
uv run pytest local/tests/tasks/test_tasks.py --task=comet-full-workflow --treatment=CONTROL,COMET_FULL_040_BETA -v
|
|
11
|
+
uv run pytest local/tests/tasks/test_tasks.py -v
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
快速运行通用 smoke 任务:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
uv run pytest local/tests/tasks/test_tasks.py --task=generic-skill-smoke --treatment=CONTROL -v
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
运行生成 Skill 的 authoring smoke 任务:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
uv run pytest local/tests/tasks/test_tasks.py \
|
|
24
|
+
--task=authoring-skill-smoke \
|
|
25
|
+
--eval-manifest=/path/to/generated-skill/comet/eval.yaml \
|
|
26
|
+
--profile=authoring-skill -v
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
运行生成 Skill 的路由一致性验证:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
uv run pytest local/tests/tasks/test_tasks.py \
|
|
33
|
+
--task=workflow-route-conformance \
|
|
34
|
+
--eval-manifest=/path/to/generated-skill/comet/eval.yaml \
|
|
35
|
+
--profile=authoring-skill -v
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
当 `--eval-manifest` 指向 `/comet-any` 生成包时,runner 会先把入口 Skill 包和生成的内部 Node Skills 复制到隔离的 eval 工作区,再执行 Docker 验证。
|
|
39
|
+
|
|
40
|
+
`comet-workflow` profile 会把 `skills/benchmarks/dependency/claude-md/comet-workflow/CLAUDE.md` 注入到隔离工作区根目录,用项目级指令强制 agent 先触发 `/comet`。如果需要调整这段提示词,直接改这个资产文件,不需要改 Python runner。
|
|
41
|
+
|
|
42
|
+
Comet baseline 和它依赖的 OpenSpec / Superpowers Skill 都会按完整 Skill 包安装到 `.claude/skills/`,包括 `rules/`、`reference/`、`runtime/`、`scripts/` 以及其他随包文件。安装 canonical `comet` Skill 时,runner 会根据 baseline 自动配置 Claude Code `PreToolUse` hook:`COMET_FULL_039` 使用 `comet-hook-guard.sh`,`COMET_FULL_040_BETA` 使用 `comet-hook-guard.mjs`。
|
|
43
|
+
|
|
44
|
+
报告中的 `Skills invoked` 和 `skill_invocation` rubric 只统计 Claude Code 事件里真实观测到的 Skill 工具调用,不会根据产物反推。`comet-workflow` profile 会把嵌套 Comet 阶段 Skill、OpenSpec 依赖 Skill、Superpowers 依赖 Skill 都作为关键证据;如果只调用主 `comet` 但没有调用这些依赖,run 会被标记为工作流契约失败。rubric 会按 `full`、`hotfix`、`tweak` 三类 workflow 分别评分:`full` 要求深度设计和完整阶段证据,`hotfix` / `tweak` 使用预设路径的轻量产物和连续执行决策点口径。
|
|
45
|
+
|
|
46
|
+
容器内 Claude 实验工作区的 ASCII 目录结构见 `../README.md` 的“容器中的 Claude 实验工作区”。
|
|
47
|
+
|
|
48
|
+
任务索引:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
tasks/index.yaml
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
报告和产物写入:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
logs/experiments/
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
报告默认只输出 Markdown(`summary.md`)。如需启用可浏览的 HTML,或关闭 Markdown 输出,传入 JSON/YAML 报告配置:
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"report_outputs": {
|
|
65
|
+
"markdown": true,
|
|
66
|
+
"html": true
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
uv run pytest local/tests/tasks/test_tasks.py --report-config report-config.json -v
|
|
73
|
+
uv run python local/scripts/compare_baselines.py --report-config report-config.json
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
也可以设置 `COMET_EVAL_REPORT_CONFIG=/path/to/report-config.json`。
|
|
77
|
+
|
|
78
|
+
每次运行的报告都会包含 profile、Skill 来源元数据、run id、产物引用,以及结构化失败归因。归因桶包括 `harness`、`workflow`、`task` 和 `model`。
|
|
79
|
+
|
|
80
|
+
比较报告还会显示 `Data quality summary`。报告保留所有 raw runs 供审计,但 headline 指标、pass@k/pass^k、成本统计、图表和 verdict 默认使用 analysis set。`excluded` 表示明确的环境或运行器噪声(例如 API timeout、rate limit、Docker 启动失败),不会进入主统计;`flagged` 表示可疑 harness/task 噪声,仍进入主统计但会在报告中单独标出;真实 workflow/model/task 失败会保留为 `included`,不会因为分数低被过滤。
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"dimensions": {
|
|
3
|
+
"main_flow": 1.0,
|
|
4
|
+
"gate_guard": 1.0,
|
|
5
|
+
"skill_invocation": 1.0,
|
|
6
|
+
"spec_drift": 0.25,
|
|
7
|
+
"completion": 0.8,
|
|
8
|
+
"efficiency": 0.73,
|
|
9
|
+
"decision_point_compliance": 0.5,
|
|
10
|
+
"artifact_quality": 1.0
|
|
11
|
+
},
|
|
12
|
+
"source": "regression_check.py"
|
|
13
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 820 460" role="img" aria-label="Figure 2. Quality-cost frontier">
|
|
2
|
+
<style>
|
|
3
|
+
text { font-family: 'Times New Roman', SimSun, 'Songti SC', 'Noto Serif CJK SC', serif; }
|
|
4
|
+
.title { fill: #1B1A18; font-size: 18px; font-weight: 700; }
|
|
5
|
+
.subtitle, .tick { fill: #66615A; font-size: 12px; }
|
|
6
|
+
.label { fill: #1B1A18; font-size: 13px; }
|
|
7
|
+
.value { fill: #1B1A18; font-size: 12px; font-family: 'Times New Roman', SimSun, 'Songti SC', 'Noto Serif CJK SC', serif; }
|
|
8
|
+
.grid { stroke: #D8D2C7; stroke-width: 1; shape-rendering: crispEdges; }
|
|
9
|
+
.axis { stroke: #1B1A18; stroke-width: 1; shape-rendering: crispEdges; }
|
|
10
|
+
</style>
|
|
11
|
+
<rect width="820" height="460" fill="#FFFFFF" />
|
|
12
|
+
<text class="title" x="32" y="32">Figure 2. Quality-cost frontier</text>
|
|
13
|
+
<text class="subtitle" x="32" y="54">Y-axis is rubric average, x-axis is total tokens; upper-left is better.</text>
|
|
14
|
+
<line class="grid" x1="86.0" y1="72" x2="86.0" y2="372" />
|
|
15
|
+
<text class="tick" x="86.0" y="402" text-anchor="middle">0M</text>
|
|
16
|
+
<line class="grid" x1="292.7" y1="72" x2="292.7" y2="372" />
|
|
17
|
+
<text class="tick" x="292.7" y="402" text-anchor="middle">4M</text>
|
|
18
|
+
<line class="grid" x1="499.3" y1="72" x2="499.3" y2="372" />
|
|
19
|
+
<text class="tick" x="499.3" y="402" text-anchor="middle">8M</text>
|
|
20
|
+
<line class="grid" x1="706.0" y1="72" x2="706.0" y2="372" />
|
|
21
|
+
<text class="tick" x="706.0" y="402" text-anchor="middle">12M</text>
|
|
22
|
+
<line class="grid" x1="86" y1="372.0" x2="706" y2="372.0" />
|
|
23
|
+
<text class="tick" x="60" y="376.0" text-anchor="end">0.3</text>
|
|
24
|
+
<line class="grid" x1="86" y1="272.0" x2="706" y2="272.0" />
|
|
25
|
+
<text class="tick" x="60" y="276.0" text-anchor="end">0.5</text>
|
|
26
|
+
<line class="grid" x1="86" y1="172.0" x2="706" y2="172.0" />
|
|
27
|
+
<text class="tick" x="60" y="176.0" text-anchor="end">0.7</text>
|
|
28
|
+
<line class="grid" x1="86" y1="72.0" x2="706" y2="72.0" />
|
|
29
|
+
<text class="tick" x="60" y="76.0" text-anchor="end">0.9</text>
|
|
30
|
+
<line class="axis" x1="86" y1="372" x2="706" y2="372" />
|
|
31
|
+
<line class="axis" x1="86" y1="72" x2="86" y2="372" />
|
|
32
|
+
<line x1="372.8" y1="252.0" x2="677.4" y2="162.0" stroke="#9B9488" stroke-width="1.5" stroke-dasharray="5 5" />
|
|
33
|
+
<circle cx="677.4" cy="162.0" r="8" fill="#1F5F8B" />
|
|
34
|
+
<text class="value" x="663.4" y="152.0" text-anchor="end">Current workflow</text>
|
|
35
|
+
<text class="tick" x="663.4" y="171.0" text-anchor="end">0.72 / $7.59</text>
|
|
36
|
+
<circle cx="372.8" cy="252.0" r="8" fill="#9F3D2F" />
|
|
37
|
+
<text class="value" x="386.8" y="242.0" text-anchor="start">0.3.9 baseline</text>
|
|
38
|
+
<text class="tick" x="386.8" y="261.0" text-anchor="start">0.54 / $3.97</text>
|
|
39
|
+
<text class="label" x="396.0" y="438" text-anchor="middle">Total tokens</text>
|
|
40
|
+
<text class="label" x="24" y="222.0" transform="rotate(-90 24 222.0)" text-anchor="middle">Rubric average</text>
|
|
41
|
+
</svg>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 820 460" role="img" aria-label="图 2. 质量-成本前沿">
|
|
2
|
+
<style>
|
|
3
|
+
text { font-family: 'Times New Roman', SimSun, 'Songti SC', 'Noto Serif CJK SC', serif; }
|
|
4
|
+
.title { fill: #1B1A18; font-size: 18px; font-weight: 700; }
|
|
5
|
+
.subtitle, .tick { fill: #66615A; font-size: 12px; }
|
|
6
|
+
.label { fill: #1B1A18; font-size: 13px; }
|
|
7
|
+
.value { fill: #1B1A18; font-size: 12px; font-family: 'Times New Roman', SimSun, 'Songti SC', 'Noto Serif CJK SC', serif; }
|
|
8
|
+
.grid { stroke: #D8D2C7; stroke-width: 1; shape-rendering: crispEdges; }
|
|
9
|
+
.axis { stroke: #1B1A18; stroke-width: 1; shape-rendering: crispEdges; }
|
|
10
|
+
</style>
|
|
11
|
+
<rect width="820" height="460" fill="#FFFFFF" />
|
|
12
|
+
<text class="title" x="32" y="32">图 2. 质量-成本前沿</text>
|
|
13
|
+
<text class="subtitle" x="32" y="54">纵轴为 Rubric 平均分,横轴为总 token;点越靠左上越理想。</text>
|
|
14
|
+
<line class="grid" x1="86.0" y1="72" x2="86.0" y2="372" />
|
|
15
|
+
<text class="tick" x="86.0" y="402" text-anchor="middle">0M</text>
|
|
16
|
+
<line class="grid" x1="292.7" y1="72" x2="292.7" y2="372" />
|
|
17
|
+
<text class="tick" x="292.7" y="402" text-anchor="middle">4M</text>
|
|
18
|
+
<line class="grid" x1="499.3" y1="72" x2="499.3" y2="372" />
|
|
19
|
+
<text class="tick" x="499.3" y="402" text-anchor="middle">8M</text>
|
|
20
|
+
<line class="grid" x1="706.0" y1="72" x2="706.0" y2="372" />
|
|
21
|
+
<text class="tick" x="706.0" y="402" text-anchor="middle">12M</text>
|
|
22
|
+
<line class="grid" x1="86" y1="372.0" x2="706" y2="372.0" />
|
|
23
|
+
<text class="tick" x="60" y="376.0" text-anchor="end">0.3</text>
|
|
24
|
+
<line class="grid" x1="86" y1="272.0" x2="706" y2="272.0" />
|
|
25
|
+
<text class="tick" x="60" y="276.0" text-anchor="end">0.5</text>
|
|
26
|
+
<line class="grid" x1="86" y1="172.0" x2="706" y2="172.0" />
|
|
27
|
+
<text class="tick" x="60" y="176.0" text-anchor="end">0.7</text>
|
|
28
|
+
<line class="grid" x1="86" y1="72.0" x2="706" y2="72.0" />
|
|
29
|
+
<text class="tick" x="60" y="76.0" text-anchor="end">0.9</text>
|
|
30
|
+
<line class="axis" x1="86" y1="372" x2="706" y2="372" />
|
|
31
|
+
<line class="axis" x1="86" y1="72" x2="86" y2="372" />
|
|
32
|
+
<line x1="372.8" y1="252.0" x2="677.4" y2="162.0" stroke="#9B9488" stroke-width="1.5" stroke-dasharray="5 5" />
|
|
33
|
+
<circle cx="677.4" cy="162.0" r="8" fill="#1F5F8B" />
|
|
34
|
+
<text class="value" x="663.4" y="152.0" text-anchor="end">当前 workflow</text>
|
|
35
|
+
<text class="tick" x="663.4" y="171.0" text-anchor="end">0.72 / $7.59</text>
|
|
36
|
+
<circle cx="372.8" cy="252.0" r="8" fill="#9F3D2F" />
|
|
37
|
+
<text class="value" x="386.8" y="242.0" text-anchor="start">0.3.9 基线</text>
|
|
38
|
+
<text class="tick" x="386.8" y="261.0" text-anchor="start">0.54 / $3.97</text>
|
|
39
|
+
<text class="label" x="396.0" y="438" text-anchor="middle">总 token</text>
|
|
40
|
+
<text class="label" x="24" y="222.0" transform="rotate(-90 24 222.0)" text-anchor="middle">Rubric 平均分</text>
|
|
41
|
+
</svg>
|