@hunter-harness/workflow-harness 0.2.8 → 0.2.10
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/harness/bundles/general/claude-code/.harness-build.json +1 -1
- package/harness/bundles/general/claude-code/contracts/workflow-policy.json +3 -3
- package/harness/bundles/general/claude-code/harness-archive/SKILL.md +3 -3
- package/harness/bundles/general/claude-code/harness-archive/reference.md +30 -12
- package/harness/bundles/general/claude-code/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/general/claude-code/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/checklist.md +6 -0
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +3 -3
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-run/checklist.md +5 -0
- package/harness/bundles/general/claude-code/harness-run/reference.md +33 -1
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +15 -10
- package/harness/bundles/general/claude-code/harness-submit/checklist.md +40 -76
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +17 -2
- package/harness/bundles/general/claude-code/harness-sync/reference.md +2 -2
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-test/checklist.md +9 -0
- package/harness/bundles/general/claude-code/harness-test/pitfalls-java.md +14 -0
- package/harness/bundles/general/claude-code/harness-test/reference.md +38 -0
- package/harness/bundles/general/claude-code/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/general/claude-code/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/general/claude-code/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/general/claude-code/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/general/claude-code/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/general/claude-code/scripts/harness_archive.py +1209 -170
- package/harness/bundles/general/claude-code/scripts/harness_change.py +18 -0
- package/harness/bundles/general/claude-code/scripts/harness_deploy.py +1 -44
- package/harness/bundles/general/claude-code/scripts/harness_events.py +174 -25
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +203 -29
- package/harness/bundles/general/claude-code/scripts/harness_integration.py +878 -0
- package/harness/bundles/general/claude-code/scripts/harness_ledger.py +457 -10
- package/harness/bundles/general/claude-code/scripts/harness_paths.py +315 -0
- package/harness/bundles/general/claude-code/scripts/harness_profile.py +45 -0
- package/harness/bundles/general/claude-code/scripts/harness_review.py +326 -0
- package/harness/bundles/general/claude-code/scripts/harness_sync.py +407 -0
- package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +3 -3
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +3 -3
- package/harness/bundles/general/codebuddy/harness-archive/reference.md +30 -12
- package/harness/bundles/general/codebuddy/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/general/codebuddy/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/checklist.md +6 -0
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +3 -3
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-run/checklist.md +5 -0
- package/harness/bundles/general/codebuddy/harness-run/reference.md +33 -1
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +15 -10
- package/harness/bundles/general/codebuddy/harness-submit/checklist.md +40 -76
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +17 -2
- package/harness/bundles/general/codebuddy/harness-sync/reference.md +2 -2
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-test/checklist.md +9 -0
- package/harness/bundles/general/codebuddy/harness-test/pitfalls-java.md +14 -0
- package/harness/bundles/general/codebuddy/harness-test/reference.md +38 -0
- package/harness/bundles/general/codebuddy/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/general/codebuddy/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/general/codebuddy/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/general/codebuddy/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/general/codebuddy/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/general/codebuddy/scripts/harness_archive.py +1209 -170
- package/harness/bundles/general/codebuddy/scripts/harness_change.py +18 -0
- package/harness/bundles/general/codebuddy/scripts/harness_deploy.py +1 -44
- package/harness/bundles/general/codebuddy/scripts/harness_events.py +174 -25
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +203 -29
- package/harness/bundles/general/codebuddy/scripts/harness_integration.py +878 -0
- package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +457 -10
- package/harness/bundles/general/codebuddy/scripts/harness_paths.py +315 -0
- package/harness/bundles/general/codebuddy/scripts/harness_profile.py +45 -0
- package/harness/bundles/general/codebuddy/scripts/harness_review.py +326 -0
- package/harness/bundles/general/codebuddy/scripts/harness_sync.py +407 -0
- package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/contracts/workflow-policy.json +3 -3
- package/harness/bundles/general/codex/harness-archive/SKILL.md +3 -3
- package/harness/bundles/general/codex/harness-archive/reference.md +30 -12
- package/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/general/codex/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/checklist.md +6 -0
- package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-run/checklist.md +5 -0
- package/harness/bundles/general/codex/harness-run/reference.md +33 -1
- package/harness/bundles/general/codex/harness-submit/SKILL.md +15 -10
- package/harness/bundles/general/codex/harness-submit/checklist.md +40 -76
- package/harness/bundles/general/codex/harness-sync/SKILL.md +17 -2
- package/harness/bundles/general/codex/harness-sync/reference.md +2 -2
- package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-test/checklist.md +9 -0
- package/harness/bundles/general/codex/harness-test/pitfalls-java.md +14 -0
- package/harness/bundles/general/codex/harness-test/reference.md +38 -0
- package/harness/bundles/general/codex/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/general/codex/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/general/codex/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/general/codex/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/general/codex/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/general/codex/scripts/harness_archive.py +1209 -170
- package/harness/bundles/general/codex/scripts/harness_change.py +18 -0
- package/harness/bundles/general/codex/scripts/harness_deploy.py +1 -44
- package/harness/bundles/general/codex/scripts/harness_events.py +174 -25
- package/harness/bundles/general/codex/scripts/harness_gate.py +203 -29
- package/harness/bundles/general/codex/scripts/harness_integration.py +878 -0
- package/harness/bundles/general/codex/scripts/harness_ledger.py +457 -10
- package/harness/bundles/general/codex/scripts/harness_paths.py +315 -0
- package/harness/bundles/general/codex/scripts/harness_profile.py +45 -0
- package/harness/bundles/general/codex/scripts/harness_review.py +326 -0
- package/harness/bundles/general/codex/scripts/harness_sync.py +407 -0
- package/harness/bundles/general/codex/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/contracts/workflow-policy.json +3 -3
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +3 -3
- package/harness/bundles/general/cursor/harness-archive/reference.md +30 -12
- package/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/general/cursor/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/checklist.md +6 -0
- package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-run/checklist.md +5 -0
- package/harness/bundles/general/cursor/harness-run/reference.md +33 -1
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +15 -10
- package/harness/bundles/general/cursor/harness-submit/checklist.md +40 -76
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +17 -2
- package/harness/bundles/general/cursor/harness-sync/reference.md +2 -2
- package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-test/checklist.md +9 -0
- package/harness/bundles/general/cursor/harness-test/pitfalls-java.md +14 -0
- package/harness/bundles/general/cursor/harness-test/reference.md +38 -0
- package/harness/bundles/general/cursor/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/general/cursor/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/general/cursor/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/general/cursor/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/general/cursor/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/general/cursor/scripts/harness_archive.py +1209 -170
- package/harness/bundles/general/cursor/scripts/harness_change.py +18 -0
- package/harness/bundles/general/cursor/scripts/harness_deploy.py +1 -44
- package/harness/bundles/general/cursor/scripts/harness_events.py +174 -25
- package/harness/bundles/general/cursor/scripts/harness_gate.py +203 -29
- package/harness/bundles/general/cursor/scripts/harness_integration.py +878 -0
- package/harness/bundles/general/cursor/scripts/harness_ledger.py +457 -10
- package/harness/bundles/general/cursor/scripts/harness_paths.py +315 -0
- package/harness/bundles/general/cursor/scripts/harness_profile.py +45 -0
- package/harness/bundles/general/cursor/scripts/harness_review.py +326 -0
- package/harness/bundles/general/cursor/scripts/harness_sync.py +407 -0
- package/harness/bundles/general/cursor/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/contracts/workflow-policy.json +3 -3
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +3 -3
- package/harness/bundles/java/claude-code/harness-archive/reference.md +30 -12
- package/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/java/claude-code/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-plan/checklist.md +6 -0
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +3 -3
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +15 -10
- package/harness/bundles/java/claude-code/harness-submit/checklist.md +40 -76
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +17 -2
- package/harness/bundles/java/claude-code/harness-sync/reference.md +2 -2
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/java/claude-code/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/java/claude-code/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/java/claude-code/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/java/claude-code/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/java/claude-code/scripts/harness_archive.py +1209 -170
- package/harness/bundles/java/claude-code/scripts/harness_change.py +18 -0
- package/harness/bundles/java/claude-code/scripts/harness_deploy.py +1 -44
- package/harness/bundles/java/claude-code/scripts/harness_events.py +174 -25
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +203 -29
- package/harness/bundles/java/claude-code/scripts/harness_integration.py +878 -0
- package/harness/bundles/java/claude-code/scripts/harness_ledger.py +457 -10
- package/harness/bundles/java/claude-code/scripts/harness_paths.py +315 -0
- package/harness/bundles/java/claude-code/scripts/harness_profile.py +45 -0
- package/harness/bundles/java/claude-code/scripts/harness_review.py +326 -0
- package/harness/bundles/java/claude-code/scripts/harness_sync.py +407 -0
- package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +3 -3
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +3 -3
- package/harness/bundles/java/codebuddy/harness-archive/reference.md +30 -12
- package/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/java/codebuddy/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-plan/checklist.md +6 -0
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +3 -3
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +15 -10
- package/harness/bundles/java/codebuddy/harness-submit/checklist.md +40 -76
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +17 -2
- package/harness/bundles/java/codebuddy/harness-sync/reference.md +2 -2
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/java/codebuddy/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/java/codebuddy/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/java/codebuddy/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/java/codebuddy/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/java/codebuddy/scripts/harness_archive.py +1209 -170
- package/harness/bundles/java/codebuddy/scripts/harness_change.py +18 -0
- package/harness/bundles/java/codebuddy/scripts/harness_deploy.py +1 -44
- package/harness/bundles/java/codebuddy/scripts/harness_events.py +174 -25
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +203 -29
- package/harness/bundles/java/codebuddy/scripts/harness_integration.py +878 -0
- package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +457 -10
- package/harness/bundles/java/codebuddy/scripts/harness_paths.py +315 -0
- package/harness/bundles/java/codebuddy/scripts/harness_profile.py +45 -0
- package/harness/bundles/java/codebuddy/scripts/harness_review.py +326 -0
- package/harness/bundles/java/codebuddy/scripts/harness_sync.py +407 -0
- package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/contracts/workflow-policy.json +3 -3
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-archive/SKILL.md +3 -3
- package/harness/bundles/java/codex/harness-archive/reference.md +30 -12
- package/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/java/codex/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-plan/checklist.md +6 -0
- package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-submit/SKILL.md +15 -10
- package/harness/bundles/java/codex/harness-submit/checklist.md +40 -76
- package/harness/bundles/java/codex/harness-sync/SKILL.md +17 -2
- package/harness/bundles/java/codex/harness-sync/reference.md +2 -2
- package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/codex/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/java/codex/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/java/codex/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/java/codex/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/java/codex/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/java/codex/scripts/harness_archive.py +1209 -170
- package/harness/bundles/java/codex/scripts/harness_change.py +18 -0
- package/harness/bundles/java/codex/scripts/harness_deploy.py +1 -44
- package/harness/bundles/java/codex/scripts/harness_events.py +174 -25
- package/harness/bundles/java/codex/scripts/harness_gate.py +203 -29
- package/harness/bundles/java/codex/scripts/harness_integration.py +878 -0
- package/harness/bundles/java/codex/scripts/harness_ledger.py +457 -10
- package/harness/bundles/java/codex/scripts/harness_paths.py +315 -0
- package/harness/bundles/java/codex/scripts/harness_profile.py +45 -0
- package/harness/bundles/java/codex/scripts/harness_review.py +326 -0
- package/harness/bundles/java/codex/scripts/harness_sync.py +407 -0
- package/harness/bundles/java/codex/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/contracts/workflow-policy.json +3 -3
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +3 -3
- package/harness/bundles/java/cursor/harness-archive/reference.md +30 -12
- package/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/java/cursor/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-plan/checklist.md +6 -0
- package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +15 -10
- package/harness/bundles/java/cursor/harness-submit/checklist.md +40 -76
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +17 -2
- package/harness/bundles/java/cursor/harness-sync/reference.md +2 -2
- package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/cursor/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/java/cursor/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/java/cursor/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/java/cursor/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/java/cursor/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/java/cursor/scripts/harness_archive.py +1209 -170
- package/harness/bundles/java/cursor/scripts/harness_change.py +18 -0
- package/harness/bundles/java/cursor/scripts/harness_deploy.py +1 -44
- package/harness/bundles/java/cursor/scripts/harness_events.py +174 -25
- package/harness/bundles/java/cursor/scripts/harness_gate.py +203 -29
- package/harness/bundles/java/cursor/scripts/harness_integration.py +878 -0
- package/harness/bundles/java/cursor/scripts/harness_ledger.py +457 -10
- package/harness/bundles/java/cursor/scripts/harness_paths.py +315 -0
- package/harness/bundles/java/cursor/scripts/harness_profile.py +45 -0
- package/harness/bundles/java/cursor/scripts/harness_review.py +326 -0
- package/harness/bundles/java/cursor/scripts/harness_sync.py +407 -0
- package/harness/bundles/java/cursor/scripts/harness_test_guard.py +244 -49
- package/harness/manifests/general/claude-code.json +58 -38
- package/harness/manifests/general/codebuddy.json +58 -38
- package/harness/manifests/general/codex.json +58 -38
- package/harness/manifests/general/cursor.json +58 -38
- package/harness/manifests/java/claude-code.json +52 -36
- package/harness/manifests/java/codebuddy.json +52 -36
- package/harness/manifests/java/codex.json +52 -36
- package/harness/manifests/java/cursor.json +52 -36
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py
CHANGED
|
@@ -353,6 +353,95 @@ def changed_file_paths(summary: dict[str, Any]) -> list[str]:
|
|
|
353
353
|
return files
|
|
354
354
|
|
|
355
355
|
|
|
356
|
+
def archive_publication_status(project: Path, archive_rel: str) -> dict[str, Any]:
|
|
357
|
+
"""Knowledge publication gate for one archive (API-006/RET-40).
|
|
358
|
+
|
|
359
|
+
Blocks judge/apply/promote when: source consistency never ran or failed,
|
|
360
|
+
the authoritative version is missing or hash-mismatched, or the archive
|
|
361
|
+
is DEGRADED/UNVERIFIED. Ordinary ingest may still build quarantined
|
|
362
|
+
candidates, but nothing from a blocked archive becomes active.
|
|
363
|
+
"""
|
|
364
|
+
result: dict[str, Any] = {"status": "missing", "allowed": False, "reasons": []}
|
|
365
|
+
archive_dir = (Path(project) / archive_rel).resolve()
|
|
366
|
+
summary_path = archive_dir / "reports" / "final" / "summary-data.json"
|
|
367
|
+
if not summary_path.is_file():
|
|
368
|
+
result["reasons"].append("summary-data.json missing")
|
|
369
|
+
return result
|
|
370
|
+
try:
|
|
371
|
+
summary = json.loads(summary_path.read_text(encoding="utf-8"))
|
|
372
|
+
except (OSError, json.JSONDecodeError):
|
|
373
|
+
result["reasons"].append("summary-data.json unreadable")
|
|
374
|
+
return result
|
|
375
|
+
if not isinstance(summary, dict):
|
|
376
|
+
result["reasons"].append("summary-data.json must be an object")
|
|
377
|
+
return result
|
|
378
|
+
|
|
379
|
+
# A versioned repair becomes authoritative only after its pointer and
|
|
380
|
+
# repair-record hashes are verified. Gate the authoritative summary, not
|
|
381
|
+
# the known-bad original that caused the repair.
|
|
382
|
+
pointer_path = archive_dir / "derived" / "authoritative.json"
|
|
383
|
+
if pointer_path.is_file():
|
|
384
|
+
try:
|
|
385
|
+
pointer = json.loads(pointer_path.read_text(encoding="utf-8"))
|
|
386
|
+
version = str(pointer.get("version") or "")
|
|
387
|
+
if re.fullmatch(r"v[0-9]+", version) is None:
|
|
388
|
+
raise ValueError("invalid authoritative version")
|
|
389
|
+
version_dir = (archive_dir / "derived" / version).resolve()
|
|
390
|
+
if not version_dir.is_relative_to((archive_dir / "derived").resolve()):
|
|
391
|
+
raise ValueError("authoritative version escapes derived root")
|
|
392
|
+
record = json.loads(
|
|
393
|
+
(version_dir / "repair-record.json").read_text(encoding="utf-8")
|
|
394
|
+
)
|
|
395
|
+
derived_path = version_dir / "summary-data.json"
|
|
396
|
+
summary_bytes = derived_path.read_bytes()
|
|
397
|
+
actual = "sha256:" + hashlib.sha256(summary_bytes).hexdigest()
|
|
398
|
+
if record.get("summarySha256") != actual:
|
|
399
|
+
result["status"] = "degraded"
|
|
400
|
+
result["reasons"].append("repair record summary hash mismatch")
|
|
401
|
+
return result
|
|
402
|
+
if pointer.get("summarySha256") not in {None, actual}:
|
|
403
|
+
result["status"] = "degraded"
|
|
404
|
+
result["reasons"].append("authoritative pointer hash mismatch")
|
|
405
|
+
return result
|
|
406
|
+
summary = json.loads(summary_bytes.decode("utf-8"))
|
|
407
|
+
if not isinstance(summary, dict):
|
|
408
|
+
raise ValueError("authoritative summary must be an object")
|
|
409
|
+
result["authoritativeVersion"] = version
|
|
410
|
+
except (OSError, json.JSONDecodeError, UnicodeDecodeError, ValueError):
|
|
411
|
+
result["status"] = "degraded"
|
|
412
|
+
result["reasons"].append("authoritative version unreadable")
|
|
413
|
+
return result
|
|
414
|
+
|
|
415
|
+
consistency = (summary.get("reportPipeline") or {}).get("sourceConsistency")
|
|
416
|
+
if consistency is None:
|
|
417
|
+
result["status"] = "unverified"
|
|
418
|
+
result["reasons"].append("source consistency never ran")
|
|
419
|
+
return result
|
|
420
|
+
if not consistency.get("ok"):
|
|
421
|
+
result["status"] = "failed"
|
|
422
|
+
codes = [
|
|
423
|
+
str(i.get("code"))
|
|
424
|
+
for i in (consistency.get("issues") or [])
|
|
425
|
+
if isinstance(i, dict) and i.get("code")
|
|
426
|
+
]
|
|
427
|
+
result["reasons"].append(
|
|
428
|
+
"source consistency failed" + (f": {', '.join(codes)}" if codes else "")
|
|
429
|
+
)
|
|
430
|
+
return result
|
|
431
|
+
|
|
432
|
+
final_status = str(summary.get("finalStatus") or "").upper()
|
|
433
|
+
if final_status not in {"OK", "CONDITIONAL_OK"}:
|
|
434
|
+
result["status"] = "degraded" if final_status == "DEGRADED" else "unverified"
|
|
435
|
+
result["reasons"].append(
|
|
436
|
+
f"authoritative finalStatus is not publishable: {final_status or 'missing'}"
|
|
437
|
+
)
|
|
438
|
+
return result
|
|
439
|
+
|
|
440
|
+
result["status"] = "ok"
|
|
441
|
+
result["allowed"] = True
|
|
442
|
+
return result
|
|
443
|
+
|
|
444
|
+
|
|
356
445
|
def archive_summary_records(project: Path, summary_paths: list[Path]) -> list[dict[str, Any]]:
|
|
357
446
|
records = []
|
|
358
447
|
for summary_path in summary_paths:
|
|
@@ -939,6 +1028,9 @@ def apply_confidence_scores(entries: list[dict[str, Any]], config: dict[str, Any
|
|
|
939
1028
|
def should_auto_promote(entry: dict[str, Any], policy: dict[str, Any]) -> bool:
|
|
940
1029
|
if not policy["enabled"]:
|
|
941
1030
|
return False
|
|
1031
|
+
# API-006/RET-40: entries from blocked archives stay quarantined.
|
|
1032
|
+
if entry.get("lifecycle", {}).get("publishBlocked"):
|
|
1033
|
+
return False
|
|
942
1034
|
if entry.get("type") not in set(policy["allowedTypes"]):
|
|
943
1035
|
return False
|
|
944
1036
|
if entry.get("status") == "stale" and not policy["allowStale"]:
|
|
@@ -1946,6 +2038,17 @@ def build_index(
|
|
|
1946
2038
|
ingest_mode["cacheWrites"] += 1
|
|
1947
2039
|
else:
|
|
1948
2040
|
ingest_mode["archivesReused"] += 1
|
|
2041
|
+
# API-006/RET-40: entries from archives failing the publication
|
|
2042
|
+
# gate stay quarantined (candidate only, never active/promoted).
|
|
2043
|
+
archive_rel = rel_to_project(project, archive_dir_from_summary(summary_path))
|
|
2044
|
+
publication = archive_publication_status(project, archive_rel)
|
|
2045
|
+
if not publication.get("allowed"):
|
|
2046
|
+
for entry in archive_entries:
|
|
2047
|
+
lifecycle = entry.setdefault("lifecycle", {})
|
|
2048
|
+
lifecycle["publishBlocked"] = list(publication.get("reasons") or [])
|
|
2049
|
+
if entry.get("status") == "active":
|
|
2050
|
+
entry["status"] = "candidate"
|
|
2051
|
+
ingest_mode["activeAutoDemoted"] += 1
|
|
1949
2052
|
entries.extend(archive_entries)
|
|
1950
2053
|
except Exception as exc: # keep one bad archive from blocking the index
|
|
1951
2054
|
failures.append({"path": rel_to_project(project, summary_path), "error": str(exc)})
|
|
@@ -2064,6 +2167,20 @@ def promote_entry(project: Path, entry_id: str, note: str, allow_stale: bool = F
|
|
|
2064
2167
|
raise ValueError(f"entry not found in promotable statuses: {entry_id}")
|
|
2065
2168
|
|
|
2066
2169
|
source_path, entry = found
|
|
2170
|
+
# API-006/RET-40: refuse promotion of entries from blocked archives.
|
|
2171
|
+
blocked = (entry.get("lifecycle") or {}).get("publishBlocked")
|
|
2172
|
+
if blocked:
|
|
2173
|
+
raise ValueError(
|
|
2174
|
+
"publication blocked: " + "; ".join(str(r) for r in blocked)
|
|
2175
|
+
)
|
|
2176
|
+
archive_rel = (entry.get("source") or {}).get("archive")
|
|
2177
|
+
if archive_rel:
|
|
2178
|
+
publication = archive_publication_status(project, archive_rel)
|
|
2179
|
+
if not publication.get("allowed"):
|
|
2180
|
+
raise ValueError(
|
|
2181
|
+
"publication blocked: "
|
|
2182
|
+
+ "; ".join(str(r) for r in (publication.get("reasons") or []))
|
|
2183
|
+
)
|
|
2067
2184
|
entry["status"] = "active"
|
|
2068
2185
|
lifecycle = entry.setdefault("lifecycle", {})
|
|
2069
2186
|
lifecycle["promotedAt"] = now_iso()
|
|
@@ -3,7 +3,7 @@ name: harness-knowledge-query
|
|
|
3
3
|
description: 根据新需求、设计任务、代码修改请求或问题排查,在规划和编码前查询 .harness/knowledge
|
|
4
4
|
历史上下文。适用场景:query knowledge、查找历史需求、根据归档理解需求、继续之前类似开发、生成需求上下文包。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=43088896a4556b69; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-knowledge-query
|
|
8
8
|
|
|
9
9
|
并行 change 中查询必须传 `--change <change-id>`;成功后以该 change 的 `meta/knowledge-context.json` 为稳定指针。全局 `context-packs/latest.json` 仅向后兼容,不得用于判断多个 active change 的上下文归属。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-plan
|
|
3
3
|
description: 将需求转化为设计文档+实施计划+完整测试场景表,必须在编码前完成。使用场景:需求分析、feature plan、技术方案设计、实现方案规划
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=43088896a4556b69; overlay=none; agent=codebuddy; do not edit -->
|
|
6
6
|
# harness-plan — 需求规划
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
@@ -57,6 +57,12 @@ description: harness-plan 的阶段检查清单和覆盖检查列表。仅在执
|
|
|
57
57
|
> - CodeGraph 如通过 MCP 调用,必须优先用 MCP 工具,不允许通过普通 Bash 调 codegraph 命令
|
|
58
58
|
> - 禁止把子代理未经工具验证的文本结论当作"详尽报告"或代码证据采纳
|
|
59
59
|
|
|
60
|
+
## 影响面检查(远程客户端路径)
|
|
61
|
+
|
|
62
|
+
变更涉及 HTTP/RPC 客户端时,在设计/任务拆分前完成路径静态比对:
|
|
63
|
+
|
|
64
|
+
- [ ] 变更涉及 HTTP/RPC 客户端(Feign/RestTemplate/SDK 封装)时:取客户端注解路径(类级 + 方法级拼接),与服务提供方 controller 的 `@RequestMapping` + 方法级注解**完整拼接路径**逐一比对,在计划/执行记录中列出比对结果。只看方法级注解不算完成。
|
|
65
|
+
|
|
60
66
|
## 阶段 4:设计审批包 ⚠️ 强制阻断(一次 AskUserQuestion)
|
|
61
67
|
|
|
62
68
|
> 合并原「设计审核 + worktree + 场景表预览 + change-name」。推荐 worktree 读 `harness.json` `defaultWorktree`。
|
|
@@ -3,7 +3,7 @@ name: harness-review
|
|
|
3
3
|
description: 6维度代码审查(架构/安全/规范/兼容/测试/性能),对照项目规则(见
|
|
4
4
|
.harness/context-index.json)和测试场景表,在隔离上下文运行。使用场景:代码审查、提交前检查、合并评审
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=43088896a4556b69; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-review — 代码审查
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -54,8 +54,8 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
|
|
|
54
54
|
|
|
55
55
|
先运行 `python <skills-root>/scripts/harness_preflight.py check-agents --skills-root <skills-root> --agent harness-reviewer --json`。`usable=false` → **直接主会话审查**,记 `decision` 事件,**不委派**。`reasonCode=CUSTOM_AGENTS_UNSUPPORTED` 是当前工具没有自定义 agent 能力的正常 inline 路径,不显示缺失告警。`usable=true` 时用 Agent spawn `harness-reviewer`(只读, 6 维度)。返回空 / 无报告正文 → **不 retry**,降级主会话审查。
|
|
56
56
|
|
|
57
|
-
3.
|
|
58
|
-
4. **生成修复反馈(原生协议)** — 若报告存在 RED/YELLOW 问题,执行 `protocols.md` 的 `review-fixback-protocol`,将问题转化为结构化 fixback 清单并落盘到 `.harness/changes/<change-name>/reports/review/fixback-YYYYMMDD-HHmm.md`。若无 RED/YELLOW
|
|
57
|
+
3. **持久化报告与事实 sidecar(强制,主会话)** — Agent 返回后主会话 Write 到 `reports/review/review-report-*.md`,并把同一批发现写成临时 JSON 后调用 `python <skills-root>/scripts/harness_review.py write-findings --change-dir <change-dir> --input <findings.json>`。权威计数来自 `reports/review/review-findings.json`,不是 Markdown。任一写入缺失 → 🟡WARN,不得宣称 review 完成。
|
|
58
|
+
4. **生成修复反馈(原生协议)** — 若报告存在 RED/YELLOW 问题,执行 `protocols.md` 的 `review-fixback-protocol`,将问题转化为结构化 fixback 清单并落盘到 `.harness/changes/<change-name>/reports/review/fixback-YYYYMMDD-HHmm.md`;随后把 disposition 临时 JSON 交给 `python <skills-root>/scripts/harness_review.py write-dispositions --change-dir <change-dir> --input <dispositions.json>`,权威状态写入 `reports/review/fixback-dispositions.json`。若无 RED/YELLOW,也必须写空 findings sidecar,并记录 `review-fixback-protocol: skipped(no findings)`。不调用 Superpowers `receiving-code-review`,也不记录外部 skill 降级。
|
|
59
59
|
5. **收尾** — append `phase.end` / `artifact` 事件;控制台输出摘要
|
|
60
60
|
|
|
61
61
|
## Review 定位(重要)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-run
|
|
3
3
|
description: 按变更簇执行 TDD 编码循环(RED→GREEN→REFACTOR→编译验证),逐变更簇实现计划中的任务。使用场景:开始编码、实现功能、写代码、TDD 编码
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=43088896a4556b69; overlay=none; agent=codebuddy; do not edit -->
|
|
6
6
|
# harness-run — 需求编码
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
@@ -120,6 +120,11 @@ description: harness-run 的执行检查清单。仅在编码执行时读取。
|
|
|
120
120
|
- [ ] 纯 Mock 数据访问层测试 → 标记为 🟡静态验证,交给 harness-test 真实 DB 验证
|
|
121
121
|
- [ ] 如果必须自动化 → 使用真实数据访问层(非 mock)或可检查查询条件的测试方式
|
|
122
122
|
|
|
123
|
+
### 编码前检查(远程客户端 / stub 同源错误)
|
|
124
|
+
|
|
125
|
+
- [ ] 变更涉及 HTTP/RPC 客户端(Feign/RestTemplate/SDK 封装)时:取客户端注解路径(类级 + 方法级拼接),与服务提供方 controller 的 `@RequestMapping` + 方法级注解**完整拼接路径**逐一比对,在计划/执行记录中列出比对结果。只看方法级注解不算完成。
|
|
126
|
+
- [ ] 修 stub/null 返回时,顺带核对同文件相邻声明(注解、常量、同类方法路径)是否同源错误,一并列出核对结果
|
|
127
|
+
|
|
123
128
|
### GREEN(最简实现 — 按变更簇批量实现)
|
|
124
129
|
|
|
125
130
|
- [ ] 写最少代码让变更簇测试全部通过
|
|
@@ -522,12 +522,14 @@ powershell.exe -Command "<测试命令> <模块定位参数>"
|
|
|
522
522
|
|
|
523
523
|
```powershell
|
|
524
524
|
python <skills-root>/scripts/harness_ledger.py diff-hash --repo . --base <baseCommit> --change-dir ".harness/changes/<change-name>" --json
|
|
525
|
-
python <skills-root>/scripts/harness_ledger.py record --change-dir ".harness/changes/<change-name>" --verification compile --status
|
|
525
|
+
python <skills-root>/scripts/harness_ledger.py record --change-dir ".harness/changes/<change-name>" --verification compile --status ok --command "<cmd>" --exit-code 0 --json
|
|
526
526
|
```
|
|
527
527
|
|
|
528
528
|
> `content-changeset-2` 同时读取 tracked diff、标准 untracked 文件和 manifest 的精确测试路径。manifest 缺失时保持普通行为;manifest 存在但路径越界、内容 hash 漂移或结构非法时命令失败,ledger 不可复用。checkpoint commit 不改变各路径的工作树内容,因此提交前后 hash 保持一致。
|
|
529
529
|
|
|
530
530
|
> 这样 harness-test 的 Phase 1 可读取 ledger 判断是否复用 run 的 unitTest(diffHash commit-invariant + reuse 规则 #2 允许 HEAD 前移 → run 的 checkpoint commit 不破坏复用),submit 也可复用 compile 结果。详见 `../protocols/ledger-protocol.md`。
|
|
531
|
+
>
|
|
532
|
+
> **Ledger v3(v2 契约 / split-v1 布局起)**:`record` 自动解析并强制顶层身份(`schemaVersion=3/repositoryId/changeName/baseCommit/currentHead/diffHash/ownershipHash`),缺字段非零退出、不写账本;`--metrics-json` 必须通过 typed schema(unit=`total/passed/failed`,apiContract=`scenariosTotal/passed/failed`,browserE2E=`total/passed/failed`,dbCompatibility=`applicability(+reason)`);新增 `--base-commit/--diff-hash/--applicability/--applicability-reason`。legacy 契约行为不变。详见 `../protocols/ledger-protocol.md` 第十节。
|
|
531
533
|
|
|
532
534
|
阶段边界:`harness_gate.py begin/close`;测试跟踪:`harness_test_guard.py begin/close`。close 失败不得用自然语言覆盖。
|
|
533
535
|
|
|
@@ -789,6 +791,36 @@ powershell.exe -Command "git -C '<project-path>' diff --check"
|
|
|
789
791
|
在 harness-test 通过前,不建议也不应进入 `/harness-submit`。
|
|
790
792
|
```
|
|
791
793
|
|
|
794
|
+
## CLI 速查(gate / ledger)
|
|
795
|
+
|
|
796
|
+
> 可直接复制;替换 `<skills-root>` / `<cn>` / `<dir>` / `<project>`。`--task` **仅在该 change 启用 checkpoint 时必需**(checkpoints 文件缺失或不含 pending foundation-gate 时不要传)。
|
|
797
|
+
> `ledger record` 必需:`--duration-ms`、`--evidence`,以及 `--files`(逗号分隔源文件)或 `--profile-input <verificationKey> --project <project>`(从 build-profile 展开)。`status` 枚举: `ok|fail|not_run`(没有 PASS)。
|
|
798
|
+
> `--skills-root` 仅用于 `begin`(及 `lint-skills`):必须是 adapter 根(如 `.cursor/skills`),不是 `scripts/` 子目录。**`close` 不需要 `--skills-root`**(该子命令不接受此参数)。
|
|
799
|
+
|
|
800
|
+
```powershell
|
|
801
|
+
# gate begin/close(--task 仅在该 change 启用 checkpoint 时必需;close 不需要 --skills-root)
|
|
802
|
+
python <skills-root>/scripts/harness_gate.py begin --change <cn> --phase run --skills-root <skills-root> [--task N]
|
|
803
|
+
python <skills-root>/scripts/harness_gate.py close --change <cn> --phase run --status OK [--task N]
|
|
804
|
+
|
|
805
|
+
# ledger 记录(status: ok|fail|not_run —— 没有 PASS)
|
|
806
|
+
python <skills-root>/scripts/harness_ledger.py record --change-dir <dir> --verification unitTestFull --status ok --command "<完整命令>" --exit-code 0 --duration-ms 120000 --evidence "Tests run: 155, Failures: 0, Errors: 0, Skipped: 0" --coverage full --files "packages/core/src/index.ts"
|
|
807
|
+
|
|
808
|
+
# 复用检查(--profile-input 取 verification key,不是文件路径;配合 --project)
|
|
809
|
+
python <skills-root>/scripts/harness_ledger.py can-reuse --change-dir <dir> --verification unitTestFull --profile-input unitTestFull --project <project>
|
|
810
|
+
```
|
|
811
|
+
|
|
812
|
+
### 常见报错对照
|
|
813
|
+
|
|
814
|
+
| 报错 | 原因 | 处理 |
|
|
815
|
+
|------|------|------|
|
|
816
|
+
| `unsupported status: PASS` | ledger status 无 PASS | 改用 `ok` / `fail` / `not_run` |
|
|
817
|
+
| `TASK_NUMBER_REQUIRED` | 该 change 启用了 checkpoint(如 foundation-gate pending) | 补 `--task N` |
|
|
818
|
+
| skills-root / BUNDLE_IDENTITY_* | `begin` 未传或传了 `.../scripts` 子目录(`close` 不接受该参数) | 仅对 `begin` 显式传 adapter 根:`.cursor/skills` / `.claude/skills`(含 `.harness-build.json`) |
|
|
819
|
+
| `--profile-input` 指向文件路径 | 参数语义是 verification key | 传 `compile` / `unitTestFull` 等 key,不是 JSON 路径 |
|
|
820
|
+
| `record requires --files or a non-empty --profile-input file set` | 缺少输入文件集 | 补 `--files` 或 `--profile-input <key> --project <project>` |
|
|
821
|
+
| `--profile-input requires --project` | can-reuse/record 展开 profile 需要项目根 | 补 `--project <project>` |
|
|
822
|
+
| `record` 缺 `--duration-ms` / `--evidence` | 参数为必填 | 按模板补齐 |
|
|
823
|
+
|
|
792
824
|
## 关键原则
|
|
793
825
|
|
|
794
826
|
- 增量构建优先:`powershell.exe -Command "<构建命令> <模块定位参数>"`(Java 示例:`mvn compile -pl <module> -o -q`,不用 clean,用离线模式加速)
|
|
@@ -3,7 +3,7 @@ name: harness-submit
|
|
|
3
3
|
description: 最终提交封装:验证→中文 commit→提交/推送;worktree 模式含 --no-ff
|
|
4
4
|
合并回主分支。使用场景:提交代码、commit、push、合并分支、merge to main、完成开发
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=43088896a4556b69; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-submit — 最终提交(含 worktree 合并)
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -57,7 +57,7 @@ worktree 合并前必须运行 `harness_change.py integration-lock acquire --run
|
|
|
57
57
|
### 提交流程(步骤 0–7)
|
|
58
58
|
|
|
59
59
|
0. **启动准备** — `harness_change.py resolve` 确定变更名;**`harness_gate.py begin --phase submit --change <id>`**;读 ledger,以 `harness_ledger.py diff-hash --repo . --base <baseCommit> --change-dir ".harness/changes/<change-name>" --json` 计算 diffHash + post-test 7 类分类(禁止手写 ledger / 手工 phase.end)
|
|
60
|
-
1. **合并最新代码** —
|
|
60
|
+
1. **合并最新代码** — 主目录与 worktree 均**不在业务工作区 stash/pull**;远端同步由合并段 integration transaction 在隔离 integration worktree 内完成(见「worktree 合并流程」);**正常路径禁止 `git stash` / `stash pop`**
|
|
61
61
|
2. **最终验证** — ledger 复用优先;**提交前最终门禁只调 `can-reuse`**(删除与 coverage 冲突的二次全量门禁):`harness_ledger.py can-reuse --verification unitTestFull --scope module --project . --profile-input unitTestFull --command <resolved commands.unitTestFull.command>`。`--command` **按 profile key resolve**:读 `build-profile.json` 的 `commands.unitTestFull.command`(v2),或 `harness_profile.py resolve --project . --key unitTestFull --json` 取 resolved command,**不复制示例模块名**(文档示例只展示 key)。`--profile-input unitTestFull` 从 `verificationInputs.unitTestFull`(v2 由 `commands.unitTestFull.inputs` 派生)展开依赖闭包,**禁止用仅含 staged 文件的 `--files` 快捷方式**冒充全量闭包。`reuse=true` → 不再执行二次全量测试;仅 `reuse=false` 时执行**同一 resolved verification**(profile `unitTestFull` 命令),成功后用同一文件集、command、`scope=module` 经 **`harness_ledger.py record`** 写回 ledger `unitTestFull` 项。增量 `unitTest` 永远不能冒充 `unitTestFull` 门禁。
|
|
62
62
|
3. **.gitignore + 精确暂存** ⚠️ — 检查 `.harness/` 在 `.gitignore`;**禁止 `git add -A`**。若存在 `evidence/test-tracking.json`,先执行 `python <skills-root>/scripts/harness_test_guard.py stage --project . --change-dir ".harness/changes/<change-name>" --json`;失败即硬停止。无 manifest 时不使用 `-f`。manifest 之外的文件按精确业务路径正常暂存,**禁止全局 force-add**。
|
|
63
63
|
4. **提交方式** — 主目录:AskUserQuestion 三选项(commit+push / 仅本地 / 取消);**worktree:固定仅本地 commit**
|
|
@@ -69,15 +69,20 @@ worktree 合并前必须运行 `harness_change.py integration-lock acquire --run
|
|
|
69
69
|
|
|
70
70
|
### worktree 合并流程(requested=true,commit 后自动执行)
|
|
71
71
|
|
|
72
|
+
合并由 `harness_integration.py` transaction 执行:隔离 integration worktree + journal + 保护 ref + 精确清理。skill 只负责确认提交信息、调用子命令、展示结构化结果;**禁止手工 `checkout --ours/--theirs`**。
|
|
73
|
+
|
|
72
74
|
M0. append `phase.start`(phase=merge,若从 `/harness-merge` 重入则 note 标注重入)
|
|
73
|
-
M1.
|
|
74
|
-
M2. **fetch
|
|
75
|
-
M3.
|
|
76
|
-
M4.
|
|
77
|
-
M5.
|
|
78
|
-
M6. **
|
|
79
|
-
M7.
|
|
80
|
-
|
|
75
|
+
M1. **preflight** — `harness_integration.py preflight --change <id> --run-id <run> --feature-branch worktree/<id> --target-branch <主分支> --temp-root <task temp>`;获取 integration lock、写 journal 与保护 ref;锁被持有即停止
|
|
76
|
+
M2. **prepare** — fetch 后从已提交 target 创建临时 integration worktree;primary 的 dirty 状态不被触碰
|
|
77
|
+
M3. **merge** — `--no-ff` 合并 feature 分支;merge diff 出现其他 Change 的 contract/runtime 路径 → 结构化拒绝;冲突 → step FAILED,**停下**列出冲突文件,人工解决后以 `recover` 续跑(已完成步骤返回 REUSED,不重复 merge/push)
|
|
78
|
+
M4. **verify** — 在 integration worktree 内执行组合态验证;他人提交引入或 ledger 不可复用时必跑
|
|
79
|
+
M5. **push** — 仅在验证身份与远端基线仍匹配时 push;远端漂移 → `TARGET_MOVED` 结构化失败,不继续
|
|
80
|
+
M6. **cleanup** — `git worktree remove --force` 精确路径 + 临时分支 + (push 成功后)保护 ref;释放 integration lock;失败保留 journal 与诊断证据;更新 `worktree.json`(`created=false` + removedAt)
|
|
81
|
+
M7. **ledger + 收尾** — 经 `harness_ledger.py record` 写入 `mergeFinalHash`(= journal `pushedHead`);**`harness_gate.py close --phase merge`**(禁止手工 phase.end);提示 `/harness-archive`
|
|
82
|
+
|
|
83
|
+
> Ledger v3(v2 契约 / split-v1 布局起):`record` 强制顶层身份(`schemaVersion=3/repositoryId/baseCommit/currentHead/diffHash/ownershipHash`,缺失非零退出、不写账本)与 typed metrics;legacy 契约行为不变。详见 `../protocols/ledger-protocol.md` 第十节。
|
|
84
|
+
|
|
85
|
+
正常路径**禁止创建、应用或删除仓库级 stash**。中断恢复:`harness_integration.py status` 读 journal,`recover` 从首个未完成步骤续跑;protection refs 只在 push 成功后的 cleanup 删除。
|
|
81
86
|
|
|
82
87
|
## P0 执行可信度规则
|
|
83
88
|
|
|
@@ -36,25 +36,24 @@ description: harness-submit 的8 步工作流详细步骤和执行日志记录
|
|
|
36
36
|
|
|
37
37
|
> **分支名自动读取**:不硬编码 `master` 或 `main`,使用 `git rev-parse --abbrev-ref @{u}` 自动读取 upstream 分支。
|
|
38
38
|
|
|
39
|
+
**正常路径禁止 `git stash` / `stash pop`**。远端同步不在业务工作区执行;主目录与 worktree 模式统一由合并段的 `harness_integration.py` transaction 在隔离 integration worktree 内 fetch + merge:
|
|
40
|
+
|
|
39
41
|
```powershell
|
|
40
|
-
# 0. 自动读取 upstream
|
|
42
|
+
# 0. 自动读取 upstream 与目标分支(只读操作)
|
|
41
43
|
powershell.exe -Command "git -C '<项目路径>' rev-parse --abbrev-ref @{u}"
|
|
42
44
|
|
|
43
|
-
# 1.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
# 2. 拉取并合并远程
|
|
47
|
-
powershell.exe -Command "git -C '<项目路径>' pull --rebase"
|
|
45
|
+
# 1. preflight:获取 integration lock + 写 journal/保护 ref
|
|
46
|
+
python harness/scripts/harness_integration.py preflight --change <change-name> --run-id <run-id> --feature-branch <feature> --target-branch <target> --temp-root <task-temp>
|
|
48
47
|
|
|
49
|
-
#
|
|
50
|
-
|
|
48
|
+
# 2. prepare:fetch + 从已提交 target 创建临时 integration worktree
|
|
49
|
+
python harness/scripts/harness_integration.py prepare --change <change-name> --run-id <run-id> --feature-branch <feature> --target-branch <target> --temp-root <task-temp>
|
|
51
50
|
```
|
|
52
51
|
|
|
53
52
|
**Shell 安全规则(强制)**:
|
|
54
53
|
- 任何 git 命令被 hook 拒绝(`Denied` / `PreToolUse:Bash hook error`)→ 停止流程,不得宣称"拉取成功"
|
|
55
|
-
-
|
|
54
|
+
- transaction 各步骤状态以 journal 为唯一事实源;FAILED 步骤用 `recover` 续跑,不重复已完成副作用
|
|
56
55
|
|
|
57
|
-
|
|
56
|
+
merge 冲突或 `TARGET_MOVED` 时,参考 `reference.md` 的恢复清单;**禁止 `checkout --ours/--theirs`**。
|
|
58
57
|
|
|
59
58
|
## 步骤 2:最终验证(ledger 复用优先)
|
|
60
59
|
|
|
@@ -311,122 +310,87 @@ powershell.exe -Command "git -C '<项目路径>' rev-parse HEAD"
|
|
|
311
310
|
|
|
312
311
|
---
|
|
313
312
|
|
|
314
|
-
## worktree
|
|
313
|
+
## worktree 合并流程(integration transaction,M0–M7)
|
|
315
314
|
|
|
316
|
-
> worktree 模式 commit 成功后自动执行;用户仅说「合并分支」/`/harness-merge` 且已有本地 commit 时从 M0
|
|
315
|
+
> worktree 模式 commit 成功后自动执行;用户仅说「合并分支」/`/harness-merge` 且已有本地 commit 时从 M0 重入。合并由 `harness_integration.py` transaction 执行:隔离 integration worktree + journal + 保护 ref + 精确清理。**禁止 `checkout --theirs/--ours`;正常路径禁止仓库级 stash。**
|
|
317
316
|
|
|
318
317
|
### P0 合并稳定性门禁
|
|
319
318
|
|
|
320
319
|
- 主分支名不硬编码,用 `git symbolic-ref --short refs/remotes/origin/HEAD` 读取
|
|
321
320
|
- push 只在主分支;worktree 分支不 push
|
|
322
|
-
- 所有 git 命令通过 `powershell.exe -Command "..."`
|
|
321
|
+
- 所有 git 命令通过 `powershell.exe -Command "..."` 执行(transaction 脚本内部 git 调用除外)
|
|
322
|
+
- transaction 步骤状态以 `.harness/state/integration/<transaction-id>/journal.json` 为唯一事实源
|
|
323
323
|
|
|
324
324
|
### 步骤 M0:启动合并段
|
|
325
325
|
|
|
326
326
|
append `phase.start`(`--phase merge`;`note` 含 worktree 分支、主分支、ledger diffHash、验证策略;重入时 note 标注「重入 merge」)。
|
|
327
327
|
|
|
328
|
-
### 步骤 M1
|
|
329
|
-
|
|
330
|
-
```powershell
|
|
331
|
-
powershell.exe -Command "git -C '<项目路径>' symbolic-ref --short refs/remotes/origin/HEAD"
|
|
332
|
-
powershell.exe -Command "git -C '<项目路径>' stash" # 主目录有未提交变更时
|
|
333
|
-
powershell.exe -Command "git -C '<项目路径>' rev-parse --abbrev-ref HEAD"
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
不在主分支则 `git checkout <主分支>`。
|
|
337
|
-
|
|
338
|
-
### 步骤 M2:fetch + 同步主分支
|
|
328
|
+
### 步骤 M1:preflight
|
|
339
329
|
|
|
340
330
|
```powershell
|
|
341
|
-
|
|
342
|
-
powershell.exe -Command "git -C '<项目路径>' pull --rebase"
|
|
331
|
+
python harness/scripts/harness_integration.py preflight --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
|
|
343
332
|
```
|
|
344
333
|
|
|
345
|
-
|
|
334
|
+
获取 integration lock、解析 base/feature head、写 journal 与保护 refs(`refs/harness/integration/<txn>/base|head`)。锁被其他 run 持有 → **停止**,不改动工作区与状态文件。
|
|
346
335
|
|
|
347
|
-
|
|
336
|
+
### 步骤 M2:prepare
|
|
348
337
|
|
|
349
338
|
```powershell
|
|
350
|
-
|
|
351
|
-
powershell.exe -Command "git -C '<项目路径>' add --renormalize ."
|
|
352
|
-
# 2. 若 git status --porcelain 非空 → working copy 存在 CRLF 漂移
|
|
353
|
-
powershell.exe -Command "git -C '<项目路径>' status --porcelain"
|
|
354
|
-
# 3. 有漂移 → 弃 staging + 强制 LF 重检(worktree 合并段 M2 在主仓库 main,应 clean,安全)
|
|
355
|
-
powershell.exe -Command "git -C '<项目路径>' reset -q; git -C '<项目路径>' checkout -- ."
|
|
356
|
-
# 4. 重新 renormalize 确认 clean(git status --porcelain 应空)
|
|
357
|
-
powershell.exe -Command "git -C '<项目路径>' add --renormalize .; git status --porcelain"
|
|
339
|
+
python harness/scripts/harness_integration.py prepare --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
|
|
358
340
|
```
|
|
359
341
|
|
|
360
|
-
|
|
342
|
+
fetch 后从**已提交** target 创建临时 integration worktree;primary 的 staged/unstaged/untracked/ignored 与 mtime 均不被触碰。
|
|
361
343
|
|
|
362
|
-
### 步骤 M3
|
|
344
|
+
### 步骤 M3:merge
|
|
363
345
|
|
|
364
346
|
```powershell
|
|
365
|
-
|
|
347
|
+
python harness/scripts/harness_integration.py merge --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
|
|
366
348
|
```
|
|
367
349
|
|
|
368
|
-
|
|
350
|
+
- 方式固定 `--no-ff`;merge diff 出现其他 Change 的 contract/runtime 路径 → 结构化 `FOREIGN_CHANGE_PATHS` 拒绝
|
|
351
|
+
- 冲突 → step FAILED:**停下**,`git -C <integration-worktree> diff --name-only --diff-filter=U` 列冲突文件,提示用户手动解决;保护 refs 与 journal 保留
|
|
352
|
+
- 人工解决后以 `recover` 续跑;已完成步骤返回 REUSED,不重复 merge
|
|
369
353
|
|
|
370
|
-
### 步骤 M4
|
|
354
|
+
### 步骤 M4:verify(组合态验证)
|
|
371
355
|
|
|
372
|
-
|
|
356
|
+
在 integration worktree 内执行验证命令;远端引入他人提交或 ledger 不可复用时必跑:
|
|
373
357
|
|
|
374
358
|
```powershell
|
|
375
|
-
|
|
359
|
+
python harness/scripts/harness_integration.py verify --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp> --command "<resolved command>"
|
|
376
360
|
```
|
|
377
361
|
|
|
378
|
-
|
|
379
|
-
- 状态 `🟡WARN(merge 冲突,待手动解决:<文件列表>)`
|
|
380
|
-
- 用户确认解决后重跑 submit(从 M0 重入)
|
|
381
|
-
- **禁止自动 `git checkout --theirs/--ours`**
|
|
382
|
-
|
|
383
|
-
### 步骤 M5:合并后验证(ledger 复用优先)
|
|
384
|
-
|
|
385
|
-
- 步骤 M2 引入他人提交 → **必须重跑** 构建+测试
|
|
386
|
-
- 否则 diffHash 一致且 post-test 非行为性 → 🔁REUSED
|
|
387
|
-
|
|
388
|
-
重跑后写回 ledger 的 `compile`/`unitTest`,更新 `diffHash`/`currentHead`。
|
|
362
|
+
任一命令非零退出 → step FAILED,不进入 push。
|
|
389
363
|
|
|
390
|
-
**写 check-ok marker**(npm run check exit 0
|
|
364
|
+
**写 check-ok marker**(npm run check exit 0 后强制):
|
|
391
365
|
|
|
392
366
|
```powershell
|
|
393
|
-
# npm run check exit 0 后立即写 marker(M5 或 REUSED 后均可)
|
|
394
367
|
powershell.exe -Command "python harness/scripts/harness_check_gate.py --write"
|
|
395
368
|
```
|
|
396
369
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
### 步骤 M6:push 主分支
|
|
370
|
+
### 步骤 M5:push
|
|
400
371
|
|
|
401
372
|
```powershell
|
|
402
|
-
|
|
403
|
-
powershell.exe -Command "git -C '<项目路径>' log HEAD..@{u} --oneline"
|
|
373
|
+
python harness/scripts/harness_integration.py push --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
|
|
404
374
|
```
|
|
405
375
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
```powershell
|
|
409
|
-
powershell.exe -Command "git -C '<项目路径>' push"
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
记录 `mergeFinalHash`:`git rev-parse HEAD`。
|
|
413
|
-
|
|
414
|
-
### 步骤 M7:清理 worktree
|
|
376
|
+
远端基线漂移 → `TARGET_MOVED` 结构化失败,不继续。成功后 journal `pushedHead` 即 `mergeFinalHash`。
|
|
415
377
|
|
|
416
|
-
|
|
378
|
+
### 步骤 M6:cleanup
|
|
417
379
|
|
|
418
380
|
```powershell
|
|
419
|
-
|
|
420
|
-
powershell.exe -Command "git -C '<项目路径>' branch -D worktree/<change-name>"
|
|
381
|
+
python harness/scripts/harness_integration.py cleanup --change <change-name> --run-id <run-id> --feature-branch worktree/<change-name> --target-branch <主分支> --temp-root <task-temp>
|
|
421
382
|
```
|
|
422
383
|
|
|
423
|
-
|
|
384
|
+
- `git worktree remove --force` 精确路径 → 验证注销 → 临时分支 `branch -D` → (push 成功后)删除保护 refs → 释放 integration lock
|
|
385
|
+
- 清理只接受 journal 登记的精确 integrationRoot;仓库根、父目录、空路径、逃逸路径与其他 transaction 路径一律拒绝
|
|
386
|
+
- 失败保留 journal 与诊断证据,状态 🟡WARN,不得宣称清理完成
|
|
387
|
+
- 若存在 test-tracking manifest,确认其路径已由合并后的目标分支跟踪(`git ls-files --error-unmatch -- <exact-path>`),缺失即停止
|
|
424
388
|
|
|
425
389
|
更新 `meta/worktree.json`:`created=false` + `removedAt`/`removedBy`/`removalNote`。
|
|
426
390
|
|
|
427
|
-
### 步骤
|
|
391
|
+
### 步骤 M7:更新 ledger + 收尾
|
|
428
392
|
|
|
429
|
-
ledger 顶层写入 `"mergeFinalHash": "<
|
|
393
|
+
ledger 顶层写入 `"mergeFinalHash": "<journal pushedHead>"`;经 `harness_gate.py close --phase merge` 关闭(禁止手工 phase.end)。
|
|
430
394
|
|
|
431
395
|
```markdown
|
|
432
396
|
## 合并完成 — <change-name>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-sync
|
|
3
3
|
description: 检查并更新项目AI元数据(CodeGraph索引、harness-codebase-map分析、CLAUDE.md、AGENTS.md、.harness/完整性),确保Claude对代码库的理解与最新代码一致。当用户说'同步/更新索引/刷新元数据/检查一致性'时使用
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=43088896a4556b69; overlay=none; agent=codebuddy; do not edit -->
|
|
6
6
|
# harness-sync — 元数据同步
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
@@ -15,6 +15,21 @@ description: 检查并更新项目AI元数据(CodeGraph索引、harness-codeba
|
|
|
15
15
|
|
|
16
16
|
## Workflow(薄编排)
|
|
17
17
|
|
|
18
|
+
运行开始先执行受管 runtime 生命周期:
|
|
19
|
+
|
|
20
|
+
```powershell
|
|
21
|
+
python <skills-root>/scripts/harness_sync.py reap --project . --json
|
|
22
|
+
python <skills-root>/scripts/harness_sync.py begin --project . --run-id <run-id> --agent <agent> --purpose harness-sync --json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
所有 deploy 临时产物只能写入 `begin` 返回的 `workspace`。无论正常完成、命令失败还是异常退出,都必须在 `finally` 中执行:
|
|
26
|
+
|
|
27
|
+
```powershell
|
|
28
|
+
python <skills-root>/scripts/harness_sync.py finalize --project . --run-id <run-id> --json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
禁止重新使用固定 `sync-deploy-*` 目录;`--keep-temp` 仅供显式诊断。
|
|
32
|
+
|
|
18
33
|
| Phase | 检查 → 动作 |
|
|
19
34
|
|-------|-------------|
|
|
20
35
|
| 0 | 读 SKILL + `reference.md` + protocols |
|
|
@@ -25,7 +40,7 @@ description: 检查并更新项目AI元数据(CodeGraph索引、harness-codeba
|
|
|
25
40
|
| 3.6 | 单次运行 `harness_knowledge.py maintain --project . --drain --json`,有界推进全部 `.harness/knowledge/maintenance-outbox/{pending,failed}`;不得为每个条目重复启动 Python/重建索引(§8.2:archive close 只 enqueue,sync 异步推进 outbox 到 completed/pending-judge) |
|
|
26
41
|
| 4 | CLAUDE.md 完整性/行数 → 超限 AskUserQuestion 瘦身 |
|
|
27
42
|
| 5 | AGENTS.md 与 CLAUDE.md 一致 |
|
|
28
|
-
| 6 | `.harness/` 结构(init 规程 → `reference.md` 第 6
|
|
43
|
+
| 6 | `.harness/` 结构(init 规程 → `reference.md` 第 6 步);已装 skill 新鲜度只经 `hunter-harness refresh --dry-run --json` 的 post-adaptation freshness 判断,禁止 raw build 字节比较 |
|
|
29
44
|
| 7–9 | `项目规则(见 .harness/context-index.json)/`、构建配置、测试目录 — **只提示不自动修复** |
|
|
30
45
|
|
|
31
46
|
状态判断表格、修复动作、输出示例 → `reference.md`
|
|
@@ -75,8 +75,8 @@ powershell.exe -Command "git -C '<项目路径>' diff --stat HEAD~5 2>$null"
|
|
|
75
75
|
| state 目录 | `.harness/state/baseline/` 存在(internal_state) | ✅OK | 无需操作 |
|
|
76
76
|
| codebase map | `.harness/codebase/map/` 状态 | — | 见第 3 步 |
|
|
77
77
|
| 整体缺失 | `project.yaml` 与 `context-index.json` 均不存在 | ❌FAIL(未初始化) | 执行 `hunter-harness init`(见下方风险规程) |
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
|
|
79
|
+
> sync 不读取、不修改也不建议修改项目 `.gitignore` 策略(RET-34/35):三种跟踪策略(整体忽略 / 选择性跟踪 / 完全跟踪)下完整性结论相同,新鲜度由 post-adaptation projection 判定,与 Git 策略无关。
|
|
80
80
|
|
|
81
81
|
> ⚠️ **`hunter-harness init` 风险规程**(`.harness/` 未初始化时触发):
|
|
82
82
|
> 1. **预览**:`node packages/cli/dist/bin.js --non-interactive --dry-run --adapter claude-code --profile general --json`,确认将写入的路径清单与 `project_id`(`null` = 未绑服务器,本地自治理)。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-test
|
|
3
3
|
description: 测试执行:读取场景表,执行单元测试+API接口测试+数据兼容验证,输出测试报告。当用户说'跑测试/验证/跑用例/接口测试/单元测试'时使用
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=43088896a4556b69; overlay=none; agent=codebuddy; do not edit -->
|
|
6
6
|
# harness-test — 测试执行
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
@@ -293,6 +293,15 @@ powershell.exe -NoProfile -Command "try { (Invoke-WebRequest -Uri 'http://127.0.
|
|
|
293
293
|
- [ ] durationMs > 10000 → 🟡SLOW,说明原因
|
|
294
294
|
- [ ] durationMs > 30000 → ❌TIMEOUT_RISK,说明原因
|
|
295
295
|
|
|
296
|
+
### 覆盖标注诚实性(✅ 实测 vs 🟡 推断)
|
|
297
|
+
|
|
298
|
+
场景状态标注规则:
|
|
299
|
+
|
|
300
|
+
- [ ] ✅ 仅当断言实际执行**且**场景声明的前置条件/数据真实构造
|
|
301
|
+
- [ ] 🟡(推断):未构造场景条件、以相邻场景或同接口行为推断时使用,必须注明推断依据
|
|
302
|
+
- [ ] 用同一请求重复调用来"覆盖"不同异常场景 → 一律 🟡
|
|
303
|
+
- [ ] 报告汇总行的通过数只统计 ✅(不含 🟡 推断)
|
|
304
|
+
|
|
296
305
|
## 关门检查(⚠️ 结束前强制执行)
|
|
297
306
|
|
|
298
307
|
- [ ] `powershell.exe -NoProfile -Command "git status --porcelain"`
|