Skip to content

修复隔离 Science 的 SSH Host 枚举与 Runtime 更新复用 - #67

Open
RerrentLinden wants to merge 2 commits into
SuperJJ007:mainfrom
RerrentLinden:codex/fix-isolated-science-ssh-aliases
Open

修复隔离 Science 的 SSH Host 枚举与 Runtime 更新复用#67
RerrentLinden wants to merge 2 commits into
SuperJJ007:mainfrom
RerrentLinden:codex/fix-isolated-science-ssh-aliases

Conversation

@RerrentLinden

@RerrentLinden RerrentLinden commented Jul 21, 2026

Copy link
Copy Markdown

背景

本 PR 合并处理隔离 Claude Science 的两项相关问题:

  1. 已允许使用系统 SSH 配置,但 Add SSH host 页面仍无法枚举系统 Host alias;
  2. 隔离实例显示 You're up to date,实际却运行 App 内置旧 build,而官方实例已经运行 updater 下载的新 build。

根因

SSH Host 枚举

现有受管 stub 只写入绝对路径 Include。系统 OpenSSH 会展开 Include,但当前 Science Host picker 只扫描当前配置文件中的字面 Host 声明,因此隔离实例得到 0 个 alias。

Runtime 更新语义

隔离实例使用虚拟身份和独立 data-dir;即使临时移除 --no-auto-update,更新状态仍返回 not signed in to claude.ai。Science 页面把 latest=null 与更新错误合并显示为 You're up to date,造成误报。官方实例实际执行 updater 下载到 ~/.claude-science/bin/claude-science 的新版 executable,而 CSSwitch 原先始终优先启动 App 内置旧 executable。

改动

SSH bridge

  • 升级为 v2 受管 stub:保留绝对 Include,同时投影系统配置中的安全、显式、顶层 Host alias;
  • 过滤通配符、否定 pattern,以及 HostNameUserPortIdentityFileProxyCommandMatch 等连接参数;
  • alias 稳定去重,并限制为最多 512 条、64 KiB;提取异常时 fail closed;
  • 支持 v1 原子迁移及 v1/v2 严格撤销;外来配置、伪造 marker、symlink、FIFO 均保留并明确报错。

Science runtime

  • 新增 official_downloaded runtime 来源,只读检查精确路径 ~/.claude-science/bin/claude-science
  • 选择顺序调整为:有效 SCIENCE_BIN override > 官方已下载 runtime > App 内置 runtime > 用户明确授权的一次性 cache;
  • 对候选继续执行绝对路径、非 symlink、regular executable、权限和隔离 HOME 下 --version 校验;
  • stopped-to-started 与 CSSwitch 重启恢复都会重新解析候选,因此官方模式更新后隔离模式下一次启动自动采用新版;
  • 隔离实例继续固定独立 HOME/data-dir、loopback 端口和 --no-auto-update,不登录、不检查或应用更新;
  • 状态页展示实际 runtime 来源与版本,不再暗示隔离实例完成了更新检查;
  • Acceptance 构建继续禁用真实 HOME candidate,避免测试包触碰正式 Science 数据。

安全与兼容边界

  • 只复用同一个 executable 文件,不复制或读取官方账号、OAuth、组织、项目、会话、设置或数据库;
  • 官方 8765 与隔离实例仍是不同 PID、端口、HOME/data-dir 和受管所有权,可同时运行;
  • CSSwitch 不下载或升级 Science;官方模式独占登录、更新检查和更新应用;
  • App 内置 runtime 保留为明确 fallback,未知 cache 仍不会被静默采用。

验证

PR 分支:

  • bash test/test_scripts.sh:全部通过;
  • bash test/run-frontend.sh:全部通过;
  • Desktop Rust:363 passed、5 个明确 ignored、0 failed;
  • runtime 边界测试文件直跑:12 passed;新增 official_downloaded_runtime_wins_without_sharing_official_data 通过;
  • cargo fmt --all --checkgit diff --check 通过。

对应 runtime 补丁在 fork main 上还完成了生产构建、ad-hoc resource seal、安装和实机验收:官方 8765 的 PID 保持不变,隔离 8990 使用独立 PID;二者 executable 均解析到官方已下载 runtime,隔离进程仍带独立 --data-dir、8990/8991 端口与 --no-auto-update,两端 /health 均返回 200。安装版状态页显示“官方已下载 Runtime;隔离实例仅复用程序文件”。本轮未发送真实 provider 推理请求。

补充:upstream 当前缺少 test/__init__.py,Python 3.14 无法通过模块名导入既有 test.*,因此使用 python3 test/test_skill_runtime_boundary.py 直跑并通过;本 PR 未夹带该无关基线修复。

@RerrentLinden
RerrentLinden marked this pull request as ready for review July 21, 2026 07:45
@RerrentLinden RerrentLinden changed the title 修复隔离 Science 无法枚举系统 SSH Host 修复隔离 Science 的 SSH Host 枚举与 Runtime 更新复用 Jul 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant