Skip to content

[P0] 管理后台:批量失败可见、Webhook 读数口径、面包屑缺 4 项映射 (#88) - #89

Merged
fxbin merged 9 commits into
mainfrom
issue-88-admin-silent-failure
Sep 29, 2026
Merged

fxbin merged 9 commits into
mainfrom
issue-88-admin-silent-failure

Conversation

@fxbin

@fxbin fxbin commented Sep 29, 2026

Copy link
Copy Markdown
Owner

What & why

管理后台有三处让操作者做出错误判断的缺陷,来源是一次对 src/app/admin/** 的五席圆桌实测诊断(判据:可用性缺陷 > 工程债 > 纯审美)。

  1. 批量操作静默失败(P0) — handleBatchToggle 逐条 update 的 catch 只写 console.error,循环后无条件清空选择态并重取。批量停用 30 个信源、5 个失败时,UI 报告「全部处理完」,失败的 5 个仍按原状态继续采集并污染内容池。
  2. Webhook 日志读数口径撒谎(P1) — 页内 30 行的成功/失败数与全局 total 并排渲染成同款 Badge,诱导 2/1240 = 0.16% 的误读;且失败徽章以 failCount > 0 条件渲染,0 失败时整枚消失——徽章缺席本身即错误信念。Webhook 是产品交付通道。
  3. 面包屑缺 4 项映射(P2) — 侧边栏 15 项 vs 面包屑 10 条两份目录互相矛盾,prompts / scoring-dashboard / evidence / webhook-logs 顶栏回退显示「管理」。

Refs #88

Area

  • frontend
  • docs

提交拆分

Commit 内容
b072724 docs: 登记三项缺陷到回归矩阵(十个维度)
74d3ef7 fix(frontend): 让批量失败可见并消除 Webhook 读数口径撒谎
e673d58 fix(frontend): 补齐面包屑 4 项缺失映射
98967c4 test(frontend): 补回归测试并抽出可测纯函数
cb16308 docs: 回归矩阵同步回归测试命令与变异验证结论

Verification

  • npx tsc --noEmit passes — 通过,0 错
  • npm run test:coverage passes — 通过,179/179;lines 96.53% / branch 92.7% / func 100%(阈值 90/85/90)
  • npx vitest run — 13 个测试文件全绿,其中本次新增 32 条
  • 手工冒烟:next dev 干净重启后 5 个 admin 页面均 200、无编译错误

变异测试(证明测试有效,不只证明测试存在):把两处实现改回修复前行为后重跑,6 条转红,含「失败项保持选中」「中途新勾选项不得被静默丢弃」「壳内每项都有面包屑映射(缺项即红)」等核心断言。

测试抓出的两个额外缺陷(已一并修复):

  • /admin/任何未知路径 因壳根前缀匹配被面包屑判成「概览」
  • Webhook 空页时 pageEnd 算出 30 而非 0

结构变化(需二次关注):导航清单抽为 src/lib/admin-nav.ts 单一事实源,侧边栏与顶栏均从它派生。侧边栏图标映射改为按 id 查表,缺映射时抛错而非静默渲染空白。AdminTopBar.tsx 净减 38 行。

零新依赖:未引入 jsdom / testing-library / 图表库。决策逻辑抽为纯函数进现有 vitest 覆盖范围。

Verifier verdict

pending —— 独立复核尚未进行。

CI 五项检查(types / tests / lint / layering / security-scan)跑完前不合并。本 PR 承载行为变更,按 AGENTS.md 需记录独立复核结论(复核者 ≠ 实现过程),该结论将在复核完成后补入本段。

按 AGENTS.md「教训必须机器化」:三条缺陷均已有会红的回归测试,不再是仅写进文档的记录。

Checklist

  • Commits follow Conventional Commits
  • Branch named issue-<number>-<short-slug> and PR links the issue
  • No local-only files staged
  • Docs updated(回归矩阵已同步)

Notes for reviewer

  • 后端零改动。本工作区同时存在另一条 issue([P0] 管理后台:批量失败可见、Webhook 读数口径、面包屑缺 4 项映射 (#88) #89 LLM 预算熔断闸)的未提交后端在制品,与本 PR 无关且未被纳入任何一笔提交(提交前后端文件数恒为 0)。
  • 回归测试本身可被独立复核:_batch-utils.test.ts / _scope-utils.test.ts / admin-nav.test.ts 三个文件的断言与实现是否一一对应,有无自证式断言。
  • vitest.config.ts 把三个新模块加入 coverage include,沿用该文件既有的渐进式策略注释。

@fxbin

fxbin commented Sep 29, 2026

Copy link
Copy Markdown
Owner Author

独立复核结论与处置(verdict: hold → 已返工重验)

独立 verifier 子 Agent 对本 PR 做了变异测试证伪。生产代码(三条修复、导航 15 项数据、分层、门禁)未能被证伪;但它查出回归矩阵两处不实与接线层无保护,verdict 为 hold。已全部返工。

变异测试:4 项原本存活,现已全部被杀

变异 复核时 返工后
M1 批量选择态退回旧行为 3 条转红 3 条转红
M2 结果文案退回旧撒谎 3 条转红 3 条转红
M3 webhook 徽章整段还原修复前 179/179 存活 6 条转红
M4 删掉 failedIds.push(id) 179/179 存活 4 条转红
M4b 批量执行层整体删除 179/179 存活 6 条转红
M7 漂移 updates 的 label+href 零报警 1 条转红

处置内容

  1. buildSummaryBadges 新增(82c779b)——把「渲染成什么」也变成纯函数。缺陷 [Iteration] 2026-08 Stabilization — restore trusted main and adopt virtual dev team workflow #2 的真修复原本全在 JSX 里,.tsx 结构性不可测;现在失败徽章无条件渲染、全徽章带「本页」/「全部」口径词、空页只留 1 枚,全被断言锁住。
  2. runBatchToggle 新增(562fc37)——批量执行与失败收集下沉为纯函数。顺带加固一个复核没提、但我自己的测试抓出的问题:onError 自身抛错会中断整批,现在被隔离(留痕旁路不得弄垮主操作)。
  3. 导航 15 项字面值锁死(cb0ea63)——原测试只锁结构性不变量,label+href 同时漂移零报警。
  4. 回归矩阵四处更正(7346791):

一并修正的测试质量问题

  • _batch-utils.test.ts 一条用例名实相反(名叫「不把它强行加回」,断言却是 has(2) === true)——已改名并在注释里写明这是有意的重试入口契约,不是 bug。
  • 两条同义反复断言已换成真正能失败的写法:原 not.toBe(1238)(该函数不可能产出此值)改为「换 total 不改变页内计数」;原 successCount + failCount === 30(构造性恒等)改为逐条比对。

返工后门禁

  • tsc --noEmit 0 错
  • vitest run 195/195(复核时 179)
  • test:coverage lines 96.71 / branch 92.82 / func 100(阈值 90/85/90)
  • eslint 改动文件 0 错,warning 11 条全为存量(sources/page.tsx 未用 import,与 main 逐条一致,本次零新增)
  • 变异副本在 /tmp 下进行,仓库工作区未被改动

Verifier verdict

pass(第二次复核后)。依据:三条修复经变异测试证伪失败;导航 15 项 id/label/href/顺序逐项全等;window.open 与 isActive 判定零改动;无新增 lint 债;无本地文件夹带;后端零改动。

仍未关闭的遗留项(不阻塞本 PR,需独立认领)

  1. JSX 渲染层仍无组件测试 —— 本仓库无 jsdom / testing-library,徽章的 DOM 呈现、AdminSidebar 图标抛错路径仍靠不到机器。要机械化需引入组件测试基础设施,属独立 PR。
  2. 覆盖率门禁存在盲区 —— 新模块若被从 vitest.config.ts 的 include 删掉,text 表格仍绿(它们 100% 本就不显示),只有 lcov/HTML 能发现。建议在 test:coverage 后加断言。
  3. 历史提交边界瑕疵 —— 74d3ef7 混了两个用户可见行为;98967c4 标 test(frontend) 但含生产重构。改历史需改写提交,按 AGENTS.md 须单独审批,故未动,仅在此披露。

@fxbin
fxbin merged commit 08071e8 into main Sep 29, 2026
5 checks passed
@fxbin
fxbin deleted the issue-88-admin-silent-failure branch September 29, 2026 22:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant