pi-multi-viewers 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -75,13 +75,17 @@ tests/ 测试(unittest discover tests)
75
75
 
76
76
  为什么**不能**用插件全档(`all`):两类插件在**我们这种 session 形态**上都是分钟级负担、
77
77
  且都在关键路径上(loop 等进程退出才继续)——
78
- · **AFT**:大 session 上进程退出前多活数分钟(受控对照 445.9s → 0.5s);
78
+ · **AFT**:大 session 上进程退出前多活数分钟(承重 = **生产真场** e2e21 收尾占
79
+ 66–78% vs e2e23 ≈0%);
79
80
  · **MC 全档**:它的 historian 对"带大段未处理历史"的 session **在默认输出上限
80
- (32000)下**每次必失败并立刻重试(受控对照:同输入 **447s → 10.3s,43 倍**;根因 =
81
- 推理流吃光输出上限——该上限**可调**:主 pi 抬到 131072 后首跑即成功、输出 36954 ✓)。
81
+ (32000)下**每次必失败并立刻重试(承重 = e2e21 同场 62 次/60 失败 vs e2e23 0 次 +
82
+ MC 自己的 `context.db` #916;上限**可调**:主 pi 抬到 131072 后首跑即成功、输出 36954 ✓)。
83
+ (旧引的 445.9s / 447s 两笔属 2026-09-13 装置有缺陷的探针,已**退出证据位**——
84
+ 撤回记录见 `docs/design.md` 决策 20 证据段,本文件不复述。)
82
85
  零扩展**真场实测**:每次唤醒约 48–82s、收尾≈0%、historian 0 次(墙钟随唤醒数变动,
83
86
  区间与测点见 docs/design.md §二)。
84
- **mc-tools 档的实测**:entry **只注册工具、不装 hook** → historian 0/6 ✓(生产 0/3 ✓);
87
+ **mc-tools 档的实测**:MC 的 entry = **工具注册 + 两个生命周期钩子**(开/关 DB),
88
+ **无** historian/压缩执行钩子 → historian **0**(真场:e2e24 0/3、e2e25 0);
85
89
  `ctx_search` 实测可用 ✓;成本**未测得显著差异**(受控探针 n 小、组内方差>组间差 ✗;
86
90
  生产基线:本场 strict=1、n=19,唤醒启动段中位 **0.68s**、收尾中位 0.04s ✓)。
87
91
  **入口解析**:`meeting_fs` 从 pi 的 packages 找包 → 读它自己声明的 `pi.extensions`
package/docs/design.md CHANGED
@@ -120,6 +120,7 @@ compaction 的 `firstKeptEntryId` 起 + 其后的条目"——窗口内含 compa
120
120
  | `扩展策略` 行 | `声明 / 生效 / strict / 降级原因` | 声明 = `protocol.extensionPolicy`;生效 = loop log 的**登记行**(首唤打一次:`扩展策略: 声明=X 生效=Y strict=0\|1[ 降级原因=…]`)→ 报告给"声明 vs 生效 + ⚠ 生效≠声明"(与"档位:声明/生效"同型;e2e24 评审 E2)|
121
121
  | `终止` 行 | 分类 + 原料计数 | `终止:共识(RR 全体 pass)|freezing N / all-freezing N / pass N / stall 接管行 N`;分类判据只有事实(bare 的 type 计数 + loop log 的"超时兜底/声明接管"字样)——**不做评分** |
122
122
  | `唤醒构成` 表 | 每次唤醒一行 + 每 agent 合计 | 四端点(spawn / 首事件 / 末事件 / exit)+ 往返数 + `Δ助手` + `Δ工具` + retry + 本唤醒内的 commit;合计给 `跨度 = 启动前 + 事件内 + 收尾` 与平均/往返/retry(e2e23 分析产出,见下) |
123
+ | `跨度` 段 | 两个直标量各一行(`Σ进程跨度` / `墙钟跨度`)+ 派生量(`并行度`) | 两量**各自命名、不可互替**;**0 是合法值**(判缺失一律 `is None`——与「缺席≠0」是同一纪律的两面);派生量的**算式永远打印**(n/a 时也打)——2026-09-27 复盘审计产出(外部引用曾把两个 span 混算:Σ1538s÷751s=2.05 vs ÷636s=2.42);全部派生自「进程」段的登记字段与 bare 的 commit 时间,不新增度量 |
123
124
 
124
125
  **`唤醒构成` 表的精度契约**(e2e23 多视角分析定稿):**可推导** = 分段 Δ、
125
126
  按 role 拆分、计数、retry、终止原因、区间重叠、离群 top-N;**不承诺** =
@@ -409,8 +410,9 @@ commit 是溯源记录、本节是长期引用点——不并存两份权威值
409
410
  AFT(语义关)3.3–4.5s → **~1–2s/唤醒 ≈ 2% 墙钟**(33 唤醒 ≈ 1 分钟
410
411
  / 55 分钟)。最初那 57s 已经拿回,**小 session 上几乎无剩余收益**。
411
412
  **限定(2026-09-14 注记)**:"2%" 仅来自**小 session 单点探针**、**不可外推**——
412
- 生产规模下 AFT 的收尾成本可达数分钟(见本节后文 445.9s 对照);"是否屏蔽 AFT"
413
- 以决策 20(默认 mc-tools / none)为准,本句仅存档。
413
+ 生产规模下 AFT 的收尾成本可达数分钟(承重证据 = 决策 20 的 e2e21 收尾占比
414
+ 66–78% vs e2e23 ≈0%;本节旧引的"445.9s 对照"已在 2026-09-27 审计中退出证据位);
415
+ "是否屏蔽 AFT"以决策 20(默认 mc-tools / none)为准,本句仅存档。
414
416
  - 三种屏蔽方式:`--no-extensions` + `-e <MC 扩展入口>`(AFT 不加载、
415
417
  MC 保留;入口可从 `~/.pi/agent/settings.json` 的 `packages` + 包的
416
418
  `pi.extensions` 解析,不硬编码);`--pure`(全关,已实现);现状。
@@ -471,23 +473,36 @@ commit 是溯源记录、本节是长期引用点——不并存两份权威值
471
473
  20. **agent 进程扩展策略三档(默认 mc-tools)**(2026-09-13 定零扩展、
472
474
  2026-09-14 用户定为默认 mc-tools 并改“允许而非要求”;取代决策 19):
473
475
 
474
- **证据(两类插件都在关键路径上,都是分钟级)**:
475
- - **AFT**:大 session 上进程退出前多活数分钟——同一份 1.9MB session、同一模型
476
- 受控对照:全扩展收尾 **445.9s** vs 只留 MC **0.5s**。
476
+ **证据(两类插件都在关键路径上,都是分钟级;承重证据 = A 类真场 + 上游账本)**:
477
+ - **AFT**:大 session 上进程退出前多活数分钟(结构性原因:`meeting_loop` 等进程
478
+ 退出才继续 ⇒ 收尾段全额进用户等待)。**承重**:e2e21(插件在场)收尾段占进程跨度
479
+ **66–78%**(进程总跨度 3676/3681/3709s,收尾 2769/2881/2437s)vs e2e23(零扩展)
480
+ 收尾 ≈0%。
481
+ ⚠ **一条已撤回的引用**:本节曾引"全扩展收尾 **445.9s** vs 只留 MC **0.5s**"当
482
+ 受控对照——那批属 2026-09-13 装置有缺陷的探针(`docs/test-methodology.md` #26 已记),
483
+ 且 445.9/0.5 只是运行账本两条**总时长**(458s / 7s)的收尾段拆解,原始分段查无、
484
+ n=1、提示词形态未记录 ⇒ **自愿退出证据位**,不作决策依据(2026-09-27 复盘审计)。
477
485
  - **MC**:它的 historian 对"带着大段未处理历史"的 session(agents 都是这种:
478
- fork 自大历史)**每次必失败并立刻重试**——同一份 fork 源、同一极小任务受控
479
- 对照:**给 MC 447.2s(其中 435.5s 是 3 次连续失败的 historian、尾部占 97%)
480
- vs 不给 MC 10.3s(43 倍)**。曾疑为 historian 模型 id 过期(已修,实测**仍然**
481
- 失败)→ **修正(2026-09-14)**:根因至少含**可调默认上限**——MC 源码
486
+ fork 自大历史)**每次必失败并立刻重试**。**承重**:e2e21 同一场 historian
487
+ **62 次 / 60 失败**(每 agent 每 ~2.5 分钟一次、每次 ~150s,失败即重排)vs
488
+ e2e23 historian **0 次**;主 pi 侧的 32000 上限根因有 MC 自己的 `context.db`
489
+ 记录为证(#916:`maxTokens` 抬到 131072 后首跑成功、输出 36954)。
490
+ ⚠ **另一条已撤回的引用**:"给 MC 447.2s vs 不给 MC 10.3s(43 倍)"同属那批
491
+ 装置有缺陷的探针、**运行账本无对应臂**、且与同批账号里"仅 MC 收尾 0.5s"方向相反
492
+ ⇒ 同样**退出证据位**("归因混淆"属假说,不追查:追查成本 > 价值,决策不依赖它)。
493
+ **根因修正(2026-09-14,仍有效)**:不止"模型 id 过期"——MC 源码
482
494
  `maxOutputTokens: historian?.maxTokens ?? 32000`,而 historian 模型是
483
495
  reasoning:true(推理流吃光上限 → "all reasoning, no text")。主 pi 把
484
- `historian.maxTokens` 抬到 131072 后**首跑即成功**(其 context.db #916:
485
- completed、输出 36954 > 旧上限 32000)。故原结论应限定为"**在该默认上限
486
- (32000)下不工作**";agents 会话(fork 大历史)在抬高上限后**未复测**。
487
- - **真场验证(零扩展)**:墙钟 **12m31s** / 32 次唤醒 / **每次唤醒 48.1s** /
488
- **收尾 ≈0%**(对照插件在场时 66–78%)/ **historian 0 次** / 并行度 2.42/3.0 /
489
- 档位对照 ✓。同一机制的对照:e2e19 71.6s·17m19s、e2e20 81.6s·20m34s、
490
- e2e21 **330s·1h13m**(historian 风暴 62 次 60 失败)。
496
+ `historian.maxTokens` 抬到 131072 后首跑即成功。故原结论限定为"**在该默认上限
497
+ (32000)下不工作**";agents 会话(fork 大历史)在抬高上限后**未复测**
498
+ (只对 `all` 档有意义——默认档结构上不跑 historian)。
499
+ - **真场验证(零扩展,e2e23)**:32 次唤醒 / **每次唤醒进程跨度 48.1s** /
500
+ **收尾 ≈0%**(对照插件在场时 66–78%)/ historian **0 次** / 并行度 2.42/3.0 /
501
+ 档位对照 ✓。
502
+ *口径注记*:该场墙钟曾记 **12m31s**,**源不可复核**;按同批可核数字反算
503
+ (Σ进程跨度 1538s ÷ 并行度 2.42)≈ **10m36s**。引用请带这层限定。
504
+ 同机制的其他场次(各自 n=1,**均为"场次墙钟 / 每次唤醒跨度"**):
505
+ e2e19 17m19s·71.6s、e2e20 20m34s·81.6s、e2e21 **1h13m·330s**。
491
506
 
492
507
  **做法(三档;值域/默认值的家 = `meeting_fs.EXTENSION_POLICIES` /
493
508
  `DEFAULT_EXTENSION_POLICY`,协议字段 `extensionPolicy`,CLI
@@ -503,11 +518,28 @@ commit 是溯源记录、本节是长期引用点——不并存两份权威值
503
518
  是必要的 background 补充”):**fork 本身是主背景通道**(agent 继承主会话的开发
504
519
  上下文),覆盖面受 ① fork 源内容 ② `budget` 裁剪比例限制;`ctx_search` 是它的
505
520
  **兜底**(按需检索记忆/文档/历史)。MC 的
506
- `subagent-entry.js`(MC **自己**给它的"搜索类子代理"用的入口)**只注册工具、
507
- 不装任何 hook** → 给 agents 按需检索能力(memories / docs / 历史),
508
- **不含** historian/压缩/打标。实测:`ctx_search` 可用 ✓;historian 0/6 ✓;
509
- **成本未测得显著差异**(受控探针 n 小、组内方差 > 组间差 ✗;生产基线:首次真场
510
- strict=1、n=19 → 唤醒启动段中位 **0.68s**、收尾中位 0.04s ✓)。
521
+ **两份入口的结构句与检测覆盖面(2026-09-27 复盘审计订正)**:
522
+ - **MC 的 `subagent-entry.js`**(MC 自己给"搜索类子代理"用的入口)= **工具注册 +
523
+ 两个生命周期钩子**(`session_start` 开 DB / `session_shutdown` 关 DB),**没有**
524
+ historian / 压缩 / 打标类执行钩子 → agents 得到按需检索能力(memories / docs /
525
+ 历史)。*(此前写作"只注册工具、不装任何 hook",与上游 0.43.2 源码不符,已订正。)*
526
+ **检测覆盖面三面**:唤醒命令的**启动段**、报告**收尾列**、MC 自己的 `context.db` 账本。
527
+ - **pi-mcp-adapter** = **7 个钩子**,其中 5 个按事件触发(`input` / `tool_result` /
528
+ `before_agent_start` / `session_tree` / `resources_discover`)⇒ 只有 init 落在
529
+ **启动段**(实测边际 ≈ +0.2s/唤、收尾 ≈0);**每轮钩子的成本 = 已知盲区**(落在
530
+ LLM 主导的"事件内"段,现有列分辨不出)。**兜底 = 两份入口可独立移除**(怀疑
531
+ adapter 就去掉第二条 `-e`)。
532
+ - **重估触发**:上游 MC / adapter **升版**,或报告**尾列出现分钟级离群** → 重核
533
+ (MC:`session_start`/`session_shutdown` 内是否新增工作;adapter:每轮钩子是否变重)。
534
+ - **探针双向句**:那 2 臂探针(16–23s vs 4s)验的是**能力与卡死/收尾**,
535
+ **不测钩子成本**。
536
+
537
+ **真场计数**:historian **0**(e2e24 0/3、e2e25 0、e2e23 零扩展 0);`ctx_search`
538
+ 可用 ✓;**成本未测得显著差异**(受控探针 n 小、组内方差 > 组间差 ✗;生产基线:
539
+ 首次真场 strict=1、n=19 → 唤醒启动段中位 **0.68s**、收尾中位 0.04s ✓)。
540
+ *口径项*:fork 源随唤醒增长(构建时 606 条 / 1.40MB → 读数时 729–800 条 /
541
+ 1.44–1.56MB)——**是文件在涨,不是时间在涨**,不构成成本项。
542
+
511
543
  **入口解析 fail-fast**(`resolve_mc_tools_entry`:pi 的 packages → MC 包 →
512
544
  它声明的扩展入口 → 同目录 `subagent-entry.js`);缺 MC 时**可见降级**(严格模式
513
545
  `MV_MC_TOOLS_STRICT=1` 才报错退出)。
@@ -519,6 +551,17 @@ commit 是溯源记录、本节是长期引用点——不并存两份权威值
519
551
  (E2;与"档位"同型),否则降级只在 loop log 里、产品面看不见。
520
552
 
521
553
  **使用指引(2026-09-25)**:协议模板里有一节「需要项目历史时」告诉 agents何时用 `ctx_search`(并写明"项目文件优先、记忆可能过期")——**它只在工具真会到位时出现**(策略为 mc-tools 且入口可解析),降级/零扩展时整节消失(不留空指引)。起因:e2e25 自然使用观察里三 agent 自发调用 **0 次**;加装指引后需在下一次"任务书不提工具"的场次里复测计数(utility 无客观判据,只做计数 + 抽看)。
554
+ **数字口径规则(2026-09-27 定,审计产出)**:时间/成本数字必须带 **span · 测点 ·
555
+ 规模 · n**(例:"收尾段,同一份 1.9MB session,n=1");**增长量带时点**("构建时
556
+ 606 条 → 读数时 729–800 条");**无源或不可复核的数字一律标注**("无源"/
557
+ "不可复核"),不得直接引用。
558
+
559
+ **回退判据(单行规则,2026-09-27 定)**:自 **2026-09-25**(装置变更:加协议
560
+ 指引 + 第二份入口)起,连续两场「**需求场景可证在 fork 窗口之外**」且 utility≈0
561
+ → 提议回退 `none`(**需用户拍板**)。两入口**分列计数**(`ctx_search` / MCP 工具);
562
+ 这是**能力取舍判据、不是性能开关**;数据来源 = 各场 `result.md` 的元信息
563
+ (不设计数器/监控)。*前置限定不可省*——否则会把"需求不在窗口内"当成负证据
564
+ (2026-09-27 那场即此情形:主题所需事实全在窗口/仓库内)。
522
565
  **两份入口(2026-09-25 用户裁决 B)**:`mc-tools` 除 MC 的只读检索工具外,再显式
523
566
  `-e` 加载 **pi-mcp-adapter**(web_search / web_reader / zread 等 MCP 工具)。
524
567
  **语义清单(唯一权威段,别处引用不复述)**:
@@ -526,7 +569,7 @@ commit 是溯源记录、本节是长期引用点——不并存两份权威值
526
569
  不阻断分析(机器上没装其中之一照样能跑);
527
570
  ② `MV_MC_TOOLS_STRICT=1`(测试/探针保真)→ **任一**入口缺失即报错退出
528
571
  (否则测试可能在"没装某入口"的环境里通过,而该工具从未生效);
529
- ③ 生效值语义:**部分降级仍 `生效=mc-tools`**(只是少了那份 `-e`),
572
+ ③ 生效值语义:**部分降级仍 `生效=mc-tools`**(只是少了那份 `-e`),(`生效` = 入口解析成功;命令形状由测试锁:none / mc-tools / all 各一)
530
573
  两份全失才 `生效=none`;
531
574
  ④ 为什么必须显式 `-e`:`--no-extensions` 关的是**扩展发现**,显式路径照常生效
532
575
  (pi `--help` 原文)——不加载就等于 agents 完全失去该能力(MCP 那侧 = 失去
@@ -557,6 +600,10 @@ commit 是溯源记录、本节是长期引用点——不并存两份权威值
557
600
  (① 职责归属怎么变 ② 净收益数据来源 ③ 新增失败面与检测延迟),不得直接实施。
558
601
  将来若要为 agents 加回任何扩展,须**显式 opt-in + 净收益账**(本次实证:
559
602
  AFT/MC 两次都是"加了才知道贵")。
603
+ **加回 AFT 的定价程序(2026-09-27 定,一句话,不另开节)**:任何加回 AFT 的
604
+ 提案须在**当前条件**下做 **1 次受控唤醒**(硬超时、用户当次同意)+ **收尾段
605
+ 实测** + 净收益账,**不得引用 2026-09-13 那批单点数字**(已退出证据位,见决策
606
+ 20 证据段的撤回记录);反证到手前按预期量级 **≈ 1.4–2.1h/场加在关键链** 予以否决。
560
607
 
561
608
  21. **git 守卫范围 = 从讨论 workdir 发起的操作**(`GIT_CEILING_DIRECTORIES`
562
609
  注入于 spawn);主项目仓库不在守卫范围(agent 的 cwd 就是主项目,其
@@ -0,0 +1,158 @@
1
+ <!-- 存档:docs/reviews/2026-09-27-aft-mc-evidence-audit.md
2
+ 来源:一次真实多视角分析的 result.md 原文(未删改,仅加本头与下方说明)。
3
+ 分析场次目录已随 cleanup 删除;文中消息编号不可再核验,仅作溯源线索
4
+ (与代码注释引用约定一致:行为以自描述为准)。 -->
5
+
6
+ # 存档说明
7
+
8
+ - **主题**:复盘 2026-09-13 前后「屏蔽 AFT」的决策——当时的对照数据、结论链,
9
+ 以及现在的默认扩展策略(`mc-tools`)是否仍成立
10
+ - **场次**:`mv-mv-main-20260927-134822`(3 视角:效率 / 简单 / 铁律;真实 pi 讨论;
11
+ `forkMode=budget`、`extensionPolicy=mc-tools`(声明=生效)、配额 **meeting=20**(走
12
+ `/multi-viewers-config` 设的默认值)、`maxRR=7`;墙钟 22m34s、39 条消息、
13
+ 35 次唤醒(9/17/9)、**rc≠0 0 次 / retry 0 次 / 收尾 ≈0**;共识收敛)
14
+ - **判定**:**默认扩展策略成立** ✓——承重证据已换成 A 类真场(AFT:e2e21 收尾占
15
+ 66–78% vs e2e23 ≈0%;MC:e2e21 同场 historian 62 次/60 失败 vs e2e23 0 次 +
16
+ 上游 `context.db` #916 的 32000 上限根因)
17
+ - **本场最重的一条(审计自身证据链)**:`docs/test-methodology.md` #26 在 09-14
18
+ 已记「那批数据……后来发现装置有缺陷」,而 `docs/design.md` 决策 20 **仍把
19
+ 445.9s vs 0.5s / 447.2s vs 10.3s 当“受控对照”引用**(引用方与纪律方自相矛盾)
20
+ → 两笔**退出证据位**(原始分段查无、n=1、账本无对应臂、与同批“仅 MC 收尾 0.5s”
21
+ 方向相反),承重证据改指真场;决策本身不受影响
22
+ - **其余订正**:MC 的 `subagent-entry` 是“工具注册 + 2 个生命周期钩子”(非“不装
23
+ 任何 hook”);adapter 有 7 个钩子、**每轮钩子成本 = 已知盲区**(兜底 = 入口可独立
24
+ 移除);e2e23 的“12m31s”标为**源不可复核**并按可核数字反算 ≈10m36s;新增
25
+ **数字口径规则**(span·测点·规模·n;增长量带时点;无源数字必须标注)
26
+ - **新规则**:**回退判据**(自 2026-09-25 起连续两场“需求场景可证在 fork 窗口外”且
27
+ utility≈0 → 提议回退 `none`;两入口分列计数;**能力取舍判据、非性能开关**)+
28
+ **加回 AFT 的定价程序**(须在当前条件下受控实测,不得引用 09-13 单点)
29
+ - **本场的 `ctx_search` 观察**(第一次非诱导调用):效率 3 / 简单 0 / 铁律 3,全部
30
+ 用于核查探针数字的原始记录、**均未命中** ⇒ **本场不构成有效效用样本**(所需事实
31
+ 在 fork 窗口/仓库内)——这正是“回退判据必须带前置限定”的由来
32
+ - **落地**:`ffe28aa`(批 A 文档 + 批 B 注释;491 python + 54 harness 全绿)。
33
+ §四 的代码待办(档位分派穷尽化 + `all` 档形状测试、报告两 span 各打一行)未做,
34
+ 留作独立排期
35
+
36
+ # 多视角分析结果:复盘 2026-09-13 前后「屏蔽 AFT」的决策——对照数据、结论链、默认扩展策略是否仍成立
37
+
38
+ - **参与者**:效率、简单、铁律(3 视角;resultWriter = 铁律)
39
+ - **分析类型**:复盘审计(只读:未改文件、未跑 LLM;主仓 `git status` 干净)
40
+ - **场次**:`mv-mv-main-20260927-134822`(2026-09-27;3 视角真实讨论)
41
+ - **终止**:共识(RR 全员 pass)
42
+ - **约束**:本轮**只提意见、不改代码**——§四全部动作为**建议(未落地)**。
43
+
44
+ **三问直答**:
45
+ 1. **当时的对照数据**:见 §一(一张表;其中两笔探针对照退出证据位,标"待考");
46
+ 2. **结论链**:见 §二(六步,每步一个承重事实);
47
+ 3. **默认扩展策略是否仍成立**:**成立**——承重事实 = **构造 + A 类真场**(§三);另有两条未了账与一个已知盲区(§三.2/3.3)。
48
+
49
+ ---
50
+
51
+ ## 一、对照数据(一张表;"证据位"一列,承重位 = A 类行)
52
+
53
+ | # | 对照 | 数字 | 口径 / 来源(span · 规模 · n · 时点) | 证据位 |
54
+ |---|---|---|---|---|
55
+ | ① | AFT 语义搜索隔离(09-12,决策 19) | 开 **61.0/60.9/61.0s**(n=3)vs 关 **3.3–4.4s**(n=5);零扩展基线 2.2s;e2e17 33 唤 ≈ **22–25%** 墙钟 | 逐扩展隔离 + 跨项目复现;生产 e2e17 | 历史(该机制已退役) |
56
+ | ② | AFT 收尾(09-13 探针) | **445.9s vs 0.5s** | **收尾段**;同一份 1.9MB 真 session、同模型、极小任务;**n=1**(账本 A 458s / B 7s 总时长可对);提示词形态未记录 | **待考**(原始记录缺失) |
57
+ | ③ | MC historian(09-13 探针) | **447.2s**(435.5s = 3 次连续失败、尾部 97%)**vs 10.3s(43×)** | 同 fork 源、极小任务;**账本无对应臂**;与 B 臂(仅 MC 收尾 0.5s)方向相反 | **待考**(同上) |
58
+ | ④ | 场次对照(生产,各 n=1) | e2e19 **17m19s**·71.6s/唤;e2e20 **20m34s**·81.6s/唤;e2e21 **1h13m·330s/唤**(historian **62 次/60 失败**;收尾 66–78%);e2e23 **636s≈10.6m·48.1s/唤·收尾 0%** | 生产;e2e23 墙钟 = 首末 commit 636s;并行度 2.42 = 1538/636 | **A 类(承重)** |
59
+ | ⑤ | 零扩展真场(e2e23) | 32 唤 · 48.1s/唤 · 收尾 0% · historian 0 · 并行度 2.42 | 同 ④。**注**:`design.md:487` 的 **12m31s 为无源口径**(且与 2.42 混用两个 span:1538/751=2.05 ✗)→ 改可复核的 636s/10.6m | **A 类(承重)** |
60
+ | ⑥ | mc-tools 生产基线(现默认档) | e2e24(strict=1,**n=19**):启动中位 **0.68s**(max 0.75)/ 收尾中位 **0.04s**(max 0.10)/ historian **0/3**;e2e25:historian **0**、ctx_search **自然 0 次**;09-25 复核:单入口 46 唤 vs 双入口 24 唤 → 启动中位 **0.60 → ≈0.80s**、尾 ≈0 ⇒ 第二入口**边际 ≈ +0.2s/唤** | 生产单场 + 09-25 跨场单对照;探针 `historian 0/6`、`中位 7.8/9.2s` 属待考(与方法论 #26 的装置缺陷记录同批) | **A 类(承重)**;探针数字降**待考** |
61
+ | ⑦ | 构造事实(静态核对) | `--no-extensions` **只关发现**、显式 `-e` 照常生效(pi --help);MC 0.43.2 `subagent-entry` = **工具注册 + `session_start`/`session_shutdown`(开/关 DB)**、**无 historian/压缩执行钩子**;MCP adapter 2.38.0 = **7 个钩子**(含 `input`/`tool_result`/`before_agent_start` 等**每轮执行**钩子);本场登记行 `声明=mc-tools 生效=mc-tools strict=0` | 上游源码(本机版本)+ pi --help + 本场 loop 日志 | **A 类(承重;上游升版需重核)** |
62
+
63
+ **成本口径三层(引用时不得省略)**:**段**(启动/收尾,不是整场)· **规模**(n、场次)· **关键链**(agent 并行 ⇒ 墙钟 ≈ 最慢链;当前 ≈ **7–15s/场 ≈ 0.5–2%**;不要把 0.7s × 总唤醒数 × 3 agent,会虚高约 3 倍)。另有规则:随时间增长的量(fork 源、AFT 存储、`context.db`、重试计数)必须带**时点**;无源数字标"无源/不可复核"。
64
+
65
+ **本场现场事实(口径项,非成本项)**:fork 源 = 各 agent 的活动 session 文件,随唤醒增长——构建时 **606 条 / 1.40MB**(est≈80k)→ 读数时(06:04Z)729–800 条 / 1.44–1.56MB;该增幅不改任何环节量级。
66
+
67
+ ---
68
+
69
+ ## 二、结论链(六步,每步一个承重事实)
70
+
71
+ 1. **前提(设计事实)**:`meeting_loop` **等 pi 进程退出才继续** ⇒ 收尾段全额进用户等待;"进程退出前多活多久"直接等于墙钟。
72
+ 2. **09-12 决策 19**:AFT 语义搜索让每进程多活 **57s**(①)→ e2e17 33 唤 ≈ **22–25%** 墙钟 → 用 XDG 作用域配置关语义搜索(不动用户配置、主 pi 不受影响)。
73
+ 3. **09-13 决策 20 第一步(屏蔽 AFT、暂留 MC)**:插件在场的大 session 出现**分钟级尾巴**——生产收尾 **66–78%**(e2e21:11–12 唤进程总跨度 3676/3681/3709s,收尾 2769/2881/2437s)+ 探针 445.9s vs 0.5s(②)→ 屏蔽 AFT。
74
+ 4. **09-13 同日再改零扩展**:MC 的 historian 也在关键路径上(③ 的探针 + ④ 的 e2e21 风暴)→ `--no-extensions`(决策 20 最终形态);真场验证 636s/10.6m · 48.1s/唤 · 收尾 0%(⑤)。
75
+ 5. **09-14 根因修正 + 定默认 `mc-tools`**:historian 失败根因**至少含默认上限 32000**(reasoning 流吃光上限;主 pi 抬到 131072 后首跑成功——MC `context.db #916`:completed、输出 36954)⇒ 原结论限定为"**在该默认上限下不工作**";agents 侧未复测。同日用户裁定默认 `mc-tools`(理由是**能力**:`ctx_search` 补 fork 窗口覆盖;"允许而非要求"、缺谁少谁**可见降级**)→ 探针 + 生产(⑥)证明**成本有界**。
76
+ 6. **09-25 补第二入口 + 协议指引**:MCP adapter 并入默认档(恢复文件/git 之外的联网检索;边际 +0.2s/唤)+ 协议加「需要项目历史时」一节(**仅在工具有效时出现**);自然使用复测 0 次——但需求场景未出现(见 §三.2)。
77
+
78
+ **现状综合**:默认档固定成本 ≈ **1–2% 墙钟**(关键链口径),被移除的三笔(57s/唤、445.9s/次、435s/3 次)**高 2 个数量级** ⇒ 决策实质**不是"省 1%",而是把无上界成本换成有上界成本**(AFT 尾巴随自身存储增长;historian 随未处理历史量放大)。
79
+
80
+ ---
81
+
82
+ ## 三、「现在的默认扩展策略是否仍成立」判定
83
+
84
+ ### 3.1 成立(承重事实 = 构造 + A 类真场)
85
+
86
+ - **(A) AFT 被结构性排除**:唤醒命令 = 四个 `--no-*` + **仅两份 `-e` 白名单**;`--no-extensions` 只关发现、显式 `-e` 照常生效(pi --help)⇒ 连加载都不加载(与"配置写没写对"无关,但与**我们的命令组装正确**相关——none/mc-tools 两档已有形状测试,all 档形状测试见 §四③ 待办)。
87
+ - **(B) MC 侧不带 historian/压缩执行钩子**:现行 entry 只有工具注册 + 两个生命周期钩子(开/关 DB)。**注意措辞精确**:不是"不装任何 hook"(该句与现行 0.43.2 不符,属文档漂移);adapter 侧有 7 个钩子(含每轮执行),但实测边际 +0.2s/唤、尾 ≈0。
88
+ - **(C) 成本有界**:启动 0.6–0.9s/唤、收尾 ≈0;关键链 ≈7–15s/场 ≈0.5–2% 墙钟。
89
+ - **(D) 可观测**:登记行"声明 vs 生效"(含降级原因)+ 报告收尾列 + MC 自己 DB 账本 ⇒ 入口缺失/降级不静默。
90
+
91
+ ### 3.2 两条未了账(不阻塞默认档,但需入档)
92
+
93
+ 1. **agents 侧 historian@131072 未复测**——只对 `all` 档有意义(默认档结构上不跑 historian);**默认档不必等这个悬案**。
94
+ 2. **`ctx_search` utility 无有效样本**:e2e24 的 9 次全部由问卷诱导(0 次决定性帮助、1 例过期记忆);e2e25 自然 0 次;**本场也不构成有效样本**(主题所需事实全在 fork 窗口/仓库内——本场只有 6 次调用,全部用于查证探针数字的原始记录,均未命中,见 §六)。
95
+ ⇒ 回退判据须加**前置限定**:"需求场景可证在 fork 窗口之外"的场次才入账;否则会拿"需求不在窗口内"当负证据。
96
+
97
+ ### 3.3 已知盲区(写清比假装有探测器好)
98
+
99
+ **adapter 每轮钩子成本不可分**:其 5 个按事件触发的钩子(`input`/`tool_result`/`before_agent_start`/`session_tree`/`resources_discover`)成本落在 **LLM 主导的事件内段**(中位 50–55s/唤),现有列(启动段/尾列)分辨不出其变化。**兜底 = 两份 `-e` 独立降级/可独立移除**(怀疑 adapter 即去掉第二条)。2 臂探针(16–23s vs 4s)**验的是能力与卡死/收尾,不隔离钩子成本**。
100
+
101
+ ---
102
+
103
+ ## 四、建议动作清单(**建议/未落地**;本轮未改动任何文件)
104
+
105
+ ### ① 文档(权威 = `docs/design.md` 决策 20 + `AGENTS.md`)
106
+
107
+ 1. **MC 证据位与复述清理**:MC 结论改挂 A 类真场(e2e21 vs e2e23 + MC DB 账本 + 09-14 根因修正段);探针数字(447.2/10.3、445.9/0.5)在 decision 20 只留**一句"不作为证据"**(四要素:原始记录查无〔2026-09-27 审计:仓库/运行账本/记忆三处〕;账本无对应臂;与 B 臂〔仅 MC 收尾 0.5s〕方向相反;**可能归因混淆 = 假说**);**三处复述删**(`design.md:479-480`、`AGENTS.md:80`、`tests/test_meeting_loop.py:737-742` 三条 bullet → 结构句 + 指针);`design.md:508` 的 `historian 0/6` 换"结构句 + 真场计数(e2e24 0/3、e2e25 0)"。
108
+ 2. **`design.md:487` 的 12m31s** → 改可复核口径 **636s/10.6m**(或标 span 并注明"源不可复核");并落一行规则:**时间/成本数字带 span·测点·规模·n;增长量带时点;无源数字标"无源/不可复核"**。
109
+ 3. **结构句与重估触发按入口分写**:
110
+ - MC:工具 + 2 个生命周期钩子(开/关 DB);**检测覆盖面三面**(启动段/尾列/账本);
111
+ - adapter:7 个钩子(含每轮);**仅 init 被启动段覆盖、每轮钩子 = 已知盲区**;兜底 = 独立移除;
112
+ - 触发:**上游 MC/adapter 升版,或报告尾列出现分钟级离群 → 重核**(MC:`session_start`/`session_shutdown` 内是否新增工作;adapter:每轮钩子是否变重);
113
+ - 探针双向句:**2 臂探针 = 能力与卡死/收尾检查,不测钩子成本**。
114
+ 4. **语义清单 ③ 补语**:`生效 = 入口解析成功;命令形状由测试锁(none/mc-tools/all 各一)`(不新增编号项、不改字段名)。
115
+ 5. **回退判据(单行规则)**:自 **2026-09-25**(装置变更:加指引 + 第二份入口)起,连续两场"**需求场景可证在 fork 窗口外**"且 **utility≈0** → 提议回退 `none`(**需用户拍板**);**两入口分列计数**(`ctx_search` / MCP);写明"**能力取舍判据、不是性能开关**";数据来源 = 各场 result 元信息(不设计数器/监控)。
116
+ 6. **门槛条款补"加回 AFT 的定价程序"**(一句话,不另开节):任何加回 AFT 的提案须在**当前条件**下做 **1 次受控唤醒**(硬超时、用户当次同意)+ 收尾段实测 + 净收益账,**不得引用 09-13 单点**;兜底句:预期量级 ≈ **1.4–2.1h/场**加在关键链(拿到反证前按此否决)。
117
+ 7. **fork 源增幅 = 口径项、不是成本项**(一行,防把"文件在涨"读成"时间在涨")。
118
+
119
+ ### ② 注释(改的是代码文件,**不动行为**)
120
+
121
+ 8. `tests/test_meeting_loop.py:737-742` docstring 三条 bullet → **一行测试契约 + 指向 decision 20 的指针**(docstring 只写"本测试锁什么",不存放历史证据/设计理由)。
122
+ 9. `tests/test_main_paths.py:217` 死注释("`extensions: true` 走兼容路径"——该兼容路径已删,全仓仅此一句)**删**。
123
+
124
+ ### ③ 代码/测试待办(**不属本轮**,只记待办)
125
+
126
+ 10. **档位分派穷尽化**:`elif extension_policy == "all": pass` + `else: raise`(注释"值域增长时 fail-closed;当前守卫下不可达")+ **all 档形状测试**一行(命令既无 `--no-*` 也无 `-e`)。**不为不可达分支加测试**。
127
+ 11. (未来)报告按两个直标口径各打一行——**两个 span 必须各自命名**;属观测面契约变更,不在本轮。
128
+
129
+ ---
130
+
131
+ ## 五、争议数字与审计记录
132
+
133
+ - **447.2s vs 10.3s(43×)**:`design.md` 标"受控对照",与 `docs/test-methodology.md` #26(09-14)"那批数据……后来发现装置有缺陷;真正干净的证据只有生产真场与 MC 自己的 DB 账本"**互相矛盾**;三处查无原始记录;**两条算术旁证**(445.9/10.3=43.29、447.2/10.3=43.42;`435.5` + `≈10.3` ≈ `445.9`、两处"尾部 97%"同值)与**一条反证**(账本 B 臂"仅 MC"收尾 0.5s)⇒ "同一批记录被两种叙事分别引用、归因混淆"是**假说、不可裁决**。**处置:退出证据位、不追查**(追查成本 > 价值,结论不依赖它)。
134
+ - **445.9s vs 0.5s**:账本 A 458/B 7 总时长可对(收尾段口径),但 n=1 且提示词形态未记录 ⇒ **退出承重位(待考)**。
135
+ - **12m31s**:无源且与并行度 2.42 混用两个 span(1538/636=2.42 ✓ / 1538/751=2.05 ✗)⇒ 改 **636s/10.6m**(本报告 §一⑤ 已按此写)。
136
+ - **撤回/更正记录**(只改论据,不改结论):简单 4 处("三份值域判定=S1 同型"说 / "每唤醒 ×3 agent"成本账 / adapter"统一判据"措辞 / "收尾时"错误标签);效率 1 处("主会话 32.8MB vs 1.9MB ≈17×"的规模比较——agents 打开的是 fork 源,同量级);另有一处**措辞漂移**统一修正("entry 不装任何 hook"→ 有 `session_start`/`session_shutdown` 生命周期)。
137
+ - **出席**:效率 7 条分析消息 + freezing + pass;简单 16 条 + freezing + pass;铁律 6 条 + freezing + pass。**无缺席、无未表态者**;本报告不代表任何一方未表达过的立场。
138
+
139
+ ---
140
+
141
+ ## 六、本场运行元信息
142
+
143
+ | 项 | 值 | 来源 |
144
+ |---|---|---|
145
+ | 协议 | `mode=meeting`;`forkMode=budget`;`extensionPolicy=mc-tools`;配额 meeting=20 / rr=7 | `protocol.json` |
146
+ | 扩展策略登记行 | `声明=mc-tools 生效=mc-tools strict=0`(三 agent 一致) | loop 日志首唤 |
147
+ | fork 源(构建时) | 606 条 / 丢弃 53 / est≈80k(字符/3)/ 构建 521ms / 92MB 峰值(本视角 agent 的日志行;各 agent 构建耗时略有差异:317–525ms) | loop 日志 |
148
+ | 唤醒与跨度 | 效率 9 唤/1061s;简单 17 唤/972s;铁律 8 唤/621s(result 写作唤醒另计) | loop 日志 `elapsed_ms` |
149
+ | 墙钟(消息 commit 首末) | 13:48:22 → 14:08:27 ≈ **20m05s**(不含 result 写作) | 讨论仓 git log |
150
+ | 终止 | **consensus**(RR 全员 pass) | loop 日志 |
151
+ | 消息文件数 | 效率 10 / 简单 19 / 铁律 9(含 freezing、pass 与 loop 的 all-freezing 信号)⇒ 参与性表态:效率 9(7 消息+freezing+pass)/ 简单 18(16 消息+freezing+pass)/ 铁律 8(6 消息+freezing+pass) | 讨论仓 |
152
+ | **工具计数(边界之后,两入口分列)** | **效率:ctx_search 3 / MCP 0;简单:0 / 0;铁律:3 / 0** | 各 agent session 的 toolResult 记录(`meeting_fs.iter_after_boundary`) |
153
+ | **utility 抽看(一句)** | 6 次 ctx_search 全部服务于同一核查(探针数字的原始记录):**均未命中原始记录**(命中 historian 根因/阈值/方法论等记忆),无决定性帮助、未见陈旧知识注入 ⇒ **本场不构成有效效用样本**(所需事实在 fork 窗口/仓库内) | 结果摘要抽看 |
154
+ | 主仓改动 | **无**(`git status` 干净;本轮只读审计) | `git status` |
155
+
156
+ ---
157
+
158
+ *本报告为"意见轮"产物:§四动作均为**建议(未落地)**;争议数字的处置只涉及**文档表述**,默认扩展策略本身无需改动。*
@@ -39,6 +39,7 @@
39
39
  | `2026-09-25-multi-viewers-postfix-review.md` | 复验 0.8.0 的 extension 合并与 P1–P6(含 harness 覆盖审查) | **P1–P6 逐条到位、合并净简化**;新抓 **漏 A:`run_tests.sh --reuse` 的错误成功信号**(harness 失败仍算绿 → 命中旧绿 + exit 0,修法 ②′ 清指纹 + rc==0 才写回);D2 通知里的不实断言(pi-web 忽略 `setEditorText`);B1/B2 契约前缀与不可执行出路;7 类现存分支零覆盖 + sid 注入与 percent-encoding 两装置缺口;D1/D3 文档漂移;S1–S3 简化 | `69a415a`(+ `e92eacc` 第三交付出口) |
40
40
  | `2026-09-25-extension-mechanisms-review.md` | 复验 0.8.2 三处机制(报告落盘 / `--set-viewer` / 观看命令通道)+ 测试覆盖与断言强度 | **① 显示层失败会跳过清理**(BrokenPipe 逃逸 → rmtree 被跳过、目录残留;修法 `_print_best_effort` + rmtree 进 finally ⇒ 清理必达);**② `--set-viewer` 半成功**(校验在写之后 → rc≠0 但文件已写入;改 B′ 校验前移);③ 通道模型由「三出口」收敛为四通道角色表,并证实 custom_message 随 fork 进每场上下文;文档三处「不持久化」复述、断言偏弱、prompt 复述、fail-open 宽窄不对称 | `51a4535` |
41
41
  | `2026-09-25-patch-audit-review.md` | 审阅 0.8.0 → 0.9.0 一周改动是否有补丁堆叠 / 复杂度失配 / 职责边界问题 | **判定:没有补丁堆叠**;真问题是**文档漂移 F1**(两份入口降级语义改了、6 处复述没跟)、**名实不符 F2/S3**(`_viewer_set_errors` 自称唯一组合点+数量≥2,皆不成立)、**契约只有注释 F4**(cleanup 裸 print 禁令 → 本仓首条 AST 结构断言);顺带:自然使用复测 `ctx_search` 0 次(不可证伪那句指引)、MCP adapter 无收尾尾巴 | `6c024be` |
42
+ | `2026-09-27-aft-mc-evidence-audit.md` | 复盘「屏蔽 AFT」决策(对照数据 / 结论链 / 现默认扩展策略是否成立) | **判定:成立**(承重换成真场:AFT 收尾 66–78% vs ≈0%;MC historian e2e21 62 次/60 失败 vs e2e23 0 次 + 上游 `#916`)。**最重一条 = 审计自身证据链**:决策 20 把 09-13 那批**装置有缺陷**的探针数字当「受控对照」(#26 早已记录)→ 两笔退出证据位;另订正 entry 结构句(2 个生命周期钩子,非「无 hook」)、adapter 每轮钩子 = 已知盲区、e2e23 的 12m31s 标为源不可复核;新增**数字口径规则**与**回退判据**(带「需求场景在窗口外」前置限定)+ 加回 AFT 的定价程序 | `ffe28aa` |
42
43
 
43
44
  ## 环境口径(读报告时的背景)
44
45
 
package/meeting_fs.py CHANGED
@@ -883,8 +883,8 @@ def parse_log_nameonly(output):
883
883
  # DEFAULT_EXTENSION_POLICY 是**缺省填谁**(全仓引此常量)。
884
884
  # mc-tools : **默认**——只要 MC 的**只读检索工具**(ctx_search)。为什么默认它:
885
885
  # agents 需要主项目背景(背景蒸馏机制已移除),这是它的补充通道;
886
- # 该入口**只注册工具、不装 hook** → historian/压缩不在其中
887
- # (受控实测 historian 0/6、ctx_search 可用;成本未测得显著差异)。
886
+ # 该入口 = **工具注册 + 两个生命周期钩子**(开/关 DB),**无** historian/压缩执行钩子
887
+ # (真场计数 historian 0:e2e24 0/3、e2e25 0;ctx_search 可用;成本未测得显著差异)。
888
888
  # 代价:本档两份入口**允许而非要求**(缺谁少谁、都可见降级;严格模式见
889
889
  # MC_TOOLS_STRICT_ENV)
890
890
  # none : 零扩展——最快、**零依赖**(不依赖任何扩展;无 MC 的机器/CI 用这档)
package/meeting_loop.py CHANGED
@@ -317,7 +317,7 @@ def _build_wake_cmd(workdir, agent, sid, cfg, fork_source, fork_cwd,
317
317
  # 现在**只有一个出口**(本函数末尾),降级只是"少追加一个 -e"。
318
318
  #
319
319
  # 三档语义:mc-tools(默认)给 agents `ctx_search`(MC 的只读检索工具;
320
- # entry 只注册工具、不装 hook → 不带 historian/压缩);none 零扩展(零依赖);
320
+ # entry = 工具注册 + 两个生命周期钩子 → 不带 historian/压缩);none 零扩展(零依赖);
321
321
  # all 走 pi 默认发现(A/B 与显式 opt-in,须有净收益账)。
322
322
  no_ext = ["--no-extensions", "--no-skills", "--no-prompt-templates",
323
323
  "--no-themes"]
@@ -332,7 +332,7 @@ def _build_wake_cmd(workdir, agent, sid, cfg, fork_source, fork_cwd,
332
332
  elif extension_policy == "mc-tools":
333
333
  # mc-tools = 零扩展 + 显式加载**两份只读工具入口**(2026-09-25 用户裁定 B:
334
334
  # 并入默认档,不再新增档位——保持简单):
335
- # ① MC 的 subagent-entry(只注册工具、不装 hook)→ ctx_search
335
+ # ① MC 的 subagent-entry(工具注册 + 生命周期钩子,无 historian)→ ctx_search
336
336
  # ② MCP adapter(web_search / web_reader / zread 等 MCP 工具)
337
337
  # 为什么必须显式 -e:`--no-extensions` 关的是**发现**,显式路径照常生效
338
338
  # (pi --help 原文);MCP 工具此前因发现被关而对 agents 完全不可用。
@@ -360,7 +360,15 @@ def _build_wake_cmd(workdir, agent, sid, cfg, fork_source, fork_cwd,
360
360
  # 允许而非要求:缺入口 → 少一份 -e,但**可见**
361
361
  downgrade_reason = reason
362
362
  effective_policy = ("mc-tools" if resolved else "none")
363
- # "all":不加任何 --no-*(走 pi 默认发现)
363
+ elif extension_policy == "all":
364
+ # pi 默认发现:**不加**任何 --no-*、也不加 -e(A/B 与显式 opt-in)
365
+ pass
366
+ else:
367
+ # fail-closed:值域增长时这里响,而不是静默落进某个档(当前守卫下
368
+ # 不可达——上方 in-值域检查已拦;不留"最后一个分支兜住一切"的形状)。
369
+ raise RuntimeError(
370
+ f"扩展策略分派未穷尽: {extension_policy!r}"
371
+ f"(合法值: {'/'.join(meeting_fs.EXTENSION_POLICIES)})")
364
372
  if first_wake:
365
373
  # 登记行(观测面的稳定字段;报告据此给"声明 vs 生效")。只在首唤打:
366
374
  # 策略在一次运行内不变,变了也是配置错误(重跑即可)。
package/observability.py CHANGED
@@ -326,6 +326,31 @@ def build_report(base):
326
326
  f"{_dur(d['total_ms'] // 1000)} / 最大 "
327
327
  f"{_dur(d['max_ms'] // 1000)} | rc≠0 {d['fails']} 次")
328
328
 
329
+ # ---- 跨度口径(两个直标量各自命名 + 一个派生量)----
330
+ # 起因(2026-09-27 复盘审计):外部引用曾把两个 span 混算(Σ进程跨度 1538s ÷
331
+ # 墙钟 751s = 2.05,而按可核的 636s 得 2.42)——两个量都能"直标",但报告没给
332
+ # 它们各自的名字与定义。这里各占一行、名字即口径;派生量显式写出算式,
333
+ # 免得读者自行相除去猜。**缺席一律 n/a,不写 0**。
334
+ # 判"缺席"一律用 `is None`——**0 是合法值**(同一秒提交、极短唤醒),
335
+ # 用真值判断会把它当缺失(0 ≠ 缺席,与"缺席≠0"同一条纪律的两面)。
336
+ total_proc_ms = sum(d["total_ms"] for d in proc.values()) if proc else None
337
+ wall_s = (rows[-1][0] - rows[0][0]) if rows else None
338
+ out.append("跨度(两个直标量 + 一个派生量;各自命名、不可互替):")
339
+ out.append(" Σ进程跨度 "
340
+ + (f"{_dur(total_proc_ms // 1000)}" if total_proc_ms is not None else "n/a")
341
+ + "(各 agent 唤醒跨度相加;唤醒可并行 ⇒ 可能大于墙钟)")
342
+ out.append(" 墙钟跨度 "
343
+ + (f"{_dur(wall_s)}" if wall_s is not None else "n/a")
344
+ + "(首末 commit 差 = 用户等待)")
345
+ # 派生量的定义**永远打出来**(n/a 时也打)——名字即口径,读者不必猜算式
346
+ if wall_s is None or total_proc_ms is None:
347
+ out.append(" 并行度 n/a(= Σ进程跨度 ÷ 墙钟跨度;缺任一被除数)")
348
+ elif wall_s == 0:
349
+ out.append(" 并行度 n/a(= Σ进程跨度 ÷ 墙钟跨度;墙钟跨度为 0s,无法相除)")
350
+ else:
351
+ out.append(f" 并行度 {total_proc_ms / 1000 / wall_s:.2f}"
352
+ f"(= Σ进程跨度 ÷ 墙钟跨度;>1 = 唤醒有重叠)")
353
+
329
354
  # ---- LLM 运行事实(session 文档化字段;流式预过滤,不整文件解析) ----
330
355
  # ---- 扩展策略(声明 vs 生效)----
331
356
  _report_extension_line(base, out)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-multi-viewers",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "description": "Multi-perspective analysis for Pi: fork the main session into N perspective agents over the meeting protocol.",
5
5
  "type": "module",
6
6
  "private": false,