Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
170 commits
Select commit Hold shift + click to select a range
4eb56ca
docs(subos): architecture design for #640 and its implementation plan
Oct 4, 2026
01ce35d
test(testkit): one test library for end-to-end tests (T1)
Oct 4, 2026
81ed082
test(xdev): one report for C++ tests and legacy suites (T2)
Oct 4, 2026
0e26cc7
ci: one Linux build per commit, asan off the PR path, one report (T3)
Oct 4, 2026
d13beb8
test: requirement IDs and the coverage gate (T5)
Oct 4, 2026
95fa408
refactor: modules/guard and modules/observe (C1)
Oct 4, 2026
5290002
ci: find xdev by name, and say so when it is missing
Oct 4, 2026
347cc34
refactor(subos): modules/subos, with gpu, graphics and manifest moved…
Oct 4, 2026
c90edc7
refactor(subos): HomeView and Ports; userdata moves into the SubOS co…
Oct 4, 2026
ceb22c5
refactor(subos): name resolution moves into the SubOS core (C4)
Oct 4, 2026
891b7e2
feat(home): HomeContext; .xlings-home declares mode and layout (C5)
Oct 4, 2026
7f081ab
ci: look for xdev where the pinned mcpp puts a member's binary
Oct 4, 2026
0cdc884
fix(home): writers refuse an unparseable document instead of blanking…
Oct 4, 2026
cac874a
feat(subos): the spec compiler, providers and platform probes (C8)
Oct 4, 2026
9d5177e
ci: a newer push to a PR cancels the run it supersedes
Oct 4, 2026
d639a5a
fix(subos): S0 hardening for every sandbox -- environment, processes,…
Oct 4, 2026
f413f55
feat(subos): sessions -- a supervisor outside, session-init inside, j…
Oct 4, 2026
03efedb
fix(testkit,observe): mutexes used at exit are never destroyed
Oct 4, 2026
8788c01
feat(subos): exec, start, cp, --temp, and the interface's subos_exec …
Oct 4, 2026
2a8e8a9
feat(cli): the agent contract -- XLINGS_AGENT_MODE, and a scan that n…
Oct 4, 2026
a6c9b05
feat(subos): the policy model -- presets, the policy file, decide(), …
Oct 4, 2026
f98680c
feat(subos): net=nat through pasta, --publish, and the host's abstrac…
Oct 4, 2026
27a5a3e
fix(subos): the home is read-only inside a sandbox; a broker changes …
Oct 4, 2026
d3f8a8d
fix(subos): name the stream in every println; include signal.h (macOS)
Oct 4, 2026
b35646c
feat(subos): --mount and the named grants (C19)
Oct 4, 2026
7643c1f
fix(subos): include <cstddef> for offsetof (musl); read the pid count…
Oct 4, 2026
d53232a
feat(subos): self doctor --isolation [--fix]; root-owned, then system…
Oct 4, 2026
aebe84e
feat(subos): capability cache, XLINGS_TRACE, the shared hint on every…
Oct 4, 2026
9e4ce90
feat(subos): exec audit, changed files, subos report (C22)
Oct 4, 2026
1cf3ebb
fix(subos): flush before forking, refuse a detached session off Linux…
Oct 5, 2026
d6977fe
refactor: platform branches as if constexpr where both sides compile …
Sunrisepeak Oct 5, 2026
3ae1225
feat(cli): complete the SubOS policy options (--net, --fetch, --obser…
Sunrisepeak Oct 5, 2026
37ccf4c
test(subos): --keep/--ttl as session idle time, signals, the old flag…
Sunrisepeak Oct 5, 2026
5769edf
feat(home): deployment S -- a system package's xlings, /etc/xlings/co…
Sunrisepeak Oct 5, 2026
b292e1c
feat(subos): policy packages -- select, lock, upgrade (C16)
Sunrisepeak Oct 5, 2026
669e9db
feat(subos): Landlock provider -- a write fence without namespaces (C18)
Sunrisepeak Oct 5, 2026
d071109
docs: regenerate the command reference (self update --user, subos con…
Sunrisepeak Oct 5, 2026
0d18bdf
fix(subos): refuse fetch=layer until it exists, instead of installing…
Sunrisepeak Oct 5, 2026
8f990d1
feat(subos): subos doctor; performance budgets as assertions (C25)
Sunrisepeak Oct 5, 2026
238f290
docs(subos): the isolation model as built; usage skill, READMEs and q…
Sunrisepeak Oct 5, 2026
2878502
fix(subos): the broker runs only what changes the instance; from the …
Sunrisepeak Oct 5, 2026
d333154
fix(subos): say that Landlock leaves the host's sockets reachable
Sunrisepeak Oct 5, 2026
38dfe84
fix(subos): a policy package reference is names, never a path
Sunrisepeak Oct 5, 2026
6e66b3a
fix(subos): subos cp never follows a link the instance planted
Sunrisepeak Oct 5, 2026
107225b
fix(subos): a bwrap's owner and mode are part of its probe's cache ke…
Sunrisepeak Oct 5, 2026
e890e26
feat(subos): subos doctor probes by entering -- the same spec, with `…
Sunrisepeak Oct 5, 2026
55e4c56
fix(subos): xlings itself is the owner's -- installing or switching i…
Sunrisepeak Oct 5, 2026
48dc96f
fix(subos): `subos exec -- argv` on macOS and Windows runs the argv, …
Sunrisepeak Oct 5, 2026
a25ecad
fix(subos): falling back to proot is never silent
Sunrisepeak Oct 5, 2026
2a73df6
refactor: modules are packages per responsibility, not per file
Sunrisepeak Oct 5, 2026
78bf2a5
refactor: system headers and calls live in xlings.platform
Sunrisepeak Oct 5, 2026
816127a
docs: a shorter README; the SubOS guide by scenario
Sunrisepeak Oct 5, 2026
0593463
fix(platform): sigemptyset is a macro on macOS -- call it unqualified
Sunrisepeak Oct 5, 2026
7a0d5d6
i18n: Chinese for every new SubOS help string; stale comments after t…
Sunrisepeak Oct 5, 2026
db112b4
refactor(subos): the subos commands in three units by concern
Sunrisepeak Oct 5, 2026
e94c730
fix(platform): environment() reads the real environment on Windows too
Sunrisepeak Oct 5, 2026
06d6eac
test(platform): the TIOCSTI filter exists on Linux only; the test is …
Sunrisepeak Oct 5, 2026
eb5ddcf
docs(subos): where the code lives, after the module refactor
Sunrisepeak Oct 5, 2026
c3f78f2
test(e2e): two 'no sandbox backend' scenarios say what they assume
Sunrisepeak Oct 5, 2026
47b74f3
feat(subos): isolation is declared when the instance is made
Sunrisepeak Oct 5, 2026
94df611
fix(subos): `new --sandbox <backend>` says a backend is chosen at ent…
Sunrisepeak Oct 5, 2026
7618f75
ci: run the sanitizer suite on this PR (label ci:asan)
Sunrisepeak Oct 5, 2026
fae694c
docs(subos): architecture design part 2 -- the host is a SubOS (root …
Sunrisepeak Oct 6, 2026
36030d1
fix(home): deployment S -- a fresh home links its entry to the system…
Sunrisepeak Oct 6, 2026
12689fe
build(aur): the Arch package is deployment S, tested from this build …
Sunrisepeak Oct 6, 2026
1d6cfb5
feat(subos): the root projection -- a SubOS presented as / (C31-C33, …
Sunrisepeak Oct 6, 2026
6c8371b
feat(subos): stage-0 -- xlings as the first process of a machine whos…
Sunrisepeak Oct 6, 2026
4f1a944
feat(subos): roots from editions, export to a directory, tarball or d…
Sunrisepeak Oct 6, 2026
ff58834
fix(xim,xvm): no patchelf is no longer 'installed unpatched'; plain a…
Sunrisepeak Oct 6, 2026
f93ae91
feat(subos): system layer, boot --now, fetch=layer; the distro CI lan…
Sunrisepeak Oct 6, 2026
317899b
fix(subos): iterate path components by const reference (libc++)
Sunrisepeak Oct 6, 2026
6df22ff
feat(subos): self update in deployment R is a generation; the WSL imp…
Sunrisepeak Oct 6, 2026
992451a
test(subos): luban-desktop renders a frame offscreen in its root (LUB…
Sunrisepeak Oct 6, 2026
a8c2aba
docs(subos): part 2 implementation record
Sunrisepeak Oct 6, 2026
5f6b349
fix(subos): preserve state and outputs and enforce audit failures
speak-agent Oct 8, 2026
3ea30c7
fix(ci): pass an absolute xdev path to isolated tests
speak-agent Oct 8, 2026
dd11862
test(ci): collect xdev evidence and diagnose generation reads
speak-agent Oct 8, 2026
2b78ce6
fix(platform): acquire symlinks across macOS vnode replacement
speak-agent Oct 8, 2026
88eafe9
fix(test): compare the policy minimum client as a string
speak-agent Oct 8, 2026
6a1df93
feat(subos): add guarded worker, network and root mount primitives
speak-agent Oct 8, 2026
d968ee4
feat(subos): transact scope assets and enforce checked package bounda…
speak-agent Oct 8, 2026
0faff25
feat(xdev): schedule isolated tests and retain platform timing trends
speak-agent Oct 8, 2026
562cfbd
fix(ci): use the published module cache fix and portable platform hea…
speak-agent Oct 8, 2026
d420d81
feat(testkit): default isolated homes to an owned HTTP package mirror
speak-agent Oct 8, 2026
33bd449
feat(xim): route numeric loopback downloads through the checked HTTP …
speak-agent Oct 8, 2026
777dccf
fix(platform): share the stable seccomp notification ABI across SDKs
speak-agent Oct 8, 2026
0c9f395
feat(subos): enforce exact root closure and private prefix domains
speak-agent Oct 8, 2026
c89bc05
fix(subos): keep private domain interface state in its actual scope
speak-agent Oct 8, 2026
2425cb4
test(subos): compare canonical closure paths across platforms
speak-agent Oct 8, 2026
ab4dda5
fix(xvm): prove Windows junction ownership by file identity
speak-agent Oct 8, 2026
f1e0a50
fix(subos): refresh managed domain dispatchers across owner upgrades
speak-agent Oct 8, 2026
302ffcb
fix(xim): mount worker runtimes and canonical recipe sources
speak-agent Oct 8, 2026
c0b62f0
perf(subos): reduce generation validation work while preserving checks
speak-agent Oct 8, 2026
04b0829
test(subos): stage closure results beneath the private run mount
speak-agent Oct 8, 2026
009cb17
fix(xdev): preserve explicit perf selection after case discovery
speak-agent Oct 8, 2026
4daee59
docs(subos): record CI findings and managed dispatcher validation
speak-agent Oct 8, 2026
a55deb6
fix(subos): preserve host mount sources across private domain entry
speak-agent Oct 8, 2026
64f3e71
test(xself): exercise owned client fixtures and portable UTF-8 checks
speak-agent Oct 8, 2026
da383ed
test(subos): require real root client update and generation rollback
speak-agent Oct 8, 2026
9a24c7f
test(subos): enforce static performance and executed requirement evid…
speak-agent Oct 8, 2026
a0d0d72
perf(ci): stop rebuilding successful targets after test failures
speak-agent Oct 8, 2026
4fe3e16
docs(subos): distinguish current validation from historical review fi…
speak-agent Oct 8, 2026
588586d
fix(xim): bind only canonical recipe sources in readonly workers
speak-agent Oct 8, 2026
c58ac9a
fix(subos): classify real dispatchers before excluding backend candid…
speak-agent Oct 8, 2026
b70e8cc
fix(subos): share one syscall listener for execution and network audi…
speak-agent Oct 8, 2026
e8fbdd0
docs(subos): record final syscall and backend repair evidence
speak-agent Oct 8, 2026
48475c7
fix(subos): probe user namespaces with context-specific capability ca…
speak-agent Oct 8, 2026
7edc10f
fix(xim): preserve readonly ELF runtime aliases in isolated workers
speak-agent Oct 8, 2026
2af2f79
test(subos): retain a real predecessor after candidate publication
speak-agent Oct 8, 2026
494047c
docs(subos): correct worker failure attribution and record verification
speak-agent Oct 8, 2026
fdb70a6
test(subos): validate instrumented workloads without claiming runtime…
speak-agent Oct 8, 2026
f1fd0b1
fix(release): preserve index bump history with ordinary pushes
speak-agent Oct 8, 2026
c9ae0d0
fix(xim): prepare owned recipe logs before worker publication
speak-agent Oct 8, 2026
6942092
fix(subos): map domain controllers without blocking child user namesp…
speak-agent Oct 8, 2026
476fc24
docs(subos): record nested namespace and log publication verification
speak-agent Oct 8, 2026
f7061c1
fix(xim): prepare exact payload mountpoints and isolate initial layer…
speak-agent Oct 8, 2026
c84ff3a
test(subos): require full domain lifecycle on the static candidate
speak-agent Oct 8, 2026
1019d35
docs(subos): record payload isolation and static domain acceptance
speak-agent Oct 8, 2026
86c4f1d
fix(xim): inspect payloadless uninstall hooks without payload write a…
speak-agent Oct 8, 2026
cfc461b
fix(subos): anchor machine state writes and preserve external user data
speak-agent Oct 8, 2026
855e9ee
fix(ci): retain static acceptance tools across release cleanup
speak-agent Oct 8, 2026
8e8638f
docs(subos): record final ownership review and execution evidence
speak-agent Oct 8, 2026
ba78de0
fix(xim): publish payloadless uninstall effects without missing regis…
speak-agent Oct 8, 2026
f1de5d8
fix(ci): retain ARM candidate diagnostics without relaxing admission
speak-agent Oct 8, 2026
68399f7
docs(subos): record payloadless publication contracts and verification
speak-agent Oct 8, 2026
ab02e9c
fix(test): run static domain source fixture with the actual client
speak-agent Oct 8, 2026
2d1ef97
docs(subos): record static source fixture and sanitizer evidence
speak-agent Oct 8, 2026
77431da
fix(subos): configure checked system templates before creating scopes
speak-agent Oct 8, 2026
4793f88
test(subos): reserve machine mountpoints for explicit runtime grants
speak-agent Oct 8, 2026
0380972
fix(subos): check producer roles in private copy and removal
speak-agent Oct 8, 2026
2b80285
test(ci): collect independent static and distro acceptance results
speak-agent Oct 8, 2026
c16a346
fix(subos): wake child exits and bound IPC allocations and cache writes
speak-agent Oct 8, 2026
1e2d059
fix(xim): order bootstrap tools and publish consistent scope projections
speak-agent Oct 8, 2026
8cf6ebd
docs(subos): record independent CI failures and verified corrections
speak-agent Oct 8, 2026
527d6c3
fix(xim): normalize legacy scope metadata before strict publication
speak-agent Oct 8, 2026
b0064de
fix(subos): include registered runtime datasets in root views
speak-agent Oct 8, 2026
d5d2bc6
test(subos): observe root libc damage and use native cache paths
speak-agent Oct 8, 2026
054d683
build(xpkg): pin the reviewed shared-payload closure fix candidate
speak-agent Oct 8, 2026
49a6f0f
docs(subos): record completed CI and remaining closure verification
speak-agent Oct 8, 2026
a77d791
fix(subos): preserve owner proxy settings in namespace producers
speak-agent Oct 8, 2026
b3dd500
docs(subos): record full rootfs pass and remaining image evidence
speak-agent Oct 8, 2026
24cb3ae
test(ci): connect isolation repair evidence to the F12 gate
speak-agent Oct 8, 2026
9ec0761
docs(subos): part 3 design -- content x view x carrier, openkal align…
Sunrisepeak Oct 8, 2026
f91c481
refactor(layout): package internals by responsibility; platform selec…
Sunrisepeak Oct 8, 2026
02816a8
feat(store): a generation is a GC root; retention prunes and releases…
Sunrisepeak Oct 8, 2026
0aacae7
feat(subos): durable generations, and a switch that checks stamps, no…
Sunrisepeak Oct 8, 2026
f36ec0e
feat(subos): one table for external tools, one door for administrator…
Sunrisepeak Oct 8, 2026
58d0e0c
test(subos): record the compiled-sandbox golden before the Intent IR …
Sunrisepeak Oct 8, 2026
86527fa
refactor(confine): the Intent IR and the confine registry; core no lo…
Sunrisepeak Oct 8, 2026
810141f
test(subos): read a tar listing's owner from GNU tar and bsdtar alike
Sunrisepeak Oct 8, 2026
898b67d
feat(carrier): where a SubOS runs, chosen by what it is; reached thro…
Sunrisepeak Oct 8, 2026
94041bd
perf(subos): the checked switch parses its inventory without streams …
Sunrisepeak Oct 8, 2026
a8f6262
feat(carrier): the wsl2 carrier -- a Linux SubOS on Windows, without …
Sunrisepeak Oct 8, 2026
b7040ad
fix(subos): publishing a generation checks its tree, not that its pay…
Sunrisepeak Oct 8, 2026
482b54c
feat(session): a native SubOS on macOS runs under the supervisor; on …
Sunrisepeak Oct 8, 2026
43ab70f
feat(carrier): the vz carrier on macOS, through its VM helper's contr…
Sunrisepeak Oct 8, 2026
f1dd2e2
feat(luban): luban/ beside modules/; stage-0 is its own binary, luban…
Sunrisepeak Oct 8, 2026
eda15ec
docs+ci(subos): openkal answers (C53); part 3 record; AGENTS and the …
Sunrisepeak Oct 8, 2026
5b54c01
fix(subos): this binary's path from the platform, not /proc/self/exe
Sunrisepeak Oct 8, 2026
6b341b6
build(deps): libxpkg at main 912720f (#47 merged: payload closures in…
Sunrisepeak Oct 8, 2026
adc03df
ci(openkal): the coexistence probe lives in tools/, not tests/
Sunrisepeak Oct 8, 2026
3c37f87
release: 2026.10.9.1 (SubOS part 3)
Sunrisepeak Oct 8, 2026
7e09e33
fix(carrier): the vz refusal says its helper is not published yet
Sunrisepeak Oct 8, 2026
c939328
fix(subos): an unreadable record of where a SubOS runs is refused, no…
Sunrisepeak Oct 8, 2026
d0a797a
fix(subos): subos start and --keep/--ttl on macOS, now that it has a …
Sunrisepeak Oct 8, 2026
d6230ce
test(subos): the 3000-payload switch budget is 20 ms; self-review record
Sunrisepeak Oct 9, 2026
cde2d3c
test(subos): the 3000-payload switch budget is asserted in the perfor…
Sunrisepeak Oct 9, 2026
905cb6d
test(windows): the carrier script ends with exit 0
Sunrisepeak Oct 9, 2026
a8208cb
test(e2e): luban_init_test.sh is run by the e2e-shell suite, not run_…
Sunrisepeak Oct 9, 2026
1035471
test(subos): the native-session mechanism is verified on every host
Sunrisepeak Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
838 changes: 838 additions & 0 deletions .agents/docs/2026-10-05-subos-architecture-design.md

Large diffs are not rendered by default.

728 changes: 728 additions & 0 deletions .agents/docs/2026-10-06-subos-architecture-design-part2.md

Large diffs are not rendered by default.

964 changes: 964 additions & 0 deletions .agents/docs/2026-10-08-pr-641-progress-report.md

Large diffs are not rendered by default.

63 changes: 63 additions & 0 deletions .agents/docs/2026-10-09-pr-641-self-review.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# PR #641 自我 review(Part 1 / 2 / 3 综合,2026-10-09)

- 范围:PR #641 全部 165 个提交(423 个文件,+49,571 / −5,257),重点是 Part 3(C43–C53)以及它与 Part 1、Part 2 的接缝。
- 依据:三份设计文档、`tests/requirements.toml`(163 required / 3 deferred / 0 planned)、三平台 CI、本地全量测试。
- 结论放在最前面;每一条发现都写清已修复还是保留,以及证据。

## 0. 结论

Part 3 的十一项(C43–C53)全部落地,没有用"文档声称"代替实现的地方。三处没有做到设计原意,分别是:

| 项目 | 现状 | 理由 |
|---|---|---|
| vz 承载的 VMM | 承载侧完整(契约、生命周期、授权),由假助手验证;签名的 `xlings-vm` 助手本身没有交付 | 需要 Virtualization.framework 的 entitlement 签名,且托管 macOS 无法嵌套虚拟化。拒绝信息如实说明"尚未发布" |
| Windows 上加入运行中的会话(join) | Windows 有 Job Object 进程范围(整树、超时 124、退出码),没有 supervisor | 需要基于 CreateProcess 的 supervisor,这是下一步,没有对外声称已完成 |
| openkal 接入产品代码 | 两个问题都有实测结论;没有把 `kal_*` 接入 xlings | 目前没有任何一项可移植功能会因此变好;第一项有意义的接入随 Luban 内核一起做(§19 C53) |

## 1. 自我 review 中发现并已修复的缺陷

| # | 发现 | 怎么发现的 | 修复 |
|---|---|---|---|
| R1 | C45 的"payload 已不存在"检查让 `subos export` 自己提交的代被拒(导出镜像的链接指向逻辑路径) | 静态车道 RootExport | `b7040ad`:提交只校验树;回滚才校验 payload |
| R2 | 3000 payload 的切换在 dev 构建下 11.1 ms | Linux-root 车道 | `94041bd`:解析改为不用流,payload 只 lstat 一次,dev 构建 3.0 ms |
| R3 | 承载的终端命令依赖 guest 里的 `/usr/bin/env`,而镜像没有用户态 | 假 wsl.exe 的生命周期测试 | `__carrier-env` |
| R4 | interface 的 `list_subos` 有一份自己的副本,缺少 `kind` | C48 测试 | CLI 与 interface 共用一个发射函数 |
| R5 | `luban-init` 作为根包目标时链接了整个前端(6812 个符号) | `nm` | 改为独立包,链接后 0 个前端符号 |
| R6 | 模块中的 `inline constexpr` 变量只在使用它的翻译单元中发射,只链接 modules 的二进制无法链接 | 单独链接 `luban-init` | 去掉 `inline` |
| R7 | macOS 会话从 `/proc/self/exe` 取自身路径 | macOS 车道 125 | 改用 `platform::get_executable_path` |
| R8 | `subos start` 在 macOS 上仍然拒绝("needs Linux") | macOS 车道 | 有会话宿主的平台(Linux、macOS)都允许 |
| R9 | 记录"SubOS 在哪里运行"的文件读不出来时被当作本地处理 | 按 AGENTS.md 的"读不到不等于空"规则逐条检查 | 改为拒绝(新增测试) |
| R10 | vz 拒绝时给出的路线指向一个索引里不存在的包 | 自查用户可见文案 | 文案说明"尚未发布" |
| R11 | `lint_platform_headers.sh` 从来没有接入 CI | C43 | 所有 `tools/lint_*.sh` 都进 CI |
| R12 | 测试从调用方继承了 `XLINGS_SUBOS_MODE`(在 SubOS 里运行测试会失败) | 本地运行 | 测试显式设置该变量 |
| R13 | macOS 的 bsdtar 列表格式与 GNU 不同 | macOS 车道 | 测试同时识别两种格式 |
| R14 | openkal 探针放在 `tests/` 下,被 `mcpp test` 当作测试 | macOS 车道 | 移到 `tools/` |

## 2. 分角度检查

**架构。** 依赖方向由 lint 强制:`luban → modules`,`modules` 不依赖 `luban` 和前端。后端分派已移出 core。工具解析只有一张表,提权只有一个入口。矩阵由各实现的声明生成。
遗留:`src/core/subos/sandbox.cpp` 仍有三处按后端判断的连接代码(bwrap 的 seccomp 过滤器、broker socket 的挂载、root view),都属于连接而非策略,下一步可以移进各实现的 `launch`。

**稳定性。** H1/H2/M1/M2 已修复并各有测试。持久化的刷盘顺序由 trace 断言。保留与释放有 CLI 级测试。凡是读不到的状态,一律当作"仍被引用"或"拒绝",没有一处当作空。

**简洁。** 没有新增顶层名词;承载没有新协议,复用 NDJSON interface;Intent 没有引入第二套策略语义(872 个用例的 golden 证明逐字节一致)。

**用户体验。** 用法没有变化。拒绝时都给出确切的路线,agent 模式不会停下来提问。`subos list` / `status` / `doctor --isolation --json` 都显示承载、ABI 和视图。

**兼容性与无感升级。** `instance.json` 只追加字段,旧客户端忽略。旧的代没有 inventory 时回退到完整遍历校验。`links.tsv` 格式不变。保留账本只在第一次需要时创建。
策略文件的最低客户端版本提到 `2026.10.9.1`:`2026.10.8.2` 从未发布,没有任何已发布客户端写过这个值。
`list_subos` 在某个 SubOS 的种类读不出来时,现在返回 1 而不是 0。这是按"读不到不等于空"做的有意改动。

**跨平台。** Linux 零行为变化,由 golden 证明。macOS 第一次有了会话宿主(分帧的流式 socket、`/tmp` 短链接),三平台 CI 实测。Windows 有 Job Object 范围和 E2E-08(有 WSL2 时测生命周期,没有时测拒绝及其路线)。

**一致性。** 需求 ID 中 163 项 required、3 项 deferred(都写了原因)、0 项 planned。macOS/Windows 会话由各自的工作流把关,Linux 报告中明确记为"由其他工作流把关"。

## 3. 交接时遗留问题的现状

| 交接遗留 | 现状 |
|---|---|
| F12 证据接线 | `24cb3ae9` 的 CI 已全绿 |
| libxpkg 0.0.62 依赖链 | #47 已 review 并合入(`912720f`),客户端固定到 main 上的该提交。三平台源码索引的 0.0.62 条目仍待发布(客户端走 git rev,不依赖这一步) |
| `--observe-raw`、PR 关键路径 ≤15 分钟 | 不在 Part 3 范围内,仍未做 |
| macOS / Windows 的隔离只是 advisory | 由承载提供强隔离:wsl2 已可用;vz 等待助手发布 |
| 私有域删除时内层成功、外层失败的恢复 | 未改动,仍是已知限制 |
Loading
Loading