Files
Jyotisha/docs/tasks/PROGRESS-frontend-dead-code-20261013.md
T
jesse-uxandGrok (agent loop) 392c1f7218 合并 staging,并去掉已删组件留下的样式名单条目
knownUnstyled 不再保留 personal-report-additional-charts。它只被删掉的报告组件用过。其它白名单没有同类残留。业务代码没改。

自测:类名合同和两条否定合同 6 通过,失败 0,取消 0。tsc 0 错,lint 0 error。

Co-Authored-By: Grok (agent loop)
2026-10-14 11:10:17 +08:00

15 KiB
Raw Blame History

PROGRESS · 前端死代码与无调用方接口清理

  • 日期:2026-10-14
  • 分支:codex/frontend-dead-code-20261013
  • 基线:本分支从当前 origin/staging 0a4ba236580df6e6cbb0faa28e48d1e66ff7dfff 拉出(任务书写作基线 77057a819 的后代)
  • 结论:删掉三个没有调用方的接口(含一个不用登录就会做大约 20 秒计算的入口)和任务书点名的死代码。普通导出的逐字节锁没动。Skill 版本不 bump。

开工基线

  • 前端测试文件:600(frontend/tests/*.test.ts 与 *.test.tsx)。做完 594,少 6 个整文件。
  • docs/BUG_HISTORY.md 最大已有号是 BUG-1345。BUG-1342 当时空着,按任务书使用,不另开新号。

可达性脚本(正斜杠)

Windows 上 os.walk 给出反斜杠,任务书里的入口正则匹配不到。脚本先把路径换成 / 再判断。

删之前,不可达 17 个文件、3028 行,与任务书表一致:

src/components/birth-time-life-events.tsx 207
src/components/birth-time-soft-notice.tsx 36
src/components/claim-boundary-badge.tsx 13
src/components/evidence-audit-panel.tsx 64
src/components/personal-report/personal-report-document-view.tsx 630
src/components/personal-report/raw-appendix-download.tsx 33
src/lib/agent-evals.ts 796
src/lib/birth-time-candidate-completion.ts 14
src/lib/chart-library-view.ts 18
src/lib/db/client.ts 18
src/lib/personal-report-longform-download.ts 8
src/lib/rectification-agentic/core/index.ts 23
src/lib/rectification-agentic/date-range.ts 53
src/lib/rectification-agentic/session.ts 351
src/lib/rectification-agentic/v9/index.ts 11
src/lib/think-step-gate.ts 17
src/mastra/rectification-tools.ts 736

删之后还剩 2 个:

src/lib/personal-report-longform-download.ts 8
src/lib/reader-appendix-language.ts 32

偏离:任务书 T2 写「只剩 personal-report-longform-download.ts」。那是在原始附录路由还在时的口径。T3 删掉路由和 personal-report-raw-appendix.ts 之后,净化函数 reader-appendix-language.ts 没有生产入口了,但密度测试和 reader-appendix-language-parity.test.ts 仍直接调用它。任务书没把它列入删除,删掉会放宽净化合同,所以保留。ordinaryReportDownloadMarkdown 仍在。

删除的源文件(行数按 git 删除计)

路径 行
frontend/src/mastra/rectification-tools.ts 736
frontend/src/lib/agent-evals.ts 796
frontend/src/components/personal-report/personal-report-document-view.tsx 630
frontend/src/lib/rectification-agentic/session.ts 351
frontend/src/components/birth-time-life-events.tsx 207
frontend/src/components/evidence-audit-panel.tsx 64
frontend/src/lib/rectification-agentic/date-range.ts 53
frontend/src/app/api/birth-rectification/route.ts 49
frontend/src/app/api/reports/[reportId]/raw-appendix/route.ts 48
frontend/src/lib/birth-rectification-payload.ts 41
frontend/src/components/birth-time-soft-notice.tsx 36
frontend/src/components/personal-report/raw-appendix-download.tsx 33
frontend/src/lib/rectification-agentic/core/index.ts 23
frontend/src/app/api/birth-time-candidate-completion/route.ts 20
frontend/src/lib/chart-library-view.ts 18
frontend/src/lib/db/client.ts 18
frontend/src/lib/think-step-gate.ts 17
frontend/src/lib/birth-time-candidate-completion.ts 14
frontend/src/components/claim-boundary-badge.tsx 13
frontend/src/lib/personal-report-raw-appendix.ts 13
frontend/src/lib/rectification-agentic/v9/index.ts 11

源文件合计 3191 行。drizzle-orm 与 @mastra/* 依赖没删。globals.css 另删 11 行死样式(见 T5)。没改 page.tsx,没改 scripts/jyotish_api_server.py,没改表。

删除测试清单

整文件删除的原因都是:只测已经删掉的死代码。否定合同留在还活着的测试里。

frontend/tests/rectification-agentic-tools.test.ts(14)

  • gate tool posts the birth profile to /api/rectification_gate
  • score tool normalizes year-precision events into the V5 date range contract
  • scan tool derives its center and uncertainty from the server-owned range
  • gate keeps period-only profiles on the server-owned range without inventing a minute
  • scan defers an unknown full-day range instead of using a fake noon birth time
  • score rejects an Agent-invented range
  • save tool rejects before a confirmation gate exists
  • save tool rejects a time that does not equal the confirmed minute
  • confirm then save with the matching minute applies the write
  • confirm serializes event dates to the legacy precision contract
  • confirm persists ranked candidates with relative support totaling 100
  • confirm distinguishes skipped external validation from a failed VedAstro run
  • confirm offers non-unique candidates only when the Agent explicitly ends evidence collection
  • accept candidate tool delegates the exact persisted candidate and preserves accepted status

frontend/tests/rectification-agentic-session.test.ts(16)

  • loadAgenticRectificationProfile derives birth fields, accuracy and baseline
  • loadAgenticRectificationProfile normalizes a persisted ISO birth date
  • loadAgenticRectificationProfile normalizes a PostgreSQL Date birth date
  • loadAgenticRectificationProfile rejects an invalid persisted birth date
  • loadAgenticRectificationProfile treats hospital source as minute accuracy
  • loadAgenticRectificationProfile accepts a period-only declaration without a fake minute
  • loadAgenticRectificationProfile uses a custom declared window instead of the leftover period
  • loadAgenticRectificationProfile accepts an unknown time as the full day
  • loadAgenticRectificationProfile preserves a cross-midnight uncertainty range
  • loadAgenticRectificationProfile rejects a missing birth date
  • applyConfirmedBirthTime calls the service-role RPC with the confirmed minute
  • applyConfirmedBirthTime rejects a malformed time before calling the RPC
  • applyConfirmedBirthTime surfaces an RPC error as a failure
  • candidate persistence binds the engine result to user, session and profile baseline
  • candidate acceptance calls the service-role RPC with exact ownership and result identity
  • latest candidate result maps persisted support and selection state for session recovery

frontend/tests/agent-evals.test.ts(11)+ frontend/tests/fixtures/agent-golden-dataset-v1.json

  • golden fixture is deidentified and exactly covers every PR-8 10.1 subscenario and tag
  • a conforming rectification run passes every applicable deterministic scorer
  • deterministic scorers expose contract, evidence, theme, timing, focus, economy, and budget failures
  • catalog-only citations fail until the run actually makes the evidence available
  • fact and timing claims cannot disable deterministic evidence requirements
  • minute candidate and accepted states pass while unconsented confirmation fails
  • consented exact-minute confirmation passes only in the explicit confirmation case
  • requested theme coverage is independent from prose and uses structured theme ids
  • naturalness, repetition, follow-up relevance, and model fact review remain explicit pending inputs
  • latency and cost statistics use deterministic nearest-rank percentiles and report budget breaches
  • privacy scanner rejects identity fields, raw user bodies, credentials, dates, times, and internal paths

frontend/tests/birth-time-candidate-completion.test.ts(1)

  • unconfirmed candidate results cannot directly become the active consultation time

frontend/tests/public-thinking.test.ts(5)

  • incident English salad never reaches the public think channel
  • pure Chinese thinking is unchanged
  • CJK sentences are accepted whole; English words are not stripped
  • English-only process narration is dropped even without a terminator
  • an unterminated fragment is dropped rather than rewritten

frontend/tests/personal-report-raw-appendix.test.ts(4 + 11 条参数化)

  • raw appendix retains status rows and raw columns without changing ordinary projection
  • raw appendix cleans old cache vocabulary but leaves English prose intact
  • raw appendix keeps established HTML URL secret and chart-fence safety boundaries
  • raw appendix UI is independent of ordinary export and accepts no birth payload
  • raw appendix route guards anonymous
  • raw appendix route guards cross-origin
  • raw appendix route guards foreign
  • raw appendix route guards invalid-id
  • raw appendix route guards generating
  • raw appendix route guards missing
  • raw appendix route guards pending
  • raw appendix route guards wrong-report
  • raw appendix route guards wrong-owner
  • raw appendix route guards wrong-request
  • raw appendix route guards ready

frontend/tests/personal-report-view.test.ts 里删掉的 15 条(文件留下,不再渲染旧阅读页)

  • renders the selected answer-first order: cover -> summary -> D1 -> themes -> appendix -> disclaimer
  • accepted and confirmed birth times render as distinct report metadata states
  • v2 renders scope, natal foundation, themes, current phase, actions, blocked disclosures and provenance
  • v2 currentPhase is omitted when null, without hiding the remaining v2 sections
  • v2 chart evidence refs link to the appendix and every real structured chart uses the SVG renderer
  • v2 model-authored text stays escaped and cannot inject HTML, CSS or SVG
  • 技法审计表不会出现在核心判断之前
  • evidence appendix is collapsed by default in default mode and expanded in research mode
  • expandedByDefault=true expands the appendix even in default mode
  • birth-time sensitivity alone keeps the appendix visible and shows minute changes
  • D1 SVG renders when real houses exist; D9/D10 are never fabricated
  • each house owns its occupant coordinates and dense houses stay clipped and bounded
  • evidenceRefs only produce in-page anchors for ids present in the appendix
  • no dangerous HTML: no script tags, no external resources, no dangerouslySetInnerHTML
  • long theme sections are not forced to avoid page breaks; only small elements are

留下的 8 条:契约解析、路由信封、失败摘要、畸形文档、导出按钮、阅读外壳、打印、目录。

frontend/tests/rectification-decide-next-action.test.ts 删 1 条

  • core barrel re-exports decideNextAction without duplicating session helpers

原因:barrel 文件已删。旁边的决定逻辑测试还在。

tests/test_repo_privacy_markers.py

  • 参数化用例 test_exact_synthetic_line_permission_rejects_mutations 少 1 条:原来指向 frontend/tests/agent-evals.test.ts 的合成路径许可。文件没了,许可项一起删。函数名还在,其余许可项还在。

改写断言(三栏写在源码注释里)

位置 原值 新值 原因
database-local-business.test.ts 两处读取 用已删的 session 读取器核对候选 删掉读取。权限与 RPC 断言留着 读取器已删,库合同不变
personal-report-progress.test.ts 旧阅读页必须引用共享章节名 删这两条。共享表断言留着 旧阅读页已删
personal-report-export.test.ts 旧阅读页源码不得内嵌 HTML 删这条。页面不得出现旧视图名字的断言留着 文件已删
rectification-step-answer.test.ts 读思考门源码,不得有组装函数 删这两行。连续 reasoning-delta 必须丢弃留着 BUG-953,文件已删
evidence-audit-panel.test.ts 内部面板文案和死样式必须存在 删正向断言。聊天不得挂内部面板、读者审计表样式留着 面板已删,否定合同不放宽
claim-boundary-badge.test.ts 徽章文案和死样式必须存在 删正向断言。聊天行不得挂徽章留着 同上
global-birth-profile-routes.test.ts 旧校正载荷构造器用同一组坐标 删这段。每日与合盘断言留着 构造器已删
personal-report-density-retry.test.ts 原始附录出口不含内部词,并再打一次已删接口 直接核对快照:旧缓存没有计算快照;其余快照的适用性原文和正文与已保存的一致。净化函数的断言留着 出口已删,快照合同不放宽
test_daily_and_rectification_entrypoints.py 钉住代理源码 路由文件不存在,且网页 API 目录下没有路由再转发到内网问卷路径。测试名保留,测试数不降 BUG-1342
test_repo_privacy_markers.py 自检 替换已删除许可项里的那条合成路径 改为替换仍留在许可表里的另一条合成路径 改了许可原文仍必须被扫到,不放宽

T5 死样式

删前在 frontend/src 与 frontend/tests 里,这些类只出现在即将删除的组件和即将改写的测试里。删后源码不再引用:.claim-boundary-badge、.evidence-audit-panel、.evidence-audit-table、.evidence-audit-row、.raw-evidence-receipt、.birth-time-life-events。.personal-report-document、.technique-audit、.markdown-table 没动。

自测

检查 命令 结果
类型 frontend\node_modules\.bin\tsc --noEmit -p frontend 0 错
lint npm run lint --prefix frontend 0 error,123 warning(开工口径 125,少 2,就是随 birth-time-candidate-completion.ts 消失的那两条;其余未改)
改过的前端测试 node node_modules\tsx\dist\cli.mjs --test 在 frontend 下跑点名的文件 fail=0,cancelled=0。含密度 10 个模式与阅读页留下的 8 条
Python .venv\Scripts\python -m pytest tests/test_daily_and_rectification_entrypoints.py tests/test_repo_privacy_markers.py -q 4 + 62 收集,exit 0
数据库 npm run test:db --prefix frontend 80 条:通过 67,失败 13,cancelled 0。失败名与 windows-known-failures.txt 逐条相同,没有多出来的。改过的本地业务库测试通过

没跑前端全量 npm test、Python 快速门、next build。

test:db

npm run test:db --prefix frontend 退出码 1,因为 Windows 上那 13 条本来就会失败。失败名与 tools/agent-loop/windows-known-failures.txt 一致,没有新增:

  • staging backups are encrypted, atomic, private, and retain the newest three
  • rejects destructive backup directory aliases and symlink components before mutation
  • rejects unsafe writable backup parents before creating the target
  • rejects a direct canonical sticky shared backup directory before chmod
  • creates every absent backup path component privately despite a permissive caller umask
  • same-second backups publish once without overwriting the completed archive
  • find enumeration failures preserve existing backups and do not report completion
  • refuses full disks and removes a failed-pipeline partial file
  • database env validator accepts punctuated literal required secrets
  • database env validator enforces an explicit staging owner uid without printing values
  • database env validator accepts a private valid file without printing values
  • personal report job migration is atomic, lease-bound, recoverable, and owner read-only
  • personal report sections enforce owner-read RLS and service-owned durable transitions

改过的 database-local-business.test.ts(local PostgreSQL applies the reviewed business schema and serves authenticated business calls)通过。权限和 RPC 断言还在。

第 1 次打回

合并最新 origin/staging。从 knownUnstyled 删掉 personal-report-additional-charts。其它白名单里没有被删组件留下的类名。业务代码没改。类名合同和两条否定合同 6 通过,失败 0,取消 0。tsc 0 错。lint 0 error,123 条原有 warning。