N1a 子窗口完成报告:骨架 + 数据层(窗口 N · 1/5)

窗口:N-a(execution-plan §六.十八 1-3)|日期:2026-08-19 依据:demo-redesign-design v0.3(§1.3/§4/§5/§6/§7/§10)+ demo-n-window-ledger §2.1/§3(冻结验收清单)+ handoff-design-hub §六.7(推送纪律) 验收方式:demo 设计中枢独立验收(不轻信自检:实跑 + 数字独立重算 + git 检查)


1. 交付总览

内容
新目录 demo/(app.py / theme.css / components.py / data_index.py / pages×4 / data×9 / scripts×2)
修改文件 pyproject.toml(ui extra 锁 <2;新增 demo extra;ruff exclude demo/data)
零改动 src/tests/ui/(git diff 确认)
数据层 demo/data/ 9 个文件,全部带 provenance,全库无 Windows 绝对路径
提交 单 commit,只含上述文件(推送纪律 §六.7)

2. execution-plan §六.十八 打勾

3. 台账 §3 冻结验收清单逐项核对

# 验收项 结果 证据
1 结构齐全 + ui/ 零改动 demo/ 树见 §4;git statusM pyproject.toml + ?? demo/
2 pyproject 落 streamlit>=1.31,<2 pyproject.toml:31-34(ui + demo 两 extra)
3 提炼脚本可运行 → provenance + 无绝对路径 + 63.7 基准副本 python demo/scripts/export_demo_data.py exit 0;verify §5.4 扫描无命中;windowL_10X_B_expected.json provenance.source=windowL_10X_B_expected.json
4 数字核对(独立重算) python demo/scripts/verify_demo_data.py 全 [OK],核对表见 §5
5 可启动:四页路由 + 启动校验中文提示不崩溃 AppTest 四页切换无异常;缺 manifest/指纹不匹配两场景均中文提示(含 export_demo_data.py)不崩溃;服务器 HTTP 200;截图确认单组导航 + 深色主题 + 无 Deploy
6 pytest 全绿 + golden 0 差异 + 推送纪律 pytest 269 passed;bio-audit golden --json diffs=[];push 前四查见 §8
7 skill 应用:design-taste-frontend + code-review 双轴 设计语言见 §6.1;双轴审查闭环见 §7(报告落盘本节)
8 N1a 报告 + execution-plan 打勾 本文件;execution-plan §六.十八 N-a 1-3 已勾

4. 交付文件清单

demo/
├── app.py                      # 入口:主题注入 + 启动数据校验 + 侧边栏导航 + 条件渲染
├── theme.css                   # 深色审计台(§4 token;data-testid 注入;隐藏自动导航/Deploy)
├── components.py               # Cascader/GroupSelect/Multi-select/SplitButton 骨架签名(N-b 实现)
├── data_index.py               # demo/data 索引 + verify_data_ready 启动校验
├── pages/                      # 四页空壳(render() + 标题占位 + N-b~N-d 填充注释)
│   ├── 01_workshop.py          # 审计工坊(N-b)
│   ├── 02_capture.py           # 采集演示(N-c)
│   ├── 03_benchmark.py         # 评测与奖励(N-d)
│   └── 04_about.py             # 关于(N-d)
├── scripts/
│   ├── export_demo_data.py     # 提炼脚本(cellvoyager-outputs → demo/data/,provenance 化)
│   └── verify_demo_data.py     # 独立数字核对脚本(源重读 vs 摘要比对)
└── data/                       # 提炼摘要(export 生成;运行时唯一数据源)
    ├── manifest.json           # 指纹 + 来源登记(启动校验依据)
    ├── golden_summary.json     # 黄金对照 ×5(windowI A/B/C + windowL 10X A/B_expected)
    ├── eval_summary.json       # 真实评测 ×2(G 30.0 K1 重评 / Lb 30.0)
    ├── benchmark_summary.json  # benchmark 摘要(recall/precision/F1/gap/IRR κ)
    ├── r0_summary.json         # R0 锚定(ρ=0.9747)
    ├── trajectories_index.json # 20 条轨迹索引(golden 基线分数)
    ├── verdicts_10X_B.jsonl    # M1 声明重建输入(N-c)
    ├── golden_agent_10X_B_executed.py  # M3 解析输入(N-c,sanitize 后副本)
    └── windowL_10X_B_expected.json    # 63.7 断言基准(N-c,provenance 保留 source)

