Skip to content

Commit b7fbb4a

Browse files
committed
docs(batch5): close out view layer readings
Spec: annotate 7.1/7.2/7.3/5.1/6.2/8.6/10/11-6/11-9/11-11/12/13/14 with batch 5 final readings (originals preserved, additions only). v0.22: add batch 5 section with the seven-part structure (31 commits, ad9d80d^..head). Plan: fill the eight closing sections of the write-back chapter. ADR-033 (1/4/registry) and ADR-034 (registry) annotations; no new ADR (ADR-035 still deferred to batch 6).
1 parent b4edf8e commit b7fbb4a

5 files changed

Lines changed: 483 additions & 0 deletions

‎docs/adr/ADR-033-l1-primitives-and-view-layer-contract.md‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ ADR-032 交付了 token 层(色阶 / 字阶 / z-index 标尺 / 图标),但
5151

5252
**本批全部 42 个文件逐个 ≤300 行(最大 297)**,无需行数豁免登记。
5353

54+
> **🔻 批 5 收口就地加注 · 导出面新增第 10 个原语 `ViewSwitcher`(C1 = C14①;2026-09-12,**上面原文一字未改**)**:
55+
> - **落点与形态**:`app/src/ui/primitives/ViewSwitcher.tsx`(**135 行**,预算 ≤150)+ `ViewSwitcher.css`(**63 行**,预算 ≤80)+ `ViewSwitcher.test.tsx`(**225 行 / 14 passed**);**已进 `ui/primitives/index.ts` barrel**(该文件 **45 → 48 行**,+2 导出 + 注释)**并在 `style-contract.test.ts` 的枚举里**(该文件 **233 → 296 行**;用例 **6 → 10**,**只新增枚举块 + 它自己的判据,`CONTRACTS` 的 12 条一字未动、删除行 = 0**)。
56+
> - **`--dur-micro` 接缝**:本原语覆盖 §8.6.1 第 3 条的**响应层接缝**(`--ed-dur-micro` = **120 ms**),**零行内 `style`**(W1–W3/W4 判据;W4 的形态按批 5 裁决 1 强化为「每段 `className` 逐字等于 `ed-btn ed-btn--segment`」+「根/段无 `style` 属性」,理由是 `aria-pressed` 是状态的**唯一权威**,再加状态类会造出第二份权威)。
57+
> - **⚠️ 上表「接缝与守卫」行的行数是批 0-D 时点值**:`index.ts` **45 → 48** · `style-contract.test.ts` **233 → 296**(`motion.css` **74** 不变 · `style-seams.test.ts` 287 · `motion-coverage.test.ts` 147)。⇒ 该行按本加注读;**本 ADR §1 的「9 类原语」口径不变**(`ViewSwitcher` 是**第 10 个**落地文件、属 §1 的「原语层第 10 类」延伸,不重排编号)。
58+
> - **首屏账(诚实代价,见 §4 的批 5 加注)**:`ViewSwitcher` 进 barrel 后**首屏 JS Δ = 0 B**、**CSS +604 B** —— 计划 C14① 的「首屏 Δ 不是 0」**被实测否证**(机理:rollup 把它 tree-shake 进懒 chunk)。
59+
> - **出处**:批 5 计划 §收口回写 §四(C14 行)· `tmp/t18/measurements.md` §9 C1。
60+
5461
### 2. 依赖方向:领域 → 视图 → 容器 → 原语,**禁止反向**
5562

