|
243 | 243 | > - 🔻 **补时点(2026-09-13 · T21 补轮;上面那条读数的**数**不动,只补时点与漂移声明)**:上面写的正控 `tone="ink-3"` = **201 处 / 94 文件** 是**某个时点**的读数 —— 🔴 **它在 `fb73e313` 那棵树上逐字可复现**(侦察单元已证),此后 `b72d4709`(T20 的六条展示面)与 T23 又加了文件 ⇒ **数继续变**。🔴 **T21 于 `53bd0759` 用自己的仪器复测**(入库域 = `git ls-files`;口径 = `app/src/**` 的 `.ts`/`.tsx` 内**子串 `tone="ink-3"` 的出现次数**):**PROD(排除 `*.test.*`)= 214 处 / 99 文件** · **TEST = 2 处 / 1 文件** · **全树 `app/src` = 216 处 / 100 文件**。 |
244 | 244 | > - 🔴 **纪律逐字**:**该数随时点变化,引用必须带时点(并带仪器与域)**。⚠️ **不得**把 `216/100` 当成「真值」—— 它**同样会漂**;也不得把 `201/94` 当错值 —— 它是**时点值**。(本轮另见批 7 的「贴边件读数必须带时点」与「数字带时点」两条纪律,同源。) |
245 | 245 | > - 🔴 **不得合并结案**:条件 ③ 是**环境层第 ③ 件之外的另一件事** —— 不能用「做了 `lowConfidenceClass`(未确认段落墨度起伏)」宣称本条已兑现(原文 §4.3 批 6 加注已逐字记载:`ink-4` 与它**没有实现关系**)。批 7 对 `lowConfidenceClass` 的加宽(生产调用点 1 → 2)**不改变**本条状态:**仍是未实现**。 |
| 246 | +> - 🔻 **批 8 T3 就地加注 · 第 ⑤ 条的**覆盖落点**更正(2026-09-13;**上面第 ⑤ 条的原文一字未改**)**:第 ⑤ 条逐字点名的落点 `ui/tokens.css` 是**生成物** ⇒ **不得**在它里面写这一层覆盖。🔴 **T3 实测**:`app/src/ui/tokens.css:2` 逐字「**由 scripts/gen-tokens.mjs 生成,请勿手改。**」· `:3` 逐字「**手改会被 src/ui/tokens.drift.test.ts 判失败。**」;守卫本体 = `app/src/ui/tokens.drift.test.ts:25-28`(`it("tokens.css 与生成器输出一致(手改即失败)")` 断 `expect(normalizeEol(onDisk)).toBe(normalizeEol(renderAll().css))`)⇒ 手改**必红**。 |
| 247 | +> - ⇒ 🔴 **批 8 的实际落点 = 新建 `app/src/ui/proofread.css`**(控制方 §2 **B1** 逐字):在**根元素模式位**下把 `--ed-ink-4` 的值**重绑到 `--ed-ink-3`**,**同时不动** `app/scripts/gen-tokens.mjs` 与 `app/src/ui/primitives/Text.css`。⚠️ 第 ⑤ 条原文的「`ui/tokens.css` 的变量覆盖」一句**按本注改读为「专用 CSS 文件(`app/src/ui/proofread.css`)的变量覆盖」**;**本注只改落点、不改机制** —— 第 ⑤ 条的机制仍是「**纯 CSS 一层、调用点零改动、零逐处判断**」。 |
246 | 248 |
|
247 | 249 | ### 4.4 剪报底纹的防御性规则 |
248 | 250 |
|
|
538 | 540 | ### 7.4 笔记「带证据三轨」—— 批 7 规格章(🔴 **本批只交规格,实现未做**) |
539 | 541 |
|
540 | 542 | > **出处与状态(这一行是本章的定位,别跳读)**:`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)⇒ **不存在「第三种笔记视图已经交付」这回事**,本章也**不得**被读成它。 |
| 543 | +> - 🔻 **口径更正(2026-09-13 · 批 8 T3;上一行的**实测域**收窄,原文保留)**:上一行逐字写的「**全仓**」是**字面假命题** —— **它包含本行自身**(上一行既含「全仓」也含那个以 `Track` 结尾的符号名)⇒ **自我指涉**(与 §11-7 在 `:905-906` 的更正**同源、同形**)。🔴 **T3 于 `7c1fcc41` 实测**(入库域 = `git ls-files`,**1,615** 文件;口径 = 行含子串,剥注释抹等长空白保偏移):**`app/src/**`(生产 + 测试)= RAW 0 行 / 剥注释 0 行 / 0 文件** ✅ · **`app/src/**` 之外 = RAW **27** 行 / 剥注释 **27** 行 / **4** 文件,**全部在 `docs/**`**(按顶层目录 = `docs:27` 行 / `docs:4` 文件)—— **含上一行自身**。 |
| 544 | +> - ⚠️ **口径注(勿与 §11-7 的读数混用)**:本注的「剥注释」**只对 `.rs` / `.ts` / `.tsx` 生效**(`.md` 无注释语义,原样比对)⇒ 本注域内两者恒等;§11-7 的 `:905` 那组读数(RAW **16** / 剥注释 **6** / **3** 文件,时点 `53bd0759`)**口径与时点都不同** ⇒ 🔴 **两组数不得互推、不得当趋势读**(§3.5「数字必须带口径与时点」)。**本注自身含该符号名恰 1 次** ⇒ 落注后全仓 RAW **+1 行 / +0 文件**(即 **28** 行 / **4** 文件),**`app/src/**` 仍 0 行 / 0 文件**。 |
| 545 | +> - ⇒ 🔴 **正确表述**:**「`app/src/**`(生产 + 测试)= 0 处 / 0 文件」**(这才是「实现未做」的**有效证据域**);**`app/src` 之外的 27 行**全是**文档与计划里的提及**(其中含本章自身),那**不是实现**。**上一行的「全仓」一律按本注收窄读**(收窄后与 §11-7 的 `:906` 现口径一致)。阴性对照 = 本任务**现造**的随机串(**入库域实测 0 命中**;因它一旦入库即失效,故本注**不写它**,读数见批 8 `task-3-report.md`)。 |
541 | 546 |
|
542 | 547 | #### §A 三条验收口径的改写(E1 / E2 / E3 —— 模型 / 视图层的全部判据面) |
543 | 548 |
|
|
547 | 552 | | **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` 逐字一致**;旧口径是一条**永远不可能满足**的断言 | |
548 | 553 | | **E3** | 「派生段落数」当分母 | 🔴 **两个分母并列、不许混用**:**分母甲 = 派生段落总数**(渲染器实际产出的段落节点数)· **分母乙 = 带锚点段落数**(其中含 `[[ts:ms]]` 锚点者)。⇒ 报告与判据**必须分别给出两个比值**(「有锚点的覆盖率」用分母乙;「全篇覆盖率」用分母甲),🔴 **禁止**只报一个数就称「覆盖率」 | 分母只有一个时,无锚点段落会被算成「未覆盖」⇒ 读数**结构性偏低**,而真实缺陷面(有锚点却无证据列)会被稀释 | |
549 | 554 |
|
| 555 | +> 🔻 **批 8 T3 就地加注 · 上表 E2 行的**出处**更正(2026-09-13;**上表原文与各格一字未改**)**:E2 行的「为什么必须改」列逐字用 `artifact.rs:62-69` 支撑「证据本体 = `session_segments.id` / `session_ocr_blocks.id`」。 |
| 556 | +> - 🔴 **实测该处是 `BlockRefs`**(`app/src-tauri/src/artifact.rs:60-69`:`:62` `pub struct BlockRefs {`,字段 `:64` `segment_id: Option<i64>` · `:66` `ocr_block_id: Option<i64>` · `:68` `frame_ms: Option<u64>`)—— 它是**产物块引用结构**(`ArtifactBlock.refs: BlockRefs`,同文件 `:127`),维度是 **session 而非 note**,且 **0 个 `#[tauri::command]` 返回该类型**(**0 IPC 出口**;域 = 入库 `app/src-tauri/**/*.rs`,实测 `BlockRefs` 只出现在**结构定义 / 字段 / 内部构造 / 测试**四类位置)。 |
| 557 | +> - ⚠️ **照字面读会误判成「必须新开 command」**(这正是本章 §D3 的由来)⇒ 🔴 **实际不需要**:**证据 id 的定义处** = `app/src/types/session.ts` 的 `SessionSegment.id`(`:22-23`)与 `SessionOcrBlock.id`(`:33-34`),及表 `session_segments`(`app/src-tauri/src/db_migrations.rs:45`)/ `session_ocr_blocks`(同文件 `:56`);**前端取数走既有 `get_session_detail`**(`app/src-tauri/src/commands_session.rs:137` → `:164`;`:146` `list_segments(id)` · `:147` `list_ocr_blocks(id)`,`:164` 一并返回)⇒ **零新 IPC / 零 schema**(控制方 §2 **A1**)。 |
| 558 | +> - ⇒ **E2 行的技术结论不变**(`ms` 在类型上无法与 `id` 逐字一致);**变的只是出处** —— 支撑该结论的是 `session.ts` 的类型 + `get_session_detail`,**不是** `artifact.rs:62-69`。 |
| 559 | +
|
550 | 560 | #### §B 无锚点四类 + 各一份 fixture(**关闭开关的用例必须有**) |
551 | 561 |
|
552 | 562 | | # | 类 | 出处(发射路径) | fixture 必须断言什么 | |
|
569 | 579 | 3. **唯一段级引用**:`artifact_blocks.refs_json.segment_id`(`artifact.rs:64`)—— 维度是 **session 而非 note**,且 **0 个 `#[tauri::command]` 返回该类型**(0 IPC 出口)⇒ 若要用**必须新开 command**,同 2 的红线裁决。🔴 **不得**在执行单元内顺手开。 |
570 | 580 | 4. 🔴 **不得新写第 3 支手写 markdown 解析器**(与 §7 的 markdown 归一冲突);实现若落地,**复用** `utils/markdownLine.ts` / `NoteMarkdown` 的既有渲染链。 |
571 | 581 |
|
| 582 | +> 🔻 **批 8 T3 就地加注 · 本节 §D 的两条红线裁决(2026-09-13;**§D 的标题与第 1–4 条的原文一字未改**)**:第 2 / 3 条逐字写的「**必须控制方另裁**」(标题 `:565` 同写「**需要控制方另裁,不在执行单元权限内**」)**已由控制方裁决**(控制方 §2 **A2** 逐字): |
| 583 | +> - 🔴 **走 (a) 派生序号** —— 即第 2 条的 **(a)**:**零 schema 改动**;§D1 的漂移事实**不变**(漂移**可观测**,按其登记,**不因此改设计**)。 |
| 584 | +> - 🔴 **明确不开 (b)「新增段级身份」**(第 2 条 (b),仍触 §3 红线 6)**,也不开 §D3 的「新开 command」** —— 前端取数走既有 `get_session_detail`(出处与实测见 §A 表下的 T3 加注)⇒ 第 3 条末句「若要用**必须新开 command**」**按本注不再成立**(**不开** command 就够)。 |
| 585 | +> - ⇒ **本节标题与第 2 / 3 条不再是「待裁」状态**;下游实现单元**不需要**任何新增 IPC / schema。§E 逐条登记的「批 8 输入 ②(§D 的两条裁决)」**按本注闭合**。 |
| 586 | +
|
572 | 587 | #### §E 批 8 输入(逐条登记)+ 诚实边界 |
573 | 588 |
|
574 | 589 | - **批 8 输入**:① 本章的实现(视图 + ms 最近邻纯函数 + 四类 fixture)② §D 的两条裁决(段级身份 / 新 command)③ E2 的**容差取值**(本章只定「必须有」与「三件形态」,**不定数值**)。 |
|
0 commit comments