@rpamis/comet 0.4.0-beta.2 → 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 +27 -18
- package/assets/manifest.json +2 -1
- package/assets/skills/comet/SKILL.md +25 -1
- package/assets/skills/comet/reference/comet-yaml-fields.md +6 -4
- 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 +1664 -512
- package/assets/skills/comet-archive/SKILL.md +24 -11
- package/assets/skills/comet-build/SKILL.md +40 -31
- 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 -4
- 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 +40 -31
- 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 +37 -3
- 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 +1 -0
- package/dist/app/commands/doctor.d.ts.map +1 -1
- package/dist/app/commands/doctor.js +100 -35
- 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 +101 -141
- 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 +67 -29
- 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 +269 -4
- 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 +129 -15
- package/dist/domains/comet-classic/classic-state-command.js.map +1 -1
- package/dist/domains/comet-classic/classic-state.d.ts +3 -3
- package/dist/domains/comet-classic/classic-state.d.ts.map +1 -1
- package/dist/domains/comet-classic/classic-state.js +4 -6
- 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 +27 -9
- 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 +16 -16
- 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
package/eval/README.md
ADDED
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
# Comet Skill 评估
|
|
2
|
+
|
|
3
|
+
基于 pytest 的 Skill 评估框架,用于量化衡量 Comet 工作流和任意本地 Skill 的执行质量。
|
|
4
|
+
|
|
5
|
+
## 目录结构
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
eval/
|
|
9
|
+
├── scaffold/ # 共享 Python 运行器、Docker 辅助、加载器、验证器
|
|
10
|
+
│ └── python/
|
|
11
|
+
│ ├── validation/
|
|
12
|
+
│ │ ├── generic_rubric.py # 通用 rubric(7 维度 + LLM judge)
|
|
13
|
+
│ │ ├── rubric.py # Comet 工作流 rubric(9 维度 + LLM judge)
|
|
14
|
+
│ │ ├── authoring_rubric.py # /comet-any 生成包 rubric(11 维度)
|
|
15
|
+
│ │ └── core.py # 验证器基础工具
|
|
16
|
+
│ ├── generic_llm_judge.py # 通用 LLM-as-judge 模块
|
|
17
|
+
│ ├── llm_judge.py # Comet LLM-as-judge 模块
|
|
18
|
+
│ ├── profiles.py # 评估 profile 注册表
|
|
19
|
+
│ ├── tasks.py # 任务加载器(task.toml 解析)
|
|
20
|
+
│ └── treatments.py # Treatment 加载器
|
|
21
|
+
├── local/ # 本地评估套件
|
|
22
|
+
│ ├── tasks/ # 任务定义(每个子目录是一个任务)
|
|
23
|
+
│ ├── treatments/ # Treatment 配置(注入哪些 Skill)
|
|
24
|
+
│ ├── tests/ # pytest 测试入口
|
|
25
|
+
│ └── logs/ # 评估结果日志
|
|
26
|
+
└── langsmith/ # LangSmith 评估入口(可选)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 环境配置
|
|
30
|
+
|
|
31
|
+
### 前置依赖
|
|
32
|
+
|
|
33
|
+
- Python 3.11+
|
|
34
|
+
- Docker
|
|
35
|
+
- Claude Code CLI(`claude` 命令可用)
|
|
36
|
+
- `uv`(推荐)或 pip
|
|
37
|
+
|
|
38
|
+
### 安装
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
cd eval
|
|
42
|
+
uv sync
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 环境变量
|
|
46
|
+
|
|
47
|
+
评估运行会先读取当前 shell 的环境变量,也会按需加载 `eval/.env`。录屏或演示时可以不创建 `.env`,或只创建一个完全空的 `.env`,把密钥放在系统环境变量里,避免文件内容出现在画面中。
|
|
48
|
+
|
|
49
|
+
如需本地文件配置,可复制 `.env.example` 为 `.env` 并填写:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
cp .env.example .env
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
> 注意:如果你使用系统环境变量,不要把 `.env.example` 中的 `ANTHROPIC_API_KEY=` 这类空赋值原样保留到 `.env`;空赋值在部分加载路径中可能覆盖已经存在的系统环境变量。
|
|
56
|
+
|
|
57
|
+
| 变量 | 必填 | 说明 |
|
|
58
|
+
| ----------------------------------------------------------------- | ---- | --------------------------------------------------------------------------------------------------- |
|
|
59
|
+
| `ANTHROPIC_API_KEY` | ✅\* | Anthropic API 密钥;也可以由系统环境变量提供 |
|
|
60
|
+
| `BENCH_CC_MODEL` | ❌ | Claude 模型覆盖(默认用 CLI 配置) |
|
|
61
|
+
| `BENCH_SIMULATOR_PROMPT_FILE` | ❌ | 自定义用户模拟器提示词文件(默认 `eval/simulator-instruction.md`) |
|
|
62
|
+
| `ANTHROPIC_AUTH_TOKEN` / `ANTHROPIC_BASE_URL` / `ANTHROPIC_MODEL` | ❌ | 用 Anthropic 兼容代理时的认证与模型配置;设置 `ANTHROPIC_AUTH_TOKEN` 后可不设置 `ANTHROPIC_API_KEY` |
|
|
63
|
+
| `BENCH_LLM_JUDGE` | ❌ | 设为 `1` 启用 LLM-as-judge 评分 |
|
|
64
|
+
| `BENCH_JUDGE_MODEL` | ❌ | Judge 模型;启用 `BENCH_LLM_JUDGE=1` 时必须显式设置,不能复用主模型 |
|
|
65
|
+
| `BENCH_JUDGE_AUTH_TOKEN` / `BENCH_JUDGE_BASE_URL` | ❌ | Judge 专用 Anthropic 兼容代理认证与 URL;两者都设置时优先通过 Anthropic Messages HTTP 直接调用 judge |
|
|
66
|
+
| `BENCH_JUDGE_API_KEY` | ❌ | Judge 专用 Anthropic API key;如果设置 `BENCH_JUDGE_AUTH_TOKEN`,优先使用 auth token |
|
|
67
|
+
| `LANGSMITH_API_KEY` | ❌ | 仅 LangSmith 套件需要 |
|
|
68
|
+
| `LANGSMITH_PROJECT` / `LANGSMITH_TRACING` | ❌ | LangSmith 套件项目名与追踪开关;Claude Code 插件变量会从这组配置自动派生 |
|
|
69
|
+
|
|
70
|
+
`*` 本地 Claude eval 至少需要 `ANTHROPIC_API_KEY` 或 `ANTHROPIC_AUTH_TOKEN` 之一存在于当前进程环境中。
|
|
71
|
+
|
|
72
|
+
## 快速开始
|
|
73
|
+
|
|
74
|
+
### 运行内置任务
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# 运行单个任务 + treatment
|
|
78
|
+
uv run pytest local/tests/tasks/test_tasks.py --task=generic-skill-smoke --treatment=CONTROL -v
|
|
79
|
+
|
|
80
|
+
# 运行 Comet 工作流任务
|
|
81
|
+
uv run pytest local/tests/tasks/test_tasks.py --task=comet-full-workflow --treatment=COMET_FULL_040_BETA -v
|
|
82
|
+
|
|
83
|
+
# 运行所有任务
|
|
84
|
+
uv run pytest local/tests/tasks/test_tasks.py -v
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 报告中的去噪口径
|
|
88
|
+
|
|
89
|
+
Eval 报告同时保留 raw set 和 analysis set。Raw set 包含所有 run,方便追查原始 stdout/stderr、events、reports 和 artifacts;analysis set 默认排除明确环境噪声,用于 headline 指标、pass@k/pass^k、成本统计、图表和 verdict。
|
|
90
|
+
|
|
91
|
+
- `included`:可解释实验信号,进入主统计。真实 workflow、model、task 或 validator 失败仍属于这一类。
|
|
92
|
+
- `flagged`:可疑 harness/task 噪声,进入主统计,但报告会提示它可能影响结论。
|
|
93
|
+
- `excluded`:明确环境或运行器噪声,不进入主统计,例如 API timeout、rate limit、认证/网络失败、Docker/container failure 或外层 runner timeout。
|
|
94
|
+
|
|
95
|
+
如果关键 treatment 的 clean data 不足,报告会输出 `Insufficient clean data` 或 `Inconclusive due to data quality`,而不是给出误导性的胜负结论。
|
|
96
|
+
|
|
97
|
+
### 评估任意 Skill
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
uv run pytest local/tests/tasks/test_tasks.py \
|
|
101
|
+
--task=generic-skill-smoke \
|
|
102
|
+
--skill-path=/path/to/my-skill \
|
|
103
|
+
--skill-name=my-skill \
|
|
104
|
+
--profile=generic -v
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 评估 /comet-any 生成的包
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
uv run pytest local/tests/tasks/test_tasks.py \
|
|
111
|
+
--eval-manifest=/path/to/my-skill/comet/eval.yaml -v
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## 容器中的 Claude 实验工作区
|
|
115
|
+
|
|
116
|
+
每次实验都会先在宿主机创建一个临时隔离目录,然后把它挂载到 Claude Code 容器的 `/workspace`。Claude 的当前工作目录就是 `/workspace`;双 agent 交互模式还会只读挂载 scaffold shell 到 `/opt/scaffold-shell`。
|
|
117
|
+
|
|
118
|
+
典型结构如下(以 `COMET_FULL_040_BETA` 为例,展示 0.4.0 beta 的 Comet Skill + 完整 dependency snapshot;实际任务产物会随 task/treatment 变化):
|
|
119
|
+
|
|
120
|
+
```text
|
|
121
|
+
/workspace # Claude Code 的当前工作目录;宿主机临时隔离目录挂载点
|
|
122
|
+
|-- Dockerfile # 当前 task 的 Docker 构建文件,来自 task/environment/
|
|
123
|
+
|-- requirements.txt # Python 依赖文件;仅 task 提供时存在
|
|
124
|
+
|-- package.json # Node 依赖文件;仅 task 提供时存在
|
|
125
|
+
|-- package-lock.json # Node 锁文件;仅 task 提供时存在
|
|
126
|
+
|-- tsconfig.json # TypeScript 配置;仅 task 提供时存在
|
|
127
|
+
|-- CLAUDE.md # 项目级指令;comet-workflow profile 会注入强制 /comet 指令
|
|
128
|
+
|-- .eval-task-prompt.txt # auto_user 模式下的任务提示词临时文件,运行后清理
|
|
129
|
+
|-- .eval-simulator-prompt.txt # auto_user 模式下的用户模拟器提示词临时文件,运行后清理
|
|
130
|
+
|-- .claude # Claude Code 本地配置和 Skill 安装目录
|
|
131
|
+
| |-- CLAUDE.md # Claude 专用项目指令副本
|
|
132
|
+
| |-- settings.json # Claude Code settings;包含 Comet PreToolUse hook
|
|
133
|
+
| `-- skills # 当前 treatment 注入的完整 Skill 包
|
|
134
|
+
| |-- comet # 040 beta 主 /comet Skill;039 baseline 也安装到这个 canonical 名称
|
|
135
|
+
| | |-- SKILL.md # 主 Skill 入口说明
|
|
136
|
+
| | |-- rules # Comet 软规则目录,完整复制自 benchmark snapshot
|
|
137
|
+
| | | `-- comet-phase-guard.md # phase guard 规则;040 beta 示例为中文规则文件
|
|
138
|
+
| | |-- reference # Comet reference 文档目录,供 Skill 运行时读取
|
|
139
|
+
| | | |-- auto-transition.md # 自动阶段推进协议
|
|
140
|
+
| | | |-- comet-yaml-fields.md # .comet.yaml 字段说明
|
|
141
|
+
| | | |-- context-recovery.md # 上下文恢复协议
|
|
142
|
+
| | | |-- debug-gate.md # 异常调试协议
|
|
143
|
+
| | | |-- decision-point.md # 用户决策点协议
|
|
144
|
+
| | | |-- dirty-worktree.md # dirty worktree 处理协议
|
|
145
|
+
| | | |-- file-structure.md # Comet 产物目录约定
|
|
146
|
+
| | | |-- intent-frame.md # 040 beta intent routing 字段说明
|
|
147
|
+
| | | |-- scripts.md # 运行脚本说明
|
|
148
|
+
| | | `-- subagent-dispatch.md # 子代理分发协议
|
|
149
|
+
| | |-- runtime # 040 beta runtime 元数据目录
|
|
150
|
+
| | | `-- classic # classic runtime package metadata
|
|
151
|
+
| | | |-- checks.yaml # comet skill check 的检查定义
|
|
152
|
+
| | | |-- guardrails.yaml # classic runtime guardrail 配置
|
|
153
|
+
| | | `-- skill.yaml # classic runtime Skill metadata
|
|
154
|
+
| | `-- scripts # 040 beta Node 脚本目录;完整复制自 benchmark snapshot
|
|
155
|
+
| | |-- comet-hook-guard.mjs # 040 beta Claude Code PreToolUse hook 入口
|
|
156
|
+
| | |-- comet-archive.mjs # archive 阶段脚本
|
|
157
|
+
| | |-- comet-env.mjs # runtime 环境解析脚本
|
|
158
|
+
| | |-- comet-guard.mjs # phase guard 脚本
|
|
159
|
+
| | |-- comet-handoff.mjs # handoff 写入脚本
|
|
160
|
+
| | |-- comet-intent.mjs # intent routing 脚本
|
|
161
|
+
| | |-- comet-state.mjs # .comet.yaml 状态机脚本
|
|
162
|
+
| | `-- comet-yaml-validate.mjs # .comet.yaml schema 校验脚本
|
|
163
|
+
| |-- comet-open # 040 beta /comet-open 阶段 Skill;完整包复制
|
|
164
|
+
| |-- comet-design # 040 beta /comet-design 阶段 Skill;完整包复制
|
|
165
|
+
| |-- comet-build # 040 beta /comet-build 阶段 Skill;完整包复制
|
|
166
|
+
| |-- comet-verify # 040 beta /comet-verify 阶段 Skill;完整包复制
|
|
167
|
+
| |-- comet-archive # 040 beta /comet-archive 阶段 Skill;完整包复制
|
|
168
|
+
| |-- comet-hotfix # 040 beta /comet-hotfix 工作流 Skill;完整包复制
|
|
169
|
+
| |-- comet-tweak # 040 beta /comet-tweak 工作流 Skill;完整包复制
|
|
170
|
+
| |-- openspec-apply-change # OpenSpec dependency Skill;完整包复制
|
|
171
|
+
| |-- openspec-archive-change # OpenSpec dependency Skill;完整包复制
|
|
172
|
+
| |-- openspec-bulk-archive-change # OpenSpec dependency Skill;完整包复制
|
|
173
|
+
| |-- openspec-continue-change # OpenSpec dependency Skill;完整包复制
|
|
174
|
+
| |-- openspec-explore # OpenSpec dependency Skill;完整包复制
|
|
175
|
+
| |-- openspec-ff-change # OpenSpec dependency Skill;完整包复制
|
|
176
|
+
| |-- openspec-new-change # OpenSpec dependency Skill;完整包复制
|
|
177
|
+
| |-- openspec-onboard # OpenSpec dependency Skill;完整包复制
|
|
178
|
+
| |-- openspec-propose # OpenSpec dependency Skill;完整包复制
|
|
179
|
+
| |-- openspec-sync-specs # OpenSpec dependency Skill;完整包复制
|
|
180
|
+
| |-- openspec-verify-change # OpenSpec dependency Skill;完整包复制
|
|
181
|
+
| |-- brainstorming # Superpowers dependency Skill;带 visual companion 和 scripts
|
|
182
|
+
| | |-- SKILL.md # brainstorming Skill 入口
|
|
183
|
+
| | |-- scripts # brainstorming 辅助脚本目录
|
|
184
|
+
| | `-- visual-companion.md # brainstorming visual companion 说明
|
|
185
|
+
| |-- dispatching-parallel-agents # Superpowers dependency Skill;完整包复制
|
|
186
|
+
| |-- executing-plans # Superpowers dependency Skill;完整包复制
|
|
187
|
+
| |-- finishing-a-development-branch # Superpowers dependency Skill;完整包复制
|
|
188
|
+
| |-- receiving-code-review # Superpowers dependency Skill;完整包复制
|
|
189
|
+
| |-- requesting-code-review # Superpowers dependency Skill;完整包复制
|
|
190
|
+
| |-- subagent-driven-development # Superpowers dependency Skill;带 scripts 和 reviewer prompt
|
|
191
|
+
| | |-- SKILL.md # subagent-driven-development Skill 入口
|
|
192
|
+
| | |-- scripts # subagent workspace/review 辅助脚本目录
|
|
193
|
+
| | `-- task-reviewer-prompt.md # task reviewer prompt 文件
|
|
194
|
+
| |-- systematic-debugging # Superpowers dependency Skill;完整包复制
|
|
195
|
+
| |-- test-driven-development # Superpowers dependency Skill;完整包复制
|
|
196
|
+
| |-- using-git-worktrees # Superpowers dependency Skill;完整包复制
|
|
197
|
+
| |-- verification-before-completion # Superpowers dependency Skill;完整包复制
|
|
198
|
+
| |-- writing-plans # Superpowers dependency Skill;完整包复制
|
|
199
|
+
| `-- writing-skills # Superpowers dependency Skill;带 examples 等支持文件
|
|
200
|
+
| |-- SKILL.md # writing-skills Skill 入口
|
|
201
|
+
| `-- examples # writing-skills 示例目录
|
|
202
|
+
|-- .comet # Comet 项目配置/运行状态目录,由 workflow 创建或更新
|
|
203
|
+
| `-- config.yaml # Comet 项目配置;由 init/update 或 task 环境提供
|
|
204
|
+
|-- openspec # OpenSpec 工作区目录,由 workflow 创建或更新
|
|
205
|
+
| `-- changes # OpenSpec change 产物目录
|
|
206
|
+
|-- docs # repo 文档目录;workflow 可能写入设计/计划/证据
|
|
207
|
+
| `-- superpowers # Superpowers 设计、计划、审查证据目录
|
|
208
|
+
|-- _test_results.json # validation 脚本输出的结构化结果
|
|
209
|
+
`-- <task files and agent artifacts> # task 初始代码和 agent 运行中创建的产物
|
|
210
|
+
|
|
211
|
+
/opt/scaffold-shell # 双 agent loop 模式下只读挂载的 runner shell 脚本目录
|
|
212
|
+
|-- run-claude-loop.sh # subject agent 和 simulator agent 的循环驱动脚本
|
|
213
|
+
|-- docker.sh # Docker build/run 辅助脚本
|
|
214
|
+
|-- setup.sh # workspace setup 辅助脚本
|
|
215
|
+
`-- common.sh # shell 公共函数
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
说明:
|
|
219
|
+
|
|
220
|
+
- `Dockerfile`、依赖文件和任务初始代码来自当前 task 的 `environment/`,例如 `stats.py`、`test_stats.py`。
|
|
221
|
+
- `CLAUDE.md` 只在需要项目级指令时写入;`comet-workflow` profile 会写入强制先触发 `/comet` 的 benchmark 指令。
|
|
222
|
+
- `.eval-task-prompt.txt` 和 `.eval-simulator-prompt.txt` 只在 `auto_user` 双 agent 模式运行期间存在,运行结束后会清理。
|
|
223
|
+
- `.claude/settings.json` 会为 Comet baseline 配置 Claude Code `PreToolUse` hook。`COMET_FULL_040_BETA` 指向 `comet-hook-guard.mjs`;`COMET_FULL_039` 指向 `comet-hook-guard.sh`。
|
|
224
|
+
- `.claude/skills/*` 是完整 Skill 包复制,不只是 `SKILL.md`;OpenSpec 和 Superpowers 依赖的 `scripts/`、`examples/`、prompt 文件和其他随包文件都会保留。
|
|
225
|
+
- `COMET_FULL_039` 的目录形状与上面一致,但 `comet` 和 `comet-*` 来自 `039-release/*` 快照,主脚本是 `.sh`:`comet-hook-guard.sh`、`comet-state.sh`、`comet-guard.sh`、`comet-handoff.sh`、`comet-archive.sh`、`comet-yaml-validate.sh`。OpenSpec / Superpowers dependency snapshot 与 040 baseline 相同。
|
|
226
|
+
- `openspec/`、`.comet/`、`docs/superpowers/`、任务代码修改和其他产物由 agent 在运行过程中创建或更新。
|
|
227
|
+
- LangSmith 轨迹追踪由官方 `langsmith-tracing` Claude Code 插件负责(不再使用手写 Stop hook);用户主要配置 `LANGSMITH_*`,`TRACE_TO_LANGSMITH` / `CC_LANGSMITH_*` 会自动派生。启用完整 Claude Code trajectory 时,插件预构建目录会以 `/opt/langsmith-cc-plugin` 只读挂载进容器,详见 `langsmith/README.md`。
|
|
228
|
+
- `/opt/scaffold-shell` 只在双 agent loop 运行时挂载,提供容器内调用 Claude 的循环驱动脚本。
|
|
229
|
+
|
|
230
|
+
## 定义自己的 Task
|
|
231
|
+
|
|
232
|
+
每个任务是 `local/tasks/` 下的一个目录,包含三个部分:
|
|
233
|
+
|
|
234
|
+
```text
|
|
235
|
+
local/tasks/my-task/
|
|
236
|
+
├── task.toml # 任务配置
|
|
237
|
+
├── instruction.md # 给 agent 的指令(支持 {run_id} 等模板变量)
|
|
238
|
+
├── environment/
|
|
239
|
+
│ └── Dockerfile # 验证环境(提供运行时和测试依赖)
|
|
240
|
+
└── validation/
|
|
241
|
+
└── test_my_task.py # 验证脚本(在 Docker 内运行)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 1. 编写 `task.toml`
|
|
245
|
+
|
|
246
|
+
```toml
|
|
247
|
+
[metadata]
|
|
248
|
+
name = "my-task"
|
|
249
|
+
description = "任务描述"
|
|
250
|
+
difficulty = "medium" # easy / medium / hard
|
|
251
|
+
category = "generic" # generic 或 comet
|
|
252
|
+
default_treatments = ["CONTROL"]
|
|
253
|
+
|
|
254
|
+
[environment]
|
|
255
|
+
description = "Docker 环境描述"
|
|
256
|
+
dockerfile = "environment/Dockerfile"
|
|
257
|
+
timeout_sec = 600 # Docker 执行超时(秒)
|
|
258
|
+
|
|
259
|
+
[validation]
|
|
260
|
+
test_scripts = ["test_my_task.py"] # Docker 内运行的验证脚本
|
|
261
|
+
target_artifacts = ["result.md"] # 预期产物(存在性检查)
|
|
262
|
+
timeout = 120 # 验证脚本超时(秒)
|
|
263
|
+
|
|
264
|
+
[evaluation]
|
|
265
|
+
profile = "generic" # 评估 profile
|
|
266
|
+
expected_artifacts = ["result.md"] # rubric 检查的产物
|
|
267
|
+
required_skills = ["my-skill"] # 必须调用的 Skill
|
|
268
|
+
require_skill_invocation = true # 未调用时产生硬失败
|
|
269
|
+
|
|
270
|
+
# 自定义 rubric 标准(传给 LLM judge,可选)
|
|
271
|
+
rubric_criteria = [
|
|
272
|
+
"输出包含错误处理",
|
|
273
|
+
"代码遵循项目命名规范",
|
|
274
|
+
]
|
|
275
|
+
|
|
276
|
+
[interaction]
|
|
277
|
+
mode = "none" # none(单轮)或 auto_user(多轮模拟)
|
|
278
|
+
max_turns = 12 # 最大轮次
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### 2. 编写 `instruction.md`
|
|
282
|
+
|
|
283
|
+
这是给 agent 的任务指令,支持 `{run_id}` 模板变量:
|
|
284
|
+
|
|
285
|
+
```markdown
|
|
286
|
+
在当前工作区创建一个文件 `result.md`。
|
|
287
|
+
|
|
288
|
+
要求:
|
|
289
|
+
|
|
290
|
+
- 包含标题 `# My Task Result`
|
|
291
|
+
- 描述你的实现思路
|
|
292
|
+
- 包含至少三个要点
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### 3. 编写验证脚本
|
|
296
|
+
|
|
297
|
+
验证脚本在 Docker 内运行,结果写入 `_test_results.json`:
|
|
298
|
+
|
|
299
|
+
```python
|
|
300
|
+
from pathlib import Path
|
|
301
|
+
from scaffold.python.validation.core import write_test_results
|
|
302
|
+
|
|
303
|
+
def main():
|
|
304
|
+
passed = []
|
|
305
|
+
failed = []
|
|
306
|
+
|
|
307
|
+
# 检查产物是否存在
|
|
308
|
+
result = Path("result.md")
|
|
309
|
+
if not result.exists():
|
|
310
|
+
write_test_results({"passed": [], "failed": ["result.md missing"]})
|
|
311
|
+
return
|
|
312
|
+
|
|
313
|
+
text = result.read_text(encoding="utf-8")
|
|
314
|
+
|
|
315
|
+
# 检查内容
|
|
316
|
+
if "# My Task Result" in text:
|
|
317
|
+
passed.append("heading present")
|
|
318
|
+
else:
|
|
319
|
+
failed.append("heading missing")
|
|
320
|
+
|
|
321
|
+
write_test_results({"passed": passed, "failed": failed})
|
|
322
|
+
|
|
323
|
+
if __name__ == "__main__":
|
|
324
|
+
main()
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### 4. 注册任务
|
|
328
|
+
|
|
329
|
+
在 `local/tasks/index.yaml` 中添加:
|
|
330
|
+
|
|
331
|
+
```yaml
|
|
332
|
+
tasks:
|
|
333
|
+
- name: my-task
|
|
334
|
+
category: generic
|
|
335
|
+
default_treatments:
|
|
336
|
+
- CONTROL
|
|
337
|
+
description: 我的自定义任务
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
## Rubric 评估体系
|
|
341
|
+
|
|
342
|
+
### 评估 Profile
|
|
343
|
+
|
|
344
|
+
框架通过 profile 决定使用哪套 rubric:
|
|
345
|
+
|
|
346
|
+
| Profile | 用途 | 维度数 | LLM Judge |
|
|
347
|
+
| ----------------- | ----------------- | ------ | ------------------------- |
|
|
348
|
+
| `generic` | 任意 Skill | 7 | ✅(`BENCH_LLM_JUDGE=1`) |
|
|
349
|
+
| `comet-workflow` | Comet 工作流 | 9 | ✅ |
|
|
350
|
+
| `authoring-skill` | /comet-any 生成包 | 11 | 继承 generic |
|
|
351
|
+
|
|
352
|
+
Comet 类任务(`category = "comet"` 或名称以 `comet-` 开头)自动推断为 `comet-workflow`。
|
|
353
|
+
|
|
354
|
+
### 通用 Rubric(7 维度)
|
|
355
|
+
|
|
356
|
+
用于评估任意 Skill 的执行质量:
|
|
357
|
+
|
|
358
|
+
| 维度 | 权重 | 说明 |
|
|
359
|
+
| ------------------------ | ---- | ------------------------------------------------------ |
|
|
360
|
+
| `completion` | 2.0 | 验证脚本通过率 |
|
|
361
|
+
| `skill_invocation` | 1.0 | 必须调用的 Skill 是否被调用(未配置时为 N/A) |
|
|
362
|
+
| `artifact_presence` | 1.0 | 预期产物是否存在(支持 glob,未配置时为 N/A) |
|
|
363
|
+
| `instruction_following` | 1.0 | 是否有约束违反 |
|
|
364
|
+
| `interaction_compliance` | 0.8 | 多轮交互是否在轮次限制内 |
|
|
365
|
+
| `efficiency` | 0.7 | 轮次 ≤ 80、工具调用 ≤ 150、时长 ≤ 600s |
|
|
366
|
+
| `safety_boundary` | 1.2 | 无危险命令(`rm -rf`、`git reset --hard`、`curl\|sh`) |
|
|
367
|
+
|
|
368
|
+
**N/A 维度处理**:当 `required_skills` 或 `expected_artifacts` 未配置时,对应维度标记为 N/A,不参与加权计算,避免虚高的中间分。
|
|
369
|
+
|
|
370
|
+
### LLM-as-judge(可选)
|
|
371
|
+
|
|
372
|
+
设置 `BENCH_LLM_JUDGE=1` 启用 LLM 评审。Judge 读取 agent 的 workspace 产物进行定性评分,但必须使用独立裁判配置:至少设置 `BENCH_JUDGE_MODEL`,如需走不同代理或账号,再设置 `BENCH_JUDGE_BASE_URL`、`BENCH_JUDGE_AUTH_TOKEN` 或 `BENCH_JUDGE_API_KEY`。
|
|
373
|
+
|
|
374
|
+
当配置了 `BENCH_JUDGE_BASE_URL` 和 `BENCH_JUDGE_AUTH_TOKEN` / `BENCH_JUDGE_API_KEY` 时,judge 会优先直接调用 Anthropic Messages HTTP(`/v1/messages`)。没有专用 judge endpoint 时,才回退到宿主机 `claude` CLI,并在子进程里清除继承来的主 `ANTHROPIC_*` provider 设置,再把 `BENCH_JUDGE_*` 映射为自己的 `ANTHROPIC_*` 环境变量。这样可以避免同一个模型既当选手又当裁判,也避免严格代理不兼容 Claude CLI 的额外请求参数。若启用了 `BENCH_LLM_JUDGE=1` 但未设置 `BENCH_JUDGE_MODEL`,报告会输出 `[RUBRIC-JUDGE] status: skipped - BENCH_JUDGE_MODEL is required when BENCH_LLM_JUDGE=1`,不会调用 judge。
|
|
375
|
+
|
|
376
|
+
**通用 judge 的三个标准维度**:
|
|
377
|
+
|
|
378
|
+
| 维度 | 评分标准 |
|
|
379
|
+
| ----------------------- | ------------------------------------------------------- |
|
|
380
|
+
| `task_completion` | 1.0 = 全部完成;0.5 = 部分完成;0.0 = 未完成 |
|
|
381
|
+
| `output_quality` | 1.0 = 结构化、完整、非平凡;0.5 = 浅层;0.0 = 空或 stub |
|
|
382
|
+
| `instruction_adherence` | 1.0 = 完全遵循;0.5 = 轻微偏差;0.0 = 严重违反 |
|
|
383
|
+
|
|
384
|
+
**自定义 rubric 标准**:在 `task.toml` 的 `[evaluation]` 中定义 `rubric_criteria`,这些标准会作为额外维度传给 LLM judge,输出为 `custom_0`、`custom_1` 等。
|
|
385
|
+
|
|
386
|
+
```toml
|
|
387
|
+
[evaluation]
|
|
388
|
+
rubric_criteria = [
|
|
389
|
+
"函数处理了边界情况(空输入、单元素)",
|
|
390
|
+
"错误信息用户友好且可操作",
|
|
391
|
+
]
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Comet Rubric(9 维度)
|
|
395
|
+
|
|
396
|
+
Comet 工作流专用,输出 9 个维度分数和一个 `weighted_score`。每个维度由若干二值检查组成,维度分数为 `通过检查数 / 总检查数`;最终 `weighted_score` 按下表权重加权平均。
|
|
397
|
+
|
|
398
|
+
| 维度 | 权重 | 评分信号 |
|
|
399
|
+
| --------------------------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
400
|
+
| `completion` | 2.0 | 当前 task 的基础验证脚本通过率,例如功能修复、测试文件、工作流产物等 task-specific checks |
|
|
401
|
+
| `main_flow` | 1.5 | workflow 阶段证据是否齐全;`full` 检查 open → design → build → verify → archive,`hotfix` / `tweak` 检查 open → build → verify → archive |
|
|
402
|
+
| `gate_guard` | 1.5 | 是否使用 Comet 阶段守卫和状态推进能力,包括 `comet-guard`、状态 transition、`--apply` |
|
|
403
|
+
| `artifact_quality` | 1.2 | OpenSpec / Superpowers / 测试产物是否有实质内容;`full` 要求 proposal、深度 design、足够 tasks 和测试断言,`hotfix` / `tweak` 使用预设路径的轻量产物口径 |
|
|
404
|
+
| `skill_invocation` | 1.0 | 是否真实调用主 `comet`、嵌套 Comet 阶段 Skill、OpenSpec 依赖 Skill、Superpowers 依赖 Skill,并保持入口先于子 Skill |
|
|
405
|
+
| `spec_drift` | 1.0 | 如果写入 delta spec,是否在归档前通过 OpenSpec 同步/归档语义合并;未涉及 delta spec 时记为 N/A 式满分 |
|
|
406
|
+
| `decision_point_compliance` | 1.0 | 到达阻塞决策点时是否先询问用户;`full` 会检查 build/verify 等状态决策,`hotfix` / `tweak` 只检查预设路径中的升级、验证失败、归档重开等阻塞决策 |
|
|
407
|
+
| `recovery_resilience` | 1.0 | 是否保留可恢复状态,例如 `.comet/checkpoint.json`、`run-state.json`、`state-events.jsonl`、`trajectory.jsonl`、handoff/context、干净 pending 状态 |
|
|
408
|
+
| `efficiency` | 0.8 | 运行成本是否在阈值内:turns ≤ 80、工具调用 ≤ 150、时长 ≤ 600s |
|
|
409
|
+
|
|
410
|
+
额外规则:
|
|
411
|
+
|
|
412
|
+
- `skills_invoked` 只来自 Claude Code 事件中的真实 Skill 工具调用和 Skill 文件加载,不根据产物反推。
|
|
413
|
+
- `opsx:*` 旧 OpenSpec Skill 名会归一化为 `openspec-*`,避免同一调用在报告中重复出现。
|
|
414
|
+
- 如果 `comet-workflow` 未调用主 `comet`,会产生硬失败;如果调用了主 `comet` 但没有调用嵌套 Comet / OpenSpec / Superpowers 依赖 Skill,也会产生 workflow contract failure。
|
|
415
|
+
- `weighted_score` 只聚合 9 个 Comet rubric 维度;LLM judge 启用后会额外输出 `[RUBRIC-JUDGE]` 信息,不替代规则分。
|
|
416
|
+
|
|
417
|
+
## Treatment 配置
|
|
418
|
+
|
|
419
|
+
Treatment 定义注入哪些 Skill。位于 `local/treatments/`:
|
|
420
|
+
|
|
421
|
+
```yaml
|
|
422
|
+
# local/treatments/common/control.yaml
|
|
423
|
+
CONTROL:
|
|
424
|
+
description: '无 Skill 基线'
|
|
425
|
+
skills: []
|
|
426
|
+
|
|
427
|
+
# local/treatments/comet/comet_full_040_beta.yaml
|
|
428
|
+
COMET_FULL_040_BETA:
|
|
429
|
+
description: '完整 Comet 工作流'
|
|
430
|
+
skills:
|
|
431
|
+
- name: comet
|
|
432
|
+
skill: 040-beta/comet
|
|
433
|
+
variant: all
|
|
434
|
+
base: benchmarks
|
|
435
|
+
- name: comet-open
|
|
436
|
+
skill: 040-beta/comet-open
|
|
437
|
+
variant: all
|
|
438
|
+
base: benchmarks
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## 运行测试
|
|
442
|
+
|
|
443
|
+
```bash
|
|
444
|
+
# 仅运行 scaffold 单元测试(快速,不需要 Docker)
|
|
445
|
+
cd eval
|
|
446
|
+
uv run pytest local/tests/scaffold/ -v
|
|
447
|
+
|
|
448
|
+
# 运行完整任务测试(需要 Docker + Claude CLI)
|
|
449
|
+
uv run pytest local/tests/tasks/test_tasks.py -v
|
|
450
|
+
|
|
451
|
+
# 重复运行 N 次(统计通过率分布)
|
|
452
|
+
uv run pytest local/tests/tasks/test_tasks.py --count=3 -v
|
|
453
|
+
|
|
454
|
+
# 并行运行
|
|
455
|
+
uv run pytest local/tests/tasks/test_tasks.py -n 4 -v
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
## 核心指标
|
|
459
|
+
|
|
460
|
+
### pass@k — 能力上限
|
|
461
|
+
|
|
462
|
+
> 给定 k 次独立尝试,**至少有一次成功**的概率。
|
|
463
|
+
|
|
464
|
+
使用 HumanEval 的无偏估计器:
|
|
465
|
+
|
|
466
|
+
```
|
|
467
|
+
pass@k = 1 - C(n-c, k) / C(n, k)
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
其中 `n` = 总运行次数,`c` = 成功次数。当 `n - c < k` 时(不可能连续抽到 k 次失败),`pass@k = 1.0`。
|
|
471
|
+
|
|
472
|
+
**解读**:pass@k 衡量"agent 能不能做到"。pass@1 就是单次通过率;pass@5 接近 1.0 意味着多次尝试中几乎总能找到一个成功的。
|
|
473
|
+
|
|
474
|
+
### pass^k — 可靠性下限
|
|
475
|
+
|
|
476
|
+
> 给定 k 次独立尝试,**全部成功**的概率。
|
|
477
|
+
|
|
478
|
+
```
|
|
479
|
+
pass^k = 1.0 (if c == n, 即所有运行都通过)
|
|
480
|
+
pass^k = 0.0 (otherwise, 观测样本下限)
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
**解读**:pass^k 衡量"agent 每次都能做到吗"。只有当所有运行都通过时才为 1.0,否则为 0.0。这是可靠性的一致性下界。
|
|
484
|
+
|
|
485
|
+
### pass@k − pass^k — 不稳定性间隙
|
|
486
|
+
|
|
487
|
+
两者的差值量化了**不稳定性**:高 pass@k + 低 pass^k = "能做到,但不能指望每次都做到"。对于用户反复运行的工作流 Skill,这个间隙是关键质量信号。
|
|
488
|
+
|
|
489
|
+
### 示例
|
|
490
|
+
|
|
491
|
+
| Treatment | pass@1 | pass@5 | pass^1 | pass^5 | pass/fail |
|
|
492
|
+
| ------------------- | ------ | ------ | ------ | ------ | --------- |
|
|
493
|
+
| CONTROL | 0.40 | 0.90 | 0 | 0 | 2/5 |
|
|
494
|
+
| COMET_FULL_040_BETA | 0.80 | 1.00 | 0 | 0 | 4/5 |
|
|
495
|
+
|
|
496
|
+
- CONTROL:40% 单次通过率,5 次尝试有 90% 概率成功至少一次,但无法保证每次都成功
|
|
497
|
+
- COMET_FULL_040_BETA:80% 单次通过率,5 次尝试几乎必然成功,但仍有波动
|
|
498
|
+
|
|
499
|
+
### 运行多次获取 pass@k
|
|
500
|
+
|
|
501
|
+
```bash
|
|
502
|
+
# 重复运行 5 次以获得 pass@5 / pass^5
|
|
503
|
+
uv run pytest local/tests/tasks/test_tasks.py --count=5 -v
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
报告自动生成在 `comparison_report.md` 中,包含 pass@k / pass^k 表格。
|
|
507
|
+
|
|
508
|
+
## 查看结果
|
|
509
|
+
|
|
510
|
+
评估结果写入 `local/logs/experiments/`,包含:
|
|
511
|
+
|
|
512
|
+
- `summary.md` — 汇总表(各 treatment 的维度分数)
|
|
513
|
+
- `comparison_report.md` — 基线对比报告(含 pass@k / pass^k 指标)
|
|
514
|
+
- 每次运行的详细日志和产物
|
|
515
|
+
|
|
516
|
+
默认输出 Markdown,可通过 `--report-config` 或 `COMET_EVAL_REPORT_CONFIG` 启用 HTML:
|
|
517
|
+
|
|
518
|
+
```json
|
|
519
|
+
{
|
|
520
|
+
"report_outputs": {
|
|
521
|
+
"markdown": true,
|
|
522
|
+
"html": true
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
## CLI 参数速查
|
|
528
|
+
|
|
529
|
+
| 参数 | 说明 |
|
|
530
|
+
| ------------------------ | ------------------------------ |
|
|
531
|
+
| `--task=<name>` | 指定任务 |
|
|
532
|
+
| `--treatment=<name>` | 指定 treatment(逗号分隔多个) |
|
|
533
|
+
| `--profile=<name>` | 覆盖评估 profile |
|
|
534
|
+
| `--skill-path=<path>` | 注入本地 Skill 路径 |
|
|
535
|
+
| `--skill-name=<name>` | 注入的 Skill 名称 |
|
|
536
|
+
| `--count=<n>` | 重复运行次数 |
|
|
537
|
+
| `--eval-manifest=<path>` | 使用生成的 eval.yaml |
|
|
538
|
+
| `--report-config=<path>` | 报告输出配置 |
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
ANTHROPIC_API_KEY=
|
|
2
|
+
LANGSMITH_API_KEY=
|
|
3
|
+
LANGSMITH_TRACING=true
|
|
4
|
+
LANGSMITH_ENDPOINT=https://api.smith.langchain.com
|
|
5
|
+
LANGSMITH_PROJECT=comet-skill-eval
|
|
6
|
+
# The Claude Code plugin variables (TRACE_TO_LANGSMITH and CC_LANGSMITH_*) are
|
|
7
|
+
# derived from these LANGSMITH_* settings by the eval suite.
|
|
8
|
+
|
|
9
|
+
# Optional: name the experiment (project) per treatment for CONTROL vs skill comparison.
|
|
10
|
+
# LANGSMITH_EXPERIMENT=COMET_FULL_040_BETA
|
|
11
|
+
|
|
12
|
+
# Optional trajectory tracing via the official langsmith-tracing plugin.
|
|
13
|
+
# When LANGSMITH_TRACING=true, the suite auto-builds the plugin into
|
|
14
|
+
# eval/.cache/langsmith-cc-plugin via node:20; unset disables tracing only.
|
|
15
|
+
# CC_LANGSMITH_PLUGIN_DIR=/abs/path/to/comet/eval/.cache/langsmith-cc-plugin
|
|
16
|
+
# CC_LANGSMITH_PLUGIN_AUTO_BUILD=true
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# LangSmith 评估套件
|
|
2
|
+
|
|
3
|
+
这个套件复用 local 的任务集,并把每次 `(task, treatment)` 运行同步到 LangSmith:
|
|
4
|
+
|
|
5
|
+
- 每个任务是一个 dataset example(`inputs` = 任务/treatment,`reference_outputs` = 预期产物 / 必需 Skill / rubric 判据)。
|
|
6
|
+
- 每个 treatment 是一个 experiment;`CONTROL` 与注入 Skill 的 treatment 可在实验对比页并排看。
|
|
7
|
+
- 每个 run 记录 `outputs`(轮次、工具调用、耗时、token、成本、调用的 Skill)和 feedback(每个 rubric 维度分 + `checks_pass_rate`)。
|
|
8
|
+
- 可选:Claude Code 的完整轨迹(trajectory)通过官方 `langsmith-tracing` 插件嵌套在同一个 run 下。
|
|
9
|
+
|
|
10
|
+
默认复用:
|
|
11
|
+
|
|
12
|
+
- `../local/tasks`
|
|
13
|
+
- `../local/treatments`
|
|
14
|
+
- `../local/skills`
|
|
15
|
+
|
|
16
|
+
报告和产物写入:
|
|
17
|
+
|
|
18
|
+
```text
|
|
19
|
+
logs/experiments/
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 安装
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
cd eval
|
|
26
|
+
uv sync --extra langsmith
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 运行
|
|
30
|
+
|
|
31
|
+
结果上报(rubric + treatment 对比)只需要 `LANGSMITH_API_KEY`。推荐在 `eval/.env` 或 `eval/langsmith/.env` 中设置:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
LANGSMITH_API_KEY=lsv2_pt_...
|
|
35
|
+
LANGSMITH_PROJECT=comet-skill-eval
|
|
36
|
+
LANGSMITH_TRACING=true
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Comet 会从这组 `LANGSMITH_*` 配置自动派生 Claude Code 官方插件需要的 `TRACE_TO_LANGSMITH`、`CC_LANGSMITH_API_KEY` 和 `CC_LANGSMITH_PROJECT`。只有需要覆盖插件行为时,才需要显式设置这些 `CC_*` / `TRACE_TO_LANGSMITH` 变量。
|
|
40
|
+
|
|
41
|
+
从 `eval/` 目录运行:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 一个 treatment = 一个 experiment;用 LANGSMITH_EXPERIMENT 命名便于对比
|
|
45
|
+
LANGSMITH_EXPERIMENT=COMET_FULL_040_BETA \
|
|
46
|
+
uv run pytest langsmith/tests/tasks/test_tasks.py \
|
|
47
|
+
--task=comet-fix-median --treatment=COMET_FULL_040_BETA -v
|
|
48
|
+
|
|
49
|
+
# 再跑 CONTROL 作为对照
|
|
50
|
+
LANGSMITH_EXPERIMENT=CONTROL \
|
|
51
|
+
uv run pytest langsmith/tests/tasks/test_tasks.py \
|
|
52
|
+
--task=comet-fix-median --treatment=CONTROL -v
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
生成 Skill manifest 示例:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
uv run pytest langsmith/tests/tasks/test_tasks.py \
|
|
59
|
+
--eval-manifest=/path/to/my-skill/comet/eval.yaml -v
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 轨迹追踪(可选,官方 Claude Code 插件)
|
|
63
|
+
|
|
64
|
+
轨迹追踪用官方 [`langsmith-tracing`](https://github.com/langchain-ai/langsmith-claude-code-plugins) 插件,容器内以 headless(`claude -p`)方式启用。默认情况下,LangSmith suite 会在首次运行时用 `node:20` 一次性构建插件到 `eval/.cache/langsmith-cc-plugin`,后续运行复用这个缓存目录并挂载到任务容器的 `/opt/langsmith-cc-plugin`。
|
|
65
|
+
|
|
66
|
+
因为 eval 在 Linux 容器里运行,不要在 Windows 宿主机直接 `pnpm build` 后挂载,避免跨平台 `node_modules` 失效。你通常只需要设置:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
LANGSMITH_TRACING=true
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
如果要提前手动构建缓存,可以从 `eval/` 目录运行:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
docker run --rm -v "$PWD/.cache:/out" node:20 sh -c \
|
|
76
|
+
"cd /tmp && git clone https://github.com/langchain-ai/langsmith-claude-code-plugins && cd langsmith-claude-code-plugins && corepack enable && pnpm install && pnpm build && cp -r . /out/langsmith-cc-plugin"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
PowerShell 中可用 `${PWD}`:
|
|
80
|
+
|
|
81
|
+
```powershell
|
|
82
|
+
docker run --rm -v "${PWD}\.cache:/out" node:20 sh -c "cd /tmp && git clone https://github.com/langchain-ai/langsmith-claude-code-plugins && cd langsmith-claude-code-plugins && corepack enable && pnpm install && pnpm build && cp -r . /out/langsmith-cc-plugin"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
如果要覆盖默认缓存目录,可以把构建好的插件目录显式指给评估(宿主机路径):
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
export CC_LANGSMITH_PLUGIN_DIR=/abs/path/to/comet/eval/.cache/langsmith-cc-plugin
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- 设置后,插件目录会以 `/opt/langsmith-cc-plugin` 只读挂载进容器,`claude` 加 `--plugin-dir` 启用;轨迹通过自动派生的 Claude Code 插件配置和 `CC_LANGSMITH_PARENT_DOTTED_ORDER` 嵌套在对应 pytest run 下。
|
|
92
|
+
- 未设置时,轨迹追踪自动跳过(不报错),rubric 与 treatment 对比照常上报。
|
|
93
|
+
- 如果不希望 suite 自动构建插件,设置 `CC_LANGSMITH_PLUGIN_AUTO_BUILD=false`。
|