结果快,但边界不可见
- 角色
- 产品设计与原生工程(风险模型 / 本地诊断)
- 时间
- 2026 · local macOS build, ongoing
- 平台
- macOS / SwiftUI / SwiftPM
清理不是找到最多能删的文件,而是让每一次删除都能被理解和确认。
01 / Context
不是“一键清理更多”

界面先解释空间从哪里来,再让用户检查候选项和风险。
02 / Framing
信任来自看得见的边界
- 把推荐项、可选项和高风险项分开。
- 风险说明必须早于清理按钮。
推荐、可选与高风险分开
产品判断从“最大清理量”转向“可解释的安全边界”。
03 / Decision
先诊断机器,再决定是否删除
磁盘问题与 CPU、索引和浏览器残留一起被观察,不把清理孤立成单次动作。
04 / Flow
把删除放到流程后半段
观察 → 归因 → 审核 → 清理 → 持续守护
操作按钮被放在归因和审核之后,避免把删除变成默认答案。
05 / Boundary
本地优先,也要范围优先
Primary scope
Avoid by default
Opt-in migration
Managed guard
User-owned action
扫描以用户目录为主,已有内容默认不移动;临时项迁移必须显式开启。
06 / Delivery
证据包括不能声称的部分
仓库与本地 App artifact 可核验;本轮工具链无法加载 XCTest,因此不声称测试通过。
体验深描
痛点、用户故事与交互设计
这一段不讲技术栈,只讲「人在什么处境下用它、哪里卡住、我做了什么回应」。
我的痛点
这些项目都从我自己被卡住的地方开始。
- P01
磁盘突然满了,系统只告诉我「其他」占了两百多 G——等于什么都没说。
- P02
同类清理工具把「能删」当成「该删」,一键之后我不知道自己失去了什么。
- P03
看不到风险边界,就建立不了信任;建立不了信任,这类工具我就不敢用。
- P04
清完过两周又满,说明单次扫描解决不了根因。
- P05
机器发烫、CPU 高和磁盘变满往往同源(残留的 headless 浏览器、Spotlight 索引),却没有工具把它们放在一起看。
用户故事
写成「作为…我想…以便…」,每条对应一个可验证的产品动作。
- US01
作为磁盘突然变满的人,我想先看到空间到底由什么构成,以便知道该从哪下手。
- US02
作为怕误删的人,我想每个候选项都标注风险等级,以便由我决定删不删。
- US03
作为不信任「一键」的人,我想逐项勾选并确认,以便清理是我的选择而不是工具替我做的决定。
- US04
作为机器反复发烫的人,我想同时看到 CPU 热点进程与残留浏览器,以便找到反复出现的根因。
- US05
作为长期使用者,我想临时目录被 .noindex 持续守护,以便同一个问题不再复发。
用户体验旅程
按真实使用顺序展开:此刻在做什么 / 哪里有摩擦 / 产品怎么回应。
交互细节
决定「用起来顺不顺」的微观判断。
- 解释先于按钮
- 风险说明在版面上必须排在清理按钮前面——位置本身就是产品态度。
- 没有一键清理主按钮
- 主路径固定为 Scan → Review → Select → Clean,先诊断再操作。
- 扫描聚焦用户目录
- 扫描逻辑以用户目录为主,明确避开系统级高风险路径。
- 迁移不隐式发生
- .noindex 受管目录需要显式开启,工具不会自作主张搬动已有内容。
- 清理后给报告
- 执行完成后说明释放了多少、动了哪些路径,让每次操作可复盘。
设计细节
视觉系统、状态语言与节奏上的取舍。
- 把清理做成诊断界面
- 目标不是「删得多」,而是让人读懂机器状态后自己做决定,从而降低恐惧感。
- 风险分层的视觉语言
- 可操作 / 高风险 / 推荐三类使用不同的视觉权重,避免用户在同一层级里误判。
- 本地窗口应用形态
- 高敏感操作不依赖云端,SwiftUI 桌面应用的形态与信任要求匹配。
- 五种状态各自可读
- 扫描、选择、报告、机器健康与持续守护各有独立的状态呈现,不复用同一种强调方式。