docs(tasks): home first load — add first-screen JS diet and early boot requests (BUG-1130, BUG-1127)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
1810f1a81f
commit
5ea36d0f21
+16
-2
@@ -15048,12 +15048,12 @@
|
||||
|
||||
## BUG-1127 | 首页冷启动接口串行四轮,「正在载入账户」等得久
|
||||
|
||||
- 状态:investigating(根因已测量确认;待执行,任务书 `docs/tasks/TASK-home-first-load-20260930.md` T1)
|
||||
- 状态:investigating(根因已测量确认;待执行,任务书 `docs/tasks/TASK-home-first-load-20260930.md` T1、T8)
|
||||
- 首次发现 / 最近更新:2026-09-30 / 2026-09-30
|
||||
- 影响面:`frontend/src/lib/session-list-context.tsx`(`loadSessionList`)、`(app)/page.tsx` 取校正入口摘要的 effect。
|
||||
- 现象:真机进站长时间停在「正在载入账户」。
|
||||
- 触发条件:新开页面的冷启动(暖快照 BUG-1040 只在同一文档内生效)。
|
||||
- 根因:账户 → 人物目录 → 会话列表 → 校正入口摘要依次等待,其中只有「会话列表要知道当前人物」是真依赖。Claude 在 staging 线上页面用 CDP 给接口统一加 600 ms 延迟实测:从首个接口到揭幕共 4 轮串行,约 2.5 s。
|
||||
- 根因:账户 → 人物目录 → 会话列表 → 校正入口摘要依次等待,其中只有「会话列表要知道当前人物」是真依赖。Claude 在 staging 线上页面用 CDP 给接口统一加 600 ms 延迟实测:从首个接口到揭幕共 4 轮串行,约 2.5 s。另外,这些请求要等全部首屏 JS 执行完才开始发,DOMContentLoaded 后约 1 秒没有任何可并行的网络请求(2026-09-30 追加,任务书 T8)。
|
||||
- 修复:待执行。
|
||||
- 验证:待执行。
|
||||
- 防复发:待执行后补。
|
||||
@@ -15087,3 +15087,17 @@
|
||||
- 防复发:待执行后补。
|
||||
- 相关记录:BUG-737、BUG-1128
|
||||
- 修复版本:—
|
||||
|
||||
## BUG-1130 | 首页首屏 JS 带着首屏用不到的模块(全国城市表、校正代码、研究数据等)
|
||||
|
||||
- 状态:investigating(待执行,任务书 `docs/tasks/TASK-home-first-load-20260930.md` T7)
|
||||
- 首次发现 / 最近更新:2026-09-30 / 2026-09-30
|
||||
- 影响面:`frontend/src/data/china-locations.*` 及以值方式导入它的 `src/lib/home-types.ts`、`global-birth-payloads.ts`、`birth-rectification-payload.ts` 等;首页首屏 chunk。
|
||||
- 现象:进站等待长的原因之一,首屏 JS 约 520 KB(brotli,不含 `noModule` 补丁)。
|
||||
- 触发条件:任何冷启动。
|
||||
- 根因:Claude 用 source map 构建按来源统计首屏 JS:全国城市表 `china-locations.json`(brotli 47 KB,实测)经 `home-types.ts` 等以值导入进入首屏;约 20 KB 的校正研究封存评测 JSON 进入首屏;首屏还带着校正 / 生时录入代码(未压缩约 226 KB)、`react-day-picker` + `date-fns`(约 94 KB)、markdown 渲染(约 80 KB),而空白首页用不到这些。估计合计可以挪走约 150 KB(brotli),约占首屏三成。
|
||||
- 修复:待执行。
|
||||
- 验证:待执行。
|
||||
- 防复发:待执行后补。
|
||||
- 相关记录:BUG-1127、BUG-1128
|
||||
- 修复版本:—
|
||||
|
||||
@@ -383,7 +383,7 @@
|
||||
| `TASK-rectification-midnight-date-anchor-20260920.md` | `PROGRESS-rectification-midnight-date-anchor-20260920.md` | **跨午夜的日期锚点与簇跨度(BUG-982 + BUG-983 合并一单)**:两条同根——线上契约只传钟点、日期不在契约里,后端按钟点大小**猜**哪端跨日。**BUG-983 是静默算错盘**:`_candidate_datetimes()` 把起始钟点无条件绑在申报日期上,前端零补偿。Claude 实测(申报日 2000-06-15):申报 `00:10` → 候选 `06-15 23:55`…`06-16 00:25`,**申报分钟本身落在 `06-16 00:10`,+1 天**;`00:02` 同样 +1 天;`12:00` 对照正确。受影响:申报落在午夜后半径内者(±15≈1.0%、±30≈2.1%、±60≈4.2%、±120≈8.3%);`late_night`(23:00–03:59) 更重,其 `00:00`–`03:59` 共 240 分钟**全部落在用户没申报过的日期上**。**BUG-982 影响面比原记录大**:同缺陷在链路上出现三处(`_cluster_span` / `unionStillValidRange` / `indistinguishableWidthMinutes`),原记录只写了 Python 两处。实测跨午夜簇 `23:58/23:59/00:00` 报告宽度 **1440 分钟**(真实 3)、`23:50/23:55/00:05` 报 **1431**(真实 16);该链经 `reportWidth` 直达 **交付卡「范围 X 分钟」**,深夜用户会看到候选其实差几分钟却被告知范围一千多分钟。**与 BUG-981 的关系**:981 让每个候选按自己日期算 Dasha 是对的,但 983 给的日期本身就错,**983 不修则 981 在申报近午夜的场景等于没上线**。**产品 2026-09-20 三点全部拍板**:D1 `late_night` **先问用户「午夜前还是午夜后」,答不上退「同日两段」`[D 00:00–03:59] ∪ [D 23:00–23:59]`,一律不得跨到 `D+1`**(连锁范围:退路产生**不连续候选集**,枚举/聚类/簇跨度/交付区间/宽度/交付卡都要支持两段,**不得用「取两段最小到最大」糊成一段**——那正是 982 的同型错误);D2 **允许窗口跨到前一天**,但交付层必须说明「若落在 23:5x 则出生日期是前一天」,不得静默改用户的出生日期(依据 Part B B4 真值覆盖率优先);D3 **加窗口相对序号**,排序/取首尾/算跨度一律用序号、钟点只作展示 —— 序号入契约会改候选身份与缓存指纹,**必须核对 BUG-984 的 `scoringIdentityMatches` 并确认历史结果只读不被重标**。硬红线:不调打分常数/确认门阈值;不得以排除真值换窄宽度;不得只修 `_cluster_span` 就宣称 982 已修;非跨午夜必须逐位不变且用同机 A/B(不得写死跨机浮点哈希,见 BUG-985)。沿用 BUG-982/983,不新开号 | **已验收通过并合入 staging**(2026-09-21,`b85c4a68`);已部署 staging(run 2831);真人验收待完成 | Claude 独立复核(用当初复现两条 Bug 的同一探针重跑):**BUG-983** 新契约下申报 `00:10`/`00:02` 的申报分钟落在**申报日**(+0 天),`late_night` 300 个候选**全在同一日**、两段;**BUG-982** 跨午夜 3 分钟簇 → **3 分钟**(原 1440),同日两段 → **300 分钟**(未糊成 1440)。三处(`decision_policy.py`/`credible-range.ts`/`candidate-plateau.ts`)均已改。**非跨午夜分数同机 A/B 6/6 逐位相同**;新测试在基线 6 条红、修复后全绿;Python `test_rectification_*` 基线 216 → **272 passed / 0 failed**;`tsc --noEmit` 退出 0。红线全清:打分常数零改动、`status=not_ready`、coverage 0、`holdout_passed()` False、Skill 未动、`official_eval_trial_count` 仍 0。D1 追问 4 选项含「不知道」「跳过」,均退同日两段、从不去 `D+1`,明写不计分可跳过;D2 交付层显示「(前一天)」;D3 用 `window_index`/`segment_index`,`interval_union_width` 按段求和(注释 “never fill a declared segment gap”)。超出要求的设计:`candidate_intervals` 拒绝重复钟点;engine-client 对 dated 路径 fail-closed 抛 `engine_invalid_candidate_decisions`。环境缺口:3 条前端测试在 Claude 机器红,但**同样的 `@/` 别名错误在既有测试上一模一样复现**(`ephemeris-route`、`api-service-unavailable`),非回归;无 Docker 故 `test:db` 未跑。**遗留待确认**:无 `cluster_intervals` 的行仍走旧按钟点算法(宽度仍 1440),应确认除修复前旧缓存外没有别的生产路径会产生无日期行 |
|
||||
| (直接执行,无任务书) | `PROGRESS-notice-loading-polish-20260930.md` | 性别只在档案(1119)、星盘气泡频闪与表格圆角(1120)、全站顶部浮层提示(1121/1122)、我的报告提速与分页(1123/1124)、宫位点亮等待与今日一句不跳(1125) | **已验收,推 staging**;真机清单 `docs/testing/notice-loading-polish-20260930.md` 待产品 | 合并分支 `codex/polish-integrate-20260930` |
|
||||
| `TASK-report-language-switch-stale-20260930.md` | `PROGRESS-report-language-switch-stale-20260930.md` | 报告阅读页切换中文 / English 后正文不换:正文与核对表同级重复 key(`key={shown}`),旧语言节点残留(BUG-1126);改 key + 整页切换回归测试 | **已验收,推 staging**(Claude 直接执行);真机第 10、11 步待产品 | 分支 `codex/report-language-switch-stale-20260930` |
|
||||
| `TASK-home-first-load-20260930.md` | — | 进站等待太久:冷启动接口串行 4 轮(BUG-1127)、每次部署全部 JS 与宋体缓存失效(BUG-1128)、加载屏宋体抢带宽(BUG-1129);产品定加载屏用黑体、宋体只下一次;`supportsImmutableAssets` 先验证后上线 | 待领取 | — |
|
||||
| `TASK-home-first-load-20260930.md` | — | 进站等待太久:冷启动接口串行 4 轮且要等 JS 跑完才发(BUG-1127,T1+T8 早发)、每次部署全部 JS 与宋体缓存失效(BUG-1128)、加载屏宋体抢带宽(BUG-1129)、首屏 JS 带城市表 / 校正代码 / 研究数据(BUG-1130,T7 瘦身);产品定加载屏用黑体、宋体只下一次;`supportsImmutableAssets` 先验证后上线;「新开页面先显示上次内容」待产品拍板,不在本单 | 待领取 | — |
|
||||
|
||||
## 命名与归档
|
||||
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
|
||||
> 执行方:coding agent。验收:Claude。
|
||||
> 分支 `codex/home-first-load-20260930`,worktree `.worktrees/home-first-load-20260930`,基线 `origin/staging`。
|
||||
> BUG 编号:**BUG-1127~1129**(Claude 写单时已登记为 investigating;开工时核对 `docs/BUG_HISTORY.md` 最大号,被占用就顺延并同步改本单)。
|
||||
> BUG 编号:**BUG-1127~1130**(Claude 写单时已登记为 investigating;开工时核对 `docs/BUG_HISTORY.md` 最大号,被占用就顺延并同步改本单)。
|
||||
> 涉及发布形态(静态资源缓存、`next.config.ts`),开工前读 AGENTS §9 与 `docs/research/pre_work_error_ledger.md`,跑 `python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45`。
|
||||
> **串行**:T1 改 `session-list-context.tsx` / `home-bootstrap-run.ts`,同期有别的单改这两个文件时先合入对方再开工。
|
||||
> **串行**:T1 / T8 改 `session-list-context.tsx` / `home-bootstrap-run.ts` / 根 `layout.tsx`,同期有别的单改这些文件时先合入对方再开工。
|
||||
> **2026-09-30 追加**:产品看过「除字体外的其他原因」后说「追加」,本单加入 T7(首屏 JS 瘦身)和 T8(接口与 JS 同时发)。
|
||||
|
||||
## 0. 基线
|
||||
|
||||
@@ -38,11 +39,21 @@ Claude 的测量方法:无头 Chrome 打开 staging 线上 `/`,用 CDP 拦
|
||||
- `(app)/page.tsx` 里取 `fetchRectificationEntrySummary` 的 effect,条件是 `bootstrapPhase !== "account" && accountId && sessionListSettled`,所以要等会话列表。
|
||||
- 冷启动的暖快照(BUG-1040 `home-warm-start.ts`)只在同一个页面文档里回首页时生效,新开页面永远走冷路径。
|
||||
|
||||
追加实测(2026-09-30,Claude 在临时 worktree 里对 `origin/staging` 打开 `productionBrowserSourceMaps` 做生产构建,按 source map 把首页 `/` 引用的每个 JS 字节归到源文件或依赖包;构建后 worktree 已删):
|
||||
|
||||
4. **首屏 JS 构成。** 首页 HTML 引用 30 个 chunk,未压缩 2050 KB、brotli 551 KB。其中 `0cz1d0mv5g_q7.js`(约 110 KB)是 `noModule` 补丁,新浏览器不下载,所以现代浏览器实际约 1940 KB / 520 KB。按来源(未压缩):`next` 465 KB、`@base-ui/react` 约 200 KB(扣掉下面第 5 条的误归因)、应用自身代码约 713 KB(其中名字含 `rectification` / `birth-time` 的源文件共约 226 KB)、`zod` 60 KB、`date-fns` 52 KB、`react-day-picker` 42 KB、markdown 系(`micromark*` / `mdast*` / `hast*` / `property-information` / `react-markdown`)约 80 KB。
|
||||
5. **全国城市表在首屏。** `src/data/china-locations.json`(未压缩 227 KB,brotli 47 KB,实测)通过 `china-locations.ts` 被 `src/lib/home-types.ts`(`export const china = chinaLocations.country`)、`global-birth-payloads.ts`、`birth-rectification-payload.ts` 等以值的方式导入,进了首屏 chunk `31sim7mf4kv30.js`(source map 把它误归到 `@base-ui/react/utils/useOpenInteractionType.mjs`)。用途是兼容只存了 `provinceCode` / 城市编码的老资料,以及出生地选择器。
|
||||
6. **研究数据进了首屏。** 首屏 chunk `3spnw3pe9v7ng.js` 里有一段约 20 KB 的 `JSON.parse('{"sealed_benchmark_id":"minute_rectification_fact_ranker_v4_holdout_v3",…}')`(校正研究的封存评测结果)。
|
||||
7. **接口必须等 JS 跑完才发。** §1 表里首个接口出现在最后一个首屏 JS 下完之后(约 3100 ms),DOMContentLoaded 之后约 1 秒完全没有网络请求可以并行。账户、人物目录、会话列表的请求都不依赖 JS 内容,本可以在 HTML 一到就发出。
|
||||
8. 已排除:传输压缩正常(JS 响应 `content-encoding: zstd`);两台服务器都在国内(staging `118.26.111.127`、正式站 `118.194.235.34`);`/api/account` 服务端是本机数据库的 5 次顺序查询(`GET` 里 `auth.getUser` → profile → avatar → subscriptions → `isAdminUser`),估计几十毫秒级,不是主因,本单不动。
|
||||
|
||||
## 2. 根因
|
||||
|
||||
- **BUG-1127**:首页冷启动的接口是串行的(账户 → 人物目录 → 会话列表 → 校正入口),其实只有「会话列表要知道当前人物」这一条是真依赖,而当前人物在绝大多数情况下是本地已记住的 `self`。
|
||||
- **BUG-1128**:`deploymentId` 的 `?dpl=` 让内容寻址的静态资源在每次部署后都失效,字体也一样。
|
||||
- **BUG-1129**:加载屏标题 `.app-loading-content strong` 用 `--font-display`(宋体),JS 还没跑,就先触发 3~4 个宋体切片下载,和关键 JS 抢带宽;换体时标题还会跳一下。
|
||||
- **BUG-1130**:首屏 JS 里带着首屏用不到的模块:全国城市表(brotli 47 KB)、校正 / 生时录入代码、日期选择器与日期库、markdown 渲染、研究评测 JSON。估计合计可以挪走约 150 KB(brotli),约占首屏 JS 三成(只有城市表一项是实测,其余按未压缩大小折算)。
|
||||
- BUG-1127 的另一半:冷启动接口要等全部首屏 JS 执行完才开始发(§1 第 7 条)。
|
||||
|
||||
## 3. 决策记录(产品 2026-09-30)
|
||||
|
||||
@@ -50,6 +61,8 @@ Claude 的测量方法:无头 Chrome 打开 staging 线上 `/`,用 CDP 拦
|
||||
2. **宋体只下一次**:宋体切片在部署之间必须保持同一地址、长期缓存,部署后不再重新下载。为此允许改变切片的存放和引用方式(见 T3)。如果最终走 T3-b,就**推翻** `frontend/tests/serif-headings-contract.test.ts` 里「slices are bundled by Next, not served from public/」这条断言(原因:Next 打包的资源带 `?dpl=`,每次部署都失效)。改断言要写「原值 / 新值 / 原因」三栏。
|
||||
3. 没有采用的方案:苹果设备优先用系统自带宋体、标题全部改回黑体。
|
||||
4. 接口并行化、按需 JS 预取属于纯工程优化,不改变可见行为,按本单红线执行即可。
|
||||
5. **追加(产品 2026-09-30「追加」)**:首屏 JS 瘦身(T7)、接口在 HTML 到达时就发出(T8),两项都不改可见行为。
|
||||
6. **未决,不在本单范围**:「新开页面先显示上次的账户和会话列表,后台再刷新」需要把账户与会话标题存进设备本地存储,和 BUG-1040 暖快照「只放内存」的设计冲突,涉及隐私取舍,等产品拍板后另开单。本单**不得**把这些数据写进 localStorage / sessionStorage / IndexedDB。
|
||||
|
||||
## 4. 硬红线
|
||||
|
||||
@@ -59,7 +72,9 @@ Claude 的测量方法:无头 Chrome 打开 staging 线上 `/`,用 CDP 拦
|
||||
4. `(app)/page.tsx` 的 `Home()` 状态数不得增长(`home-shell-growth-contract.test.ts`);新逻辑进 `src/lib/` 或 hook。
|
||||
5. 不改 `.gitea/workflows/**`、不改 DNS、不升级依赖。改 `next.config.ts` 可以,但必须真跑生产构建和 standalone 验证(见 T4)。
|
||||
6. 宋体切片文件的字节内容不变(`scripts/fonts/build_serif_slices.py` 的产物逐字节一致),只改存放位置、文件名和引用方式。
|
||||
7. 改动或删除断言前,按 AGENTS §7-8 在 `frontend/tests/` 和 `tests/` 里 grep;已知相关:`serif-headings-contract.test.ts`、`font-stack-loadable-contract.test.ts`、`tests/test_serif_font_slices.py`、`home-shell-growth-contract.test.ts`,以及 BUG-1040 / BUG-1104 的暖快照测试。
|
||||
7. T7 只改加载时机,不改功能:老资料(只有省市编码、没有经纬度)的出生地解析结果必须逐字段不变,出生地选择器、校正、生日录入、消息渲染的行为全部不变;挪出首屏后,第一次用到时允许短暂加载,但不得出现 spinner 或骨架(AGENTS §6)。
|
||||
8. T8 的早发请求只在 `/` 的首屏用一次,被消费后作废;401 必须照旧走登录跳转;账号不一致(BUG-1040)时丢弃;不得让任何页面因为早发失败而卡住,早发失败就回到正常请求。
|
||||
9. 改动或删除断言前,按 AGENTS §7-8 在 `frontend/tests/` 和 `tests/` 里 grep;已知相关:`serif-headings-contract.test.ts`、`font-stack-loadable-contract.test.ts`、`tests/test_serif_font_slices.py`、`home-shell-growth-contract.test.ts`,以及 BUG-1040 / BUG-1104 的暖快照测试。
|
||||
|
||||
## 5. 任务分解
|
||||
|
||||
@@ -100,9 +115,36 @@ Claude 的测量方法:无头 Chrome 打开 staging 线上 `/`,用 CDP 拦
|
||||
- 找出揭幕前按需加载的 6~7 个 chunk(测量脚本里 4800–5300 ms 那批),能在首屏 JS 就绪后立刻预取的就预取(参考 `chat-chunk-prefetch.ts` 的做法)。首屏 gzip 仍须在 ±2% 内。
|
||||
- 验收:测量脚本里这批 chunk 的完成时间早于账户接口返回。
|
||||
|
||||
### T7 · 首屏 JS 瘦身(BUG-1130)
|
||||
|
||||
按收益从大到小,逐项挪出首屏:
|
||||
|
||||
1. **城市表**:`china-locations.json` 改为用到时再加载(动态 `import()`;或把「省市编码 → 经纬度 / 时区」这类老资料兼容查询挪到服务端)。`home-types.ts` 不再以值的方式导入城市表。
|
||||
2. **研究评测 JSON**:找出是哪个模块把封存评测结果带进客户端(搜 `sealed_benchmark_id` / `fact_ranker_v4_holdout`),客户端只保留用得到的字段,或者改成服务端提供。
|
||||
3. **校正 / 生时录入代码**:空白首页不渲染的校正界面(`rectification-agentic-chat`、`rectification-board`、`birth-time-intake` 等及其 `src/lib/rectification-agentic/**` 依赖)改为按需加载,参考 `chat-chunk-prefetch.ts` 在首屏就绪后空闲预取。
|
||||
4. **日期选择器与日期库**(`react-day-picker`、`date-fns`):只在生日录入时加载。
|
||||
5. **markdown 渲染**:空白首页没有消息时不加载;有消息的会话按需加载,并在首屏就绪后空闲预取。
|
||||
|
||||
- 验收:
|
||||
1. 用 Claude 的方法(`productionBrowserSourceMaps` 临时构建 + source map 按来源统计,**不提交该配置**)给出前后对照表:首页首屏 JS(排除 `noModule`)的 brotli 总量,城市表与研究 JSON 不再出现在首屏 chunk 中。
|
||||
2. 老资料兼容:新增或保留一条测试,对只有省市编码的虚构资料,解析结果(经纬度、时区、地名)与改动前逐字段一致。
|
||||
3. 首屏 gzip 预计明显下降,超过 ±2% 是预期内的,在进度记录里写明原因和数字,不按超标处理。
|
||||
4. 用 §7 的测量脚本,最后一个首屏 JS 的完成时刻提前(贴前后对照)。
|
||||
|
||||
### T8 · 接口在 HTML 到达时就发出(BUG-1127 追加)
|
||||
|
||||
- 首页 `/` 的静态 HTML 在 `<head>` 里加一段**内联经典脚本**(不依赖 bundle;语法照 BUG-936 兜底脚本的口径,保持 ES5),HTML 一到就发出 `/api/account`、`/api/chart-profiles`、`/api/sessions?limit=…&subject=<本地记住的人物,缺省 self>`、`/api/models`,把 Promise 挂在一个命名清楚的全局上。`readBootAccount` / `loadSubjectCatalog` / `loadSessionList` / `fetchModelCatalog` 首次调用时优先消费它,消费后清掉。
|
||||
- 请求参数(limit、subject、headers、`cache: "no-store"`、`credentials`)必须和正常路径完全一致,写一个共享常量,防止两边漂移。
|
||||
- 不采用 `<link rel="preload" as="fetch">`:它和 `cache: "no-store"` 的匹配行为依赖浏览器实现,不可控。
|
||||
- 与 T1 的关系:T1 是 JS 内部并行,T8 让这些请求再提前到和 JS 下载同时进行。两项都做;T8 做不成时 T1 仍须交付。
|
||||
- 验收:
|
||||
1. 测量脚本(接口延迟 600 ms):`/api/account` 的发出时刻早于最后一个首屏 JS 完成;揭幕时刻 ≈ max(JS 就绪, 早发接口返回) + 1 轮以内。贴前后对照。
|
||||
2. 单元测试:早发结果被消费一次后作废;早发返回 401 时照旧跳登录;早发失败(网络错误)时回退到正常请求并成功揭幕;账号 id 与本地记录不一致时丢弃早发的会话列表。
|
||||
3. 除 `/` 外的页面不发这些早发请求(内联脚本只在首页 HTML 里)。
|
||||
|
||||
### T6 · 记录
|
||||
|
||||
- BUG-1127~1129 补齐修复、验证、防复发,改为 resolved;CHANGELOG 一条;`DESIGN.md`(T2);新增 `docs/testing/home-first-load-20260930.md` 真机清单:①部署后第一次打开首页,计时到能输入;②刷新再计时;③隔一次部署再打开,计时并看标题宋体是否瞬间出现;④切到他人档案后刷新,确认没有闪出本人的会话。
|
||||
- BUG-1127~1130 补齐修复、验证、防复发,改为 resolved;CHANGELOG 一条;`DESIGN.md`(T2);新增 `docs/testing/home-first-load-20260930.md` 真机清单:①部署后第一次打开首页,计时到能输入;②刷新再计时;③隔一次部署再打开,计时并看标题宋体是否瞬间出现;④切到他人档案后刷新,确认没有闪出本人的会话。
|
||||
|
||||
## 6. 验收口径
|
||||
|
||||
@@ -121,7 +163,7 @@ Claude 的脚本在会话 scratchpad,不入库;执行方按以下口径自
|
||||
|
||||
## 8. 让步顺序
|
||||
|
||||
T2 → T1 → T3 → T4 → T5。T2、T1 必做;T3 必须以 a 或 b 之一落地;T4 不成立就记 BLOCKED;T5 可以留到下一单。
|
||||
T2 → T1 → T8 → T7 → T3 → T4 → T5。T2、T1 必做;T8、T7 应做(T7 至少完成第 1、2 项:城市表、研究 JSON);T3 必须以 a 或 b 之一落地;T4 不成立就记 BLOCKED;T5 可以留到下一单。
|
||||
|
||||
## 9. 开工前置命令
|
||||
|
||||
|
||||
Reference in New Issue
Block a user