Skip to content

[v1.6 QA Gate] 防止假修复:逐项修复证据、实机验收与禁止糊弄规则 #90

Description

@weidonglang

背景

v1.5.3 之后多次出现“issue 已关闭 / release notes 写已完成 / CI 通过”,但真实使用仍然发现功能没有闭环的问题。典型表现包括:

  • 后端字段或类型加了,但 UI 没有可见入口。
  • 写了 release notes,但按钮实际没有绑定或没有后端 command。
  • 只做了提示文案,没有真正执行修复闭环。
  • 只做了底层函数,没有做用户能看到的明细列表、失败提示、复制路径、打开位置等体验。
  • issue 被关闭,但没有实机截图、命令输出、PR diff 证据和手动验收记录。

本 issue 的目的不是新增功能,而是建立 v1.6 QA Gate:要求 Codex / 开发者必须用可验证证据证明每个问题真的修了,不能再用“已实现 / 已优化 / 已通过 CI”来糊弄。


总原则

v1.6 不做大功能,不新增系统管家能力,不扩大危险操作范围。

v1.6 的目标只有一个:

把 v1.5.3 已经声明、已经关闭但用户实际没感知到的能力,修到真实可用、可理解、可验收。

任何修复都必须满足三层证据:

  1. 代码证据:指出改了哪些文件、哪些函数、哪些 UI 入口、哪些后端 command。
  2. 运行证据:给出本机运行后的截图 / 日志 / 命令输出 / 操作步骤。
  3. 验收证据:逐条对照本 issue 与 [v1.5.3 QA Blocker] 真实复测问题:安全模式、桌面急救、MySQL 排版、JDK 候选、端口识别与通知体验 #89[1.5.2 Patch 总控] 基于真实用户反馈修复路径展示、端口误判、外部运行时安全、桌面急救与白屏兜底 #57[1.5.2 Patch] Java/JDK 候选管理与环境医生联动,支持外部 JDK 设为 JAVA_HOME 但禁止卸载 #61[1.5.2 Patch] 桌面急救/大文件/重复文件打开目录精确化,不再只打开总目录 #62[1.5.2 Patch] 页面帮助说明增强:从口号式安全提示改为可操作使用指南 #63[1.5.2 Patch] 前端启动白屏兜底、全局错误页、日志入口与 UI 配置恢复 #64[1.5.2 Patch] 端口检测全面增强:识别准确性、详情解释、风险分级、历史记录与项目端口联动收口 #66[1.5.2 Patch] MySQL 修复中心系统库缺失/不完整疑似误报:补齐诊断证据、连接验证、风险分级、强制备份与三次确认 #67[1.5.2 Patch] 端口管理进阶特色增强:软件识别库、智能快捷操作、项目联动与证据评分体系 #71[1.5.2 Patch] 端口管理界面布局优化:摘要优先、筛选分层、表格轻量、详情抽屉承载复杂信息 #72[1.5.2 Patch][P0] 高危操作增加后端 confirmation token,避免只依赖前端确认 #74[1.5.2 Patch][P2] 前端 main.ts 拆分为 feature modules,降低白屏和回归风险 #82 的验收清单,明确“通过 / 未通过 / 不适用”。

没有证据,不能关闭 issue。


禁止行为

开发过程中禁止以下行为:

  1. 不允许只改 README、release notes、文案就关闭问题。
  2. 不允许只加类型定义、mock 字段、占位 UI 就说完成。
  3. 不允许把按钮做出来但没有事件绑定。
  4. 不允许前端调用不存在的后端 command。
  5. 不允许用 console.log 或 TODO 代替真实修复。
  6. 不允许把“后续阶段开放”“等待结果”“Phase N”这种半成品入口继续留在稳定版主界面。
  7. 不允许隐藏错误,只能让错误更可理解、更可关闭、更可复现。
  8. 不允许关闭 issue 时只写“已完成”“已优化”“测试通过”。
  9. 不允许用 CI 通过代替 Windows 实机验收。
  10. 不允许新增大功能来掩盖原问题没有修好。
  11. 不允许提交安装包、target、dist、node_modules、release-assets、临时 probe 文件。
  12. 不允许 git add .
  13. 不允许 force push。
  14. 不允许 amend 已公开提交。
  15. 不允许在 main 未合并前打 release。

必须修复的问题范围

本 issue 不重新定义新需求,只约束以下已发现问题的修复质量。

P0-1:安全模式必须真的可用

关联:#64#89

