Files
Jyotisha/docs/tasks/TASK-console-noise-20260916.md
T
Jesse_ChenandClaude Fable 5.1 37f77fe8b3 docs(tasks): 控制台噪音清理任务书(SVG height=auto、consult/status 无活动任务 404 → 204)
三条控制台红字定性:SVG 属性非法是我方缺陷(BUG-906)、无参 status 404 是设计噪音(BUG-907)、reportAllChanges 是扩展注入脚本不处理。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
2026-09-16 14:15:18 +00:00

7.8 KiB
Raw Blame History

任务书 · 控制台报错清理:SVG height="auto"/api/consult/status 404 噪音(2026-09-16

0. 基线

  • 基线 commit05cf20fborigin/staging headstaging /api/healthdeployment.gitCommit 与之相同)。
  • 分支:codex/console-noise-20260916git worktree add -b codex/console-noise-20260916 .worktrees/console-noise-20260916 origin/staging
  • 范围:只有前端。不动 Python、不动迁移、不动 Skill。
  • BUG 段:BUG-906 起(基线 docs/BUG_HISTORY.md 最大号 BUG-905,开工时再核对一次)。

1. 事故实证

产品负责人 2026-09-16 在 staging 首页控制台连续看到三类红字:

# 控制台原文 来源 定性
A Error: <svg> attribute height: Expected length, "auto". frontend/src/components/chart-page/western-wheel-svg.tsx:31frontend/src/components/personal-report/vedic-chart-svg.tsx:98 都写了 height="auto" 我方代码缺陷。SVG 的 height 表现属性只接受长度/百分比,auto 只是 CSS 值。浏览器丢弃该属性后星盘仍能画,但每渲染一张盘报一次;报告页 22 张盘就是 22 条
B GET https://staging.jyotisha.chat/api/consult/status 404 (Not Found) 无参调用来自 frontend/src/app/page.tsx:974(启动)与 frontend/src/hooks/use-consultation-run.ts:271(页面重新可见、online 事件,见 page.tsx:1328-1330);服务端 frontend/src/app/api/consult/status/route.tsactiveLookup 分支查不到 reserved 行时返回 404 设计噪音。客户端 fetchActiveConsultationStatushome-cloud-sync.ts:581-589)已把 404 当"没有后台任务"正常返回 null,业务无失败;但浏览器对所有非 2xx fetch 都打红字,用户每次切回标签页都看到一条
C Uncaught TypeError: Cannot read properties of undefined (reading 'startTime') at et.reportAllChanges VM4285:2,注入脚本 非我方代码。站点打包文件都带 ?dpl=05cf20fb… 后缀,VM 编号脚本是浏览器扩展 / DevTools 注入;reportAllChanges 是 web-vitals 库接口,frontend/package-lock.json 里没有该依赖,layout.tsx 只内联主题引导脚本。本单不处理,留在 §7 给用户的验证方法

2. 根因

  • A830799fa(星盘页)与 2fdcb14f(报告盘面)把 CSS 的 height: auto 写成了 SVG 属性。globals.css:4097 早已给 .personal-report-chart-svg 写了 height: auto,属性是多余的;.chart-page-western-svg 没有对应 CSS 规则,靠的是 viewBox + width="100%" 自适应。
  • B:接口把"没有活动任务"和"指定 requestId 不存在"两种情况都用 404 表达。前者是常态查询的正常空结果,后者才是真正的"不存在"(page.tsx:965consultation-recovery.test.ts:88/112 依赖它计数)。

3. 决策记录

  • 产品负责人 2026-09-16 授权清理这两条控制台噪音,口径是"多余的宁可删"。
  • 不推翻任何既有红线:指定 sessionId+requestId 的查询继续返回 404(BUG 历史 4107 行一带的刷新恢复逻辑与 consultation-recovery.test.ts 靠它)。只改无参的 activeLookup 分支。
  • 不做打断合并、不改恢复触发时机(可见性 / online)。

4. 硬红线

  1. page.tsx 行数不得增长(AGENTS.md §6)。本单不需要碰它。
  2. consultation-stream-recovery.test.ts:121-153route.ts 的结构断言(activeLookup 定义、查询链、租约回收块顺序)必须原样通过,不得改断言。
  3. chart-page-view.test.tsx:131-135vedic-chart-svg 导入方式的断言不变;globals.css:4599 的字号规则不变。
  4. 部署有窗口期(先出新前端还是先出新接口不可控,两者同一镜像但浏览器可能持旧 JS):客户端必须同时接受新旧两种"无活动任务"应答。
  5. 不顺手动 layout.tsx、不加 web-vitals、不为 C 类报错加任何 try/catch。

