@hunter-harness/workflow-harness 0.2.5 → 0.2.7
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 +169 -0
- package/harness/bundles/general/claude-code/harness-archive/SKILL.md +7 -2
- package/harness/bundles/general/claude-code/harness-archive/reference.md +1 -1
- package/harness/bundles/general/claude-code/harness-archive/templates/render-summary.mjs +78 -155
- package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +4 -2
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +5 -3
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +109 -7
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +6 -2
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +8 -3
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +8 -3
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +13 -7
- package/harness/bundles/general/claude-code/harness-run/checklist.md +2 -2
- package/harness/bundles/general/claude-code/harness-run/reference.md +6 -3
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +11 -6
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +5 -3
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +12 -3
- package/harness/bundles/general/claude-code/harness-test/reference.md +1 -1
- package/harness/bundles/general/claude-code/protocols/ledger-protocol.md +1 -1
- package/harness/bundles/general/claude-code/protocols/report-pipeline-protocol.md +11 -4
- package/harness/bundles/general/claude-code/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/claude-code/scripts/harness_archive.py +231 -48
- package/harness/bundles/general/claude-code/scripts/harness_change.py +854 -0
- package/harness/bundles/general/claude-code/scripts/harness_events.py +134 -40
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/claude-code/scripts/harness_preflight.py +46 -3
- package/harness/bundles/general/claude-code/scripts/harness_profile.py +2 -2
- package/harness/bundles/general/claude-code/scripts/harness_service.py +34 -1
- package/harness/bundles/general/claude-code/scripts/harness_state.py +148 -0
- package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/claude-code/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +7 -2
- package/harness/bundles/general/codebuddy/harness-archive/reference.md +1 -1
- package/harness/bundles/general/codebuddy/harness-archive/templates/render-summary.mjs +78 -155
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +4 -2
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +5 -3
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +109 -7
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +6 -2
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +8 -3
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +8 -3
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +13 -7
- package/harness/bundles/general/codebuddy/harness-run/checklist.md +2 -2
- package/harness/bundles/general/codebuddy/harness-run/reference.md +6 -3
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +11 -6
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +5 -3
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +12 -3
- package/harness/bundles/general/codebuddy/harness-test/reference.md +1 -1
- package/harness/bundles/general/codebuddy/protocols/ledger-protocol.md +1 -1
- package/harness/bundles/general/codebuddy/protocols/report-pipeline-protocol.md +11 -4
- package/harness/bundles/general/codebuddy/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/codebuddy/scripts/harness_archive.py +231 -48
- package/harness/bundles/general/codebuddy/scripts/harness_change.py +854 -0
- package/harness/bundles/general/codebuddy/scripts/harness_events.py +134 -40
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/codebuddy/scripts/harness_preflight.py +46 -3
- package/harness/bundles/general/codebuddy/scripts/harness_profile.py +2 -2
- package/harness/bundles/general/codebuddy/scripts/harness_service.py +34 -1
- package/harness/bundles/general/codebuddy/scripts/harness_state.py +148 -0
- package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/codebuddy/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/codex/harness-archive/SKILL.md +7 -2
- package/harness/bundles/general/codex/harness-archive/reference.md +1 -1
- package/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +78 -155
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +4 -2
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +5 -3
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +109 -7
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +6 -2
- package/harness/bundles/general/codex/harness-plan/SKILL.md +8 -3
- package/harness/bundles/general/codex/harness-review/SKILL.md +7 -2
- package/harness/bundles/general/codex/harness-run/SKILL.md +13 -7
- package/harness/bundles/general/codex/harness-run/checklist.md +2 -2
- package/harness/bundles/general/codex/harness-run/reference.md +6 -3
- package/harness/bundles/general/codex/harness-submit/SKILL.md +11 -6
- package/harness/bundles/general/codex/harness-sync/SKILL.md +5 -3
- package/harness/bundles/general/codex/harness-test/SKILL.md +12 -3
- package/harness/bundles/general/codex/harness-test/reference.md +1 -1
- package/harness/bundles/general/codex/protocols/ledger-protocol.md +1 -1
- package/harness/bundles/general/codex/protocols/report-pipeline-protocol.md +11 -4
- package/harness/bundles/general/codex/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/codex/scripts/harness_archive.py +231 -48
- package/harness/bundles/general/codex/scripts/harness_change.py +854 -0
- package/harness/bundles/general/codex/scripts/harness_events.py +134 -40
- package/harness/bundles/general/codex/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/codex/scripts/harness_preflight.py +46 -3
- package/harness/bundles/general/codex/scripts/harness_profile.py +2 -2
- package/harness/bundles/general/codex/scripts/harness_service.py +34 -1
- package/harness/bundles/general/codex/scripts/harness_state.py +148 -0
- package/harness/bundles/general/codex/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/codex/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +7 -2
- package/harness/bundles/general/cursor/harness-archive/reference.md +1 -1
- package/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +78 -155
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +4 -2
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +5 -3
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +109 -7
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +6 -2
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +8 -3
- package/harness/bundles/general/cursor/harness-review/SKILL.md +7 -2
- package/harness/bundles/general/cursor/harness-run/SKILL.md +13 -7
- package/harness/bundles/general/cursor/harness-run/checklist.md +2 -2
- package/harness/bundles/general/cursor/harness-run/reference.md +6 -3
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +11 -6
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +5 -3
- package/harness/bundles/general/cursor/harness-test/SKILL.md +12 -3
- package/harness/bundles/general/cursor/harness-test/reference.md +1 -1
- package/harness/bundles/general/cursor/protocols/ledger-protocol.md +1 -1
- package/harness/bundles/general/cursor/protocols/report-pipeline-protocol.md +11 -4
- package/harness/bundles/general/cursor/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/cursor/scripts/harness_archive.py +231 -48
- package/harness/bundles/general/cursor/scripts/harness_change.py +854 -0
- package/harness/bundles/general/cursor/scripts/harness_events.py +134 -40
- package/harness/bundles/general/cursor/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/cursor/scripts/harness_preflight.py +46 -3
- package/harness/bundles/general/cursor/scripts/harness_profile.py +2 -2
- package/harness/bundles/general/cursor/scripts/harness_service.py +34 -1
- package/harness/bundles/general/cursor/scripts/harness_state.py +148 -0
- package/harness/bundles/general/cursor/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/cursor/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +11 -2
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +7 -2
- package/harness/bundles/java/claude-code/harness-archive/reference.md +1 -1
- package/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +78 -155
- package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +4 -2
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +5 -3
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +109 -7
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +6 -2
- package/harness/bundles/java/claude-code/harness-package/SKILL.md +10 -4
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +8 -3
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +8 -3
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +13 -7
- package/harness/bundles/java/claude-code/harness-run/reference.md +1 -1
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +11 -6
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +5 -3
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +12 -3
- package/harness/bundles/java/claude-code/harness-test/reference.md +1 -1
- package/harness/bundles/java/claude-code/protocols/ledger-protocol.md +1 -1
- package/harness/bundles/java/claude-code/protocols/report-pipeline-protocol.md +11 -4
- package/harness/bundles/java/claude-code/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/claude-code/scripts/harness_archive.py +231 -48
- package/harness/bundles/java/claude-code/scripts/harness_change.py +854 -0
- package/harness/bundles/java/claude-code/scripts/harness_events.py +134 -40
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/claude-code/scripts/harness_preflight.py +46 -3
- package/harness/bundles/java/claude-code/scripts/harness_profile.py +2 -2
- package/harness/bundles/java/claude-code/scripts/harness_service.py +34 -1
- package/harness/bundles/java/claude-code/scripts/harness_state.py +148 -0
- package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/claude-code/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +11 -2
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +7 -2
- package/harness/bundles/java/codebuddy/harness-archive/reference.md +1 -1
- package/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +78 -155
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +4 -2
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +5 -3
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +109 -7
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +6 -2
- package/harness/bundles/java/codebuddy/harness-package/SKILL.md +10 -4
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +8 -3
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +8 -3
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +13 -7
- package/harness/bundles/java/codebuddy/harness-run/reference.md +1 -1
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +11 -6
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +5 -3
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +12 -3
- package/harness/bundles/java/codebuddy/harness-test/reference.md +1 -1
- package/harness/bundles/java/codebuddy/protocols/ledger-protocol.md +1 -1
- package/harness/bundles/java/codebuddy/protocols/report-pipeline-protocol.md +11 -4
- package/harness/bundles/java/codebuddy/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/codebuddy/scripts/harness_archive.py +231 -48
- package/harness/bundles/java/codebuddy/scripts/harness_change.py +854 -0
- package/harness/bundles/java/codebuddy/scripts/harness_events.py +134 -40
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/codebuddy/scripts/harness_preflight.py +46 -3
- package/harness/bundles/java/codebuddy/scripts/harness_profile.py +2 -2
- package/harness/bundles/java/codebuddy/scripts/harness_service.py +34 -1
- package/harness/bundles/java/codebuddy/scripts/harness_state.py +148 -0
- package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/codebuddy/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +11 -2
- package/harness/bundles/java/codex/harness-archive/SKILL.md +7 -2
- package/harness/bundles/java/codex/harness-archive/reference.md +1 -1
- package/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +78 -155
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +4 -2
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +5 -3
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +109 -7
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +6 -2
- package/harness/bundles/java/codex/harness-package/SKILL.md +10 -4
- package/harness/bundles/java/codex/harness-plan/SKILL.md +8 -3
- package/harness/bundles/java/codex/harness-review/SKILL.md +7 -2
- package/harness/bundles/java/codex/harness-run/SKILL.md +13 -7
- package/harness/bundles/java/codex/harness-run/reference.md +1 -1
- package/harness/bundles/java/codex/harness-submit/SKILL.md +11 -6
- package/harness/bundles/java/codex/harness-sync/SKILL.md +5 -3
- package/harness/bundles/java/codex/harness-test/SKILL.md +12 -3
- package/harness/bundles/java/codex/harness-test/reference.md +1 -1
- package/harness/bundles/java/codex/protocols/ledger-protocol.md +1 -1
- package/harness/bundles/java/codex/protocols/report-pipeline-protocol.md +11 -4
- package/harness/bundles/java/codex/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/codex/scripts/harness_archive.py +231 -48
- package/harness/bundles/java/codex/scripts/harness_change.py +854 -0
- package/harness/bundles/java/codex/scripts/harness_events.py +134 -40
- package/harness/bundles/java/codex/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/codex/scripts/harness_preflight.py +46 -3
- package/harness/bundles/java/codex/scripts/harness_profile.py +2 -2
- package/harness/bundles/java/codex/scripts/harness_service.py +34 -1
- package/harness/bundles/java/codex/scripts/harness_state.py +148 -0
- package/harness/bundles/java/codex/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/codex/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +11 -2
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +7 -2
- package/harness/bundles/java/cursor/harness-archive/reference.md +1 -1
- package/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +78 -155
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +4 -2
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +5 -3
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +109 -7
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +6 -2
- package/harness/bundles/java/cursor/harness-package/SKILL.md +10 -4
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +8 -3
- package/harness/bundles/java/cursor/harness-review/SKILL.md +7 -2
- package/harness/bundles/java/cursor/harness-run/SKILL.md +13 -7
- package/harness/bundles/java/cursor/harness-run/reference.md +1 -1
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +11 -6
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +5 -3
- package/harness/bundles/java/cursor/harness-test/SKILL.md +12 -3
- package/harness/bundles/java/cursor/harness-test/reference.md +1 -1
- package/harness/bundles/java/cursor/protocols/ledger-protocol.md +1 -1
- package/harness/bundles/java/cursor/protocols/report-pipeline-protocol.md +11 -4
- package/harness/bundles/java/cursor/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/cursor/scripts/harness_archive.py +231 -48
- package/harness/bundles/java/cursor/scripts/harness_change.py +854 -0
- package/harness/bundles/java/cursor/scripts/harness_events.py +134 -40
- package/harness/bundles/java/cursor/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/cursor/scripts/harness_preflight.py +46 -3
- package/harness/bundles/java/cursor/scripts/harness_profile.py +2 -2
- package/harness/bundles/java/cursor/scripts/harness_service.py +34 -1
- package/harness/bundles/java/cursor/scripts/harness_state.py +148 -0
- package/harness/bundles/java/cursor/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/cursor/scripts/harness_workflow_policy.py +160 -0
- package/harness/manifests/general/claude-code.json +48 -28
- package/harness/manifests/general/codebuddy.json +48 -28
- package/harness/manifests/general/codex.json +48 -28
- package/harness/manifests/general/cursor.json +48 -28
- package/harness/manifests/java/claude-code.json +49 -29
- package/harness/manifests/java/codebuddy.json +49 -29
- package/harness/manifests/java/codex.json +49 -29
- package/harness/manifests/java/cursor.json +49 -29
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Strict loader for harness/contracts/workflow-policy.json.
|
|
3
|
+
|
|
4
|
+
Unknown fields at any depth fail validation. Python 3.10+, stdlib only.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
POLICY_REL = Path("harness") / "contracts" / "workflow-policy.json"
|
|
14
|
+
|
|
15
|
+
TOP_LEVEL_KEYS = frozenset(
|
|
16
|
+
{
|
|
17
|
+
"schemaVersion",
|
|
18
|
+
"riskTiers",
|
|
19
|
+
"skills",
|
|
20
|
+
"requiredArtifacts",
|
|
21
|
+
"requiredValidations",
|
|
22
|
+
"conditionalStages",
|
|
23
|
+
"interactionWhitelist",
|
|
24
|
+
"checkpointRules",
|
|
25
|
+
}
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
RISK_TIER_KEYS = frozenset(
|
|
29
|
+
{
|
|
30
|
+
"description",
|
|
31
|
+
"defaultPhases",
|
|
32
|
+
"requiredValidations",
|
|
33
|
+
"conditionalStages",
|
|
34
|
+
"upgradeTriggers",
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
SKILL_KEYS = frozenset(
|
|
39
|
+
{
|
|
40
|
+
"phase",
|
|
41
|
+
"inputs",
|
|
42
|
+
"artifacts",
|
|
43
|
+
"events",
|
|
44
|
+
"allowedInteractions",
|
|
45
|
+
"capabilities",
|
|
46
|
+
"profiles",
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
CONDITIONAL_STAGE_KEYS = frozenset({"tiers", "signals"})
|
|
51
|
+
CHECKPOINT_RULE_KEYS = frozenset(
|
|
52
|
+
{
|
|
53
|
+
"afterTasks",
|
|
54
|
+
"beforeTasks",
|
|
55
|
+
"blocking",
|
|
56
|
+
"requiredReport",
|
|
57
|
+
"reviewerTool",
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class PolicyValidationError(ValueError):
|
|
63
|
+
"""Raised when workflow-policy.json contains unknown or invalid fields."""
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _reject_unknown(data: dict[str, Any], allowed: frozenset[str], path: str) -> None:
|
|
67
|
+
unknown = sorted(set(data) - allowed)
|
|
68
|
+
if unknown:
|
|
69
|
+
raise PolicyValidationError(
|
|
70
|
+
f"unknown field(s) at {path}: {', '.join(unknown)}"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _require_type(value: Any, expected: type | tuple[type, ...], path: str) -> None:
|
|
75
|
+
if not isinstance(value, expected):
|
|
76
|
+
names = (
|
|
77
|
+
expected.__name__
|
|
78
|
+
if isinstance(expected, type)
|
|
79
|
+
else "|".join(t.__name__ for t in expected)
|
|
80
|
+
)
|
|
81
|
+
raise PolicyValidationError(f"{path} must be {names}, got {type(value).__name__}")
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def validate_policy(data: Any) -> dict[str, Any]:
|
|
85
|
+
if not isinstance(data, dict):
|
|
86
|
+
raise PolicyValidationError("workflow policy root must be an object")
|
|
87
|
+
_reject_unknown(data, TOP_LEVEL_KEYS, "root")
|
|
88
|
+
_require_type(data.get("schemaVersion"), int, "schemaVersion")
|
|
89
|
+
if data["schemaVersion"] != 1:
|
|
90
|
+
raise PolicyValidationError("unsupported schemaVersion")
|
|
91
|
+
|
|
92
|
+
risk_tiers = data["riskTiers"]
|
|
93
|
+
_require_type(risk_tiers, dict, "riskTiers")
|
|
94
|
+
for tier_name, tier in risk_tiers.items():
|
|
95
|
+
path = f"riskTiers.{tier_name}"
|
|
96
|
+
_require_type(tier, dict, path)
|
|
97
|
+
_reject_unknown(tier, RISK_TIER_KEYS, path)
|
|
98
|
+
_require_type(tier["description"], str, f"{path}.description")
|
|
99
|
+
_require_type(tier["defaultPhases"], list, f"{path}.defaultPhases")
|
|
100
|
+
_require_type(tier["requiredValidations"], list, f"{path}.requiredValidations")
|
|
101
|
+
_require_type(tier["conditionalStages"], list, f"{path}.conditionalStages")
|
|
102
|
+
_require_type(tier["upgradeTriggers"], list, f"{path}.upgradeTriggers")
|
|
103
|
+
|
|
104
|
+
skills = data["skills"]
|
|
105
|
+
_require_type(skills, dict, "skills")
|
|
106
|
+
for skill_name, skill in skills.items():
|
|
107
|
+
path = f"skills.{skill_name}"
|
|
108
|
+
_require_type(skill, dict, path)
|
|
109
|
+
_reject_unknown(skill, SKILL_KEYS, path)
|
|
110
|
+
_require_type(skill["phase"], str, f"{path}.phase")
|
|
111
|
+
for key in ("inputs", "artifacts", "events", "allowedInteractions", "capabilities"):
|
|
112
|
+
_require_type(skill[key], list, f"{path}.{key}")
|
|
113
|
+
profiles = skill.get("profiles", ["general", "java"])
|
|
114
|
+
_require_type(profiles, list, f"{path}.profiles")
|
|
115
|
+
if not profiles or any(item not in {"general", "java"} for item in profiles):
|
|
116
|
+
raise PolicyValidationError(f"{path}.profiles must contain general and/or java")
|
|
117
|
+
|
|
118
|
+
for section in ("requiredArtifacts", "requiredValidations"):
|
|
119
|
+
section_data = data[section]
|
|
120
|
+
_require_type(section_data, dict, section)
|
|
121
|
+
for phase, items in section_data.items():
|
|
122
|
+
_require_type(items, list, f"{section}.{phase}")
|
|
123
|
+
|
|
124
|
+
conditional = data["conditionalStages"]
|
|
125
|
+
_require_type(conditional, dict, "conditionalStages")
|
|
126
|
+
for stage_name, stage in conditional.items():
|
|
127
|
+
path = f"conditionalStages.{stage_name}"
|
|
128
|
+
_require_type(stage, dict, path)
|
|
129
|
+
_reject_unknown(stage, CONDITIONAL_STAGE_KEYS, path)
|
|
130
|
+
_require_type(stage["tiers"], list, f"{path}.tiers")
|
|
131
|
+
_require_type(stage["signals"], list, f"{path}.signals")
|
|
132
|
+
|
|
133
|
+
interaction = data["interactionWhitelist"]
|
|
134
|
+
_require_type(interaction, dict, "interactionWhitelist")
|
|
135
|
+
for key, items in interaction.items():
|
|
136
|
+
_require_type(items, list, f"interactionWhitelist.{key}")
|
|
137
|
+
|
|
138
|
+
checkpoints = data["checkpointRules"]
|
|
139
|
+
_require_type(checkpoints, dict, "checkpointRules")
|
|
140
|
+
for checkpoint_id, rule in checkpoints.items():
|
|
141
|
+
path = f"checkpointRules.{checkpoint_id}"
|
|
142
|
+
_require_type(rule, dict, path)
|
|
143
|
+
_reject_unknown(rule, CHECKPOINT_RULE_KEYS, path)
|
|
144
|
+
_require_type(rule["afterTasks"], list, f"{path}.afterTasks")
|
|
145
|
+
_require_type(rule["beforeTasks"], list, f"{path}.beforeTasks")
|
|
146
|
+
_require_type(rule["blocking"], bool, f"{path}.blocking")
|
|
147
|
+
|
|
148
|
+
return data
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def policy_path_for_repo(repo_root: Path) -> Path:
|
|
152
|
+
return repo_root / POLICY_REL
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def load_policy(repo_root: Path) -> dict[str, Any]:
|
|
156
|
+
path = policy_path_for_repo(repo_root)
|
|
157
|
+
if not path.is_file():
|
|
158
|
+
raise FileNotFoundError(f"workflow policy missing: {path}")
|
|
159
|
+
data = json.loads(path.read_text(encoding="utf-8-sig"))
|
|
160
|
+
return validate_policy(data)
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"riskTiers": {
|
|
4
|
+
"fast": {
|
|
5
|
+
"description": "Low-risk docs/comments/non-behavioral config; no API/DB/security/concurrency.",
|
|
6
|
+
"defaultPhases": ["plan", "run", "submit", "archive"],
|
|
7
|
+
"requiredValidations": ["unitTest"],
|
|
8
|
+
"conditionalStages": ["review", "package", "apidoc"],
|
|
9
|
+
"upgradeTriggers": ["api-change", "security", "migration", "concurrency", "breaking-contract"]
|
|
10
|
+
},
|
|
11
|
+
"standard": {
|
|
12
|
+
"description": "Ordinary production code and non-breaking API/features.",
|
|
13
|
+
"defaultPhases": ["plan", "run", "test", "submit", "archive"],
|
|
14
|
+
"requiredValidations": ["compile", "unitTest", "unitTestFull"],
|
|
15
|
+
"conditionalStages": ["review", "package", "apidoc"],
|
|
16
|
+
"upgradeTriggers": ["auth", "security", "delete", "migration", "concurrency", "artifact-protocol", "shared-state", "breaking-api"]
|
|
17
|
+
},
|
|
18
|
+
"full": {
|
|
19
|
+
"description": "Auth/security/delete/migration/concurrency/service protocol/shared state/breaking contracts.",
|
|
20
|
+
"defaultPhases": ["plan", "run", "test", "review", "submit", "archive"],
|
|
21
|
+
"requiredValidations": ["compile", "unitTest", "unitTestFull", "apiTest"],
|
|
22
|
+
"conditionalStages": ["package", "apidoc"],
|
|
23
|
+
"upgradeTriggers": []
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"skills": {
|
|
27
|
+
"harness-plan": {
|
|
28
|
+
"phase": "plan",
|
|
29
|
+
"inputs": ["requirements", "change-context"],
|
|
30
|
+
"artifacts": ["plans", "spec", "test-scenarios", "implementation-detail"],
|
|
31
|
+
"events": ["phase.start", "phase.end", "decision"],
|
|
32
|
+
"allowedInteractions": [],
|
|
33
|
+
"capabilities": ["risk-classify-plan"]
|
|
34
|
+
},
|
|
35
|
+
"harness-run": {
|
|
36
|
+
"phase": "run",
|
|
37
|
+
"inputs": ["implementation-detail", "state-snapshot"],
|
|
38
|
+
"artifacts": ["code", "verification-ledger"],
|
|
39
|
+
"events": ["phase.start", "phase.end", "command", "verification"],
|
|
40
|
+
"allowedInteractions": [],
|
|
41
|
+
"capabilities": ["gate-begin", "gate-close", "ledger-record"]
|
|
42
|
+
},
|
|
43
|
+
"harness-test": {
|
|
44
|
+
"phase": "test",
|
|
45
|
+
"inputs": ["test-scenarios", "verification-ledger"],
|
|
46
|
+
"artifacts": ["test-reports", "verification-ledger"],
|
|
47
|
+
"events": ["phase.start", "phase.end", "command", "verification"],
|
|
48
|
+
"allowedInteractions": [],
|
|
49
|
+
"capabilities": ["gate-begin", "gate-close", "test-guard", "ledger-record"]
|
|
50
|
+
},
|
|
51
|
+
"harness-review": {
|
|
52
|
+
"phase": "review",
|
|
53
|
+
"inputs": ["diff", "verification-ledger", "test-reports"],
|
|
54
|
+
"artifacts": ["review-report"],
|
|
55
|
+
"events": ["phase.start", "phase.end", "issue", "artifact"],
|
|
56
|
+
"allowedInteractions": [],
|
|
57
|
+
"capabilities": ["gate-begin", "gate-close"]
|
|
58
|
+
},
|
|
59
|
+
"harness-submit": {
|
|
60
|
+
"phase": "submit",
|
|
61
|
+
"inputs": ["verification-ledger", "test-tracking"],
|
|
62
|
+
"artifacts": ["git-integration"],
|
|
63
|
+
"events": ["phase.start", "phase.end", "command", "artifact"],
|
|
64
|
+
"allowedInteractions": ["merge-conflict-resolution"],
|
|
65
|
+
"capabilities": ["gate-begin", "gate-close", "integration-lock", "test-guard-stage"]
|
|
66
|
+
},
|
|
67
|
+
"harness-package": {
|
|
68
|
+
"profiles": ["java"],
|
|
69
|
+
"phase": "package",
|
|
70
|
+
"inputs": ["verification-ledger", "final-commit"],
|
|
71
|
+
"artifacts": ["deploy-artifact"],
|
|
72
|
+
"events": ["phase.start", "phase.end", "command", "verification"],
|
|
73
|
+
"allowedInteractions": [],
|
|
74
|
+
"capabilities": ["gate-begin", "gate-close", "ledger-can-reuse"]
|
|
75
|
+
},
|
|
76
|
+
"harness-archive": {
|
|
77
|
+
"phase": "archive",
|
|
78
|
+
"inputs": ["events", "verification-ledger", "reports"],
|
|
79
|
+
"artifacts": ["summary-data", "archive-manifest"],
|
|
80
|
+
"events": ["phase.start", "phase.end", "artifact"],
|
|
81
|
+
"allowedInteractions": [],
|
|
82
|
+
"capabilities": ["gate-begin", "gate-close"]
|
|
83
|
+
},
|
|
84
|
+
"harness-sync": {
|
|
85
|
+
"phase": "sync",
|
|
86
|
+
"inputs": ["canonical-harness"],
|
|
87
|
+
"artifacts": ["bundle-projection"],
|
|
88
|
+
"events": ["phase.start", "phase.end", "command"],
|
|
89
|
+
"allowedInteractions": [],
|
|
90
|
+
"capabilities": []
|
|
91
|
+
},
|
|
92
|
+
"harness-codebase-map": {
|
|
93
|
+
"phase": "codebase-map",
|
|
94
|
+
"inputs": ["project-root"],
|
|
95
|
+
"artifacts": ["codebase-map"],
|
|
96
|
+
"events": ["phase.start", "phase.end"],
|
|
97
|
+
"allowedInteractions": [],
|
|
98
|
+
"capabilities": []
|
|
99
|
+
},
|
|
100
|
+
"harness-knowledge-query": {
|
|
101
|
+
"phase": "knowledge-query",
|
|
102
|
+
"inputs": ["knowledge-index"],
|
|
103
|
+
"artifacts": [],
|
|
104
|
+
"events": ["phase.start", "phase.end"],
|
|
105
|
+
"allowedInteractions": [],
|
|
106
|
+
"capabilities": ["read-only"]
|
|
107
|
+
},
|
|
108
|
+
"harness-knowledge-ingest": {
|
|
109
|
+
"phase": "knowledge-ingest",
|
|
110
|
+
"inputs": ["archive-evidence"],
|
|
111
|
+
"artifacts": ["knowledge-index"],
|
|
112
|
+
"events": ["phase.start", "phase.end", "command"],
|
|
113
|
+
"allowedInteractions": [],
|
|
114
|
+
"capabilities": []
|
|
115
|
+
},
|
|
116
|
+
"harness-apidoc": {
|
|
117
|
+
"profiles": ["java"],
|
|
118
|
+
"phase": "apidoc",
|
|
119
|
+
"inputs": ["api-diff"],
|
|
120
|
+
"artifacts": ["api-contract-summary"],
|
|
121
|
+
"events": ["phase.start", "phase.end", "artifact"],
|
|
122
|
+
"allowedInteractions": [],
|
|
123
|
+
"capabilities": ["gate-begin", "gate-close"]
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"requiredArtifacts": {
|
|
127
|
+
"plan": ["plans", "spec"],
|
|
128
|
+
"run": [],
|
|
129
|
+
"test": ["tests/test-report-*.md"],
|
|
130
|
+
"review": ["reports/review/review-report-*.md"],
|
|
131
|
+
"submit": [],
|
|
132
|
+
"package": [],
|
|
133
|
+
"archive": ["reports/final/summary-data.json"]
|
|
134
|
+
},
|
|
135
|
+
"requiredValidations": {
|
|
136
|
+
"run": ["compile", "unitTest"],
|
|
137
|
+
"test": ["unitTestFull"],
|
|
138
|
+
"submit": [],
|
|
139
|
+
"package": ["package"]
|
|
140
|
+
},
|
|
141
|
+
"conditionalStages": {
|
|
142
|
+
"review": {
|
|
143
|
+
"tiers": ["standard", "full"],
|
|
144
|
+
"signals": ["security", "auth", "breaking-api", "shared-state"]
|
|
145
|
+
},
|
|
146
|
+
"package": {
|
|
147
|
+
"tiers": ["standard", "full"],
|
|
148
|
+
"signals": ["deploy-required", "install-verification"]
|
|
149
|
+
},
|
|
150
|
+
"apidoc": {
|
|
151
|
+
"tiers": ["standard", "full"],
|
|
152
|
+
"signals": ["api-diff-present"]
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"interactionWhitelist": {
|
|
156
|
+
"global": [],
|
|
157
|
+
"harness-submit": ["merge-conflict-resolution"],
|
|
158
|
+
"harness-plan": ["risk-confirmation"]
|
|
159
|
+
},
|
|
160
|
+
"checkpointRules": {
|
|
161
|
+
"foundation-gate": {
|
|
162
|
+
"afterTasks": [1, 2, 3, 4],
|
|
163
|
+
"beforeTasks": [6, 7, 8, 9, 10],
|
|
164
|
+
"blocking": true,
|
|
165
|
+
"requiredReport": "reports/review/foundation-gate-review.md",
|
|
166
|
+
"reviewerTool": "codex"
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-apidoc
|
|
3
3
|
description: 从 Java 后端代码生成结构化前端 API 文档(Controller/VO/ErrorCode)。使用场景:接口文档、前端接口文档、API 文档生成
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=codebuddy; do not edit -->
|
|
6
6
|
# harness-apidoc — 前端接口文档(Java overlay)
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
@@ -24,11 +24,18 @@ description: 从 Java 后端代码生成结构化前端 API 文档(Controller/
|
|
|
24
24
|
6. **implementation-detail** — 自适应执行参考;legacy 缺失 🟡WARN,不阻断
|
|
25
25
|
7. **test-scenarios** — 测试真相源:`plans/<change>-test-scenarios.md`
|
|
26
26
|
8. **禁止读取 `docs/superpowers/` 作为正式输入** — 旧草稿仅人工线索
|
|
27
|
+
9. **每个 skill 边界只刷新一次状态快照** — 先运行 `python <skills-root>/scripts/harness_state.py capture --project . --change-dir ".harness/changes/<change-name>" --base <baseCommit> --json`;`changedSegments=[]` 时复用已有 profile/rules/map/knowledge/change/code 指纹,不再重复跑全量 `harness-sync`、知识重建或代码库扫描。只有对应 segment 变化或缺失时才定向刷新;快照不能替代源码读取和验证门禁。
|
|
27
28
|
|
|
28
29
|
状态目录分层:新路径优先,旧路径兼容 → [[../protocols/state-layout-protocol.md|state-layout-protocol]]
|
|
29
30
|
|
|
30
31
|
## Workflow
|
|
31
32
|
|
|
33
|
+
先用 `harness_change.py resolve [--change] --json` 解析 change;多个 active change 未显式选择时返回 `CHANGE_SELECTION_REQUIRED`。确认存在真实 API diff;无变化时记录跳过,不生成空文档。阶段边界使用 `harness_gate.py begin --phase apidoc --change <id> --task <n> --skills-root <skills-root> --executor-tool <tool> --json` 与 `harness_gate.py close --phase apidoc --change <id> --status <OK|WARN|FAIL> --run-id <begin-run-id> --json`,禁止手工追加阶段事件。
|
|
34
|
+
|
|
35
|
+
默认输出 40–80 行契约差异摘要,只保留前端动作、变化接口、请求/响应边界、变化的枚举/错误码、兼容性和证据链接;显式 `--full` 才生成完整七章节。文件名使用 `YYYY-MM-DD-<变更语义安全名称>.md`,不以 commit hash 充当标题。
|
|
36
|
+
|
|
37
|
+
文件名必须由 `harness_apidoc.py filename --description "<做了什么变更>" --json` 生成,避免 Windows 非法字符、超长路径和不可读 hash 文件名。
|
|
38
|
+
|
|
32
39
|
1. 确定 change-name(Glob plans,读 frontmatter)
|
|
33
40
|
2. append `phase.start`
|
|
34
41
|
3. 扫描变更涉及 Controller/VO/ErrorCode(CodeGraph 优先)
|
|
@@ -57,7 +64,7 @@ description: 从 Java 后端代码生成结构化前端 API 文档(Controller/
|
|
|
57
64
|
|
|
58
65
|
## 执行日志
|
|
59
66
|
|
|
60
|
-
`events.ndjson` 为唯一事实源(schema_version
|
|
67
|
+
`events.ndjson` 为唯一事实源(schema_version 3,兼容读取 v1/v2;`note` 承载人类可读摘要);`logs/execution-log.md` 由 `harness_events.py` 渲染,**禁止用 Write/Edit 直接维护**。直接修改的内容会在 `phase.end` 或 finalize 时被完整重建覆盖,属于数据丢失;需要保留的详情必须进入事件 `note`。结构 → [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]]
|
|
61
68
|
|
|
62
69
|
```powershell
|
|
63
70
|
python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --note "<触发指令>"
|
|
@@ -66,3 +73,5 @@ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/cha
|
|
|
66
73
|
> **脚本接线**:`harness_events.py append`;`harness_archive.py finalize`;`harness_preflight.py check`;`harness_ledger.py can-reuse`;`harness_service.py ensure/stop`(须 `--files`/`serviceStart.inputFiles`)。JSON 输出按 D13 护栏解读。
|
|
67
74
|
|
|
68
75
|
> **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。
|
|
76
|
+
|
|
77
|
+
每次阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`;重试同一阶段时增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
|
|
@@ -3,7 +3,7 @@ name: harness-archive
|
|
|
3
3
|
description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档)到
|
|
4
4
|
.harness/archive/,含归档元数据和可视化最终总结。使用场景:归档、完成归档、收尾、打包产出物
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-archive — 变更归档
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -49,11 +49,14 @@ description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档
|
|
|
49
49
|
6. **implementation-detail** — 自适应执行参考;legacy 缺失 🟡WARN,不阻断
|
|
50
50
|
7. **test-scenarios** — 测试真相源:`plans/<change>-test-scenarios.md`
|
|
51
51
|
8. **禁止读取 `docs/superpowers/` 作为正式输入** — 旧草稿仅人工线索
|
|
52
|
+
9. **每个 skill 边界只刷新一次状态快照** — 先运行 `python <skills-root>/scripts/harness_state.py capture --project . --change-dir ".harness/changes/<change-name>" --base <baseCommit> --json`;`changedSegments=[]` 时复用已有 profile/rules/map/knowledge/change/code 指纹,不再重复跑全量 `harness-sync`、知识重建或代码库扫描。只有对应 segment 变化或缺失时才定向刷新;快照不能替代源码读取和验证门禁。
|
|
52
53
|
|
|
53
54
|
状态目录分层:新路径优先,旧路径兼容 → [[../protocols/state-layout-protocol.md|state-layout-protocol]]
|
|
54
55
|
|
|
55
56
|
## Workflow
|
|
56
57
|
|
|
58
|
+
先用 `harness_change.py resolve [--change] --json` 解析 change;多个 active change 未显式选择时返回 `CHANGE_SELECTION_REQUIRED`,禁止按 Glob/mtime 自动选择。`harness_archive.py finalize` 内部负责且仅负责一次 `harness_gate.py begin` 与 `harness_gate.py close`。调用者禁止重复调用阶段门禁,避免重复事件和幽灵 change 目录。
|
|
59
|
+
|
|
57
60
|
### Phase 0:读取规则和上下文
|
|
58
61
|
|
|
59
62
|
1. 读取本文件。
|
|
@@ -185,7 +188,7 @@ git 命令通过 `powershell.exe -Command "..."` 执行;archive-meta.md 和 fi
|
|
|
185
188
|
|
|
186
189
|
## 执行日志
|
|
187
190
|
|
|
188
|
-
`events.ndjson` 为唯一事实源(schema_version
|
|
191
|
+
`events.ndjson` 为唯一事实源(schema_version 3,兼容读取 v1/v2;`note` 承载人类可读摘要);`logs/execution-log.md` 由 `harness_events.py` 渲染,**禁止用 Write/Edit 直接维护**。直接修改的内容会在 `phase.end` 或 finalize 时被完整重建覆盖,属于数据丢失;需要保留的详情必须进入事件 `note`。结构 → [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]]
|
|
189
192
|
|
|
190
193
|
```powershell
|
|
191
194
|
python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --note "<触发指令>"
|
|
@@ -194,3 +197,5 @@ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/cha
|
|
|
194
197
|
> **脚本接线**:`harness_events.py append`;`harness_archive.py finalize`;`harness_preflight.py check`;`harness_ledger.py can-reuse`;`harness_service.py ensure/stop`(须 `--files`/`serviceStart.inputFiles`)。JSON 输出按 D13 护栏解读。
|
|
195
198
|
|
|
196
199
|
> **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。
|
|
200
|
+
|
|
201
|
+
每次阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`;重试同一阶段时增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
|
|
@@ -92,4 +92,4 @@ powershell.exe -NoProfile -Command "& '<node-path>' 'harness-skills/harness-arch
|
|
|
92
92
|
|
|
93
93
|
## 执行日志记录
|
|
94
94
|
|
|
95
|
-
归档只向 `events.ndjson` 追加事件(schema_version
|
|
95
|
+
归档只向 `events.ndjson` 追加事件(schema_version 3,兼容读取 v1/v2);`logs/execution-log.md` 由 `harness_events.py append` 自动渲染,禁止手工 Edit。事件类型与脚本用法见 SKILL.md `## 执行日志` 与 `../protocols/report-pipeline-protocol.md`。
|