必须修到:

  • 不再出现 Command plugin:dialog|confirm not allowed by ACL
  • 安全模式页面自己不能再次触发未处理异步错误。
  • 安全模式提示可关闭或折叠。
  • 安全模式说明要人话化:说明它是异常兜底,不会自动扫描、修复、清理、安装、停止服务或写环境变量。
  • 重试、重置 UI 配置、打开日志目录、复制诊断信息都必须能点。
  • 安全模式下不得自动执行任何扫描、修复、清理、安装、停止服务、写环境变量动作。

必须提供证据:

  • 修复前错误来源说明:哪个调用触发了 plugin:dialog|confirm
  • 修复后相关代码位置:安全模式不依赖 Tauri dialog confirm,或 capability 最小授权已补齐。
  • 一张安全模式页面截图。
  • 点击重置 UI、复制诊断、打开日志目录的实测结果。
  • 明确说明普通 toast 不会卡住“已进入安全模式”。

验收方式:

模拟 localStorage 损坏或前端初始化错误 → 启动软件 → 进入安全模式 → 无 ACL 报错 → 提示可关闭 / 折叠 → 四个恢复按钮可用。

P0-2:桌面急救 / 大文件必须有明细和精确定位

关联:#62#89

必须修到:

  • 桌面急救和大文件扫描不只显示分类汇总。
  • 必须显示大文件明细列表。
  • 每条记录至少包含:文件名、完整路径、所在目录、大小、修改时间、扩展名/类型、来源分类、是否仍存在、是否可定位。
  • 每条记录必须有:打开所在目录、资源管理器中选中文件、复制完整路径、复制所在目录、重新扫描。
  • 分类卡片点击“查看明细”时显示该分类 Top N 文件,而不是只打开桌面或下载根目录。
  • 文件不存在、被移动、无权限、云盘占位文件未下载时,必须给明确提示。
  • 超长路径不能撑爆 UI。
  • 不自动删除、不自动移动文件、不读取文件内容。

必须提供证据:

  • 大文件结果截图,里面能看到具体文件名、大小、路径、修改时间。
  • 点击“打开所在目录 / 选中文件”的实测说明。
  • 删除或移动一个扫描出的文件后,再点打开时的错误提示截图。
  • 代码证据:后端返回结构、前端渲染明细、open/select 文件分支。

验收方式:

在桌面和下载目录分别放置测试大文件 → 扫描 → 查看明细 → 复制路径 → 打开所在目录 → 资源管理器选中文件 → 删除其中一个文件 → 再次打开显示“已移动或删除,请重新扫描”。

P0-3:MySQL 修复中心必须可读、可信、不吓人

关联:#67#89

必须修到:

  • MySQL 候选卡片重新排版,不能把字段横向硬塞。
  • 分区展示:概览、结论、证据、风险、备份、操作。
  • 长路径必须 ellipsis + title/tooltip 或详情层 + 复制按钮。
  • PermissionUnknown / Running 必须用人话解释:Data 目录不可读,因此不能下结论,不等于系统库一定损坏。
  • 正常运行 / 端口可连接 / 服务存在时,不得直接判定 LikelyBroken。
  • 高危修复必须要求 backup manifest + confirmation token。
  • 无有效备份时,不允许执行补库等高危修复。

必须提供证据:

  • MySQL 修复中心截图,证明排版不挤。
  • PermissionUnknown 场景的人话提示截图。
  • 无备份时执行高危修复被拦截的截图或日志。
  • 有备份 manifest 时计划预览截图。
  • 代码证据:诊断状态映射、UI 分区、备份校验、token 校验。

P0-4:外部 JDK 必须可验证、可作为 JAVA_HOME 候选,但不能被接管

关联:#61#89

必须修到:

  • 外部 JDK 能执行只读验证:java -versionjavac -versionjar --version 或等价命令。
  • 外部 JDK 可以作为用户级 JAVA_HOME 候选。
  • 外部 JDK 可以生成 Java 稳定修复计划。
  • UI 明确区分:验证此 JDK、设为用户级 JAVA_HOME、切换 DevEnv 受管版本。
  • 外部 JDK 不得显示卸载、删除目录、接管 third-party manager current 等按钮。
  • SystemInstaller、Scoop、Chocolatey、mise、asdf、IDE bundled JDK 都要显示来源分类。

必须提供证据:

  • 外部 JDK 候选列表截图。
  • 点击验证后显示 java / javac / jar 三项结果截图。
  • 设为 JAVA_HOME 计划预览截图。
  • 证明外部 JDK 没有删除/卸载按钮。
  • 代码证据:验证 command、JAVA_HOME 计划、外部来源保护。

