Skip to content

Commit 681e73c

Browse files
committed
docs(batch6): 回写收口终态与归组对拍
1 parent 7d6d677 commit 681e73c

3 files changed

Lines changed: 20 additions & 0 deletions

File tree

‎docs/adr/ADR-035-l4-motion-grammar-and-engine.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ export { gsap, useGSAP };
189189
> - **两条硬边(后续任务必读)**:① **`app/src/App.tsx` 已到 599 / 600(余 1)** ⇒ **任何后续任务不许动 `App.tsx`**(必须动 ⇒ 先拆件);② `views/session/SessionTriTrackView.tsx` **295 / 300** · `shell/TopBar.test.tsx` **298 / 300** · `ui/primitives/style-seams.test.ts` **299 / 300** ⇒ 追加前必须先拆(T34 §9 的「余 ≤5」清单共 22 个文件)。
190190
> - **本批新增登记(逐条带去向)**:`aligned` 残余 **D3–D6**(量级未实测)→ 批 7/8 · **导入会话无音频承载面** → 产品裁决 · **跨窗口档位/相位同步** → 批 7/8 · **孤儿 sidecar + 删会话不删音频** → 与导入会话一并裁决 · **`[[ts:ms]]` 的会话页那一跳**(T26 只修了 `NoteMarkdown` 那一半;`NotePreviewView` + `utils/html.ts:32` 的芯片**同样无点击**,**未修**)→ **批 7 首要候选** · **`lowConfidenceClass` 从 `structuredBlocks.ts` 析出轻模块** + **懒侧字节纳入门禁**(`katex@0.18.4` 第二份副本 = **+227,858 B 原始 / +64,497 gzip**,懒侧今天**零预算**)→ **批 7/8** · **`ink-4` / 审校模式** → 批 7/8 · **暗档 `data-theme` 接线** → 批 7/8 · **「对齐」的错位语义**(R5.1 定义,**用户可否决**)→ 产品裁决。
191191
> - **波 D 的标签清扫(comment-only,「标签不许说谎」)**:R40.2 点名的清单**在本批只登记、未执行**(它涉及 `app/**` 源码注释 ⇒ **属生产代码面**,T35 零生产代码 ⇒ 移交后续单元)。收口时的**在场清单**(探针读数,2026-09-13)逐条:① 已过期(事件已发生)—— `ui/primitives/Modal.css:15` · `ui/primitives/Toast.css:16-17` · `ui/primitives/StatusLine.test.tsx:239`(三处逐字「批 6 的动效 token 真源落地后删掉 `motion.css` 的变量块**即生效**」)· `ui/primitives/ViewSwitcher.css:24-25`(「批 6 的三档强度/双基调/GSAP 不在本文件」)· **`shell/kbCommands.ts:15`(「`check-command-registry.mjs` 的 **312/312**」—— 实测已是 **313/313/0**)** · **`ui/tokens.gen.ts:83-85`(「今日 **0 生产消费者**,波 C 首次消费」—— 三个时长 token 今天均有消费点)** · **`motion/tone.test.ts:23`(「今日 `app/src` 生产代码里 `data-tone` 仍 **0 命中**」—— 实测已有多处生产命中)**;② 前向引用(届时自证伪)—— `views/session/SessionProofView.tsx:56` · `views/session/SessionTriTrackView.tsx:59` · `components/session-detail/SessionRawView.tsx:42` · `ui/primitives/textBaseline.ts:9`;③ **假 warn(最要紧的一条)** —— `motion/engine.guard.test.ts:19` 与 `:222`/`:226-227` 的用例名与 `console.warn` 仍写「**今天源图未到达 GSAP ⇒ 存在性分支未运行**」,而 **T34 的真实构建证明源图已到达**(产物有 `vendor-gsap-BQLVn3Z6.js`、该件复跑 11/11)⇒ **它现在说的是假话**;④ **过宽措辞** —— `motion/controls.ts:22-27` 的「本模块**只许经 `await import()` 到达**」(正确表述见「决策 3」的收口加注);⑤ **不算说谎** —— `ui/primitives/EmptyState.tsx:9-16`(登记面,非承诺)。**本批不做**(零生产代码),**去向 = 下一个动效/治理单元**。
192+
> - 🔻 **T36 回写(2026-09-13,上一条原文一字未改)**:🔴 **该「标签清扫」已在本批内执行 —— 上面「只登记、未执行」按过去时读**。三个 **comment-only** 微单元(授权见 `rulings.md` §六十四 R64.1 / §六十五 / §六十六 R66.3 / R66.4):**T35b** `9c1f615c`(**6 文件 / +36 −22**)关闭「已过期 / 假 warn / 过宽措辞」三类共 5 处(`kbCommands.ts:15` → 313/313/0 · `tokens.gen.ts:83-85` → `card` 6 处 / `reveal` 7 处 · `tone.test.ts:23` → 4 处 `data-tone` · **`engine.guard.test.ts` 4 处**含**用例名**与 `console.warn` ⇒ 存在性断言真跑 · `controls.ts` 两处 → R60.1 精确口径)· **T35c** `04dc9de2`(**8 文件 / +38 −18**)关闭 A 组 7 行过宽措辞 + B 组 3 处前向引用(`ViewSwitcher.css:25` · `SessionProofView.tsx:55-56` · `SessionRawView.tsx:42`)· **T35d** `7d6d677b`(**2 文件 / +10 −3**)关闭 `SessionTriTrackView.tsx:59` 的悬空承诺与 `engine.ts:30-31` 的过宽绝对句。三件的门禁读数(`line-limits --full` 0 · `docs-check` 0 · registry 313/313/0 · `tsc` 0 错 · vitest 221 文件 / 2132 用例 / 0 失败 · 单跑 `engine.guard.test.ts` 11/11)逐条见各报告;**T36 独立复跑** `line-limits` / `docs-check` / registry / `engine.guard` 单跑 / `cargo test` **均同读数**(见 `task-36-report.md` §3.2)。
193+
> - ⇒ 🔴 **唯一未改项(判为「不算说谎」而只登记)**:两处**测试名**仍留旧措辞 —— `components/session-detail/useRevealChoreography.test.tsx:283` · `views/session/useTriTrackAlign.test.tsx:279`(R66.3 #3:名字描述的就是断言本身、且断言仍为真)。上面「在场清单」的逐条读数**是清扫前(T35 当时)的快照**,**保留作对照**。
192194
193195
## 相关决策
194196

‎docs/standards/motion.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
- **为什么必须注册**(测试底座独有的事实):`gsap` 的 `exports["."]` 把 `import → index.js`(ESM)与 `require → dist/gsap.js`(CJS)分成**两个物理文件**,而 `@gsap/react@2.1.2` 无 `exports`、`main` 指 CJS ⇒ Vitest external 后 `@gsap/react` 拿到 **CJS 运行时**、应用拿到 **ESM 运行时**,两个 `_context` ⇒ `context.revert()` **静默空转、无任何警告**。实测:未注册时 StrictMode 下 **2 个 tween**、卸载后 `transform` 残留;注册后 **1 个 tween**、卸载后 `transform=""`。**浏览器构建不受影响**(Vite 认 `module` 字段)。
6363
- **懒加载边界**:`app/src/**` 中**静态** import `gsap` / `@gsap/react` 的文件集合 ∩ **首屏静态可达闭包 = ∅**(结构性判据,不用易腐化的白名单)。连带:需要 `useGSAP` 的组件**自身必须位于动态 import 链上**(首屏静态页里的 GSAP 动画要抽成 `React.lazy` 子件)。
6464
- 🔴 **`app/src/motion/controls.ts` 的适用面(T35 补 · R41.3 经 R61 重述)**:**不许从「首屏静态可达」的模块静态 import `controls.ts`**(它内部静态 `import { gsap } from "./engine"`)⇒ **惰性视图(`React.lazy` / 注册表驱动)静态 import 它是安全的**。⚠️ 该文件头今天仍写着一句**过宽**的绝对规则(「本模块只许经 `await import()` 到达」)—— **属波 D 标签清扫的待改项**(改它 = 改 `app/**` 源码注释,**不在 T35 的零生产代码面内**,只登记)。
65+
- 🔻 **T36 回写(2026-09-13,上面那句一字未改)**:该**待改项已关闭**。`app/src/motion/controls.ts` 的头注(`:22-32`)已由 **T35b**(`9c1f615c`)改成上面这条精确口径;`app/src/motion/engine.ts:30-36` 已由 **T35d**(`7d6d677b`)改成**同一条口径**(该行原文「本模块只能经 `await import()` 到达」是过宽绝对句 —— `motion/controls.ts:49` 今天就静态引入它,而该件 ∉ 首屏静态闭包 ⇒ 守卫绿)。⇒ 上面那句「今天仍写着…待改项」**按 2026-09-13 T35b 之前的过去时读**。**依据**:`task-35b-report.md` §1 与 `task-35d-report.md` §1;两处的闭包不变式终态 **89 / 333**(T35d 工作树 + 提交树各测一次)。
6566
- **插件静默退化**:未 `registerPlugin(CustomEase)` 时 `gsap.parseEase("自定义名")` 返回 `undefined`(只有一条 stderr 警告),动画**照跑**(走默认 ease)⇒ 依赖自定义 ease 的判据必须先断 `typeof parseEase(name) === "function"`。
6667

6768
**token 真源与位移上限**:

‎docs/versions/v0.22.md‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,13 @@
625625
| + | (附)**`[[ts:ms]]` 端到端** | **只通一半** | 笔记侧已接 ms;**会话页那一跳未交付** ⇒ 批 7 首要候选 | 🟡 |
626626
| + | (附)E4 的后端契约面 | `session_audio_path` 已注册 | registry **313 / 313 / 0** | ✅ |
627627

628+
> 🔻 **T36 收口回写(2026-09-13,上表原文一字未改)** —— **最终兑现度表(10 行)的落点 = `.superpowers/sdd/2026-09-12-frontend-redesign-batch6-motion/task-36-report.md`**(gitignored;本节不复制,避免第二份会漂的手抄副本)。
629+
> - 🔴 **验收面 = 10 个**(R64 #4 的更正:R0.1 正文写「9 个」而列举是 6 + 1 + 3 ⇒ 按 **10** 读;**别处若仍写「9 项」按此加注读**)。
630+
> - 🔴 **上表是 T34 在冻结提交 `975b3285` 上的中间读数**;波 D 的 **T35b / T35c / T35d** 三个 comment-only 微单元改了 `app/**` 的注释行 ⇒ **四个行号在终态(`7d6d677b`)漂移 1–2 行**,按终态读:`#1 对齐` `views/session/SessionTriTrackView.tsx:251 → :253` · `#2 显影编排` `components/session-detail/SessionRawView.tsx:96 → :97` · `承载面③ 时间轨/播放头` `SessionTriTrackView.tsx:275 → :277` · `环境层第 3 件` `SessionRawView.tsx:137 → :138`。**其余行号由 T36 逐条复测不变**(`LiveBar.tsx:90` · `LiveBar.tsx:135` · `PhaseChrome.tsx:102` · `App.tsx:394` · `phaseSource.ts:84` · `TimeRail.tsx:140` · `TimeRail.tsx:220` · `ReviewPage.tsx:178` · `ReviewSessionPanel.tsx:98` / `:102` · `ChatSidebar.tsx:80` · `GoalsPage.tsx:42`)。
631+
> - 🔴 **两处口径须并读(T36 点名的分叉)**:规格 §10 的批 6 收口行把 6 个签名动效写成「**6/6 各有 ≥1 生产调用点**、唯一缺口 = #2 的反向/重播入口 = 0」—— 该句**只**点 #2;**#5 时间码回跳同样是部分交付**(**落位 + ≤8px 掠过**已交付,**长距离连续滑动补间未交付** ⇒ 见上表第 5 行与 `task-31-report.md:137`)。⇒ **两处并读**:#2 的缺口是「入口 = 0」,#5 的缺口是「补间形态只交付一半」。**均以 T36 的最终表为准**(T35 §7-6 已声明「若分叉以 T36 为准」)。
632+
> - 🔴 **终态补记两条**:① **`--ed-dur-page` 今天 0 生产消费者**(T35b 实测:全仓只有 `ui/tokens.css:89` 的定义与 `ui/tokens.gen.ts:114` 的生成物条目,**零消费方**;控制方引述错误第 7 例)⇒ **去向批 7/8 或删除**(不发明消费者)。② **`docs/tech-debt/` 造成的 `docs-check` 差值已由 T36 直接测实**:`docs/**` 磁盘 **280** 个 `.md` / 入库 **279** ⇒ 唯一未入库件 = `docs/tech-debt/review-2026-09-11.md`(**191,980 B / 1555 行**,未入库且未被 ignore)—— 这**闭合**了 T35c/T35d 记为「强推断」的那条归因。
633+
> - 🔴 **环境层 4 件的终态口径(R11.3「落 seam 不算已交付」)**:① 探针摆动 **1**(`ui/primitives/Loading.tsx:64`)· ② 采集脉冲 **1**(`shell/LiveBar.tsx:105`)· ③ 未确认段落墨度 **1 / 要求 ≥2 ⇒ 未达成**(`components/session-detail/SessionRawView.tsx:138`;**不得**用 T13 的 seam 充数)· ④ 到期刻度微光 **1**(`components/review/DueScale.tsx:120`)。⚠️ 另:**`rich` 档的「幅度提高」未机械兑现**(只兑现**频率**)⇒ **不得**写成「三档全兑现」。
634+
628635
**三条硬约束(R0.1 第 1 条)的判据与读数**:① **规格 §3 就地加注** = 本批提交(E3/E4/E5 三行 + 四列齐备 + 回滚逐字)· ② **`ADR-035` 单列「后端契约例外」节** = T2 建、**T35 定稿回填**(五项读数:313/313/0 · sidecar 键名 · `aligned` 语义 · `MAX_GAP_MS` = 10 min · `cargo test` 逐字)· ③ 🔴 **`cargo test --test app_lib_tests` 本批真跑**(**不是**「沿用基线读数」):`running 2335 tests` → **`test result: ok. 2329 passed; 0 failed; 6 ignored`**,**exit 0**。
629636

630637
**八门禁终态(`HEAD = 975b3285` · 真实构建产出 `app/dist` mtime 2026-09-13T05:10:24.838+08:00)**
@@ -674,12 +681,17 @@
674681
- 🔴 **`[[ts:ms]]` 的芯片在修之前是死的**(回链整条不可达)—— T26 修掉了这个**真实缺陷**(`NoteMarkdown` 一半);`NotePreviewView` + `utils/html.ts:32` 的**另一半未修**(批 7 候选)· **定位精度残余 = 块粒度 ±200 ms**(写块周期 200 ms)。
675682
- 🔴 **`katex@0.18.4` 的第二份副本进产物**(T28 让 `structuredBlocks.ts` 首次进图)⇒ **+227,858 B 原始 / +64,497 gzip**,而**懒侧今天没有任何预算门禁** ⇒ 登记两条**批 7/8 候选**:「把 `lowConfidenceClass` 析出轻模块」+「**懒侧字节纳入门禁**」。
676683
- **行数 / 结构代价**:`App.tsx` **599 / 600(余 1)** ⇒ **任何后续任务不许动它**(硬边)· `motion.css` **335 行**(6 次追加,越过 R11.8 的 ≤300 自律线;`.css` 不在门禁 `SOURCE_EXT` 视野内)· `style-seams.test.ts` **299** · `views/session/SessionTriTrackView.tsx` **295** · `shell/TopBar.test.tsx` **298**(**余 ≤5 的共 22 个文件**,T34 §9 列全)。
684+
- 🔻 **T36 回写(2026-09-13,上面这句原文一字未改)**:`views/session/SessionTriTrackView.tsx` 的 **295 是 T34 的冻结读数**;**T35d**(`7d6d677b`)为把「长列表的滚动/密度手感见批 6」这句**悬空承诺**改成如实未交付而净 **+2** ⇒ **终态 = 297 / 300(余 3)**(同提交 `motion/engine.ts` **75 → 80**)。**T36 在终态(`7d6d677b`)逐条复测**:`App.tsx` **599** ✅ · `motion.css` **335** ✅ · `style-seams.test.ts` **299** ✅ · `shell/TopBar.test.tsx` **298** ✅(口径 = `countLines()`);**余 ≤5 的成员集不变 = 上列 22 个**(`app/src` **572** 个文件中 295–300 行者 **23** 个,去掉 T34 口径排除的 `ui/primitives/dialogMigration.e.test.ts` **300** 后仍是 **22**)。
677685
- **流程代价**:每次真实构建都要**人工取锁**(`check-bundle-budget.mjs` **无锁机制**;取锁协议是人工约定)· `docs/tech-debt/`(191,980 B)**全程占着 `git status`**(唯一脏项,待用户裁决)· 1 条新 IPC 与 3 项后端**只读**改动(`live_session*.rs` 触发 AGENTS.md §10 额外审查记录)。
678686

679687
**未做(登记,逐条带归属批次)**
680688

681689
`docs/product/ui-ux-system.md` / `theme.md` 的**四层动效 / 三档强度回写** → **批 8**(§14 逐字仍留批 8;本节「规格漂移纠正」只做消歧)· **`ink-4` 接线 / 「审校模式」** → **批 7/8** · **`Text` 字号越界 551 处 / 120 文件** → **批 8**(本批只保证新代码不新增)· **暗档 `data-theme` 接线** → **批 7/8** · **跨窗口档位 / 相位同步** → **批 7/8** · **导入会话的音频承载面** → **产品裁决** · **删会话不删音频 + 孤儿 sidecar** → **产品裁决** · **`aligned` 残余 D3–D6** → **批 7/8** · **`[[ts:ms]]` 的会话页那一跳** → **批 7 首要候选**(T26 的逐行成本与 patch 落点保留在 `task-26-report.md`)· **`lowConfidenceClass` 析出轻模块 + 懒侧字节门禁** → **批 7/8** · **波 D 的一次性「标签清扫」**(comment-only;**涉及 `app/**` 源码注释 ⇒ 属生产代码面,本批只登记**:已过期 4 处 + `kbCommands.ts:15` 的 312/312 + `tokens.gen.ts:83-85` 的「0 生产消费者」+ `tone.test.ts:23` 的「`data-tone` 0 命中」· 前向引用 4 处 · **`engine.guard.test.ts` ① 的假 `console.warn`** · `controls.ts` 的过宽措辞)→ **下一个动效 / 治理单元** · **五类棘轮余量 + `FROZEN_NUMERIC_ZINDEX` + `bundle-eager-graph` 的 `import type` 口径** → **批 5/7/8**(照原表)· **`ADR-019` 缺号** → **只登记、不补** · **`docs/tech-debt/`** → **用户裁决** · **`Flip` 的 `width`/`height` 与属性集合判据的冲突** → **批 7/8 与判据纪律** · **`hook` 无 unmount 清理**(时间线在卸载后仍存活)→ **批 7/8** · **真机 / WebView2 验收** → **批 8**(不得出现「已真机确认」类表述)。
682690

691+
> 🔻 **T36 回写(2026-09-13,上面这一整段原文一字未改)** —— **两处已在本批内关闭,不再是「未做」**:
692+
> - 🔴 **「波 D 的一次性标签清扫」已执行**:**T35b** `9c1f615c`(6 文件 / +36 −22)+ **T35c** `04dc9de2`(8 文件 / +38 −18)+ **T35d** `7d6d677b`(2 文件 / +10 −3)= **16 个 `app/**` 文件 / 合计 +84 −43**(实测 `git diff --shortstat 975b3285..HEAD -- app/`),**上面逐条点名的源码注释项全部封闭**(含 `kbCommands.ts:15` 的 312/312 → **313/313/0** · `tokens.gen.ts:83-85` 的「0 生产消费者」→ `card` **6** / `reveal` **7** · `tone.test.ts:23` → **4 处** `data-tone` · `engine.guard.test.ts` 的**假 warn**(用例名 + `console.warn` 两段)· `controls.ts` 的过宽措辞)。🔴 **唯一未改 = R66.3 #3 判为「不算说谎」的两处测试名**(`components/session-detail/useRevealChoreography.test.tsx:283` · `views/session/useTriTrackAlign.test.tsx:279`)⇒ **只登记**。⇒ 本条**去向**随之收敛为「**下一个动效 / 治理单元**」仅指那两处测试名。
693+
> - 🔴 **`--ed-dur-page` = 0 生产消费者**(T35b 实测)⇒ **去向批 7/8 或删除**(控制方引述错误第 7 例;T36 独立复现同读数)。
694+
683695
**提交清单(77 个,`ac504b06^..975b3285`;归组依据 = 逐提交 `git show --name-only` 的改动面 + subject,探针 `tmp/t35/commits.mjs`)**
684696

685697
| 归属 | 提交数 | sha(按时间序) |
@@ -723,6 +735,11 @@
723735

724736
> **注**:⚠️ **微单元的归属按「改动面」判定**(例如 `17e96fe1 chore(line-limits)` 删的是 `usePhaseFreeze.test.tsx` 的登记行 ⇒ 归 T29;`5467a91c` 改的是 `responseSeams.test.ts` 的缓动名与 `!important` 口径 ⇒ 归 T13b 的 5 处小修)。🔴 **权威的逐任务提交轨迹由 T36 的收口评审给出**(批 6 计划 §收口回写 §3);本表**不含** T35 本节所在的提交与 T36 的后续提交(自引用)。
725737
738+
> 🔻 **T36 的归组对拍(2026-09-13,独立复核;上表原文一字未改)** —— T35 §7-5 把「77 条提交的任务归组」列为**未能验证**,R64.2 #3 判「权威轨迹留 T36」;**T36 用 `git log --pretty=format:%h%x09%s` 逐条对拍,结论 = 上表成立**:
739+
> - 🔴 **区间与计数**:上表 **77** 的区间是 `ac504b06^..975b3285`(**只到冻结提交**);批 6 的**终态提交数 = 84**(实测 `git rev-list --count ac504b06^..HEAD` = **84**)= 上表 77 + **T35 的 4 个**(`b3f2181f` · `323acb58` · `c7ef9ca4` · `e719894f`)+ **T35b / T35c / T35d 各 1 个**(`9c1f615c` · `04dc9de2` · `7d6d677b`)。**T36 本节自身的提交不计入(自引用)**。
740+
> - ✅ **0 个幻影 sha**:上表 **77 个 sha 逐条存在于 `git log`**(`git log --pretty=format:%h 6cbe964e..HEAD` 的 84 条里 77 命中、0 缺失)· **36 行的「提交数」格与并列 sha 数逐行相等(mismatches = 0)** · 微单元归属抽查 8 条(`17e96fe1` → T29 · `5467a91c` → T13b · `160d5936` → T28 · `1cc35346` → T19 · `92d83623` → T5 · `32effc92` → T12 · `0ea19a78` → T25 · `7d63a1bf` → T29)**逐条与 `--numstat` 的改动面一致**。
741+
> - ⚠️ **唯一一类差异(不是归属错误)**:**9 个父任务报告从不引用自己的微单元提交**(T1 `b508c5e5` · T3 `5ecfe1f7`/`a9cf152a` · T6 `c9f89692` · T8 `b0ab516b` · T9 `dd48d933`/`1935dd2c`/`17a8b8c3` · T10 `9508c5dd` · T11 `6d10a2db` · T12 `32effc92` · T14 `a50a3449`/`4dc32808`/`19a2a953` · T20 `6268f34d`)—— 它们的旧/新原文记录在**兄弟报告**里(`task-1-fix` / `task-6b` / `task-8b` / `task-9b` / `task-13b` / `task-14b` / `task-14c` / `task-20b`)。⇒ **归组本身无需更正**;**读者须知「任务 = 报告集合」而不是「任务 = 单个报告」**(T36 逐条差异表见 `task-36-report.md` §3.3)。
742+
726743
### 批 0 其余部分(未落地)
727744

728745
规格 §10 的批 0 还包含:**ADR-033~035**(当前 `docs/adr/` 最高为 ADR-032)· 豁免表纠偏 · 拆 4 个 >600 行文件 · 原语三层。**这些不在 0-A / 0-B 范围内**,后续子批次另行立计划。

0 commit comments

Comments
 (0)