5. 任务分解

T1 删掉 SVG 的 height="auto"BUG-906

  • western-wheel-svg.tsx:31vedic-chart-svg.tsx:98:删除 height="auto" 属性。vedic 的高度由 globals.css:4097 兜底;western 补一条 .chart-page-western-svg { display: block; width: 100%; height: auto; }globals.css 星盘页段落(.chart-page-vedic-stage 附近),保证两张盘行为一致。
  • 验收:
    • git grep -n 'height="auto"' frontend/src 为 0 命中。
    • frontend/tests/chart-page-view.test.tsx 增加一条契约:两个 SVG 源文件 doesNotMatch(/height="auto"/),且 globals.css.chart-page-western-svgheight: auto 声明。
    • 星盘页与报告页盘面视觉不变(viewBoxwidth="100%" 未动即可判定;真机对比留 §8)。

T2 无活动任务时不再返回 404(BUG-907)

  • route.tsactiveLookup 分支:查询结果为空时返回 new NextResponse(null, { status: 204 })sessionId+requestId 分支查空仍返回 404「咨询请求不存在」,代码上把两处分开写,不要共用那一个 if (!data ...)
  • home-cloud-sync.tsfetchActiveConsultationStatusif (response.status === 204 || response.status === 404) return null;。先判状态再 response.json()204 没有 body。fetchConsultationStatus(带参)不改。
  • 验收:
    • consultation-stream-recovery.test.tsconsultation-recovery.test.ts 原断言全绿。
    • 新增契约测试(放进 consultation-stream-recovery.test.ts):route 源码里 activeLookup 空结果分支出现 status: 204,带参分支仍出现 "咨询请求不存在" + status: 404home-cloud-sync.ts 的无参函数同时接受 204 与 404。
    • parseConsultationStatus 的既有单测确认不会把 204 的 null body 当作有效状态(它在 204 分支之前就已返回)。

T3 记录

  • docs/BUG_HISTORY.md 新增 BUG-906、BUG-907(现象、触发、根因、修复、验证、防复发);C 类在 BUG-907 的"关联"里写一句"控制台第三条 reportAllChanges 报错为浏览器扩展注入脚本,非本仓代码,验证方法:无痕窗口"。
  • CHANGELOG.md 一条:控制台不再出现星盘 SVG 属性警告与无后台任务时的 404。
  • docs/tasks/PROGRESS-console-noise-20260916.md:测试数字、失败清单与基线逐条比对、gzip 前后。

6. 让步顺序

  1. T2 若 204 让 next 的某条中间件或 StaleClientRecovery 误判(不太可能,先查 stale-client-recovery.tsx 是否拦所有非 2xx/非 JSON 应答),退而返回 200 + { "status": "none" },客户端 parseConsultationStatus 之前先判 status === "none" 返回 null;契约测试相应改。
  2. T1 的 .chart-page-western-svg CSS 若撞星盘页现有布局(宽度被父容器限定),只删属性、不加规则,在进度记录写明。
  3. T3 不可让步。

7. 开工前置命令

git fetch origin --prune
git worktree add -b codex/console-noise-20260916 .worktrees/console-noise-20260916 origin/staging
cd .worktrees/console-noise-20260916/frontend
./node_modules/.bin/tsc --noEmit && npm run lint && npm test 2>&1 | tail -20   # 记下基线总数与失败清单
grep -o "BUG-[0-9]\+" ../docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1      # 应为 BUG-905

验收口径:tsc 0 错;lint 0 errornpm test 失败清单与基线逐条一致(无 Docker 的那组不算新增)且总数不减;next build/ 仍 Static;首屏 gzip ±2%。

8. 环境缺口(留给产品负责人真机)

  • 部署后在 staging 打开报告页与星盘页:控制台不再有 Expected length, "auto";盘面大小与之前一致。
  • 首页切到别的标签页再切回:Network 里 /api/consult/status 应为 204,控制台无红字。
  • 无痕窗口打开首页:reportAllChanges … startTime 报错应消失;若仍在,把该条连同扩展列表截图发回,另立单。