diff --git a/WORKMEMORY/work.log b/WORKMEMORY/work.log index 9df71464..ead6a047 100644 --- a/WORKMEMORY/work.log +++ b/WORKMEMORY/work.log @@ -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 在动产品之前先跑成基线。 diff --git a/docs/adr/2026-10-16-adr-0024-gaming-control-experiment-verdict-metric.md b/docs/adr/2026-10-16-adr-0024-gaming-control-experiment-verdict-metric.md new file mode 100644 index 00000000..450cacfa --- /dev/null +++ b/docs/adr/2026-10-16-adr-0024-gaming-control-experiment-verdict-metric.md @@ -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 在动产品之前先跑成基线,否则回灌后无法区分「模型变好」与「回灌改变了接受阈」。