@hunter-harness/workflow-harness 0.4.8 → 0.4.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/CONTEXT.md +1 -1
- package/harness/bundles/general/claude-code/README.md +36 -38
- package/harness/bundles/general/claude-code/contracts/workflow-policy.json +0 -50
- package/harness/bundles/general/claude-code/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/general/claude-code/harness-execute/SKILL.md +17 -17
- package/harness/bundles/general/{codex/harness-run/checklist.md → claude-code/harness-execute/coding-checklist.md} +9 -9
- package/harness/bundles/general/{codex/harness-run/reference.md → claude-code/harness-execute/coding-reference.md} +36 -36
- package/harness/bundles/general/{codex/harness-run → claude-code/harness-execute}/protocols.md +4 -4
- package/harness/bundles/general/{codebuddy/harness-test/checklist.md → claude-code/harness-execute/testing-checklist.md} +9 -10
- package/harness/bundles/general/claude-code/harness-execute/testing-pitfalls-java.md +21 -0
- package/harness/bundles/general/{codex/harness-test/pitfalls.md → claude-code/harness-execute/testing-pitfalls.md} +7 -7
- package/harness/bundles/general/claude-code/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +7 -1
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +3 -3
- package/harness/bundles/general/claude-code/harness-plan/checklist.md +2 -1
- package/harness/bundles/general/claude-code/harness-plan/reference.md +8 -0
- package/harness/bundles/general/claude-code/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +3 -3
- package/harness/bundles/general/claude-code/harness-review/checklist.md +1 -1
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-submit/checklist.md +1 -1
- package/harness/bundles/general/claude-code/harness-submit/reference.md +1 -1
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/general/claude-code/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/general/claude-code/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/general/claude-code/scripts/harness_context.py +71 -8
- package/harness/bundles/general/claude-code/scripts/harness_deploy.py +2 -2
- package/harness/bundles/general/claude-code/scripts/harness_events.py +17 -11
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +95 -10
- package/harness/bundles/general/claude-code/scripts/harness_ledger.py +84 -4
- package/harness/bundles/general/claude-code/scripts/harness_profile.py +3 -3
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/CONTEXT.md +1 -1
- package/harness/bundles/general/codebuddy/README.md +36 -38
- package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +0 -50
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/general/codebuddy/harness-execute/SKILL.md +17 -17
- package/harness/bundles/general/{claude-code/harness-run/checklist.md → codebuddy/harness-execute/coding-checklist.md} +9 -9
- package/harness/bundles/general/codebuddy/{harness-run/reference.md → harness-execute/coding-reference.md} +36 -36
- package/harness/bundles/general/codebuddy/{harness-run → harness-execute}/protocols.md +4 -4
- package/harness/bundles/general/{codex/harness-test/checklist.md → codebuddy/harness-execute/testing-checklist.md} +9 -10
- package/harness/bundles/general/codebuddy/harness-execute/testing-pitfalls-java.md +21 -0
- package/harness/bundles/general/{claude-code/harness-test/pitfalls.md → codebuddy/harness-execute/testing-pitfalls.md} +7 -7
- package/harness/bundles/general/codebuddy/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +7 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +3 -3
- package/harness/bundles/general/codebuddy/harness-plan/checklist.md +2 -1
- package/harness/bundles/general/codebuddy/harness-plan/reference.md +8 -0
- package/harness/bundles/general/codebuddy/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +3 -3
- package/harness/bundles/general/codebuddy/harness-review/checklist.md +1 -1
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-submit/checklist.md +1 -1
- package/harness/bundles/general/codebuddy/harness-submit/reference.md +1 -1
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/general/codebuddy/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/general/codebuddy/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/general/codebuddy/scripts/harness_context.py +71 -8
- package/harness/bundles/general/codebuddy/scripts/harness_deploy.py +2 -2
- package/harness/bundles/general/codebuddy/scripts/harness_events.py +17 -11
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +95 -10
- package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +84 -4
- package/harness/bundles/general/codebuddy/scripts/harness_profile.py +3 -3
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/CONTEXT.md +1 -1
- package/harness/bundles/general/codex/README.md +36 -38
- package/harness/bundles/general/codex/contracts/workflow-policy.json +0 -50
- package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/general/codex/harness-execute/SKILL.md +17 -17
- package/harness/bundles/general/{cursor/harness-run/checklist.md → codex/harness-execute/coding-checklist.md} +9 -9
- package/harness/bundles/general/{cursor/harness-run/reference.md → codex/harness-execute/coding-reference.md} +36 -36
- package/harness/bundles/general/{claude-code/harness-run → codex/harness-execute}/protocols.md +4 -4
- package/harness/bundles/general/{cursor/harness-test/checklist.md → codex/harness-execute/testing-checklist.md} +9 -10
- package/harness/bundles/general/codex/harness-execute/testing-pitfalls-java.md +21 -0
- package/harness/bundles/general/{codebuddy/harness-test/pitfalls.md → codex/harness-execute/testing-pitfalls.md} +7 -7
- package/harness/bundles/general/codex/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +7 -1
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/SKILL.md +3 -3
- package/harness/bundles/general/codex/harness-plan/checklist.md +2 -1
- package/harness/bundles/general/codex/harness-plan/reference.md +8 -0
- package/harness/bundles/general/codex/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-review/SKILL.md +3 -3
- package/harness/bundles/general/codex/harness-review/checklist.md +1 -1
- package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-submit/checklist.md +1 -1
- package/harness/bundles/general/codex/harness-submit/reference.md +1 -1
- package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codex/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/general/codex/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/general/codex/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/general/codex/scripts/harness_context.py +71 -8
- package/harness/bundles/general/codex/scripts/harness_deploy.py +2 -2
- package/harness/bundles/general/codex/scripts/harness_events.py +17 -11
- package/harness/bundles/general/codex/scripts/harness_gate.py +95 -10
- package/harness/bundles/general/codex/scripts/harness_ledger.py +84 -4
- package/harness/bundles/general/codex/scripts/harness_profile.py +3 -3
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/CONTEXT.md +1 -1
- package/harness/bundles/general/cursor/README.md +36 -38
- package/harness/bundles/general/cursor/contracts/workflow-policy.json +0 -50
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/general/cursor/harness-execute/SKILL.md +17 -17
- package/harness/bundles/general/{codebuddy/harness-run/checklist.md → cursor/harness-execute/coding-checklist.md} +9 -9
- package/harness/bundles/general/{claude-code/harness-run/reference.md → cursor/harness-execute/coding-reference.md} +36 -36
- package/harness/bundles/general/cursor/{harness-run → harness-execute}/protocols.md +4 -4
- package/harness/bundles/general/{claude-code/harness-test/checklist.md → cursor/harness-execute/testing-checklist.md} +9 -10
- package/harness/bundles/general/cursor/harness-execute/testing-pitfalls-java.md +21 -0
- package/harness/bundles/general/cursor/{harness-test/pitfalls.md → harness-execute/testing-pitfalls.md} +7 -7
- package/harness/bundles/general/cursor/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +7 -1
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +3 -3
- package/harness/bundles/general/cursor/harness-plan/checklist.md +2 -1
- package/harness/bundles/general/cursor/harness-plan/reference.md +8 -0
- package/harness/bundles/general/cursor/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-review/SKILL.md +3 -3
- package/harness/bundles/general/cursor/harness-review/checklist.md +1 -1
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-submit/checklist.md +1 -1
- package/harness/bundles/general/cursor/harness-submit/reference.md +1 -1
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/cursor/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/general/cursor/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/general/cursor/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/general/cursor/scripts/harness_context.py +71 -8
- package/harness/bundles/general/cursor/scripts/harness_deploy.py +2 -2
- package/harness/bundles/general/cursor/scripts/harness_events.py +17 -11
- package/harness/bundles/general/cursor/scripts/harness_gate.py +95 -10
- package/harness/bundles/general/cursor/scripts/harness_ledger.py +84 -4
- package/harness/bundles/general/cursor/scripts/harness_profile.py +3 -3
- package/harness/bundles/general/pi/.harness-build.json +1 -1
- package/harness/bundles/general/pi/CONTEXT.md +1 -1
- package/harness/bundles/general/pi/README.md +36 -38
- package/harness/bundles/general/pi/contracts/workflow-policy.json +0 -50
- package/harness/bundles/general/pi/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/general/pi/harness-execute/SKILL.md +17 -17
- package/harness/bundles/general/pi/harness-execute/coding-checklist.md +279 -0
- package/harness/bundles/general/pi/harness-execute/coding-reference.md +886 -0
- package/harness/bundles/general/pi/harness-execute/protocols.md +141 -0
- package/harness/bundles/general/pi/harness-execute/testing-checklist.md +358 -0
- package/harness/bundles/general/pi/harness-execute/testing-pitfalls-java.md +21 -0
- package/harness/bundles/general/pi/harness-execute/testing-pitfalls.md +307 -0
- package/harness/bundles/general/pi/harness-execute/testing-reference.md +880 -0
- package/harness/bundles/general/pi/harness-knowledge-ingest/SKILL.md +7 -1
- package/harness/bundles/general/pi/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-plan/SKILL.md +3 -3
- package/harness/bundles/general/pi/harness-plan/checklist.md +2 -1
- package/harness/bundles/general/pi/harness-plan/reference.md +8 -0
- package/harness/bundles/general/pi/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-review/SKILL.md +3 -3
- package/harness/bundles/general/pi/harness-review/checklist.md +1 -1
- package/harness/bundles/general/pi/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-submit/checklist.md +1 -1
- package/harness/bundles/general/pi/harness-submit/reference.md +1 -1
- package/harness/bundles/general/pi/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/pi/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/general/pi/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/general/pi/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/general/pi/scripts/harness_context.py +71 -8
- package/harness/bundles/general/pi/scripts/harness_deploy.py +2 -2
- package/harness/bundles/general/pi/scripts/harness_events.py +17 -11
- package/harness/bundles/general/pi/scripts/harness_gate.py +95 -10
- package/harness/bundles/general/pi/scripts/harness_ledger.py +84 -4
- package/harness/bundles/general/pi/scripts/harness_profile.py +3 -3
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/CONTEXT.md +1 -1
- package/harness/bundles/java/claude-code/README.md +36 -38
- package/harness/bundles/java/claude-code/contracts/workflow-policy.json +0 -50
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/java/claude-code/harness-execute/SKILL.md +49 -17
- package/harness/bundles/java/claude-code/{harness-run/checklist.md → harness-execute/coding-checklist.md} +6 -6
- package/harness/bundles/java/claude-code/{harness-run/reference.md → harness-execute/coding-reference.md} +37 -37
- package/harness/bundles/java/claude-code/harness-execute/protocols.md +141 -0
- package/harness/bundles/java/claude-code/{harness-test/checklist.md → harness-execute/testing-checklist.md} +9 -9
- package/harness/bundles/java/claude-code/{harness-test/pitfalls-java.md → harness-execute/testing-pitfalls-java.md} +2 -1
- package/harness/bundles/java/claude-code/harness-execute/testing-pitfalls.md +307 -0
- package/harness/bundles/java/claude-code/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +7 -1
- 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-package/checklist.md +7 -7
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +3 -3
- package/harness/bundles/java/claude-code/harness-plan/checklist.md +2 -1
- package/harness/bundles/java/claude-code/harness-plan/reference.md +8 -0
- package/harness/bundles/java/claude-code/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +3 -3
- package/harness/bundles/java/claude-code/harness-review/checklist.md +1 -1
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-submit/checklist.md +1 -1
- package/harness/bundles/java/claude-code/harness-submit/reference.md +1 -1
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/java/claude-code/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/java/claude-code/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/java/claude-code/scripts/harness_context.py +71 -8
- package/harness/bundles/java/claude-code/scripts/harness_deploy.py +2 -2
- package/harness/bundles/java/claude-code/scripts/harness_events.py +17 -11
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +95 -10
- package/harness/bundles/java/claude-code/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/claude-code/scripts/harness_profile.py +3 -3
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/CONTEXT.md +1 -1
- package/harness/bundles/java/codebuddy/README.md +36 -38
- package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +0 -50
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/java/codebuddy/harness-execute/SKILL.md +49 -17
- package/harness/bundles/java/codebuddy/{harness-run/checklist.md → harness-execute/coding-checklist.md} +6 -6
- package/harness/bundles/java/codebuddy/{harness-run/reference.md → harness-execute/coding-reference.md} +37 -37
- package/harness/bundles/java/codebuddy/harness-execute/protocols.md +141 -0
- package/harness/bundles/java/codebuddy/{harness-test/checklist.md → harness-execute/testing-checklist.md} +9 -9
- package/harness/bundles/java/codebuddy/{harness-test/pitfalls-java.md → harness-execute/testing-pitfalls-java.md} +2 -1
- package/harness/bundles/java/codebuddy/harness-execute/testing-pitfalls.md +307 -0
- package/harness/bundles/java/codebuddy/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +7 -1
- 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-package/checklist.md +7 -7
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +3 -3
- package/harness/bundles/java/codebuddy/harness-plan/checklist.md +2 -1
- package/harness/bundles/java/codebuddy/harness-plan/reference.md +8 -0
- package/harness/bundles/java/codebuddy/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +3 -3
- package/harness/bundles/java/codebuddy/harness-review/checklist.md +1 -1
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-submit/checklist.md +1 -1
- package/harness/bundles/java/codebuddy/harness-submit/reference.md +1 -1
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/java/codebuddy/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/java/codebuddy/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/java/codebuddy/scripts/harness_context.py +71 -8
- package/harness/bundles/java/codebuddy/scripts/harness_deploy.py +2 -2
- package/harness/bundles/java/codebuddy/scripts/harness_events.py +17 -11
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +95 -10
- package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/codebuddy/scripts/harness_profile.py +3 -3
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/CONTEXT.md +1 -1
- package/harness/bundles/java/codex/README.md +36 -38
- package/harness/bundles/java/codex/contracts/workflow-policy.json +0 -50
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/java/codex/harness-execute/SKILL.md +49 -17
- package/harness/bundles/java/codex/{harness-run/checklist.md → harness-execute/coding-checklist.md} +6 -6
- package/harness/bundles/java/codex/{harness-run/reference.md → harness-execute/coding-reference.md} +37 -37
- package/harness/bundles/java/codex/harness-execute/protocols.md +141 -0
- package/harness/bundles/java/codex/{harness-test/checklist.md → harness-execute/testing-checklist.md} +9 -9
- package/harness/bundles/java/codex/{harness-test/pitfalls-java.md → harness-execute/testing-pitfalls-java.md} +2 -1
- package/harness/bundles/java/codex/harness-execute/testing-pitfalls.md +307 -0
- package/harness/bundles/java/codex/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +7 -1
- 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-package/checklist.md +7 -7
- package/harness/bundles/java/codex/harness-plan/SKILL.md +3 -3
- package/harness/bundles/java/codex/harness-plan/checklist.md +2 -1
- package/harness/bundles/java/codex/harness-plan/reference.md +8 -0
- package/harness/bundles/java/codex/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-review/SKILL.md +3 -3
- package/harness/bundles/java/codex/harness-review/checklist.md +1 -1
- package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-submit/checklist.md +1 -1
- package/harness/bundles/java/codex/harness-submit/reference.md +1 -1
- package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codex/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/java/codex/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/java/codex/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/java/codex/scripts/harness_context.py +71 -8
- package/harness/bundles/java/codex/scripts/harness_deploy.py +2 -2
- package/harness/bundles/java/codex/scripts/harness_events.py +17 -11
- package/harness/bundles/java/codex/scripts/harness_gate.py +95 -10
- package/harness/bundles/java/codex/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/codex/scripts/harness_profile.py +3 -3
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/CONTEXT.md +1 -1
- package/harness/bundles/java/cursor/README.md +36 -38
- package/harness/bundles/java/cursor/contracts/workflow-policy.json +0 -50
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/java/cursor/harness-execute/SKILL.md +49 -17
- package/harness/bundles/java/cursor/{harness-run/checklist.md → harness-execute/coding-checklist.md} +6 -6
- package/harness/bundles/java/cursor/{harness-run/reference.md → harness-execute/coding-reference.md} +37 -37
- package/harness/bundles/java/cursor/harness-execute/protocols.md +141 -0
- package/harness/bundles/java/cursor/{harness-test/checklist.md → harness-execute/testing-checklist.md} +9 -9
- package/harness/bundles/java/cursor/{harness-test/pitfalls-java.md → harness-execute/testing-pitfalls-java.md} +2 -1
- package/harness/bundles/java/cursor/harness-execute/testing-pitfalls.md +307 -0
- package/harness/bundles/java/cursor/{harness-test/reference.md → harness-execute/testing-reference.md} +13 -13
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +7 -1
- 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-package/checklist.md +7 -7
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +3 -3
- package/harness/bundles/java/cursor/harness-plan/checklist.md +2 -1
- package/harness/bundles/java/cursor/harness-plan/reference.md +8 -0
- package/harness/bundles/java/cursor/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-review/SKILL.md +3 -3
- package/harness/bundles/java/cursor/harness-review/checklist.md +1 -1
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-submit/checklist.md +1 -1
- package/harness/bundles/java/cursor/harness-submit/reference.md +1 -1
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/cursor/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/java/cursor/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/java/cursor/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/java/cursor/scripts/harness_context.py +71 -8
- package/harness/bundles/java/cursor/scripts/harness_deploy.py +2 -2
- package/harness/bundles/java/cursor/scripts/harness_events.py +17 -11
- package/harness/bundles/java/cursor/scripts/harness_gate.py +95 -10
- package/harness/bundles/java/cursor/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/cursor/scripts/harness_profile.py +3 -3
- package/harness/bundles/java/pi/.harness-build.json +1 -1
- package/harness/bundles/java/pi/CONTEXT.md +1 -1
- package/harness/bundles/java/pi/README.md +36 -38
- package/harness/bundles/java/pi/contracts/workflow-policy.json +0 -50
- package/harness/bundles/java/pi/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-codebase-map/templates/TESTING.md +1 -1
- package/harness/bundles/java/pi/harness-execute/SKILL.md +49 -17
- package/harness/bundles/java/pi/harness-execute/coding-checklist.md +252 -0
- package/harness/bundles/java/pi/harness-execute/coding-reference.md +820 -0
- package/harness/bundles/java/pi/harness-execute/protocols.md +141 -0
- package/harness/bundles/java/pi/harness-execute/testing-checklist.md +320 -0
- package/harness/bundles/java/pi/harness-execute/testing-pitfalls-java.md +17 -0
- package/harness/bundles/java/pi/harness-execute/testing-pitfalls.md +307 -0
- package/harness/bundles/java/pi/harness-execute/testing-reference.md +792 -0
- package/harness/bundles/java/pi/harness-knowledge-ingest/SKILL.md +7 -1
- package/harness/bundles/java/pi/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-package/checklist.md +7 -7
- package/harness/bundles/java/pi/harness-plan/SKILL.md +3 -3
- package/harness/bundles/java/pi/harness-plan/checklist.md +2 -1
- package/harness/bundles/java/pi/harness-plan/reference.md +8 -0
- package/harness/bundles/java/pi/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-review/SKILL.md +3 -3
- package/harness/bundles/java/pi/harness-review/checklist.md +1 -1
- package/harness/bundles/java/pi/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-submit/checklist.md +1 -1
- package/harness/bundles/java/pi/harness-submit/reference.md +1 -1
- package/harness/bundles/java/pi/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/pi/protocols/evidence-based-reporting-protocol.md +1 -1
- package/harness/bundles/java/pi/protocols/ledger-protocol.md +8 -8
- package/harness/bundles/java/pi/protocols/sensitive-info-protocol.md +2 -2
- package/harness/bundles/java/pi/scripts/harness_context.py +71 -8
- package/harness/bundles/java/pi/scripts/harness_deploy.py +2 -2
- package/harness/bundles/java/pi/scripts/harness_events.py +17 -11
- package/harness/bundles/java/pi/scripts/harness_gate.py +95 -10
- package/harness/bundles/java/pi/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/pi/scripts/harness_profile.py +3 -3
- package/harness/manifests/general/claude-code.json +62 -70
- package/harness/manifests/general/codebuddy.json +62 -70
- package/harness/manifests/general/codex.json +62 -70
- package/harness/manifests/general/cursor.json +62 -70
- package/harness/manifests/general/pi.json +62 -70
- package/harness/manifests/java/claude-code.json +65 -73
- package/harness/manifests/java/codebuddy.json +65 -73
- package/harness/manifests/java/codex.json +65 -73
- package/harness/manifests/java/cursor.json +65 -73
- package/harness/manifests/java/pi.json +65 -73
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +0 -207
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +0 -270
- package/harness/bundles/general/claude-code/harness-test/pitfalls-java.md +0 -14
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +0 -188
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +0 -250
- package/harness/bundles/general/codebuddy/harness-test/pitfalls-java.md +0 -14
- package/harness/bundles/general/codex/harness-run/SKILL.md +0 -188
- package/harness/bundles/general/codex/harness-test/SKILL.md +0 -250
- package/harness/bundles/general/codex/harness-test/pitfalls-java.md +0 -14
- package/harness/bundles/general/cursor/harness-run/SKILL.md +0 -188
- package/harness/bundles/general/cursor/harness-test/SKILL.md +0 -250
- package/harness/bundles/general/cursor/harness-test/pitfalls-java.md +0 -14
- package/harness/bundles/general/pi/harness-run/SKILL.md +0 -188
- package/harness/bundles/general/pi/harness-run/checklist.md +0 -279
- package/harness/bundles/general/pi/harness-run/protocols.md +0 -141
- package/harness/bundles/general/pi/harness-run/reference.md +0 -886
- package/harness/bundles/general/pi/harness-test/SKILL.md +0 -250
- package/harness/bundles/general/pi/harness-test/checklist.md +0 -359
- package/harness/bundles/general/pi/harness-test/pitfalls-java.md +0 -14
- package/harness/bundles/general/pi/harness-test/pitfalls.md +0 -307
- package/harness/bundles/general/pi/harness-test/reference.md +0 -880
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +0 -225
- package/harness/bundles/java/claude-code/harness-run/protocols.md +0 -141
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +0 -284
- package/harness/bundles/java/claude-code/harness-test/pitfalls.md +0 -307
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +0 -206
- package/harness/bundles/java/codebuddy/harness-run/protocols.md +0 -141
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +0 -264
- package/harness/bundles/java/codebuddy/harness-test/pitfalls.md +0 -307
- package/harness/bundles/java/codex/harness-run/SKILL.md +0 -206
- package/harness/bundles/java/codex/harness-run/protocols.md +0 -141
- package/harness/bundles/java/codex/harness-test/SKILL.md +0 -264
- package/harness/bundles/java/codex/harness-test/pitfalls.md +0 -307
- package/harness/bundles/java/cursor/harness-run/SKILL.md +0 -206
- package/harness/bundles/java/cursor/harness-run/protocols.md +0 -141
- package/harness/bundles/java/cursor/harness-test/SKILL.md +0 -264
- package/harness/bundles/java/cursor/harness-test/pitfalls.md +0 -307
- package/harness/bundles/java/pi/harness-run/SKILL.md +0 -206
- package/harness/bundles/java/pi/harness-run/checklist.md +0 -252
- package/harness/bundles/java/pi/harness-run/protocols.md +0 -141
- package/harness/bundles/java/pi/harness-run/reference.md +0 -820
- package/harness/bundles/java/pi/harness-test/SKILL.md +0 -264
- package/harness/bundles/java/pi/harness-test/checklist.md +0 -320
- package/harness/bundles/java/pi/harness-test/pitfalls-java.md +0 -16
- package/harness/bundles/java/pi/harness-test/pitfalls.md +0 -307
- package/harness/bundles/java/pi/harness-test/reference.md +0 -792
- /package/harness/bundles/general/claude-code/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
- /package/harness/bundles/general/codebuddy/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
- /package/harness/bundles/general/codex/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
- /package/harness/bundles/general/cursor/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
- /package/harness/bundles/general/pi/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
- /package/harness/bundles/java/claude-code/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
- /package/harness/bundles/java/codebuddy/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
- /package/harness/bundles/java/codex/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
- /package/harness/bundles/java/cursor/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
- /package/harness/bundles/java/pi/{harness-test → harness-execute}/scripts/runtime-helpers.mjs +0 -0
|
@@ -376,6 +376,14 @@ finalize 硬性要求证据包顶层 `adversarial_review` 收据,缺失即 `PL
|
|
|
376
376
|
1. 先完成阶段 7.5 对抗评审,把结论写成草稿 `meta/plan-review-draft.json`:
|
|
377
377
|
`{ "reviewer_identity": "inline:<标识>", "findings": [] }`
|
|
378
378
|
(`review_mode` 缺省 `inline`;`completed_at` 缺省取当前时间;`findings` 为空数组表示无发现)
|
|
379
|
+
|
|
380
|
+
**草稿完整契约**(0.4.11 起可 `plan review-record --print-template` 取合法骨架):
|
|
381
|
+
顶层键集精确为 `reviewer_identity / review_mode? / findings? / completed_at?`;
|
|
382
|
+
`reviewer_identity` 匹配 `^[a-z][a-z0-9_.:-]{0,159}$`。`findings` 元素键集精确为
|
|
383
|
+
`finding_id / category / severity / source_refs / message_zh / suggested_location`,
|
|
384
|
+
其中 `severity ∈ {advisory, blocking}`、`source_refs` 至少一条非空字符串、
|
|
385
|
+
`finding_id` 同上面的 identity 规则。缺键/多键/枚举越界都会在
|
|
386
|
+
`PLAN_REVIEW_RECORD_INPUT_INVALID` 的 `problems[]` 里逐条给出 `field_path`。
|
|
379
387
|
2. 跑 `plan review-record`:CLI 内部重跑 layer1/layer2/layer3 算出权威 `input_hash`,
|
|
380
388
|
代算 `findings_hash`,把完整收据写回证据包顶层 `adversarial_review`(缺省覆盖 `--input`,
|
|
381
389
|
可用 `--output` 写到别处)。stdout 的 `review_required: false` 表示该包未触发评审、收据不会被消费。
|
|
@@ -3,7 +3,7 @@ name: harness-pull
|
|
|
3
3
|
description: 从 Hunter Platform 下拉配置/规则/架构/指令(及显式来源分支的分支文件恢复)。仅当用户显式调用
|
|
4
4
|
/harness-pull 或明确说'从平台拉取/恢复'时使用;不得自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-pull — 从 Hunter Platform 下拉与恢复
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-push
|
|
|
3
3
|
description: 上传本地配置/规则/架构/指令(及显式归档)到 Hunter Platform。仅当用户显式调用 /harness-push
|
|
4
4
|
或明确说'上传到平台'时使用;不得因存在本地修改就自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-push — 上传到 Hunter Platform
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -4,7 +4,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
|
|
|
4
4
|
.harness/context-index.json)和测试场景表,在隔离上下文运行。仅当用户显式调用 /harness-review 时使用;不得在
|
|
5
5
|
test 结束后自动接续执行。
|
|
6
6
|
---
|
|
7
|
-
<!-- generated by harness_deploy.py; core=
|
|
7
|
+
<!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
|
|
8
8
|
# harness-review — 代码审查
|
|
9
9
|
|
|
10
10
|
## Purpose
|
|
@@ -25,7 +25,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
|
|
|
25
25
|
## 前置条件
|
|
26
26
|
|
|
27
27
|
- `.harness/changes/<change-name>/plans/<change-name>-plan.md` 存在(任务真相源)
|
|
28
|
-
- 必须读取 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 且 worktree 已创建 → 在 worktree 目录中执行审查;`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-
|
|
28
|
+
- 必须读取 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 且 worktree 已创建 → 在 worktree 目录中执行审查;`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-execute`,不得静默回主目录
|
|
29
29
|
- **review 不阻塞后续流程**:test 报告缺失或未运行不阻止 review(review 是参考性阶段),但应在报告中标注 test 状态供参考
|
|
30
30
|
|
|
31
31
|
## 统一读取协议
|
|
@@ -49,7 +49,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
|
|
|
49
49
|
先用 `harness_context.py prepare --phase review --executor <tool> [--change <id>] --json` 与 `harness_context.py begin --phase review --change <id> --executor <tool> --json` 解析唯一 active change 并校验实际前序 receipt;多个 active change 未显式选择时返回 `ACTIVE_CHANGE_AMBIGUOUS`,禁止再按 Glob/mtime 猜测。阶段门禁使用 `harness_gate.py begin --phase review --change <id> --task <n> --skills-root <skills-root> --executor-tool <tool> --json`;结束时只执行一次 `harness_gate.py close`,正常路径的 `--to-phase` 取 `plannedPhases` 中 review 的后继,Fixback 才返回 run。由 gate 完成阶段事件、租约、上下文交接与远端补传。不得手工追加阶段边界或再次调用 context close;任一 close 失败不得宣称评审完成。
|
|
50
50
|
|
|
51
51
|
0. **启动准备** — 确定变更名(Glob `.harness/changes/*/plans/*-plan.md`,排除 `.harness/archive/*/`,读 frontmatter 提取 change-name);**append `phase.start` 事件**(不得等审查完成才补)
|
|
52
|
-
1. **读取 worktree 状态(门禁检查)** — 读 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 但 worktree 不存在 → 停止并提示先修复 `harness-
|
|
52
|
+
1. **读取 worktree 状态(门禁检查)** — 读 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 但 worktree 不存在 → 停止并提示先修复 `harness-execute`,不得静默回主目录(否则 git diff 为空);`requested=true` 且 worktree 已创建 → spawned agent 用该 worktree 路径执行 `git diff`(确保审查 worktree 变更而非主目录);`requested=false` → 审查主目录变更
|
|
53
53
|
<!-- @section-id review.delegate -->
|
|
54
54
|
### 2. 审查执行(独立评审优先)
|
|
55
55
|
|
|
@@ -8,7 +8,7 @@ description: harness-review 的6维度审查检查项详细列表。仅在执行
|
|
|
8
8
|
|
|
9
9
|
用 Glob 搜索 `.harness/changes/*/plans/*-plan.md`(**排除 `.harness/archive/*/`**),读取 frontmatter 提取 `change-name`。默认最多一个未归档变更;如有多个,优先取最近修改的,或询问用户。后续所有路径基于此变更名。
|
|
10
10
|
|
|
11
|
-
**读取 worktree 状态**:读 `.harness/changes/<change-name>/meta/worktree.json`。`requested=true` 且 worktree 已创建 → 后续 `git diff` 的 `<项目路径>` 用 worktree 路径(`.worktrees/<change-name>`);`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-
|
|
11
|
+
**读取 worktree 状态**:读 `.harness/changes/<change-name>/meta/worktree.json`。`requested=true` 且 worktree 已创建 → 后续 `git diff` 的 `<项目路径>` 用 worktree 路径(`.worktrees/<change-name>`);`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-execute`,不得静默回主目录。
|
|
12
12
|
|
|
13
13
|
## 审查流程
|
|
14
14
|
|
|
@@ -3,7 +3,7 @@ name: harness-submit
|
|
|
3
3
|
description: 最终提交封装:验证→中文 commit→提交/推送;worktree 模式含 --no-ff 合并回主分支。仅当用户显式调用
|
|
4
4
|
/harness-submit(或 /harness-merge 重入合并段)时使用;用户口头说'提交/commit/push'时必须先确认,不得自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-submit — 最终提交(含 worktree 合并)
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -33,7 +33,7 @@ description: harness-submit 的8 步工作流详细步骤和执行日志记录
|
|
|
33
33
|
1. 通过 state layout resolver 读取权威 `evidence/verification-ledger.json`,记录 `diffHash` / `currentHead` / `unitTest` / `apiTest` 状态;split-v1 不得回退复制到 contract 目录
|
|
34
34
|
2. 执行 `harness_ledger.py diff-hash --repo . --base <baseCommit> --change-dir ".harness/changes/<change-name>" --json` 计算当前 diffHash;manifest 校验失败即停止,不得绕过后与 ledger 比对
|
|
35
35
|
3. 若 test 之后有代码变更(当前 diffHash ≠ test 完成时的 diffHash),按 7 类对 post-test diff 分类(见 `../protocols/ledger-protocol.md` 第六章),写入 ledger 的 `postTestClassification`
|
|
36
|
-
4. 行为性变更(BEHAVIORAL_SERVICE_CHANGE / API_CONTRACT_CHANGE / SQL_OR_MAPPER_CHANGE / SECURITY_OR_PERMISSION_CHANGE)→ **停止 submit**,提示先重跑 `/harness-
|
|
36
|
+
4. 行为性变更(BEHAVIORAL_SERVICE_CHANGE / API_CONTRACT_CHANGE / SQL_OR_MAPPER_CHANGE / SECURITY_OR_PERMISSION_CHANGE)→ **停止 submit**,提示先重跑 `/harness-execute` 相关场景
|
|
37
37
|
5. 非行为性变更(NON_BEHAVIORAL_CLEANUP / COMMENT_ONLY / TEST_ONLY)→ 可继续 submit,但后续验证按复用规则处理
|
|
38
38
|
|
|
39
39
|
**append `phase.start` 事件**(`harness_events.py append`;`note` 含 ledger diffHash、post-test 分类、验证策略):
|
|
@@ -136,7 +136,7 @@ powershell.exe -NoProfile -Command "git -C '<项目路径>' log HEAD..@{u} --one
|
|
|
136
136
|
powershell.exe -Command "[System.IO.Directory]::Delete('<worktree-path>', $true)"
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
-
4. **ExitWorktree 工具限制**:`ExitWorktree(remove)` 只删由 `EnterWorktree` 创建的 worktree。若本会话进入的是已存在 worktree(由 `harness-
|
|
139
|
+
4. **ExitWorktree 工具限制**:`ExitWorktree(remove)` 只删由 `EnterWorktree` 创建的 worktree。若本会话进入的是已存在 worktree(由 `harness-execute` 创建),工具会拒绝删除。此时用 `action:keep` 返回主仓库,再按上述 1-3 步手动清理。
|
|
140
140
|
|
|
141
141
|
5. **清理后更新 `meta/worktree.json`**:置 `created=false` + 追加 `removedAt`/`removedBy`/`removalNote`,记录产出保留待 `/harness-archive`。
|
|
142
142
|
|
|
@@ -4,7 +4,7 @@ description: Use when the user asks to synchronize, refresh, or validate Harness
|
|
|
4
4
|
metadata, adapters, remote knowledge ownership, instruction entrypoints,
|
|
5
5
|
config origins, or CodeGraph status.
|
|
6
6
|
---
|
|
7
|
-
<!-- generated by harness_deploy.py; core=
|
|
7
|
+
<!-- generated by harness_deploy.py; core=7c08c3960f78dc1a; overlay=none; agent=codebuddy; do not edit -->
|
|
8
8
|
# harness-sync
|
|
9
9
|
|
|
10
10
|
## Purpose
|
|
@@ -42,7 +42,7 @@ description: harness 全流程的证据化报告协议。所有 skill 输出必
|
|
|
42
42
|
| 情况 | 状态标记 | 报告表述 |
|
|
43
43
|
|------|:--------:|----------|
|
|
44
44
|
| 测试命令输出包含测试通过证据(Java=`Tests run: N, Failures: 0`;前端/Python 按各自工具) | ✅ | ✅ 已测试通过:N 个用例,0 失败 |
|
|
45
|
-
| TDD 降级(无测试基础设施) | 🟡 | 🟡 静态验证通过,未执行真实单元测试,待测试基础设施补齐后运行 harness-
|
|
45
|
+
| TDD 降级(无测试基础设施) | 🟡 | 🟡 静态验证通过,未执行真实单元测试,待测试基础设施补齐后运行 harness-execute |
|
|
46
46
|
| 测试命令被 hook 拒绝 | ❌ | ❌ 测试命令被拒绝,无法确认测试结果 |
|
|
47
47
|
| 测试失败(有 Failures > 0) | ❌ | ❌ 测试失败:N 个用例,M 个失败 |
|
|
48
48
|
| 用户确认跳过测试 | 🟡 | 🟡 用户确认跳过测试 |
|
|
@@ -4,7 +4,7 @@ description: verification-ledger、diffHash、service-fingerprint 的统一协
|
|
|
4
4
|
|
|
5
5
|
# Ledger Protocol
|
|
6
6
|
|
|
7
|
-
> 本协议被 harness-plan / harness-
|
|
7
|
+
> 本协议被 harness-plan / harness-execute / harness-execute / harness-submit / harness-archive 共同引用。
|
|
8
8
|
> 目标:消除跨阶段重复编译/测试,让每个"✅ 已验证"结论可追溯、可复用,避免 post-test 小改动导致前序报告有效性表达不清。
|
|
9
9
|
|
|
10
10
|
## 一、为什么需要 verification-ledger
|
|
@@ -156,7 +156,7 @@ verification-ledger 把每次验证(compile / unit test / api test / package
|
|
|
156
156
|
"moduleInputsHash": "sha256:<依赖闭包内容指纹>",
|
|
157
157
|
"moduleInputsFiles": ["<project>/Svc.java", "..."],
|
|
158
158
|
"profile": "local-dev-remote-sdk",
|
|
159
|
-
"overlayPath": "C:/temp/harness-
|
|
159
|
+
"overlayPath": "C:/temp/harness-execute-overlay/<change>/application-harness-execute.yml",
|
|
160
160
|
"startCommandHash": "sha256:<command 指纹>",
|
|
161
161
|
"command": "<serviceStart.command>",
|
|
162
162
|
"startedAt": "..."
|
|
@@ -165,7 +165,7 @@ verification-ledger 把每次验证(compile / unit test / api test / package
|
|
|
165
165
|
|
|
166
166
|
`moduleInputsHash` 由 CLI `--files` ∪ `build-profile.json` 的 `serviceStart.inputFiles`(glob 列表,相对 project 展开)计算。**空输入被拒绝**(exit 非 0),不得生成可复用的空指纹(§5.1/§5.2)。
|
|
167
167
|
|
|
168
|
-
复用必须**同时**满足(§5.3):`moduleInputsHash` 一致、`startCommandHash` 一致、`profile` 一致、`overlayPath` 一致、进程身份(pid 存活 + create time 匹配 `startedAt`)可确认。任一变化 -> AI 自动 restart;身份无法确认 -> `needs-user-decision`;非 AI 用户进程永不自动 kill。否则必须进入 Service Decision Gate(见 harness-
|
|
168
|
+
复用必须**同时**满足(§5.3):`moduleInputsHash` 一致、`startCommandHash` 一致、`profile` 一致、`overlayPath` 一致、进程身份(pid 存活 + create time 匹配 `startedAt`)可确认。任一变化 -> AI 自动 restart;身份无法确认 -> `needs-user-decision`;非 AI 用户进程永不自动 kill。否则必须进入 Service Decision Gate(见 harness-execute)。
|
|
169
169
|
|
|
170
170
|
### 4.2 unitTestFull 最终全量门禁
|
|
171
171
|
|
|
@@ -216,13 +216,13 @@ harness_ledger.py diff-hash --repo <projectRoot> --base <baseCommit> --change-di
|
|
|
216
216
|
- manifest 存在时必须严格验证 schema/mode/projectRoot、精确相对路径、文件存在性与 SHA-256;结构非法、路径越界或 hash 漂移均非零退出,旧 ledger 不得复用。
|
|
217
217
|
- ignored test 在 checkpoint 前由 manifest 加入内容集;经 guard force-stage/commit 后由 Git diff 加入同一路径,集合去重,因此 hash 保持不变。
|
|
218
218
|
- diffHash 只用于"内容是否变化"判断,不等于 commit hash
|
|
219
|
-
- 账本中 `currentHead`(验证时 HEAD)与 `diffHash` 分开记录;reuse 规则 #2 允许 HEAD 前移(如 harness-
|
|
219
|
+
- 账本中 `currentHead`(验证时 HEAD)与 `diffHash` 分开记录;reuse 规则 #2 允许 HEAD 前移(如 harness-execute Step 5 checkpoint commit),因 diffHash 已 commit-invariant,HEAD 前移不改变指纹
|
|
220
220
|
- **禁止**使用类似 `3files-84plus-5minus` 的描述性字符串作为复用依据
|
|
221
221
|
- **禁止**删除/忽略 test-tracking manifest 后继续复用,也禁止用手写 Git/Node/PowerShell hash 替代 canonical 命令。
|
|
222
222
|
|
|
223
223
|
## 六、Post-test 变更分类
|
|
224
224
|
|
|
225
|
-
当 `/harness-
|
|
225
|
+
当 `/harness-execute` 完成后又发生代码变更(常见于 review 后清理、submit 前发现的小问题),后续 submit/package/archive **必须先对变更做分类**,写入 ledger 的 `postTestClassification`:
|
|
226
226
|
|
|
227
227
|
| 类型 | 示例 | 是否需要重跑 API | 是否需要重跑 unit | 是否需要重 compile |
|
|
228
228
|
|------|------|:---:|:---:|:---:|
|
|
@@ -245,15 +245,15 @@ post-test 变更: NON_BEHAVIORAL_CLEANUP
|
|
|
245
245
|
API 测试: 🔁 复用上一轮结果(diffHash 未变 / 仅清理性变更)
|
|
246
246
|
```
|
|
247
247
|
|
|
248
|
-
**行为性变更**:必须重新运行 `/harness-
|
|
248
|
+
**行为性变更**:必须重新运行 `/harness-execute` 的相关场景(至少覆盖变更影响的接口/权限/SQL),ledger 对应项作废并重写。
|
|
249
249
|
|
|
250
250
|
## 七、各阶段与 ledger 的交互
|
|
251
251
|
|
|
252
252
|
| 阶段 | 读 ledger | 写 ledger |
|
|
253
253
|
|------|:---:|:---:|
|
|
254
254
|
| harness-plan | 计划起点读(了解前序变更状态/已有 ledger,作为复用链起点) | 计划落定后写初始 ledger(changeName/module/profile/baseCommit/diffHash 占位) |
|
|
255
|
-
| harness-
|
|
256
|
-
| harness-
|
|
255
|
+
| harness-execute | 步骤 2 前读(确认是否已有 compile/unitTest 可复用) | 步骤 2 后写 compile + unitTest(若跑了全量测试) |
|
|
256
|
+
| harness-execute | Phase 1 前读(复用 run 的 unitTest) | Phase 1/2 后写 unitTest + apiTest |
|
|
257
257
|
| harness-submit | 验证前读(复用 test 的 compile/unitTest) | 若重跑则写回 |
|
|
258
258
|
| harness-archive | 归档前读(汇总各阶段状态,写入 `summary-data.json` 并上传平台) | 不写(归档时一并移入 archive) |
|
|
259
259
|
|
|
@@ -98,13 +98,13 @@ spring:
|
|
|
98
98
|
> `HUNTER_HARNESS_SENSITIVE_SCAN=block` 才恢复阻断、`=off` 完全关闭。
|
|
99
99
|
> 门禁放行不等于内容可以带明文凭据——本节的要求始终成立。
|
|
100
100
|
|
|
101
|
-
profile `build-profile.json`、规则文档、Skill Markdown **不得包含凭据明文值**(spec §3.4 凭据边界:配置只含 env key、cache path、角色,不含值)。发布前用 `harness-
|
|
101
|
+
profile `build-profile.json`、规则文档、Skill Markdown **不得包含凭据明文值**(spec §3.4 凭据边界:配置只含 env key、cache path、角色,不含值)。发布前用 `harness-execute/scripts/runtime-helpers.mjs` 的 `findCredentialValues(text)` 扫描:
|
|
102
102
|
|
|
103
103
|
- 命中 `password/token/secret/accessKey/Authorization: Bearer/jdbc password=` 等明文值 → ❌FAIL,必须改为占位符 `<*_REDACTED>` 或 env 引用 `${ENV}` / `$ENV`。
|
|
104
104
|
- 占位符 `<TOKEN_REDACTED>` 与 env 引用 `${TEST_TOKEN}` / `$DB_PASSWORD` 不报(credential 配置允许 env key)。
|
|
105
105
|
|
|
106
106
|
```js
|
|
107
|
-
import { findCredentialValues } from '<skills-root>/harness-
|
|
107
|
+
import { findCredentialValues } from '<skills-root>/harness-execute/scripts/runtime-helpers.mjs';
|
|
108
108
|
const findings = findCredentialValues(fs.readFileSync('build-profile.json', 'utf8'));
|
|
109
109
|
if (findings.length > 0) { /* ❌FAIL: 列出 line/code/snippet,改为 env key 或占位符 */ }
|
|
110
110
|
```
|
|
@@ -478,6 +478,55 @@ def _phase_has_ended(event_paths: list[Path], phase: str) -> bool:
|
|
|
478
478
|
)
|
|
479
479
|
|
|
480
480
|
|
|
481
|
+
def _ensure_phase_end_event(
|
|
482
|
+
contract_root: Path,
|
|
483
|
+
*,
|
|
484
|
+
phase: str,
|
|
485
|
+
status: str,
|
|
486
|
+
executor: str,
|
|
487
|
+
) -> dict[str, Any] | None:
|
|
488
|
+
"""补齐 phase.start/end 事件对(P0-2)。
|
|
489
|
+
|
|
490
|
+
平台 Run 计时由 events-sync 上报的 phase.start/end 事件对驱动。不经
|
|
491
|
+
gate close 收尾的阶段(典型:plan 走 finalize + context close)只写
|
|
492
|
+
transitions 收据,phase.end 永远缺席,平台计时永不停——连续两个 change
|
|
493
|
+
复现,属结构性缺口(2026-08-30 sales-insight-agent demo-datasource 实测)。
|
|
494
|
+
close_transition 是所有跨阶段推进的共同通道,在此按事件配对补齐:
|
|
495
|
+
有 start 无 end → 复用 start 的 run_id/attempt 代写 end;已有 end(gate
|
|
496
|
+
close 先行写入)或连 start 都没有 → 不动,返回 None。
|
|
497
|
+
"""
|
|
498
|
+
import harness_events as he
|
|
499
|
+
|
|
500
|
+
events_file = contract_root / "events.ndjson"
|
|
501
|
+
events = _read_ndjson(events_file)
|
|
502
|
+
starts = [
|
|
503
|
+
item
|
|
504
|
+
for item in events
|
|
505
|
+
if hpaths.resolve_phase_name(item.get("phase")) == phase
|
|
506
|
+
and item.get("type") == "phase.start"
|
|
507
|
+
]
|
|
508
|
+
if not starts or any(
|
|
509
|
+
hpaths.resolve_phase_name(item.get("phase")) == phase
|
|
510
|
+
and item.get("type") == "phase.end"
|
|
511
|
+
for item in events
|
|
512
|
+
):
|
|
513
|
+
return None
|
|
514
|
+
start = starts[-1]
|
|
515
|
+
result = he.append_event(
|
|
516
|
+
contract_root,
|
|
517
|
+
phase=phase,
|
|
518
|
+
type_="phase.end",
|
|
519
|
+
run_id=str(start.get("run_id") or f"{phase}_unknown"),
|
|
520
|
+
attempt=int(start.get("attempt") or 1),
|
|
521
|
+
status=status,
|
|
522
|
+
executor_tool=executor,
|
|
523
|
+
note="context close 自动补齐 phase.end(平台计时事件对配对)",
|
|
524
|
+
)
|
|
525
|
+
if not result.get("ok"):
|
|
526
|
+
return {"code": "PHASE_END_PAIR_FAILED", "detail": result}
|
|
527
|
+
return {"code": "PHASE_END_AUTO_PAIRED", "event": result.get("event")}
|
|
528
|
+
|
|
529
|
+
|
|
481
530
|
def _reselect_review_fixback(
|
|
482
531
|
project: Path,
|
|
483
532
|
change: str,
|
|
@@ -1334,6 +1383,12 @@ def close_transition(
|
|
|
1334
1383
|
and latest.get("artifacts") == artifact_entries
|
|
1335
1384
|
and (executor is None or latest.get("executor") == executor)
|
|
1336
1385
|
):
|
|
1386
|
+
paired = _ensure_phase_end_event(
|
|
1387
|
+
contract_root,
|
|
1388
|
+
phase=from_phase,
|
|
1389
|
+
status=status,
|
|
1390
|
+
executor=executor or str(latest.get("executor") or "unknown"),
|
|
1391
|
+
)
|
|
1337
1392
|
return {
|
|
1338
1393
|
"ok": True,
|
|
1339
1394
|
"code": "TRANSITION_ALREADY_CLOSED",
|
|
@@ -1341,6 +1396,7 @@ def close_transition(
|
|
|
1341
1396
|
"receipt": latest,
|
|
1342
1397
|
"path": str(paths["transitions"]),
|
|
1343
1398
|
"invalidation": None,
|
|
1399
|
+
"phaseEndPair": paired,
|
|
1344
1400
|
}
|
|
1345
1401
|
return {"ok": False, "code": "CONTEXT_LEASE_REQUIRED"}
|
|
1346
1402
|
try:
|
|
@@ -1397,6 +1453,12 @@ def close_transition(
|
|
|
1397
1453
|
receipt["receiptHash"] = _payload_hash(receipt)
|
|
1398
1454
|
_append_ndjson(paths["transitions"], receipt)
|
|
1399
1455
|
paths["lease"].unlink(missing_ok=True)
|
|
1456
|
+
paired = _ensure_phase_end_event(
|
|
1457
|
+
contract_root,
|
|
1458
|
+
phase=from_phase,
|
|
1459
|
+
status=status,
|
|
1460
|
+
executor=effective_executor,
|
|
1461
|
+
)
|
|
1400
1462
|
invalidation = None
|
|
1401
1463
|
if to_phase == "execute" and from_phase in {"execute", "review"}:
|
|
1402
1464
|
invalidation = _invalidate_for_fixback(
|
|
@@ -1411,6 +1473,7 @@ def close_transition(
|
|
|
1411
1473
|
"receipt": receipt,
|
|
1412
1474
|
"path": str(paths["transitions"]),
|
|
1413
1475
|
"invalidation": invalidation,
|
|
1476
|
+
"phaseEndPair": paired,
|
|
1414
1477
|
}
|
|
1415
1478
|
|
|
1416
1479
|
|
|
@@ -1898,7 +1961,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1898
1961
|
prepare = sub.add_parser("prepare")
|
|
1899
1962
|
prepare.add_argument("--json", action="store_true")
|
|
1900
1963
|
prepare.add_argument("--project", required=True, type=Path)
|
|
1901
|
-
prepare.add_argument("--change")
|
|
1964
|
+
prepare.add_argument("--change", "--change-dir", dest="change")
|
|
1902
1965
|
prepare.add_argument("--phase", required=True)
|
|
1903
1966
|
prepare.add_argument("--executor", required=True)
|
|
1904
1967
|
prepare.add_argument("--title")
|
|
@@ -1907,7 +1970,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1907
1970
|
bootstrap = sub.add_parser("bootstrap-plan")
|
|
1908
1971
|
bootstrap.add_argument("--json", action="store_true")
|
|
1909
1972
|
bootstrap.add_argument("--project", required=True, type=Path)
|
|
1910
|
-
bootstrap.add_argument("--change", required=True)
|
|
1973
|
+
bootstrap.add_argument("--change", "--change-dir", dest="change", required=True)
|
|
1911
1974
|
bootstrap.add_argument("--executor", required=True)
|
|
1912
1975
|
bootstrap.add_argument("--title")
|
|
1913
1976
|
bootstrap.add_argument("--stage", default="plan", choices=["plan", "post-run"])
|
|
@@ -1915,7 +1978,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1915
1978
|
close = sub.add_parser("close")
|
|
1916
1979
|
close.add_argument("--json", action="store_true")
|
|
1917
1980
|
close.add_argument("--project", required=True, type=Path)
|
|
1918
|
-
close.add_argument("--change", required=True)
|
|
1981
|
+
close.add_argument("--change", "--change-dir", dest="change", required=True)
|
|
1919
1982
|
close.add_argument("--from-phase", required=True)
|
|
1920
1983
|
close.add_argument("--to-phase", required=True)
|
|
1921
1984
|
close.add_argument("--executor", required=True)
|
|
@@ -1924,7 +1987,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1924
1987
|
begin = sub.add_parser("begin")
|
|
1925
1988
|
begin.add_argument("--json", action="store_true")
|
|
1926
1989
|
begin.add_argument("--project", required=True, type=Path)
|
|
1927
|
-
begin.add_argument("--change", required=True)
|
|
1990
|
+
begin.add_argument("--change", "--change-dir", dest="change", required=True)
|
|
1928
1991
|
begin.add_argument("--phase", required=True)
|
|
1929
1992
|
begin.add_argument("--executor", required=True)
|
|
1930
1993
|
handoff = sub.add_parser(
|
|
@@ -1933,7 +1996,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1933
1996
|
)
|
|
1934
1997
|
handoff.add_argument("--json", action="store_true")
|
|
1935
1998
|
handoff.add_argument("--project", required=True, type=Path)
|
|
1936
|
-
handoff.add_argument("--change", required=True)
|
|
1999
|
+
handoff.add_argument("--change", "--change-dir", dest="change", required=True)
|
|
1937
2000
|
handoff.add_argument("--to-phase", required=True)
|
|
1938
2001
|
handoff.add_argument(
|
|
1939
2002
|
"--from-phase",
|
|
@@ -1946,20 +2009,20 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1946
2009
|
)
|
|
1947
2010
|
renew.add_argument("--json", action="store_true")
|
|
1948
2011
|
renew.add_argument("--project", required=True, type=Path)
|
|
1949
|
-
renew.add_argument("--change", required=True)
|
|
2012
|
+
renew.add_argument("--change", "--change-dir", dest="change", required=True)
|
|
1950
2013
|
renew.add_argument("--executor", required=True)
|
|
1951
2014
|
renew.add_argument("--ttl-seconds", type=int, default=3600)
|
|
1952
2015
|
configure = sub.add_parser("configure-plan")
|
|
1953
2016
|
configure.add_argument("--json", action="store_true")
|
|
1954
2017
|
configure.add_argument("--project", required=True, type=Path)
|
|
1955
|
-
configure.add_argument("--change", required=True)
|
|
2018
|
+
configure.add_argument("--change", "--change-dir", dest="change", required=True)
|
|
1956
2019
|
configure.add_argument("--phases", required=True)
|
|
1957
2020
|
configure.add_argument("--operator", required=True)
|
|
1958
2021
|
configure.add_argument("--reason", required=True)
|
|
1959
2022
|
view = sub.add_parser("view")
|
|
1960
2023
|
view.add_argument("--json", action="store_true")
|
|
1961
2024
|
view.add_argument("--project", required=True, type=Path)
|
|
1962
|
-
view.add_argument("--change", required=True)
|
|
2025
|
+
view.add_argument("--change", "--change-dir", dest="change", required=True)
|
|
1963
2026
|
return parser
|
|
1964
2027
|
|
|
1965
2028
|
|
|
@@ -479,10 +479,10 @@ def copy_overlay_extras(overlay_dir: Path, out_dir: Path) -> list[str]:
|
|
|
479
479
|
# it must NOT be installed to runtime. Only pitfalls-java.md is runtime.
|
|
480
480
|
pitfalls = overlay_dir / "pitfalls-java.md"
|
|
481
481
|
if pitfalls.is_file():
|
|
482
|
-
test_pit = out_dir / "harness-
|
|
482
|
+
test_pit = out_dir / "harness-execute" / "testing-pitfalls-java.md"
|
|
483
483
|
test_pit.parent.mkdir(parents=True, exist_ok=True)
|
|
484
484
|
shutil.copy2(pitfalls, test_pit)
|
|
485
|
-
extras.append("harness-
|
|
485
|
+
extras.append("harness-execute/testing-pitfalls-java.md")
|
|
486
486
|
return extras
|
|
487
487
|
|
|
488
488
|
|
|
@@ -884,13 +884,19 @@ def build_event(args: argparse.Namespace, existing: list[dict[str, Any]]) -> dic
|
|
|
884
884
|
def validate_append_event(args: argparse.Namespace) -> tuple[str, str] | None:
|
|
885
885
|
"""Validate type-specific append fields before any file is mutated."""
|
|
886
886
|
event_type = str(args.type)
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
887
|
+
missing = [
|
|
888
|
+
f"--{field.replace('_', '-')}"
|
|
889
|
+
for field in _EVENT_REQUIRED_FIELDS.get(event_type, ())
|
|
890
|
+
if getattr(args, field, None) is None
|
|
891
|
+
or (isinstance(getattr(args, field, None), str)
|
|
892
|
+
and not getattr(args, field).strip())
|
|
893
|
+
]
|
|
894
|
+
if missing:
|
|
895
|
+
# 一次性列出全部缺失字段——逐个报错会让调用方每个字段往返一轮(E-3)
|
|
896
|
+
return (
|
|
897
|
+
"EVENT_REQUIRED_FIELD",
|
|
898
|
+
f"EVENT_REQUIRED_FIELD: {event_type} requires " + ", ".join(missing),
|
|
899
|
+
)
|
|
894
900
|
allowed = _EVENT_ALLOWED_FIELDS[event_type]
|
|
895
901
|
for field in OPTIONAL_FIELDS:
|
|
896
902
|
value = getattr(args, field, None)
|
|
@@ -2146,7 +2152,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2146
2152
|
parents=[common],
|
|
2147
2153
|
help="append one event and auto-render execution-log",
|
|
2148
2154
|
)
|
|
2149
|
-
p_append.add_argument("--change-dir", required=True)
|
|
2155
|
+
p_append.add_argument("--change-dir", "--change", dest="change_dir", required=True)
|
|
2150
2156
|
p_append.add_argument("--phase", required=True)
|
|
2151
2157
|
p_append.add_argument("--type", required=True)
|
|
2152
2158
|
p_append.add_argument("--command", default=None)
|
|
@@ -2200,7 +2206,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2200
2206
|
parents=[common],
|
|
2201
2207
|
help="validate and append many events under one lock (H-15)",
|
|
2202
2208
|
)
|
|
2203
|
-
p_batch.add_argument("--change-dir", required=True)
|
|
2209
|
+
p_batch.add_argument("--change-dir", "--change", dest="change_dir", required=True)
|
|
2204
2210
|
p_batch.add_argument(
|
|
2205
2211
|
"--file",
|
|
2206
2212
|
required=True,
|
|
@@ -2213,7 +2219,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2213
2219
|
parents=[common],
|
|
2214
2220
|
help="re-render execution-log.md from events.ndjson",
|
|
2215
2221
|
)
|
|
2216
|
-
p_render.add_argument("--change-dir", required=True)
|
|
2222
|
+
p_render.add_argument("--change-dir", "--change", dest="change_dir", required=True)
|
|
2217
2223
|
p_render.set_defaults(func=cmd_render)
|
|
2218
2224
|
|
|
2219
2225
|
p_summary = sub.add_parser(
|
|
@@ -2221,7 +2227,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
2221
2227
|
parents=[common],
|
|
2222
2228
|
help="summarize phases/issues from events.ndjson",
|
|
2223
2229
|
)
|
|
2224
|
-
p_summary.add_argument("--change-dir", required=True)
|
|
2230
|
+
p_summary.add_argument("--change-dir", "--change", dest="change_dir", required=True)
|
|
2225
2231
|
p_summary.set_defaults(func=cmd_summary)
|
|
2226
2232
|
|
|
2227
2233
|
return parser
|
|
@@ -2220,7 +2220,7 @@ def _validate_scenario_coverage(
|
|
|
2220
2220
|
is due by that phase are required to carry passing receipts. Scenarios
|
|
2221
2221
|
owned by a later phase (e.g. `ownerPhase=test` at `run` close) are
|
|
2222
2222
|
reported under `deferred` instead of blocking the close — this matches the
|
|
2223
|
-
documented hand-off rule in harness-
|
|
2223
|
+
documented hand-off rule in harness-execute/SKILL.md ("ownerPhase=test 按计划移交").
|
|
2224
2224
|
"""
|
|
2225
2225
|
manifest_path = change_dir / "meta" / "scenario-manifest.json"
|
|
2226
2226
|
if not manifest_path.is_file():
|
|
@@ -2594,6 +2594,64 @@ def _normalize_gate_phase(args: argparse.Namespace, as_json: bool) -> int | None
|
|
|
2594
2594
|
)
|
|
2595
2595
|
|
|
2596
2596
|
|
|
2597
|
+
def _verification_target_coverage_warning(
|
|
2598
|
+
change_dir: Path, phase: str
|
|
2599
|
+
) -> dict[str, Any] | None:
|
|
2600
|
+
"""E-5:场景表引用未声明的 verification target 时提前 WARN。
|
|
2601
|
+
|
|
2602
|
+
场景带 execution_level(unit/integration/…),但 build-profile 的
|
|
2603
|
+
verificationGraph.targets 未声明对应 target 时,问题要等到 ledger record
|
|
2604
|
+
才以 unsupported verification 报错——太迟。gate begin 提前列出待补清单。
|
|
2605
|
+
映射约定:unit → unitTest;其他 level → 任一以其名开头的 target。
|
|
2606
|
+
"""
|
|
2607
|
+
if phase != "execute":
|
|
2608
|
+
return None
|
|
2609
|
+
manifest_path = change_dir / "meta" / "scenario-manifest.json"
|
|
2610
|
+
profile_path = change_dir / "meta" / "build-profile.json"
|
|
2611
|
+
if not profile_path.is_file():
|
|
2612
|
+
# build-profile 常规位置在项目 .harness/config/;change meta 下优先
|
|
2613
|
+
profile_path = change_dir.parents[2] / ".harness" / "config" / "build-profile.json"
|
|
2614
|
+
if not manifest_path.is_file() or not profile_path.is_file():
|
|
2615
|
+
return None
|
|
2616
|
+
try:
|
|
2617
|
+
manifest = json.loads(manifest_path.read_text(encoding="utf-8-sig"))
|
|
2618
|
+
profile = json.loads(profile_path.read_text(encoding="utf-8-sig"))
|
|
2619
|
+
except (OSError, json.JSONDecodeError):
|
|
2620
|
+
return None
|
|
2621
|
+
content = manifest.get("content") if isinstance(manifest, dict) else None
|
|
2622
|
+
scenarios = content.get("scenarios") if isinstance(content, dict) else None
|
|
2623
|
+
if not isinstance(scenarios, list):
|
|
2624
|
+
return None
|
|
2625
|
+
levels = sorted({
|
|
2626
|
+
str(s.get("execution_level")).strip()
|
|
2627
|
+
for s in scenarios
|
|
2628
|
+
if isinstance(s, dict) and str(s.get("execution_level") or "").strip()
|
|
2629
|
+
})
|
|
2630
|
+
graph = profile.get("verificationGraph")
|
|
2631
|
+
targets = graph.get("targets") if isinstance(graph, dict) else None
|
|
2632
|
+
target_names = set(targets.keys()) if isinstance(targets, dict) else set()
|
|
2633
|
+
uncovered = [
|
|
2634
|
+
level for level in levels
|
|
2635
|
+
if level != "unit"
|
|
2636
|
+
and not any(name.lower().startswith(level.lower()) for name in target_names)
|
|
2637
|
+
]
|
|
2638
|
+
# unit 场景由 unitTest 覆盖;只在完全没有 unitTest 时才算缺口
|
|
2639
|
+
if "unit" in levels and "unitTest" not in target_names:
|
|
2640
|
+
uncovered.append("unit(→unitTest)")
|
|
2641
|
+
if not uncovered:
|
|
2642
|
+
return None
|
|
2643
|
+
return {
|
|
2644
|
+
"code": "VERIFICATION_TARGETS_UNDECLARED",
|
|
2645
|
+
"message": (
|
|
2646
|
+
"场景表涉及未声明的验证级别: " + ", ".join(uncovered) +
|
|
2647
|
+
";ledger record 将报 unsupported verification。请在 "
|
|
2648
|
+
".harness/config/build-profile.json 的 verificationGraph.targets "
|
|
2649
|
+
"声明对应 target(如 integrationTest)"
|
|
2650
|
+
),
|
|
2651
|
+
"uncoveredLevels": uncovered,
|
|
2652
|
+
}
|
|
2653
|
+
|
|
2654
|
+
|
|
2597
2655
|
def cmd_begin(args: argparse.Namespace) -> int:
|
|
2598
2656
|
as_json = bool(args.json)
|
|
2599
2657
|
normalized = _normalize_gate_phase(args, as_json)
|
|
@@ -2911,6 +2969,14 @@ def cmd_begin(args: argparse.Namespace) -> int:
|
|
|
2911
2969
|
)
|
|
2912
2970
|
raise
|
|
2913
2971
|
|
|
2972
|
+
coverage_warning = _verification_target_coverage_warning(change_dir, args.phase)
|
|
2973
|
+
if coverage_warning is not None:
|
|
2974
|
+
gate_warnings.append(coverage_warning)
|
|
2975
|
+
print(
|
|
2976
|
+
f"[harness-gate] WARNING {coverage_warning['code']}: "
|
|
2977
|
+
f"{coverage_warning['message']}",
|
|
2978
|
+
file=sys.stderr,
|
|
2979
|
+
)
|
|
2914
2980
|
payload = {
|
|
2915
2981
|
"ok": True,
|
|
2916
2982
|
"code": "PHASE_BEGUN",
|
|
@@ -3800,11 +3866,25 @@ def cmd_classify(args: argparse.Namespace) -> int:
|
|
|
3800
3866
|
payload["classifiedAt"] = classified_at
|
|
3801
3867
|
|
|
3802
3868
|
if change_dir is not None and change_dir.is_dir():
|
|
3803
|
-
|
|
3804
|
-
|
|
3805
|
-
|
|
3806
|
-
|
|
3807
|
-
|
|
3869
|
+
finalized = (change_dir / "meta" / "plan-profile.json").is_file()
|
|
3870
|
+
if finalized and not getattr(args, "force", False):
|
|
3871
|
+
# P1-1:classify 形态像只读查询,实际是写操作。已发布的 change
|
|
3872
|
+
# 被误跑 classify 会覆盖 configure-plan 写入的工作副本(2026-08-30
|
|
3873
|
+
# demo-datasource 实测 plannedPhases 被清)。默认拒写并显式提示。
|
|
3874
|
+
payload["policyPersisted"] = False
|
|
3875
|
+
payload["warning"] = (
|
|
3876
|
+
"change 已发布(meta/plan-profile.json 存在),classify 不再重写 "
|
|
3877
|
+
"meta/gate-policy.json 工作副本;确需重算请显式传 --force"
|
|
3878
|
+
)
|
|
3879
|
+
payload["writeGuarded"] = True
|
|
3880
|
+
else:
|
|
3881
|
+
policy_doc = gate_policy_document(payload)
|
|
3882
|
+
policy_path = change_dir / "meta" / "gate-policy.json"
|
|
3883
|
+
_write_json(policy_path, policy_doc)
|
|
3884
|
+
payload["policyPersisted"] = True
|
|
3885
|
+
payload["policyPath"] = str(policy_path)
|
|
3886
|
+
if finalized:
|
|
3887
|
+
payload["warning"] = "--force:已发布 change 的工作副本已被重写"
|
|
3808
3888
|
else:
|
|
3809
3889
|
payload["policyPersisted"] = False
|
|
3810
3890
|
payload["warning"] = (
|
|
@@ -3930,7 +4010,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
3930
4010
|
|
|
3931
4011
|
p_begin = sub.add_parser("begin", parents=[shared])
|
|
3932
4012
|
p_begin.add_argument("--phase", required=True)
|
|
3933
|
-
p_begin.add_argument("--change", default=None)
|
|
4013
|
+
p_begin.add_argument("--change", "--change-dir", dest="change", default=None)
|
|
3934
4014
|
p_begin.add_argument(
|
|
3935
4015
|
"--project",
|
|
3936
4016
|
default=None,
|
|
@@ -3960,7 +4040,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
3960
4040
|
help="关闭阶段门禁(关门只调本命令;上下文交接由 --to-phase 内联完成,不要再单独调 harness_context.py close)",
|
|
3961
4041
|
)
|
|
3962
4042
|
p_close.add_argument("--phase", required=True)
|
|
3963
|
-
p_close.add_argument("--change", default=None)
|
|
4043
|
+
p_close.add_argument("--change", "--change-dir", dest="change", default=None)
|
|
3964
4044
|
p_close.add_argument(
|
|
3965
4045
|
"--project",
|
|
3966
4046
|
default=None,
|
|
@@ -3985,7 +4065,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
3985
4065
|
|
|
3986
4066
|
p_classify = sub.add_parser("classify", parents=[shared])
|
|
3987
4067
|
p_classify.add_argument("--project", default=None, type=Path, help=_PROJECT_ROOT_HELP)
|
|
3988
|
-
p_classify.add_argument("--change", default=None)
|
|
4068
|
+
p_classify.add_argument("--change", "--change-dir", dest="change", default=None)
|
|
3989
4069
|
p_classify.add_argument("--stage", required=True, choices=["plan", "post-run"])
|
|
3990
4070
|
p_classify.add_argument(
|
|
3991
4071
|
"--tier-override",
|
|
@@ -3993,13 +4073,18 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
3993
4073
|
choices=["fast", "standard", "full"],
|
|
3994
4074
|
)
|
|
3995
4075
|
p_classify.add_argument("--override-by", default="user")
|
|
4076
|
+
p_classify.add_argument(
|
|
4077
|
+
"--force",
|
|
4078
|
+
action="store_true",
|
|
4079
|
+
help="已发布 change 也强制重写 gate-policy.json 工作副本",
|
|
4080
|
+
)
|
|
3996
4081
|
p_classify.set_defaults(func=cmd_classify)
|
|
3997
4082
|
|
|
3998
4083
|
p_checkpoint = sub.add_parser("checkpoint", parents=[shared])
|
|
3999
4084
|
p_checkpoint.add_argument("--project", default=None, type=Path, help=_PROJECT_ROOT_HELP)
|
|
4000
4085
|
p_checkpoint.add_argument("checkpoint_action", choices=["status", "approve"])
|
|
4001
4086
|
p_checkpoint.add_argument("--id", required=True)
|
|
4002
|
-
p_checkpoint.add_argument("--change", default=None)
|
|
4087
|
+
p_checkpoint.add_argument("--change", "--change-dir", dest="change", default=None)
|
|
4003
4088
|
p_checkpoint.add_argument("--reviewer", default=None)
|
|
4004
4089
|
p_checkpoint.set_defaults(func=cmd_checkpoint)
|
|
4005
4090
|
|