P0-5:高危操作必须有后端 token,不能只靠前端 confirm

关联:#74#89

必须修到:

  • 建立统一高危操作登记表,列出 command、风险等级、是否需要备份、是否需要 confirmation token。
  • 后端执行函数必须自己校验 token。
  • 前端 confirm 只能作为用户体验,不能作为安全边界。
  • token 必须绑定 action_id、plan_id、risk_level、plan_fingerprint。
  • token 必须单次使用、过期失效、plan 不匹配拒绝、重复使用拒绝。

至少覆盖以下命令:

apply_env_repair_plan
restore_user_environment
cleanup_path_entries
apply_user_environment_configuration
manage_system_platform
manage_local_service
stop_local_service
apply_project_configuration
update_project_port
rollback_move
execute_move_plan
execute_expansion_plan
clear_download_cache
clean_dev_cache
kill_process
execute_mysql_repair_plan

必须提供证据:

  • 后端登记表代码位置。
  • 每个高危 command 是否需要 token 的清单。
  • 单元测试:无 token、过期 token、plan 不匹配、重复使用均拒绝。
  • 至少一个前端高危操作的完整流程截图:预览 → 生成 token → 执行 → 结果。

P1:必须做的稳定版收口

1. 首页去掉迁移状态,改为版本更新卡片

必须修到:

  • 首页不再展示“迁移状态”。
  • 首页展示当前版本、最新版本、检查时间、是否有更新、下载/Release 入口。
  • 启动时检查更新默认开启,但失败不能阻断主界面。
  • 如果更新下载/安装后端闭环不完整,就不要展示下载/安装按钮,只展示打开 Release 或复制链接。

证据:

  • 首页截图。
  • 手动检查更新截图。
  • 断网时轻量失败提示截图。
  • 代码确认 check_for_updates / download_update / launch_update_installer 后端 command 存在并注册;若不存在,必须降级按钮。

2. 页面帮助改成真正的使用指南

必须修到:

  • 不再使用空泛口号。
  • 每页说明:能做什么、适合场景、第一步、只读操作、会修改系统的操作、是否需要备份、失败怎么办、不会做什么。
  • “这个页面怎么用?”改名或重构,避免和命令面板功能重复。
  • MySQL、端口管理、桌面急救、环境医生、JDK/Python/chsrc 要有专门说明。

证据:

  • 至少 5 个主要页面的帮助截图。
  • 代码中对应 featureHelp 或 help content 的文件位置。

3. 环境医生安全修复不能像摆设

必须修到:

  • 没有可修项时,不显示“安全修复”主按钮,改为“查看建议”。
  • 有可修项时,必须显示修复计划预览。
  • 每条问题说明:问题是什么、影响什么、是否可自动修复、为什么可以/不可以修。
  • 执行后显示结果明细,不用 window.alert 展示复杂结果。

证据:

  • 无可修项状态截图。
  • 有可修项计划预览截图。
  • 执行结果明细截图。

4. Toast / 通知统一

必须修到:

  • 普通成功通知 5 秒后自动消失。
  • 普通信息通知 5 秒后自动消失。
  • 警告可停留更久,但必须可关闭。
  • 错误可保留,但长错误默认折叠,必须可关闭。
  • 页面切换后不残留大量旧 toast。
  • 安全模式和高危确认类提示不自动消失,但必须可关闭或折叠。

证据:

  • showToast 或 toast manager 代码位置。
  • 成功通知自动消失的实测说明。
  • 错误通知可关闭截图。

5. 端口管理必须让用户看懂

必须修到:

  • 1冲突 可点击或展开,展示冲突来源、端口、项目配置、常见服务、置信度、建议操作。
  • unknown 进程要进一步分析:文件名、路径、签名/公司名、父进程、命令行关键词、是否系统目录、是否常见软件目录。
  • 常见进程识别库补齐:System、QQ.exe、msedge.exe、steam.exe、svchost.exe、VMware、NVIDIA、ArmouryCrate、MuMu、Autodesk、Kaspersky 等。
  • 系统关键进程不显示“安全结束”。
  • 不得只凭 3000–9999 端口归类为 development。

证据:

  • 端口列表截图。
  • 冲突详情截图。
  • System / lsass / services 等不显示结束按钮截图。
  • unknown 详情截图。
  • 单元测试:Steam/QQ/Edge 不被判 Spring,unknown 8080 保持低置信度,系统关键进程 blocked。

6. 去掉半成品入口和开发者本机痕迹