5663
这是规格 §7.1 四部件依赖方向在原语层上的落法,也是本 ADR 的**核心约束**:
@@ -93,6 +100,13 @@ ADR-032 交付了 token 层(色阶 / 字阶 / z-index 标尺 / 图标),但
93100
> - 本条禁令(「调用点不得用行内 `style` 覆盖类的底/圆角/边框」)在批 0-D 落笔时**对真实代码是空真的** —— 当时全仓 `<Surface>` **0 个**。批 4 的 `69489f9f`(`refactor(ui): migrate card borders to surface`)**第一次真正使用 `Surface`**:14 个 `<Surface>` 开标签,机器判据(`surfaceRatchet.test.ts` ⑦)实测**覆盖命中 0**;同一提交把 `FROZEN_SURFACE_TAG_TOTAL` 由 **0 → 14**(T17-A 冻结的「零」是**故意的空真登记**,一迁移就会红)。⇒ 本条禁令**自 `69489f9f` 起有真实输入**。
94101
> - **已知边界(诚实登记,不得读成「判据完备」)**:⑦ 的文本级启发式只认 `style={{ … }}` **字面对象** ⇒ `style={S}` / `style={pick()}` 这类**间接写法是假阴**(写在 `overridesSurface()` 的文档注释里)。批 4 迁移的 14 处**全是直接形态**,故对本批读数无影响 —— 但**下游若用变量间接给 `style`,棘轮会漏**。
95102
> - **同源的两条原语缺口(批 4 实测,登记为 follow-up 而非本批动作)**:① `SurfaceProps` 无 DOM 属性透传(`onClick`/`id`/`aria-*`/`data-*`/`dangerouslySetInnerHTML`/`ref`)⇒ 至少挡住 3 处已点名 + 未来 21 处;② `Surface` 基类**必出底色**、无「只出边框」档 ⇒ 挡住 **28 处**透明边框容器。两条都属「批 5 与视图层一并裁」(B22 第 3 条)。
103+
>
104+
> **🔻 批 5 收口就地加注 · 类名命名空间(C2 = R-2)与上面两条 `Surface` 缺口的去向(D12)(2026-09-12,**上面全部原文与加注一字未改**)**:
105+
> - **R-2:`ViewSwitcher` 复用既有 `ed-btn` 基座命名空间** —— 容器 `.ed-btn-group` + 段 `.ed-btn--segment`(**段控件本质是成组的按钮**)。**这不是随手取名,是「既有断言 0 改动」的关键**:若另立 `.ed-switcher*` 命名空间,`motion-coverage.test.ts` 与 `style-seams.test.ts` 的**既有计数/名单会需要改动**;复用 `ed-btn` 后,批 5 对既有断言的改动数保持 **0**(唯一例外是 `style-contract.test.ts` 的**只增**枚举块)。
106+
> - **诚实代价(如实登记,不许省略)**:**语义折中** —— 一个「视图切换器」的类名落在**按钮**基座命名空间里;读到 `.ed-btn--segment` 的人会先以为是 `Button` 的一个档位。**换来的收益**:`Button` 的 `variant` 枚举与 `Button.css` **零改动**(C16 登记 2 的条件④逐字要求「若实现中发现必须改 `Button` 的 `variant` 枚举或 `Button.css` 语义 ⇒ STOP 报控制方」—— **实际未触发**)。**且 §4 的「行内 style 禁令」在本原语上是真的**:零行内 `style`(判据 W4 + `style-contract` ②)。
107+
> - **产物级前后对照锚(可复跑)**:字面量 `ed-btn--segment` 在**批 5 前的 dist 里 0 命中**(T1 台账逐字 `NOT-FOUND`,`tmp/t1/lazy-chunks.md:168`)⇒ 批 5 后命中 **`registry-C-RvXIfE.js`(懒 chunk)** ⇒ **该锚已从 0 变为命中** ✅。
108+
> - **上面两条 `Surface` 缺口(① DOM 属性透传 +3 处 · ② 透明容器 +28 处)→ 两条都转批 7**(D12 逐字)。理由:两条都是**原语能力扩展**(与本 ADR §1 的「只加属性级槽」同族,B16 先例),批 5 已有一个原语(`ViewSwitcher`)要新建;且 ② 若接受,`surfaceRatchet` 的两条冻结值**必须抬高**(「只许降」的棘轮倒退 ⇒ 需要一次显式裁决)。**读数**:`+3`(DOM 属性透传解锁的已点名处数)· **`+28`**(透明边框容器处数,来自 `task-4-report.md:208-212` 的分桶:边框 240 → 整圈 172 = 控件 96 · NM14 14 · 锚定菜单 4 · 交互 4 · 条件底色 4 · **透明容器 28** · 有底色容器 22)。
109+
> - **出处**:批 5 计划 §收口回写 §五/§七 · `tmp/t18/measurements.md` §9 C2 与 D6。
96110
97111
### 5. 动效接缝契约:`[data-phase]` 三态 + `usePresence` + 时长变量名
98112

@@ -310,6 +324,14 @@ z-index 的迁移纪律(0-A 交接第 3 条):**必须按叠放段整段推
310324
**TD-2026-09-11-AG**(`structuredBlocks.ts` 整模块无生产调用方)仍 open,属批 1/4。
311325
- 动效 token(`--ed-dur-*` / `--ed-ease`)的真源、GSAP、四层动效与三档强度:**批 6**。
312326

327+
> **🔻 批 5 收口就地加注 · 「视图层契约」在批 5 的落地与未做项(C3 = C4 = D4;2026-09-12,**上面原文一字未改**)**:
328+
> - **本 ADR 标题里的「视图层契约」在批 5 第一次有真实载体**:`app/src/views/registry.ts`(`ViewSpec` + `load` + `viewsFor`,**109 行**)· `app/src/views/useViewMemory.ts`(**70 行**,顶格)· 会话 5 视图 + 笔记 2 视图 · 两个宿主(`session-detail/SessionViewHost.tsx` **136 行** / `notes/NotesReadingColumn.tsx` **290 行**)· 守卫 `views/architecture.guard.test.ts`(**260 行 / 17 用例**)+ `views/architecture.slots.test.ts`(**100 行 / 2 用例**)。**§2 的依赖方向**由 A1/A2/A3 三组判据守住(`views/**` 首屏可达 0 · 注册表运行时导入者恰 2 · `views/**` 对 `@tauri-apps` 裸 0/声明级 0,阳性对照双侧命中)。
329+
> - **编辑态切视图的 `flushSave` 契约(本 ADR §1 的 `StatusLine` 与 §7 的「不用第二套机制」同向)**:`catch` ⇒ **不切视图 + 保持编辑态 + 就近渲染一行 `StatusLine kind="error"`**(**不用 toast** —— 它已登记 `belowNav` 堆叠缺陷,且就近提示 `role="alert"` 可测)。判据 **F1–F4**(`NotesReadingColumn.views.test.tsx` **11/11 passed**),**F4 断言「阻断全过程 0 个 toast 节点」并证明选择器有牙**;反向对照 **T14-M1**(把 `catch` 改成继续切换)⇒ **唯一红 = F1**。
330+
> - **显式登记未做(两条,各自带归属)**:① **不改接口** —— `flushSave` 的返回类型**未升级**为 `Promise<boolean>`(`NoteEditHandle` 原样)⇒ **批 8 接口卫生**;② **`RichEditorView` 内的 Ctrl+E / 完成按钮路径仍不阻断**(今天就是 fire-and-forget,**不是本批引入的回归**,C4② 逐字禁止顺手扩大面)⇒ 批 8。另:`RichEditorView` 内部若要显示保存错误**做不到**(它自带 `status` state 保持原样)⇒ 批 7/8。
331+
> - **行数代价**:`components/notes/NotesReadingColumn.tsx` **166 → 290 行**(预算 ≤260 ⇒ **超 30,已登记**;口径:**预算是估算,绑定约束是 ≤300 + 零新增豁免登记**)。
332+
> - **ADR-035 的归属不变**:**L4 动效纲领与引擎仍顺延批 6**;**批 5 未新增任何 ADR**(`docs/adr/` 实盘最高仍是 ADR-034,`docs/adr/README.md` 索引本批零改动)。
333+
> - **出处**:批 5 计划 §收口回写 §四/§七 · `tmp/t18/measurements.md` §9 C3 与 D6。
334+
313335
## 相关决策
314336

