Skip to content

v2.1.5 · 做交付案例时发现:「长难句剥离」从来没渲染过

Choose a tag to compare

@shenquan520 shenquan520 released this 26 Sep 15:16
· 19 commits to main since this release

v2.1.5(2026-09-26)

这一版起因很轻:做一份完整的交付案例给人看。 过程里撞出三处缺陷,全是同一类 ——
文档承诺的东西,实现里没有。这已经是这个病灶第三次出现。


一、README 承诺的「长难句剥离」,从来没进过页面

README 写着每份交付都含「篇章结构、每段段旨、逐题解析、长难句剥离、命题点预埋」。

SKILL.md 提到长难句 6 处,给了方法(「挑 2-4 句,去修饰留主干」),
还专门规定了位置:归入该题解析的「推理」段,不单开一节 ——
理由是「单开会把它和题目割开,使用者看不出『这句难在哪、为什么导致选错』」。

模板也声明 summary.stuck_sentences 是「渲染」。

但渲染器里 stuck_sentences 一次都没出现。 写了也进不了页面。

→ 已实现,两个位置都收(题内 + 全文层,两边各有来路)。


二、markdown 被当成字面字符显示

渲染器有 _inline()(**粗体** → <b>、`代码` → <code>),
但它只用在卡原文上;作者自己写的字段全走 esc() —— 于是页面上出现字面星号。

实测上一轮外部工具那份交付里有 38 个字面 **。不是它写错,是渲染器不解析。

判据改清楚:

字段性质 处理
作者/agent 写的文本(依据/干扰项死因/缺口/可迁移/复盘/本题运用/使用者思路…) _inline(作者会写 markdown 排版)
引用材料的字段(选项字母、答案、段落原文) 保持 esc(材料不该被当 markdown 解析)

按此改了 17 处。顺带两处健壮性:_inline 加 re.S(卡里有跨行加粗)、
连续 3 个以上星号归一到 2 个(库里有实例)。


三、date / question_type 同样声明了「渲染」却没实现

抬头只显示标题和来源。→ 现在多一行「日期 · 题型」。


四、机制:门禁 11 补判据

三处缺陷共用一个盲区:门禁 11 只查「有没有声明」,
不查声明得对不对(它的说明里当时就写明了「不判断声明得对不对,那要人看」)。

但 user_wrong_choice/dual_channel(上一版)、stuck_sentences(这一版)连着两轮 ——
按本项目纪律,复发第二次就该进机制。

新判据:声明为「渲染」的字段,必须在渲染器源码里出现。

  • 当场抓出 2 个真实案例(date / question_type)—— 证明它不是空转的
  • 配自测夹具;夹具当场抓出判据自身的 bug(通配键 group.* 被 rstrip 成 group 后误报)→ 已修
  • 为什么安全:叶子名是唯一标识;声明「不渲染」的跳过;通配键跳过

附:交付案例

dist/analysis/analysis-result-note-taking-20260926.json(+ 渲染出的 89 KB HTML)。
研究类议论文(手写笔记 vs 打字),4 题,含两条真实错因自述。

它同时是本版的端到端验证物:元素级核过自述块 2 / 双通道 1 / 长难句 1 / 反模式条幅 2 /
段旨 4 / 缺口 4 / 可迁移 4,markdown 字面残留 0。


我自己犯的两个错(都记档)

  1. 又用 heredoc 写含 \n 的代码 → \n 变成字面 /n,渲染器语法坏掉。
    这条纪律 09-25 就立过(「往文件里写含转义符的代码:用编辑器,别用 heredoc」)——复发。
  2. 替换时丢了个右括号 → 语法坏。因为有备份,回滚重做只花十几秒。
    回滚能力让错误变便宜。

Full Changelog: v2.1.4...v2.1.5