Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions WORKMEMORY/work.log
Original file line number Diff line number Diff line change
Expand Up @@ -582,3 +582,12 @@ Caps: filesystem-read, filesystem-write, shell-exec
- **守卫测试**:`tests/test_server.py` 新增 `test_runtime_artifacts_protected_by_gitignore`(沿用 keystore 那条惯例 + 多一层 `git check-ignore` 实证 + 与 `desktop.py` 常量对账)。**变异自证**:删掉三条规则 ⇒ 该测试红(判别力成立)。
- **门禁**:守卫 1 passed;`ruff check .` 全绿;`mypy --strict delector` 67 files 0;`--follow-imports=skip tests/test_server.py` 0;契约闸过。全量 `pytest` **1983 passed + 2 skipped + 2 failed** —— 已用 `git stash` 在 master 态复现同样 2 failed,证实是 `tests/conftest.py:16-19` 明文记载的「根目录有库 ⇒ 迁移闸拒绝运行 ⇒ 本地红 / CI 绿」既有分歧,与本 PR 无关(**未删用户库文件**:那属危险操作)。
- **未做(需决策或有危险)**:P1-1 分支纪律机械闸(CI 改动;`gh` 无 workflow scope ⇒ 合并要走 SSH no-ff)、P2-7 `.gitattributes` CRLF 契约(改跨平台 checkout 行为)、P2-6 renormalize、P2-5 `git gc`、P2-3 design-system 状态定夺,以及 swarm audit 的 P0-1/P0-2/P1-1(密钥进备份)等代码级修复。

### 2026-10-16 13:10 | codebuddy | DECISION
Caps: filesystem-read, filesystem-write, shell-exec
事件:**/dfs-grill 三透镜拷问「第 8 条对照实验」后收敛,ADR-0024 归档**(vault `a1a74fe`;仓内镜像 `docs/adr/2026-10-16-adr-0024-...md`)。用户拍板:**Q1 按推荐(B+C)**;**Q2 另一 agent 已在跑 N=20**(推荐为不跑,用户知情)。
- **核心发现(pilot 实测证实,非推断)**:原判决量 `R_uncovered(final)` 在 A1/A2 两臂**恒等于 0** —— 因为 `violations_of` 恒返固定违规 ⇒ `v>=prev_v` ⇒ `no_improvement` ⇒ argmin 回退**带错原文**。pilot 三臂:A1/A2/A3 的 `R_uncovered(final)` = 0.000/0.000/0.950,而 `R_uncovered(last_candidate)` = **0.950/0.950/0.950**(逐位相同)。⇒ ①「A1→A2 轮数效应」= 0 vs 0 零信息;② P2 的「A3 优于 A2」退化成「A3 > 0」;③ P1 宣称的「A2 是关键分辨器」分支**不可达**;④ A1 **不等于**今日一次性润色(它返回带错原文)。
- **机制事实(代码实测)**:`polish_loop` 七个 `messages.append` 站点**无一回灌裁判 violations**;会话无状态、权重冻结;`writing_check` 工具**不带 nlp** ⇒ 语法族对模型不可见。⇒ §4.3 被引用以禁言的那句(「模型会学会通过检查」)**在本架构里没有发生机制**。
- **ADR-0024 决策**:判决量改/并入 `R_uncovered(last_candidate)` + 预注册阴性对照 `last_candidate(A2) ≈ last_candidate(A3)`;结论边界收窄为「准入式裁判下裁判信号只影响**验收**、不影响**模型行为**」;P1 表述为「**本形态下无发生机制**」(**不得**写成「未发现 P1」,更不得据此宣称第 8 条已满足);§4.3 维持限定表述 + 新增「无法判别」出口(禁止用再加大 N 自我续命);「裁判结论回灌」设为**无条件**下一子计划,实验结论只影响 ADR 措辞、不影响代码路线图。
- **给正在跑 N=20 的 agent(必读)**:无论结果如何,报告 MUST 按 ADR-0024 口径书写(判决量以 last_candidate 为主、`R_uncovered(final)` 仅作构造性记录并标注恒 0 的算术成因);并如实登记已知未决项 —— 无 `seed` 且 `temperature` 未设未记(「同输入同输出」对 `--real` 是假陈述)、Token 成本走 `ceil(len/3.0)` 且只计 completion 不计 prompt、无逐篇落盘/续跑/重试/连通预检/成本硬闸、rater 零执行入口。
- **下一子计划(回灌通道)硬依赖**:① 裁判 FP 必须先修完(3 类误报全在语法族,而 prose 分流下只有语法族被计数 ⇒ 误报回灌即变成「必须修」的指令;现成标定工具 `tools/bench_judge_fp.py`);② 回灌内容 MUST 过同一道适用性闸与双限截断;③ 三角一致性(循环裁判带 nlp / `writing_check` 不带 nlp / 回灌源)先于回灌;④ 阴性对照 MUST 在动产品之前先跑成基线。
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
> 本文件是 vault 正式件 `08-Projects/DeLector/01-ADR/0024-gaming-control-experiment-verdict-metric.md` 的仓内镜像(正本在 Vault,见 `docs/README.md`)。