315337
- [ADR-032](./ADR-032-frontend-design-system-tokens.md):前端设计系统与 token 层落地(本 ADR 的前置)

‎docs/adr/ADR-034-l2-shell-navigation-and-column-contract.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,13 @@
127127
> - **注册位置**:批 4 计划 §收口回写 §七 follow-ups(逐条具名归属)· `docs/versions/v0.22.md` 批 4 节「未做登记」。
128128
- 批 4 从本 ADR 接手的壳层残留:`shell/CommandPalette.tsx`(自建遮罩/Esc/焦点 → `Modal`)· `shell/ShellFallback.tsx`(→ `Loading`/`StatusLine`)· `App.tsx` 的 AI toast(→ `Toast`)· `App.tsx` 对话面板的裸 `zIndex: 900`(→ `panel`)——**逐条见批 4 计划的任务总表**。
129129

130+
> **🔻 加注⑧ · 批 5 的处置结果(C4 = C13;2026-09-12,**上一节与加注④/⑦ 的原文一字未改**)—— 上面 `:115` 那两条的**最终归属与结果**:
131+
> - **「会话详情头改粘性」→ ✅ 批 5 已做**(控制方 C13 走 (b))。落点 = `app/src/components/session-detail/SessionDetailHeader.tsx`,**161 → 176 行**(预算 ≤180);形态 = `position: sticky` + `top: var(--ed-space-4)`(= **4 px**)+ `zIndex("raised")`(= **10**,走本 ADR §6 的六档标尺,**不写裸值**);**先补 1 条行为级判据**(该文件此前无同名测试):`SessionDetailHeader.test.tsx` **9 passed**(改前 **5 passed / 4 failed** ⇒ 改后 **9/9**)。
132+
> - ⚠️ **真实粘性不可验(诚实登记)**:**jsdom 测不出真实粘性**(无布局引擎)⇒ 判据形态只能是**静态结构级**(`position: sticky` ∧ `top` 来自 token)+ 祖先链核验;**真实滚动下的粘性行为归批 8 的真机/像素 pass**。**不得**把本行读成「粘性已验证」。
133+
> - **「笔记工具栏三层合并为单行」→ 批 5 未做,转批 8**(C13 逐字;理由:要动 `NotesPage.tsx`(拆件后 **288/300**)+ `NoteListView.tsx`(241)+ **`app/src/components/NoteListToolbar.tsx`(95)** 三个**无测试面**文件,投入产出比最差)。⚠️ **文件名更正(F-3)**:真身是 `NoteListToolbar.tsx`,**不是** `NotesListToolbar.tsx`(C16 的事实更正,记控制方账上)。规格 §6.2 已就地加注同一条去向。
134+
> - **本 ADR §2(列契约)与 §3(断点)在批 5 零动作**:批 5 只动 `columnsOf(page)` 的**消费侧之外**(视图层),`shell/` 五个模块与两条既有守卫(`shellReset.test.ts` / `columnKeys.freeze.test.ts`)**零 diff**。**本 ADR 的结论一字未改。**
135+
> - **出处**:批 5 计划 §收口回写 §四(C13 行)/§七 · `tmp/t18/measurements.md` §9 C4。
136+
130137
## 加注⑤ · 本次新增的两条守卫 + T0 报告 §四 五条建议的登记(2026-09-12 批 4 前置单元)
131138

132139
> 口径:本 ADR 的**登记**类条目(上一节 §登记 及其 `:115` 加注④)一律**不代控制方裁决**是否采纳、也不代定去向;本节的五条建议同理 —— **只登记 + 注明待承接单元**。

0 commit comments

Comments
 (0)