- commit
- ddcb584
- parent
- 423d812
- author
- codex@macbookpro
- date
- 2026-04-01 10:29:40 +0800 CST
review: phase0 merge plan audit and clarifications
1 files changed,
+65,
-28
+65,
-28
1@@ -3,6 +3,12 @@
2 > 日期: 2026-03-31
3 > 决策依据: Branch A 6/8, Branch B 8/8 (同一 cie-datasets formal dataset)
4 > 策略: 方案 C — 核取 B,壳取 A
5+>
6+> 审核更新(2026-04-01):
7+> `origin/integration/merge-plan @ 423d812` 已落地到 Phase 2,
8+> 但 **Phase 3 前必须暂停**,先通过 Phase 2.1 gate:
9+> PendingSignal 单路径收口、移除旧直接回灌路径、补 exactly-once 回归测试、
10+> 并明确 pytest gate 与 formal validation script gate 的区别。
11
12 ---
13
14@@ -27,8 +33,8 @@
15 |------|------|---------|
16 | `cie/graph.py` | **Branch B** | 非对称图(fwd_weight ≠ bwd_weight)、`laplacian_at()`、`asymmetry_at()`、`circulation()`、`convergence()` |
17 | `cie/dynamics.py` | **Branch B** | L_G φ 扩散 + soft clamp、自适应衰减 α(x)=α₀·(1-c)^β·(1/κ)、动态锚点阈值(10th percentile)、三级归巢、置信度自然衰减 |
18-| `cie/state.py` | **Branch B 为基底,吸收 A 的 Profile** | (φ,μ,J) 三元组、AttentionPool、Dirichlet K=3 置信度。**需要吸收 A 的 `SedimentationProfile` dataclass(见下)** |
19-| `cie/runtime.py` | **Branch B 为基底,吸收 A 的信号队列** | CIERuntime 六接口、action_release u=o·c·ε、feedback_loop。**需要吸收 A 的 `PendingSignal` 机制(见下)** |
20+| `cie/state.py` | **Branch B 为基底,吸收 A 的 Profile** | (φ,μ,J) 三元组、AttentionPool、Dirichlet K=3 置信度。**需要吸收 A 的 `SedimentationProfile` dataclass,但 Phase 3 应先 dual-write/并行观测,不直接替换 `experience_hits`。** |
21+| `cie/runtime.py` | **Branch B 为基底,吸收 A 的信号队列** | CIERuntime 六接口、action_release u=o·c·ε。**需要吸收 A 的 `PendingSignal` 机制,并在 Phase 2.1 删除旧直接 `_feedback_loop()` 路径,保证 feedback/emit 只走单一路径。** |
22
23 ### 壳 — 取 Branch A
24
25@@ -36,8 +42,8 @@
26
27 | 设施 | 来源 | 说明 |
28 |------|------|------|
29-| `PendingSignal` 信号队列 | **Branch A** `cie/state.py` + `cie/runtime.py` | 将输入/反馈/回灌统一为信号对象排队,下一步 step 时消费。替换 Branch B 的直接 `_feedback_loop()` 调用 |
30-| `SedimentationProfile` | **Branch A** `cie/state.py` | 每节点生命周期对象(stage, activation_hits, stable_steps, dormant_steps, resonance, candidate_score, merged_into)。替换 Branch B 的 `experience_hits` 计数器 |
31+| `PendingSignal` 信号队列 | **Branch A** `cie/state.py` + `cie/runtime.py` | 将输入/反馈/回灌统一为信号对象排队,下一步 step 时消费。**目标是单路径收口:替换 Branch B 的直接 `_feedback_loop()` 调用,而不是与之并存。** |
32+| `SedimentationProfile` | **Branch A** `cie/state.py` | 每节点生命周期对象(stage, activation_hits, stable_steps, dormant_steps, resonance, candidate_score, merged_into)。**先并行观测/dual-write,再决定是否替换 Branch B 的 `experience_hits` 计数器。** |
33 | `cie/validation.py` | **Branch A** `cie/validation.py` | 476 行标准化验证框架,输出 JSON + Markdown 报告。需适配 Branch B 的 snapshot 字段 |
34 | 报告模板 | **Branch A** `reports/` 目录结构 | JSON schema + Markdown 自动生成 |
35
36@@ -49,6 +55,7 @@
37 | Branch A 的 `confidence_proxy` | A | 被 B 的 Dirichlet 替代 |
38 | Branch A 的 age-based 衰减 | A | 被 B 的自适应衰减替代 |
39 | Branch B 的手写 `STAGE_REPORT.md` | B | 被 A 的 validation.py 自动报告替代 |
40+| Branch B 的直接 `_feedback_loop()` 回灌路径 | B | PendingSignal 落地后必须删除,避免与队列双通道并存导致重复应用 |
41 | 两边各自的魔法数字 | A+B | 统一为参数类 `CIEConfig` |
42 | Branch B 的 `HANDOFF.md` | B | 开发阶段文档,不进主干 |
43
44@@ -60,8 +67,9 @@ Branch A 和 B 的六接口签名已基本一致(SPEC §5),需要统一的
45
46 ```
47 ingest(input, context, anchors)
48- → 创建 PendingSignal(来自 A 的模式)
49+ → 创建 external PendingSignal(来自 A 的模式)
50 → 排入 state.pending_signals
51+ → 不再直接调用 legacy _feedback_loop()
52
53 step(n)
54 → 消费 pending_signals → _apply_signal()(A 的队列消费)
55@@ -73,7 +81,8 @@ step(n)
56
57 emit()
58 → action_release u=o·c·ε(B 的公式)
59- → 创建 feedback PendingSignal(A 的模式)
60+ → 创建 emit PendingSignal(A 的模式)
61+ → 不直接改写 runtime 状态
62
63 commit_feedback(feedback)
64 → 创建 feedback PendingSignal with polarity(A 的模式)
65@@ -86,6 +95,8 @@ reset_session()
66 → 清激活/注意力,保留 φ/ability_cores/anchors(B 的逻辑)
67 ```
68
69+**当前审核结论**:接口方向没错,但在 `423d812` 这一步里,PendingSignal 队列和旧直接 `_feedback_loop()` 仍然并存,Phase 2 只能视为“功能落地、尚未收口”。未完成 Phase 2.1 之前,不进入 Phase 3。
70+
71 ---
72
73 ## 3. 合并顺序
74@@ -95,24 +106,44 @@ reset_session()
75 ### Phase 1: 基底搭建(Day 1)
76
77 1. 从 `branch-b @ c734288` 复制 `cie/graph.py`、`cie/dynamics.py`、`cie/state.py`、`cie/runtime.py`
78-2. 跑 Branch B 的 42 项测试确认基底不坏
79+2. 跑 Branch B 的 42 项 pytest 套件确认基底不坏:
80+ `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py tests/test_comprehensive.py -q`
81 3. 提交:`integration: 基底——Branch B runtime 核心`
82
83 ### Phase 2: 信号队列移植(Day 1-2)
84
85 1. 从 Branch A 移植 `PendingSignal` dataclass 到 `cie/state.py`
86 2. 改写 `runtime.py` 的 `ingest()`、`emit()`、`commit_feedback()` 使用信号队列
87-3. 改写 `_feedback_loop()` 为 `_apply_signal()` 的队列消费
88-4. 跑测试确认回灌/反馈功能不退化
89+3. 改写 `_feedback_loop()` 为 `_apply_signal()` 的队列消费,不保留并行的直接状态写入路径
90+4. 先跑快速 gate:
91+ `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py -q`
92 5. 提交:`integration: 信号队列——PendingSignal 替换直接调用`
93
94-### Phase 3: 沉积 Profile 移植(Day 2)
95+### Phase 2.1: 单路径收口 gate(Phase 3 前必须通过)
96+
97+1. 清理旧直接回灌路径,保证 `ingest()` / `emit()` / `commit_feedback()` 对反馈都只做 enqueue,不做第二条直接 apply
98+2. 增加 exactly-once 回归检查,明确覆盖:
99+ `emit()` 产生的回灌不会被 `ingest()` + `step()` 双重应用;
100+ `commit_feedback()` 不会和旧 `_feedback_loop()` 叠加;
101+ `PendingSignal` 是唯一反馈入口
102+3. 通过快速 gate:
103+ `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py -q`
104+ 预期:`12 passed`
105+4. 通过完整本地 gate:
106+ `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py tests/test_comprehensive.py -q`
107+ 预期:`42 passed`
108+5. 明确 formal validation 是单独脚本 gate,不与上面的 pytest 口径混写:
109+ `python3 tests/formal_validation.py`
110+6. 只有 Phase 2.1 通过,后续实现才允许进入 Phase 3
111+
112+### Phase 3: 沉积 Profile 并行观测(Day 2)
113
114 1. 从 Branch A 移植 `SedimentationProfile` dataclass 到 `cie/state.py`
115-2. 改写 `dynamics.py` 的 `sediment()` 使用 Profile(保留 B 的滑动窗口 + 动态阈值)
116-3. 在 snapshot_state 中输出 Profile 信息
117-4. 跑测试确认沉积路径功能不退化
118-5. 提交:`integration: 沉积 Profile——SedimentationProfile 替换 experience_hits`
119+2. 保留 Branch B 的 `experience_hits` 作为已验证行为基线;先把 Profile 做成 dual-write / parallel observation
120+3. 在 snapshot_state 中输出 Profile 信息与对照指标,比较 Profile 与 `experience_hits` 的行为对齐
121+4. 跑测试确认沉积路径功能不退化;若不对齐,不替换 `experience_hits`
122+5. 后续如需真正替换 `experience_hits`,必须在额外 gate 中证明行为保持一致后再做,不与本阶段绑定
123+6. 提交:`integration: 沉积 Profile——dual-write 观察层`
124
125 ### Phase 4: 参数统一(Day 2)
126
127@@ -144,13 +175,15 @@ reset_session()
128 | # | 标准 | 来源 |
129 |---|------|------|
130 | 1 | SPEC §9 全部 11 项 | LOCKED_IMPLEMENTATION_SPEC |
131-| 2 | Branch B 的 42 项测试全通 | branch-b tests |
132-| 3 | Branch A 的 18 项测试逻辑等价全通 | branch-a tests(适配后) |
133-| 4 | cie-datasets 8 场景全 PASS | formal_validation |
134-| 5 | phi 不超 ±10.1(soft clamp 保留) | 数值稳定性 |
135-| 6 | 非对称比能涌现词结构 | word_emergence 验证 |
136-| 7 | validation.py 自动生成 JSON + MD 报告 | 工程要求 |
137-| 8 | 无魔法数字,全部在 CIEConfig 中 | 可维护性 |
138+| 2 | `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py -q` 通过(当前口径应为 `12 passed`) | Phase 2 / 2.1 gate |
139+| 3 | `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py tests/test_comprehensive.py -q` 通过(当前口径应为 `42 passed`) | Branch B/integration pytest suite |
140+| 4 | PendingSignal exactly-once 语义由回归测试证明;不存在旧 `_feedback_loop()` 直接路径与队列双通道并存 | Phase 2.1 gate |
141+| 5 | Branch A 的壳层语义等价检查通过(原 18 项能力点适配后覆盖) | branch-a shell semantics |
142+| 6 | cie-datasets 8 场景全 PASS;并明确这是 formal validation script gate,而不是 pytest 项数的一部分 | formal_validation |
143+| 7 | phi 不超 ±10.1(soft clamp 保留) | 数值稳定性 |
144+| 8 | 非对称比能涌现词结构 | word_emergence 验证 |
145+| 9 | validation.py 自动生成 JSON + MD 报告 | 工程要求 |
146+| 10 | 无魔法数字,全部在 CIEConfig 中 | 可维护性 |
147
148 ---
149
150@@ -158,10 +191,11 @@ reset_session()
151
152 | 风险 | 影响 | 缓解 |
153 |------|------|------|
154-| PendingSignal 移植引入延迟回灌 bug | 回灌检测失败 | Phase 2 立即跑 smoke test 02 |
155-| SedimentationProfile 与 B 的衰减/阈值不兼容 | 沉积路径退化 | Phase 3 跑 dynamics test 03-05 |
156+| PendingSignal 与旧 `_feedback_loop()` 双通道并存 | `emit()` / `ingest()` / `commit_feedback()` 可能重复应用反馈,污染已验证动态行为 | 先过 Phase 2.1:单路径收口 + exactly-once 回归测试,再继续 |
157+| 过早用 SedimentationProfile 直接替换 `experience_hits` | 破坏 Branch B 已验证的沉积/能力核形成动态 | Phase 3 先 dual-write/并行观测,替换延后到额外 gate |
158 | A 的 validation.py 假设 A 的 snapshot 格式 | 字段不匹配 | Phase 5 逐字段适配 |
159-| 合并后数值行为微变 | 原有测试值不完全匹配 | 允许 ±5% 浮点容差 |
160+| “tests pass” 口径写得过于笼统 | 把 pytest gate 与 formal validation script gate 混为一谈,误导后续实施 | 在计划中固定命令和预期输出,不再只写泛化口号 |
161+| 合并后数值行为微变 | 原有测试值不完全匹配 | 允许 ±5% 浮点容差,但 formal validation 仍需单独复核 |
162
163 ---
164
165@@ -171,11 +205,12 @@ reset_session()
166 |-------|---------|
167 | Phase 1 基底 | 30 分钟 |
168 | Phase 2 信号队列 | 2 小时 |
169-| Phase 3 沉积 Profile | 1.5 小时 |
170+| Phase 2.1 单路径 gate | 45 分钟 |
171+| Phase 3 沉积 Profile(dual-write) | 2 小时 |
172 | Phase 4 参数统一 | 1 小时 |
173 | Phase 5 验证框架 | 1.5 小时 |
174 | Phase 6 全量验证 | 1 小时 |
175-| **总计** | **~7.5 小时** |
176+| **总计** | **~8.75 小时** |
177
178 ---
179
180@@ -185,8 +220,8 @@ reset_session()
181
182 | 事实 | 数据 |
183 |------|------|
184-| Branch B formal dataset | **8/8 PASS**(独立复现) |
185-| Branch A formal dataset | **6/8 PASS**(初中数学 phi=12.07 超限,跨学科 phi=20.18 超限) |
186+| Branch B formal dataset | **8/8 PASS**(`c110916` strict rerun 独立复现) |
187+| Branch A formal dataset | **6/8 PASS**(`273f416` strict rerun;初中数学 phi=12.07 超限,跨学科 phi=20.18 超限) |
188 | Branch A raw 五本课本 | 8/10(更早轮次) |
189 | Branch B 理论贴合 | 三核量 (o,c,ω) 全实现 |
190 | Branch A 工程壳 | PendingSignal + SedimentationProfile + validation.py |
191@@ -195,4 +230,6 @@ reset_session()
192
193 **壳取 A 的理由**:信号队列模式比直接调用更规整;SedimentationProfile 比计数器更精细;validation.py 自动报告是工程必需品。
194
195+**本次审核补充判断**:上述高层决策仍然成立,没有证据支持改成“核取 A”或“壳取 B”。需要修正的是实施顺序:当前必须先在 Phase 3 前补一个 Phase 2.1 gate,消除 PendingSignal 双路径风险;而 SedimentationProfile 应先 dual-write,再决定是否替换 `experience_hits`。
196+
197 **三方共识**:George(决策者)、ChatGPT(Branch A 开发者/审查者)、Claude(Branch B 开发者/审查者)均同意方案 C。