soloforge 1.1.48 → 1.1.50
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/README.md +4 -4
- package/dist/cli/scope_check.d.ts.map +1 -1
- package/dist/cli/scope_check.js +10 -0
- package/dist/cli/scope_check.js.map +1 -1
- package/dist/context/adapters/shared/integration_guide.d.ts +3 -3
- package/dist/context/adapters/shared/integration_guide.js +4 -4
- package/dist/core/adversarial_review_store.d.ts +44 -44
- package/dist/core/adversarial_review_store.d.ts.map +1 -1
- package/dist/core/adversarial_review_store.js +43 -43
- package/dist/core/adversarial_review_store.js.map +1 -1
- package/dist/core/gate_record_store.d.ts.map +1 -1
- package/dist/core/gate_record_store.js +9 -4
- package/dist/core/gate_record_store.js.map +1 -1
- package/dist/core/git_utils.d.ts.map +1 -1
- package/dist/core/git_utils.js +7 -3
- package/dist/core/git_utils.js.map +1 -1
- package/dist/core/task_context/constants.d.ts.map +1 -1
- package/dist/core/task_context/constants.js +3 -1
- package/dist/core/task_context/constants.js.map +1 -1
- package/dist/core/task_context/manager.d.ts +0 -4
- package/dist/core/task_context/manager.d.ts.map +1 -1
- package/dist/core/task_context/manager.js +21 -32
- package/dist/core/task_context/manager.js.map +1 -1
- package/dist/core/task_context/stage_fact_ownership.js +1 -1
- package/dist/core/task_context/stage_fact_ownership.js.map +1 -1
- package/dist/core/task_context/status_transitions.js +5 -5
- package/dist/core/task_context/status_transitions.js.map +1 -1
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/waiver_store.d.ts +100 -0
- package/dist/core/waiver_store.d.ts.map +1 -0
- package/dist/core/waiver_store.js +185 -0
- package/dist/core/waiver_store.js.map +1 -0
- package/dist/domain/asset_registry/derived_registry.d.ts +10 -0
- package/dist/domain/asset_registry/derived_registry.d.ts.map +1 -1
- package/dist/domain/asset_registry/derived_registry.js +10 -0
- package/dist/domain/asset_registry/derived_registry.js.map +1 -1
- package/dist/domain/asset_registry/derived_types.d.ts +10 -0
- package/dist/domain/asset_registry/derived_types.d.ts.map +1 -1
- package/dist/domain/asset_registry/derived_types.js +10 -0
- package/dist/domain/asset_registry/derived_types.js.map +1 -1
- package/dist/gate/certainty_gate.d.ts +10 -0
- package/dist/gate/certainty_gate.d.ts.map +1 -1
- package/dist/gate/certainty_gate.js.map +1 -1
- package/dist/gate/contracts/tool_actions.d.ts +10 -1
- package/dist/gate/contracts/tool_actions.d.ts.map +1 -1
- package/dist/gate/contracts/tool_actions.js +11 -1
- package/dist/gate/contracts/tool_actions.js.map +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.d.ts.map +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.js +11 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.js.map +1 -1
- package/dist/gate/executors/executors_annotation.d.ts +33 -10
- package/dist/gate/executors/executors_annotation.d.ts.map +1 -1
- package/dist/gate/executors/executors_annotation.js +119 -64
- package/dist/gate/executors/executors_annotation.js.map +1 -1
- package/dist/gate/executors/executors_artifact.d.ts +1 -1
- package/dist/gate/executors/executors_artifact.d.ts.map +1 -1
- package/dist/gate/executors/executors_artifact.js +1 -138
- package/dist/gate/executors/executors_artifact.js.map +1 -1
- package/dist/gate/executors/executors_build.d.ts +2 -2
- package/dist/gate/executors/executors_build.d.ts.map +1 -1
- package/dist/gate/executors/executors_build.js +11 -111
- package/dist/gate/executors/executors_build.js.map +1 -1
- package/dist/gate/executors/executors_deploy.d.ts.map +1 -1
- package/dist/gate/executors/executors_deploy.js +35 -7
- package/dist/gate/executors/executors_deploy.js.map +1 -1
- package/dist/gate/executors/executors_external_command.d.ts.map +1 -1
- package/dist/gate/executors/executors_external_command.js +25 -5
- package/dist/gate/executors/executors_external_command.js.map +1 -1
- package/dist/gate/executors/executors_field_mapping.d.ts.map +1 -1
- package/dist/gate/executors/executors_field_mapping.js +78 -66
- package/dist/gate/executors/executors_field_mapping.js.map +1 -1
- package/dist/gate/executors/executors_jacoco.d.ts +3 -0
- package/dist/gate/executors/executors_jacoco.d.ts.map +1 -0
- package/dist/gate/executors/executors_jacoco.js +70 -0
- package/dist/gate/executors/executors_jacoco.js.map +1 -0
- package/dist/gate/executors/executors_prerequisite.d.ts +1 -1
- package/dist/gate/executors/executors_prerequisite.d.ts.map +1 -1
- package/dist/gate/executors/executors_prerequisite.js +1 -61
- package/dist/gate/executors/executors_prerequisite.js.map +1 -1
- package/dist/gate/executors/executors_probe.d.ts +1 -0
- package/dist/gate/executors/executors_probe.d.ts.map +1 -1
- package/dist/gate/executors/executors_probe.js +1 -0
- package/dist/gate/executors/executors_probe.js.map +1 -1
- package/dist/gate/executors/executors_scope.d.ts +7 -3
- package/dist/gate/executors/executors_scope.d.ts.map +1 -1
- package/dist/gate/executors/executors_scope.js +18 -171
- package/dist/gate/executors/executors_scope.js.map +1 -1
- package/dist/gate/executors/executors_trace.d.ts.map +1 -1
- package/dist/gate/executors/executors_trace.js +111 -1
- package/dist/gate/executors/executors_trace.js.map +1 -1
- package/dist/gate/executors/index.js +2 -2
- package/dist/gate/executors/index.js.map +1 -1
- package/dist/gate/gate_engine.d.ts +11 -0
- package/dist/gate/gate_engine.d.ts.map +1 -1
- package/dist/gate/gate_engine.js +43 -6
- package/dist/gate/gate_engine.js.map +1 -1
- package/dist/gate/gate_registry_bridge.d.ts +10 -0
- package/dist/gate/gate_registry_bridge.d.ts.map +1 -1
- package/dist/gate/gate_registry_bridge.js +2 -3
- package/dist/gate/gate_registry_bridge.js.map +1 -1
- package/dist/gate/release/gate_checks/checkAssetAntiBloat.d.ts.map +1 -1
- package/dist/gate/release/gate_checks/checkAssetAntiBloat.js +3 -0
- package/dist/gate/release/gate_checks/checkAssetAntiBloat.js.map +1 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +4 -2
- package/dist/server/tools/index.js.map +1 -1
- package/dist/server/tools/middleware.d.ts.map +1 -1
- package/dist/server/tools/middleware.js +1 -0
- package/dist/server/tools/middleware.js.map +1 -1
- package/dist/server/tools/schemas.d.ts +10 -0
- package/dist/server/tools/schemas.d.ts.map +1 -1
- package/dist/server/tools/schemas.js +10 -0
- package/dist/server/tools/schemas.js.map +1 -1
- package/dist/server/tools/sf_doctor.d.ts +7 -0
- package/dist/server/tools/sf_doctor.d.ts.map +1 -1
- package/dist/server/tools/sf_doctor.js +38 -2
- package/dist/server/tools/sf_doctor.js.map +1 -1
- package/dist/server/tools/sf_waiver.d.ts +31 -0
- package/dist/server/tools/sf_waiver.d.ts.map +1 -0
- package/dist/server/tools/sf_waiver.js +139 -0
- package/dist/server/tools/sf_waiver.js.map +1 -0
- package/dist/server/tools/sf_work.d.ts +28 -37
- package/dist/server/tools/sf_work.d.ts.map +1 -1
- package/dist/server/tools/sf_work.js +155 -83
- package/dist/server/tools/sf_work.js.map +1 -1
- package/dist/shared/paths.d.ts +4 -0
- package/dist/shared/paths.d.ts.map +1 -1
- package/dist/shared/paths.js +6 -0
- package/dist/shared/paths.js.map +1 -1
- package/dist/types/pipeline_types.d.ts +4 -1
- package/dist/types/pipeline_types.d.ts.map +1 -1
- package/dist/verify/audit/probe_executor.d.ts +4 -1
- package/dist/verify/audit/probe_executor.d.ts.map +1 -1
- package/dist/verify/audit/probe_executor.js +4 -1
- package/dist/verify/audit/probe_executor.js.map +1 -1
- package/dist/verify/audit/probe_rule.d.ts +3 -0
- package/dist/verify/audit/probe_rule.d.ts.map +1 -1
- package/dist/verify/audit/probe_rule.js +3 -0
- package/dist/verify/audit/probe_rule.js.map +1 -1
- package/dist/verify/contracts/runtime_state_recovery_registry.d.ts.map +1 -1
- package/dist/verify/contracts/runtime_state_recovery_registry.js +0 -1
- package/dist/verify/contracts/runtime_state_recovery_registry.js.map +1 -1
- package/dist/verify/oda/probes/index.d.ts.map +1 -1
- package/dist/verify/oda/probes/index.js +2 -0
- package/dist/verify/oda/probes/index.js.map +1 -1
- package/dist/verify/oda/probes/slice_progress_probe.d.ts +4 -0
- package/dist/verify/oda/probes/slice_progress_probe.d.ts.map +1 -0
- package/dist/verify/oda/probes/slice_progress_probe.js +144 -0
- package/dist/verify/oda/probes/slice_progress_probe.js.map +1 -0
- package/package.json +1 -1
- package/templates/build/enforced.md +30 -22
- package/templates/build//346/265/213/350/257/225/344/274/230/345/205/210/347/274/226/347/240/201.md +1 -0
- package/templates/build//347/274/226/347/240/201/347/272/252/345/276/213.md +2 -1
- package/templates/design//345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201/345/257/274/350/210/252.md +5 -5
- package/templates/design//345/210/207/347/211/207/350/247/204/345/210/222.md +3 -1
- package/templates/design//345/274/200/345/217/221/345/210/207/347/211/207/350/256/241/345/210/222.md +2 -1
- package/templates/operate/UI/350/247/206/350/247/211/351/252/214/346/224/266/347/272/252/345/276/213.md +13 -2
- package/templates/operate/enforced.md +2 -2
- package/templates/shared/enforced.md +1 -1
- package/templates/shared//345/267/245/344/275/234/346/265/201/347/241/254/350/247/204/345/210/231/345/245/221/347/272/246.md +2 -2
- package/templates/verify/enforced.md +11 -2
- package/templates/verify//344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +2 -2
- package/templates/verify//345/256/241/346/237/245/346/270/205/345/215/225.md +3 -1
- package/dist/gate/executors/executors_openapi_sync.d.ts +0 -23
- package/dist/gate/executors/executors_openapi_sync.d.ts.map +0 -1
- package/dist/gate/executors/executors_openapi_sync.js +0 -145
- package/dist/gate/executors/executors_openapi_sync.js.map +0 -1
package/README.md
CHANGED
|
@@ -51,7 +51,7 @@ SoloForge 把 Claude Code、Trae 等 AI 编程助手接入同一套**项目规
|
|
|
51
51
|
|
|
52
52
|
**🔒 工程实现契约** — 编码阶段约束 OOD/SOLID、Controller/Handler/Router 入参出参、参数校验、事务、幂等、权限、日志和错误处理。
|
|
53
53
|
|
|
54
|
-
**🔍 抗偷懒与对抗审查** — 禁止空洞章节、占位符(TBD)、无证据
|
|
54
|
+
**🔍 抗偷懒与对抗审查** — 禁止空洞章节、占位符(TBD)、无证据 ✅。审查两层:**per-artifact**(单产物产出后深度审)+ **cross-artifact**(交付前跨产物一致性),多利益方独立对抗(用户/攻击者/维护者/性能/合规),**K 次独立采样取交集**(K=3,每轮独立不互参、取多数复现;findings 留痕不阻断——放弃「零 error 收敛」这个 LLM 裁判数学上不可达的目标)。
|
|
55
55
|
|
|
56
56
|
**✅ 验证有证据** — SoloForge 生成验证命令但不自己执行。只有真实执行并录入结果才算通过;计划、构造记录、未执行的验证都不触发交付。
|
|
57
57
|
|
|
@@ -106,7 +106,7 @@ SoloForge 把工程交付拆成 **4 个能力域**,AI 在每个域内通过 **
|
|
|
106
106
|
AI 在域内循环:observe → 按 ordered_plan 推进(verify→act→wait)
|
|
107
107
|
```
|
|
108
108
|
|
|
109
|
-
**核心循环**:`sf_task` 开任务 → `sf_work action=observe` 看当前域状态(返回 `ordered_plan`:verify→act→wait 有序推进计划,**先补欠验证不跳步、再 act 新产物、阻塞最后**)→(有疑问时 `action=deliberate` 条件研讨)→ `sf_work action=act` 拿到受**可做性门禁**约束的执行 prompt(①同域依赖阻塞拒 ②跨域缺上游拒 ③有未验证产物拒不并行 ④verified 产物须有对抗审查;**重写修复/演进放行**)→ `sf_work action=verify` 跑域内门禁 → `sf_work action=adversarial_review` 对抗审查(per-artifact 深审单产物 / cross-artifact 跨产物一致性,
|
|
109
|
+
**核心循环**:`sf_task` 开任务 → `sf_work action=observe` 看当前域状态(返回 `ordered_plan`:verify→act→wait 有序推进计划,**先补欠验证不跳步、再 act 新产物、阻塞最后**)→(有疑问时 `action=deliberate` 条件研讨)→ `sf_work action=act` 拿到受**可做性门禁**约束的执行 prompt(①同域依赖阻塞拒 ②跨域缺上游拒 ③有未验证产物拒不并行 ④verified 产物须有对抗审查;**重写修复/演进放行**)→ `sf_work action=verify` 跑域内门禁 → `sf_work action=adversarial_review` 对抗审查(per-artifact 深审单产物 / cross-artifact 跨产物一致性,K=3 独立采样取交集、findings 留痕不阻断;**所有域所有产物 per-artifact 不可省**,act 门禁④强制)→ 通过则推进下一域。
|
|
110
110
|
|
|
111
111
|
```
|
|
112
112
|
AI(认知节点) SoloForge 内核(控制权)
|
|
@@ -123,7 +123,7 @@ AI(认知节点) SoloForge 内核(控制权)
|
|
|
123
123
|
|
|
124
124
|
> **两个增强 action**(让 AI 先想清楚、再被独立挑刺):
|
|
125
125
|
> - `deliberate`(对话框交互式研讨):`act` 之前,AI 在对话框与你逐点头脑风暴 + 第一性原理收敛(有疑问来回讨论、无疑问一行确认跳过),收敛后总结留痕到 `docs/研讨记录/`。研讨记录不计入产物,避免产物类型爆炸。
|
|
126
|
-
> - `adversarial_review`(对抗审查):`verify` 之后、交付前,**per-artifact** 深审单产物 + **cross-artifact** 跨产物一致性,多利益方(用户/攻击者/维护者/性能/合规)独立对抗,**
|
|
126
|
+
> - `adversarial_review`(对抗审查):`verify` 之后、交付前,**per-artifact** 深审单产物 + **cross-artifact** 跨产物一致性,多利益方(用户/攻击者/维护者/性能/合规)独立对抗,**K 次独立采样取交集**(K=3,每轮独立不互参、取多数复现;findings 留痕不阻断——不追求「零 error 收敛」)。
|
|
127
127
|
|
|
128
128
|
> **控制权边界**:LLM 提供建议和结构化 proposal,但任务状态机、工具调用、副作用权限、验证裁决由内核裁决。这是 SoloForge 区别于"纯 prompt 工程"的根本。
|
|
129
129
|
|
|
@@ -276,7 +276,7 @@ soloforge --version | --help
|
|
|
276
276
|
| 工具 | action | 职责 |
|
|
277
277
|
|------|--------|------|
|
|
278
278
|
| `sf_task` | `start` / `query` / `cancel` | 任务生命周期:启动、查下一步、取消 |
|
|
279
|
-
| `sf_work` | `observe` / `deliberate` / `act` / `verify` / `adversarial_review` | 能力域工作(需传 `domain`):看状态、产出前条件研讨、拿执行 prompt、跑域内验证、对抗审查(per-artifact / cross-artifact
|
|
279
|
+
| `sf_work` | `observe` / `deliberate` / `act` / `verify` / `adversarial_review` | 能力域工作(需传 `domain`):看状态、产出前条件研讨、拿执行 prompt、跑域内验证、对抗审查(per-artifact / cross-artifact,各 K=3 独立采样取交集) |
|
|
280
280
|
| `sf_knowledge` | `audit` / `add` / `update` | 知识库:审计规则可消费性、新增、更新 |
|
|
281
281
|
| `sf_gate` | —(参数 `domain` + `gate_name` + `artifact_path`) | 独立门禁审查(OOD/SOLID、抽象缺失、风险模式等) |
|
|
282
282
|
| `sf_scaffold` | —(参数 `task_id`) | 脚手架生成(不匹配技术栈时不 fallback) |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope_check.d.ts","sourceRoot":"","sources":["../../src/cli/scope_check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scope_check.d.ts","sourceRoot":"","sources":["../../src/cli/scope_check.ts"],"names":[],"mappings":"AA+BA,iCAAiC;AACjC,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAenD"}
|
package/dist/cli/scope_check.js
CHANGED
|
@@ -8,6 +8,16 @@
|
|
|
8
8
|
* 必然误拦合法写(README/研讨记录/笔记)。域边界交给产物层的门禁/verify/applicability_check,不靠写层 hook。
|
|
9
9
|
*
|
|
10
10
|
* 结构:纯函数 isDangerousPath(CLI 入口 + 单测共用)+ 薄入口 runScopeCheck(stdin + process.exit)。
|
|
11
|
+
*
|
|
12
|
+
* 职责边界:
|
|
13
|
+
* - 负责:PreToolUse hook 拦全局危险路径写入(.git/.env/.soloforge 引擎内部/node_modules)
|
|
14
|
+
* - 不负责:不拦合法写(src/docs/README/配置/.gitignore 等),域边界交给产物层门禁/verify/applicability_check
|
|
15
|
+
*
|
|
16
|
+
* 被谁调用:index.ts(CLI 入口 runScopeCheck,PreToolUse hook 触发)
|
|
17
|
+
* 调用谁:node:fs(readFileSync 读 stdin)
|
|
18
|
+
*
|
|
19
|
+
* 数据流:stdin JSON(tool_input.file_path)→ isDangerousPath 正则匹配 → exitCode(0=放行 / 2=阻断)
|
|
20
|
+
* 持久化:无
|
|
11
21
|
*/
|
|
12
22
|
import { readFileSync } from "node:fs";
|
|
13
23
|
/** 全局危险路径:写入会不可逆破坏(git 内部/密钥/SoloForge 引擎状态/依赖)。片段边界匹配,相对/绝对路径均可。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope_check.js","sourceRoot":"","sources":["../../src/cli/scope_check.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scope_check.js","sourceRoot":"","sources":["../../src/cli/scope_check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qEAAqE;AACrE,MAAM,eAAe,GAAG;IACtB,iBAAiB,EAAqC,iBAAiB;IACvE,0BAA0B,EAA4B,iCAAiC;IACvF,sDAAsD,EAAE,oDAAoD;IAC5G,wBAAwB,EAA8B,OAAO;CAC9D,CAAC;AAEF,iCAAiC;AACjC,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAA2D,CAAC;QAC7G,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;IAC1C,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAmC;IAEnE,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,wBAAwB,QAAQ,wCAAwC,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Integration Guide — 适配器共享层模块。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* (工具速查 / 标准工作流 /
|
|
6
|
-
*
|
|
4
|
+
* 职责边界:
|
|
5
|
+
* - 负责:程序化生成 CLAUDE.md / Trae rules 的"集成指引"section(工具速查 / 标准工作流 / 四领域),从契约注册表派生
|
|
6
|
+
* - 不负责:规则体生成(workflow_template.ts)、适配器文件写入(claude_md.ts/trae_rules.ts)
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:claude_code/claude_md.ts generateClaudeMd、trae/trae_rules.ts writeTraeRules
|
|
9
9
|
* 调用谁:listToolInvocationContracts(工具契约)、ALL_CONTRACTS(域契约)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Integration Guide — 适配器共享层模块。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* (工具速查 / 标准工作流 /
|
|
6
|
-
*
|
|
4
|
+
* 职责边界:
|
|
5
|
+
* - 负责:程序化生成 CLAUDE.md / Trae rules 的"集成指引"section(工具速查 / 标准工作流 / 四领域),从契约注册表派生
|
|
6
|
+
* - 不负责:规则体生成(workflow_template.ts)、适配器文件写入(claude_md.ts/trae_rules.ts)
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:claude_code/claude_md.ts generateClaudeMd、trae/trae_rules.ts writeTraeRules
|
|
9
9
|
* 调用谁:listToolInvocationContracts(工具契约)、ALL_CONTRACTS(域契约)
|
|
@@ -66,7 +66,7 @@ function generateWorkflowSection() {
|
|
|
66
66
|
3. \`sf_work(deliberate)\` 产出前**对话框交互式研讨**:AI 在对话框与你逐点头脑风暴 + 第一性原理收敛(有疑问的来回讨论、无疑问的一行确认跳过),收敛后总结留痕到 \`docs/研讨记录/{域中文}/\`,再 \`act\` 承接
|
|
67
67
|
4. \`sf_work(act)\` 组装 prompt(承接研讨记录为上游)—— **系统只返回 prompt + scope 约束 + 自评清单,文件由你自己写**(系统不代写)
|
|
68
68
|
5. \`sf_work(verify)\` 执行门禁生成 GateRecord:通过则推进;失败的 findings 与 recovery 自动注入下次 act(Reflexion 闭环)
|
|
69
|
-
6. \`sf_work(adversarial_review)\` 对抗审查(独立 session 避免确认偏见):**per-artifact** 单产物产出后深度审(artifact=产物 kind)/ **cross-artifact** 跨产物一致性(交付前,不传 artifact)。多利益方独立对抗(用户/攻击者/维护者/性能/合规),**
|
|
69
|
+
6. \`sf_work(adversarial_review)\` 对抗审查(独立 session 避免确认偏见):**per-artifact** 单产物产出后深度审(artifact=产物 kind)/ **cross-artifact** 跨产物一致性(交付前,不传 artifact)。多利益方独立对抗(用户/攻击者/维护者/性能/合规),**K 次独立采样取交集**(findings 留痕不阻断——放弃"零 error 收敛",每轮独立审查不互参,取多轮复现的交集)
|
|
70
70
|
7. 门禁 retry ≥ 5 或域来回切换 > 3 次 → 自动 escalate(转人工)
|
|
71
71
|
|
|
72
72
|
**单产物推进纪律(所有域通用)**:按 \`sf_work(observe)\` 返回的 \`ordered_plan\`(verify→act→wait 有序计划:先补完欠验证的产物不跳步、再 act 新产物、阻塞最后)顺序推进,不自行重排、不并行多产物 act;**不得跳步**——verify 不可跳、adversarial_review 独立审查不可省(交付前另做 cross-artifact 跨产物审查)。
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 对抗审查记录存储 — AdversarialReviewRecord 的文件 CRUD +
|
|
2
|
+
* 对抗审查记录存储 — AdversarialReviewRecord 的文件 CRUD + K 次独立采样完成/交集聚合判定。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* -
|
|
5
|
+
* - 负责:对抗审查跨轮记录的读写、采样完成判定(K 轮即达标)、交集聚合(多数复现)
|
|
6
6
|
* - 不负责:组装审查 prompt(在 sf_work handleAdversarialReview)、调 LLM、业务升级
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:sf_work(adversarial_review 动作)
|
|
@@ -13,12 +13,15 @@
|
|
|
13
13
|
*
|
|
14
14
|
* 为何不复用 GateRecordStore:GateRecord 是覆盖式(同产物最新 verify 覆盖旧)、
|
|
15
15
|
* findings 是 gate check 级结构(GateFinding)、无 round 维度;对抗审查需要跨轮累积 +
|
|
16
|
-
* 自由文本 findings +
|
|
16
|
+
* 自由文本 findings + 采样聚合,语义不同,独立存储避免污染门禁记录。
|
|
17
|
+
*
|
|
18
|
+
* 确定性边界原则:放弃"零 error 收敛"(LLM 裁判 EIR>0 数学上不可达,重审黑洞),
|
|
19
|
+
* 改 K 次独立采样取交集——findings 留痕不阻断,act 门禁只校验"审查是否执行过"。
|
|
17
20
|
*/
|
|
18
21
|
/** 单条审查发现(客户端 AI 从对抗 prompt 输出后结构化提交)。
|
|
19
22
|
* 强制可证伪:必须 quote 引用原文,不得空泛,否则对抗 agent 沦为永远找茬。 */
|
|
20
23
|
export interface ReviewFinding {
|
|
21
|
-
/** 严重度:error
|
|
24
|
+
/** 严重度:error/warning/info 均如实记录(采样模式不再阻断,留痕) */
|
|
22
25
|
severity: "error" | "warning" | "info";
|
|
23
26
|
/** 所属产物路径 */
|
|
24
27
|
artifact: string;
|
|
@@ -30,21 +33,25 @@ export interface ReviewFinding {
|
|
|
30
33
|
issue: string;
|
|
31
34
|
/** 修复建议 */
|
|
32
35
|
suggestion: string;
|
|
36
|
+
/** 留痕机制:error 被显式接受时标记(不再阻断,仅记录)。确定性边界原则——findings 留痕不阻断 */
|
|
37
|
+
dismissed?: boolean;
|
|
38
|
+
/** 接受原因(人工确认后填写,留痕可追溯) */
|
|
39
|
+
dismiss_reason?: string;
|
|
33
40
|
}
|
|
34
|
-
/**
|
|
41
|
+
/** 单轮审查记录(一轮 = 一次独立采样) */
|
|
35
42
|
export interface ReviewRoundRecord {
|
|
36
43
|
/** 轮次号(从 1 开始) */
|
|
37
44
|
round: number;
|
|
38
45
|
/** 本轮所有发现 */
|
|
39
46
|
findings: ReviewFinding[];
|
|
40
|
-
/** error
|
|
47
|
+
/** error 级数量 */
|
|
41
48
|
error_count: number;
|
|
42
|
-
/** warning
|
|
49
|
+
/** warning 级数量 */
|
|
43
50
|
warning_count: number;
|
|
44
|
-
/**
|
|
45
|
-
new_errors
|
|
46
|
-
/**
|
|
47
|
-
fixed_errors
|
|
51
|
+
/** @deprecated 采样模式(K 次独立采样)不再跨轮对比,保留字段仅为兼容旧记录 */
|
|
52
|
+
new_errors?: number;
|
|
53
|
+
/** @deprecated 同上 */
|
|
54
|
+
fixed_errors?: number;
|
|
48
55
|
/** 评估时间戳 */
|
|
49
56
|
reviewed_at: number;
|
|
50
57
|
}
|
|
@@ -60,58 +67,51 @@ export interface AdversarialReviewRecord {
|
|
|
60
67
|
artifact_path?: string;
|
|
61
68
|
/** 审查的产物列表 */
|
|
62
69
|
artifacts: string[];
|
|
63
|
-
/**
|
|
70
|
+
/** 所有轮次记录(累积,每轮一次独立采样) */
|
|
64
71
|
rounds: ReviewRoundRecord[];
|
|
65
72
|
/** 总轮次 */
|
|
66
73
|
total_rounds: number;
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
|
|
74
|
+
/** 是否已完成 K 次独立采样(完成即达标——findings 留痕不阻断,不再追求"零 error 收敛") */
|
|
75
|
+
completed: boolean;
|
|
76
|
+
/** 完成轮次 */
|
|
77
|
+
completed_round?: number;
|
|
78
|
+
/** K 次独立采样目标轮数(默认 REVIEW_SAMPLE_K) */
|
|
79
|
+
sample_k?: number;
|
|
80
|
+
/** K 次采样后的交集结果(出现次数 ≥ ceil(K/2) 的 findings) */
|
|
81
|
+
intersection_findings?: ReviewFinding[];
|
|
82
|
+
/** 完成时遗留的所有非 dismissed findings(error+warning,留痕不阻断) */
|
|
83
|
+
retained_findings: ReviewFinding[];
|
|
77
84
|
/** 会话状态 */
|
|
78
|
-
status: "in_progress" | "
|
|
85
|
+
status: "in_progress" | "completed" | "escalated";
|
|
79
86
|
/** 创建时间 */
|
|
80
87
|
created_at: number;
|
|
81
88
|
/** 更新时间 */
|
|
82
89
|
updated_at: number;
|
|
83
90
|
}
|
|
84
|
-
/**
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
* 规则:至少提交过 1 轮 findings,且最新一轮零 error(一整轮所有维度无阻断)。
|
|
89
|
-
* warning/info 不阻断达标(软收敛:记遗留但不卡死交付)。
|
|
90
|
-
* 注:首轮(round=1)只发 prompt 不提交 findings,故首次 round=2 提交即首个 round record。
|
|
91
|
-
*/
|
|
92
|
-
export declare function checkConvergence(rounds: ReviewRoundRecord[]): boolean;
|
|
91
|
+
/** 对抗审查独立采样轮数(K 次独立采样取交集)。
|
|
92
|
+
* 确定性边界原则:放弃"零 error 收敛"(LLM 裁判 EIR>0 数学上不可达,重审黑洞),
|
|
93
|
+
* 改 K 次独立采样取多数交集——既保留审查价值又注定有终止点。 */
|
|
94
|
+
export declare const REVIEW_SAMPLE_K = 3;
|
|
93
95
|
/**
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
96
|
+
* 采样完成判定:已提交 K 轮独立采样。
|
|
97
|
+
* 确定性边界原则:不再判定"零 error 收敛"(LLM 裁判主观不可收敛),
|
|
98
|
+
* 只判"是否完成 K 轮"——完成即达标,findings 走留痕不阻断。
|
|
99
|
+
* 注:首轮(round=1)只发 prompt 不提交 findings,故 rounds.length 对应已完成的采样轮数。
|
|
98
100
|
*/
|
|
99
|
-
export declare function
|
|
101
|
+
export declare function checkSamplingComplete(rounds: ReviewRoundRecord[], k: number): boolean;
|
|
100
102
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
+
* K 次独立采样取交集:出现次数 ≥ threshold 的 findings 入交集。
|
|
104
|
+
* threshold 默认 ceil(K/2)(多数)。每轮独立采样(不参考前轮),交集过滤掉
|
|
105
|
+
* 单次随机噪声,只留多轮复现的稳定发现。
|
|
103
106
|
*/
|
|
104
|
-
export declare function
|
|
105
|
-
new_errors: number;
|
|
106
|
-
fixed_errors: number;
|
|
107
|
-
};
|
|
107
|
+
export declare function computeIntersection(rounds: ReviewRoundRecord[], threshold?: number): ReviewFinding[];
|
|
108
108
|
/** 统计 findings 中各严重度数量 */
|
|
109
109
|
export declare function countBySeverity(findings: ReviewFinding[]): {
|
|
110
110
|
error_count: number;
|
|
111
111
|
warning_count: number;
|
|
112
112
|
};
|
|
113
113
|
/**
|
|
114
|
-
* 对抗审查记录存储 — 纯文件 CRUD
|
|
114
|
+
* 对抗审查记录存储 — 纯文件 CRUD,采样完成/交集聚合为纯函数(上方导出)。
|
|
115
115
|
* 通过构造函数注入 projectRoot,方便测试用临时目录。
|
|
116
116
|
*/
|
|
117
117
|
export declare class AdversarialReviewStore {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adversarial_review_store.d.ts","sourceRoot":"","sources":["../../src/core/adversarial_review_store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"adversarial_review_store.d.ts","sourceRoot":"","sources":["../../src/core/adversarial_review_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 对抗审查记录存储 — AdversarialReviewRecord 的文件 CRUD +
|
|
2
|
+
* 对抗审查记录存储 — AdversarialReviewRecord 的文件 CRUD + K 次独立采样完成/交集聚合判定。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* -
|
|
5
|
+
* - 负责:对抗审查跨轮记录的读写、采样完成判定(K 轮即达标)、交集聚合(多数复现)
|
|
6
6
|
* - 不负责:组装审查 prompt(在 sf_work handleAdversarialReview)、调 LLM、业务升级
|
|
7
7
|
*
|
|
8
8
|
* 被谁调用:sf_work(adversarial_review 动作)
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
*
|
|
14
14
|
* 为何不复用 GateRecordStore:GateRecord 是覆盖式(同产物最新 verify 覆盖旧)、
|
|
15
15
|
* findings 是 gate check 级结构(GateFinding)、无 round 维度;对抗审查需要跨轮累积 +
|
|
16
|
-
* 自由文本 findings +
|
|
16
|
+
* 自由文本 findings + 采样聚合,语义不同,独立存储避免污染门禁记录。
|
|
17
|
+
*
|
|
18
|
+
* 确定性边界原则:放弃"零 error 收敛"(LLM 裁判 EIR>0 数学上不可达,重审黑洞),
|
|
19
|
+
* 改 K 次独立采样取交集——findings 留痕不阻断,act 门禁只校验"审查是否执行过"。
|
|
17
20
|
*/
|
|
18
21
|
import { readFile, writeFile, mkdir, readdir, rename } from "node:fs/promises";
|
|
19
22
|
import { join } from "node:path";
|
|
@@ -23,10 +26,10 @@ import { randomUUID } from "node:crypto";
|
|
|
23
26
|
// ═══════════════════════════════════════════
|
|
24
27
|
/** 对抗审查记录目录(与 .soloforge/gates/ 并列) */
|
|
25
28
|
const REVIEWS_DIR = ".soloforge/reviews";
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
29
|
+
/** 对抗审查独立采样轮数(K 次独立采样取交集)。
|
|
30
|
+
* 确定性边界原则:放弃"零 error 收敛"(LLM 裁判 EIR>0 数学上不可达,重审黑洞),
|
|
31
|
+
* 改 K 次独立采样取多数交集——既保留审查价值又注定有终止点。 */
|
|
32
|
+
export const REVIEW_SAMPLE_K = 3;
|
|
30
33
|
// ═══════════════════════════════════════════
|
|
31
34
|
// 文件工具(同 gate_record_store 模式)
|
|
32
35
|
// ═══════════════════════════════════════════
|
|
@@ -48,49 +51,46 @@ async function writeJsonFile(filePath, data) {
|
|
|
48
51
|
await rename(tmp, filePath);
|
|
49
52
|
}
|
|
50
53
|
// ═══════════════════════════════════════════
|
|
51
|
-
//
|
|
54
|
+
// 采样完成 / 交集聚合判定(纯函数,便于单测)
|
|
52
55
|
// ═══════════════════════════════════════════
|
|
53
56
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* 注:首轮(round=1)只发 prompt 不提交 findings
|
|
58
|
-
*/
|
|
59
|
-
export function checkConvergence(rounds) {
|
|
60
|
-
if (rounds.length === 0)
|
|
61
|
-
return false;
|
|
62
|
-
const lastRound = rounds[rounds.length - 1];
|
|
63
|
-
return lastRound.error_count === 0;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* 震荡判定:连续窗口内"修一个引入一个",问题集合不收敛。
|
|
67
|
-
* 规则:最近 OSCILLATION_WINDOW 轮,每轮 error>0(未收敛)且存在 churn
|
|
68
|
-
* (new_errors>0 且 fixed_errors>0 同时成立——在反复修与引之间打转)。
|
|
69
|
-
* 触发即熔断升级,避免烧光预算。
|
|
57
|
+
* 采样完成判定:已提交 K 轮独立采样。
|
|
58
|
+
* 确定性边界原则:不再判定"零 error 收敛"(LLM 裁判主观不可收敛),
|
|
59
|
+
* 只判"是否完成 K 轮"——完成即达标,findings 走留痕不阻断。
|
|
60
|
+
* 注:首轮(round=1)只发 prompt 不提交 findings,故 rounds.length 对应已完成的采样轮数。
|
|
70
61
|
*/
|
|
71
|
-
export function
|
|
72
|
-
|
|
73
|
-
return false;
|
|
74
|
-
const recent = rounds.slice(-OSCILLATION_WINDOW);
|
|
75
|
-
const allUnconverged = recent.every((r) => r.error_count > 0);
|
|
76
|
-
const hasChurn = recent.some((r) => r.new_errors > 0 && r.fixed_errors > 0);
|
|
77
|
-
return allUnconverged && hasChurn;
|
|
62
|
+
export function checkSamplingComplete(rounds, k) {
|
|
63
|
+
return rounds.length >= k;
|
|
78
64
|
}
|
|
79
|
-
/**
|
|
80
|
-
function
|
|
65
|
+
/** finding 去重键:artifact + location + issue(同一位置同一问题视为同一发现) */
|
|
66
|
+
function findingKey(f) {
|
|
81
67
|
return `${f.artifact}::${f.location}::${f.issue}`;
|
|
82
68
|
}
|
|
83
69
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
70
|
+
* K 次独立采样取交集:出现次数 ≥ threshold 的 findings 入交集。
|
|
71
|
+
* threshold 默认 ceil(K/2)(多数)。每轮独立采样(不参考前轮),交集过滤掉
|
|
72
|
+
* 单次随机噪声,只留多轮复现的稳定发现。
|
|
86
73
|
*/
|
|
87
|
-
export function
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
74
|
+
export function computeIntersection(rounds, threshold) {
|
|
75
|
+
const k = rounds.length;
|
|
76
|
+
const minCount = threshold ?? Math.ceil(k / 2);
|
|
77
|
+
const counts = new Map();
|
|
78
|
+
for (const round of rounds) {
|
|
79
|
+
// 同一轮内相同 finding 只计一次(避免单轮重复 inflate)
|
|
80
|
+
const seen = new Set();
|
|
81
|
+
for (const f of round.findings) {
|
|
82
|
+
const key = findingKey(f);
|
|
83
|
+
if (seen.has(key))
|
|
84
|
+
continue;
|
|
85
|
+
seen.add(key);
|
|
86
|
+
const existing = counts.get(key);
|
|
87
|
+
if (existing)
|
|
88
|
+
existing.count++;
|
|
89
|
+
else
|
|
90
|
+
counts.set(key, { finding: f, count: 1 });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return [...counts.values()].filter((e) => e.count >= minCount).map((e) => e.finding);
|
|
94
94
|
}
|
|
95
95
|
/** 统计 findings 中各严重度数量 */
|
|
96
96
|
export function countBySeverity(findings) {
|
|
@@ -108,7 +108,7 @@ export function countBySeverity(findings) {
|
|
|
108
108
|
// AdversarialReviewStore 实现
|
|
109
109
|
// ═══════════════════════════════════════════
|
|
110
110
|
/**
|
|
111
|
-
* 对抗审查记录存储 — 纯文件 CRUD
|
|
111
|
+
* 对抗审查记录存储 — 纯文件 CRUD,采样完成/交集聚合为纯函数(上方导出)。
|
|
112
112
|
* 通过构造函数注入 projectRoot,方便测试用临时目录。
|
|
113
113
|
*/
|
|
114
114
|
export class AdversarialReviewStore {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adversarial_review_store.js","sourceRoot":"","sources":["../../src/core/adversarial_review_store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"adversarial_review_store.js","sourceRoot":"","sources":["../../src/core/adversarial_review_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA+EzC,8CAA8C;AAC9C,KAAK;AACL,8CAA8C;AAE9C,uCAAuC;AACvC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAEzC;;sCAEsC;AACtC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,8CAA8C;AAC9C,+BAA+B;AAC/B,8CAA8C;AAE9C,KAAK,UAAU,YAAY,CAAI,QAAgB;IAC7C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAa;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,+EAA+E;IAC/E,MAAM,GAAG,GAAG,GAAG,QAAQ,MAAM,CAAC;IAC9B,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,8CAA8C;AAC9C,0BAA0B;AAC1B,8CAA8C;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA2B,EAAE,CAAS;IAC1E,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,8DAA8D;AAC9D,SAAS,UAAU,CAAC,CAAgB;IAClC,OAAO,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAA2B,EAC3B,SAAkB;IAElB,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,QAAQ,GAAG,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqD,CAAC;IAC5E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,sCAAsC;QACtC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,QAAQ;gBAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;;gBAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACvF,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,eAAe,CAAC,QAAyB;IACvD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO;YAAE,WAAW,EAAE,CAAC;aACrC,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;YAAE,aAAa,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AACxC,CAAC;AAED,8CAA8C;AAC9C,4BAA4B;AAC5B,8CAA8C;AAE9C;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IACJ;IAA7B,YAA6B,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAEpD,eAAe;IACP,QAAQ,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,oBAAoB;IACpB,gBAAgB;QACd,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;IAED,cAAc;IACd,KAAK,CAAC,MAAM,CAAC,MAA+B;QAC1C,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,yBAAyB;IACzB,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,OAAO,YAAY,CAA0B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,KAAK,CAAC,MAA+B;QACzC,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,OAAO,GAA8B,EAAE,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,SAAS;gBACtC,MAAM,MAAM,GAAG,MAAM,YAAY,CAA0B,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5E,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM;oBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate_record_store.d.ts","sourceRoot":"","sources":["../../src/core/gate_record_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"gate_record_store.d.ts","sourceRoot":"","sources":["../../src/core/gate_record_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAgDzD;;;GAGG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM;IAEhD,eAAe;IACf,OAAO,CAAC,QAAQ;IAIhB,+CAA+C;IACzC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAI9F,6DAA6D;IACvD,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAKpD,mBAAmB;IACb,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmB7D,oBAAoB;IACd,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAkBjE;;;;;;;OAOG;IACG,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAU7G;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO;IAO5D,gEAAgE;IAChE,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO;IAMvE,aAAa;IACP,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQpF"}
|
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
* 修复历史缺陷:此前主键仅 (domain, gate_name),design 域 8 个产物共用 design-gate 时全部写入
|
|
16
16
|
* 同一文件,后写覆盖前写,导致多产物无法各自 verified、retry_count 跨产物串台。
|
|
17
17
|
*/
|
|
18
|
-
import { readFile, writeFile, mkdir, readdir } from "node:fs/promises";
|
|
18
|
+
import { readFile, writeFile, mkdir, readdir, rename } from "node:fs/promises";
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
import { createHash } from "node:crypto";
|
|
21
|
+
import { debug } from "../shared/logger.js";
|
|
21
22
|
// ═══════════════════════════════════════════
|
|
22
23
|
// 路径常量与工具函数
|
|
23
24
|
// ═══════════════════════════════════════════
|
|
@@ -40,15 +41,19 @@ async function readJsonFile(filePath) {
|
|
|
40
41
|
const content = await readFile(filePath, "utf-8");
|
|
41
42
|
return JSON.parse(content);
|
|
42
43
|
}
|
|
43
|
-
catch {
|
|
44
|
+
catch (e) {
|
|
45
|
+
debug("gate_record_store", `readJsonFile failed for ${filePath}: ${e instanceof Error ? e.message : e}`);
|
|
44
46
|
return null;
|
|
45
47
|
}
|
|
46
48
|
}
|
|
47
|
-
/** 安全写入 JSON
|
|
49
|
+
/** 安全写入 JSON 文件(原子写 tmp+rename:进程崩溃不写半个 JSON,与 TaskContextManager/AdversarialReviewStore 一致——
|
|
50
|
+
* 修复 S-11/C-03:原直接 writeFile 在崩溃/并发时可损坏 record,下次 readJsonFile 静默返 null 掩盖) */
|
|
48
51
|
async function writeJsonFile(filePath, data) {
|
|
49
52
|
const dir = join(filePath, "..");
|
|
50
53
|
await mkdir(dir, { recursive: true });
|
|
51
|
-
|
|
54
|
+
const tmp = `${filePath}.tmp`;
|
|
55
|
+
await writeFile(tmp, JSON.stringify(data, null, 2), "utf-8");
|
|
56
|
+
await rename(tmp, filePath);
|
|
52
57
|
}
|
|
53
58
|
// ═══════════════════════════════════════════
|
|
54
59
|
// GateRecordStore 实现
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate_record_store.js","sourceRoot":"","sources":["../../src/core/gate_record_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"gate_record_store.js","sourceRoot":"","sources":["../../src/core/gate_record_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git_utils.d.ts","sourceRoot":"","sources":["../../src/core/git_utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"git_utils.d.ts","sourceRoot":"","sources":["../../src/core/git_utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYpF;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY/D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcxF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa5F"}
|
package/dist/core/git_utils.js
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { execFile } from "node:child_process";
|
|
15
15
|
import { promisify } from "node:util";
|
|
16
|
+
import { debug } from "../shared/logger.js";
|
|
16
17
|
const execFileAsync = promisify(execFile);
|
|
17
18
|
/**
|
|
18
19
|
* 获取指定文件的 git hash(blob hash)。
|
|
@@ -23,7 +24,8 @@ export async function getFileGitHash(filePath, cwd) {
|
|
|
23
24
|
const { stdout } = await execFileAsync("git", ["hash-object", filePath], { cwd: cwd ?? process.cwd() });
|
|
24
25
|
return stdout.trim();
|
|
25
26
|
}
|
|
26
|
-
catch {
|
|
27
|
+
catch (e) {
|
|
28
|
+
debug("git_utils", `getFileGitHash failed for ${filePath}: ${e instanceof Error ? e.message : e}`);
|
|
27
29
|
return "";
|
|
28
30
|
}
|
|
29
31
|
}
|
|
@@ -36,7 +38,8 @@ export async function getHeadHash(cwd) {
|
|
|
36
38
|
const { stdout } = await execFileAsync("git", ["rev-parse", "--short", "HEAD"], { cwd: cwd ?? process.cwd() });
|
|
37
39
|
return stdout.trim();
|
|
38
40
|
}
|
|
39
|
-
catch {
|
|
41
|
+
catch (e) {
|
|
42
|
+
debug("git_utils", `getHeadHash failed: ${e instanceof Error ? e.message : e}`);
|
|
40
43
|
return "";
|
|
41
44
|
}
|
|
42
45
|
}
|
|
@@ -51,7 +54,8 @@ export async function getTrackedFileHash(filePath, cwd) {
|
|
|
51
54
|
const parts = stdout.trim().split(/\s+/);
|
|
52
55
|
return parts.length >= 3 ? parts[2] : "";
|
|
53
56
|
}
|
|
54
|
-
catch {
|
|
57
|
+
catch (e) {
|
|
58
|
+
debug("git_utils", `getTrackedFileHash failed for ${filePath}: ${e instanceof Error ? e.message : e}`);
|
|
55
59
|
return "";
|
|
56
60
|
}
|
|
57
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git_utils.js","sourceRoot":"","sources":["../../src/core/git_utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"git_utils.js","sourceRoot":"","sources":["../../src/core/git_utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/core/task_context/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,UAAU,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/core/task_context/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,UAAU,IAAI,CAAC;AAM5B,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAapF,CAAC"}
|
|
@@ -16,6 +16,8 @@ export const MAX_TASKS = 100;
|
|
|
16
16
|
export const MAX_REWORK = 3;
|
|
17
17
|
// 状态转换表: 定义每个状态允许的合法后继状态
|
|
18
18
|
// 治本:escalated/cancelled 为业务终态(从 TaskIntent 吸收),任意活跃状态可升级(escalated)或取消(cancelled)
|
|
19
|
+
// 注: classifying → done 不要求 classification 存在。这是"放弃任务"场景——
|
|
20
|
+
// 在分类阶段发现任务不可行/重复/无意义,直接关闭,此时无产出需保留。
|
|
19
21
|
export const VALID_TRANSITIONS = {
|
|
20
22
|
classifying: ["expanding", "done", "failed", "escalated", "cancelled"],
|
|
21
23
|
expanding: ["executing", "clarifying", "failed", "escalated", "cancelled"],
|
|
@@ -25,7 +27,7 @@ export const VALID_TRANSITIONS = {
|
|
|
25
27
|
retrying: ["executing", "reworking", "failed", "escalated", "cancelled"],
|
|
26
28
|
reworking: ["expanding", "executing", "failed", "escalated", "cancelled"],
|
|
27
29
|
learning: ["done", "retrying", "reworking", "failed", "escalated", "cancelled"],
|
|
28
|
-
done: ["cancelled"],
|
|
30
|
+
done: ["cancelled", "failed"], // failed: 验收不通过时回退重开(不直接 retry,走 failed→expanding/classifying 标准恢复路径)
|
|
29
31
|
failed: ["expanding", "classifying", "escalated", "cancelled"],
|
|
30
32
|
escalated: ["cancelled", "failed", "executing"], // reset 可恢复 executing(人工修复 retry 锁定后解锁;非常规推进,仅 sf_task reset 走)
|
|
31
33
|
cancelled: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/task_context/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAE5B,yBAAyB;AACzB,mFAAmF;AACnF,MAAM,CAAC,MAAM,iBAAiB,GAA2D;IACvF,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACtE,SAAS,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC1E,UAAU,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC7D,SAAS,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACrF,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC5F,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACxE,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACzE,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC/E,IAAI,EAAE,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/task_context/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAE5B,yBAAyB;AACzB,mFAAmF;AACnF,2DAA2D;AAC3D,uCAAuC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAA2D;IACvF,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACtE,SAAS,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC1E,UAAU,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC7D,SAAS,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACrF,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC5F,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACxE,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACzE,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC/E,IAAI,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAG,sEAAsE;IACtG,MAAM,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC;IAC9D,SAAS,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAG,gEAAgE;IAClH,SAAS,EAAE,EAAE;CACd,CAAC"}
|
|
@@ -80,10 +80,6 @@ export declare class TaskContextManager {
|
|
|
80
80
|
* 记录执行结果: 变更文件列表和可选的失败记录。
|
|
81
81
|
*/
|
|
82
82
|
setExecution(taskId: string, changedFiles: string[], failure?: FailureRecord): Promise<TaskContext | null>;
|
|
83
|
-
/**
|
|
84
|
-
* 设置任务的验证跳过原因(verifying → done/learning 的合法凭证)。
|
|
85
|
-
*/
|
|
86
|
-
setSkipVerificationReason(taskId: string, reason: string): Promise<TaskContext | null>;
|
|
87
83
|
/**
|
|
88
84
|
* 设置任务的执行验证计划(由 sf_gate confirm 分支生成)。
|
|
89
85
|
* 记录变更对应的验证命令与验收标准,供 sf_record_verification_execution 记录执行结果、sf_work verify 交付门禁消费。
|