@hunter-harness/workflow-harness 0.4.9 → 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/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-execute/SKILL.md +2 -2
- package/harness/bundles/general/claude-code/harness-execute/testing-pitfalls-java.md +7 -0
- 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 +1 -0
- 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 +1 -1
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/scripts/harness_context.py +71 -8
- package/harness/bundles/general/claude-code/scripts/harness_events.py +17 -11
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +94 -9
- package/harness/bundles/general/claude-code/scripts/harness_ledger.py +84 -4
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- 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-execute/SKILL.md +2 -2
- package/harness/bundles/general/codebuddy/harness-execute/testing-pitfalls-java.md +7 -0
- 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 +1 -0
- 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 +1 -1
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/scripts/harness_context.py +71 -8
- package/harness/bundles/general/codebuddy/scripts/harness_events.py +17 -11
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +94 -9
- package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +84 -4
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- 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-execute/SKILL.md +2 -2
- package/harness/bundles/general/codex/harness-execute/testing-pitfalls-java.md +7 -0
- 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 +1 -0
- 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 +1 -1
- package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codex/scripts/harness_context.py +71 -8
- package/harness/bundles/general/codex/scripts/harness_events.py +17 -11
- package/harness/bundles/general/codex/scripts/harness_gate.py +94 -9
- package/harness/bundles/general/codex/scripts/harness_ledger.py +84 -4
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- 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-execute/SKILL.md +2 -2
- package/harness/bundles/general/cursor/harness-execute/testing-pitfalls-java.md +7 -0
- 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 +1 -0
- 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 +1 -1
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/cursor/scripts/harness_context.py +71 -8
- package/harness/bundles/general/cursor/scripts/harness_events.py +17 -11
- package/harness/bundles/general/cursor/scripts/harness_gate.py +94 -9
- package/harness/bundles/general/cursor/scripts/harness_ledger.py +84 -4
- package/harness/bundles/general/pi/.harness-build.json +1 -1
- 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-execute/SKILL.md +2 -2
- package/harness/bundles/general/pi/harness-execute/testing-pitfalls-java.md +7 -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 +1 -0
- 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 +1 -1
- package/harness/bundles/general/pi/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/pi/scripts/harness_context.py +71 -8
- package/harness/bundles/general/pi/scripts/harness_events.py +17 -11
- package/harness/bundles/general/pi/scripts/harness_gate.py +94 -9
- package/harness/bundles/general/pi/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- 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-execute/SKILL.md +2 -2
- package/harness/bundles/java/claude-code/harness-execute/testing-pitfalls-java.md +1 -0
- 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-plan/SKILL.md +3 -3
- package/harness/bundles/java/claude-code/harness-plan/checklist.md +1 -0
- 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 +1 -1
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/scripts/harness_context.py +71 -8
- package/harness/bundles/java/claude-code/scripts/harness_events.py +17 -11
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +94 -9
- package/harness/bundles/java/claude-code/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- 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-execute/SKILL.md +2 -2
- package/harness/bundles/java/codebuddy/harness-execute/testing-pitfalls-java.md +1 -0
- 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-plan/SKILL.md +3 -3
- package/harness/bundles/java/codebuddy/harness-plan/checklist.md +1 -0
- 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 +1 -1
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/scripts/harness_context.py +71 -8
- package/harness/bundles/java/codebuddy/scripts/harness_events.py +17 -11
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +94 -9
- package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- 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-execute/SKILL.md +2 -2
- package/harness/bundles/java/codex/harness-execute/testing-pitfalls-java.md +1 -0
- 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-plan/SKILL.md +3 -3
- package/harness/bundles/java/codex/harness-plan/checklist.md +1 -0
- 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 +1 -1
- package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codex/scripts/harness_context.py +71 -8
- package/harness/bundles/java/codex/scripts/harness_events.py +17 -11
- package/harness/bundles/java/codex/scripts/harness_gate.py +94 -9
- package/harness/bundles/java/codex/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- 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-execute/SKILL.md +2 -2
- package/harness/bundles/java/cursor/harness-execute/testing-pitfalls-java.md +1 -0
- 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-plan/SKILL.md +3 -3
- package/harness/bundles/java/cursor/harness-plan/checklist.md +1 -0
- 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 +1 -1
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/cursor/scripts/harness_context.py +71 -8
- package/harness/bundles/java/cursor/scripts/harness_events.py +17 -11
- package/harness/bundles/java/cursor/scripts/harness_gate.py +94 -9
- package/harness/bundles/java/cursor/scripts/harness_ledger.py +84 -4
- package/harness/bundles/java/pi/.harness-build.json +1 -1
- 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-execute/SKILL.md +2 -2
- package/harness/bundles/java/pi/harness-execute/testing-pitfalls-java.md +1 -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-plan/SKILL.md +3 -3
- package/harness/bundles/java/pi/harness-plan/checklist.md +1 -0
- 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 +1 -1
- package/harness/bundles/java/pi/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/pi/scripts/harness_context.py +71 -8
- package/harness/bundles/java/pi/scripts/harness_events.py +17 -11
- package/harness/bundles/java/pi/scripts/harness_gate.py +94 -9
- package/harness/bundles/java/pi/scripts/harness_ledger.py +84 -4
- package/harness/manifests/general/claude-code.json +19 -19
- package/harness/manifests/general/codebuddy.json +19 -19
- package/harness/manifests/general/codex.json +19 -19
- package/harness/manifests/general/cursor.json +19 -19
- package/harness/manifests/general/pi.json +19 -19
- package/harness/manifests/java/claude-code.json +21 -21
- package/harness/manifests/java/codebuddy.json +21 -21
- package/harness/manifests/java/codex.json +21 -21
- package/harness/manifests/java/cursor.json +21 -21
- package/harness/manifests/java/pi.json +21 -21
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
|
@@ -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
|
|
|
@@ -1624,6 +1624,15 @@ def evidence_summary(entry: dict[str, Any]) -> dict[str, Any]:
|
|
|
1624
1624
|
}
|
|
1625
1625
|
|
|
1626
1626
|
|
|
1627
|
+
def _is_relative_to(path: Path, base: Path) -> bool:
|
|
1628
|
+
"""Python 3.9 兼容的 is_relative_to。"""
|
|
1629
|
+
try:
|
|
1630
|
+
path.relative_to(base)
|
|
1631
|
+
return True
|
|
1632
|
+
except ValueError:
|
|
1633
|
+
return False
|
|
1634
|
+
|
|
1635
|
+
|
|
1627
1636
|
def _nonempty_str(value: Any) -> bool:
|
|
1628
1637
|
return isinstance(value, str) and bool(value.strip())
|
|
1629
1638
|
|
|
@@ -3056,6 +3065,12 @@ def cmd_record(args: argparse.Namespace) -> int:
|
|
|
3056
3065
|
"scenarioCoverage": entry.get("scenarioCoverage"),
|
|
3057
3066
|
"migrationReceipt": migration_receipt,
|
|
3058
3067
|
}
|
|
3068
|
+
zero_warn = _zero_tests_with_selector_warning(
|
|
3069
|
+
str(args.command), args.evidence, project_root
|
|
3070
|
+
)
|
|
3071
|
+
if zero_warn is not None:
|
|
3072
|
+
payload["warnings"] = [zero_warn]
|
|
3073
|
+
print(f"[harness-ledger] WARNING {zero_warn}", file=sys.stderr)
|
|
3059
3074
|
emit_compact_or_verbose(
|
|
3060
3075
|
payload, as_json=as_json, verbose=verbose,
|
|
3061
3076
|
compact_fn=_compact_record_payload,
|
|
@@ -3063,6 +3078,47 @@ def cmd_record(args: argparse.Namespace) -> int:
|
|
|
3063
3078
|
return 0
|
|
3064
3079
|
|
|
3065
3080
|
|
|
3081
|
+
def _zero_tests_with_selector_warning(
|
|
3082
|
+
command: str, evidence: str | None, project_root: Path | None
|
|
3083
|
+
) -> str | None:
|
|
3084
|
+
"""选择器存在却 0 命中 → WARN(E-2)。
|
|
3085
|
+
|
|
3086
|
+
surefire 插件级 ``<excludedGroups>`` 会压过命令行空值覆盖,
|
|
3087
|
+
`-Dgroups=X` 选择器 0 命中仍 exit 0——只看退出码就是假阳性
|
|
3088
|
+
(2026-08-30 demo-datasource 集成测试静默 0 执行实测)。
|
|
3089
|
+
证据文本出现 Tests run: 0 且命令含选择器时,record 给出醒目警告。
|
|
3090
|
+
"""
|
|
3091
|
+
if not evidence:
|
|
3092
|
+
return None
|
|
3093
|
+
selectors = ("-Dgroups=", "-Dtest=", "--groups", "--filter", "-DfailIfNoSpecifiedTests")
|
|
3094
|
+
if not any(selector in str(command) for selector in selectors):
|
|
3095
|
+
return None
|
|
3096
|
+
candidates = [Path(evidence)]
|
|
3097
|
+
if project_root is not None and not Path(evidence).is_absolute():
|
|
3098
|
+
candidates.insert(0, project_root / evidence)
|
|
3099
|
+
text: str | None = None
|
|
3100
|
+
for candidate in candidates:
|
|
3101
|
+
try:
|
|
3102
|
+
if candidate.is_file() and candidate.stat().st_size <= 4 * 1024 * 1024:
|
|
3103
|
+
text = candidate.read_text(encoding="utf-8", errors="replace")
|
|
3104
|
+
break
|
|
3105
|
+
except OSError:
|
|
3106
|
+
continue
|
|
3107
|
+
if text is None:
|
|
3108
|
+
return None
|
|
3109
|
+
zero = re.search(
|
|
3110
|
+
r"Tests run:\s*0,\s*Failures:\s*0,\s*Errors:\s*0", text
|
|
3111
|
+
)
|
|
3112
|
+
ran_something = re.search(r"Tests run:\s*[1-9]", text)
|
|
3113
|
+
if zero is not None and ran_something is None:
|
|
3114
|
+
return (
|
|
3115
|
+
"ZERO_TESTS_WITH_SELECTOR: 命令含测试选择器但 Tests run=0(exit 0 不代表通过);"
|
|
3116
|
+
"常见于 surefire 插件级 excludedGroups 压过命令行覆盖——检查 pom 是否写死 "
|
|
3117
|
+
"<excludedGroups>(应改为 ${excludedGroups} 属性占位)"
|
|
3118
|
+
)
|
|
3119
|
+
return None
|
|
3120
|
+
|
|
3121
|
+
|
|
3066
3122
|
def cmd_scenario_receipt_template(args: argparse.Namespace) -> int:
|
|
3067
3123
|
"""Emit a schema-v2 receipt skeleton built from the scenario manifest.
|
|
3068
3124
|
|
|
@@ -3202,8 +3258,32 @@ def cmd_scenario_receipt_template(args: argparse.Namespace) -> int:
|
|
|
3202
3258
|
return 0
|
|
3203
3259
|
out_path = Path(str(out_raw)).expanduser()
|
|
3204
3260
|
if not out_path.is_absolute():
|
|
3205
|
-
|
|
3261
|
+
# 防双重拼接(E-1):调用方按 CLI 惯例传 cwd 相对路径时(如
|
|
3262
|
+
# .harness/changes/<cn>/evidence/x.json),直接拼 change_dir 会产生嵌套
|
|
3263
|
+
# 幽灵目录。相对路径若以 change-dir 自身前缀开头,按 cwd 解析;否则按
|
|
3264
|
+
# 文档规则相对 change-dir 解析。
|
|
3265
|
+
cwd = Path.cwd().resolve()
|
|
3266
|
+
change_resolved = change_dir.resolve()
|
|
3267
|
+
if _is_relative_to(change_resolved, cwd):
|
|
3268
|
+
change_rel = change_resolved.relative_to(cwd)
|
|
3269
|
+
if out_path.parts[: len(change_rel.parts)] == change_rel.parts:
|
|
3270
|
+
out_path = cwd / out_path
|
|
3271
|
+
else:
|
|
3272
|
+
out_path = change_dir / out_path
|
|
3273
|
+
else:
|
|
3274
|
+
out_path = change_dir / out_path
|
|
3206
3275
|
out_path = out_path.resolve()
|
|
3276
|
+
change_resolved = change_dir.resolve()
|
|
3277
|
+
cwd = Path.cwd().resolve()
|
|
3278
|
+
if not (
|
|
3279
|
+
_is_relative_to(out_path, change_resolved)
|
|
3280
|
+
or _is_relative_to(out_path, cwd)
|
|
3281
|
+
):
|
|
3282
|
+
return emit_error(
|
|
3283
|
+
"--out 解析后越出项目目录: " + str(out_path),
|
|
3284
|
+
as_json=as_json,
|
|
3285
|
+
error_code="SCENARIO_RECEIPT_OUT_OF_PROJECT",
|
|
3286
|
+
)
|
|
3207
3287
|
try:
|
|
3208
3288
|
out_path.parent.mkdir(parents=True, exist_ok=True)
|
|
3209
3289
|
out_path.write_text(body, encoding="utf-8", newline="\n")
|
|
@@ -3321,7 +3401,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
3321
3401
|
p_hash.set_defaults(func=cmd_hash)
|
|
3322
3402
|
|
|
3323
3403
|
p_reuse = sub.add_parser("can-reuse", parents=[shared_json], help="decide whether a verification can be reused")
|
|
3324
|
-
p_reuse.add_argument("--change-dir", required=True)
|
|
3404
|
+
p_reuse.add_argument("--change-dir", "--change", dest="change_dir", required=True)
|
|
3325
3405
|
p_reuse.add_argument(
|
|
3326
3406
|
"--verification",
|
|
3327
3407
|
required=True,
|
|
@@ -3389,7 +3469,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
3389
3469
|
p_reuse.set_defaults(func=cmd_can_reuse)
|
|
3390
3470
|
|
|
3391
3471
|
p_record = sub.add_parser("record", parents=[shared_json], help="write validation result into ledger")
|
|
3392
|
-
p_record.add_argument("--change-dir", required=True)
|
|
3472
|
+
p_record.add_argument("--change-dir", "--change", dest="change_dir", required=True)
|
|
3393
3473
|
p_record.add_argument("--verification", required=True)
|
|
3394
3474
|
p_record.add_argument("--status", required=True)
|
|
3395
3475
|
p_record.add_argument("--command", required=True)
|
|
@@ -3515,7 +3595,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
3515
3595
|
"pre-filled from meta/scenario-manifest.json"
|
|
3516
3596
|
),
|
|
3517
3597
|
)
|
|
3518
|
-
p_receipt.add_argument("--change-dir", required=True)
|
|
3598
|
+
p_receipt.add_argument("--change-dir", "--change", dest="change_dir", required=True)
|
|
3519
3599
|
p_receipt.add_argument(
|
|
3520
3600
|
"--scenario-ids",
|
|
3521
3601
|
required=True,
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"files": [
|
|
26
26
|
{
|
|
27
27
|
"path": ".harness-build.json",
|
|
28
|
-
"sha256": "
|
|
28
|
+
"sha256": "1c99b6458ab4c9312a30d8e39d93bbff946c4aa48b7937771ad63d1be410a3c1"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"path": "agents/harness-evaluator.md",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
99
|
"path": "harness-archive/SKILL.md",
|
|
100
|
-
"sha256": "
|
|
100
|
+
"sha256": "96fb9b004e9339fb60a45355348b1a0f23acffa2878ce76d4eb86a5135cf2262"
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
103
|
"path": "harness-archive/templates/summary-data-template.json",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
"path": "harness-codebase-map/SKILL.md",
|
|
116
|
-
"sha256": "
|
|
116
|
+
"sha256": "e83b1f4078f156510832ebf5976e76f5196052c6015dc0267aaaa7aac73c048b"
|
|
117
117
|
},
|
|
118
118
|
{
|
|
119
119
|
"path": "harness-codebase-map/templates/ARCHITECTURE.md",
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
"path": "harness-execute/SKILL.md",
|
|
172
|
-
"sha256": "
|
|
172
|
+
"sha256": "121334aec20ace1b2f69134fbdf9840f13ee052b09f4dc7b9126c8d65e1605c0"
|
|
173
173
|
},
|
|
174
174
|
{
|
|
175
175
|
"path": "harness-execute/testing-checklist.md",
|
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
},
|
|
178
178
|
{
|
|
179
179
|
"path": "harness-execute/testing-pitfalls-java.md",
|
|
180
|
-
"sha256": "
|
|
180
|
+
"sha256": "2cf63f7b9adc55a39a110b83118b228fa0ce3c73571baff3a118e4960438b5f1"
|
|
181
181
|
},
|
|
182
182
|
{
|
|
183
183
|
"path": "harness-execute/testing-pitfalls.md",
|
|
@@ -189,15 +189,15 @@
|
|
|
189
189
|
},
|
|
190
190
|
{
|
|
191
191
|
"path": "harness-knowledge-ingest/SKILL.md",
|
|
192
|
-
"sha256": "
|
|
192
|
+
"sha256": "12a05d555091c6e98073bdec501679c2635afa11318eef85f6527e4f651f2345"
|
|
193
193
|
},
|
|
194
194
|
{
|
|
195
195
|
"path": "harness-knowledge-query/SKILL.md",
|
|
196
|
-
"sha256": "
|
|
196
|
+
"sha256": "c28edcedfc9e928b3bb46f807fd45d4f41d8bcee287ef229b1c2671beed9bb6c"
|
|
197
197
|
},
|
|
198
198
|
{
|
|
199
199
|
"path": "harness-plan/checklist.md",
|
|
200
|
-
"sha256": "
|
|
200
|
+
"sha256": "d35fb45fed952001fa2c68aa71c0eb890e368f024ac6579f01a61dfe411f7a17"
|
|
201
201
|
},
|
|
202
202
|
{
|
|
203
203
|
"path": "harness-plan/protocols.md",
|
|
@@ -205,19 +205,19 @@
|
|
|
205
205
|
},
|
|
206
206
|
{
|
|
207
207
|
"path": "harness-plan/reference.md",
|
|
208
|
-
"sha256": "
|
|
208
|
+
"sha256": "cfb4a4ec17582bd841d2975c2e6458f86f1109db8b9ade569ced6b40b991e032"
|
|
209
209
|
},
|
|
210
210
|
{
|
|
211
211
|
"path": "harness-plan/SKILL.md",
|
|
212
|
-
"sha256": "
|
|
212
|
+
"sha256": "32773c9ff16f7d98d58ed8d26dceceff66b9b52f44e3e27ef72e0245cad161a1"
|
|
213
213
|
},
|
|
214
214
|
{
|
|
215
215
|
"path": "harness-pull/SKILL.md",
|
|
216
|
-
"sha256": "
|
|
216
|
+
"sha256": "8bf37aafc4e2f33e10eb151b06dc54e93e6d839f80de113e2e884017ee4d10af"
|
|
217
217
|
},
|
|
218
218
|
{
|
|
219
219
|
"path": "harness-push/SKILL.md",
|
|
220
|
-
"sha256": "
|
|
220
|
+
"sha256": "8f567c8eeafd3a054f182a4488ae7bdf495933348fb0ef1bf4f0d792b74258f8"
|
|
221
221
|
},
|
|
222
222
|
{
|
|
223
223
|
"path": "harness-review/checklist.md",
|
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
},
|
|
234
234
|
{
|
|
235
235
|
"path": "harness-review/SKILL.md",
|
|
236
|
-
"sha256": "
|
|
236
|
+
"sha256": "1a2756f40c93aac9d70e0ddffe48b37e03db184b86bb2ff48eb08cca5475dcf0"
|
|
237
237
|
},
|
|
238
238
|
{
|
|
239
239
|
"path": "harness-submit/checklist.md",
|
|
@@ -245,7 +245,7 @@
|
|
|
245
245
|
},
|
|
246
246
|
{
|
|
247
247
|
"path": "harness-submit/SKILL.md",
|
|
248
|
-
"sha256": "
|
|
248
|
+
"sha256": "3d8682974b686106c9f16370476bae01e952bf8f8ff4f697b6820fd495b7ab46"
|
|
249
249
|
},
|
|
250
250
|
{
|
|
251
251
|
"path": "harness-sync/reference.md",
|
|
@@ -253,7 +253,7 @@
|
|
|
253
253
|
},
|
|
254
254
|
{
|
|
255
255
|
"path": "harness-sync/SKILL.md",
|
|
256
|
-
"sha256": "
|
|
256
|
+
"sha256": "be2c998edb857f430eb8622197054ee8711fe547b092c0afb6b2c0573e8d0023"
|
|
257
257
|
},
|
|
258
258
|
{
|
|
259
259
|
"path": "protocols/archive-report-protocol.md",
|
|
@@ -341,7 +341,7 @@
|
|
|
341
341
|
},
|
|
342
342
|
{
|
|
343
343
|
"path": "scripts/harness_context.py",
|
|
344
|
-
"sha256": "
|
|
344
|
+
"sha256": "397c2c6c37a40a6989fc6eec35371db7f17775f52714a2285fcc6e2071d1d02d"
|
|
345
345
|
},
|
|
346
346
|
{
|
|
347
347
|
"path": "scripts/harness_deploy.py",
|
|
@@ -361,7 +361,7 @@
|
|
|
361
361
|
},
|
|
362
362
|
{
|
|
363
363
|
"path": "scripts/harness_events.py",
|
|
364
|
-
"sha256": "
|
|
364
|
+
"sha256": "0745291af0c1012351c56dbfa4c23d29c3c72162e31f075d3981415fa87391b3"
|
|
365
365
|
},
|
|
366
366
|
{
|
|
367
367
|
"path": "scripts/harness_execution_contracts.py",
|
|
@@ -373,7 +373,7 @@
|
|
|
373
373
|
},
|
|
374
374
|
{
|
|
375
375
|
"path": "scripts/harness_gate.py",
|
|
376
|
-
"sha256": "
|
|
376
|
+
"sha256": "191f1f2025702e3af9891cf9a8e346d152800ba6c35c0576402f4048e1b0c380"
|
|
377
377
|
},
|
|
378
378
|
{
|
|
379
379
|
"path": "scripts/harness_headless.py",
|
|
@@ -389,7 +389,7 @@
|
|
|
389
389
|
},
|
|
390
390
|
{
|
|
391
391
|
"path": "scripts/harness_ledger.py",
|
|
392
|
-
"sha256": "
|
|
392
|
+
"sha256": "97e27a8d585f5af0034bb79caf71aff15231a779da2fc9f331cb2430359fb9dc"
|
|
393
393
|
},
|
|
394
394
|
{
|
|
395
395
|
"path": "scripts/harness_migration_head.py",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"files": [
|
|
26
26
|
{
|
|
27
27
|
"path": ".harness-build.json",
|
|
28
|
-
"sha256": "
|
|
28
|
+
"sha256": "6eeb855dda8a3ebf7f2efaf4cc3786048f548571a9ea751af3a00ac2190d9f01"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"path": "agents/harness-evaluator.md",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
99
|
"path": "harness-archive/SKILL.md",
|
|
100
|
-
"sha256": "
|
|
100
|
+
"sha256": "8ef4544d072cebdce77bff0d1175f84e1670b00c2720a7a2be51550d60a00001"
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
103
|
"path": "harness-archive/templates/summary-data-template.json",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
"path": "harness-codebase-map/SKILL.md",
|
|
116
|
-
"sha256": "
|
|
116
|
+
"sha256": "4039ac482a84c3343f7ce8283d415095bb272ce63c8a76ebd3303a789fdc53ba"
|
|
117
117
|
},
|
|
118
118
|
{
|
|
119
119
|
"path": "harness-codebase-map/templates/ARCHITECTURE.md",
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
"path": "harness-execute/SKILL.md",
|
|
172
|
-
"sha256": "
|
|
172
|
+
"sha256": "639b6b1bbc23aacd331ee5487193e1bf1ddeae6065ae4338ab5fd6765a6ff7ab"
|
|
173
173
|
},
|
|
174
174
|
{
|
|
175
175
|
"path": "harness-execute/testing-checklist.md",
|
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
},
|
|
178
178
|
{
|
|
179
179
|
"path": "harness-execute/testing-pitfalls-java.md",
|
|
180
|
-
"sha256": "
|
|
180
|
+
"sha256": "2cf63f7b9adc55a39a110b83118b228fa0ce3c73571baff3a118e4960438b5f1"
|
|
181
181
|
},
|
|
182
182
|
{
|
|
183
183
|
"path": "harness-execute/testing-pitfalls.md",
|
|
@@ -189,15 +189,15 @@
|
|
|
189
189
|
},
|
|
190
190
|
{
|
|
191
191
|
"path": "harness-knowledge-ingest/SKILL.md",
|
|
192
|
-
"sha256": "
|
|
192
|
+
"sha256": "44b269b7d537d8dc142e8c0a9cc7fcda62b541ee889c14ea08a6cf7e5811a229"
|
|
193
193
|
},
|
|
194
194
|
{
|
|
195
195
|
"path": "harness-knowledge-query/SKILL.md",
|
|
196
|
-
"sha256": "
|
|
196
|
+
"sha256": "03145de066a52d59a18ab4fe0d02e50036ad44fe07ed73de9efb96b9a2a3bdd1"
|
|
197
197
|
},
|
|
198
198
|
{
|
|
199
199
|
"path": "harness-plan/checklist.md",
|
|
200
|
-
"sha256": "
|
|
200
|
+
"sha256": "d35fb45fed952001fa2c68aa71c0eb890e368f024ac6579f01a61dfe411f7a17"
|
|
201
201
|
},
|
|
202
202
|
{
|
|
203
203
|
"path": "harness-plan/protocols.md",
|
|
@@ -205,19 +205,19 @@
|
|
|
205
205
|
},
|
|
206
206
|
{
|
|
207
207
|
"path": "harness-plan/reference.md",
|
|
208
|
-
"sha256": "
|
|
208
|
+
"sha256": "cfb4a4ec17582bd841d2975c2e6458f86f1109db8b9ade569ced6b40b991e032"
|
|
209
209
|
},
|
|
210
210
|
{
|
|
211
211
|
"path": "harness-plan/SKILL.md",
|
|
212
|
-
"sha256": "
|
|
212
|
+
"sha256": "e09c65987882a314d15fe055fb924633aec20ee1ca74a0e8a1fc55a89ad0a93f"
|
|
213
213
|
},
|
|
214
214
|
{
|
|
215
215
|
"path": "harness-pull/SKILL.md",
|
|
216
|
-
"sha256": "
|
|
216
|
+
"sha256": "5ef7499a1a93e3262b8f888405812c28e7af7f394d7576aff2d89dda4d16823a"
|
|
217
217
|
},
|
|
218
218
|
{
|
|
219
219
|
"path": "harness-push/SKILL.md",
|
|
220
|
-
"sha256": "
|
|
220
|
+
"sha256": "15ea3fe659ed3bff0ec876d492928f554c3f329fcdcfb7eace07a6df4adccff9"
|
|
221
221
|
},
|
|
222
222
|
{
|
|
223
223
|
"path": "harness-review/checklist.md",
|
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
},
|
|
234
234
|
{
|
|
235
235
|
"path": "harness-review/SKILL.md",
|
|
236
|
-
"sha256": "
|
|
236
|
+
"sha256": "02d15b5b483ee10c0701146dee5292aa017b28d7f8e2212584536cb80f35a125"
|
|
237
237
|
},
|
|
238
238
|
{
|
|
239
239
|
"path": "harness-submit/checklist.md",
|
|
@@ -245,7 +245,7 @@
|
|
|
245
245
|
},
|
|
246
246
|
{
|
|
247
247
|
"path": "harness-submit/SKILL.md",
|
|
248
|
-
"sha256": "
|
|
248
|
+
"sha256": "3fe77769051e81b1e774fec49bfac9f8fbe64080ef09ad2701c65744b846aca2"
|
|
249
249
|
},
|
|
250
250
|
{
|
|
251
251
|
"path": "harness-sync/reference.md",
|
|
@@ -253,7 +253,7 @@
|
|
|
253
253
|
},
|
|
254
254
|
{
|
|
255
255
|
"path": "harness-sync/SKILL.md",
|
|
256
|
-
"sha256": "
|
|
256
|
+
"sha256": "1d429c9d3f3e2cdf399736fbc5da06f32e970d923fb2cd8fbd5a21651337d8ea"
|
|
257
257
|
},
|
|
258
258
|
{
|
|
259
259
|
"path": "protocols/archive-report-protocol.md",
|
|
@@ -341,7 +341,7 @@
|
|
|
341
341
|
},
|
|
342
342
|
{
|
|
343
343
|
"path": "scripts/harness_context.py",
|
|
344
|
-
"sha256": "
|
|
344
|
+
"sha256": "397c2c6c37a40a6989fc6eec35371db7f17775f52714a2285fcc6e2071d1d02d"
|
|
345
345
|
},
|
|
346
346
|
{
|
|
347
347
|
"path": "scripts/harness_deploy.py",
|
|
@@ -361,7 +361,7 @@
|
|
|
361
361
|
},
|
|
362
362
|
{
|
|
363
363
|
"path": "scripts/harness_events.py",
|
|
364
|
-
"sha256": "
|
|
364
|
+
"sha256": "0745291af0c1012351c56dbfa4c23d29c3c72162e31f075d3981415fa87391b3"
|
|
365
365
|
},
|
|
366
366
|
{
|
|
367
367
|
"path": "scripts/harness_execution_contracts.py",
|
|
@@ -373,7 +373,7 @@
|
|
|
373
373
|
},
|
|
374
374
|
{
|
|
375
375
|
"path": "scripts/harness_gate.py",
|
|
376
|
-
"sha256": "
|
|
376
|
+
"sha256": "191f1f2025702e3af9891cf9a8e346d152800ba6c35c0576402f4048e1b0c380"
|
|
377
377
|
},
|
|
378
378
|
{
|
|
379
379
|
"path": "scripts/harness_headless.py",
|
|
@@ -389,7 +389,7 @@
|
|
|
389
389
|
},
|
|
390
390
|
{
|
|
391
391
|
"path": "scripts/harness_ledger.py",
|
|
392
|
-
"sha256": "
|
|
392
|
+
"sha256": "97e27a8d585f5af0034bb79caf71aff15231a779da2fc9f331cb2430359fb9dc"
|
|
393
393
|
},
|
|
394
394
|
{
|
|
395
395
|
"path": "scripts/harness_migration_head.py",
|