四块互相交织的 benchmark 覆盖增量,统一提交: 1) 通信遥测(#23):orchestrator 路由 peer 消息时按 correlation_id 计请求/应答到 SwarmRun.collaboration(内部状态,不进 Manager 事件流);collector 算 s_communication。 治理计数由 run.approvals 派生(合规/总数)→ s_governance。 2) Q_quality 掩码归一(v2.1 裁定):metrics.quality_score 改为对 present 输入加权归一, 非编码任务自动忽略 TestPassRate,全缺 → NaN(不伪造)。 3) 质量插桩 / Group B:新增 Pod 内代码测试沙箱(orchestrator/sandbox.py,环境清洗 + 超时强杀 + 资源限额 + 路径越界校验,门控 ENABLE_QUALITY_EVAL)与 held-out fixture (benchmark/fixtures/);run 完成时用留出测试评分得 TestPassRate → Q_quality → collector 合成 reward。安全边界见 docs/integration/security-boundary.md §8.1。 4) 决策引擎 / Group A(#10,Option A score-at-pull):新增 orchestrator/decision_engine.py —— 信息素 τ(Redis 持久、(role,agent) 键控、冷启动 0.5、ρ 蒸发、夹紧、学习常开)+ η 启发式评分 + ε-greedy 概率采样;每次 dispatch 产一条 DecisionTrace → SwarmRun.decisions;collector 算 tau/eta/p_decision。概率选择门控 ENABLE_ACO_DISPATCH (默认关,CI 用 ACO_SEED 固定)。 覆盖:单次 run 真实可算字段由 4 提升至最多 10/15(新增 communication/reward/tau/eta/ p_decision,外加 governance 有条件)。 测试:新增 test-sandbox / test-quality / test-decision-engine;扩充 collector/metrics 用例; CI 纳入全部 benchmark 套件 + flag-on 的 ACO e2e。本地 11 项 gate 全绿。 诚实边界(未越界声称): - Group A 为单边匹配(Option B 待 Group C);概率派发优于贪心未证;默认关闭。 - reward 的 CodeReview/UserAcceptance 未采集(掩码忽略);P_risk 为审批派生低估。 - s_gain/s_swarm/g_e/g_e_cost/benchmark 仍 NaN —— 需基线(#21/#13),本 PR 不动验收。 影响范围:Swarm(orchestrator + benchmark + docs + CI)。不改 Manager↔Swarm 事件契约 (遥测均为运行时内部状态);不影响 Client/计费/密钥/发布链路。新增 ENABLE_QUALITY_EVAL / ENABLE_ACO_DISPATCH 两个开关,默认关闭。 Closes #10 Closes #23 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
369c8fc43a
commit
d487923646
@@ -8,24 +8,28 @@
|
||||
|
||||
本仓最初是**多 Agent 工作流执行器**,不是**被插桩的基准测量目标**。能算出来的指标是「执行过程本就会产生」的副产物;其余指标各自缺少执行器从不需要产生的东西(基线 / 计数器 / 决策机制 / 输入)。**v2.0 已给定全部权重(τ/η/reward/λ)**,但这不改变「输入/机制缺失」的根因。
|
||||
|
||||
## 2. 覆盖现状(v2.0 `SwarmMetrics` 共 15 字段,4 个真实可算)
|
||||
## 2. 覆盖现状(v2.0 `SwarmMetrics` 共 15 字段)
|
||||
|
||||
无条件真实可算 3 项(completion/collaboration/robustness);有条件真实可算 7 项(cost/governance/communication/reward/tau/eta/p_decision,仅在该 run 走过对应路径时)。即单次 run 最多 10 项真实可算,其余仍 NaN。
|
||||
|
||||
| 字段 | 状态 | 数据来源 / 缺口 |
|
||||
|---|---|---|
|
||||
| `s_completion` | ✅ 真实 | 任务状态统计 |
|
||||
| `s_collaboration` | ✅ 真实 | `handoff.*` 事件 + `depends_on` + `assigned_agent_id` |
|
||||
| `s_cost` | ✅ 真实 | 每任务 `usage.model_cost_usd` + 请求 `budget.max_cost_usd` |
|
||||
| `s_cost` | 🟡 部分 | 每任务 `usage.model_cost_usd` + 请求 `budget.max_cost_usd`;缺预算/用量 → NaN |
|
||||
| `s_robustness` | ✅ 真实 | `retry_count` + 任务状态 |
|
||||
| `s_governance` | 🟡 部分 | 仅审批可派生;无审批 → NaN |
|
||||
| `s_communication` | 🟡 部分 | peer 消息内部计数(请求→应答率,按 `correlation_id`);无 peer 通信 → NaN |
|
||||
| `reward` | 🟡 部分 | 绑定 fixture 时:`Q_quality`=沙箱评测留出测试的 TestPassRate(掩码归一)、`V_speed`=fixture target_time vs 实际时长、`E_cost`/`R_robust`/`G_gov`/`P_rework` 取自 run、`P_risk` 由审批风险派生(无受治理操作→0,见下注);未绑定 fixture → NaN |
|
||||
| `tau` / `eta` / `p_decision` | 🟡 部分 | ACO 决策引擎(`ENABLE_ACO_DISPATCH` 开启时按采样决策记录均值;学习常开但选择门控);无决策记录 → NaN |
|
||||
| `s_gain` | 🔴 NaN | 需基线 |
|
||||
| `s_communication` | 🔴 NaN | 无消息计数 |
|
||||
| `tau` / `eta` / `p_decision` | 🔴 NaN | 无 τ/η 决策引擎 |
|
||||
| `reward` | 🔴 NaN | 权重已给定,**输入**未采集 |
|
||||
| `s_swarm` / `g_e` / `g_e_cost` / `benchmark` | 🔴 NaN | 依赖上述(任一 NaN → 聚合 NaN) |
|
||||
| `s_swarm` / `g_e` / `g_e_cost` / `benchmark` | 🔴 NaN | 依赖上述(`gain` 仍 NaN → 聚合 NaN) |
|
||||
|
||||
> ⚠️ `reward` 的 `P_risk` 由审批 `risk_level` 派生,**无受治理操作时记 0**——这是与治理覆盖缺口绑定的**已知低估**(未经审批门的风险面未被计入)。`P_rework` 目前仅由 `retry_count>0` 派生,未含评审重开计数。两者均在 collector 与本表中显式标注,不作隐藏假设。
|
||||
|
||||
> 不可算的指标返回 `NaN` 并在 `coverage` 标记 `False`,**不伪造 0/100 分值**(组织规则 #9)。
|
||||
|
||||
## 3. 为什么这 4 个能算
|
||||
## 3. 为什么基础几项能算
|
||||
|
||||
它们都是执行器正常运行的副产物,已存在于 orchestrator 状态:
|
||||
- `completion` ← 队列本就跟踪任务状态。
|
||||
@@ -33,23 +37,29 @@
|
||||
- `cost` ← 计费归因本就记录每任务 `model_cost_usd`;预算在请求里。
|
||||
- `robustness` ← 重试逻辑本就维护 `retry_count` 与状态。
|
||||
|
||||
## 4. 为什么这 5 个算不出(逐项根因)
|
||||
`communication`/`reward` 不是天然副产物,而是本仓新增插桩(通信计数器 / fixture 沙箱评测)后才可算——见 §4 顶部「已关闭」。
|
||||
|
||||
## 4. 为什么这几个算不出(逐项根因)
|
||||
|
||||
> ✅ **已关闭(本仓)**:
|
||||
> - `communication` —— peer 消息原先只路由不计数,现已在 orchestrator 路由处按 `correlation_id` 计请求/应答(`SwarmRun.collaboration` 内部计数,不进 Manager 事件流),collector 据此算 `SuccessfulMessages/TotalMessages×100`;无 peer 通信的 run 仍 NaN(不伪造)。
|
||||
> - `reward`(Group B)—— 已建**留出测试沙箱**(`orchestrator/sandbox.py`,Pod 内执行 + 环境清洗 + 超时/限额)与 **fixture**(`benchmark/fixtures/`):绑定 fixture 的 run 在完成时用留出测试评分得 `TestPassRate` → 经掩码 `quality_score` 得 `Q_quality`,再由 collector 合成 `reward`。`CodeReview`/`UserAcceptance` 仍未采集(掩码自动忽略);`P_risk` 为审批派生的已知低估。未绑定 fixture 的 run 仍 NaN。
|
||||
> - `tau`/`eta`/`p_decision`(Group A)—— 已建 **ACO 决策引擎**(`orchestrator/decision_engine.py`):信息素 trail(Redis 持久、按 `(role, agent)` 键控、**学习常开**)+ η 启发式评分 + ε-greedy 概率采样(**选择门控** `ENABLE_ACO_DISPATCH`,默认关)。决策遥测落 `SwarmRun.decisions`,collector 取均值。**单边匹配(Option A)**、τ 的 quality 输入暂 = success、**决策质量未证(需 Group C)**——均已在 decision-engine.md 标注。
|
||||
|
||||
| 指标 | 根因(缺什么) | 类别 | 关闭成本 |
|
||||
|---|---|---|---|
|
||||
| `gain`(`G_E = Q_swarm − Q_base`) | **本质是对比指标**,单次 swarm run 无法自算;缺 baseline 运行器(Single/Strong/Chain/Sub-Agent)、对比 harness 与数据集 | 缺**基线** | 高(跨团队/基础设施/设计决策) |
|
||||
| `communication`(`Successful/Total messages`) | peer/WS 消息只**路由**、从不**计数**;无成功/总数计数器,数据流过但未插桩 | 缺**计数器** | 低(加计数器) |
|
||||
| `governance`(`Compliant/Total ops`) | 有审批机制,但无「受治理/敏感操作 vs 合规」计数;更广的治理面(tool/MCP 权限、allowed_paths 强制)未实现,**没有受治理操作记录可计数**;无审批的 run → 0 操作 → 空集 → NaN | 缺**计数器 + 策略强制点** | 中(计数器 + 部分强制点) |
|
||||
| `p_decision`(`τ^α·η^β·100`) | v2.0 已给公式,但派发仍是**确定性贪心能力匹配**(`can_agent_run_task`);ACO 决策模型**未实现**——无信息素 `τ`(历史有效性追踪)、无启发式 `η` 评分;没有可测的概率决策 | 缺**整套机制** | 高(新建决策引擎 + 历史库) |
|
||||
| `reward`(`w₁·S_task + … − w₈·P_rework`) | v2.0 **已给定 `w₁..w₈`**;但**输入**未采集(`Q_quality` 需 TestPass/CodeReview/UserAcceptance、`P_risk`、`P_rework`)→ 仍不可算 | 缺**输入**(权重已定) | 中(质量/CI/风险/返工接入) |
|
||||
| `reward` 的剩余短板 | 主输入 `Q_quality` 已通过 fixture 沙箱采集;但 `CodeReview`/`UserAcceptance` 仍缺(需评审/验收信号源),`P_risk` 仅审批派生(低估),fixture 只有 1 个示例、统一任务集未建 | 缺**评审/验收信号 + 统一任务集** | 中(评审/验收接入 + 任务集扩充) |
|
||||
| `tau`/`eta`/`p_decision` 的剩余短板 | 机制已建但**单边**(任务对 Agent 的全局路由 = Option B 未实现);τ 的 quality/acceptance/time 输入无信号暂 0 或 = success;**概率派发是否优于贪心未证**(需 Group C 对比) | 缺**双边匹配 + 决策质量验证** | 中-高(matchmaker + 对比 harness) |
|
||||
|
||||
## 5. 关闭路径(按成本排序)
|
||||
|
||||
1. **低成本(本仓可做)**:`s_communication`、`s_governance` — 在 peer/WS 发送处与受治理操作处加计数器,按 `swarm_id` 聚合。可把真实可算项从 4 提到 6。
|
||||
2. **中成本**:`reward` — 权重 v2.0 已定;接入 `Q_quality`(CI/评审/验收)与 risk/rework 输入即可算。
|
||||
1. **低成本(本仓可做)**:~~`s_communication`~~(✅ 已关闭)、`s_governance` — 通信计数器已落地;治理仍需在受治理操作处加计数器 + 策略强制点,按 `swarm_id` 聚合。无条件真实项 3 项,有条件已增至 4 项(cost/governance/communication/reward)。
|
||||
2. **中成本**:~~`reward`~~(✅ 已关闭,本仓)— `Q_quality` 主输入已由 fixture 沙箱采集;剩余为**扩充统一任务集** + 接入 `CodeReview`/`UserAcceptance` 评审/验收信号(部分需 Product/Manager)。
|
||||
3. **高成本**:
|
||||
- `p_decision` — 设计并实现 `τ/η/P` 决策引擎与历史有效性追踪(改变派发机制)。
|
||||
- `gain`(及由其驱动的 `Benchmark_Agent`、`G_E,c`、「Swarm > baselines」验收)— 实现 4 类基线运行器 + 统一数据集 + 对比/显著性,属跨团队与基础设施工作(见 baseline-comparison)。
|
||||
- ~~`p_decision`~~(✅ 已关闭,本仓,Option A)— `τ/η/P` 决策引擎与信息素历史库已落地(`ENABLE_ACO_DISPATCH` 门控);剩余为 Option B 双边匹配与决策质量验证(依赖 Group C)。
|
||||
- `gain`(及由其驱动的 `Benchmark_Agent`、`G_E,c`、「Swarm > baselines」验收)— 实现 4 类基线运行器 + 统一数据集 + 对比/显著性,属跨团队与基础设施工作(见 baseline-comparison)。**这是最后一块,也是唯一动验收的一块。**
|
||||
|
||||
## 6. 影响
|
||||
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
# ACO 决策引擎(Benchmark Group A):τ / η / P_decision
|
||||
|
||||
让标准 §3 的决策层指标由 NaN 转为可测:派发从「确定性贪心首配」变为「信息素 × 启发式的概率采样」。本文档是该机制的唯一入口。
|
||||
|
||||
## 1. 方案选型:Option A(score-at-pull,单边)
|
||||
|
||||
派发是双边匹配(任务挑 Agent / Agent 挑任务)。本实现取 **Option A**:
|
||||
|
||||
- 候选集 = **「当前空闲 Agent 视角下的全部就绪任务」**。Agent 由到达顺序固定,任务由 `P_i = τ_i^α·η_i^β / Σ` **采样**选出(ε-greedy 探索,ε=0.10)。
|
||||
- **已知局限(单边)**:τ 影响的是「该 Agent 先做哪个任务」,而非「该任务给谁做」——强专家若晚到,仍可能输给先拉取的弱者。全局双边匹配(Option B:matchmaker 调度 tick + hold 策略)**推迟到 Group C 基线就绪后**再评估,因为「更优匹配」是一个**当前无法度量**的优化命题。
|
||||
- A 是 B 的严格子集:信息素库、η 评分、采样、遥测、collector 全部复用,B 只需更换选择触发点。
|
||||
|
||||
## 2. 双半开关(核心设计)
|
||||
|
||||
| 半边 | 开关 | 默认 | 行为 |
|
||||
|---|---|---|---|
|
||||
| **学习**(信息素沉积) | 无(常开) | 开 | 任务到达终态即更新 τ trail。纯被动观察,**不改变任何派发行为**;为未来开启选择积累「实测声誉」而非冷启动先验 |
|
||||
| **行动**(概率选择) | `ENABLE_ACO_DISPATCH` | **关** | 关闭时派发与原贪心逐字节一致;开启时走采样路径并记录决策遥测 |
|
||||
|
||||
CI 同时跑两条:默认全套(flag off,证不变性)+ `ENABLE_ACO_DISPATCH=1 ACO_SEED=42` 的 e2e(证开启后工作流仍完整收敛)。
|
||||
|
||||
## 3. 机制
|
||||
|
||||
### 3.1 信息素 τ(`pheromone:{agent_role}:{agent_id}`,Redis)
|
||||
|
||||
- 更新(标准 §3.1):`τ(t+1) = (1−ρ)·τ(t) + Δτ`,ρ=0.10,夹紧到 `[0.05, 1.0]`(正性保证 `τ^α` 良定义;上界即 trail 饱和)。
|
||||
- `Δτ = metrics.pheromone(...)`,**只喂真实信号**:success(1/0)、quality(暂 = success,run 级 fixture 评分发生在任务完成之后、沉积之时不可得)、cost(任务成本/run 预算,未知则 0)。acceptance/time/risk/rollback **无信号 → 0**,不伪造(规则 #9)。
|
||||
- 冷启动 τ₀ = 0.5(中性先验);**单次 run 的 τ 多为先验**,需多 run 积累才是「挣来的声誉」——已如实标注。
|
||||
- trail 按 `(agent_role, agent_id)` 键控、跨 run 持久(这正是 τ 的意义)。
|
||||
|
||||
### 3.2 启发式 η(纯函数,无新状态)
|
||||
|
||||
`metrics.heuristic(...)` 输入全部来自编排器既有状态:match(required∩caps 的 **Jaccard**,奖励专精)、urgency(任务等待时长,300s 饱和)、dependency(下游依赖数,3 饱和)、resource(Agent 空闲槽位)、confidence=0.5(无信号 → 对所有候选同值中性常数,不扭曲排序)、risk/budget_pressure=0(无信号)。下限夹紧 0.05。
|
||||
|
||||
### 3.3 选择与遥测
|
||||
|
||||
- `P_i = τ^α·η^β / Σ`(α=1, β=2),ε-greedy 均匀探索防饿死(低 τ Agent 仍偶得任务,从而有机会重建 trail)。
|
||||
- 每次采样记录 `{task_id, agent_id, tau, eta, p_norm, p_score, explored}` 到 `SwarmRun.decisions`(**内部状态,不进 Manager 事件流**,上限 1000 条)。
|
||||
- `p_score = τ^α·η^β·100`(标准 §3.3 的 P_decision 公式);`p_norm` 为该候选集内的归一化概率,两者并存以免混淆。
|
||||
- collector:run 级 `tau`/`eta`/`p_decision` = 决策记录的均值;无记录 → NaN + `coverage=False`。
|
||||
|
||||
### 3.4 确定性与 CI
|
||||
|
||||
随机源可经 `ACO_SEED` 固定(CI 用),生产不固定。超参可经 `ACO_ALPHA/ACO_BETA/ACO_RHO/ACO_EPSILON` 覆盖,默认取标准 §7.2 推荐值。
|
||||
|
||||
## 4. 文件
|
||||
|
||||
| 文件 | 职责 |
|
||||
|---|---|
|
||||
| `orchestrator/decision_engine.py` | τ 存取/沉积、η 评分、ε-greedy 采样、`Decision` 遥测载体 |
|
||||
| `orchestrator/task_queue.py: get_ready_pending_tasks` | 候选枚举(不出队;选中后再 `remove_pending_task`) |
|
||||
| `orchestrator/main.py` | 派发环 ACO 分支 + 四个任务终态处的 `deposit_pheromone` + 决策落库 |
|
||||
| `orchestrator/swarm_runtime.py: SwarmRun.decisions / record_decision` | 决策遥测存储 |
|
||||
| `benchmark/collectors/run_collector.py` | `tau`/`eta`/`p_decision` 聚合 |
|
||||
| `scripts/test-decision-engine.py` | 22 项断言(trail 数学/夹紧/键控、η 排序、种子化采样分布、探索、遥测→collector、枚举不出队) |
|
||||
|
||||
## 5. 与 #9(dispatch scoring)的边界
|
||||
|
||||
Issue #9(调度评分)与 #10(τ/η/P 决策模型)耦合但分工明确:
|
||||
|
||||
- **#9 出「打分输入」**:候选 Agent×任务的可解释评分维度(capability_match、load、budget_pressure、risk、historical_success、estimated_cost/time),以及每次派发的候选列表与排除原因(`dispatch.decision_made`)。
|
||||
- **#10 出「概率决策」**:把这些维度归一为 τ(历史)与 η(先验),按 `P=τ^α·η^β/Σ` **概率采样**,并产出可回放的 `DecisionTrace`。
|
||||
|
||||
本仓 `decision_engine.py` 已实现 #10 的概率决策层与 τ/η 的最小喂入;#9 的「完整打分 schema + 候选/排除可解释性」为独立增量(`docs/scheduling/dispatch-score-schema.md`、`dispatch.decision_made` 事件),不在 #10 关闭范围内。
|
||||
|
||||
## 6. 诚实边界(本机制**未**关闭的)
|
||||
|
||||
- **决策质量未证**:概率派发是否优于贪心是**经验命题**,需 Group C 的对比 harness 才能回答;在此之前生产默认关闭。
|
||||
- τ 的 quality 输入暂 = success(无每任务质量信号);acceptance/time/risk 无信号 → 0。
|
||||
- 单边匹配(见 §1);Option B 推迟。
|
||||
- `gain`/`s_swarm`/`g_e`/`g_e_cost`/`benchmark` **仍 NaN**——Group A 不动验收的针。
|
||||
@@ -0,0 +1,67 @@
|
||||
# 质量插桩(Benchmark Group B):TestPassRate → Q_quality → reward
|
||||
|
||||
把「生成代码」变成可计算的质量分,进而让 `reward` 由 NaN 转为真实可算。本文档是该链路的唯一入口。
|
||||
|
||||
## 1. 链路总览
|
||||
|
||||
```
|
||||
specialist agent 生成文件 ──┐
|
||||
├─(完成时, 门控)─► 沙箱执行 fixture 留出测试 ─► TestPassRate
|
||||
fixture 留出测试 (held-out) ─┘ │
|
||||
▼
|
||||
quality_score(掩码归一) ─► Q_quality ─► collector ─► reward
|
||||
```
|
||||
|
||||
- **谁生成代码**:swarm 自身的执行单元(`agent/task_executor.py`,OpenAI 兼容模型),其输出含 `files:[{path,action,content}]` 写入工作区。
|
||||
- **谁评分**:**fixture 的留出测试**(held-out),swarm 看不到 → 避免「自己出卷自己改」。swarm 自带的 `test_*.py` 仅作**协作/鲁棒性信号**(`agent_test_pass_rate`),**不计入** Q_quality(Owner 裁定)。
|
||||
|
||||
## 2. 组件与文件
|
||||
|
||||
| 组件 | 文件 | 职责 |
|
||||
|---|---|---|
|
||||
| 代码沙箱 | `orchestrator/sandbox.py` + `sandbox_runner.py` | 在临时工作目录的子进程内运行测试;超时强杀、资源限额、环境清洗、路径越界校验;从 JSON 读取计数 |
|
||||
| Fixture | `benchmark/fixtures/__init__.py` + `<id>/fixture.json` + `<id>/tests/test_*.py` | 任务目标 + 留出测试 + `target_time_seconds` + `required_capabilities` |
|
||||
| 质量评测 | `orchestrator/quality.py` | 收集生成文件(区分 impl/测试)、沙箱评分、合成 `Q_quality` |
|
||||
| 运行时存储 | `SwarmRun.quality`(`swarm_runtime.py`) | 存评测结果,供 collector 读取 |
|
||||
| 触发点 | `main.py: refresh_swarm_run_status`(run 完成时) | 门控 + 绑定 fixture 时调用评测并落库 |
|
||||
| 采集 | `benchmark/collectors/run_collector.py` | 由 `quality` + run 数据合成 `reward` |
|
||||
| 公式 | `benchmark/metrics.py: quality_score / reward` | 纯函数(掩码归一 / 加权和) |
|
||||
|
||||
## 3. Q_quality:掩码归一(v2.1 裁定)
|
||||
|
||||
`Q_quality = Σ_{i∈present} wᵢ·xᵢ / Σ_{i∈present} wᵢ`,`i∈{TestPassRate, CodeReview, UserAcceptance}`,默认 `w=0.4/0.3/0.3`。
|
||||
|
||||
- 不适用项传 `None`,同时退出分子与分母 → 分值恒在 `[0,100]` 且**跨任务类型可比**。
|
||||
- 非编码任务(`required_capabilities` 不含 `{python,code_generation,testing,pytest,...}`)→ `TestPassRate=None` 自动忽略。
|
||||
- 当前只采集到 `TestPassRate`;`CodeReview`/`UserAcceptance` 未接入 → `Q_quality` 退化为 `TestPassRate`。
|
||||
- 三项全无 → `NaN`(规则 #9,不伪造 0)。
|
||||
|
||||
## 4. reward 何时为真
|
||||
|
||||
collector 在以下**全部满足**时计算 `reward`,否则 NaN + `coverage=False`:
|
||||
- 绑定 fixture 且 `Q_quality` 为真实数(沙箱产出了 TestPassRate);
|
||||
- `V_speed` 可算(fixture 给 `target_time_seconds`,run 时长 > 0);
|
||||
- `E_cost` 可算(预算 + 用量)。
|
||||
|
||||
派生口径:`s_task=完成率`、`r_robust=鲁棒分`、`g_gov=审批合规(无受治理操作→100)`、`p_rework=retry>0 的任务占比`、`p_risk=审批高危占比(无受治理操作→0)`。
|
||||
|
||||
> ⚠️ **已知低估**:`p_risk` 仅由审批派生、`p_rework` 仅由 retry 派生(未含评审重开)。两者与治理覆盖缺口绑定,已在 collector 与 coverage 文档显式标注,不作隐藏假设。
|
||||
|
||||
## 5. 安全(执行不可信代码)
|
||||
|
||||
详见 [`../integration/security-boundary.md §8.1`](../integration/security-boundary.md)。要点:
|
||||
- **OS 级隔离边界 = K8s Pod**(非 root/只读根/NetworkPolicy/限额/seccomp,部署侧强制,非本仓)。
|
||||
- 沙箱在 Pod 内做**纵深防御**:临时目录即用即删、超时强杀、资源限额、**环境清洗(密钥/Token/代理变量不入子进程)**、路径越界校验、输出截断。
|
||||
- 默认**关闭**:仅 `ENABLE_QUALITY_EVAL=1` 且在隔离 Pod 内启用。**不构成独立安全边界,不替代 Pod 层强化沙箱。**
|
||||
|
||||
## 6. 诚实边界(本链路**未**关闭的)
|
||||
|
||||
- 仅 1 个示例 fixture(`add_function`);**统一任务集未建**。
|
||||
- `CodeReview`/`UserAcceptance` 未接入(需评审/验收信号源,部分属 Product/Manager)。
|
||||
- `Q_quality` 真 ≠ `G_E`/`Benchmark_Agent` 真:**`gain` 仍需基线(Group C)**,故 `s_swarm`/`g_e`/`g_e_cost`/`benchmark` 仍 NaN。
|
||||
- 本链路**不构成 benchmark 主链路验收**。
|
||||
|
||||
## 7. 测试
|
||||
|
||||
- `scripts/test-sandbox.py`:沙箱真实执行、计数、超时、**环境清洗**、路径越界(无需模型 key)。
|
||||
- `scripts/test-quality.py`:fixture 评分 → `Q_quality=100` → `reward` 转真;并断言 `gain`/`benchmark` 仍 NaN(不越界声称)。
|
||||
@@ -41,17 +41,20 @@ P_decision = τ^α · η^β · 100 # v2.0 §3.3(变更)
|
||||
**τ 权重(v2.0)**:Success 0.25 · Quality 0.20 · **Acceptance 0.20(提升为一级因子)** · Cost 0.10 · Time 0.10 · Risk 0.08 · Rollback 0.07。
|
||||
**η 权重(v2.0)**:Match 0.25 · Urgency 0.15 · Dependency 0.15 · Resource 0.15 · **Confidence 0.10(新增)** · Risk 0.10 · BudgetPressure 0.10。
|
||||
|
||||
| 因子 | 数据来源(标准) | 本仓可采集 |
|
||||
> ✅ **τ/η/P 引擎已落地**(`orchestrator/decision_engine.py`,Group A / Option A 单边):信息素 trail 持久于 Redis(学习常开),概率选择门控 `ENABLE_ACO_DISPATCH`(默认关)。下表为**沉积/评分时各因子的真实喂入状态**——无信号的因子喂 0 或中性常数,不伪造(设计与局限见 decision-engine.md)。
|
||||
|
||||
| 因子 | 数据来源(标准) | 本仓沉积/评分时喂入 |
|
||||
|---|---|---|
|
||||
| τ.Success | Task 完成记录 | ✅ |
|
||||
| τ.Quality | 测试 / CI/CD | 🔴 无 CI 接入 |
|
||||
| τ.Acceptance | 人工验收日志 | 🟡 评审 accepted |
|
||||
| τ.Cost / Time | 资源监控 / Runtime 日志 | 🟡 usage / 时间戳 |
|
||||
| τ.Risk / Rollback | 安全审计 / Git·部署 | 🔴 |
|
||||
| η.Match / Dependency | 能力画像 / DAG | ✅ |
|
||||
| η.Confidence | Agent 自评接口 | 🔴 未实现 |
|
||||
| η.Urgency / Resource / Risk / BudgetPressure | 优先级 / 授权 / 风险引擎 / 预算 | 🔴 / 🟡 / 🔴 / 🟡 |
|
||||
| P_decision | 上述综合 | 🔴 无 τ/η 引擎 |
|
||||
| τ.Success | Task 完成记录 | ✅ 1/0 |
|
||||
| τ.Quality | 测试 / CI/CD | 🟡 run 级 fixture 评分已有(Group B),但晚于沉积时点 → 暂 = success |
|
||||
| τ.Acceptance | 人工验收日志 | 🔴 无每任务验收信号 → 0 |
|
||||
| τ.Cost | 资源监控 | ✅ 任务成本 / run 预算(未知 → 0) |
|
||||
| τ.Time / Risk / Rollback | Runtime / 审计 / 部署 | 🔴 无每任务目标/信号 → 0 |
|
||||
| η.Match / Dependency | 能力画像 / DAG | ✅ Jaccard 匹配 / 下游依赖数 |
|
||||
| η.Urgency / Resource | 任务等待时长 / Agent 空闲槽位 | ✅ |
|
||||
| η.Confidence | Agent 自评接口 | 🔴 未实现 → 中性 0.5(全候选同值,不扭曲排序) |
|
||||
| η.Risk / BudgetPressure | 风险引擎 / 预算 | 🔴 无信号 → 0 |
|
||||
| P_decision | 上述综合 | ✅ ε-greedy 采样 + 每决策遥测(`SwarmRun.decisions`);**单边匹配,决策质量未证(需 Group C)** |
|
||||
|
||||
## 2. 执行层(标准 §4)
|
||||
|
||||
@@ -68,12 +71,13 @@ P_rework = ReworkCount/TotalTasks×100
|
||||
| 指标 | 本仓可采集 |
|
||||
|---|---|
|
||||
| `S_task` | ✅ |
|
||||
| `Q_quality` | 🔴 需 TestPass/CodeReview/UserAcceptance(无 CI/评分) |
|
||||
| `V_speed` / `E_cost` | 🟡 Actual 有;Target/Expected 需基线 |
|
||||
| `R_robust` | 🟡 重试/恢复未计数 |
|
||||
| `G_gov` / `P_risk` / `P_rework` | 🔴 无敏感操作/风险/返工计数 |
|
||||
| `Q_quality` | 🟡 TestPass 已接入(fixture 留出测试 + 沙箱,Group B);CodeReview/UserAcceptance 缺 → 掩码归一 |
|
||||
| `V_speed` | 🟡 绑定 fixture 时(`target_time_seconds`)可算 |
|
||||
| `E_cost` | 🟡 预算 + 用量齐备时可算 |
|
||||
| `R_robust` | ✅ `retry_count` + 任务状态(collector 已算) |
|
||||
| `G_gov` / `P_risk` / `P_rework` | 🟡 审批合规 / 审批高危占比 / retry 派生——均为**已知低估口径**(见 metric-coverage-gaps 注) |
|
||||
|
||||
> v2.0 已给定全部 `w*`/`γ*` 权重,但多数**输入**仍未采集 → `τ`/`η`/`reward`/`p_decision` 暂不可算。
|
||||
> v2.0 已给定全部 `w*`/`γ*` 权重;输入现为**有条件采集**:绑定 fixture 的 run 可算 `reward`,开启 `ENABLE_ACO_DISPATCH` 的 run 可算 `τ`/`η`/`p_decision`;条件不满足 → NaN。
|
||||
|
||||
## 3. 蜂群层(标准 §5,权重未变)
|
||||
|
||||
@@ -90,14 +94,25 @@ S_governance = CompliantOperations/TotalOperations×100
|
||||
|
||||
| 指标 | 状态 |
|
||||
|---|---|
|
||||
| `s_completion` / `s_collaboration` / `s_cost` / `s_robustness` | ✅ 真实可算(采集器) |
|
||||
| `s_completion` / `s_collaboration` / `s_robustness` | ✅ 真实可算(采集器,无条件) |
|
||||
| `s_cost` | 🟡 有条件(需预算 + 用量) |
|
||||
| `s_communication` | 🟡 有条件(peer 消息请求→应答率,按 `correlation_id` 内部计数;无 peer 通信 → NaN) |
|
||||
| `s_governance` | 🟡 有条件(仅审批可派生) |
|
||||
| `s_gain` | 🔴 需基线(见 emergence-evaluation) |
|
||||
| `s_communication` | 🔴 未计数(无消息 telemetry) |
|
||||
| `s_governance` | 🟡 仅审批可派生 |
|
||||
| `s_swarm` | 🔴 含 gain/communication NaN → 暂为 NaN |
|
||||
| `s_swarm` | 🔴 含 gain NaN → 暂为 NaN |
|
||||
|
||||
## 4. 说明与待对齐
|
||||
|
||||
- **成本口径统一(v2.1)**:`S_cost`(§3)、`E_cost`(§2)、`CostEfficiency`(见 cost-normalized-gain)为**同一量** `100×Budget/ActualCost`。
|
||||
- **`Q_quality` 掩码归一(v2.1 裁定)**:`Q_quality` 是对 `{TestPassRate, CodeReviewScore, UserAcceptance}` 的**加权均值,但只对“该任务适用”的项计权并归一化**——不适用项(如非编码任务无 `TestPassRate`)同时退出分子与分母,权重按比例重分配给其余项,使分值恒在 `[0,100]` 且**跨任务类型可比**:
|
||||
|
||||
```
|
||||
Q_quality = Σ_{i∈present} wᵢ·xᵢ / Σ_{i∈present} wᵢ (默认 w = 0.4/0.3/0.3)
|
||||
```
|
||||
|
||||
- 「是否编码任务」由任务 `required_capabilities` 是否含 `{python, code_generation, testing, pytest}` 派生,无需额外输入。
|
||||
- 三项**全不适用 → NaN**(规则 #9,不伪造 0)。三项**全适用**时退化为 v2.0 的 `0.4/0.3/0.3` 混合。
|
||||
- 实现:`benchmark/metrics.py:quality_score`(纯函数,缺项传 `None`);单测见 `scripts/test-benchmark-metrics.py`。
|
||||
- ⚠️ 该函数为**纯公式**;其输入(TestPassRate 等)仍**未采集**(见 metric-coverage-gaps `reward` 行),故 `reward` 仍 NaN。
|
||||
- `α/β/ρ/N_agent/ε` 取值:标准 §7.2 给推荐初值(1.0 / 2.0 / 0.10 / 5 / 0.10),调优口径待定。
|
||||
- `Q_quality` 三项来源、`SuccessfulMessages/TotalMessages`、`Recovered/Total`、`Compliant/Total`、`Rework/Total` 的精确计数定义。
|
||||
|
||||
@@ -10,9 +10,9 @@
|
||||
|---|---|---|---|
|
||||
| 任务完成 | Task Logs、Handoff Logs | Elasticsearch | ✅ 任务状态 + 事件流(按 `swarm_id`);未汇入 ES |
|
||||
| 成本 / Token | Runtime Metrics | Prometheus | 🟡 usage 已采集;Prometheus 指标可抓取 |
|
||||
| 质量 | CI/CD Results、Code Review | 各 CI 平台 | 🔴 未接入 |
|
||||
| 质量 | CI/CD Results、Code Review | 各 CI 平台 | 🟡 TestPassRate 已接入(fixture 留出测试 + 沙箱执行,`ENABLE_QUALITY_EVAL` 门控);CodeReview/UserAcceptance 仍缺 |
|
||||
| 治理合规 | Audit Logs | OpenTelemetry | 🟡 事件流可作审计源,未独立留存 |
|
||||
| 通信 | WebSocket Logs | ClickHouse | 🟡 连接事件有日志;消息成功率未计数 |
|
||||
| 通信 | WebSocket Logs | ClickHouse | 🟡 连接事件有日志;peer 消息已按 `correlation_id` 内部计数(请求→应答率,存 `SwarmRun.collaboration`),尚未落 ClickHouse |
|
||||
| 基础设施 | Infrastructure Metrics | Prometheus | 🔴 未接入(cpu/memory/Pod) |
|
||||
|
||||
## 3. 本仓已发出的信号
|
||||
|
||||
Reference in New Issue
Block a user