CIE-Unified

git clone 

codex@macbookpro  ·  2026-04-01

MERGE_PLAN.md

  1# CIE-Unified 整合方案
  2
  3> 日期: 2026-03-31
  4> 决策依据: Branch A 6/8, Branch B 8/8 (同一 cie-datasets formal dataset)
  5> 策略: 方案 C — 核取 B,壳取 A
  6>
  7> 审核更新(2026-04-01):
  8> `origin/integration/merge-plan @ 423d812` 已落地到 Phase 2,
  9> 但 **Phase 3 前必须暂停**,先通过 Phase 2.1 gate:
 10> PendingSignal 单路径收口、移除旧直接回灌路径、补 exactly-once 回归测试、
 11> 并明确 pytest gate 与 formal validation script gate 的区别。
 12
 13---
 14
 15## 0. 冻结点
 16
 17| 分支 | Commit | 状态 |
 18|------|--------|------|
 19| `branch-a/task04-validation-reporting` | `419ae8d` | 冻结,不再改 |
 20| `branch-b` | `c734288` | 冻结,不再改 |
 21| `review/branch-b-formal-dataset-strict-rerun` | `c110916` | 参考(B 的 strict rerun 验证) |
 22| `review/branch-a-formal-dataset-strict-rerun` | `273f416` | 参考(A 的 strict rerun 验证) |
 23
 24---
 25
 26## 1. 文件级合并计划
 27
 28### 核 — 取 Branch B
 29
 30这些文件直接从 `branch-b @ c734288` 复制,构成 runtime 内核:
 31
 32| 文件 | 来源 | 关键机制 |
 33|------|------|---------|
 34| `cie/graph.py` | **Branch B** | 非对称图(fwd_weight ≠ bwd_weight)、`laplacian_at()`、`asymmetry_at()`、`circulation()`、`convergence()` |
 35| `cie/dynamics.py` | **Branch B** | L_G φ 扩散 + soft clamp、自适应衰减 α(x)=α₀·(1-c)^β·(1/κ)、动态锚点阈值(10th percentile)、三级归巢、置信度自然衰减 |
 36| `cie/state.py` | **Branch B 为基底,吸收 A 的 Profile** | (φ,μ,J) 三元组、AttentionPool、Dirichlet K=3 置信度。**需要吸收 A 的 `SedimentationProfile` dataclass,但 Phase 3 应先 dual-write/并行观测,不直接替换 `experience_hits`。** |
 37| `cie/runtime.py` | **Branch B 为基底,吸收 A 的信号队列** | CIERuntime 六接口、action_release u=o·c·ε。**需要吸收 A 的 `PendingSignal` 机制,并在 Phase 2.1 删除旧直接 `_feedback_loop()` 路径,保证 feedback/emit 只走单一路径。** |
 38
 39### 壳 — 取 Branch A
 40
 41这些工程设施从 `branch-a @ 419ae8d` 移植到整合分支:
 42
 43| 设施 | 来源 | 说明 |
 44|------|------|------|
 45| `PendingSignal` 信号队列 | **Branch A** `cie/state.py` + `cie/runtime.py` | 将输入/反馈/回灌统一为信号对象排队,下一步 step 时消费。**目标是单路径收口:替换 Branch B 的直接 `_feedback_loop()` 调用,而不是与之并存。** |
 46| `SedimentationProfile` | **Branch A** `cie/state.py` | 每节点生命周期对象(stage, activation_hits, stable_steps, dormant_steps, resonance, candidate_score, merged_into)。**先并行观测/dual-write,再决定是否替换 Branch B 的 `experience_hits` 计数器。** |
 47| `cie/validation.py` | **Branch A** `cie/validation.py` | 476 行标准化验证框架,输出 JSON + Markdown 报告。需适配 Branch B 的 snapshot 字段 |
 48| 报告模板 | **Branch A** `reports/` 目录结构 | JSON schema + Markdown 自动生成 |
 49
 50### 不要的
 51
 52| 项目 | 原分支 | 原因 |
 53|------|--------|------|
 54| Branch A 的对称图 `graph.py` | A | 被 B 的非对称图替代 |
 55| Branch A 的 `confidence_proxy` | A | 被 B 的 Dirichlet 替代 |
 56| Branch A 的 age-based 衰减 | A | 被 B 的自适应衰减替代 |
 57| Branch B 的手写 `STAGE_REPORT.md` | B | 被 A 的 validation.py 自动报告替代 |
 58| Branch B 的直接 `_feedback_loop()` 回灌路径 | B | PendingSignal 落地后必须删除,避免与队列双通道并存导致重复应用 |
 59| 两边各自的魔法数字 | A+B | 统一为参数类 `CIEConfig` |
 60| Branch B 的 `HANDOFF.md` | B | 开发阶段文档,不进主干 |
 61
 62---
 63
 64## 2. 接口对齐
 65
 66Branch A 和 B 的六接口签名已基本一致(SPEC §5),需要统一的是内部实现路径:
 67
 68```
 69ingest(input, context, anchors)
 70  → 创建 external PendingSignal(来自 A 的模式)
 71  → 排入 state.pending_signals
 72  → 不再直接调用 legacy _feedback_loop()
 73
 74step(n)
 75  → 消费 pending_signals → _apply_signal()(A 的队列消费)
 76  → _propagate_activation()(B 的 L_G 扩散 + 激活传播)
 77  → _apply_homing()(B 的三级归巢)
 78  → _apply_decay()(B 的自适应衰减)
 79  → _refresh_sedimentation()(A 的 SedimentationProfile 检测 + B 的阈值)
 80  → _refresh_observability()
 81
 82emit()
 83  → action_release u=o·c·ε(B 的公式)
 84  → 创建 emit PendingSignal(A 的模式)
 85  → 不直接改写 runtime 状态
 86
 87commit_feedback(feedback)
 88  → 创建 feedback PendingSignal with polarity(A 的模式)
 89  → 包含 weaken_confidence(B 的 Dirichlet 衰减)
 90
 91snapshot_state()
 92  → 所有 SPEC §6 字段(A+B 已对齐)
 93
 94reset_session()
 95  → 清激活/注意力,保留 φ/ability_cores/anchors(B 的逻辑)
 96```
 97
 98**当前审核结论**:接口方向没错,但在 `423d812` 这一步里,PendingSignal 队列和旧直接 `_feedback_loop()` 仍然并存,Phase 2 只能视为“功能落地、尚未收口”。未完成 Phase 2.1 之前,不进入 Phase 3。
 99
100---
101
102## 3. 合并顺序
103
104**原则:先壳接核,不同时大改理论和工程外壳。**
105
106### Phase 1: 基底搭建(Day 1)
107
1081.`branch-b @ c734288` 复制 `cie/graph.py`、`cie/dynamics.py`、`cie/state.py`、`cie/runtime.py`
1092. 跑 Branch B 的 42 项 pytest 套件确认基底不坏:
110   `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py tests/test_comprehensive.py -q`
1113. 提交:`integration: 基底——Branch B runtime 核心`
112
113### Phase 2: 信号队列移植(Day 1-2)
114
1151. 从 Branch A 移植 `PendingSignal` dataclass 到 `cie/state.py`
1162. 改写 `runtime.py``ingest()`、`emit()`、`commit_feedback()` 使用信号队列
1173. 改写 `_feedback_loop()``_apply_signal()` 的队列消费,不保留并行的直接状态写入路径
1184. 先跑快速 gate:
119   `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py -q`
1205. 提交:`integration: 信号队列——PendingSignal 替换直接调用`
121
122### Phase 2.1: 单路径收口 gate(Phase 3 前必须通过)
123
1241. 清理旧直接回灌路径,保证 `ingest()` / `emit()` / `commit_feedback()` 对反馈都只做 enqueue,不做第二条直接 apply
1252. 增加 exactly-once 回归检查,明确覆盖:
126   `emit()` 产生的回灌不会被 `ingest()` + `step()` 双重应用;
127   `commit_feedback()` 不会和旧 `_feedback_loop()` 叠加;
128   `PendingSignal` 是唯一反馈入口
1293. 通过快速 gate:
130   `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py -q`
131   预期:`12 passed`
1324. 通过完整本地 gate:
133   `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py tests/test_comprehensive.py -q`
134   预期:`42 passed`
1355. 明确 formal validation 是单独脚本 gate,不与上面的 pytest 口径混写:
136   `python3 tests/formal_validation.py`
1376. 只有 Phase 2.1 通过,后续实现才允许进入 Phase 3
138
139### Phase 3: 沉积 Profile 并行观测(Day 2)
140
1411. 从 Branch A 移植 `SedimentationProfile` dataclass 到 `cie/state.py`
1422. 保留 Branch B 的 `experience_hits` 作为已验证行为基线;先把 Profile 做成 dual-write / parallel observation
1433. 在 snapshot_state 中输出 Profile 信息与对照指标,比较 Profile 与 `experience_hits` 的行为对齐
1444. 跑测试确认沉积路径功能不退化;若不对齐,不替换 `experience_hits`
1455. 后续如需真正替换 `experience_hits`,必须在额外 gate 中证明行为保持一致后再做,不与本阶段绑定
1466. 提交:`integration: 沉积 Profile——dual-write 观察层`
147
148### Phase 4: 参数统一(Day 2)
149
1501. 创建 `cie/config.py`,把两边散落的魔法数字收集为 `CIEConfig` dataclass
1512. `CIERuntime.__init__` 接收 `config: CIEConfig`
1523. 提交:`integration: 参数统一——CIEConfig 替换魔法数字`
153
154### Phase 5: 验证框架移植(Day 3)
155
1561. 从 Branch A 移植 `cie/validation.py`
1572. 适配 Branch B 的 snapshot 字段(已基本对齐)
1583. 添加 Branch B 特有的检查项:非对称比、环流、Dirichlet 分化
1594. 跑 validation,生成 JSON + Markdown 报告
1605. 提交:`integration: 验证框架——validation.py 适配整合 runtime`
161
162### Phase 6: 正式数据集全量验证(Day 3)
163
1641.`/Users/george/code/cie-datasets` 的 hydrated JSONL 跑完整 8 场景验证
1652. 生成正式报告
1663. 与 Branch A 6/8 和 Branch B 8/8 做三方对比
1674. 提交:`integration: 正式验证——cie-datasets 8 场景`
168
169---
170
171## 4. 验收标准
172
173整合完成后必须满足:
174
175| # | 标准 | 来源 |
176|---|------|------|
177| 1 | SPEC §9 全部 11 项 | LOCKED_IMPLEMENTATION_SPEC |
178| 2 | `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py -q` 通过(当前口径应为 `12 passed`) | Phase 2 / 2.1 gate |
179| 3 | `python3 -m pytest tests/test_smoke.py tests/test_dynamics.py tests/test_comprehensive.py -q` 通过(当前口径应为 `42 passed`) | Branch B/integration pytest suite |
180| 4 | PendingSignal exactly-once 语义由回归测试证明;不存在旧 `_feedback_loop()` 直接路径与队列双通道并存 | Phase 2.1 gate |
181| 5 | Branch A 的壳层语义等价检查通过(原 18 项能力点适配后覆盖) | branch-a shell semantics |
182| 6 | cie-datasets 8 场景全 PASS;并明确这是 formal validation script gate,而不是 pytest 项数的一部分 | formal_validation |
183| 7 | phi 不超 ±10.1(soft clamp 保留) | 数值稳定性 |
184| 8 | 非对称比能涌现词结构 | word_emergence 验证 |
185| 9 | validation.py 自动生成 JSON + MD 报告 | 工程要求 |
186| 10 | 无魔法数字,全部在 CIEConfig 中 | 可维护性 |
187
188---
189
190## 5. 风险
191
192| 风险 | 影响 | 缓解 |
193|------|------|------|
194| PendingSignal 与旧 `_feedback_loop()` 双通道并存 | `emit()` / `ingest()` / `commit_feedback()` 可能重复应用反馈,污染已验证动态行为 | 先过 Phase 2.1:单路径收口 + exactly-once 回归测试,再继续 |
195| 过早用 SedimentationProfile 直接替换 `experience_hits` | 破坏 Branch B 已验证的沉积/能力核形成动态 | Phase 3 先 dual-write/并行观测,替换延后到额外 gate |
196| A 的 validation.py 假设 A 的 snapshot 格式 | 字段不匹配 | Phase 5 逐字段适配 |
197| “tests pass” 口径写得过于笼统 | 把 pytest gate 与 formal validation script gate 混为一谈,误导后续实施 | 在计划中固定命令和预期输出,不再只写泛化口号 |
198| 合并后数值行为微变 | 原有测试值不完全匹配 | 允许 ±5% 浮点容差,但 formal validation 仍需单独复核 |
199
200---
201
202## 6. 时间估计
203
204| Phase | 预计耗时 |
205|-------|---------|
206| Phase 1 基底 | 30 分钟 |
207| Phase 2 信号队列 | 2 小时 |
208| Phase 2.1 单路径 gate | 45 分钟 |
209| Phase 3 沉积 Profile(dual-write) | 2 小时 |
210| Phase 4 参数统一 | 1 小时 |
211| Phase 5 验证框架 | 1.5 小时 |
212| Phase 6 全量验证 | 1 小时 |
213| **总计** | **~8.75 小时** |
214
215---
216
217## 7. 决策记录
218
219**方案 C 落板依据:**
220
221| 事实 | 数据 |
222|------|------|
223| Branch B formal dataset | **8/8 PASS**(`c110916` strict rerun 独立复现) |
224| Branch A formal dataset | **6/8 PASS**(`273f416` strict rerun;初中数学 phi=12.07 超限,跨学科 phi=20.18 超限) |
225| Branch A raw 五本课本 | 8/10(更早轮次) |
226| Branch B 理论贴合 | 三核量 (o,c,ω) 全实现 |
227| Branch A 工程壳 | PendingSignal + SedimentationProfile + validation.py |
228
229**核取 B 的理由**:非对称图/L_G/Dirichlet/circulation 是 README 理论主线的忠实实现,丢掉等于放弃 CIE 核心;Branch A 在稳定性上也不如 B(两个场景 phi 超限)。
230
231**壳取 A 的理由**:信号队列模式比直接调用更规整;SedimentationProfile 比计数器更精细;validation.py 自动报告是工程必需品。
232
233**本次审核补充判断**:上述高层决策仍然成立,没有证据支持改成“核取 A”或“壳取 B”。需要修正的是实施顺序:当前必须先在 Phase 3 前补一个 Phase 2.1 gate,消除 PendingSignal 双路径风险;而 SedimentationProfile 应先 dual-write,再决定是否替换 `experience_hits`234
235**三方共识**:George(决策者)、ChatGPT(Branch A 开发者/审查者)、Claude(Branch B 开发者/审查者)均同意方案 C。