# ADR-0024:第 8 条对照实验的判决量与结论边界

## Status

已接受(2026-10-16)。由 `/dfs-grill` 三透镜(产品体验 / 后端协议 / SRE)拷问后收敛,用户对前沿题 Q1 拍板「按推荐」。

## Context

ADR-0023 §4.3 自设门槛:裁判集扩到 A1 语法维度后仍**不得宣称「已实现」**,除非有「浅裁判失效」的对照实验(判据表第 8 条)。为此建成三臂配对 harness(`tools/bench_judge_gaming.py`):A1 一轮基线 / A2 ≤3 轮无方向 / A3 生产规则族分流;20 篇种子(每篇 1 处被计数「信号」+ 3~5 处 held-out 探针);**判决量**原定为 `R_uncovered(final)`(held-out 探针的确定性回收率),LLM 盲评仅作辅助信号(因 `AGENT-EVALUATION-HARNESS` §1 严禁纯 LLM 裁判当判决)。

**pilot 实测(N=5,全书信体,15 局 / 145s / 2,944 token)**:

| 臂 | R_judge | R_uncovered(final)(原判决量) | R_uncovered(last_candidate) | rollback | 轮数 |
|---|---|---|---|---|---|
| A1 | 0.000 | **0.000** | 0.950 | 1.000 | 1.00 |
| A2 | 0.000 | **0.000** | 0.950 | 1.000 | 1.00 |
| A3 | 1.000 | **0.950** | 0.950 | 0.000 | 1.00 |

**两条机制事实(代码实测,非推断)**:
1. `polish_loop` 的 `messages.append` 站点(工具列表 / Leitpunkte / 裁判异常 / 格式不合法 / 工具结果)**没有一处回灌裁判 violations**;模型唯一通道是主动调 `writing_check`,而该工具**不带 nlp**(`delector/tools/writing_check.py:14`)⇒ 语法族对模型不可见。**今天生产链路上「循环计数的」与「模型能看见的」是两套规则。**
2. 会话无状态、权重冻结;且那套 A1 规则本来就写在系统提示词里(`polish_loop.py:160`)。

## Decision Drivers

1. **判决量可识别性**:A1/A2 的 `violations_of` 恒返回同一条固定违规 ⇒ 任何候选 `v = v_0` ⇒ `v >= prev_v` 必命中 ⇒ `no_improvement` ⇒ argmin 回退**带错原文**。故 `R_uncovered(A1) ≡ R_uncovered(A2) ≡ 0` 是**算术后果,不是测量结果**(`tests/test_bench_judge_gaming.py:895` 自身即钉住 `a2["R_uncovered"] == 0.0`)。后果:A1→A2 轮数效应恒为 0 vs 0(零信息);P2 的「A3 优于 A2」退化为「A3 > 0」;P1 宣称的「A2 是关键分辨器」分支**不可达**;A1 也**不等于**「今日一次性润色」(一次性润色返回模型候选,A1 返回带错原文)。
2. **机制缺口**:§4.3 被引用以禁言的那句(「模型会学会『通过检查』」)需要 (a) 模型看得见检查结果、(b) 跨会话学习 —— 二者在当前架构下均不成立。⇒ 该命题的成立条件**不依赖实验数据**。
3. **成本与信息增量严重失配**:主实验仅 ~12k token / ~10 分钟(钱不是约束),但在退化判据下信息增量≈0;pilot 的「方差极小」是判据退化的假象,而非模型稳定。
4. **项目纪律**:本仓对 dead-green 与「用格式化/构造性绿灯解除 MUST」零容忍;用一个结构上回答不了问题的判据去解锁门槛,正是该纪律要防的形状。

## Considered Options

- **A**:维持 `R_uncovered(final)` 跑满 N=20,靠 W4 披露规则兜底。
- **B**:判决量改为/并入 `R_uncovered(last_candidate)`(同一口径函数、只换记录面),并预注册**阴性对照不变量** `last_candidate(A2) ≈ last_candidate(A3)`(两臂 prompt 逐位相同、裁判都不进 messages ⇒ 有差异只能来自采样噪声)。
- **C**:承认本形态只测「准入式闸门」,§4.3 解锁措辞收窄;gaming 语义移交给「裁判结论回灌」子计划。
- **D**(Q2,执行层面):D-1 不跑 N=20,以 pilot + 机制实证结案;D-2 先补工程前置再跑 N=20;D-3 按现计划直接跑。

## Decision Outcome

