# 安装与清理状态 ## 磁盘清理 `storage-analyzer/scripts/scan.py` 生成磁盘事实,分析结果 JSON 给出候选路径;静态 HTML 没有操作权限。只有本机 `server.py` 加入本轮 token、路径白名单和 `/action` 后,页面才可请求打开、移废纸篓或删除。 一次清理由页面按钮、`data-paths` 中尚未处理的路径、`.cleaned` 样式,以及服务器响应 `ok/error/done` 共同表达:待确认 → 处理中 → 完成/部分完成/结果未确认。`report_template.html` 的 `postAction` 管请求中按钮;`doDelete/doBatch` 更新剩余路径和完成徽标;`server.py:Handler.do_POST` 先校验整批,再依序调用操作系统,每做成一路才加入 `done`。 请求执行时禁用同一组的整组和单项按钮,避免批量清理尚未结束就从单项入口再次处理相同路径;收到结果后恢复未完成项的按钮。 部分失败必须保留 `done`:已做成的路径从后续请求移除,完成的项去掉删除按钮,未完成的项仍可在再次确认后处理。不能只看 `ok=false` 就把全部路径都当没做过;缓存可能已重新生成,再次全量删除会处理用户上次操作后产生的数据。单项含多个路径和整组操作使用相同的剩余路径计算。网络断线而未收到 `done` 时显示连接失败,不宣称已删;重新扫描才能确认磁盘事实。进程重启不会从旧页面自动续删。 `35bd05b`(#74)的批量校验、工作树保护与已不存在路径处理保留;#80 复现并修复了“第一条成功、第二条失败,重试仍提交第一条”的页面错误,没有证据表明它造成过实际误删。 ## AIHOT Skill 安装与分析身份 `aihot/install.sh` 是 AIHOT 发行文件的镜像,源在 AIHOT 仓库,不能独立修它。安装状态散在用户级安装锁、临时包、原目录临时备份,以及进程变量 `TARGET_ACTIVATED/COMMITTED/CLAUDE_COMPAT_CREATED`:未开始 → 获锁 → 下载验签 → 暂存旧目录 → 激活新目录 → 提交 → 清理;提交前失败由 EXIT trap 恢复旧目录和兼容链接。下载不完整或哈希不符不能进入激活。锁冲突拒绝并行安装,不能把陈旧锁自动当成无人执行;强杀无法执行 trap 时需要根据已有目录核实,不自动覆盖残留。 可选分析身份由 `.aihot-actor-id` 与 `.aihot-actor-disabled` 表达:有身份、主动退出、未生成/无身份。主动退出优先于旧 ID;显式 `--actor` 才重新加入;多个旧目录身份冲突时不任意挑一个。它不是登录凭据,身份失败不能改变包是否安装成功。`tests/test_installer.py` 验证旧目录迁移后 Claude 入口仍指向唯一共享安装。镜像同步历史见 `1e6adab` 与 #74。 ## 没有持久业务状态的部分 `leader`、`khazix-writer`、`neat-freak`、`hv-analysis` 的主体是指令和一次性校验/生成程序;`neat-freak/evals/fixtures` 是假的评测项目。它们没有后台任务、数据库、商务或意见生命周期,不把流程文字或测试变量伪算为线上状态机。另一个仓库 `human-writing` 同样是静态 Skill 与文本校验工具,不受本仓库状态影响。