|
230 | 230 | > - 🔴 **口径更正(R11.3 的落点归属,勿混用)**:环境层第 ③ 件「**未确认段落墨度极缓慢起伏(幅度 2%)**」的**落点不是 `ink-4`**,而是 `lowConfidenceClass()` + 类名 `ed-text--low-confidence`(落点 `app/src/components/structuredBlocks.ts`,消费者见下)—— `ink-4` 与它**没有实现关系**。⚠️ **兑现度如实登记**:该件的**生产调用点终态 = 1 处**(`components/session-detail/SessionRawView.tsx:137`),而 **R12.4 要求 ≥2 ⇒ 差 1**(T25 / T27 均未补第 2 处;`views/session/SessionTriTrackView.tsx` 只剩 5 行余量)⇒ 本批**只登记、不补**(这是 R12.4 设计来抓的东西,**不许**用 T13 的 CSS seam 充数)。 |
231 | 231 | > - **环境层四件的逐件兑现度**(R11.3 逐字「不得把『落 seam 但 0 调用点』算作已交付」):① 探针摆动 = `Loading.css` 的 `.ed-probe`(**既有**,批 6 只对齐名单)· ② 采集脉冲 = seam 就绪、**承载面未落**(`LiveBar` 用波形条阵列,未做脉冲节拍)· ③ 未确认段落墨度起伏 = **1 处调用点(要求 ≥2,差 1)** · ④ 到期刻度微光 = 落在 `DueScale` 的静态形态上(**未做循环微光**)。🔴 另:「**丰富**」档只兑现了**频率**提高,**幅度上限未动**(真正依据 = 本规格 §8.6.1 第 1 条逐字「环境层**幅度上限不动**」,**不是**「CSS 无原语」——逐档 keyframes 是可行的)。 |
232 | 232 |
|
| 233 | +> **🔻 批 7 收口就地加注 · 「审校模式」的**规格定义**(C9.18;2026-09-13,**上面原文与批 4 / 批 6 加注一字未改**)—— 🔴 **本节只定义,不实现**:** |
| 234 | +> - 🔴 **状态逐字:未实现。** 本节补的是**条件 ③ 的前置定义**(「进入审校模式」到底指什么);**批 7 不写一行实现代码**。⇒ 登记为**批 8 输入**(§11-7 与批 8 的输入清单里**按名登记**)。 |
| 235 | +> - **① 入口(哪个面、怎么进)**:**阅读面(`notes` 对象)的全局开关**,载体 = `App` 壳上的一个**模式位**(`<html>` 上的 `data-proofread="on"`)+ 一个可发现的入口按钮(`⌘/Ctrl+Shift+R`,与既有 `⌘K` / `Esc` 同族的键盘纪律)。**不进**视图注册表(它不是第四种「视图」,而是**所有视图共同的面**)⇒ 与 §7.2 的视图计数**无关**。 |
| 236 | +> - **② 作用域**:**当前阅读面的全部文本节点**(含 `NotesReadingColumn` 的每一种视图、卡片流行、印样正文;**不含**编辑器(`RichEditorView`)与弹层外的外壳 —— 编辑态已有自己的墨度语义)。作用域**随焦点走**而不是随路由走:切到别的对象 ⇒ 模式**保持**(它是「我此刻在审读」的用户意图),但**只影响当前挂载的阅读面**。 |
| 237 | +> - **③ 退出**:三条**等价**出口(都必须能出):**再按同一个快捷键** · **点同一个入口按钮** · **`Esc`**(同 `Modal` 的退出纪律);退出后墨度**立即**回到未进入前的档位(不得留任何中间态)。 |
| 238 | +> - **④ `data-*` 形态(照 `data-motion` / `data-tone` 的范式)**:模式位写在 **`<html>` 根元素**上、**不是**类名(与 §8.3 的「载体逐字 = `data-*` 属性,禁止用类名区分」同一条纪律)—— |
| 239 | +> · 属性名 **`data-proofread`**,取值 **`"on" | "off"`**(缺省 = `off`,且**不落属性**——与 `data-motion` 的缺省形态一致); |
| 240 | +> · 墨度侧**不新增 token**:审校模式是**档位覆盖**(条件 ③ 逐字「全部升到 ≥4.5:1」),不是第五档墨度。 |
| 241 | +> - **⑤ 实现层(一次覆盖,不改调用点)**:**纯 CSS 一层**完成 —— `html[data-proofread="on"]` 下把 `--ed-ink-4` 的值**指向 `--ed-ink-3`**(`ui/tokens.css` 的变量覆盖;`.ed-text--ink-4` 的规则一个字不用改)⇒ 「全部升到 ≥4.5:1」由**变量重绑**一次兑现,调用点零改动、零逐处判断。 |
| 242 | +> - **⑥ 今日实测(本节的两条读数)**:`tone="ink-4"` 的**生产调用点 = 0 处 / 0 文件**(**正控** `tone="ink-3"` = **201 处 / 94 文件** ⇒ 非「假 0」;**负控** `zzz_no_such_symbol_zzz` = 0);`ink-4` 的**任意形态**(含类型联合 / token 定义 / 对比度判据 / 注释)在生产侧 = **5 处 / 4 文件**,**全部**是「`ink-4` 是过渡态、不得承载唯一关键信息」这类**禁止性**表述或定义,**没有一处是把 `ink-4` 用在元素上**。仪器:`.superpowers/sdd/2026-09-12-frontend-redesign-batch7-unwired/tmp/t20/probe-spec-readings.mjs`(只读;口径 = `app/src/**` 的 `.ts`/`.tsx`,PROD 排除 `*.test.*`)。 |
| 243 | +> - 🔴 **不得合并结案**:条件 ③ 是**环境层第 ③ 件之外的另一件事** —— 不能用「做了 `lowConfidenceClass`(未确认段落墨度起伏)」宣称本条已兑现(原文 §4.3 批 6 加注已逐字记载:`ink-4` 与它**没有实现关系**)。批 7 对 `lowConfidenceClass` 的加宽(生产调用点 1 → 2)**不改变**本条状态:**仍是未实现**。 |
| 244 | +
|
233 | 245 | ### 4.4 剪报底纹的防御性规则 |
234 | 246 |
|
235 | 247 | 底纹依赖「这段文字来自哪一路」。**没有来源标记 → 按「无标记」渲染,绝不猜、绝不默认成某一通道**;用户手写/改写的段落永远不标底纹。否则会出现「用户手写的句子被标成来自屏幕 OCR」这种事实性错误 —— 而这条底纹的全部价值就在于它**可信**。 |
|
521 | 533 |
|
522 | 534 | --- |
523 | 535 |
|
| 536 | +### 7.4 笔记「带证据三轨」—— 批 7 规格章(🔴 **本批只交规格,实现未做**) |
| 537 | + |
| 538 | +> **出处与状态(这一行是本章的定位,别跳读)**:`docs/versions/v0.22.md:561` 逐字「**笔记「带证据三轨」→ 批 7(必须先写规格)**」,判否依据 = 批 5 `task-13-report.md` **§④**(B7-1…B7-9)+ **§②**(探针读数)。🔴 **本批只交规格,实现未做** —— 本章是**批 8 的输入契约**,不是交付证明;🔴 **全仓 `NoteEvidenceTrack*` = 0 命中**(本批独立复测:`app/src/**` 的 `.ts`/`.tsx` **PROD 0 处 / 0 文件 · TEST 0 处 / 0 文件**;仪器 `.superpowers/sdd/2026-09-12-frontend-redesign-batch7-unwired/tmp/t20/probe-spec-readings.mjs`,负控 `zzz_no_such_symbol_zzz` = 0)⇒ **不存在「第三种笔记视图已经交付」这回事**,本章也**不得**被读成它。 |
| 539 | +
|
| 540 | +#### §A 三条验收口径的改写(E1 / E2 / E3 —— 模型 / 视图层的全部判据面) |
| 541 | + |
| 542 | +| # | 旧口径(今日规格原文) | 🔴 改写成 | 为什么必须改(类型上不可能满足旧口径) | |
| 543 | +|---|---|---|---| |
| 544 | +| **E1** | 「**每段**有 `data-evidence-for`」 | 「**每段**都有 `data-evidence-for`(**含无锚点段**)∧ **只有带锚点段**才渲染证据列」 | 无锚点段落客观存在(§C 的四类)⇒ 旧口径把「无锚点」与「缺陷」混为一谈;新口径把**无锚点本身**变成一等状态(有锚点无证据列 = 缺陷;无锚点无证据列 = 正常) | |
| 545 | +| **E2** | 「`data-evidence-id` 与关联 id **逐字一致**」 | 🔴 **降级为 ms 最近邻**,且必须显式给出三件事:**① 容差**(\|锚点 ms − 候选 ms\| ≤ 容差才算命中;容差值由实现批定,**必须写进判据而非注释**)**② tie-break**(多个候选同 ms 或同距离 ⇒ 取**确定序**:`start_ms` 升序 → 同值取 `id` 升序;**不得**依赖数组顺序)**③ 失配的显式标记**(容差内无候选 ⇒ 出**显式「无证据」标记**,**不许静默取最近的一个**) | 段首锚点只带 `ms`(`[[ts:63000]]`),而证据本体是 `session_segments.id` / `session_ocr_blocks.id`(`artifact.rs:62-69`)⇒ **`ms` 在类型上无法与 `id` 逐字一致**;旧口径是一条**永远不可能满足**的断言 | |
| 546 | +| **E3** | 「派生段落数」当分母 | 🔴 **两个分母并列、不许混用**:**分母甲 = 派生段落总数**(渲染器实际产出的段落节点数)· **分母乙 = 带锚点段落数**(其中含 `[[ts:ms]]` 锚点者)。⇒ 报告与判据**必须分别给出两个比值**(「有锚点的覆盖率」用分母乙;「全篇覆盖率」用分母甲),🔴 **禁止**只报一个数就称「覆盖率」 | 分母只有一个时,无锚点段落会被算成「未覆盖」⇒ 读数**结构性偏低**,而真实缺陷面(有锚点却无证据列)会被稀释 | |
| 547 | + |
| 548 | +#### §B 无锚点四类 + 各一份 fixture(**关闭开关的用例必须有**) |
| 549 | + |
| 550 | +| # | 类 | 出处(发射路径) | fixture 必须断言什么 | |
| 551 | +|---|---|---|---| |
| 552 | +| 1 | **`OcrDirect`**(图文会话) | `note_filter_render.rs:85`(走 `note_filter_ocr::rebuild_ocr_markdown`;该文件里 `format_timestamp` 调用点 = **0 处**) | 段落**全部无锚点** ⇒ 每段仍有 `data-evidence-for`、**0 个证据列**、**0 个「无证据」告警**(无锚点 ≠ 异常) | |
| 553 | +| 2 | **`Web`**(网页正文) | `note_body_source.rs:24-27`(`BodySource::Web` 是 `#[allow(dead_code)]` 预留变体,正文直取 `web_session_pages.markdown`) | 同上;**且**这条 fixture 是「未接线变体」的**唯一**覆盖面(它今天没有生产发射路径) | |
| 554 | +| 3 | **手动笔记** | **无发射路径**(用户手写/改写) | 段落无锚点 ⇒ 同 1;**另断言**:用户编辑**不得**被自动补锚点(§4.4 的「绝不猜」同源纪律) | |
| 555 | +| 4 | 🔴 **`anchor_timestamps=false`**(**关闭开关的用例必须有**) | `purify_config.rs:66,96`(**默认 `true`**);金测试 `note_filter_golden_tests.rs:125-127` 已逐字钉住「关闭后无锚点」 | **同一份输入**在开关 `true` / `false` 两态下各跑一次:`true` ⇒ 有锚点段 > 0 且证据列只在那些段上;`false` ⇒ **锚点 0 个**、证据列 0 个、`data-evidence-for` 仍逐段在。🔴 **只测默认配置 = 假绿**(会让实现退化成「只在默认配置下绿」) | |
| 556 | + |
| 557 | +#### §C 契约:精修前后两态(「精修后段落锚点丢失」是**有意**,不是 bug) |
| 558 | + |
| 559 | +- **事实**:`anchor_strip.rs:8-16` **主动剥离**段落锚点;消费点 = `ai_refine_task.rs:155` · `commands_ai_refine/workbench.rs:81` · `commands_ai_refine/session.rs:57`;剥离后**只回挂章节锚点**(`ai_refine_protocol.rs:46`)。 |
| 560 | +- 🔴 **写成契约(本节的交付物)**:**精修产物的段落级锚点不保证存在**;精修**输入**路径上「段落锚点消失」是**设计行为**(防止模型把 in-band 锚点当正文改写/编造)。⇒ 带证据三轨在**精修后**的段落上必须走 §A 的 E2 失配分支(显式「无证据」标记),**不得**把它报成缺陷或回滚精修。 |
| 561 | +- **两态 fixture 清单**:① **精修前**(`notes.content` 原文,锚点在段首)② **精修后**(章节锚点回挂、段落锚点 0)。两态各一份 fixture,**同一套断言**(E1 逐段锚 + E2 三件 + E3 双分母),差值必须**逐条归因到本节契约**。 |
| 562 | + |
| 563 | +#### §D 数据路径与红线(**需要控制方另裁,不在执行单元权限内**) |
| 564 | + |
| 565 | +1. **段落无稳定 id 的根因**:`notes.content` 是扁平 `TEXT`(`db_migrations.rs:18-27`),段落身份由 `noteCardModel` **派生** ⇒ 派生序号**会随编辑漂移**(用户在上方插入一段 ⇒ 后面所有段落身份全变)。 |
| 566 | +2. **要稳定配对的两条路**:**(a) 派生序号**(零 schema 改动,但漂移可观测)· **(b) 新增段级身份** ⇒ 🔴 **触及规格 §3 红线 6「后端数据模型零改动」** ⇒ **必须控制方另裁**,本批**不开**。 |
| 567 | +3. **唯一段级引用**:`artifact_blocks.refs_json.segment_id`(`artifact.rs:64`)—— 维度是 **session 而非 note**,且 **0 个 `#[tauri::command]` 返回该类型**(0 IPC 出口)⇒ 若要用**必须新开 command**,同 2 的红线裁决。🔴 **不得**在执行单元内顺手开。 |
| 568 | +4. 🔴 **不得新写第 3 支手写 markdown 解析器**(与 §7 的 markdown 归一冲突);实现若落地,**复用** `utils/markdownLine.ts` / `NoteMarkdown` 的既有渲染链。 |
| 569 | + |
| 570 | +#### §E 批 8 输入(逐条登记)+ 诚实边界 |
| 571 | + |
| 572 | +- **批 8 输入**:① 本章的实现(视图 + ms 最近邻纯函数 + 四类 fixture)② §D 的两条裁决(段级身份 / 新 command)③ E2 的**容差取值**(本章只定「必须有」与「三件形态」,**不定数值**)。 |
| 573 | +- **诚实边界**:本章**没有任何实现**,因此**没有**可跑的判据、**没有**覆盖率读数、**没有**观感结论;`NoteEvidenceTrack*` 的 0 命中是**本章未实现的证据**,**不是**「已交付但没测」。 |
| 574 | + |
| 575 | +--- |
| 576 | + |
524 | 577 | ## 8. L4 · 动效纲领「活的纸」 |
525 | 578 |
|
526 | 579 | > 用户纲领原文:**「我希望我的软件是充满动效的、充满创新设计、充满生命力的,而不是呆板、死板的。」** 本节各项均以此为准绳。 |
|
820 | 873 | > - **笔记 = 2 种**:`FROZEN_VIEW_KEYS.note = ["raw","cardflow"]`(`app/src/views/registry.ts:108`)—— 第三种的「带证据三轨」**不存在**(C2 的探针判否:`task-1-report.md` · `tmp/t1/c2-evidence-probe.md`;T13 独立复现见 `task-13-report.md` §②)⇒ 按 C2 逐字「不存在 ⇒ 交付 2 视图 + 就地加注 + 登记批 7」,**不建空壳视图**(实测全仓 `NoteEvidenceTrack*` = **0 命中**)。 |
821 | 874 | > - **本条验收不因此变红**:**2 ≥ 2** ✅,且「**原文形态不丢**」成立(默认视图 = `raw`,**常驻不卸载**,§7.3① 的判据另见 §三条硬约束)。 |
822 | 875 | > - **§7.2 矩阵的同一更正**见 §7.2 的批 5 加注;**产品机会登记批 7**:锚点机制确实存在(`concat.rs:121-127` 发射 · `anchor_strip.rs:3-4` 契约 · `note_filter_golden_tests.rs:117-124` 金测试),批 7 若要做「带证据三轨」**必须先写规格**——**E2 降级为 ms 最近邻**、**E1/E3 改为「带锚点段落数」**,并覆盖 `OcrDirect`/`Web`/手动笔记/`anchor_timestamps=false` 的**无锚点情形**(逐条见 `task-13-report.md` §④)。 |
| 876 | + > ↳ **批 7 收口就地加注(C9.17 / C9.10;2026-09-13,**本条第 6 行的原文与批 5 加注一字未改**)—— 第三种的**规格**已在 **§7.4** 交付,**实现仍未做**:** |
| 877 | + > - 🔴 **逐字状态:本批只交规格,实现未做。**「带证据三轨」的验收口径改写(E1/E2/E3)、两个分母、无锚点四类 fixture 清单、精修前后两态契约**全部写在 §7.4**;**代码零行**。 |
| 878 | + > - 🔴 **本条验收仍按批 5 的读数成立**(**2 ≥ 2**):笔记视图键终态 = `["raw","cardflow"]`(`app/src/views/registry.ts` 的 `FROZEN_VIEW_KEYS.note`),**本节不改变这个数**。 |
| 879 | + > - **实测(批 7 独立复测)**:全仓 `NoteEvidenceTrack*` = **0 处 / 0 文件**(PROD 与 TEST 双侧;负控 `zzz_no_such_symbol_zzz` = 0)⇒ **不得**读成「已交付」。 |
| 880 | + > - **批 8 输入**:§7.4 的实现 + 它的两条红线裁决(段级身份 / 新 command)。 |
823 | 881 | 7. **47 条未接线命令逐个有结论**,无「不知道」。 |
824 | 882 | > **进度(批 1 收口,2026-09-12)**:47 条中 **22 条已删**(含 #41 改判)、**25 条处置已定但未执行**(补 UI 12 → 批 7 · 登记不排期 7 → 批 7/无期 · 撤下 IPC 3 → 批 7 · 有意保留 3 → 无期)。**无「不知道」**。批 1 计划 §现状普查第三节给出 47/47 的逐条处置表;删除后复算 = registry 312 / 前端零引用 **25** 条(= 47 − 22,逐条与上列归属一致)。 |
825 | 883 | > ⚠️ **批 1 的实测更正(供批 2+ 引用本条时注意)**:计划的「不删清单」在本批被**证伪五次**(`artifact_templates` 族 / `AiEnhance*` 半边 / `vad_threshold_slot` 三符号 / `spec_from_kind` / 调用点计数),根因是**用「看起来还有人用」代替「删除后可达性」**作保留判据 ⇒ 后续批次判断连通性请照「收口回写」节的四条约纪律(计划 `docs/superpowers/plans/2026-09-11-frontend-redesign-batch1-deletions.md`)。 |
|
0 commit comments