scratch = E:\KuGou\2026-09-15-18-17-47\android_mcp\tools\revpaths_tmp
  [PASS] DIR_NAME = REVMCP
  [PASS] LEGACY_DIR_NAMES 含 revmcp 与 RevMCP
  [PASS] DIR_NAME 不在旧名单里（避免自我搬迁）
  [PASS] describe() 写出完整路径（含 REVMCP）
  [PASS] 未 configure 时 root() 非 null
  [PASS] 未 configure 时 provisional() = true（临时兜底）
  [PASS] 未 configure 时 isPublic() = false
  [PASS] 临时状态下 logs/work/input/out 均已建出
  [PASS] 从临时状态升级：root 变成公共目录
  [PASS] 升级后 provisional() = false
  [PASS] 升级后 isPublic() = true
  [PASS] 升级后 work() 在公共目录下
  [PASS] 升级后 describe() 不再报「非最终目录」
  [PASS] 正式目录粘性：再次 configure 不改 root
  [PASS] 正式目录粘性：isPublic 仍为 true
  [PASS] wanted() 刷新为最新传入的公共目录（便于提示用户）
  [PASS] 公共目录不可写 → 回落到私有候选
  [PASS] 回落私有目录仍 provisional() = true（**可升级**，不是终局）
  [PASS] 回落私有目录后 isPublic() = false
  [PASS] describe() 写明当前目录
  [PASS] describe() 写明期望目录（不静默换目录）
  [PASS] describe() 标注「非最终目录」
  [PASS] 补授权后再 configure → 升级到公共目录（本 bug 的正面断言）
  [PASS] 升级后 isPublic() = true（授权后不再停在私有目录）
  [PASS] 候选不可写 → provisional() = true
  [PASS] 候选不可写 → why 标注临时目录
  [PASS] 授权后自动升级到公共目录（先启动后授权场景）
  [PASS] 升级后 isPublic() = true
  [PASS] 无候选时 root() 非 null（兜底不崩）
  [PASS] 无候选时 provisional() = true
  [PASS] fallback 不可写 → 不选它（转临时）
  [PASS] fallback 不可写 → provisional() = true
  [PASS] parentOfLogs() = root()
  [PASS] ensure(null) = false
  [PASS] 未选择 → 落私有候选（不崩、可用）
  [PASS] 未选择 → isChosen() = false
  [PASS] 未选择 → chosen() = null
  [PASS] 未选择 → isPublic() = false
  [PASS] 未选择 → provisional() = true（不是最终位置）
  [PASS] 未选择 → why 写明「未选择产物目录」
  [PASS] 未选择 → describe() 给出「选择目录」指引
  [PASS] 选定可写目录 → root = 选定目录
  [PASS] 选定后 isChosen() = true
  [PASS] 选定后 isPublic() = true
  [PASS] 选定后 provisional() = false（终局）
  [PASS] 选定后 why 写明「用户选定目录」
  [PASS] 选定后 describe() 列出「已选目录」
  [PASS] 选定后 work() 落在选定目录内
  [PASS] 用户选定后，自动 configure() 不覆盖（用户说了算）
  [PASS] 选定目录不可写 → 落回可写目录（不崩）
  [PASS] 选定目录不可写 → isPublic() = false
  [PASS] 选定目录不可写 → 仍记录 chosen（用户的选择没丢）
  [PASS] 选定目录不可写 → why 写明「已选目录不可写」
  [PASS] 选定目录不可写 → provisional() = true（授权后可升级）
  [PASS] 选定目录不可写 → describe() 同时列出已选目录与实际落点
  [PASS] 阻塞文件删除成功（模拟授权后目录可写）
  [PASS] 授权后重选同一目录 → 立即生效
  [PASS] 授权后重选 → isPublic() = true
  [PASS] primary:XXX → 内部存储下的路径
  [PASS] primary:多级子目录
  [PASS] 前后多余斜杠被规范化
  [PASS] 外置卷 UUID:xxx → /storage/<UUID>/xxx
  [PASS] PRIMARY 大小写不敏感
  [PASS] 空卷标按内部存储处理（primary: 的等价写法）
  [PASS] primary: 根 → 返回存储根（由界面决定是否补子目录）
  [PASS] Downloads 提供方的 docId（无卷标）→ null（界面提示换位置）
  [PASS] null docId → null
  [PASS] null primaryRoot → null
  [PASS] canWrite(可写目录) = true
  [PASS] canWrite(父级是文件的路径) = false
  [PASS] canWrite(null) = false
  [PASS] insideRoot(子路径) = true
  [PASS] insideRoot(根本身) = true
  [PASS] insideRoot(根之外) = false

== RevPathsTest: PASS=74 FAIL=0 ==
