CIE-Unified

git clone 

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
M MERGE_PLAN.md
+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。