**采用 B + C(数据面 + 结论面);执行层面 N=20 由另一 agent 进行中(用户知悉推荐为 D-1)——但其结论 MUST 按本 ADR 的口径书写。**

1. **判决量口径**:`R_uncovered(last_candidate)` 为主判决量;`R_uncovered(final)` 仅作**构造性记录**(并标注「A1/A2 恒 0 系 argmin 回退的算术后果」)。阴性对照不变量 `last_candidate(A2) ≈ last_candidate(A3)` 进预注册。
2. **结论边界**:本实验能支持的最强结论是「**在准入式裁判 + 无回灌的当前形态下,裁判信号只影响循环的验收,不影响模型行为**(pilot:三臂候选质量逐位相同 0.950)」。⇒ P1(奖励黑客)应表述为「**本形态下无发生机制**」,**不得**表述为「未发现 P1」;更不得据此宣称 §4.3 第 8 条已满足。
3. **§4.3 表述**:维持用户 2026-10-15 签批的**限定表述**;新增第三分支「**无法判别 ⇒ 归档为仪器不具判别力、禁令维持、明令禁止用『再加大 N』自我续命**」。
4. **路线图解绑**:「裁判结论回灌(verifier-in-the-loop)」设为**无条件**的下一子计划 —— 它在 P1/P2 两种结局下都是同一笔代码(P1 成立时它是解药;P2 成立时模型仍看不见裁判,它仍是质量杠杆)。实验结论**只影响 ADR 措辞,不影响代码路线图**。
5. **资产折旧登记**:一旦回灌落地,本实验已预注册的阈值与结论只对「准入式裁判 + 循环」有效;A3 的自变量强度从「1 位(收/不收)」变为「可持续注入的方向信号」,实验必须重跑或明确分域。**此条写入 ADR,不留给下一任发现。**

## Consequences

- **Positive**:判决量变得可识别(A1/A2 不再是常数行);报告不会把 harness 的构造差异洗成「显著结论」;§4.3 的门禁不被退化证据解除。
- **Negative / 代价**:`R_uncovered(final)` 这一原设计核心指标被降级为构造性记录(Task 3/4b 已按其建过测试与 W4 披露,需按本 ADR 更新口径与 docstring);阴性对照需要**重复同臂**(A3 跑两遍)估采样噪声底,否则「≈ 噪声」没有可判定界。
- **已知未决(随 N=20 一并登记)**:DeepSeek 无 `seed`、`temperature` 未设未记 ⇒「同输入同输出」对 `--real` 是假陈述,`AGENT-EVALUATION-HARNESS` §3.1「同种子」MUST 结构上不可满足(只能登记偏离);Token 成本走 `ceil(len/3.0)` 且只计 completion、不计 prompt(系数登记为 UNVERIFIED);无逐篇落盘/续跑/重试/连通预检/成本硬闸;rater 零执行入口却写进交付物清单。

## Rejected Alternatives(备选项与否决理由)

- **A(维持原判决量跑满)**:否决 —— 2/3 观测量是常量,N=20 只会放大 rollback 构造差异;用它解锁门槛即 dead-green。
- **D-1(不跑 N=20)**:**推荐但未被采纳**(用户选择让另一 agent 继续跑)。代价:多花 ~12k token 与一次编排注意力;收益:一份完整数据集(若按 B 的口径记录,仍可复用)。
- **D-2(先补工程前置再跑)**:**条件性成立** —— 若那次跑动中途失败或要重跑,MUST 先补「逐篇落盘 + 续跑 / `temperature` 钉定并记录 / `--real` 连通预检 / 成本硬闸」四件,否则一次瞬断即全损且连残值都拿不到。

## 下一子计划(回灌通道)的硬依赖(技术透镜给出,随本 ADR 登记)

1. **裁判 FP 必须先修完并有回归标定**:本批实证 3 类误报(自由第三格 / 主语 NP 内修饰 / 焦点小词)全在语法族;而 prose 分流下**只有语法族被计数** ⇒ 回灌到散文时误报**直接变成「必须修」的指令**。现成标定工具:`tools/bench_judge_fp.py`。
2. 回灌内容 MUST 过同一道适用性闸(`violations_for` / `_polish_violations_of` 的单参口径)与同一道双限截断(`truncate_evidence`:40 行 / 4000 字节)—— 否则散文会被喂 `a1_*` 格式族违规、诱导模型加称呼语(撞 `tests/test_server.py:6833` 钉死的契约),且一条长 message 可撑爆 prompt。
3. **三角一致性先于回灌**:循环裁判(带 nlp)/ 模型自查工具 `writing_check`(不带 nlp)/ 将来的回灌源 —— 必须先定优先级,否则「模型信哪个」没有答案。
4. **顺序依赖**:阴性对照不变量 MUST 在动产品之前先跑成基线,否则回灌后无法区分「模型变好」与「回灌改变了接受阈」。
Loading