5. 数字核对表(独立重算:verify_demo_data.py 从源报告重读 vs demo/data)

口径 设计 §1.3 钉死值 demo/data 摘要 源报告重读 一致
黄金 A(Smart-seq2,I) 80.0 · pass 80.0 · pass(10 决策) windowI_A.json audit
黄金 B(Smart-seq2,I;J 后重评) 63.0 → 69.0 · needs_correction 69.0 · needs_correction(原始 63.0·blocked 并存) windowI_B.json = 63.0·blocked;J1 报告锚点 69.0·needs_correction
黄金 C(Smart-seq2,I) 66.7 · needs_correction(仅限 Smart-seq2-C 口径) 66.7 · needs_correction(10 决策) windowI_C.json audit
黄金 A(10X,L) 80.0 · pass(11 决策含双联体) 80.0 · pass(11 决策) windowL_10X_A.json audit
黄金 B(10X,expected_types 后) 63.7 · blocked(仅限 10X-B expected 口径) 63.7 · blocked(11 决策) windowL_10X_B_expected.json audit
CellVoyager 真实评测(G,K 后重评) 30.0 · needs_correction(L1×19/L3×1) 30.0 · L1×19/L3×1(K1 重评)+ 注 G-2 版 L1×7/L3×1/L-1×12 windowK1_reeval.json level_counts
CellVoyager 短评测(L-b) 30.0 · needs_correction(L1×4/L2×1) 30.0 · L1×4/L2×1(5 决策) windowLb_analysis.json audit
demo 轨迹 20 条 85.0×6 / 60.0·pass / 29.0 等 索引 20 条,85.0×6、scrna_edge_singleanno 60.0·pass、scrna_melanoma_cellvoyager 29.0·blocked golden 基线(tests/golden)逐条比对 + 抽查 3 条
benchmark recall 0.820 / precision 0.7455 / F1 0.7810 / gap +0.046(M 后 0.0449 注明) 0.82 / 0.7455 / 0.7810 / 0.046 + delta_after_m 0.0449 benchmark_run_baseline.json aggregate/gap(utf-8-sig)
IRR κ=0.8336(出处 F1 报告) κ=0.8336 / α=0.8335 / 623 决策 / 93.58% F1 报告锚点正则解析(”全量 60 合并 IRR κ=”)
R0 ρ=0.9747(scrna_r0.json K/M 后版本) key_metric 含 0.9747 · PASS scrna_r0.json

口径分列注释(防混写):golden_summary.json 条目 note 字段——63.7 条目标注 “仅限 10X-B expected 口径(静默跳过双联体被补入),禁止与 66.7 混写”;66.7 条目 标注”仅限 Smart-seq2-C 口径(QC 硬阈值),禁止与 63.7 混写”;eval_summary 标注 “29/30 双口径页内注释见 N-b(demo-redesign-design §3.2)”。

5.1 N-d 增补(2026-08-19 · demo/data 增补提炼,台账 §12.1 精神)

窗口 N-d 经 export 脚本重提炼增补(未手改数据文件;重跑后 exported_at 更新、 其余数值零变化,verify 11 节全 [OK]):

增补项 内容 出处(提炼锚点) 一致
eval_summary 成本 cellvoyager_g ¥2.55(平台余额差权威口径)/ cellvoyager_lb ¥0.43(同上) agent-eval-report.md §2(总花费 ¥2.55)+ L1 报告 §7.2(余额差 ¥0.43)
reward_summary.json(新文件) 映射 {4:1.00,3:0.85,2:0.60,1:0.30,0:0.00} + L-1 mask 语义 + 聚合 mean/γ=0.30 + spike-in 三范式(scrna 0.85→0.2354 drop 0.6146 / deg 0.85→0.2125 drop 0.6375 / pan 0.85→0.2400 drop 0.6100)+ status experimental_uncalibrated reward-mapping.md §2/§3/§5/§6 逐行锚点 + E4 报告 §三.9 + reward-protocol §七.2
engineering_summary.json(新文件) n_tests=274(pytest –collect-only -q 实测)+ CI 双矩阵 + golden 0 差异口径 pytest 实收集(与 N-c 验收 274 passed 一致)+ ci.yml + golden 基线
data_index.REQUIRED_FILES +2 文件(reward/engineering) manifest 指纹自检通过

