Skip to content

Commit 7334805

Browse files
committed
chore(scripts): 重冻懒侧预算并补注入路径判据
T10 收口(批 8 段 8b):控制方 2026-09-13 按 §C46.4 逐次授权重冻 + 补一条判据(F15)。 - 重冻(本条经 §C46.4 逐次授权,授权方 = 控制方):NotesPage- 48,693 → 49,219(实测); 懒侧总上限 639,314 → 639,868(实测;§C32.3 第 ③ 条本次经 §C46.4 逐次授权解除,授权方 = 控制方)。 vendor-* 五族逐族零增长(Δ 全 0)⇒ 未触发 §C46.4 的 STOP 条件;其余 39 族与 chunk 上限 39 一字未动。 generatedFrom / semantics 同步(逐字含本轮 T10 归属、授权方、时点与理由)。 受控对比:HEAD~1(cc08c95f,不含 T10)导出树真构建 ⇒ NotesPage- 48,693 · 总量 639,314, 与旧冻结值逐字节相等 ⇒ 增长确系本次改动的必然后果。 - 新判据 F15(注入路径被真正消费):夹具注入 3 段 / 正文自派生 2 段 ⇒ 视图必须渲染注入值; 变异体「视图永远自派生」红在 F15 具名断言(只红这一条)。 重冻后真构建包体闸 exit 0:首屏 106.23 kB(余 93.78)· 懒侧 639,868 B / 上限 639,868 + 64 · chunk 39 / 39 · 未归族 0 · 逐族红 0。全量 vitest 234 文件 / 2293 用例 / 0 failed。 报告:.superpowers/sdd/2026-09-13-frontend-redesign-batch8/task-10-report.md §11
1 parent e493eac commit 7334805

2 files changed

Lines changed: 30 additions & 4 deletions

File tree

‎app/src/components/notes/NotesReadingColumn.evidence.test.tsx‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,29 @@ describe("F14 页面级:畸形 get_session_detail 载荷(null)⇒ 降级
150150
expect(panel.querySelectorAll("[data-evidence-for]").length, "畸形载荷把段落轨也带没了").toBe(1);
151151
});
152152
});
153+
154+
/**
155+
* F15 —— **注入路径真的被消费**(控制方 2026-09-13 裁定「必须加」的那条判据)。
156+
*
157+
* @ai-context 为什么必须有这一条:F12 用的 `LINES` 就是 `evidenceLinesOf(CONTENT)` ⇒ **两边同源**,
158+
* 于是「视图**忽略**注入、永远自派生」这个变异体**抓不到**(实测 M1 = 等价变异体)⇒ 若真如此,
159+
* 整条注入路径就是**死代码**而没有任何判据会注意到。⇒ 本条的夹具**刻意让注入值与自派生值不同**:
160+
* 注入 **3 段**、而夹具笔记正文自派生只有 **2 段**(`# 正文` + `内容段落`)。视图渲染出 **3** 段且文本
161+
* 逐字取自注入值 ⇒ **注入路径被消费**在 DOM 上成为可判事实(不是「看起来像」)。
162+
* @ai-context 这不是「不真实夹具」:生产语义就是「容器是段落轨的派生方」—— 一旦视图回退自派生,
163+
* `paragraphIndex` 会与容器口径脱节(正是 T8 契约里那条静默错位)。本判据把该契约钉在行为面。
164+
*/
165+
describe("F15 注入路径被真正消费(夹具 lines 与自派生**刻意不同**)", () => {
166+
it("F15 注入 3 段 / 正文自派生 2 段 ⇒ DOM 渲染**注入**的 3 段与逐字文本(忽略注入即红)", async () => {
167+
const INJECTED = ["注入甲段", "注入乙段", "注入丙段"].map((text, paragraphIndex) => ({ paragraphIndex, text }));
168+
const derived = evidenceLinesOf(note.content);
169+
// 夹具自证:注入值与自派生值**必须不同**(否则本判据等价于 F12 ⇒ 抓不到「忽略注入」)
170+
expect(derived.length, "夹具自证:自派生的段数不得等于注入的 3(否则本判据空真)").toBeLessThan(INJECTED.length);
171+
render(<Harness evidence={{ segments: [], ocr: [], lines: INJECTED }} />);
172+
await clickSegment("证据");
173+
const panel = await screen.findByTestId("note-evidence-track");
174+
expect(evidenceFors(panel), "视图没消费注入的 lines(回退自派生 ⇒ 整条注入路径是死代码)").toEqual(["0", "1", "2"]);
175+
for (const l of INJECTED) expect(within(panel).getByText(l.text), `注入文本未渲染:${l.text}`).toBeTruthy();
176+
expect(within(panel).queryByText("内容段落"), "自派生的正文也渲染了 ⇒ 段落轨有两处派生").toBeNull();
177+
});
178+
});

‎scripts/lazyBudget.json‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"generatedFrom": "node scripts/check-bundle-budget.mjs(**真构建**,不带 --no-build)· 源码 = 8cc627de(批 8 T8 的 O4① 落地树)+ T8 的注册表第三项(本提交)· 读数存档 .superpowers/sdd/2026-09-13-frontend-redesign-batch8/tmp/t8/b2-mine.json(受控对照 b2-control.json = base ffb7e28a 去掉 T8 的 6 件;时点 2026-09-13T06:53Z · 懒侧 39 chunk / 639,314 B · 首屏 106.20 kB);🔴 本版 = 批 8 **8b 段**的收口重冻(归属 = T8 的视图片 + 它的注册表第三项);上一版 = c0bff722(批 7 T22 全批收口重冻,limit 637,501)· 再上一版 = 950afd5a(批 7 T12 的 7a 段收口重冻,limit 636,243)· 再上一版 = cd800d63(批 7 T9,批次中段快照 634,316)",
2+
"generatedFrom": "node scripts/check-bundle-budget.mjs(**真构建**,不带 --no-build)· 源码 = 8cc627de(批 8 T8 的 O4① 落地树)+ T8 的注册表第三项(本提交)· 读数存档 .superpowers/sdd/2026-09-13-frontend-redesign-batch8/tmp/t8/b2-mine.json(受控对照 b2-control.json = base ffb7e28a 去掉 T8 的 6 件;时点 2026-09-13T06:53Z · 懒侧 39 chunk / 639,314 B · 首屏 106.20 kB);🔴 本版 = 批 8 **8b 段**的收口重冻(归属 = T8 的视图片 + 它的注册表第三项);上一版 = c0bff722(批 7 T22 全批收口重冻,limit 637,501)· 再上一版 = 950afd5a(批 7 T12 的 7a 段收口重冻,limit 636,243)· 再上一版 = cd800d63(批 7 T9,批次中段快照 634,316);★★ 第 4 次 = 批 8 **T10**(容器片:`hooks/useNoteEvidence.ts` + `NotesPage` 注入 + `readingColumnLoaders` 的第三视图本地加载器)—— 真构建读数 `tmp/t10/b3-summary.json`;受控对照 = `tmp/t10/b5-control-parent.json`(`HEAD~1` = `cc08c95f` **不含 T10** 导出树真构建 ⇒ `NotesPage-` **48,693** · 总量 **639,314**,与旧冻结值逐字节相等)· 时点 2026-09-13T07:24Z。",
33
"unit": "gzip = zlib.gzipSync level 6 · 族前缀 = 去掉 8 位内容 hash 的 chunk 名 + '-'(chunk 名带内容 hash,不稳定,不能当键)",
44
"scope": "🔴 必须在**新鲜构建**产物上判定(§C21.3):旧 dist 上的 --no-build 读数含时代残渣,上界会虚高(实测 +64,497 B)⇒ 本判据的合格调用 = 不带 --no-build(本脚本自行构建)或显式 --dist 指认受判产物",
5-
"semantics": "全部字段 = 实测**冻结值**,只许降(批 7 §C9.6 第 2 条 / §C10.4);写乐观「预算值」会立刻红。★ 重冻谱系(§C46.4「每收口一次、重冻一次」):第 1 次 = 批 7 T12(0a503cc8)—— 4 族按收口树真构建实测重冻(NoteMarkdown- · NotesPage- · RefineLaunchDialog- · SessionsPage-)+ 新族 NoteCardFlowWithSeek- 登记 + chunk 36 → 37 + 总量 634,316 → 636,243;🔴 vendor-* 五族逐族核对为「零增长」⇒ 未触发 §C46.4 的 STOP。第 2 次 = 批 7 T22(c0bff722,控制方逐条授权)—— 2 族抬到终态真构建实测(KnowledgePage- 27,620 → 28,466 · NotesPage- 48,087 → 48,627)+ 补登遗漏族 lowConfidence-(100 B)+ 总量 636,243 → 637,501,chunk 数 37 → 37 不变;该版曾把自身写成「批 8 的基线」,🔻 该句按本条更正。★★ **本轮 = 第 3 次**,归属 = 批 8 **T8**(视图件 NoteEvidenceTrackView.tsx + 它的注册表第三项)、收口段 = **8b**、由控制方按 §C46.4 **逐次授权**(2026-09-13):① 登记 2 个新族 —— NoteEvidenceTrackView- **1,470 B** · markdownLine- **768 B**(后者 = 本视图复用 utils/markdownLine.ts 后被抽成共享懒 chunk 的**必然结果**,非新依赖)② 重冻 2 个越界族 —— NotesPage- 48,627 → **48,693** · registry- 1,966 → **2,048** ③ chunk 上限 37 → **39** ④ 总量 637,501 → **639,314**(🔴 §C32.3 第 ③ 条「懒侧总上限不得抬高」本次经控制方逐次授权解除:**授权方 = 控制方,时点 2026-09-13,理由 = 8b 段收口重冻的一次性授权**);🔴 vendor-* 五族**逐族零增长**(实测 Δ = 0:58,786 / 208,585 / 41,162 / 79,915 / 50,623)⇒ 未触发 §C46.4 的 STOP 条件;🔴 其余 33 族上限**一字未动**。**批 8 的基线 = 本条所记的终态重冻值**(此后才是真正的硬棘轮)。",
5+
"semantics": "全部字段 = 实测**冻结值**,只许降(批 7 §C9.6 第 2 条 / §C10.4);写乐观「预算值」会立刻红。★ 重冻谱系(§C46.4「每收口一次、重冻一次」):第 1 次 = 批 7 T12(0a503cc8)—— 4 族按收口树真构建实测重冻(NoteMarkdown- · NotesPage- · RefineLaunchDialog- · SessionsPage-)+ 新族 NoteCardFlowWithSeek- 登记 + chunk 36 → 37 + 总量 634,316 → 636,243;🔴 vendor-* 五族逐族核对为「零增长」⇒ 未触发 §C46.4 的 STOP。第 2 次 = 批 7 T22(c0bff722,控制方逐条授权)—— 2 族抬到终态真构建实测(KnowledgePage- 27,620 → 28,466 · NotesPage- 48,087 → 48,627)+ 补登遗漏族 lowConfidence-(100 B)+ 总量 636,243 → 637,501,chunk 数 37 → 37 不变;该版曾把自身写成「批 8 的基线」,🔻 该句按本条更正。★★ **本轮 = 第 3 次**,归属 = 批 8 **T8**(视图件 NoteEvidenceTrackView.tsx + 它的注册表第三项)、收口段 = **8b**、由控制方按 §C46.4 **逐次授权**(2026-09-13):① 登记 2 个新族 —— NoteEvidenceTrackView- **1,470 B** · markdownLine- **768 B**(后者 = 本视图复用 utils/markdownLine.ts 后被抽成共享懒 chunk 的**必然结果**,非新依赖)② 重冻 2 个越界族 —— NotesPage- 48,627 → **48,693** · registry- 1,966 → **2,048** ③ chunk 上限 37 → **39** ④ 总量 637,501 → **639,314**(🔴 §C32.3 第 ③ 条「懒侧总上限不得抬高」本次经控制方逐次授权解除:**授权方 = 控制方,时点 2026-09-13,理由 = 8b 段收口重冻的一次性授权**);🔴 vendor-* 五族**逐族零增长**(实测 Δ = 0:58,786 / 208,585 / 41,162 / 79,915 / 50,623)⇒ 未触发 §C46.4 的 STOP 条件;🔴 其余 33 族上限**一字未动**。**批 8 的基线 = 本条所记的终态重冻值**(此后才是真正的硬棘轮)。 ★★★ **第 4 次 = 批 8 T10(容器片)**,2026-09-13 由控制方按 §C46.4 **逐次授权**:① 重冻 **1 族** —— `NotesPage-` 48,693 → **49,219**(+526)② 总量 639,314 → **639,868**(+554;🔴 §C32.3 第 ③ 条本次经 §C46.4 逐次授权解除:**授权方 = 控制方,时点 2026-09-13,理由 = T10 容器片收口重冻的一次性授权**)③ chunk 数 **39 → 39 不变** ④ 🔴 `vendor-*` 五族**逐族零增长**(实测 Δ = 0:208,585 / 79,915 / 58,786 / 50,623 / 41,162)⇒ 未触发 §C46.4 的 STOP 条件 ⑤ 🔴 其余 34 族上限**一字未动**。**机制**:T10 的 `EVIDENCE_LOAD` 是 `views/note/NoteEvidenceTrackView.tsx` 的**唯一静态导入点** ⇒ 该视图 + 模型层从独立 chunk(`NoteEvidenceTrackView-*` 1,470 B)**并入宿主 `NotesPage-` 族**(这正是「不改 chunk 上限 39」的**设计取舍**:不合并则 chunk 数 39 → 40 ⇒ 换一条判据红);⇒ 独立 chunk 的读数 = `b5-control-parent.json` 的 `NoteEvidenceTrackView-uBmBTMwt.js` **1,470 B gzip**(合并后该族消失、字节进 `NotesPage-`)。",
66
"lazyChunkCountMax": 39,
7-
"lazyTotalGzipBytesMax": 639314,
7+
"lazyTotalGzipBytesMax": 639868,
88
"families": [
99
{
1010
"prefix": "ActionPage-",
@@ -56,7 +56,7 @@
5656
},
5757
{
5858
"prefix": "NotesPage-",
59-
"gzipBytesMax": 48693
59+
"gzipBytesMax": 49219
6060
},
6161
{
6262
"prefix": "RefineLaunchDialog-",

0 commit comments

Comments
 (0)