|
| 1 | +/** |
| 2 | + * @ai-context 加载态(可见加载文案)的**冻结基线**(批 4 B11 裁决 + Task 14 的落点)。 |
| 3 | + * |
| 4 | + * Why:规格 §5.1 的病灶逐字是「全站 **0 骨架屏**,长任务只有一行灰字」——本仓至今**没有加载原语** |
| 5 | + * (`Loading` / `Skeleton` / `Probe` 批 0-D 就交付了,批 4 才接进来)。全量按规格账本数是 |
| 6 | + * 「85 处 / 30 文件」,T1 的机器口径(`tmp/t1/slice-manifest.mjs` 的 loading 类)实测 |
| 7 | + * **18 行 / 18 文件**(计划写的 19/19 是台账 #26 的 Windows 域过滤 bug)。18 处里有 14 处在 |
| 8 | + * B11 切片内(判据 ①本批已触碰 ∪ ②`pages/**` ∪ ③有同名测试),4 处是余量。 |
| 9 | + * |
| 10 | + * Why 冻结在**文件 → 行数**粒度(与 `nativeButtonBaseline.ts` 同范式):逐行 key 会在文件被拆件 / |
| 11 | + * 行号漂移时产生假红;棘轮要防的是「永远迁不完」⇒ 总量 + 逐文件只减不增是完整的。 |
| 12 | + * ⚠️ 本棘轮**只管可见加载文案**(`/加载[^"'`\n]{0,8}(中|…)/`),不含布尔门控与 `busy` 状态本身。 |
| 13 | + * |
| 14 | + * ★ 扫描口径(与 `tmp/scan-callsites.mjs` 同源;口径本身是判据的一部分) |
| 15 | + * ① 域 = `app/src/**` 的 `.ts`/`.tsx` 减 `*.test.ts(x)` 减 `ui/primitives/**` 减 `ui/icons/**` |
| 16 | + * (原语层就是"加载态该去哪儿"的答案,不是待收敛的重复调用点); |
| 17 | + * ② **先剥注释**(`//` 与块注释抹为等长空白);字符串/模板字面量**只跳过、不抹内容** |
| 18 | + * (判据读的就是字符串里的用户可见文案); |
| 19 | + * ③ 行口径:同一行多次命中只算 1 行(与 T1 的 18 行同源,保证前后读数可比)。 |
| 20 | + * |
| 21 | + * ★ 迁移读数(T14 实施者实测,仪器 = 与守卫同源的正则扫描) |
| 22 | + * 冻结时(`dev@f6dd012f`)**18 行 / 18 文件** ⇒ T14 第一提交后 **13 行 / 13 文件**。 |
| 23 | + * 逐文件 Δ 之和 = −5,与迁过的 5 个文件逐一对拍(每个文件 1 行 → 0 行)⇒ 机理成立。 |
| 24 | + * |
| 25 | + * ★ 余量去向(B11 附带硬要求:切片 + 棘轮 = **中间态**,不是"五类已各自收敛成一个原语") |
| 26 | + * ① 4 处余量(`LearningLibraryPanel` / `RetroTimeline` / `SessionDetailPanel` / `SessionListBody`) |
| 27 | + * 不在 B11 切片内 ⇒ 登记给**批 5/7**,由本棘轮冻结; |
| 28 | + * ② 5 处**在切片内但本提交未迁**(`AsrConfusionPanel` / `GoalDetail` / `RefineWorkbench` / |
| 29 | + * `SecondPassPanel` / `pages/ReviewPage`)——它们同时是 T13 空态切片的成员(同文件甚至 |
| 30 | + * **同一行/同一三元链**),并行窗口内改同一文件即撞车 ⇒ 按纪律让路,交 T14 的第二提交 |
| 31 | + * (T13 落库后)逐处迁;本文件那时把它们的上限从 1 降到 0(棘轮只降不升)。 |
| 32 | + */ |
| 33 | +export const FROZEN_LOADING_TEXT_TOTAL = 13; |
| 34 | + |
| 35 | +/** |
| 36 | + * 相对 `app/src` 的路径 → 允许残留的可见加载文案**行数上限**(只许降、不许升;键不许删)。 |
| 37 | + * |
| 38 | + * 语义:`0` = 已由原语承载(`Loading` / `Skeleton`);`1` = 仍有一处手写文案,见 `RESIDUAL` 的理由。 |
| 39 | + */ |
| 40 | +export const FROZEN_LOADING_TEXT_BY_FILE: Readonly<Record<string, number>> = { |
| 41 | + // 已迁移(0 = 该文件的加载态已交给 L1 原语) |
| 42 | + "components/NotePreviewView.tsx": 0, |
| 43 | + "components/RefineLaunchDialog.tsx": 0, |
| 44 | + "components/RefineStrategyPicker.tsx": 0, |
| 45 | + "components/WebArticleView.tsx": 0, |
| 46 | + "components/review/ReviewSessionPanel.tsx": 0, |
| 47 | + // 残留(1 = 见 RESIDUAL 的分类与理由) |
| 48 | + "components/AsrConfusionPanel.tsx": 1, |
| 49 | + "components/CaptureOverlayPanel.tsx": 1, |
| 50 | + "components/GoalDetail.tsx": 1, |
| 51 | + "components/ImageGallery.tsx": 1, |
| 52 | + "components/LearningLibraryPanel.tsx": 1, |
| 53 | + "components/RefineWorkbench.tsx": 1, |
| 54 | + "components/RetroTimeline.tsx": 1, |
| 55 | + "components/SecondPassPanel.tsx": 1, |
| 56 | + "components/SessionDetailPanel.tsx": 1, |
| 57 | + "components/SessionListBody.tsx": 1, |
| 58 | + "components/StructureImageSection.tsx": 1, |
| 59 | + "components/WindowSelectCard.tsx": 1, |
| 60 | + "pages/ReviewPage.tsx": 1, |
| 61 | +}; |
| 62 | + |
| 63 | +/** |
| 64 | + * 迁移面:这些文件的加载态**必须**由原语承载 ⇒ 判据要求「0 命中 + 含 `<Loading`/`<Skeleton`」。 |
| 65 | + * 少一个文件就是回潮,多一个文件要先把它在 `FROZEN_LOADING_TEXT_BY_FILE` 里降到 0。 |
| 66 | + */ |
| 67 | +export const MIGRATED_FILES: readonly string[] = [ |
| 68 | + "components/NotePreviewView.tsx", |
| 69 | + "components/RefineLaunchDialog.tsx", |
| 70 | + "components/RefineStrategyPicker.tsx", |
| 71 | + "components/WebArticleView.tsx", |
| 72 | + "components/review/ReviewSessionPanel.tsx", |
| 73 | +]; |
| 74 | + |
| 75 | +/** 残留命中的分类:`exception` = 原语结构上表达不了 · `button-busy` = 按钮内忙碌文案 · `backlog` = 余量/让路 */ |
| 76 | +export type ResidualKind = "exception" | "button-busy" | "backlog"; |
| 77 | + |
| 78 | +/** |
| 79 | + * 允许残留的**逐文件理由**(每条都必须:理由非空 ∧ 该文件此刻**仍然命中** —— 防"僵尸豁免": |
| 80 | + * 一处被迁走却仍挂在豁免表里,下一个人就会以为它还在)。 |
| 81 | + */ |
| 82 | +export const RESIDUAL: readonly { file: string; kind: ResidualKind; reason: string }[] = [ |
| 83 | + { |
| 84 | + file: "components/CaptureOverlayPanel.tsx", |
| 85 | + kind: "exception", |
| 86 | + reason: |
| 87 | + "B6 特殊条款未覆盖的例外:根节点 background:#000、原文案 #e5e7eb(浅字压深底);`Loading` 的墨度权威是 `Text tone=\"ink-3\"`(深灰)⇒ 迁过去等于把对比度反转(可读性回归)。消费者只有 1 个 < B6 阈值 3 ⇒ 不改原语;行内 style 覆盖类语义被 ADR-033 §4 禁止 ⇒ 保留手写文案 + 冻结", |
| 88 | + }, |
| 89 | + { |
| 90 | + file: "components/ImageGallery.tsx", |
| 91 | + kind: "button-busy", |
| 92 | + reason: "该行是 `<Button variant=\"secondary\" busy={loading}>` 的**按钮文案**(`加载中…` / `⟳ 刷新`),不是独立加载态 ⇒ 已由 `Button busy` 承载(Task 14 Step 2 ③)", |
| 93 | + }, |
| 94 | + { |
| 95 | + file: "components/StructureImageSection.tsx", |
| 96 | + kind: "button-busy", |
| 97 | + reason: "同 ImageGallery:`<Button busy={loading}>` 的按钮文案,已由 `Button busy` 承载", |
| 98 | + }, |
| 99 | + { |
| 100 | + file: "components/WindowSelectCard.tsx", |
| 101 | + kind: "button-busy", |
| 102 | + reason: "原生 `<button disabled={loading}>` 的忙碌文案 ⇒ T14 改为 `<Button variant=\"ghost\" size=\"sm\" busy={loading}>`;文案仍随 loading 切换(保留可读标签),探针/aria-busy 由原语给", |
| 103 | + }, |
| 104 | + { |
| 105 | + file: "components/AsrConfusionPanel.tsx", |
| 106 | + kind: "backlog", |
| 107 | + reason: "在切片内但让路:该行与 T13 的空态迁移点是**同一行**(`view === null ? \"加载中…\" : \"暂无新候选…\"`);T13 已在它的空态提交里把这条三元一并换成 `<Loading label=\"加载中…\"/>` ⇒ 待 T13 落库后由 T14 第二提交把它移到 `MIGRATED_FILES` 并把上限收紧为 0", |
| 108 | + }, |
| 109 | + { |
| 110 | + file: "components/GoalDetail.tsx", |
| 111 | + kind: "backlog", |
| 112 | + reason: "在切片内但让路:该文件同时是 T13 空态切片成员 ⇒ 交 T14 第二提交(目标:`Skeleton lines={3}` + `Loading`,见 `Loading.tsx:10` 点名的靶子)", |
| 113 | + }, |
| 114 | + { |
| 115 | + file: "components/RefineWorkbench.tsx", |
| 116 | + kind: "backlog", |
| 117 | + reason: "在切片内但让路:该文件同时是 T13 空态切片成员 ⇒ 交 T14 第二提交", |
| 118 | + }, |
| 119 | + { |
| 120 | + file: "components/SecondPassPanel.tsx", |
| 121 | + kind: "backlog", |
| 122 | + reason: "在切片内但让路:加载分支与 T13 的空态分支在**同一三元链**上(`:216` / `:219`)⇒ 交 T14 第二提交", |
| 123 | + }, |
| 124 | + { file: "pages/ReviewPage.tsx", kind: "backlog", reason: "在切片内但让路:该文件同时是 T13 空态切片成员 ⇒ 交 T14 第二提交" }, |
| 125 | + { file: "components/LearningLibraryPanel.tsx", kind: "backlog", reason: "不在 B11 切片内 ⇒ 余量登记给批 5/7" }, |
| 126 | + { file: "components/RetroTimeline.tsx", kind: "backlog", reason: "不在 B11 切片内 ⇒ 余量登记给批 5/7" }, |
| 127 | + { file: "components/SessionDetailPanel.tsx", kind: "backlog", reason: "不在 B11 切片内 ⇒ 余量登记给批 5/7" }, |
| 128 | + { file: "components/SessionListBody.tsx", kind: "backlog", reason: "不在 B11 切片内 ⇒ 余量登记给批 5/7" }, |
| 129 | +]; |
0 commit comments