demo/data 由 9 → 11 个摘要/副本文件(含新增 2 个);N-d 页面全部数字读 demo/data 提炼摘要,页面零硬编码(数字核对表见 N1d 报告 §数字核对表)。

6. 关键实现说明

6.1 设计语言(design-taste-frontend 执行记录)

6.2 导航与条件渲染(1.31 兼容)

6.3 数据层(provenance 化)

6.4 provenance 字段示例(windowL_10X_B_expected.json 提炼副本)

{
  "provenance": {
    "source": "windowL_10X_B_expected.json",
    "source_sha256": "87b3f0ca65f0b8c14117aa84609ee21b677ed768139b85d6398cf7eec69f8dba",
    "generated_at": "2026-08-16T23:05:11",
    "exported_at": "2026-08-19T12:31:24+00:00",
    "note": "63.7 断言基准提炼副本(demo-redesign-design §6;N-c 断言读本副本)"
  }
}

7. 双轴代码审查(code-review skill,两轴独立子代理并行)

审查员 A(Standards 轴,构建质量)与审查员 B(Spec 轴,是否做了该做的) 独立运行、分开展示、不合并裁决;意见闭环如下(采纳/驳回逐条记录)。

7.1 Standards 轴 findings 与闭环

# 严重度 finding 闭环决议
S1 建议-高 设计文档悬空引用:demo docstring 引用的 docs/specs/2026-08-16-demo-redesign-design.md 不在仓库内 驳回(与仓库惯例一致):src/ 的 regression.py、ontology/init.py、capture/models.py 等均以 docs/specs/*.md 引用外部审计内存文档(site-design §1.2 明示外部文档不进 Pages 不动路径);docstring 引用是既有模式
S2 建议-中 benchmark 摘要 n_decisions=623 / agreement=0.9358 硬编码无防漂移锚点 采纳:export 改为从 F1 报告正则解析(”全量 60 合并…(623 决策,一致率 93.58%)”)+ 锚点断言;verify 同步核对
S3 建议-中 sanitize 内容破坏:expected_types.config 引用身份被抹;executed.py 副本不可执行;错误消息被吞截 采纳:config 改为包内相对引用 src/bioaudit/data/expected_types.yaml(保留身份);executed 副本 manifest 注明”解析专用副本(M3 输入,不执行)”;正则收紧为 ≥2 级反斜杠路径——failed:\n 不再误判(L222 错误消息完好)
S4 建议-中 verify 未核对变换最大的两个 N-c 副本(verdicts jsonl / executed.py) 采纳:verify 增补逐字节/逐行与源比对(verdicts 25 行语义一致;executed == 源剥离后逐字节一致;占位符 1 处)
S5 建议-低-中 verify 是”独立重读”而非”独立重算”,与 export 共享锚点;缺源时裸 FileNotFoundError 部分采纳:docstring 措辞改”独立重读核对”并说明护栏语义;补 src.exists() 显式报错(exit 2)
S6 建议-低 _WIN_PATH 盲区(正斜杠/UNC)+ 护栏共用同一正则”自己验证自己” 部分采纳:正则升级覆盖 UNC;正斜杠形态刻意不支持——https://s:// 与盘符正斜杠无法区分(实测曾误毁 PubMed URL,已回滚;源产物实测无正斜杠路径形态,留档 §9)
S7 建议-低 输出非确定性(exported_at 每次变化 → git 噪声) 驳回(provenance 语义):exported_at 时间戳是台账要求的 provenance 字段(source/sha256/generated_at/exported_at);重复导出产生新时间戳是预期行为,manifest 同步更新;N 窗口只导出一次
S8 吹毛求疵 _report_anchor 死代码;Counter 函数内导入;app.py next() 无默认值 + main() 无 guard;data_index manifest 损坏裸崩/缺指纹静默放行;pyproject 注释误导;双份清单漂移;f-string 无插值;eval level 键类型不一致;verify 跳过 windowI_B 决策数;groups_for_paradigm(None) 未文档化;精度断言不一致 全部采纳:逐一修复(删死代码 / 顶部导入 / next 默认值 + __main__ guard / manifest JSONDecodeError 容错 + 缺 sha256 报问题 / 注释修正 / OUT_FILES 与 REQUIRED_FILES 共享单一事实源 / 去 f 前缀 / level 键统一字符串 / 补决策数核对 / docstring 补未选态语义 / 统一 1e-9)

7.2 Spec 轴 findings 与闭环

# 严重度 finding 闭环决议
A1 建议 台账 §3.7 冻结项:code-review 双轴审查报告未闭环落盘 采纳:本节(7.1/7.2/7.3)即闭环记录,报告随本次提交落盘
B1 建议 export 的 manifest 来源登记为死代码(capture 键无扩展名 vs files 键有扩展名,永不命中) 采纳:capture 返回键改为文件名;manifest 实测含 N-c 三副本的 source/source_sha256
B2 建议 报告 commit/push 表述超前 + CI 云上绿未验证 采纳:push 后按三查复核 + 记录 CI 云上绿(见 §8)
B3 建议 export/verify 脚本含 DEFAULT_SOURCES 绝对路径,台账 §3.3”全库”字面不满足 驳回(口径说明):台账”全库 grep 无 Windows 绝对路径”指提炼产物(demo/data,扫描 NONE);脚本默认源路径是 dev 工具输入参数(–sources 可覆盖、docstring 明示),非数据内容
C1 吹毛求疵 pages 引用的 .ba-page-title/.ba-page-sub 未在 theme.css 定义(空挂类名) 采纳:theme.css 补定义(标题/副标题排版)
C2 吹毛求疵 报告 §6.4 provenance 示例时间戳过期 采纳:刷新为最新导出值(2026-08-19T12:31:24+00:00)
C3 吹毛求疵 台账 §1 状态表仍标 N-a ⏳ 未开工 转交:台账状态由 demo 设计中枢验收后更新(职责归中枢,不属执行窗口)
C4 吹毛求疵 清单外附加文件 pages/init.py 与 verify_demo_data.py 说明:均已列入报告 §4 交付清单;pages/init.py 为 importlib 包导入所需,verify_demo_data.py 为独立核对工具

7.3 闭环后最终验证

8. 工程纪律核对

8.1 CI 云上结果

9. 遗留与说明(给后续子窗口)

  1. 冷启动耗时:N-a 实测——AppTest 全流程(含 import bioaudit + 规则加载) 单次 run ~1-2s 内完成,streamlit run 冷启动含服务器启动 ~5s;满足设计 §3.2 冷启动 ≤10s 预算,加载态按台账 §5 待 N-e 收口实测记录。
  2. components.py 为签名骨架(N-b 实现):Cascader 三级联动 / Multi-select ≤3 / Split Button;占位方法显式 NotImplementedError,不允许静默占位混入。
  3. CI streamlit 依赖:N-c 的 test_demo_smoke 上 CI 前需同步 CI 依赖 (台账 §2.2:CI 不装 streamlit;demo extra 已就绪)。
  4. 69.0 重评分:源 windowI_B.json 现值为 63.0·blocked(I 窗口实测), 69.0·needs_correction 为 J 窗口重评(J1 报告,K1 复核不变)——摘要中 双值并存 + provenance note 说明,防第三套数字。
  5. G 评测 30.0 双版本:G-2 版(L1×7/L3×1/L-1×12,ruleset 1.2.0)与 K1 版 (L1×19/L3×1,ruleset 1.5.0)同分;摘要以 K1 后重评为准并注明差异(台账 §2.1 口径)。
  6. 正斜杠盘符形态不支持_WIN_PATH 刻意不匹配 C:/dir 形态——https://s:// 与正斜杠盘符无法用正则区分(实测曾误毁 PubMed URL 后回滚); 源产物实测无反斜杠以外形态(N1a 验证 §8 扫描 NONE)。若未来源数据出现 正斜杠盘符路径,需改用结构化解法(白名单字段剥离)而非扩展正则。
  7. executed.py 副本为解析专用:仅 1 处占位符(--rscript 默认值), 副本不执行(N-c 仅 M3Parser.parse_code 正则解析);manifest 已注明。
  8. execution-plan 打勾:§六.十八 N-a 1-3 已勾(仓库外文档 D:\C-file\docs\specs\2026-08-13-execution-plan-v1.md,不随本仓库 push)。
  9. 台账状态表(demo-n-window-ledger.md §1):N-a ⏳ → ✅ 由 demo 设计 中枢验收后更新(验收记录归中枢职责)。