@hunter-harness/workflow-harness 0.4.10 → 0.4.11
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 +4 -2
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-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 +12 -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_events.py +12 -8
- package/harness/bundles/general/claude-code/scripts/harness_fixback.py +37 -1
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +30 -1
- package/harness/bundles/general/claude-code/scripts/harness_process.py +18 -0
- package/harness/bundles/general/claude-code/scripts/harness_runtime.py +47 -1
- 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 +4 -2
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-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 +12 -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_events.py +12 -8
- package/harness/bundles/general/codebuddy/scripts/harness_fixback.py +37 -1
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +30 -1
- package/harness/bundles/general/codebuddy/scripts/harness_process.py +18 -0
- package/harness/bundles/general/codebuddy/scripts/harness_runtime.py +47 -1
- 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 +4 -2
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-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_events.py +12 -8
- package/harness/bundles/general/codex/scripts/harness_fixback.py +37 -1
- package/harness/bundles/general/codex/scripts/harness_gate.py +30 -1
- package/harness/bundles/general/codex/scripts/harness_process.py +18 -0
- package/harness/bundles/general/codex/scripts/harness_runtime.py +47 -1
- 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 +4 -2
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-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_events.py +12 -8
- package/harness/bundles/general/cursor/scripts/harness_fixback.py +37 -1
- package/harness/bundles/general/cursor/scripts/harness_gate.py +30 -1
- package/harness/bundles/general/cursor/scripts/harness_process.py +18 -0
- package/harness/bundles/general/cursor/scripts/harness_runtime.py +47 -1
- 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 +4 -2
- package/harness/bundles/general/pi/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-plan/SKILL.md +1 -1
- 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_events.py +12 -8
- package/harness/bundles/general/pi/scripts/harness_fixback.py +37 -1
- package/harness/bundles/general/pi/scripts/harness_gate.py +30 -1
- package/harness/bundles/general/pi/scripts/harness_process.py +18 -0
- package/harness/bundles/general/pi/scripts/harness_runtime.py +47 -1
- 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 +4 -2
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -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 +1 -1
- 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 +12 -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_events.py +12 -8
- package/harness/bundles/java/claude-code/scripts/harness_fixback.py +37 -1
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +30 -1
- package/harness/bundles/java/claude-code/scripts/harness_process.py +18 -0
- package/harness/bundles/java/claude-code/scripts/harness_runtime.py +47 -1
- 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 +4 -2
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -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 +1 -1
- 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 +12 -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_events.py +12 -8
- package/harness/bundles/java/codebuddy/scripts/harness_fixback.py +37 -1
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +30 -1
- package/harness/bundles/java/codebuddy/scripts/harness_process.py +18 -0
- package/harness/bundles/java/codebuddy/scripts/harness_runtime.py +47 -1
- 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 +4 -2
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -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 +1 -1
- 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_events.py +12 -8
- package/harness/bundles/java/codex/scripts/harness_fixback.py +37 -1
- package/harness/bundles/java/codex/scripts/harness_gate.py +30 -1
- package/harness/bundles/java/codex/scripts/harness_process.py +18 -0
- package/harness/bundles/java/codex/scripts/harness_runtime.py +47 -1
- 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 +4 -2
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -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 +1 -1
- 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_events.py +12 -8
- package/harness/bundles/java/cursor/scripts/harness_fixback.py +37 -1
- package/harness/bundles/java/cursor/scripts/harness_gate.py +30 -1
- package/harness/bundles/java/cursor/scripts/harness_process.py +18 -0
- package/harness/bundles/java/cursor/scripts/harness_runtime.py +47 -1
- 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 +4 -2
- package/harness/bundles/java/pi/harness-knowledge-ingest/SKILL.md +1 -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 +1 -1
- 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_events.py +12 -8
- package/harness/bundles/java/pi/scripts/harness_fixback.py +37 -1
- package/harness/bundles/java/pi/scripts/harness_gate.py +30 -1
- package/harness/bundles/java/pi/scripts/harness_process.py +18 -0
- package/harness/bundles/java/pi/scripts/harness_runtime.py +47 -1
- package/harness/manifests/general/claude-code.json +17 -17
- package/harness/manifests/general/codebuddy.json +17 -17
- package/harness/manifests/general/codex.json +17 -17
- package/harness/manifests/general/cursor.json +17 -17
- package/harness/manifests/general/pi.json +17 -17
- package/harness/manifests/java/claude-code.json +19 -19
- package/harness/manifests/java/codebuddy.json +19 -19
- package/harness/manifests/java/codex.json +19 -19
- package/harness/manifests/java/cursor.json +19 -19
- package/harness/manifests/java/pi.json +19 -19
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ name: harness-archive
|
|
|
3
3
|
description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档)到 .harness/archive/,含归档元数据。仅当用户显式调用
|
|
4
4
|
/harness-archive 时使用;不得被其他阶段 skill 自动接续触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
7
7
|
# harness-archive — 变更归档
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-codebase-map
|
|
|
3
3
|
description: 分析现有代码库并生成 .harness/codebase/map/
|
|
4
4
|
下的结构化代码库地图。用于陌生项目理解、重大改造前梳理、harness-sync 提示 map 过期后的人工刷新。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
7
7
|
# harness-codebase-map — 代码库地图
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -4,7 +4,7 @@ description: 执行阶段:按变更簇执行 TDD
|
|
|
4
4
|
编码循环(RED→GREEN→REFACTOR→编译验证),随后完成单元/接口/数据兼容验证并输出测试报告。仅当用户显式调用
|
|
5
5
|
/harness-execute 时使用;不得因用户提到编码/实现/测试就自动触发,也不得被其他阶段 skill 自动接续。
|
|
6
6
|
---
|
|
7
|
-
<!-- generated by harness_deploy.py; core=
|
|
7
|
+
<!-- generated by harness_deploy.py; core=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
8
8
|
# harness-execute — 执行(编码 + 验证)
|
|
9
9
|
|
|
10
10
|
> 2026-08 阶段合并:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段;
|
|
@@ -62,12 +62,14 @@ description: 执行阶段:按变更簇执行 TDD
|
|
|
62
62
|
## Workflow 概要
|
|
63
63
|
|
|
64
64
|
0. 加载上下文:先 `harness_context.py prepare --project . --change <id> --phase execute --executor <tool> --json`(`--project` 必填),再 `harness_context.py begin --project . --change <id> --phase execute --executor <tool> --json` 校验交接,最后运行 **`harness_gate.py begin --phase execute --change <id>`**。旧名 `--phase run` / `--phase test` 仍被接受并归一为 execute。<br>Git Bash 注意:`--note` 等字符串参数**不要以 `/` 开头**(MSYS 会把它当路径改写成 `C:/Program Files/Git/...`);以 `/` 开头时先 `MSYS_NO_PATHCONV=1`。<br>**交接凭证不必手工补**:v2 计划的 `plan finalize` 不写 context 事务,`prepare` 会在检测到 committed 的 `meta/publication-journals/*.json` 时自动补录 `plan → execute` 凭证(凭证带 `bootstrapSource=plan_publication_journal` 留痕)。仍报 `HANDOFF_REQUIRED`/`LEGACY_BOOTSTRAP_REQUIRED` 说明**没有**这份发布证据——回到 plan 阶段确认发布是否真的完成,**不得**自己拼 `classify + configure-plan + close` 造凭证。<br>**Fixback** 不得拼装底层步骤,必须只调用一次 `harness_fixback.py launch-review --project . --change <id> --change-dir <change-dir> --executor <tool> --skills-root <skills-root> --product-identity <当前产品身份> --json`;返回 `FIXBACK_NOTHING_TO_APPLY` 时直接报告并停止。禁止手写 `events.ndjson` / `phase.end`。
|
|
65
|
+
|
|
66
|
+
**Fixback 步骤序列**(0.4.11 起文档化;每步失败都有 recoveryAction):launch-review 启动批次 → 托管 RED 会话(`harness_runtime.py run-start --verification fixback-red --product-identity <批次 baseProductIdentity,缺省自动注入> -- ...`)→ `harness_fixback.py evidence-template` 生成证据 + `register-evidence` 注册 → 修复 → GREEN 会话同法 → 逐 issue `resolve-issue` → `harness_review.py write-dispositions` 处置 → affected 验证会话 + review 收据 → `harness_fixback.py close --change-dir <change-dir> --batch-id <批次> --final-product-identity <身份>`(批次关闭会同步把 fixback-session 置 CLOSED)→ `harness_gate.py close --phase execute`(fixback 回环自动派生回 submit)。Windows 上命令名写 `mvn` 会 WinError 2——0.4.11 起 launcher 自动解析 .cmd/.exe,更早版本请写全路径。
|
|
65
67
|
0.5. **测试基础设施探测**与**命令执行模式 preflight** → `testing-reference.md`「命令执行模式 preflight」;测试基线已由 gate begin 内部建立,不得再次执行 guard begin
|
|
66
68
|
1. **变更簇 TDD** — `protocols.md` `run-tdd-protocol`;批量 RED/GREEN;按需 `change-cluster-review-protocol`
|
|
67
69
|
2. 构建验证 + **仅**通过 `harness_ledger.py record` 写 ledger(禁止 Write/Edit `verification-ledger.json`);profile 缺失或陈旧时先 `harness_preflight.py detect --project . --json`;`record --project . --profile-input <key>` 从同一 target 推导 scope、coverage、规范命令与输入闭包
|
|
68
70
|
3. **验证执行**:单元测试可复用则跳过(`harness_ledger.py can-reuse`);接口测试**强制批量执行器**一次跑完全部场景;数据兼容验证按场景表执行 → `testing-reference.md`
|
|
69
71
|
4. **场景覆盖检查**(场景表映射,禁止用用例数冒充场景数)
|
|
70
|
-
5. **关门检查**(10 项)→ 只执行一次 `harness_gate.py close`;`--to-phase` 可省略——计划后继唯一(排除 fixback 自环)时自动派生并交接(输出含 `derivedToPhase`)。仅 fixback 回环时显式传 `--to-phase execute
|
|
72
|
+
5. **关门检查**(10 项)→ 只执行一次 `harness_gate.py close`;`--to-phase` 可省略——计划后继唯一(排除 fixback 自环)时自动派生并交接(输出含 `derivedToPhase`)。仅 fixback 回环时显式传 `--to-phase execute`;fixback 批次的 execute 关门自动派生 review 的后继(submit),不会错误地再回一轮 review(0.4.11 起)。该命令内部关闭 test guard、写 `phase.end`、释放租约、写 handoff 并补传事件;不得再单独调用 test-guard/context close。失败时按结构化 `recoveryAction` 原样重试,已完成步骤幂等复用。
|
|
71
73
|
|
|
72
74
|
**阶段归属规则**:只用 `ownerPhase=execute` 的任务和场景判定本阶段结果。`ownerPhase=review`/`submit` 的场景按计划留给后续阶段属于正常移交,出现在关门返回值的 `deferred` 里,不阻断 execute。合并前 `ownerPhase=run`/`test` 的旧清单经别名表归一为 execute,在 execute 关门时一并到期。
|
|
73
75
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-knowledge-ingest
|
|
3
3
|
description: 确认归档 ZIP 已上传并由 Hunter Platform 在服务端解包、校验和入库。客户端不再构建或维护本地知识索引。
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
6
6
|
# harness-knowledge-ingest
|
|
7
7
|
|
|
8
8
|
知识 ingest 完全由 Hunter Platform 负责。归档完成时,客户端生成一个确定性 ZIP;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-knowledge-query
|
|
3
3
|
description: 在规划、实现或排查前,通过 hunter-harness CLI 查询远端项目知识库。远端不可用时直接报告不可用,不建立本地索引或离线回退。
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
6
6
|
# harness-knowledge-query
|
|
7
7
|
|
|
8
8
|
项目知识以 Hunter Platform 的服务端索引为唯一真源。客户端只提交查询并消费结果:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-package
|
|
3
3
|
description: 增量模块打包:拉取最新→编译验证→mvn package→汇总 jar/war。仅当用户显式调用 /harness-package 时使用,不得自动触发。
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
6
6
|
# harness-package — 增量模块打包(Java overlay)
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-plan
|
|
|
3
3
|
description: 将需求转化为设计文档+实施计划+完整测试场景表,必须在编码前完成。仅当用户显式调用 /harness-plan 或明确要求进入
|
|
4
4
|
Harness 规划阶段时使用;不得因用户描述需求就自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
7
7
|
# harness-plan — 需求规划
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -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=85f25ea4b4eae5cd; overlay=java; agent=pi; 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=85f25ea4b4eae5cd; overlay=java; agent=pi; 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=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
8
8
|
# harness-review — 代码审查
|
|
9
9
|
|
|
10
10
|
## Purpose
|
|
@@ -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=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
7
7
|
# harness-submit — 最终提交(含 worktree 合并)
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -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=85f25ea4b4eae5cd; overlay=java; agent=pi; do not edit -->
|
|
8
8
|
# harness-sync
|
|
9
9
|
|
|
10
10
|
## Purpose
|
|
@@ -898,14 +898,18 @@ def validate_append_event(args: argparse.Namespace) -> tuple[str, str] | None:
|
|
|
898
898
|
f"EVENT_REQUIRED_FIELD: {event_type} requires " + ", ".join(missing),
|
|
899
899
|
)
|
|
900
900
|
allowed = _EVENT_ALLOWED_FIELDS[event_type]
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
901
|
+
disallowed = [
|
|
902
|
+
f"--{field.replace('_', '-')}"
|
|
903
|
+
for field in OPTIONAL_FIELDS
|
|
904
|
+
if getattr(args, field, None) is not None and field not in allowed
|
|
905
|
+
]
|
|
906
|
+
if disallowed:
|
|
907
|
+
# 一次列出全部不被接受的字段——逐个报错会让调用方每字段往返一轮(R-4)
|
|
908
|
+
return (
|
|
909
|
+
"EVENT_FIELD_NOT_ALLOWED",
|
|
910
|
+
f"EVENT_FIELD_NOT_ALLOWED: {event_type} does not accept "
|
|
911
|
+
+ ", ".join(disallowed),
|
|
912
|
+
)
|
|
909
913
|
for field, length in (("trace_id", 32), ("span_id", 16), ("parent_span_id", 16)):
|
|
910
914
|
value = getattr(args, field, None)
|
|
911
915
|
if value is not None and not re.fullmatch(rf"[0-9a-f]{{{length}}}", str(value)):
|
|
@@ -75,6 +75,14 @@ def _write_json(path: Path, value: dict[str, Any]) -> None:
|
|
|
75
75
|
temporary.unlink(missing_ok=True)
|
|
76
76
|
|
|
77
77
|
|
|
78
|
+
def _read_json(path: Path) -> Any:
|
|
79
|
+
try:
|
|
80
|
+
value = json.loads(path.read_text(encoding="utf-8-sig"))
|
|
81
|
+
except (OSError, json.JSONDecodeError):
|
|
82
|
+
return None
|
|
83
|
+
return value
|
|
84
|
+
|
|
85
|
+
|
|
78
86
|
def _load(change_dir: Path, batch_id: str) -> dict[str, Any]:
|
|
79
87
|
path = _batch_path(change_dir, batch_id)
|
|
80
88
|
try:
|
|
@@ -1186,7 +1194,21 @@ def evidence_template(
|
|
|
1186
1194
|
"provenance": provenance,
|
|
1187
1195
|
}
|
|
1188
1196
|
target = Path(out) if out else Path("runtime") / f"fixback-{resolved_id}.json"
|
|
1189
|
-
|
|
1197
|
+
if target.is_absolute():
|
|
1198
|
+
path = target
|
|
1199
|
+
else:
|
|
1200
|
+
# F-3:与 ledger --out 同一类坑——相对路径已含 change-dir 前缀时直接拼
|
|
1201
|
+
# change_dir 会产生嵌套幽灵目录(2026-08-31 实测)。前缀命中按 cwd 解析。
|
|
1202
|
+
cwd = Path.cwd().resolve()
|
|
1203
|
+
change_resolved = change_dir.resolve()
|
|
1204
|
+
if _is_within(change_resolved, [cwd]):
|
|
1205
|
+
change_rel = change_resolved.relative_to(cwd)
|
|
1206
|
+
if target.parts[: len(change_rel.parts)] == change_rel.parts:
|
|
1207
|
+
path = cwd / target
|
|
1208
|
+
else:
|
|
1209
|
+
path = change_dir / target
|
|
1210
|
+
else:
|
|
1211
|
+
path = change_dir / target
|
|
1190
1212
|
path = path.resolve()
|
|
1191
1213
|
if not _is_within(path, [change_dir.resolve(), state_root, _project_root(change_dir)]):
|
|
1192
1214
|
return {
|
|
@@ -1708,6 +1730,20 @@ def close_batch(
|
|
|
1708
1730
|
}
|
|
1709
1731
|
)
|
|
1710
1732
|
_write_json(_batch_path(change_dir, batch_id), batch)
|
|
1733
|
+
# F-5:批次关闭会同步把托管会话置为 CLOSED——否则 session 永远 ACTIVE,
|
|
1734
|
+
# 后续 launch-review 被 CONTEXT_PREPARATION_ACTIVE 幂等保护误拦(2026-08-31
|
|
1735
|
+
# demo-datasource 实测)。
|
|
1736
|
+
session_file = _session_path(change_dir)
|
|
1737
|
+
session = _read_json(session_file)
|
|
1738
|
+
if (
|
|
1739
|
+
isinstance(session, dict)
|
|
1740
|
+
and session.get("batchId") == batch_id
|
|
1741
|
+
and session.get("status") == "ACTIVE"
|
|
1742
|
+
):
|
|
1743
|
+
session["status"] = "CLOSED"
|
|
1744
|
+
session["nextStep"] = "done"
|
|
1745
|
+
session["updatedAt"] = closed_at
|
|
1746
|
+
_write_json(session_file, session)
|
|
1711
1747
|
return batch
|
|
1712
1748
|
|
|
1713
1749
|
|
|
@@ -3105,6 +3105,20 @@ def _resume_closed_phase(
|
|
|
3105
3105
|
for candidate in hctx.allowed_next_phases(project, change_id, args.phase)
|
|
3106
3106
|
if hp.resolve_phase_name(candidate) != args.phase
|
|
3107
3107
|
]
|
|
3108
|
+
# F-4:续跑路径同样——fixback 回环的 execute 关门应回 review 的后继
|
|
3109
|
+
if args.phase == "execute" and isinstance(transitions, list) and transitions:
|
|
3110
|
+
latest_t = transitions[-1]
|
|
3111
|
+
if (
|
|
3112
|
+
isinstance(latest_t, dict)
|
|
3113
|
+
and hp.resolve_phase_name(latest_t.get("fromPhase")) == "review"
|
|
3114
|
+
and hp.resolve_phase_name(latest_t.get("toPhase")) == "execute"
|
|
3115
|
+
and latest_t.get("trigger") == "review-fixback"
|
|
3116
|
+
):
|
|
3117
|
+
candidates = [
|
|
3118
|
+
candidate
|
|
3119
|
+
for candidate in hctx.allowed_next_phases(project, change_id, "review")
|
|
3120
|
+
if hp.resolve_phase_name(candidate) != args.phase
|
|
3121
|
+
]
|
|
3108
3122
|
if to_phase is None and len(candidates) == 1:
|
|
3109
3123
|
# 计划后继唯一(排除 fixback 自环):close 的意图没有歧义,直接补跑 handoff
|
|
3110
3124
|
to_phase = candidates[0]
|
|
@@ -3691,10 +3705,25 @@ def cmd_close(args: argparse.Namespace) -> int:
|
|
|
3691
3705
|
and context_view.get("ok")
|
|
3692
3706
|
and isinstance(context_view.get("current"), dict)
|
|
3693
3707
|
):
|
|
3708
|
+
# F-4:fixback 回环(最新交接是 review→execute 且 trigger=
|
|
3709
|
+
# review-fixback)关门时,后继不是再来一轮 review,而是 review
|
|
3710
|
+
# 当时的计划后继(submit)。不按此处理会把 transitions 链写成
|
|
3711
|
+
# …→review→execute→review 的语义错乱(2026-08-31 实测)。
|
|
3712
|
+
source_phase = args.phase
|
|
3713
|
+
transitions = context_view.get("transitions") or []
|
|
3714
|
+
if args.phase == "execute" and transitions:
|
|
3715
|
+
latest = transitions[-1]
|
|
3716
|
+
if (
|
|
3717
|
+
isinstance(latest, dict)
|
|
3718
|
+
and hp.resolve_phase_name(latest.get("fromPhase")) == "review"
|
|
3719
|
+
and hp.resolve_phase_name(latest.get("toPhase")) == "execute"
|
|
3720
|
+
and latest.get("trigger") == "review-fixback"
|
|
3721
|
+
):
|
|
3722
|
+
source_phase = "review"
|
|
3694
3723
|
forward = [
|
|
3695
3724
|
candidate
|
|
3696
3725
|
for candidate in hctx.allowed_next_phases(
|
|
3697
|
-
project, str(resolved["changeId"]),
|
|
3726
|
+
project, str(resolved["changeId"]), source_phase
|
|
3698
3727
|
)
|
|
3699
3728
|
if hp.resolve_phase_name(candidate) != args.phase
|
|
3700
3729
|
]
|
|
@@ -15,6 +15,7 @@ import json
|
|
|
15
15
|
import os
|
|
16
16
|
from pathlib import Path
|
|
17
17
|
import signal
|
|
18
|
+
import shutil
|
|
18
19
|
import subprocess
|
|
19
20
|
import sys
|
|
20
21
|
import time
|
|
@@ -946,6 +947,23 @@ def capture_owned_members(spawned: SpawnedProcess) -> dict[str, Any] | None:
|
|
|
946
947
|
return proof
|
|
947
948
|
|
|
948
949
|
|
|
950
|
+
def resolve_windows_executable(argv: Sequence[str]) -> list[str]:
|
|
951
|
+
"""Windows 无扩展名命令解析为实际可执行文件(F-1)。
|
|
952
|
+
|
|
953
|
+
CreateProcess 不走 shell,`mvn`/`npm` 这类 .cmd 包装会报 WinError 2;
|
|
954
|
+
shutil.which 遵循 PATHEXT 能找到 mvn.cmd。POSIX 或未命中时原样返回。
|
|
955
|
+
"""
|
|
956
|
+
if os.name != "nt" or not argv:
|
|
957
|
+
return list(argv)
|
|
958
|
+
head = argv[0]
|
|
959
|
+
if not isinstance(head, str) or not head or os.path.splitext(head)[1]:
|
|
960
|
+
return list(argv)
|
|
961
|
+
resolved = shutil.which(head)
|
|
962
|
+
if resolved is None:
|
|
963
|
+
return list(argv)
|
|
964
|
+
return [resolved, *argv[1:]]
|
|
965
|
+
|
|
966
|
+
|
|
949
967
|
def spawn_structured_argv(
|
|
950
968
|
argv: Sequence[str],
|
|
951
969
|
*,
|
|
@@ -1099,6 +1099,9 @@ def _spawn_detached_worker(
|
|
|
1099
1099
|
env: dict[str, str],
|
|
1100
1100
|
output: Any = subprocess.DEVNULL,
|
|
1101
1101
|
) -> subprocess.Popen[bytes]:
|
|
1102
|
+
from harness_process import resolve_windows_executable
|
|
1103
|
+
|
|
1104
|
+
argv = resolve_windows_executable(argv)
|
|
1102
1105
|
kwargs: dict[str, Any] = {
|
|
1103
1106
|
"cwd": str(cwd),
|
|
1104
1107
|
"env": env,
|
|
@@ -1171,6 +1174,40 @@ def start_run_session(
|
|
|
1171
1174
|
working_directory = working_directory.expanduser().resolve()
|
|
1172
1175
|
if not working_directory.is_dir():
|
|
1173
1176
|
raise ValueError(f"RUN_SESSION_WORKDIR_MISSING: {working_directory}")
|
|
1177
|
+
# F-2:fixback 会话缺 product-identity 时白跑一轮、register 才拒。批次开着
|
|
1178
|
+
# 就从 baseProductIdentity 自动注入;没有 OPEN 批次则当场拒绝(2026-08-31
|
|
1179
|
+
# demo-datasource 实测)。
|
|
1180
|
+
if verification.startswith("fixback") and not (
|
|
1181
|
+
product_identity and product_identity.strip()
|
|
1182
|
+
):
|
|
1183
|
+
batches_dir = state_root / "fixback" / "batches"
|
|
1184
|
+
open_identity: str | None = None
|
|
1185
|
+
open_batch_id: str | None = None
|
|
1186
|
+
if batches_dir.is_dir():
|
|
1187
|
+
for batch_file in sorted(batches_dir.glob("*.json")):
|
|
1188
|
+
try:
|
|
1189
|
+
batch = json.loads(batch_file.read_text(encoding="utf-8-sig"))
|
|
1190
|
+
except (OSError, json.JSONDecodeError):
|
|
1191
|
+
continue
|
|
1192
|
+
if (
|
|
1193
|
+
isinstance(batch, dict)
|
|
1194
|
+
and batch.get("status") == "OPEN"
|
|
1195
|
+
and isinstance(batch.get("baseProductIdentity"), str)
|
|
1196
|
+
and batch["baseProductIdentity"].strip()
|
|
1197
|
+
):
|
|
1198
|
+
open_identity = str(batch["baseProductIdentity"]).strip()
|
|
1199
|
+
open_batch_id = str(batch.get("batchId") or "")
|
|
1200
|
+
break
|
|
1201
|
+
if open_identity is None:
|
|
1202
|
+
raise ValueError(
|
|
1203
|
+
"FIXBACK_PRODUCT_IDENTITY_REQUIRED: fixback 会话必须有产品身份——"
|
|
1204
|
+
"传 --product-identity,或先启动 fixback 批次(其 baseProductIdentity "
|
|
1205
|
+
"会被自动注入)"
|
|
1206
|
+
)
|
|
1207
|
+
product_identity = open_identity
|
|
1208
|
+
product_identity_source = f"fixback-batch:{open_batch_id}"
|
|
1209
|
+
else:
|
|
1210
|
+
product_identity_source = None
|
|
1174
1211
|
session_id = session_id or f"run-{uuid.uuid4().hex}"
|
|
1175
1212
|
run_id = run_id or session_id
|
|
1176
1213
|
session_root = _run_session_root(state_root, session_id)
|
|
@@ -1215,6 +1252,11 @@ def start_run_session(
|
|
|
1215
1252
|
"heartbeatSeconds": heartbeat_seconds,
|
|
1216
1253
|
"expectedDurationSeconds": expected_duration_seconds,
|
|
1217
1254
|
"productIdentity": product_identity,
|
|
1255
|
+
**(
|
|
1256
|
+
{"productIdentitySource": product_identity_source}
|
|
1257
|
+
if product_identity_source is not None
|
|
1258
|
+
else {}
|
|
1259
|
+
),
|
|
1218
1260
|
"resourceLocks": normalized_resource_locks,
|
|
1219
1261
|
"resourceLockTokens": {},
|
|
1220
1262
|
"resourceWaitMs": 0,
|
|
@@ -1427,8 +1469,12 @@ def _run_session_worker(state_root: Path, session_id: str) -> int:
|
|
|
1427
1469
|
"wb", buffering=0
|
|
1428
1470
|
) as stderr:
|
|
1429
1471
|
try:
|
|
1430
|
-
from harness_process import
|
|
1472
|
+
from harness_process import (
|
|
1473
|
+
resolve_windows_executable,
|
|
1474
|
+
spawn_structured_argv,
|
|
1475
|
+
)
|
|
1431
1476
|
|
|
1477
|
+
argv = resolve_windows_executable(argv)
|
|
1432
1478
|
spawned = spawn_structured_argv(
|
|
1433
1479
|
argv,
|
|
1434
1480
|
cwd=Path(str(receipt["workingDirectory"])),
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"files": [
|
|
26
26
|
{
|
|
27
27
|
"path": ".harness-build.json",
|
|
28
|
-
"sha256": "
|
|
28
|
+
"sha256": "8fe273f108d3bc5330ef415a805af2361e87e94f9e6c21141fcf5babca92ced2"
|
|
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": "1d98f85c52d4f604e283d399a035e5dc7f5bbba555e807363eb2210ff7e6e63e"
|
|
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": "ceca1eab8848ba6adf9d072ae960cf0094410a822bcee0759085dc5863e8574d"
|
|
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": "ef39665e52bb15b4cc3ca6fd37ea3c30bcf2f2e0970d500dee93a7c4aebf579b"
|
|
173
173
|
},
|
|
174
174
|
{
|
|
175
175
|
"path": "harness-execute/testing-checklist.md",
|
|
@@ -189,11 +189,11 @@
|
|
|
189
189
|
},
|
|
190
190
|
{
|
|
191
191
|
"path": "harness-knowledge-ingest/SKILL.md",
|
|
192
|
-
"sha256": "
|
|
192
|
+
"sha256": "c119f459a46f796a2ce06e1971671bc99badfb3ef4fd598e8fe6b9bda93bcdc6"
|
|
193
193
|
},
|
|
194
194
|
{
|
|
195
195
|
"path": "harness-knowledge-query/SKILL.md",
|
|
196
|
-
"sha256": "
|
|
196
|
+
"sha256": "f02690a9b597dfd09bd8ee72e5bafb959ad4f058c02399f460e67c88ee18c667"
|
|
197
197
|
},
|
|
198
198
|
{
|
|
199
199
|
"path": "harness-plan/checklist.md",
|
|
@@ -209,15 +209,15 @@
|
|
|
209
209
|
},
|
|
210
210
|
{
|
|
211
211
|
"path": "harness-plan/SKILL.md",
|
|
212
|
-
"sha256": "
|
|
212
|
+
"sha256": "47920970196c5275db143fe186140420260b48a2d93a51d4c7694076e09cecc9"
|
|
213
213
|
},
|
|
214
214
|
{
|
|
215
215
|
"path": "harness-pull/SKILL.md",
|
|
216
|
-
"sha256": "
|
|
216
|
+
"sha256": "761888d321d111e8f62be1cc15d065e9ecc998b44c26d9ec6d5d2d55b2136292"
|
|
217
217
|
},
|
|
218
218
|
{
|
|
219
219
|
"path": "harness-push/SKILL.md",
|
|
220
|
-
"sha256": "
|
|
220
|
+
"sha256": "15f663db481e58c8192e965c96170508f3b772ac6d7cfdea009d3a457df8decf"
|
|
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": "4325813de04a27156e8263a2e30944773c5083e8f66daa73fc61401ff31ab7d3"
|
|
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": "0d0e9feb4f6f64ed7ad3b1501e4ec9c0609b6588a9f103b5a83ee4db130544fc"
|
|
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": "4a73db8f6b433da35cb544579c2711b3847d572d4430065ffc9d37e230f36d1f"
|
|
257
257
|
},
|
|
258
258
|
{
|
|
259
259
|
"path": "protocols/archive-report-protocol.md",
|
|
@@ -361,7 +361,7 @@
|
|
|
361
361
|
},
|
|
362
362
|
{
|
|
363
363
|
"path": "scripts/harness_events.py",
|
|
364
|
-
"sha256": "
|
|
364
|
+
"sha256": "c28a7972ea621658ca9f0b2546553caea9afba94af0e437dad52d92d8d203ded"
|
|
365
365
|
},
|
|
366
366
|
{
|
|
367
367
|
"path": "scripts/harness_execution_contracts.py",
|
|
@@ -369,11 +369,11 @@
|
|
|
369
369
|
},
|
|
370
370
|
{
|
|
371
371
|
"path": "scripts/harness_fixback.py",
|
|
372
|
-
"sha256": "
|
|
372
|
+
"sha256": "ad72faa38fcb612bd543baad58c1306bc9c6a81d25b71ee2d556e9be62e899d1"
|
|
373
373
|
},
|
|
374
374
|
{
|
|
375
375
|
"path": "scripts/harness_gate.py",
|
|
376
|
-
"sha256": "
|
|
376
|
+
"sha256": "79b22274239986f90260084020bf1be0a2e1c937688801f9094e9237d40ed94c"
|
|
377
377
|
},
|
|
378
378
|
{
|
|
379
379
|
"path": "scripts/harness_headless.py",
|
|
@@ -421,7 +421,7 @@
|
|
|
421
421
|
},
|
|
422
422
|
{
|
|
423
423
|
"path": "scripts/harness_process.py",
|
|
424
|
-
"sha256": "
|
|
424
|
+
"sha256": "53a6d84fed546fdf6a9e4a932b6df80d5feb6c9d5c182443d5b82f3c6d857192"
|
|
425
425
|
},
|
|
426
426
|
{
|
|
427
427
|
"path": "scripts/harness_profile.py",
|
|
@@ -441,7 +441,7 @@
|
|
|
441
441
|
},
|
|
442
442
|
{
|
|
443
443
|
"path": "scripts/harness_runtime.py",
|
|
444
|
-
"sha256": "
|
|
444
|
+
"sha256": "42d46adbc4796f6e06e15c57ebc209087818eeac8b0e09a228aa8e655459254e"
|
|
445
445
|
},
|
|
446
446
|
{
|
|
447
447
|
"path": "scripts/harness_service.py",
|