# Desktop / CLI / Keychain / VM

路径只是 macOS 发现入口，不是删除清单。优先依据当前安装包、配置和实际打开文件确定根目录与版本；不要在搜集证据时运行会初始化或迁移数据的客户端。

## 一次列全入口

| 边界 | 候选入口 | 核验与默认保护 |
|---|---|---|
| Claude Code | `~/.claude/`、`~/.claude.json`、实际 `CLAUDE_CONFIG_DIR` | `projects` 正文、history、skills、plans、tasks、用户设置及项目文件先保护。 |
| Desktop | `~/Library/Application Support/Claude/`、应用 plist、`~/Library/Logs/Claude/` | `claude-code-sessions`、`local-agent-mode-sessions`、scratch/workspaces、git-shadow、上传与作品按实际存在性建清单。不能整个 Reset Application Data。 |
| 平台缓存 | `~/Library/Caches/` 下实际归属的 Desktop/CLI 路径 | 与 Application Support 内的 Cache 独立发现；缓存可含唯一对话正文。 |
| 其他认证来源 | 当前环境、shell/IDE 配置、managed settings、已发现的 wrapper / API helper | 只报变量/键的存在及归属；不打印值，不遍历全机进程环境。产品 API 凭据不等同于旧消费者账号。 |
| 项目级配置 | 从实际会话 `cwd` 等发现工程根，检查 `CLAUDE.md`、`CLAUDE.local.md`、`.claude/`、`.mcp.json` | 工程指令、开发启动配置不是登录指纹；嵌套工程未查就明示范围。 |
| 诊断报告 | 用户及系统 `Library/Logs/DiagnosticReports` | 先文件名，再应用/进程归属字段；不按扩展名一并删除其他程序报告，不从本地存在推断已上传。 |

CLI 的配置目录与安全凭据命名空间可能不同。`CLAUDE_SECURESTORAGE_CONFIG_DIR`、Keychain 服务后缀/路径哈希等必须从实际版本实现确认；查默认路径没有结果，不代表所有替代路由都不存在。当前工具环境也不能代表已运行的所有终端。

旧身份基线与当前身份分开保存。账号目录只是候选来源；新账号已经登录后，不能再把现存 UUID 目录全部采集成“旧账号列表”。必要时从已确证的旧索引或封存映射取基线，只在受控内存/私有工作区比较，日志不写原值。

同一设备的用户转述、其他电脑的清理报告和历史安装版本只作线索。Windows 的 MSIX、凭据和会话路径必须在 Windows 实际发现，不能把本机 Mac 的验收结果转移过去。

## 认证、匿名与混合配置

- 按解析后的精确键路径和旧值归属制定删除规则，例如当前版本实际使用的 OAuth/account/user/install/token-cache 字段。不要递归删除所有叫 `id`、`user` 或 `token` 的键。
- 设备注册缓存、遥测盐、用量计数、组织模型缓存、旧身份自动备份、组织来源 URL、链接签名等都需先验证用途与依赖。保留实际安全规则、用户偏好及非目标值。
- `ant-did` 等登录页生成的随机匿名值不自动属于旧账号。删除后再次访问会重建，应报告“旧状态移除”和“新状态生成”两件事。
- Cookies 按 host 边界筛选；第三方挑战 Cookie 必须有精确 host、name、所在库及用途依据。DIPS 精确站点行；Network Persistent State 精确 server / alt-service 项，保留全局 QUIC 和其他网站记录。
- HSTS、安全信任策略、OS/架构、安装二进制、只有空 query/mutation 的缓存，不因看起来像标识就删除。
- 小配置用结构化读取和全量非目标比较；SQLite/LevelDB 的解析与废弃字节问题按 [browser-stores.md](browser-stores.md) 处理。

账号命名空间、安装/设备随机 ID、遥测哈希盐、本地用量计数、公共服务 UUID 并非同一种东西。例如字段名含 `token` 也可能只是用量计数，设备注册映射也不等于其关联的硬件私钥。以实际读写用途判断；删除旧组织来源 URL 时保留安全规则本身，移除空的旧工程信任记录不等于删除工程。

遇到疑似连接器标识，可先检查对象是否含 owner/install/account 字段，再对照当前随包代码、schema 或可靠官方资料。若同一值是硬编码产品别名或协议路由常量，可归为共享服务元数据并关闭该疑点；只在同一旧账号的多份记录重复出现，不能证明它是公共常量。文件名使用截断 UUID、哈希或前缀时，也必须核对实际映射逻辑，不能因没有完整 UUID 就排除旧账号归属。

## 会话与预览必须分别保护

从当前元数据 schema 发现 Desktop 索引到 CLI transcript 的关系，核对每条引用；不能只比较总文件数。若字段为 `cliSessionId` / `cwd`，也须先验证实际语义。现有缺失与本次新损坏分开。

原线程文件还在，不代表新账号界面会显示旧账号命名空间里的记录。清理不自动迁移索引或执行跨账号 `/resume`；用户只要查阅时采用被动离线读取，不把“恢复可读”偷换为“恢复登录、续聊或执行旧工具”。

Electron 的预览 partition 可能持有其他网站登录、Local Storage 和作品。Claude 主登录存储可清，不代表全部 partitions 可清；对保留分区建立完整清单或等效记录基线。

## Keychain 三类对象

1. **普通账户凭据**：先只查询服务属性，禁取 secret data 和认证 UI；对当前版本服务名/命名空间做精确归属判断。删除须在当前授权内，随后用属性回读确认。
2. **Electron Safe Storage**：应用级本地加密材料，可能同时保护预览中其他站点的密文。存在不证明属于旧账号；默认保留。名称、时间戳不能替代依赖分析。应用归属或机制不明时核对匹配 Electron 版本源码。
3. **受 entitlement 保护的硬件密钥**：访问拒绝只能报告“存在性未知”。记录一次明确失败，不绕权限、不改 ACL、不反复触发系统认证，也不将其混同为 Safe Storage。

不导出整个钥匙串、不解密 Cookie、不安装额外工具只为“证明全无”。独立的旧链接签名文件可以单独评估，但要说明旧链接验证能力的影响。

## Cowork / VM 是条件分支

只有确认旧 VM 状态在范围内才处理。先检查进程占用、host 挂载目录、guest 独有内容、会话与实际工程依赖。不要按大文件/可下载文件名认定可删。

有匹配版本的可靠官方镜像时可比较 guest 差异；没有参考或无法解读就保留未知内容。需保全的设置用中性目录导出，逐文件核验；不复制账户外壳来冒充内容包。

退役 VM 后核验 host 工程、会话文件和索引。未启动新的 VM 就明确首次重建和历史会话可续用尚未验证；不要为补这个证明越过用户“不访问/不启动 Claude”的边界。

## 查询依据

- [Claude Code 设置](https://code.claude.com/docs/en/settings)：配置作用域和当前支持项。
- [Claude Code 认证](https://code.claude.com/docs/en/authentication)：平台认证存储；执行时核对当前文档及本机实现。
- [Electron safeStorage](https://www.electronjs.org/docs/latest/api/safe-storage)：平台加密机制；账号归属仍需本机证据。

这些文档不构成某台机器已经退出登录、服务端已经撤权或设备关联已经消失的证明。
