Skip to content

Commit 4041eab

Browse files
committed
docs(standards): 登记懒侧 dist 假绿与陈旧度
1 parent c19418e commit 4041eab

1 file changed

Lines changed: 12 additions & 0 deletions

File tree

‎docs/standards/performance.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@
4949
- **逐族上限可「同提交重冻」**(批 7 §C32.3):改动懒侧字节的单元可在**同一条提交**里把受影响族的 `gzipBytesMax` 重冻为新实测值(条件:提交信息点名是哪处改动推高 · 报告给前后逐键 diff · **总量不得抬高** · 评审核「是该次改动的必然后果」)。🔴 **懒侧总上限仍是硬棘轮、只许降**。
5050
- **工具**:`node scripts/check-bundle-budget.mjs`(不带 `--no-build` ⇒ 自行构建后再判两个预算,人类可读、**分别**打印两个 pass);加 `--json` 得平级的 `firstScreen` / `lazyBudget` 两栏。退出码 `1` = **任一**预算超标(首屏 / 懒侧)。
5151
- 🔴 **执行者缺口(技术债 → 批 8;批 7 §C25.5② + §C14.5 逐字落账)**:本判据(**首屏 + 懒侧的唯一守卫**)在 `.github/workflows/pr-check.yml` / `.husky/pre-commit` / `scripts/validate-all.mjs` **三处都没有执行者** ⇒ **这道门禁的牙只在有人手工跑时才存在**(批 7 期间的唯一执行者 = 段收口单元 T12 与全批收口单元 T22,**均为人手工触发**)。**同源事实**:`pr-check.yml` 的 **paths-filter 根本没有 `scripts/**` glob**(T8 实测缺 `scripts/lib/**`;T11 新增 `scripts/check-exemption-prose.mjs` 后复查 ⇒ **缺口形态未变、逃逸文件集合 +1**)⇒ **只改 `scripts/**` 的 PR 不被任何被过滤的 job 看见**。🔴 **批 7 裁决:不动 `.github/workflows/`**(AGENTS.md §10 的额外审查清单 + `semantic-release` 的发布自动化连带面 + 本批的规格义务与登记项里**没有** CI 工作;批 7 对 `scripts/**` 的门禁靠**收口单元直接跑脚本**,覆盖等效)。**修复形态 = ① 给 paths-filter 补 `scripts/**` glob ② 给本守卫(及同域脚本)接一个执行者**;**归属批 8**。
52+
#### 懒侧判定的登记(形态与去向,不设新数值;三条登记 · 2026-09-13)
53+
54+
· 🔴 **字节闭合 + 逐族容差的互指(2026-09-13 · 收口后复核)**:**各族实测之和 = 懒侧总量 = 总上限**(逐字节相等);而 **`Σ 逐族上限` 高于 `Σ 实测` 的部分**里含**其它族的正 slack** ⇒ 它**不是余量**,是「逐族上限未随实测逐族重冻」的形态(本行只登记性质与去向,数值出处见上一行)。⇒ **逐族重冻时只许降总量上限、不得抬高**;**「总量绿」不等于「逐族都绿」**。
55+
· 🔴 **零 chunk 死预算(`shift-` 族)**:该族**无任何 chunk 可达,却占用逐族上限**(值见上一行的出处)⇒ 它**计入 `Σ 逐族上限`**、因而不构成可用余量。🔴 **清理它会降低总量上限(符合「只许降」)**;但**若该族 chunk 复现**,它会落在**未归族**(族前缀清单等式)与**实测对上限**两条判据上 ⇒ **清理前需有意的判断**,不是机械动作。
56+
· 🔴 **红阈的适用域(承上)**:**懒侧判定未被开启时(不给 `--dist` 的裸 `--no-build`)读数打 `⏭ 未判`** ⇒ 🔴 **「未判」既不是达标也不是超标**,不得据此报绿;**红阈只在判定真的执行了才有意义**。
57+
· 🔴 **计数口径(防推断错误)**:**族数 ≠ chunk 数**(一个 chunk 恰好归一族,而**允许存在零 chunk 的族**)⇒ **禁止由族数推断 chunk 数**(反之亦然);两者各自的读数出处见上一行。
58+
· 🔴 **`--no-build` + `--dist` 会开启懒侧判定 ⇒ 陈旧产物可假绿**:判定式逐字 = `JUDGE_LAZY = !NO_LAZY && (!NO_BUILD || has("--dist"))` ⇒ **`--no-build --dist <目录>` 让懒侧判定在「未被构建的既存产物」上执行**,而**脚本头注只警告了裸 `--no-build`**。⇒ 🔴 **一切懒侧读数必须同时登记 `app/dist` 的 mtime 与源码 sha;mtime 早于源码 ⇒ 该读数作废**(本批 P-37)。
59+
· 🔴 **`--dist` 换懒侧执行者 —— 裁定:本次不做(2026-09-13 · 控制方 §16.2)**:提议的形态 = 在 CI 的**「紧跟 `Build` 之后」**那个包体闸位置加 `--dist app/dist`(该处 dist 新鲜),让**懒侧守卫首次获得执行者**(补上上面那条「三处零执行者」的缺口);🔴 **裁「不做」的依据 = 跨构建环境字节漂移**:两次**不同环境**构建的**首屏**读数差 **+163 B**(真源字节口径)⇒ **同比例外推懒侧 ≈ 981 B**(若按四舍五入的 kB 口径则为 ≈ 1,023 B)⇒ **远超 64 B 容差** ⇒ **一旦挂上极可能恒红**(同族失效:**未模拟目标环境就挂门禁**)。
60+
· 🔴 **该对比是「非受控」的(受控对比纪律 · 本批 §17)**:两侧的**时点(源码内容)与环境(Node 版本 / 依赖安装方式 / 无 Actions 调度)都不相同** ⇒ **+163 B 里「源码内容差」与「构建环境差」不可分**,**不得**读成「环境漂移 = 163 B」;**同批的懒侧实测差也只是同量级的一小部分,方向与首屏相反** ⇒ **真值未知**。⇒ 🔴 **「跨构建环境字节漂移实测」是必要前置**(口径 = **源内容一致、仅环境不同**),不是可选优化;**任何 > 69 B 的向上漂移即红**(容差 64 B + 当时的余量),**据此重裁容差**前不得挂懒侧执行者。
61+
62+
· 🔴 **登记③(`Surface` 迁移的可见变化 → 像素面的未决项)**:**圆角就地 `6 → 8`**(9 处 = 6 处随原语 `radius="panel"` + 3 处就地改;计划面 254 处、其余 245 处维持现状)· **边框与近白底「冷灰 → 暖纸」** · **`boxShadow` 字面量换 token**(含 1 处有损:方向性边缘投影换双向环境投影)· **遮罩统一**(`0 0 0 9999px rgba(0,0,0,.45)` 由**巨扩散**充当,`--ed-shadow-*` 承载不了)· **弱化文本墨度对比度**(2.54:1 → 5.13:1)。🔴 **这些量级与形态在 `app/src/ui/primitives/` 的基线件与残留件里各有出处;本规范不重复登记数值** —— 🔴 **它们的真判据是像素面**(jsdom **不排版、不加载样式表**)⇒ **「有读数」≠「已统一」**(目标值是**设计决定**,不是规范能裁的)。
63+
· 🔴 **登记④(字号越界与弱化灰的存量 → 只许降的棘轮)**:**字号越界**(`< 12px` 六档)与**弱化灰**(`#9ca3af`)**都已有棘轮件**(**冻结常量 + 逐文件表 + 锚**三连通;各表**逐文件合计 == 冻结总数** 且 **锚的条目数 == 冻结文件数**,本次现场复核**自洽**)。⇒ 🔴 **新增或迁移的 UI 不得扩充这两族存量**(判据 = 沿既有棘轮收紧,**不是**按「看起来更统一」改观感)。🔴 **迁移真降一处时要手工同步「冻结总数 + 逐文件表 + 锚」三处**;**常数与逐文件表必须恰等**(不许把常数手工改成自洽)。
5264
- 🔴 **同批登记(不在本文件,仅互指)**:`scripts/check-exemption-prose.mjs`(批 7 T11 新建的**散文对拍探针**,112 行)**已入库但不入八闸 / CI / husky** ⇒ 登记为「**批 8 的候选闸**」(§C11.8 ③),并**同样进入上面那条 paths-filter 缺口名单**;落点见 [`line-limit-exemptions.md`](line-limit-exemptions.md) 的批 7 收口加注。
5365

5466
### 第二部分:测量与 Profiling

0 commit comments

Comments
 (0)