必须修到:

  • 项目启动向导不再硬编码 E:\pycode\dailytools
  • C 盘急救隐藏“后续阶段开放”“等待清理结果”等 tab。
  • 去掉 Phase N、真扩容主入口、系统管家感文案。
  • Docker / WSL / 自卸载等系统级入口默认折叠到高级区或降级为诊断/复制官方入口。

证据:

  • 项目页面默认空路径截图。
  • C 盘急救页面截图,证明没有半成品 tab。
  • 工具箱截图,证明系统级高危入口已降级。

7. main.ts 模块化只做必要拆分,不大重写

关联:#82

必须修到:

  • 至少拆出 toast / safe mode / update / ports / mysql / cleanup / jdk 的 UI 和事件逻辑。
  • main.ts 只保留应用启动、顶层路由、全局状态组装和模块注册。
  • 不大改视觉,不引入大框架。
  • 每拆一块都要保持 npm run build 通过。

证据:

  • 文件结构截图或列表。
  • main.ts 行数变化。
  • 每个模块负责范围说明。

必须提交的验证材料

修复 PR 的正文必须包含以下内容。缺一项不允许合并。

1. 修复矩阵

格式必须类似:

问题 关联 issue 修改文件 用户可见变化 验收证据 状态
安全模式 ACL #64 #89 xxx.ts / xxx.rs 不再报错,可关闭 截图 + 日志 通过

2. 命令验证

必须运行并贴出结果:

cd tauri/src-tauri
cargo test --all-targets
cargo clippy --all-targets -- -D warnings

cd ..
npm ci
npm run build
npm run tauri:build

cd ..
py -3 scripts/check_repo_hygiene.py

如果某条失败,不能合并,必须说明失败原因并修复。

3. Windows 实机手测记录

至少覆盖:

安全模式
桌面急救大文件定位
MySQL 修复中心
外部 JDK 验证
端口冲突解释
环境医生安全修复
首页更新卡片
通知自动消失
项目页默认路径
半成品 tab 隐藏

每项要写:

操作步骤:
预期结果:
实际结果:
证据:截图 / 日志 / 命令输出
结论:通过 / 未通过

4. 代码自查 grep

PR 中必须给出以下自查结果:

rg "E:\\pycode|后续阶段开放|等待清理结果|Phase 3|Phase 4|C 盘急救大师|真扩容" tauri/src
rg "window.alert|window.confirm" tauri/src
rg "check_for_updates|download_update|launch_update_installer" tauri/src-tauri/src tauri/src
rg "TODO|placeholder|暂未|尚未生成|后续阶段" tauri/src tauri/src-tauri/src

要求:

  • 第一条不应在稳定版主 UI 中出现。
  • window.alert/window.confirm 只能保留在低风险或已说明场景,高危操作不能只靠它。
  • 更新相关 command 必须前后端闭环。
  • TODO / placeholder 不得出现在用户可见稳定版主路径。

5. Release 前检查

发 v1.6 前必须确认:

  • PR 已合并到 main。
  • tag 从 main 当前提交创建。
  • Release asset 是真实 NSIS 安装包,不是错误文件。
  • update-manifest.json 的 version、downloadUrl、sha256 对应真实 asset。
  • README 不夸大能力。
  • docs/release-v1.6.md 只写真实修复,不写未完成能力。
  • 安装包可下载、可安装、可启动。

关闭规则

本 issue 不能由 Codex 自己一句“已完成”关闭。

关闭前必须满足:

  1. 所有关联 issue 的 P0 全通过。
  2. P1 至少全部有明确处理:修复 / 降级 / 隐藏 / 明确不做。
  3. PR 正文包含修复矩阵、命令验证、Windows 手测记录、grep 自查。
  4. 用户实际安装 v1.6 后确认核心问题不再复现。
  5. 没有新的半成品入口、硬编码本机路径、未绑定按钮、缺失后端 command。

如果某项无法完成,必须在 PR 中明确写:

未完成项:
原因:
用户可见影响:
临时降级方案:
后续 issue:

不能用模糊话术代替。


对 Codex 的一句话要求

不要再只让 CI 通过、issue 关闭、release notes 写漂亮。

这次要让用户打开 v1.6 后能实际看到:

  • 安全模式不炸。
  • 大文件能定位。
  • MySQL 页面能读懂。
  • JDK 能验证。
  • 端口冲突能解释。
  • 高危按钮更少、更安全。
  • 半成品入口消失。
  • 通知不挡人。
  • 首页像正式软件。

修不到这个程度,就不要发布 v1.6 Stable。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions