diff --git a/.workbuddy/memory/2026-10-17.md b/.workbuddy/memory/2026-10-17.md
deleted file mode 100644
index f2f36c0b..00000000
--- a/.workbuddy/memory/2026-10-17.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# 2026-10-17
-
-## Benchmark 文档 review(惰性镜像 + 文件系统章节)
-
-用户要求 review `docs/src/*/benchmarks/` 的撰写风格,认为惰性镜像与文件系统两章不像开源项目行文、过于进攻性。
-
-结论:
-- 两章的证据纪律(CI、provenance、失败保留)是优点,进攻感主要来自"以竞品为参照的获胜式断言"而非数据本身。
-- P0 发现:`filesystem.md`(中英两版)章节顺序违反 `benchmark/README.md#structure` 固定四节顺序(Motivation 排在主要结论前);结论节点名 Firecracker/QEMU/Docker 做"更快"断言,但数据为 N=3 探索性浅测,与页内"N=3 不支持普遍排名"自相矛盾;640 MiB 工作集 4 个超时单元只在折叠区,结论节无短板(违反"有短板就写短板")。
-- P1:filesystem 结论首句未回答标题问题;缺选型含义表(startup/index 有);index.md 标题"在哪些场景有优势?"给整个 section 定了竞争基调。
-- lazy-image-startup.md 基本合规(n=30、CI、含热缓存不利结果),仅需去营销化措辞微调。
-- 修改时注意:中英同步(checklist 要求);结论数字必须能在本页表中找到。
-
-## 全项目设计与实现分析
-
-用户要求通读整个仓库的设计与实现。产出:分层结构 + Attempt 时序两张图,加一份 P0/P1/P2 问题清单。
-
-核心判断(供后续复用):
-- 三条贯穿性不变量:定义/执行分离;请求-决策-事实分离(Requested/Rewritten/Placed/Completed);保证必须来自实际边界(EnforcementPlanLevel + finalize 里 missing_dimensions 改判)。
-- 唯一生命周期所有者是 `Session`:`transition()` 拒绝 terminal,终态只由 `complete()` 在 teardown 之后 `finish()`。
-- 边界强度分层:VM+smoltcp 为 non-bypassable(fail closed),host/container 显式代理为 cooperative,文档与 `interception.rs` 都承认。
-- 已核实 P0:`pvisor-daemon/src/daemon/mod.rs:4` 声明 `mod e2b;` 但无源文件(api.rs:48 引用);`pvisor-shim/src/vm.rs:56` 给 `filesystem()` 传 1<<29,而 builder.rs:339 要求 shm_size==0;`pvisor-replay` managed 路径写 TOML 却走 `run --spec`(run.rs 要求 JSON)。
-- P1 结构性问题:CLI 是"第一方特权前端"(用 doc(hidden) 的 RunRecord、直接 job.write() 改 checkpoint ledger,绕过 RuntimeJobService 的 lease/target 栅栏);JobCommand 直接复用 clap Args 作 wire DTO;journal 每条事件 sync_all + 单文件无分段 + 全量扫描重建索引;daemon GET 取写锁且 inspect 内做 HTTP probe,supervisor 单线程;快照 version=1 + deny_unknown_fields 使跨版本恢复不可能。
-- 工程亮点:`pvisor-vm/tests/api_contract.rs` 用 syn 强制 api.rs 无 cfg/无 impl/无默认方法;`repository_boundary` 禁 krun 依赖;semspec 人在环审批(摘要绑定 + STALE);documentation_json 测试要求文档样例能被产品 reader 读回。
-- 本次未能运行 cargo/nextest(会话内 Bash/Grep 持续 Connection lost),所有编译失败结论均为静态阅读;行数为抽样估算。
diff --git a/.workbuddy/memory/2026-10-18.md b/.workbuddy/memory/2026-10-18.md
deleted file mode 100644
index cf0c7213..00000000
--- a/.workbuddy/memory/2026-10-18.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# 2026-10-18
-
-## Benchmark 文档去进攻性修订(已落地)
-
-承接 2026-10-17 的 review,完成以下修改(数字均只引用本页已有表格,未动数据):
-
-- `docs/src/{zh,en}/benchmarks/filesystem.md`:恢复固定四节顺序(主要结论→Motivation→实验设计→数据);重写结论节——首句给 Ready 绝对水位(2.63–111.88 ms)回答标题;四条 bullet 场景化、不点名竞品(原"短于 Firecracker/QEMU""接近 Docker"已移除);新增 640 MiB 超时短板 bullet;新增"需求→选型含义"表(对齐 startup/index 的惯例)。
-- `docs/src/{zh,en}/benchmarks/lazy-image-startup.md`:结论节 Docker 点名改为中性表述("预先完整拉取的路径")。
-- `docs/src/{zh,en}/benchmarks/index.md`:标题改为"pVisor 适合哪些场景,各自代价是多少?" / "Which workloads fit pVisor, and at what cost?"。导航(docs/zensical.{zh,en}.toml)用固定标签,不受 H1 改动影响。
-
-## 结论层压缩与边界修正(第二轮 review)
-
-用户复审后三条准确性修正 + 两处减法,已全部落实(中英同步):(1) 删除"超过 128 MiB"外推写法,改为"640 MiB 超时、其他规模另测";(2) "写回不能改善"→"耗时接近,未观察到明显收益";(3) 惰性镜像恢复点名 Docker(差异含容器/VM 之别,模糊化误导归因)。减法:filesystem 结论层去掉数字范围与选型表,主句收成一句 + 三条无数字短条目;两章数据导读删掉目录式链接串联,各留一句解释。行文约定已沉淀到 .workbuddy/memory/MEMORY.md。
-
-## lazy-image-startup.md Motivation 重写(与 filesystem 同模式)
-
-按用户要求对惰性镜像章做同样处理:标题"为何需要惰性镜像"→"短任务的环境准备要等多久",正文改为两个选型问题(首次使用省多少下载/等待;缓存复用后开销多少);机制句"按访问需要获取文件,让环境准备随任务推进"下移至"实验数据和分析"章首,改写为三组数据的读者导引(#application-comparison / #stage-comparison / #preparation 锚点链接)。中英双版同步。已排查其余章节(startup/network/density/supervision-cost/agent-tasks/vm-memory),Motivation 均已是用户场景出发,无需改动。
-
-## filesystem.md Motivation 重写(用户视角)
-
-用户指出 Motivation"为何需要文件系统缓存与写回"是技术出发点而非用户出发点。已重写为"选择执行模式前要回答什么"(三个问题:启动等多久、任务到产物落盘等多久、大工作集/并发能否完成),机制性表述(缓存与写入合并的目的)移到"实验数据和分析"章首,改写为四组数据的读者导引(含小节锚点链接)。中英双版同步。惯例:Motivation 一律从用户场景与选型问题出发,技术机制归属数据/分析章节。
-
-## filesystem.md 小写合并节的基线提升
-
-用户指出"小写合并与同步边界"节把 Docker/Firecracker 等基线折叠进 details 不合理(选型页正文需要参照)。原设计意图是正文只回答"写回开/关"的内部 A/B。已将密集小写与逐次同步两个负载的完整九配置对照提升到正文表格(数据原样取自折叠区表格),并在解读句中点名同批参照(数据节允许点名);折叠区保留其余机制明细。中英双版同步。
-
-## filesystem.md 参照物补全(第二轮)
-
-用户要求"修复类似问题,报告要让人能读懂、有参照物"。排查结论:
-- "工作集与并发边界"节正文原本只有超时失败、无任何水位数据 → 从 `docs/overrides/assets/benchmarks/data/filesystem/layered-references/filesystem-layered-references-levels.csv`(sum_three_rounds, completed_ns, R01/R02)提取 128 MiB 下九配置中位数,新增正文对照表(单位 s,如 VM 41.545/15.751、VM+wb 4.195/2.073、Docker 2.822/1.550、QEMU q35 2.566/1.685)。
-- "启动等待的取值范围"节原本整节折叠 → 把含四种配置中位数的摘要句提到折叠外。
-- 全章节扫描:network/density/supervision-cost/agent-tasks/startup/lazy-image/vm-memory 正文表格均自带基线,无同类问题。
-- 注意:两版 filesystem.md 的下载链接和图链接在会话期间被外部更新过(PDF→SVG、裸文件名→overrides 完整路径),编辑前需重读文件。
-
-经验:benchmark 用户页规范在 benchmark/README.md#structure 与 #checklist——结论不点名对照项目(名称/版本/数据放数据节)、首句必须直接回答标题、短板上浮、中英同步。
diff --git a/AGENTS.md b/AGENTS.md
index 9abc0c3d..3b6a95ed 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -57,7 +57,7 @@ this boundary.
Any work under `benchmark/`, `docs/src/*/benchmarks/` or
`docs/src/assets/benchmarks/` must follow `benchmark/README.md`: find the
benchmark's registry entry before measuring or writing, keep each user page in
-the order conclusions, motivation, experiment design, data and analysis, and
+the order Motivation, experiment design, data and analysis (three sections), and
keep engineering A/B and diagnostic results out of user pages.
## Test command
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 92f50641..71fbca8e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,7 +1,7 @@
# Contributing to PolicyVisor
Thanks for helping. This page is the short version; the full guide is
-[community/contributing](https://deeplink-org.github.io/pvisor/zh/community/contributing/).
+[community/contributing](https://deeplink-org.github.io/pvisor/en/community/contributing/).
## Before you start
@@ -22,7 +22,7 @@ just lint # clippy and ruff
just docs-build # build and check the documentation site
```
-See [development](https://deeplink-org.github.io/pvisor/zh/community/development/)
+See [development](https://deeplink-org.github.io/pvisor/en/community/development/)
for platform setup (FUSE/macFUSE, KVM/HVF, OCI runtimes).
## Semantic specifications
@@ -37,7 +37,7 @@ an approval:
snapshots are human-only maintainer actions.
Run `just cases --suite stage` for the STAGE domain and `just semspec lint docs/src/zh/cases` for the
-specifications. Details: [testing](https://deeplink-org.github.io/pvisor/zh/community/testing/).
+specifications. Details: [testing](https://deeplink-org.github.io/pvisor/en/community/testing/).
## Pull requests
diff --git a/README.md b/README.md
index 4f992e8f..81e717e3 100644
--- a/README.md
+++ b/README.md
@@ -83,7 +83,7 @@ Cross-node placement, workflows and retries belong to external orchestrators
such as Kubernetes or Ray, not a pVisor Cluster control plane.
For the four levels, where pVisor places its bet, and the status of L2/L3, see the
-[trust ladder](https://deeplink-org.github.io/pvisor/en/why/trust-ladder/).
+[trust ladder](https://deeplink-org.github.io/pvisor/en/why/#trust-ladder).
## Scope
@@ -94,7 +94,7 @@ controls, with platform-dependent container/VM support. See [capabilities and ev
## Documentation
-- [Start here](https://deeplink-org.github.io/pvisor/en/start/) — the path from install to a reviewed run
+- [Start here](https://deeplink-org.github.io/pvisor/en/start/installation/) — platform requirements and installation
- [Your first run](https://deeplink-org.github.io/pvisor/en/start/first-run/) — the run-review-apply loop
- [Why pVisor](https://deeplink-org.github.io/pvisor/en/why/) — vision, trust ladder, use cases, and comparisons
- [Capabilities and evidence](https://deeplink-org.github.io/pvisor/en/concepts/capabilities-and-evidence/) — how far a guarantee goes
@@ -103,7 +103,7 @@ controls, with platform-dependent container/VM support. See [capabilities and ev
- [Design and research](https://deeplink-org.github.io/pvisor/en/design/) — architecture, isolation, and research directions
- [Experimental features](docs/src/en/design/experimental/index.md) — proposed capabilities, implementation stages, and validation gates
- [Community](https://deeplink-org.github.io/pvisor/en/community/) — contributing, testing, and roadmap
-- [中文文档](https://deeplink-org.github.io/pvisor/zh/start/)
+- [中文文档](https://deeplink-org.github.io/pvisor/zh/start/first-run/)
Security issues: see [SECURITY.md](SECURITY.md). Contributions: see [CONTRIBUTING.md](CONTRIBUTING.md).
diff --git a/benchmark.new/README.md b/benchmark.new/README.md
index 6492226c..c3ca4290 100644
--- a/benchmark.new/README.md
+++ b/benchmark.new/README.md
@@ -142,7 +142,7 @@ python3 benchmark.new/docs.py check
python3 benchmark.new/docs.py publish "$batch"
```
-`python3 benchmark.new/measurement_coverage.py` 更新 14 个用户页的复测范围清单。没有匹配负载的页面保留历史数字并明确标识。
+`python3 benchmark.new/measurement_coverage.py` 更新 `docs.json` 登记的中英文 benchmark 用户页的复测范围清单。没有匹配负载的页面保留历史数字并明确标识。
`check` 检查文章覆盖、动态 JSON 引用、表结构、未执行命令与 CSV 来源。
公开的新表还必须逐格等于各条件最新 CSV 的展示值,样本数和计时范围不匹配会阻止构建。
@@ -150,8 +150,8 @@ python3 benchmark.new/docs.py publish "$batch"
仅向共享位置发布白名单内的完整精度 CSV,更新构建所需展示 JSON 与必要用户实验的 provenance,原 MD 无需改写。
必要 provenance 摘要统一保存在 `docs/overrides/assets/benchmarks/`,中英文共用一份;
保留批次、计时口径、运行配置、输入/二进制与证据摘要。完整 manifest、逐文件 harness
-清单、宿主路径和软件包收据留在批次 `.data/`。启动仅发布文档引用的 Ready / Exit
-两张 JSON 表,单行复测保留其他条件的来源配置。
+清单、宿主路径和软件包收据留在批次 `.data/`。启动页引用 Ready JSON 表;完整
+Ready / Exit 指标保留在统计 CSV 中,单行复测保留其他条件的来源配置。
发布器验证 `metric_scope` 与绑定声明的负载配置;中位数与标准差同一行,批次名称放在来源记录,不挤入数值表。
没有 live binding 的条件会拒绝发布;工程 A/B 不写入用户表。filesystem 的历史 hyperfine 结果
保留在本地归档,其用户表、下载和发布绑定已删除;新 Python 时钟数据需单独登记文档表,必要公开 CSV 按白名单发布。改变历史表数据时需同步
@@ -182,3 +182,11 @@ python3 benchmark.new/docs.py publish "$batch"
亲和性在准备与 semspec 外层设置,manifest 记录实际选择;被测命令没有 Python 或
`taskset` 包裹。所有适配器按独立条件采样,不声称随机配对改善比例。
+
+## 公开图表清理
+
+`docs.py check` 拒绝未被文章、展示表或主题引用的公开 SVG。新增图表先在对应文章中引用;
+`filesystem/publish_io_curves.py` 只发布当前引用的图,完整图表仍在批次 publication 中归档。
+2026-10-18 撤下的无引用 SVG 原字节保存在 `.data/docs-assets-cleanup-20261018/`,
+可提交的路径、大小和 SHA-256 索引见 [清理清单](evidence/docs-assets-cleanup-20261018.json)。
+清单只覆盖这次公开图表清理,不表示其他历史原始批次已在当前 checkout 核验或完整保留。
diff --git a/benchmark.new/docs.json b/benchmark.new/docs.json
index 6fd2d419..7a0bf94c 100644
--- a/benchmark.new/docs.json
+++ b/benchmark.new/docs.json
@@ -14,16 +14,6 @@
"tables": [],
"source_csv": []
},
- {
- "locale": "zh",
- "page": "benchmarks/cluster-scalability.md",
- "benchmark_ids": [
- "B-CLUSTER"
- ],
- "role": "user-facing",
- "tables": [],
- "source_csv": []
- },
{
"locale": "zh",
"page": "benchmarks/compare-rl-infra.md",
@@ -70,7 +60,7 @@
{
"json": "benchmarks/measurement-coverage.render.json",
"kind": "coverage",
- "rows": 14,
+ "rows": 12,
"columns": [
"数据状态",
"实测范围"
@@ -108,16 +98,6 @@
"../../../overrides/assets/benchmarks/data/lazy/lazy-stage-comparisons.csv"
]
},
- {
- "locale": "zh",
- "page": "benchmarks/methodology.md",
- "benchmark_ids": [
- "B-METHOD"
- ],
- "role": "user-facing",
- "tables": [],
- "source_csv": []
- },
{
"locale": "zh",
"page": "benchmarks/network.md",
@@ -175,20 +155,6 @@
],
"rows": 8,
"options": {}
- },
- {
- "json": "benchmarks/startup-timing.exit.render.json",
- "kind": "published",
- "columns": [
- "N",
- "Exit 中位数 ms",
- "Exit 均值 ms",
- "Exit 标准差 ms",
- "Exit 最小 ms",
- "Exit 最大 ms"
- ],
- "rows": 8,
- "options": {}
}
],
"source_csv": [
@@ -219,7 +185,7 @@
},
{
"locale": "zh",
- "page": "design/vm-startup-performance-analysis.md",
+ "page": "lab-notes/vm-startup-performance-analysis.md",
"benchmark_ids": [
"B-STARTUP-ENG",
"B-KERNEL-ENG",
@@ -231,7 +197,7 @@
},
{
"locale": "zh",
- "page": "design/vm-memory-performance-analysis.md",
+ "page": "lab-notes/vm-memory-performance-analysis.md",
"benchmark_ids": [
"B-MEMORY-SCALE",
"B-MEMORY-DIAG",
@@ -243,7 +209,7 @@
},
{
"locale": "zh",
- "page": "design/filesystem-performance-analysis.md",
+ "page": "lab-notes/filesystem-performance-analysis.md",
"benchmark_ids": [
"B-FS-ENG",
"B-FS-DIAG"
@@ -254,7 +220,7 @@
},
{
"locale": "zh",
- "page": "design/filesystem-io-performance-analysis.md",
+ "page": "lab-notes/filesystem-io-performance-analysis.md",
"benchmark_ids": [
"B-FS-ENG",
"B-FS-DIAG"
@@ -265,7 +231,7 @@
},
{
"locale": "zh",
- "page": "design/agent-task-performance-analysis.md",
+ "page": "lab-notes/agent-task-performance-analysis.md",
"benchmark_ids": [
"B-AGENT-TASK"
],
@@ -275,27 +241,7 @@
},
{
"locale": "zh",
- "page": "design/cluster-performance-analysis.md",
- "benchmark_ids": [
- "B-CLUSTER"
- ],
- "role": "engineering evidence",
- "tables": [],
- "source_csv": []
- },
- {
- "locale": "zh",
- "page": "design/cluster-benchmark-plan.md",
- "benchmark_ids": [
- "B-CLUSTER"
- ],
- "role": "engineering evidence",
- "tables": [],
- "source_csv": []
- },
- {
- "locale": "zh",
- "page": "design/benchmark-methodology-evidence.md",
+ "page": "lab-notes/benchmark-methodology-evidence.md",
"benchmark_ids": [
"B-METHOD"
],
@@ -314,16 +260,6 @@
"tables": [],
"source_csv": []
},
- {
- "locale": "en",
- "page": "benchmarks/cluster-scalability.md",
- "benchmark_ids": [
- "B-CLUSTER"
- ],
- "role": "user-facing",
- "tables": [],
- "source_csv": []
- },
{
"locale": "en",
"page": "benchmarks/compare-rl-infra.md",
@@ -370,7 +306,7 @@
{
"json": "benchmarks/measurement-coverage.render.json",
"kind": "coverage",
- "rows": 14,
+ "rows": 12,
"columns": [
"Data status",
"Measured scope"
@@ -408,16 +344,6 @@
"../../../overrides/assets/benchmarks/data/lazy/lazy-stage-comparisons.csv"
]
},
- {
- "locale": "en",
- "page": "benchmarks/methodology.md",
- "benchmark_ids": [
- "B-METHOD"
- ],
- "role": "user-facing",
- "tables": [],
- "source_csv": []
- },
{
"locale": "en",
"page": "benchmarks/network.md",
@@ -475,20 +401,6 @@
],
"rows": 8,
"options": {}
- },
- {
- "json": "benchmarks/startup-timing.exit.render.json",
- "kind": "published",
- "columns": [
- "N",
- "Exit median ms",
- "Exit mean ms",
- "Exit SD ms",
- "Exit min ms",
- "Exit max ms"
- ],
- "rows": 8,
- "options": {}
}
],
"source_csv": [
@@ -519,7 +431,7 @@
},
{
"locale": "en",
- "page": "design/vm-startup-performance-analysis.md",
+ "page": "lab-notes/vm-startup-performance-analysis.md",
"benchmark_ids": [
"B-STARTUP-ENG",
"B-KERNEL-ENG",
@@ -531,7 +443,7 @@
},
{
"locale": "en",
- "page": "design/vm-memory-performance-analysis.md",
+ "page": "lab-notes/vm-memory-performance-analysis.md",
"benchmark_ids": [
"B-MEMORY-SCALE",
"B-MEMORY-DIAG",
@@ -543,7 +455,7 @@
},
{
"locale": "en",
- "page": "design/filesystem-performance-analysis.md",
+ "page": "lab-notes/filesystem-performance-analysis.md",
"benchmark_ids": [
"B-FS-ENG",
"B-FS-DIAG"
@@ -554,7 +466,7 @@
},
{
"locale": "en",
- "page": "design/filesystem-io-performance-analysis.md",
+ "page": "lab-notes/filesystem-io-performance-analysis.md",
"benchmark_ids": [
"B-FS-ENG",
"B-FS-DIAG"
@@ -565,7 +477,7 @@
},
{
"locale": "en",
- "page": "design/agent-task-performance-analysis.md",
+ "page": "lab-notes/agent-task-performance-analysis.md",
"benchmark_ids": [
"B-AGENT-TASK"
],
@@ -575,27 +487,7 @@
},
{
"locale": "en",
- "page": "design/cluster-performance-analysis.md",
- "benchmark_ids": [
- "B-CLUSTER"
- ],
- "role": "engineering evidence",
- "tables": [],
- "source_csv": []
- },
- {
- "locale": "en",
- "page": "design/cluster-benchmark-plan.md",
- "benchmark_ids": [
- "B-CLUSTER"
- ],
- "role": "engineering evidence",
- "tables": [],
- "source_csv": []
- },
- {
- "locale": "en",
- "page": "design/benchmark-methodology-evidence.md",
+ "page": "lab-notes/benchmark-methodology-evidence.md",
"benchmark_ids": [
"B-METHOD"
],
diff --git a/benchmark.new/evidence/docs-assets-cleanup-20261018.json b/benchmark.new/evidence/docs-assets-cleanup-20261018.json
new file mode 100644
index 00000000..8ea2c583
--- /dev/null
+++ b/benchmark.new/evidence/docs-assets-cleanup-20261018.json
@@ -0,0 +1,126 @@
+{
+ "schema": 1,
+ "scope": "Unused published SVG copies only; raw experiment evidence unchanged",
+ "files": [
+ {
+ "path": "docs/overrides/assets/benchmarks/cluster-scalability-20261005/execution.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/cluster-scalability-20261005/execution.svg",
+ "bytes": 35789,
+ "sha256": "4437cef0333dc3857b5f92b5ffbfbd9da83039b313a2076bf99bd85bb38dec37",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/confirm-phase-means-selected-blocks.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/confirm-phase-means-selected-blocks.svg",
+ "bytes": 44992,
+ "sha256": "8aaa88a020272428fc2f555d0725b6d8d23d6558663a9f0f13d3235bc5701397",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/confirm-smallfiles-smallfiles.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/confirm-smallfiles-smallfiles.svg",
+ "bytes": 62062,
+ "sha256": "85c6598e1e8903c2f9f4a76762f05d86537155b06e6eb50b416cfd7e4ac56588",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/confirm-sync-stream.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/confirm-sync-stream.svg",
+ "bytes": 60141,
+ "sha256": "c5e8916f8cf2f7c3285de79df730cd15f777b02294caa498930268016521bab1",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/memory-batch_kib-sampled_memory_current_peak_bytes-4.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/memory-batch_kib-sampled_memory_current_peak_bytes-4.svg",
+ "bytes": 16336,
+ "sha256": "1d9424f871cc77b590e720bdf4c4f0036ceff1e978c218c9a7449b3c9ccbab48",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/memory-capacity_mib-sampled_memory_current_peak_bytes-1.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/memory-capacity_mib-sampled_memory_current_peak_bytes-1.svg",
+ "bytes": 17365,
+ "sha256": "25dfc693b265f8d9838ab3ab257755fb581ced847c1c88f8983abb23008c0e0a",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/memory-delay_us-sampled_memory_current_peak_bytes-3.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/memory-delay_us-sampled_memory_current_peak_bytes-3.svg",
+ "bytes": 18365,
+ "sha256": "3ac1250f3b96e06a9a77374d7aeec78c6e0fba3fd855f5df619ed2b73e5a9556",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/parameters-block-stream.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/parameters-block-stream.svg",
+ "bytes": 86357,
+ "sha256": "6bd800edb4bb2a12573ef957c8267b80d3bb8beb14a9fca560b092fbd925f38e",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/pressure-stream.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/pressure-stream.svg",
+ "bytes": 171834,
+ "sha256": "7d8c3b219df9914445dcd29a3b38efcf669e13f7326c3df398e1e54f21b8c6d3",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/readset-read.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/readset-read.svg",
+ "bytes": 108153,
+ "sha256": "e8f26ecea197b23320bc8f3663bfe48c1af6b909ae96d99b981c99d4e6401d5c",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/smallfiles-smallfiles.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/smallfiles-smallfiles.svg",
+ "bytes": 61036,
+ "sha256": "45874d52812750e6b1449634448915efaa335df705b521f4c857339a7c5f1b79",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-io/sync-stream.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-io/sync-stream.svg",
+ "bytes": 58496,
+ "sha256": "b1920126d9dd77348bac05cca86efa3ae2f5b75384340e30d1ab30dbe5d76bab",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/filesystem-service-20261005/lazy-vm.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/filesystem-service-20261005/lazy-vm.svg",
+ "bytes": 20323,
+ "sha256": "c07ed4132d6337b0c5f6365942053601ec0510b2e59e9716a3c2513bdf60b27c",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/full-ubuntu-20261004/ubuntu-startup.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/full-ubuntu-20261004/ubuntu-startup.svg",
+ "bytes": 66182,
+ "sha256": "5484de021520cda1db71c05c346d36eb9d53a698d66594eeab1fda0f33b824f3",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ },
+ {
+ "path": "docs/overrides/assets/benchmarks/full-ubuntu-20261004/ubuntu-workflows.svg",
+ "archive_path": "benchmark.new/.data/docs-assets-cleanup-20261018/full-ubuntu-20261004/ubuntu-workflows.svg",
+ "bytes": 92472,
+ "sha256": "29c83deb68d952c322e23b79d871d49654fbbb3b300d776d4dcedd65e7c8a7d8",
+ "retention": "local archive; original also retained in Git history",
+ "reason": "not referenced by tracked page, table, theme or configuration"
+ }
+ ]
+}
diff --git a/benchmark.new/filesystem/README.md b/benchmark.new/filesystem/README.md
index 436e3d65..4763d508 100644
--- a/benchmark.new/filesystem/README.md
+++ b/benchmark.new/filesystem/README.md
@@ -96,7 +96,7 @@ host只隐藏已验证的OverlayFS内部标记,不放过意外应用文件。
逐case guest脏页峰值、队列占用与精确操作尾延迟仍未插桩。
下述旧入口和来源保持独立,已有数据不重命名为新协议结果。
-首轮浅测结果见[分层工程分析](../../docs/src/zh/design/filesystem-io-performance-analysis.md#workload-v2-results):
+首轮浅测结果见[分层工程分析](../../docs/src/zh/lab-notes/filesystem-io-performance-analysis.md#workload-v2-results):
19项、114个新VM、342条轮记录全部通过;独立N1计数另用16个VM。
这批数据只比较同一固件的guest WB关/开,不代表0049相对0048的增量或跨后端排名。
@@ -134,6 +134,7 @@ guest 内连续五次 reopen、内部三轮,展示吞吐、READ 消除与容
主输入批次的`publication//`,PDF继续保留在原分析目录;CLI入口没有图时
仅做本地归档。组合I/O曲线以`--shape`批次作为归档主目录。归档清单完整描述材料,
`public_outputs`仅列实际公开的图;阶段计时、来源校验和SVG/PDF完整性检查均不减少。
+I/O 曲线发布器只复制当前文章或主题引用的 SVG;未引用的图仍保留在本地 publication。
这些结果不写入下述原生工具表或跨运行时用户排名。
## 原生 metadata/read 表
diff --git a/benchmark.new/filesystem/publish_io_curves.py b/benchmark.new/filesystem/publish_io_curves.py
index 186f6cff..133bc427 100644
--- a/benchmark.new/filesystem/publish_io_curves.py
+++ b/benchmark.new/filesystem/publish_io_curves.py
@@ -18,6 +18,7 @@
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from curves_analysis import describe, seed_for
+from public_assets import referenced_svg_paths
from publication_archive import archive_targets, preflight_archive, write_archive
REPO = Path(__file__).resolve().parents[2]
@@ -546,6 +547,7 @@ def usage(resource):
"read-diagnostic",
)
cohorts.append(provenance)
+ referenced_figures = referenced_svg_paths(REPO)
manifest = dict(
schema=1,
benchmark_ids=["B-FS-ENG", "B-FS-DIAG"],
@@ -560,7 +562,7 @@ def usage(resource):
public_outputs={
str(Path("docs/overrides/assets/benchmarks/filesystem-io") / name): spec["sha256"]
for name, spec in files.items()
- if name.endswith(".svg")
+ if name.endswith(".svg") and f"filesystem-io/{name}" in referenced_figures
},
precision="CSV bytes archived unchanged; only SVGs public; local analysis PDFs retained and verified; no raw_rows.csv publication or numeric formatting",
graph_methods="Frozen analysis source hashes and per-cohort statistical scope retained; N5 exploration and independent N30 confirmation remain separate",
@@ -593,7 +595,10 @@ def main():
preflight_archive(archives)
targets = []
for name, spec in files.items():
- if not name.endswith(".svg"):
+ if (
+ str(Path("docs/overrides/assets/benchmarks/filesystem-io") / name)
+ not in manifest["public_outputs"]
+ ):
continue
destinations = [REPO / "docs/overrides/assets/benchmarks/filesystem-io" / name]
for target in destinations:
diff --git a/benchmark.new/filesystem/test_filesystem_publication_layout.py b/benchmark.new/filesystem/test_filesystem_publication_layout.py
index fb9b6a4b..c998c6b6 100644
--- a/benchmark.new/filesystem/test_filesystem_publication_layout.py
+++ b/benchmark.new/filesystem/test_filesystem_publication_layout.py
@@ -50,7 +50,7 @@ def test_private_archive_is_readonly_when_checked_and_refuses_changed_bytes(self
def test_private_archive_rejects_a_symlinked_publication_directory(self):
with tempfile.TemporaryDirectory() as temporary:
- root = Path(temporary)
+ root = Path(temporary).resolve()
batch, outside = root / "batch", root / "outside"
batch.mkdir()
outside.mkdir()
@@ -62,7 +62,7 @@ def test_private_archive_rejects_a_symlinked_publication_directory(self):
def test_collected_provenance_omits_pdfs_but_still_requires_local_pdf_bytes(self):
with tempfile.TemporaryDirectory() as temporary:
- root = Path(temporary)
+ root = Path(temporary).resolve()
timing, diagnostic = root / "timing", root / "diagnostic"
analysis, times = timing / "analysis", timing / "analysis-times"
analysis.mkdir(parents=True)
@@ -194,7 +194,7 @@ def test_writeback_publishers_share_csvs_and_exclude_pdf_destinations(self):
(TUNING.BASE, "filesystem-guest-writeback-tuning"),
):
with self.subTest(namespace=namespace), tempfile.TemporaryDirectory() as temporary:
- root = Path(temporary)
+ root = Path(temporary).resolve()
name = namespace + "-levels.csv"
files = {
name: {"data": b"full_precision\n1.23456789\n"},
@@ -214,7 +214,7 @@ def test_writeback_entrypoints_archive_metadata_and_publish_only_their_svg(self)
(TUNING, TUNING.BASE, "filesystem-guest-writeback-tuning"),
):
with self.subTest(namespace=namespace), tempfile.TemporaryDirectory() as temporary:
- root = Path(temporary)
+ root = Path(temporary).resolve()
batch = root / "input"
batch.mkdir()
files = {
@@ -258,7 +258,7 @@ def test_writeback_entrypoints_archive_metadata_and_publish_only_their_svg(self)
def test_cli_publication_archives_tables_without_public_downloads(self):
with tempfile.TemporaryDirectory() as temporary:
- root = Path(temporary)
+ root = Path(temporary).resolve()
files = {
CLI.PREFIX + suffix + ".csv": b"value\n1.23456789\n"
for suffix in ("-levels", "-comparisons", "-environments", "-counters")
@@ -284,11 +284,12 @@ def test_cli_publication_archives_tables_without_public_downloads(self):
def test_io_publication_archives_csv_and_provenance_and_publishes_only_svg(self):
with tempfile.TemporaryDirectory() as temporary:
- root = Path(temporary)
+ root = Path(temporary).resolve()
table = "filesystem-io-shape.csv"
files = {
table: {"data": b"value\n1.23456789\n", "sha256": ""},
"curve.svg": {"data": b" ", "sha256": ""},
+ "unused.svg": {"data": b"archived ", "sha256": ""},
}
import hashlib
@@ -308,7 +309,21 @@ def test_io_publication_archives_csv_and_provenance_and_publishes_only_svg(self)
]
with (
patch.object(IO, "REPO", root),
- patch.object(IO, "collect", return_value=(files, {}, b"{}")),
+ patch.object(
+ IO,
+ "collect",
+ return_value=(
+ files,
+ {
+ "public_outputs": {
+ "docs/overrides/assets/benchmarks/filesystem-io/curve.svg": files[
+ "curve.svg"
+ ]["sha256"]
+ }
+ },
+ b"{}",
+ ),
+ ),
patch.object(sys, "argv", arguments),
contextlib.redirect_stdout(io.StringIO()),
):
@@ -321,6 +336,10 @@ def test_io_publication_archives_csv_and_provenance_and_publishes_only_svg(self)
files[table]["data"],
)
self.assertEqual(len(list(root.rglob("*.csv"))), 1)
+ self.assertEqual(
+ (root / "shape/publication/filesystem-io/unused.svg").read_bytes(),
+ files["unused.svg"]["data"],
+ )
self.assertFalse((root / "docs/src").exists())
self.assertEqual(
[p.suffix for p in (root / "docs").rglob("*") if p.is_file()], [".svg"]
@@ -329,7 +348,7 @@ def test_io_publication_archives_csv_and_provenance_and_publishes_only_svg(self)
def test_workload_publication_keeps_tables_pdfs_and_provenance_local(self):
with tempfile.TemporaryDirectory() as temporary:
- root = Path(temporary)
+ root = Path(temporary).resolve()
batch = root / ".data/synthetic"
analysis = batch / "analysis"
analysis.mkdir(parents=True)
diff --git a/benchmark.new/measurement_coverage.py b/benchmark.new/measurement_coverage.py
index f608297d..6e652f22 100644
--- a/benchmark.new/measurement_coverage.py
+++ b/benchmark.new/measurement_coverage.py
@@ -159,9 +159,9 @@ def coverage():
page = row["page"].removeprefix("benchmarks/")
if page == "startup.md":
description = (
- "同次启动 Ready / Exit;完整命令另列"
+ "启动到首条校验输出;不报告退出时间"
if locale == "zh"
- else "Same-launch Ready / Exit; whole-command time is separate"
+ else "Launch to first checked output; exit time is not reported"
)
elif page == "replay-fidelity.md":
description = (
diff --git a/benchmark.new/memory/README.md b/benchmark.new/memory/README.md
index ce76eee1..38938280 100644
--- a/benchmark.new/memory/README.md
+++ b/benchmark.new/memory/README.md
@@ -303,7 +303,7 @@ frozen supporting harnesses and the hashes of monitor, PSS and guard observation
## Published curves and archived history
-The [bilingual technical analysis](../../docs/src/zh/design/vm-memory-performance-analysis.md)
+The [bilingual technical analysis](../../docs/src/zh/lab-notes/vm-memory-performance-analysis.md)
uses only the complete `q8` and `l4` preflights. It publishes idle charged-memory
and PSS curves, with readback and CPU observations; post-write curves remain
local. The public SVG files are byte-identical copies of each cohort's
diff --git a/benchmark.new/public_assets.py b/benchmark.new/public_assets.py
index 0f88dcd5..25c73860 100644
--- a/benchmark.new/public_assets.py
+++ b/benchmark.new/public_assets.py
@@ -4,6 +4,7 @@
Only data needed by current publication contracts is exported to the site.
"""
+import re
from pathlib import Path
PUBLIC_CSV = frozenset(
@@ -100,6 +101,24 @@ def csv_path(repository, filename, locale=None):
return Path(repository) / "docs/overrides/assets/benchmarks/data" / group / filename
+def referenced_svg_paths(repository):
+ """Return benchmark SVG paths referenced by articles, tables or theme sources.
+
+ Paths are relative to the shared benchmark asset directory. Local evidence
+ and generated site files do not keep an unused public download alive.
+ """
+ docs = Path(repository) / "docs"
+ references = set()
+ for root in (docs / "src", docs / "overrides"):
+ for path in root.rglob("*"):
+ if ".data" in path.parts or path.suffix not in {".md", ".json", ".html", ".css", ".js"}:
+ continue
+ references.update(
+ re.findall(r"assets/benchmarks/([^\s\"'<>)]*\.svg)", path.read_text())
+ )
+ return references
+
+
def check_public_assets(repository):
"""Reject accidental publication of intermediate or duplicate evidence.
@@ -108,6 +127,10 @@ def check_public_assets(repository):
"""
repository = Path(repository)
assets = repository / "docs/overrides/assets/benchmarks"
+ figures = referenced_svg_paths(repository)
+ for path in assets.rglob("*.svg"):
+ if path.relative_to(assets).as_posix() not in figures:
+ raise ValueError(f"unreferenced public SVG: {path}")
for path in assets.rglob("*.csv"):
if not is_public_csv(path.name) or path != csv_path(repository, path.name):
raise ValueError(f"unneeded or duplicate public CSV: {path}")
diff --git a/benchmark.new/startup/README.md b/benchmark.new/startup/README.md
index 5b79abb0..4a7d200c 100644
--- a/benchmark.new/startup/README.md
+++ b/benchmark.new/startup/README.md
@@ -43,9 +43,9 @@ pVisor 默认使用 `target/release/pvisor`,可用 `--binary PATH` 指定。
- `hooks.py`:重置每次输入,校验输出、canary、Run Bundle 和只读 stage。
- `timing.py`:共享事件时钟、采样和统计;各 `*_timing.py` 固定后端。
- `audit.py`:复算当前批次的配对样本并校验逐次证据。
-- `publish.py`:将成功批次发布为双语 Ready / Exit 表。
+- `publish.py`:将成功批次发布为双语 Ready / Exit 结果 JSON。
-文档只保存 Ready / Exit 两张结果 JSON;来源摘要共用
+公开 CSV 同时保留 Ready 与 Exit 两列;用户页只引用 Ready 表,因为退出时间不改变读者的选型。来源摘要共用
`docs/overrides/assets/benchmarks/startup-timing.provenance.json`,单行复测保留其他
条件的批次和配置。完整 manifest、输入清单与内核收据留在试验 `.data/`。
diff --git a/benchmark.new/tests/test_docs.py b/benchmark.new/tests/test_docs.py
index ce972188..931544e6 100644
--- a/benchmark.new/tests/test_docs.py
+++ b/benchmark.new/tests/test_docs.py
@@ -20,8 +20,8 @@
class DocumentationTests(unittest.TestCase):
def test_all_benchmark_articles_and_bound_data_are_consistent(self):
pages, tables = DOCS.check_inventory()
- self.assertGreaterEqual(pages, 42)
- self.assertEqual(tables, 8)
+ self.assertEqual(pages, 36)
+ self.assertEqual(tables, 6)
manifest = json.loads((ROOT / "docs.json").read_text())
pairs = {}
for page in manifest["pages"]:
diff --git a/benchmark.new/tests/test_public_assets.py b/benchmark.new/tests/test_public_assets.py
index c909d359..9dd3e29c 100644
--- a/benchmark.new/tests/test_public_assets.py
+++ b/benchmark.new/tests/test_public_assets.py
@@ -11,6 +11,25 @@
class PublicAssetTests(unittest.TestCase):
+ def test_svg_requires_a_current_page_reference_with_matching_directory(self):
+ with tempfile.TemporaryDirectory() as tmp:
+ repo = Path(tmp)
+ figure = repo / "docs/overrides/assets/benchmarks/study/chart.svg"
+ figure.parent.mkdir(parents=True)
+ figure.write_text(" ")
+ article = repo / "docs/src/en/lab-notes/result.md"
+ article.parent.mkdir(parents=True)
+ article.write_text("")
+ with self.assertRaisesRegex(ValueError, "unreferenced public SVG"):
+ check_public_assets(repo)
+ article.write_text("")
+ check_public_assets(repo)
+ archive = article.parent / ".data"
+ archive.mkdir()
+ article.rename(archive / article.name)
+ with self.assertRaisesRegex(ValueError, "unreferenced public SVG"):
+ check_public_assets(repo)
+
def test_numeric_csv_has_one_location_across_languages(self):
repo = Path("/repository")
a = csv_path(repo, "filesystem-layered-references-levels.csv", "zh")
diff --git a/benchmark/README.md b/benchmark/README.md
index 85f4a49d..a510747d 100644
--- a/benchmark/README.md
+++ b/benchmark/README.md
@@ -26,57 +26,51 @@
## 每篇 benchmark 的结构 {#structure}
-用户文档中的每篇 benchmark 固定为以下四节,顺序不变:
+用户文档中的每篇 benchmark 固定为以下三节,顺序不变:
```markdown
# 标题:用户关心的问题,不是被测组件名
-## 主要结论 {#conclusions}
-一句话说明 pVisor 的收益,再用两到三条简短结论支撑。
-
## Motivation {#motivation}
-用户为什么需要知道这件事:哪种决策依赖它,不知道会付出什么代价。
+第一段给定性判断,第一句直接回答标题。第二段给定量支撑:只放支撑该判断的数字。
## 实验设计 {#interpretation}
-为了回答上面的问题,测什么、对照什么、怎样控制变量、什么算有效样本。
+第一段用三句话说明用什么衡量:测量哪个量、把它叫什么;这个量代表系统的什么能力;这个量往哪个方向变化意味着什么。不写测量步骤。
+后续段落说明如何测量:环境、对照、控制变量、采样、排除规则、设计不能回答什么。
## 实验数据和分析 {#results}
-支撑结论的数据表或图,以及对数据的解读和适用范围。
+支撑判断的数据表或图,以及对数据的解读和适用范围。
```
各节的要求:
-- **主要结论**
- - 第一句直接回答标题的问题,读者只看这一句也能做决定。
- - 按“总判断 → 支撑判断 → 定量证据”分层。总判断说明 pVisor 的技术选择及用户价值;两到三条支撑判断各表达一个完整观点;数字紧随对应观点或放在数据节。不要把指标或对照项目平铺成结论列表。
- - 结论中的每个数字都必须出现在本页"实验数据和分析"的表或图中。
- - 写清楚适用条件(平台、配置、负载类型),但不在结论里堆批次、日期、制品哈希。
- - 有短板就写短板。"pVisor 在 X 上更慢"也是结论。
- **Motivation**
+ - 第一段是定性判断:这个页面回答什么问题,读者该据此做什么选择。首句直接回答标题,读者只看这一句也能做决定。
+ - 第二段是定量支撑:给出支撑第一段的数字。结论中的每个数字都必须出现在本页"实验数据和分析"的表或图中。
- 写用户的决策,不写我们的工程动机。"选 staged 还是 VM 前需要知道工具任务要等多久"可以;"验证路径索引优化"不可以。
- - 两到四句话。
+ - 不在这一节放表格、列表或批次说明;写清楚适用条件(平台、配置、负载类型),但不堆批次、日期、制品哈希。
+ - 有短板就写短板。"pVisor 在 X 上更慢"也是判断。
- **实验设计**
- - 说明负载为什么能代表用户场景,对照组为什么是这几个。
+ - 第一段是固定句式,不加小标题或粗体标签。第一句写"测量 X,作为 Y";第二句写"Y 是系统的什么能力";第三句写"Y 越低或越高,用户得到什么"。三句话只回答"用什么衡量",不写怎么测。
+ - 后续段落说明如何测量:负载为什么能代表用户场景,对照组为什么是这几个,控制变量(硬件预算、预热和采样数、缓存状态、隔离方式、正确性校验),什么样本被拒绝,以及这个设计不能回答什么。
+ - 只描述当前批次。历史批次、旧版本和它们的口径属于"实验数据和分析",不在这一节叙述。
- 使用读者能理解的任务和操作描述;benchmark 注册编号、内部 API、辅助程序与开关细节留在复现手册和证据中。
- - 列出控制变量:硬件预算、预热和采样数、缓存状态、隔离方式、正确性校验。
- - 说明什么样本被拒绝(失败、校验不通过、受干扰),失败不能当作零耗时。
- - 说明这个设计**不能**回答什么。
- **实验数据和分析**
- 先放回答结论的那张表,再放补充数据。
- 每张表写明单位、统计量(P50/P95)、样本数。
- 分析要解释数据对用户意味着什么,不复述表格。
- 末尾按需提供白名单内的必要统计 CSV 和来源摘要,复现命令链接到 `benchmark/` 的 README。正文已有的静态表不默认另附下载;完整数据、原始样本与制品清单留在本地 `.data/`,不生成失效的站点下载链接。
-先写 pVisor 做了什么、带来什么收益,用具体动词和简短判断表达。对照项目的名称、版本和数据放在实验与数据节;适用条件集中说明。实测收益与预期分开,保留不利结果;多个条件同时变化时,只报告整体效果。
+先写 pVisor 做了什么、带来什么收益,用具体动词和简短判断表达。对照项目的名称、版本和数据放在实验与数据节;适用条件集中说明。实测收益与预期分开,保留不利结果;多个条件同时变化时,只报告整体效果。用户页的措辞规则和常见失败模式见 [docs/README.md § Benchmark pages](../docs/README.md#benchmark-pages)。
-篇幅:正文控制在一屏到三屏。超过时,把技术分析移到 `docs/src/*/design/*-performance-analysis.md`,用户页只保留结论和一句链接。
+篇幅:正文控制在一屏到三屏。超过时,把技术分析移到 `docs/src/*/lab-notes/*-performance-analysis.md`,用户页只保留结论和一句链接。
## 角色 {#roles}
| 角色 | 回答谁的问题 | 结果放在哪里 | 能否进入用户文档正文 |
|---|---|---|---|
| **user-facing** | 用户:该不该用、选哪个模式、要预留多少资源 | `docs/src/*/benchmarks/` | 能,且必须遵守[结构](#structure) |
-| **engineering A/B** | 开发者:这个改动有没有让产品变好或变差 | `docs/src/*/design/*-performance-analysis.md`、PR 描述 | 不能;只有改变了用户结论时,才更新 user-facing 页的数字 |
+| **engineering A/B** | 开发者:这个改动有没有让产品变好或变差 | `docs/src/*/lab-notes/*-performance-analysis.md`、PR 描述 | 不能;只有改变了用户结论时,才更新 user-facing 页的数字 |
| **diagnostic** | 开发者:时间花在哪里 | 相关目录的 `.data/`、设计文档的分析节 | 不能 |
一个脚本可以同时被多个 benchmark 使用,但每次运行只服务一个 benchmark ID,报告中要记录该 ID。
@@ -117,7 +111,7 @@ Design: 负载、对照、控制变量与有效样本判据。
### B-OVERVIEW / B-METHOD:选型总览与比较方法 {#b-overview}
-- **文档:** `index.md`、`methodology.md`
+- **文档:** `index.md`(选型总览与比较方法)
- **角色:** user-facing(综合页)
- **Motivation:** 用户需要选择主题并判断哪些数字可比较。
- **想要的结论:** 各主题的选型含义、证据范围与未测项目。
@@ -226,8 +220,8 @@ Design: 负载、对照、控制变量与有效样本判据。
### B-FS-ENG:文件系统改动的工程 A/B {#b-fs-eng}
-- **文档:** `docs/src/*/design/filesystem-performance-analysis.md`、
- `docs/src/*/design/filesystem-io-performance-analysis.md`
+- **文档:** `docs/src/*/lab-notes/filesystem-performance-analysis.md`、
+ `docs/src/*/lab-notes/filesystem-io-performance-analysis.md`
- **角色:** engineering A/B
- **Motivation:** 开发者需要判断一次文件系统改动是否让 B-FS-TOOLS 的用户结论变好,并定位时间花在哪一层(传输、OverlayCore、持久化、内容指纹)。
- **想要的结论:** "改动 X 让负载 Y 的中位数变化 Z%(95% 置信区间),其余负载未检出差异";以及"staged 与 FUSE 直通之间的差距中,持久化占 A ms,内容指纹占 B ms,路径解析占 C ms"。
@@ -355,7 +349,7 @@ Design: 负载、对照、控制变量与有效样本判据。
checkpoint 核对每轮每工具的 rootfs/workspace OPEN、READ、LOOKUP、READINDEX
和物理查询;计数含该工具进程树启动/校验,与 worker 时钟范围分别说明。
入口 `filesystem_cache_matrix.py`;原始入口/制品/准备/失败留在 `.data/`,
- 工程结论进入 `design/filesystem-performance-analysis.md`,不更新跨运行时用户表。
+ 工程结论进入 `lab-notes/filesystem-performance-analysis.md`,不更新跨运行时用户表。
- **普通 CLI 封存 rootfs 入口快速对照:** 同一冻结真实 CLI 与 0047 固件,
比较同一封存物理 rootfs 的普通 `--rootfs PATH` 与公开认证的
`--rootfs-base-store STORE --rootfs-base ID`;通过公开 SnapshotStore API
@@ -572,13 +566,13 @@ Design: 负载、对照、控制变量与有效样本判据。
- **读队列与 journal 锁对照:** `host_read_journal_ab.py` / `host_read_journal_driver.rs`;冻结同一源码,仅撤销/保留读调度与指纹锁改动。macOS FSKit 的实际部分 copy-up 窗口中并发测只读 OPEN、已打开描述符 READ、OPENDIR,关闭日志、legacy 与 compact strict 分条件;另以共享 Core 的真实 1 GiB 原生文件指纹计算测 unrelated journal 观测,legacy/compact 独立成批。原生文件访问时间变化证明首次读已发生,开始探测时哈希线程必须仍在运行,不人工延迟。每格 3 次预热、30 个 seeded 随机配对样本,空闲对照、完整内容/观察/卸载和干扰门禁、配对 bootstrap 95% CI;不合并复制与哈希条件,不宣称冷磁盘、Linux、VM、吞吐或端到端工具收益。报告/加工 CSV 在 `benchmark/pvisor/`,原始来源和失败在 `.data/`。
-- **Linux staged 空闲调度对照:** 使用 `reference_baselines.run_trial` 的原 task timer,以冻结的 coordinator/namespace helper 随机配对同源码基线与仅修改 host dispatch 的候选,API/README 和私有测试同步更新。CPU 0,1、整父组两核 quota / 16 GiB / swap 0,Btrfs 热宿主缓存、相同空工具缓存与 Python bytecode 策略;每样本独立 user/mount/PID namespace、owned pivot_root 和 Host listener,namespace/输入准备不计时。3 warmups、30 配对轮次、完整七工具输出/Run Bundle/宿主隔离/upper 字节校验、前后输入清单与外部 0.5 s 构建/测试干扰门禁。插桩关闭、保留有效慢样本,5,000 次配对 bootstrap,分离簇不作整体排名。raw helper、冻结源码、制品和失败/中间尝试保留 `.data/`;整理 CSV 与结论仅进入 `design/filesystem-performance-analysis.md#host-idle-dispatch`。不作为 hyperfine 数据,也不与跨运行时用户批次或 macOS/VM 结果合并。
+- **Linux staged 空闲调度对照:** 使用 `reference_baselines.run_trial` 的原 task timer,以冻结的 coordinator/namespace helper 随机配对同源码基线与仅修改 host dispatch 的候选,API/README 和私有测试同步更新。CPU 0,1、整父组两核 quota / 16 GiB / swap 0,Btrfs 热宿主缓存、相同空工具缓存与 Python bytecode 策略;每样本独立 user/mount/PID namespace、owned pivot_root 和 Host listener,namespace/输入准备不计时。3 warmups、30 配对轮次、完整七工具输出/Run Bundle/宿主隔离/upper 字节校验、前后输入清单与外部 0.5 s 构建/测试干扰门禁。插桩关闭、保留有效慢样本,5,000 次配对 bootstrap,分离簇不作整体排名。raw helper、冻结源码、制品和失败/中间尝试保留 `.data/`;整理 CSV 与结论仅进入 `lab-notes/filesystem-performance-analysis.md#host-idle-dispatch`。不作为 hyperfine 数据,也不与跨运行时用户批次或 macOS/VM 结果合并。
-- **Linux VM worker 调度对照:** 同一冻结源码的三版本配对:撤销 `65e65c93`/`09bd1d59` 的优化前版本、保留当前优化与 host 修复的基线、仅修改 VM worker 调度/私有测试及 README 的候选。每版本 3 warmups、30 个随机同轮样本;独立 namespace、owned pivot_root、fresh VM/Host listener,整父组 CPU 0,1 / quota 两核 / 16 GiB / swap 0,同 B-FS-TOOLS 七工具及输入、缓存、逐字节 upper、宿主隔离与干扰门禁。使用原 reference timer,profiling 关闭;与当前基线的差异用于候选归因,优化前版本只用于同批恢复程度对照。5,000 次配对 bootstrap,分离簇不报整体排名;各候选批次独立保留,只发布通过门禁的最终制品,不合并样本。原始 helper、冻结源码、构建和诊断在 `.data/`,加工 CSV 与结果仅进入 `design/filesystem-performance-analysis.md#vm-completion-dispatch`,不重算跨运行时用户表,不外推 macOS、冷磁盘或并发吞吐。
+- **Linux VM worker 调度对照:** 同一冻结源码的三版本配对:撤销 `65e65c93`/`09bd1d59` 的优化前版本、保留当前优化与 host 修复的基线、仅修改 VM worker 调度/私有测试及 README 的候选。每版本 3 warmups、30 个随机同轮样本;独立 namespace、owned pivot_root、fresh VM/Host listener,整父组 CPU 0,1 / quota 两核 / 16 GiB / swap 0,同 B-FS-TOOLS 七工具及输入、缓存、逐字节 upper、宿主隔离与干扰门禁。使用原 reference timer,profiling 关闭;与当前基线的差异用于候选归因,优化前版本只用于同批恢复程度对照。5,000 次配对 bootstrap,分离簇不报整体排名;各候选批次独立保留,只发布通过门禁的最终制品,不合并样本。原始 helper、冻结源码、构建和诊断在 `.data/`,加工 CSV 与结果仅进入 `lab-notes/filesystem-performance-analysis.md#vm-completion-dispatch`,不重算跨运行时用户表,不外推 macOS、冷磁盘或并发吞吐。
- **不可变 share 的 DAX 开关对照:** `benchmark.new/filesystem/dax_ab.py` 准备同一优化制品、固件和物理不可变输入,生成 `in.json` 后通过 `semspec bench` 执行 Python 配对行;不使用 hyperfine。两组均通过公开 VM API 建立只读 DAX-capable share 和 128 MiB 窗口,仅 guest 挂载选项 `dax=never` / `dax=inode` 不同;statx 必须验证实际 DAX 属性。宿主热缓存、新 guest、独占 rootfs upper/work;完整 VM 组 CPU 0,1、两核 quota、2 GiB、swap 0,guest 2 vCPU/512 MiB。静态 C 探针测独立 64 MiB 文件的顺序读取、双线程读取和 mmap 页遍历,以及 128×64 KiB 小文件 open/read/close、2,048 路径 metadata;首次数据访问与 guest 内重复访问分列,全量内容验证在阶段计时之外。小文件组有超过窗口容量的映射,保留其正常回收成本。各组 3 次预热、30 个预先随机平衡配对,共 60 个正式 VM;5,000 次配对 bootstrap,先检查分布,保留有效慢样本,不报告 P99。校验错误、输入/制品变化、非零退出、预算不符、OOM 或外部构建/测试干扰使批次失败;报告失败和剔除数。冻结 harness、源码、制品、全部日志与样本在 `.data/`,加工表和 CSV 为工程报告;不将只读 share 的结果外推到 CLI 可写 workspace、启动退化或磁盘冷缓存。
-- **guest 写合并开关对照:** 同一冻结的直接队列 GNU release/gateway 制品,仅切换宿主 runner 的 `PVISOR_VM_FS_WRITEBACK=1` / `0`,由专用 worker 恢复并校验原环境。Linux VM 的 rootfs/workspace 均无 DAX 窗口;与 B-FS-TOOLS 相同的七项操作、完整任务和校验,整父组 CPU 0,1、两核 quota、16 GiB、swap 0,guest 2 vCPU/16 GiB。热宿主缓存、每次私有 namespace/pivot_root、独立工作区与工具缓存;每臂 3 warmups、30 个 seeded 随机配对,共 60 个正式任务。输入与制品摘要、完整 upper 字节、Run Bundle、正常退出、预算和外部构建/测试门禁通过后才能发布;保留慢有效样本,分离簇不给整体排名,5,000 次配对 bootstrap,不报告 P95/P99。原始及冻结执行入口保留 `.data/writeback-ab-*` 与 `.data/writeback-quick-*`;工程表和 CSV 进入 `design/filesystem-performance-analysis.md#writeback-ab`,生产默认值和跨运行时用户表不由该开关实验改写。
+- **guest 写合并开关对照:** 同一冻结的直接队列 GNU release/gateway 制品,仅切换宿主 runner 的 `PVISOR_VM_FS_WRITEBACK=1` / `0`,由专用 worker 恢复并校验原环境。Linux VM 的 rootfs/workspace 均无 DAX 窗口;与 B-FS-TOOLS 相同的七项操作、完整任务和校验,整父组 CPU 0,1、两核 quota、16 GiB、swap 0,guest 2 vCPU/16 GiB。热宿主缓存、每次私有 namespace/pivot_root、独立工作区与工具缓存;每臂 3 warmups、30 个 seeded 随机配对,共 60 个正式任务。输入与制品摘要、完整 upper 字节、Run Bundle、正常退出、预算和外部构建/测试门禁通过后才能发布;保留慢有效样本,分离簇不给整体排名,5,000 次配对 bootstrap,不报告 P95/P99。原始及冻结执行入口保留 `.data/writeback-ab-*` 与 `.data/writeback-quick-*`;工程表和 CSV 进入 `lab-notes/filesystem-performance-analysis.md#writeback-ab`,生产默认值和跨运行时用户表不由该开关实验改写。
- **guest 目录镜像与惰性 OPEN:** `guest_cache.py`,同一冻结 release CLI/SDK 和固件切换 `PVISOR_VM_GUEST_CACHE=0/1`,writeback 固定关闭。普通 `--safe` CLI 工作区与 SDK 显式 Immutable lower 独立成批;2 vCPU/4096 MiB、热宿主输入、新 VM/upper、3 warmups/30 seeded 随机配对。分列 2048 路径首次/重复 stat、深目录 stat、目录枚举、64 MiB 读取、1000 次热 open/fstat 与 open/read、宽目录单文件访问及 1.3s 空闲后 stat。校验全部数据、退出/Bundle 和输入不变,保留全部有效慢样本,配对 bootstrap 95% CI、先检查分布,不报告 P99。独立 B-FS-DIAG 运行用 prime-only 差分核对 READINDEX/OPEN/GETATTR 等请求,不把 profiling 耗时混入正式样本;声明资格、TTL 和跨文件数据缓存策略差异,不将 SDK 不可变 share 外推到普通 CLI 或整个 Agent。报告、来源、失败和完整数据保留 `.data/guest-cache-*`。修复预取退化时,使用 `--baseline-firmware` 在同一 CLI/SDK/payload 下比较旧/新固件,两臂 guest cache 均为 1,仍采用相同的随机配对、分布与校验规则。自适应预取由 `guest_cache_adaptive.py` 同批比较原始预取、仅枚举加载和候选三种固件(均 cache=1),增加宽目录两文件、32 随机文件、32 跨步文件及全量连续 stat,检验利用率门槛和恢复程度;预算、30 配对轮次、独立计数和校验规则相同。
@@ -653,7 +647,7 @@ Design: 负载、对照、控制变量与有效样本判据。
### B-KERNEL-ENG:裁剪固件是否缩短当前产品的启动 {#b-kernel-eng}
-- **角色:** engineering A/B;放入 `docs/src/*/design/vm-startup-performance-analysis.md`,不作为跨产品用户排名。
+- **角色:** engineering A/B;放入 `docs/src/*/lab-notes/vm-startup-performance-analysis.md`,不作为跨产品用户排名。
- **Motivation:** 判断裁剪 guest 内核的收益,以及它是否仍支持工作区、开发工具和网络所需能力。
- **想要的结论:** 相同 pVisor 二进制、相同 Linux 源码和补丁、相同打包方式,仅配置不同的两份新固件,其就绪/完整任务中位数差及 95% 配对 bootstrap 区间;列出减少的功能与未验证能力。
- **实验设计:** 冻结固件源码、输入 tarball、补丁、配置与编译记录,分别重建通用配置和裁剪配置;不复用旧固件作为基线。先验证构建和同样负载的输出、暂存隔离与工作区内容;Linux KVM 上以相同两核/内存/工具输入,随机交替 shell-ready、七项文件工具和修复任务,每格 30 次、3 次预热。CPU 缓解、seccomp、namespaces、virtio-fs 等所需配置必须保留;网络/恢复能力需独立正确性检查,不能由 shell 启动通过推导。配置中 guest LSM/设备功能差异必须明确,不称为相同加固程度的排名。
@@ -839,8 +833,8 @@ Design: 负载、对照、控制变量与有效样本判据。
### B-CLUSTER:增加机器和资源后,能否得到更多有效结果 {#b-cluster}
-- **文档:** `cluster-scalability.md`
-- **状态:** 已退役;只保留历史证据,无活动测量或发布入口。旧 Controller/Worker 数据不是当前 daemon 的吞吐、密度或历史成本。
+- **文档:** 无用户页;原 `cluster-scalability.md` 已删除,历史证据只保留在本地归档。
+- **状态:** 已退役;无活动测量、发布入口或用户页。旧 Controller/Worker 数据不是当前 daemon 的吞吐、密度或历史成本。
- **角色:** user-facing(历史证据)
- **Motivation:** 规模化运行 Agent 时,用户关心的是增加 Worker 和资源能不能线性地增加有效产出,以及控制面在长期运行后是否会成为瓶颈。
- **想要的结论:** "在固定的总资源预算下,每秒完成的有效任务数随 Worker 数增长的曲线";"控制面在保留 N 条历史记录时的内存和重启耗时"。
@@ -892,8 +886,9 @@ Design: 负载、对照、控制变量与有效样本判据。
- [ ] 已阅读本文件和路径上每一级目录的 README。
- [ ] 改动对应的注册表条目存在,脚本注释块与条目一致。
-- [ ] 用户文档页严格按"主要结论 → Motivation → 实验设计 → 实验数据和分析"四节组织。
-- [ ] 主要结论的第一句直接回答标题的问题,所有数字都能在本页的表或图中找到。
+- [ ] 用户文档页严格按"Motivation → 实验设计 → 实验数据和分析"三节组织。
+- [ ] Motivation 第一段是定性判断、首句直接回答标题;第二段是定量支撑,所有数字都能在本页的表或图中找到。
+- [ ] 实验设计先回答"衡量什么"、再回答"如何测量",且只描述当前批次。
- [ ] 结论以 pVisor 的技术选择、用户价值与适用条件为主线;对照身份明确,预期与实测区分,不利结果完整保留。
- [ ] 没有过程叙述、版本迭代史和内部代号;工程 A/B 和诊断结果没有进入用户页正文。
- [ ] 百分比变化来自同批对照,并附有置信区间;双峰分布与受干扰样本已按[规则](#data-rules)处理。
@@ -905,4 +900,4 @@ Design: 负载、对照、控制变量与有效样本判据。
- [`pvisor/`](pvisor/README.md):测量脚本、运行方式与报告格式。
- [`replay/`](replay/qwen3.6-results.md):Qwen3.6 SandboxReplay 实验记录,保留历史样本,不作为产品保证。
- 用户文档:[`docs/src/zh/benchmarks/`](../docs/src/zh/benchmarks/index.md)。
-- 技术分析:`docs/src/zh/design/*-performance-analysis.md`。
+- 技术分析:`docs/src/zh/lab-notes/*-performance-analysis.md`。
diff --git a/benchmark/pvisor/FILESYSTEM_PROFILING.md b/benchmark/pvisor/FILESYSTEM_PROFILING.md
index a6029add..b85943c8 100644
--- a/benchmark/pvisor/FILESYSTEM_PROFILING.md
+++ b/benchmark/pvisor/FILESYSTEM_PROFILING.md
@@ -345,7 +345,7 @@ Explicit `--cases rg-2048,rg-deep-2048,git-status-2048,npm-offline-32` requires
The five-item optimization campaign is recorded under
`target/optimization-five-20261005`, with reviewable reports, source patch and
-validation logs in [the evidence directory](../../docs/src/assets/benchmarks/filesystem-optimizations-20261005/).
+validation logs in the evidence directory (local archive: `docs/src/assets/benchmarks/.data/filesystem-optimizations-20261005/`).
Its baseline was copied before these edits;
the candidate applies only the seven relevant source/build files to that copy.
Concurrent lazy-cache/backend work is excluded from the comparison. Source and
@@ -454,9 +454,9 @@ workload tails also varied. The executable grows from 14.87 MiB to 18.59 MiB
These timings cover this fixed Linux/KVM fixture, not every workload or platform.
Final raw samples and provenance are preserved in
-[the release comparison](../../docs/src/assets/benchmarks/filesystem-optimizations-20261005/code-v3-4g.tsv),
-[the build-profile comparison](../../docs/src/assets/benchmarks/filesystem-optimizations-20261005/profile-v3-4g.tsv)
-and [the manifest](../../docs/src/assets/benchmarks/filesystem-optimizations-20261005/manifest.tsv).
+the release comparison (local archive: `docs/src/assets/benchmarks/.data/filesystem-optimizations-20261005/code-v3-4g.tsv`),
+the build-profile comparison (local archive: `docs/src/assets/benchmarks/.data/filesystem-optimizations-20261005/profile-v3-4g.tsv`)
+and the manifest (local archive: `docs/src/assets/benchmarks/.data/filesystem-optimizations-20261005/manifest.tsv`).
## Shared filesystem service and direct lazy-image version evaluation
@@ -510,8 +510,8 @@ Lazy whole-job P50 rises 2.29% cold and 0.64% warm. Removing the extra mount doe
not establish general acceleration. The experiment does not separately profile
metadata projection, materialization, preimage and synchronization costs.
-Full results and historical context are in the [benchmark article](../../docs/src/en/design/filesystem-performance-analysis.md#filesystem-service).
-Public raw reports and provenance are preserved in [the evidence directory](../../docs/src/assets/benchmarks/filesystem-service-20261005/).
+Full results and historical context are in the [benchmark article](../../docs/src/en/lab-notes/filesystem-performance-analysis.md#filesystem-service).
+Historical raw reports and provenance were archived locally in the evidence directory (local archive: `docs/src/assets/benchmarks/.data/filesystem-service-20261005/`).
`plot_filesystem_service.py` renders the standalone SVG figures from those reports.
## Host stage journal profiling and optimization (2026-10-05)
diff --git a/benchmark/pvisor/README.md b/benchmark/pvisor/README.md
index 76f3d36c..1d33d659 100644
--- a/benchmark/pvisor/README.md
+++ b/benchmark/pvisor/README.md
@@ -4,7 +4,7 @@ Read [the benchmark registry and writing rules](../README.md) before measuring o
## Lazy image client startup
-`B-LAZY-STARTUP` compares a Distribution registry's complete-image Docker path with a real `pvisor-cache serve` lazy VM path for the same pinned linux/amd64 manifest and workload. The default `ubuntu-shell` cohort uses Ubuntu 26.04; `numpy-script` is a separate Python/NumPy cohort. `torch-import` remains optional but has no formal samples; its failed attempts are retained, not performance evidence. Never pool different workloads or their preflight and formal samples. This is not OpenSandbox `pvisor-daemon serve`. See [the retained Ubuntu local report](LAZY_STARTUP_REPORT.md) and derived Ubuntu CSV (local archive: `.data/derived-tables-20261018/lazy-startup-summary.csv`); they do not establish NumPy or torch performance. The [bilingual user article](../../docs/src/zh/benchmarks/lazy-image-startup.md#numpy) includes the independent NumPy cohort, with [derived statistics](../../docs/src/zh/benchmarks/lazy-numpy-summary.csv), [differences/preparation](../../docs/src/zh/benchmarks/lazy-numpy-details.csv) and [provenance](../../docs/src/zh/benchmarks/lazy-numpy-provenance.csv). Historical evidence is retained at `benchmark/pvisor/.data/lazy-numpy-local-20261007/`. Its legacy `derive.py` writes historical CSVs; do not use it to overwrite current site downloads. The current implementation rerun below supplies the user article and current CSVs.
+`B-LAZY-STARTUP` compares a Distribution registry's complete-image Docker path with a real `pvisor-cache serve` lazy VM path for the same pinned linux/amd64 manifest and workload. The default `ubuntu-shell` cohort uses Ubuntu 26.04; `numpy-script` is a separate Python/NumPy cohort. `torch-import` remains optional but has no formal samples; its failed attempts are retained, not performance evidence. Never pool different workloads or their preflight and formal samples. This is not OpenSandbox `pvisor-daemon serve`. See [the retained Ubuntu local report](LAZY_STARTUP_REPORT.md) and derived Ubuntu CSV (local archive: `.data/derived-tables-20261018/lazy-startup-summary.csv`); they do not establish NumPy or torch performance. The [bilingual user article](../../docs/src/zh/benchmarks/lazy-image-startup.md#numpy) includes the independent NumPy cohort, with historical derived files `lazy-numpy-summary.csv`, `lazy-numpy-details.csv` and `lazy-numpy-provenance.csv` belonging to local evidence rather than current site downloads. Historical evidence is retained at `benchmark/pvisor/.data/lazy-numpy-local-20261007/`. Its legacy `derive.py` writes historical CSVs; do not use it to overwrite current site downloads. The current implementation rerun below supplies the user article and current CSVs.
Finish other builds/tests before sampling. Docker access uses `sg docker -c`; KVM and both frozen executables must be usable. The successful NumPy preflight uses the existing `target/release/pvisor` launcher with the separately built `target/lazy-torch-build/release/pvisor-cache`, selected via `--cache-binary`. This static cache build includes Docker gzip compatibility; the directory name is historical and does not mean torch was measured. The commands below keep the default launcher directory `target/release` and override only the cache executable, not `--binary-dir`. A new launcher conflicts with the existing persistent Host listener: **do not kill or replace the user's listener** to run this benchmark. Preserve the compatible existing launcher/listener pairing. Finish artifact preparation and freeze the binaries before preflight; do not rebuild during sampling. Install `skopeo` and `openssl`; loopback ports 15000/15443/15444/15445 must be free. First pull the report's pinned Distribution image outside timing:
@@ -394,7 +394,7 @@ Apply sampling honors `--samples` and `--warmups` at every file count, including
Keep raw reports, per-trial samples, stdout/stderr, failures, input hashes, binaries and frozen harnesses in `.data/`. The repository ignores that directory at every depth. A new output directory is required for every run; retain slow valid samples and failed preflights. Do not build, run other tests or sample unrelated workloads during measurement.
-Public Markdown contains derived comparisons. Supporting CSVs sit beside each article in `docs/src/{zh,en}/benchmarks/`, with download links. They identify cohort, resource budget, sample count, statistic and source digest. Full typed TSV reports, sample CSVs and archives stay local. Existing evidence is preserved in `docs/src/assets/benchmarks/.data/`; the verified migration inventory is in `benchmark/.data/raw-migration.json`.
+Public Markdown contains derived comparisons. Current downloadable CSVs are allowlisted by `benchmark.new/public_assets.py` and shared under `docs/overrides/assets/benchmarks/data/`; historical and engineering CSVs stay in local evidence. Retain cohort, resource budget, sample count, statistic and source digest. Full typed TSV reports, samples and archives stay local. Historical records identify `docs/src/assets/benchmarks/.data/` and the migration inventory `benchmark/.data/raw-migration.json`; these archives are not distributed with a checkout. Legacy export commands below retain their historical destinations and are not current site-publication instructions.
For large parked-capacity sweeps, `parked_density.py --archive-completed-snapshots` losslessly retains completed Job snapshot/restore trees as each batch's `snapshot-artifacts.tar.zst` and `snapshot-artifacts.json`. This happens after the measured service exits, outside all task timers, cgroup phase memory and CPU. Logs, configurations, full recovery proofs, Run Bundles and final upper changes remain directly readable. Every archive member's bytes, links, mode, numeric ownership, nanosecond timestamp and extended attributes are checked before original generated trees are removed. Failed, unknown or incomplete batches keep their complete artifacts. Archive compression is a retention operation, not a measured VM compression mechanism: zstd level 3 uses one thread and a maximum 512 MiB matching window in the outer coordinator, after the measured cgroup has exited. Restore into a new scratch directory with:
@@ -1030,7 +1030,7 @@ python3 benchmark/pvisor/parked_density.py \
Every state touches/checks 64 MiB, waits for an exact stdin token, and on recovery verifies the saved identity, full data, Git status and four edits among 64 files. Admission/parking is sequential, all states must remain parked at the common barrier, and recovery uses one fixed slot. Current raw/compressed Job snapshots, native SIGSTOP and Podman pause have different portability and boundary semantics. Podman needs delegated child cgroups to freeze; payload/conmon must remain below the same 2 GiB/two-core/zero-swap parent. Unsupported stdin restoration or freezer control is a failed preflight, never a timed-sleep fallback. Only after every selected preflight condition passes, start a new five-round 1..128 capacity sweep. This does not establish tail latency, active concurrent throughput, SDK offload or automatic cold-page compression; raw backing cache may be reclaimed under the same memory pressure. Keep all failed and unknown outcomes, OOM events and private backing/cache in the accounting.
-B-CLUSTER is retired with the Controller/Worker implementation. Removed runners are `cluster_scalability.py`, `cluster_worker.py` and `controller_history.py`; their dedicated tests, `plot_cluster_scalability.py` and `publish_controller_history.py` are also removed. There is no current reproduction, plotting or publication command for this ID. Frozen historical harnesses and reports in local `.data/` remain archival evidence, not active entry points. The locale `cluster-scalability.md` articles identify the retained CSVs as historical results; those bytes and receipts must not be relabeled as daemon measurements.
+B-CLUSTER is retired with the Controller/Worker implementation. Removed runners are `cluster_scalability.py`, `cluster_worker.py` and `controller_history.py`; their dedicated tests, `plot_cluster_scalability.py` and `publish_controller_history.py` are also removed. There is no current reproduction, plotting or publication command for this ID. Frozen historical harnesses and reports in local `.data/` remain archival evidence, not active entry points. The former locale `cluster-scalability.md` articles were removed; the retained CSVs remain archival evidence, and those bytes and receipts must not be relabeled as daemon measurements.
B-DENSITY and B-VM-MEMORY remain independent local benchmarks: `density.py`/`density_worker.py`, `parked_density.py`/`parked_memory_probe.rs`, `vm_memory.py`/`memory_probe.rs`, `live_vm_memory.py` and `macos_cold_ram.py` are not Cluster runners. Their source/binary/input receipts, integrity checks, failure accounting and resource controls remain required. None establishes daemon density, scheduling throughput or retained-history costs.
@@ -1614,14 +1614,14 @@ Build frozen sources with only the proposed change between versions; report pair
## CI regression gate
-B-PROCESS uses `bench.py` through `just benchmark`. It checks a successful minimal Run and Bundle access, with 2 warmups/10 samples for smoke or 10 warmups/50 samples for nightly. It does not establish cross-runtime user rankings.
+B-PROCESS uses `benchmark.new/process/{smoke,nightly}.json` through `just benchmark` and semspec bench. `bench.py` remains a historical helper. It checks a successful minimal Run and Bundle access, with 2 warmups/10 samples for smoke or 10 warmups/50 samples for nightly. It does not establish cross-runtime user rankings.
```bash
just benchmark
-OUTPUT=benchmark/pvisor/.data/nightly just benchmark nightly
+just benchmark nightly --output benchmark.new/process/.data/nightly-new
just benchmark-compare \
- benchmark/pvisor/.data/candidate/raw-report.json \
- benchmark/pvisor/.data/main/raw-report.json
+ benchmark.new/process/.data/candidate/in.bench.json \
+ benchmark.new/process/.data/main/in.bench.json
```
## Linux SDK live RAM offload
diff --git a/benchmark/replay/qwen3.6-results.md b/benchmark/replay/qwen3.6-results.md
index 2b53dafc..5d4d1507 100644
--- a/benchmark/replay/qwen3.6-results.md
+++ b/benchmark/replay/qwen3.6-results.md
@@ -4,7 +4,7 @@
模型服务配置、硬件及重复试验次数未完整登记;以下保留原始样本和当时的诊断,
未在本次文档清理中重跑。结果只说明这些轨迹的观测,不能推广为回放确定性或当前兼容性保证。
-现行使用方法与适配版本见 [回放指南](../../docs/src/zh/guides/sandbox-replay.md)。
+现行使用方法与适配版本见 [回放指南](../../docs/src/zh/guides/replay.md)。
后续结果应另外记录运行日期、提交、模型与 Agent 版本、环境、样本及失败记录。
## 5. Qwen3.6 实测结果
@@ -559,8 +559,8 @@ Bash:
续跑的 `A′(N+1)` 可见文本为空白但命令同样逐字复现;两轮续跑 verifier Reward 均为 1。
精确参数见
-[`pvisor replay` 命令参考](../reference/cli.md#replay-an-agent-trajectory);执行边界见
-[执行指南](execution.md)。
+[`pvisor replay` 命令参考](../../docs/src/zh/reference/cli.md#replay-an-agent-trajectory);执行边界见
+[执行指南](../../docs/src/zh/guides/executors/index.md)。
## OpenCode 实验诊断(历史记录)
diff --git a/crates/pvisor-cli/src/bin/pvisor-replay.rs b/crates/pvisor-cli/src/bin/pvisor-replay.rs
index ad0ad3e7..e32d4d4e 100644
--- a/crates/pvisor-cli/src/bin/pvisor-replay.rs
+++ b/crates/pvisor-cli/src/bin/pvisor-replay.rs
@@ -385,7 +385,7 @@ fn run_managed(config: &ReplayToml) -> Result {
ReplayError::configuration(format!("resolve managed replay workspace: {error}"))
})?;
let mut command = Command::new(&executable);
- command.args(["run", "--spec"]).arg(file.path());
+ command.args(["run", "--config"]).arg(file.path());
command.current_dir(&working_dir);
let status = command.status().map_err(|error| {
ReplayError::configuration(format!("start managed pVisor replay: {error}"))
diff --git a/crates/pvisor-cli/src/cli/run.rs b/crates/pvisor-cli/src/cli/run.rs
index 25101397..bc8d7727 100644
--- a/crates/pvisor-cli/src/cli/run.rs
+++ b/crates/pvisor-cli/src/cli/run.rs
@@ -3560,6 +3560,7 @@ mod tests {
let live = root.path().join("live");
std::fs::create_dir(&source).unwrap();
std::fs::create_dir(&live).unwrap();
+ let live = live.canonicalize().unwrap();
std::fs::write(source.join("file"), b"fixed generation").unwrap();
let root_store = SnapshotStore::new(&root.path().join("root-store")).unwrap();
let root_base = root_store.prepare_rootfs(&source).unwrap();
diff --git a/crates/pvisor-overlay-core/tests/checked_backing_lookup.rs b/crates/pvisor-overlay-core/tests/checked_backing_lookup.rs
index 52435a24..081bdbaf 100644
--- a/crates/pvisor-overlay-core/tests/checked_backing_lookup.rs
+++ b/crates/pvisor-overlay-core/tests/checked_backing_lookup.rs
@@ -102,6 +102,7 @@ fn excluded_denied_and_backend_enoent_remain_errors_instead_of_checked_absence()
let temp = tempfile::tempdir().unwrap();
let lower = temp.path().join("lower");
fs::create_dir(&lower).unwrap();
+ let lower = lower.canonicalize().unwrap();
let service = FilesystemService::new(
OverlayCore::new_with_exclusions_and_preimages(
vec![lower.clone()],
diff --git a/docs/README.md b/docs/README.md
index 12f8ee9a..9e15def9 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -21,6 +21,74 @@ English article at the same relative path under `docs/src/en/`. Chinese defines
the canonical information architecture; both languages describe the same
behavior, examples, evidence and known limitations.
+## Benchmark pages {#benchmark-pages}
+
+Benchmark articles under `docs/src/{zh,en}/benchmarks/` are user decisions, not
+engineering reports: a reader must be able to choose a mode or size a deployment
+from them. Registration, data and publication rules live in
+[`benchmark/README.md`](../benchmark/README.md#structure). The rules below are the
+failure modes that have actually reached the site; treat them as hard rules.
+
+**Structure**
+
+- Exactly three H2 sections, in this order and with these anchors:
+ `Motivation {#motivation}`, `Experiment design {#interpretation}`,
+ `Data and analysis {#results}`. Never add `Conclusions`, `What is measured`,
+ `How it is measured` or `Limitations` sections.
+- `Motivation` is two paragraphs. The first is a judgement whose first sentence
+ answers the H1. The second is quantitative support only.
+- No tables, lists, batch history, dates or artifact hashes in `Motivation`.
+- Every number in `Motivation` must be traceable to a table, figure or data
+ paragraph on the same page. Rounding to the displayed precision is fine;
+ inventing a new number is not.
+
+**Experiment design**
+
+The first paragraph is a fixed form, never a procedure and never a defence of
+the metric:
+
+1. `Measure X as Y.` Name the quantity and the metric.
+2. `Y is the capability it represents.`
+3. `A lower or higher Y means the reader's outcome.`
+
+Example, from startup latency:
+
+> Measure the interval from launch to the first checked shell output as
+> environment Ready time. That interval is how quickly the system answers a
+> caller: a shorter Ready time means the system handles bursts of large-scale
+> requests better.
+
+- Do not write "this page", "本页", "we", "我们", "note that", or a list of
+ caveats before the metric.
+- The remaining paragraphs describe only the current cohort: environment,
+ controls, sampling, validation, exclusions and what the design cannot answer.
+ Historical cohorts and before/after narratives belong in the data section,
+ and only on a page that is explicitly historical.
+- If a metric does not change a decision, do not report it. Delete its table
+ instead of keeping it for completeness: `startup.md` reports Ready only,
+ because exit time does not change which executor a reader picks.
+
+**Data and analysis**
+
+- Lead with the table or figure that answers the conclusion, then interpret it.
+ Do not restate table cells as prose.
+- Keep historical cohorts in this section, label them, and never pool them with
+ the current cohort.
+- Keep the page within roughly three screens. Move engineering A/B and
+ diagnostic detail to `lab-notes/`.
+
+**Editing rules**
+
+- Change both languages in the same edit, then run
+ `python3 scripts/check-docs.py --record-translations` and
+ `python3 scripts/check-docs.py --require-recorded`.
+- Before removing or renaming an H3/H4, search the repository for its `#anchor`.
+ Anchor churn breaks lab-note links and is not a formatting cleanup.
+- Do not put a benchmark registry ID (`B-*`) or an internal switch name on a
+ user page; link to the topic page or the runner manual instead.
+- Run `python3 benchmark.new/docs.py check` after touching a `{{ table(...) }}`
+ macro, `benchmark.new/docs.json` or a `*.render.json` file.
+
```bash
just docs-serve # native Chinese preview on 127.0.0.1:3000
just docs-serve en # native English preview on 127.0.0.1:3001
@@ -111,9 +179,9 @@ and user-facing protocol pages belong in the site's `reference/` tree, not at th
## Information architecture
Value before mechanism, mechanism before implementation. Keep Home as the first
-top-level tab, followed by six sections: Quick start → User guide → Core concepts
-→ Benchmarks → Design and research → Contributing
-(首页 → 快速开始 → 用户指南 → 基础概念 → 基准测试 → 设计与研究 → 参与开发).
+top-level tab, followed by seven sections: Quick start → User guide → Core concepts
+→ Benchmarks → Design and research → Lab notes → Contributing
+(首页 → 快速开始 → 用户指南 → 基础概念 → 基准测试 → 设计与研究 → 实验记录 → 参与开发).
Quick start includes the product introduction and `why/` articles; User guide
includes the task learning path and reference pages; Core concepts includes
Security as a subsection. The homepage remains accessible through its own tab
@@ -124,14 +192,15 @@ subgroups into their parent group; do not add a third sidebar level.
The canonical Chinese documentation uses these sections:
-- `why/`: the case for pVisor — vision, supervision-bandwidth argument, trust ladder, use cases, comparisons, when not to use.
-- `start/`: product scope, installation, the first reproducible Job, and where to go next.
+- `why/`: the case for pVisor — the supervision-bandwidth argument, trust ladder with use cases, and fit check with comparisons.
+- `start/`: installation and the first reproducible Job, ending with where to go next.
- `guides/`: tasks, commands and expected results, grouped by job (`agents/`, `policies/`, `executors/`).
-- `concepts/`: the user mental model — jobs, staging, evidence, policy, glossary.
+- `concepts/`: the user mental model — jobs, staging, evidence and policy layering.
- `benchmarks/`: reproducible measurements and dated comparisons.
- `security/`: what is protected, what is not, and how to report issues.
- `reference/`: CLI, configuration, schemas and platform support matrices.
- `design/`: implementation ownership, mechanisms, ADRs and research directions.
+- `lab-notes/`: dated engineering experiment logs and historical evidence; conclusions are governed by `benchmarks/` and `design/`, not by these notes.
- `community/`: contributing, development, testing, release, roadmap and policies.
Experimental feature documents live under `design/experimental/` in both locale
@@ -202,9 +271,10 @@ The native `exclude` plugin excludes `.data/` at every depth, and the generated
site checker rejects leaked evidence. Zensical publishes the shared theme assets
in each locale, including images and JSON downloads, so native previews need no
extra server. JSON fixtures, recording tools and published figures use
-`docs/overrides/assets/` directly. Existing local evidence remains in the real
-`docs/src/assets/benchmarks/.data/` directory, outside the three projects' article
-roots. Do not replace the former tracked `docs/src/assets/` or
+`docs/overrides/assets/` directly. Historical evidence paths include
+`docs/src/assets/benchmarks/.data/`, outside the locale article roots. These local
+archives are not distributed with a checkout; preserve their recorded identities
+without presenting absent files as public downloads. Do not replace the former tracked `docs/src/assets/` or
`docs/src/stylesheets/` directories with symlinks: Git cannot stage individual
old-file deletions through a symlink during the migration.
@@ -227,7 +297,7 @@ matter or navigation label. Removing `status: todo` does not complete a missing
field reference, schema, experiment, or policy decision. Keep outstanding items
explicit and attach the implementation or verification that completes each one.
Preserve page paths and bilingual parity. Keep both locale navigation trees in
-the Home-plus-six-section order defined above.
+the Home-plus-seven-section order defined above.
### Writing style
@@ -247,7 +317,7 @@ it. The models are the uv, Ruff and Ray docs.
- Prefer a concrete example over an abstract description; show the command and what it does.
- State a guarantee once, on the page that owns it, and link from elsewhere. Never open a page with a disclaimer, and never repeat a caveat in every paragraph.
- No meta text: no “本文/本节/本页”, no “继续阅读”, no first line that restates the heading.
-- Name the mechanism when it matters; keep terms consistent with the glossary.
+- Name the mechanism when it matters; keep terms consistent with the concept page that owns them. The execution-guarantee framework has exactly one naming: **有界 / 可逆 / 可查** (bounded / reversible / checkable) — do not coin variants (可恢复/可核查, 放手/把关/有据, auditable, ...).
- Tables for options, matrices and comparisons; code fences for anything runnable.
- Keep article directories in the sidebar. Omit tables that only map topics to
documentation links, and do not replace them with equivalent link lists.
@@ -261,6 +331,78 @@ it. The models are the uv, Ruff and Ray docs.
where its detail becomes relevant instead of duplicating its sections.
- A page with no data yet says “建设中” and links to its TODO page instead of making an empty claim.
+### Page count, placement and conclusions
+
+Five hard rules distilled from the October 2026 restructure (161 → 124 pages).
+They exist because the failure modes below already happened once; do not
+reintroduce them.
+
+1. **Page count follows information content (页数随信息量).** A page shorter
+ than ~30 substantive lines does not stand alone; fold it into its parent.
+ Navigation depth must not exceed content depth. Never split one topic into
+ several pages to make the sidebar look complete.
+2. **One fact, one home (一个事实一个家).** Each assertion lives on exactly
+ one page; every other page states it in one sentence and links. Before
+ adding a paragraph, grep for its key phrase — if it already exists, link,
+ do not restate. The 2026 review found the same three-command workflow on
+ ten pages and the same owner.json paragraph three times verbatim.
+3. **No pages for empty sets (空集合不建页).** No adopters page without
+ adopters, no governance page for a single-maintainer project, no
+ publications page without publications. If the set is empty, say so in one
+ sentence on the parent page. Status honesty beats maturity theater.
+4. **Status determines location (状态决定位置).** Implemented → `design/` or
+ `guides/`. Accepted but unimplemented → `design/experimental/` or an
+ explicit “proposal (not implemented)” banner, kept short. Retired → a
+ tombstone paragraph. Dated experiment batches and engineering logs →
+ `lab-notes/`, never `design/`. A page that describes a target state must
+ say so at the top and point to the current-implementation boundary.
+5. **The conclusion test (结论测试).** The first sentence of a page must
+ answer the question its title asks, with absolute numbers or a direct
+ judgment. Delete circular sentences (“adopt when benefits exceed costs”
+ without a threshold) and self-referential closures that define the product
+ by its own coinage. Benchmark pages follow the fixed pattern: absolute
+ water level in the first sentence → scenario entries → shortcomings floated
+ up.
+
+`scripts/check-docs.py` enforces the mechanical parts in CI (via
+`just docs-build`): bilingual pairing, navigation targets, link/anchor/image
+resolution — and a **duplicate-paragraph gate** that fails the build when the
+same substantive prose paragraph (≥150 chars) appears in two pages. Intentional
+shared boilerplate must use a recognized convention instead of raw repetition:
+blockquote notes, `measurement-status` marker regions, link/pointer lines, or
+an `ALLOWED_DUPLICATES` entry with a written reason.
+
+### Design writing references
+
+Model the explanation of one mechanism on this sequence: problem and constraints →
+minimal system model (who owns state) → the normal path of one real request →
+the failure path → tradeoffs → implementation and evidence entry points. The
+[design overview](src/zh/design/index.md) follows this order through one
+end-to-end task. Each figure answers one reader question: ownership (layered
+diagram), one operation (sequence), data placement (layout/map), crash residue
+(failure states), or cost (sourced measurement). Figure components must have
+corresponding entry points in source or contracts.
+
+Expression references worth studying, by local topic (accessed 2026-10-07; these
+evaluate documentation craft, not project quality):
+
+| Project and article | What to learn |
+| --- | --- |
+| [ByteHook · project overview](https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md) | Derive mechanisms from the necessary underlying model; connect objects and calls with figures |
+| [TigerBeetle · Architecture](https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/ARCHITECTURE.md) | Start from workload and constraints before persistence and design decisions |
+| [Firecracker · Design](https://github.com/firecracker-microvm/firecracker/blob/main/docs/design.md) | Host integration, threads and the device model in one architecture narrative |
+| [gVisor · Architecture guide](https://gvisor.dev/docs/architecture_guide/intro/) | Explain the boundary through one syscall example |
+| [Tokio · Runtime](https://docs.rs/tokio/latest/tokio/runtime/index.html) | Usage model first, then thread lifetimes and scheduling guarantees |
+| [etcd · Client design](https://etcd.io/docs/v3.6/learning/design-client/) | Error and retry semantics for lost ACKs and unknown outcomes |
+| [Ray · Architecture whitepapers](https://docs.ray.io/en/latest/ray-contribute/whitepaper.html) | Keep overview and internal topics in separate layers |
+| [Rust Compiler Development Guide](https://rustc-dev-guide.rust-lang.org/overview.html) | From pipeline to queries, data structures and source entry points |
+| [CockroachDB · Design](https://github.com/cockroachdb/cockroach/blob/master/docs/design.md) | Layered diagrams connecting data abstractions to physical layout |
+
+Diagrams use the site's dark-blue palette: background `#0d1b30`, cards
+`#142840`, accent `#a8cefa`, text `#e9eef8`; teal, amber and dark red mark
+sharing, change and conflict states with text labels. Keep SVG text searchable;
+split long diagrams into per-topic parts.
+
The native TOML files own navigation. Maintain paired Chinese and English articles.
Keep only current article paths; do not maintain historical redirect maps or
compatibility pages. When moving or merging articles, update incoming source
@@ -397,51 +539,15 @@ To validate a TOML file without launching an executor:
cargo run --locked -p pvisor --example documentation_config -- run.toml
```
-### community/adopters.md
-
-Measurements, generated references, or formal decisions still need completion. The acceptance criteria below remain required; the page retains its planned status.
-
-**Acceptance criteria**
-
-- Publish users and scenarios with consent.
-- Distinguish production use from experiments.
-
-### community/code-of-conduct.md
-
-**Requirements**
-
-- Adopt [Contributor Covenant 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/) or an equivalent text;
-- Specify a reporting channel (dedicated email or maintainers), rather than public issues;
-- Describe handling procedures and possible consequences.
-
-**Acceptance criteria**
-
-- Add repository-root `CODE_OF_CONDUCT.md` and keep this page consistent;
-- Ensure that the reporting channel works and is listed on [Community](index.md).
-
### community/governance.md
-Measurements, generated references, or formal decisions still need completion. The acceptance criteria below remain required; the page retains its planned status.
+The page describes the current single-maintainer process; a formal maintainer list,
+charter and conduct reporting channel are not yet established.
**Acceptance criteria**
-- Define the maintainer list, decision process and advancement path.
- Describe the human role in semspec approval.
-
-### design/decisions/index.md
-
-**Requirements**
-
-- Create an ADR template (context, options, decision, consequences, status) and a numbering convention (`NNNN-short-title.md`).
-- Backfill the existing key decisions, for example:
- - Admission plans stop at `Planned`; enforcement comes only from executor observations.
- - Gateway and replay are separated from the core closure as optional features.
- - `--safe` does not select an executor and refuses to start rather than degrading when it cannot enforce.
- - The human approval process for semantic specifications.
-
-**Acceptance criteria**
-
-- At least four numbered ADRs with titles/status.
+- Announce the maintainer list, charter and conduct channel on this page once established.
### design/replay.md
@@ -456,46 +562,6 @@ Measurements, generated references, or formal decisions still need completion. T
- Code/test references per adapter.
- Link replay-fidelity results.
-### design/research/cluster-execution.md
-
-**Requirements**
-
-- Metrics: single-node useful-work density and execution/evidence overhead under fixed resource budgets.
-- Controls: native execution and external Kubernetes or Ray orchestration, with pinned versions.
-- Workload: independent sandboxes; cross-node placement, retries and workflows remain external.
-- Environment: one measured node first; any external multi-node experiment has a separately declared scope.
-
-**Acceptance criteria**
-
-- pVisor defines execution semantics without replacing schedulers.
-- Distinguish the daemon's implemented VM-only `NativeRuntime` from proposed integrations; require separate prepared-image and end-to-end SDK validation.
-- Align claims with measured density; Cluster/controller measurements are not evidence for the node-local daemon.
-
-### design/research/publications.md
-
-Measurements, generated references, or formal decisions still need completion. The acceptance criteria below remain required; the page retains its planned status.
-
-**Acceptance criteria**
-
-- Link papers/reports/talks.
-- State implementation revisions.
-- Mark outputs that do not establish product guarantees.
-
-### design/research/rl-execution-substrate.md
-
-**Requirements**
-
-- Metrics: throughput, isolation, reproducibility, fork cost.
-- Controls: RL framework sandboxes.
-- Workload: fixed rollouts, failure replay, checkpoint forks.
-- Environment: pinned model/tools.
-
-**Acceptance criteria**
-
-- Integration and scope.
-- Tested recording, fork, and prefix replay.
-- Separate design from the rollout guide.
-
### guides/ci.md
**Requirements**
diff --git a/docs/index.html b/docs/index.html
index 30356b66..9fdd05d8 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1,12 +1,12 @@
-
+
PolicyVisor documentation
dark; font-family: system-ui, sans-serif; }
+ :root { color-scheme: light dark; font-family: system-ui, sans-serif; }
body { margin: 0; min-height: 100vh; display: grid; place-items: center; }
main { max-width: 36rem; padding: 2rem; }
h1 { font-size: 2.5rem; margin-bottom: 1rem; }
@@ -18,9 +18,9 @@
-
- 1>PolicyVisor
- Scaling autonomous
agent execution.让自主 Agent 的执行可以规模化。
+
+ PolicyVisor
+ Scaling autonomous agent execution.让自主 Agent 的执行可以规模化。
中文文档
English documentation
diff --git a/docs/overrides/assets/benchmarks/cluster-scalability-20261005/execution.svg b/docs/overrides/assets/benchmarks/cluster-scalability-20261005/execution.svg
deleted file mode 100644
index 1776e59f..00000000
--- a/docs/overrides/assets/benchmarks/cluster-scalability-20261005/execution.svg
+++ /dev/null
@@ -1,851 +0,0 @@
-
-
-
-
-
-
-
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
- Simultaneous real KVM guests
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 50
-
-
-
-
-
-
-
-
-
-
-
-
- 100
-
-
-
-
-
-
-
-
-
-
-
-
- 150
-
-
-
-
-
-
-
-
-
-
-
-
- 200
-
-
-
-
-
-
-
-
-
-
-
-
- 250
-
-
-
-
-
-
-
-
-
-
-
-
- 300
-
-
-
-
-
-
-
-
-
-
-
-
- 350
-
-
-
- Controller + Workers (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Live memory footprint
-
-
-
-
-
-
-
-
-
- Total cgroup charge
-
-
-
-
-
-
-
-
- Anonymous memory
-
-
-
-
-
-
-
-
- File / shmem charge
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
- Simultaneous real KVM guests
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 1000
-
-
-
-
-
-
-
-
-
-
-
-
- 2000
-
-
-
-
-
-
-
-
-
-
-
-
- 3000
-
-
-
-
-
-
-
-
-
-
-
-
- 4000
-
-
-
- Latency (ms)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Submit to guest readiness
-
-
-
-
-
-
- Observed min / max
-
-
-
-
-
-
-
-
- Per-guest P50
-
-
-
-
-
-
-
-
- Empirical P95
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
- Simultaneous real KVM guests
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.2
-
-
-
-
-
-
-
-
-
-
-
-
- 0.4
-
-
-
-
-
-
-
-
-
-
-
-
- 0.6
-
-
-
-
-
-
-
-
-
-
-
-
- 0.8
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
- Guests / time-to-all-ready (s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Burst launch capacity
-
-
-
-
-
-
-
-
-
- Measured launch rate
-
-
-
-
-
- Linear reference from N=1
-
-
-
-
- Cluster execution scaling: measured N=1, 2, 4
-
-
- 5 measured batches per point + excluded warmup | 128 MiB / 1 vCPU per guest | 0.5 core / 512 MiB per Worker
- Shared Linux host; prepared rootfs; warm caches. Bands show observed ranges, not confidence intervals. Launch rate is not Agent throughput.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/confirm-phase-means-selected-blocks.svg b/docs/overrides/assets/benchmarks/filesystem-io/confirm-phase-means-selected-blocks.svg
deleted file mode 100644
index 8679664b..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/confirm-phase-means-selected-blocks.svg
+++ /dev/null
@@ -1,1033 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:23:24.586907
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sync
-
-
-
-
-
-
-
-
-
- async
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 50
-
-
-
-
-
-
-
-
-
-
-
-
- 100
-
-
-
-
-
-
-
-
-
-
-
-
- 150
-
-
-
-
-
-
-
-
-
-
-
-
- 200
-
-
-
-
-
-
-
-
-
-
-
-
- 250
-
-
-
- Wall time per resident round (ms)
-
-
-
-
-
-
-
-
-
- block-1k
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sync
-
-
-
-
-
-
-
-
-
- async
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 5
-
-
-
-
-
-
-
-
-
-
-
-
- 10
-
-
-
-
-
-
-
-
-
-
-
-
- 15
-
-
-
-
-
-
-
-
-
-
-
-
- 20
-
-
-
-
-
-
-
-
-
-
-
-
- 25
-
-
-
-
-
-
-
-
-
-
-
-
- 30
-
-
-
-
-
-
-
-
-
-
-
-
- 35
-
-
-
-
-
-
-
-
-
-
-
-
- 40
-
-
-
- Wall time per resident round (ms)
-
-
-
-
-
-
-
-
-
- block-64k
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Individual environment total
-
-
-
-
-
- Accepted / operation loop
-
-
-
-
-
- Applied / flush
-
-
-
-
-
- File fsync
-
-
-
-
-
- Close
-
-
-
-
-
- Directory fsync
-
-
-
-
- Phase arithmetic means across independent environments; additive to mean total
- Dependent rounds averaged first; all wall-time interference and team coordination retained
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/confirm-smallfiles-smallfiles.svg b/docs/overrides/assets/benchmarks/filesystem-io/confirm-smallfiles-smallfiles.svg
deleted file mode 100644
index a9c5da77..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/confirm-smallfiles-smallfiles.svg
+++ /dev/null
@@ -1,1421 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:23:23.756297
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- File size (KiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.2
-
-
-
-
-
-
-
-
-
-
-
-
- 0.4
-
-
-
-
-
-
-
-
-
-
-
-
- 0.6
-
-
-
-
-
-
-
-
-
-
-
-
- 0.8
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
- Completed throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sync
-
-
-
-
-
-
-
-
- async
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- File size (KiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.5
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
-
-
-
-
-
-
-
-
-
- 1.5
-
-
-
-
-
-
-
-
-
-
-
-
- 2.0
-
-
-
-
-
-
-
-
-
-
-
-
- 2.5
-
-
-
- Accepted / loop throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- File size (KiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.2
-
-
-
-
-
-
-
-
-
-
-
-
- 0.4
-
-
-
-
-
-
-
-
-
-
-
-
- 0.6
-
-
-
-
-
-
-
-
-
-
-
-
- 0.8
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
-
-
-
-
-
-
-
-
-
- 1.2
-
-
-
-
-
-
-
-
-
-
-
-
- 1.4
-
-
-
- VM paired throughput / sync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- smallfiles: smallfiles | N=30 independent environments/point
- 95% bootstrap; N<30 exploratory; split points withhold overall median/ranking; N5 cannot test splits
- 0 failed environments retained; dependent rounds aggregated
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/confirm-sync-stream.svg b/docs/overrides/assets/benchmarks/filesystem-io/confirm-sync-stream.svg
deleted file mode 100644
index 4332a54d..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/confirm-sync-stream.svg
+++ /dev/null
@@ -1,1376 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:23:24.261226
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- Writes per fsync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
-
-
-
-
-
-
-
-
-
- 6
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
- Completed throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sync
-
-
-
-
-
-
-
-
- async
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- Writes per fsync
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
-
-
-
-
-
-
-
-
-
- 6
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
- Accepted / loop throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- Writes per fsync
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.5
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
-
-
-
-
-
-
-
-
-
- 1.5
-
-
-
-
-
-
-
-
-
-
-
-
- 2.0
-
-
-
-
-
-
-
-
-
-
-
-
- 2.5
-
-
-
-
-
-
-
-
-
-
-
-
- 3.0
-
-
-
- VM paired throughput / sync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sync: stream | N=30 independent environments/point
- 95% bootstrap; N<30 exploratory; split points withhold overall median/ranking; N5 cannot test splits
- 0 failed environments retained; dependent rounds aggregated
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/memory-batch_kib-sampled_memory_current_peak_bytes-4.svg b/docs/overrides/assets/benchmarks/filesystem-io/memory-batch_kib-sampled_memory_current_peak_bytes-4.svg
deleted file mode 100644
index 003eb3ce..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/memory-batch_kib-sampled_memory_current_peak_bytes-4.svg
+++ /dev/null
@@ -1,372 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:16:17.540637
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 200
-
-
-
-
-
-
-
-
-
-
-
-
- 400
-
-
-
-
-
-
-
-
-
-
-
-
- 600
-
-
-
-
-
-
-
-
-
-
-
-
- 800
-
-
-
-
-
-
-
-
-
-
-
-
- 1000
-
-
-
- batch_kib
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1183
-
-
-
-
-
-
-
-
-
-
-
-
- 1184
-
-
-
-
-
-
-
-
-
-
-
-
- 1185
-
-
-
-
-
-
-
-
-
-
-
-
- 1186
-
-
-
-
-
-
-
-
-
-
-
-
- 1187
-
-
-
-
-
-
-
-
-
-
-
-
- 1188
-
-
-
-
-
-
-
-
-
-
-
-
- 1189
-
-
-
-
-
-
-
-
-
-
-
-
- 1190
-
-
-
-
-
-
-
-
-
-
-
-
- 1191
-
-
-
- Whole-environment memory (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sampled_memory_current_peak_bytes; scope: all cells / entire VM
- Other factors: {"capacity_mib": 64, "delay_us": 10000}
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/memory-capacity_mib-sampled_memory_current_peak_bytes-1.svg b/docs/overrides/assets/benchmarks/filesystem-io/memory-capacity_mib-sampled_memory_current_peak_bytes-1.svg
deleted file mode 100644
index eb8546ca..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/memory-capacity_mib-sampled_memory_current_peak_bytes-1.svg
+++ /dev/null
@@ -1,385 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:16:17.920138
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 50
-
-
-
-
-
-
-
-
-
-
-
-
- 100
-
-
-
-
-
-
-
-
-
-
-
-
- 150
-
-
-
-
-
-
-
-
-
-
-
-
- 200
-
-
-
-
-
-
-
-
-
-
-
-
- 250
-
-
-
- capacity_mib
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1184
-
-
-
-
-
-
-
-
-
-
-
-
- 1185
-
-
-
-
-
-
-
-
-
-
-
-
- 1186
-
-
-
-
-
-
-
-
-
-
-
-
- 1187
-
-
-
-
-
-
-
-
-
-
-
-
- 1188
-
-
-
-
-
-
-
-
-
-
-
-
- 1189
-
-
-
-
-
-
-
-
-
-
-
-
- 1190
-
-
-
-
-
-
-
-
-
-
-
-
- 1191
-
-
-
- Whole-environment memory (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sampled_memory_current_peak_bytes; scope: all cells / entire VM
- Other factors: {"batch_kib": 1024, "delay_us": 10000}
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/memory-delay_us-sampled_memory_current_peak_bytes-3.svg b/docs/overrides/assets/benchmarks/filesystem-io/memory-delay_us-sampled_memory_current_peak_bytes-3.svg
deleted file mode 100644
index 23730b77..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/memory-delay_us-sampled_memory_current_peak_bytes-3.svg
+++ /dev/null
@@ -1,398 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:16:18.318310
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 10000
-
-
-
-
-
-
-
-
-
-
-
-
- 20000
-
-
-
-
-
-
-
-
-
-
-
-
- 30000
-
-
-
-
-
-
-
-
-
-
-
-
- 40000
-
-
-
-
-
-
-
-
-
-
-
-
- 50000
-
-
-
- delay_us
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1184
-
-
-
-
-
-
-
-
-
-
-
-
- 1185
-
-
-
-
-
-
-
-
-
-
-
-
- 1186
-
-
-
-
-
-
-
-
-
-
-
-
- 1187
-
-
-
-
-
-
-
-
-
-
-
-
- 1188
-
-
-
-
-
-
-
-
-
-
-
-
- 1189
-
-
-
-
-
-
-
-
-
-
-
-
- 1190
-
-
-
-
-
-
-
-
-
-
-
-
- 1191
-
-
-
- Whole-environment memory (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sampled_memory_current_peak_bytes; scope: all cells / entire VM
- Other factors: {"batch_kib": 1024, "capacity_mib": 64}
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/parameters-block-stream.svg b/docs/overrides/assets/benchmarks/filesystem-io/parameters-block-stream.svg
deleted file mode 100644
index a8009983..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/parameters-block-stream.svg
+++ /dev/null
@@ -1,2046 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:16:16.910847
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
- Write block (KiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 20
-
-
-
-
-
-
-
-
-
-
-
-
- 40
-
-
-
-
-
-
-
-
-
-
-
-
- 60
-
-
-
-
-
-
-
-
-
-
-
-
- 80
-
-
-
- Completed throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- async
-
-
-
-
-
-
-
-
- capacity-4m
-
-
-
-
-
-
-
-
- capacity-16m
-
-
-
-
-
-
-
-
- capacity-256m
-
-
-
-
-
-
-
-
- batch-64k
-
-
-
-
-
-
-
-
- batch-256k
-
-
-
-
-
-
-
-
- delay-0us
-
-
-
-
-
-
-
-
- delay-100us
-
-
-
-
-
-
-
-
- delay-1000us
-
-
-
-
-
-
-
-
- delay-50000us
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
- Write block (KiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 20
-
-
-
-
-
-
-
-
-
-
-
-
- 40
-
-
-
-
-
-
-
-
-
-
-
-
- 60
-
-
-
-
-
-
-
-
-
-
-
-
- 80
-
-
-
- Accepted / loop throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
- Write block (KiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.2
-
-
-
-
-
-
-
-
-
-
-
-
- 0.4
-
-
-
-
-
-
-
-
-
-
-
-
- 0.6
-
-
-
-
-
-
-
-
-
-
-
-
- 0.8
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
-
-
-
-
-
-
-
-
-
- 1.2
-
-
-
- VM paired throughput / async
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- block: stream | N=5 independent environments/point
- 95% bootstrap; N<30 exploratory; split points withhold overall median/ranking; N5 cannot test splits
- 0 failed environments retained; dependent rounds aggregated
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/pressure-stream.svg b/docs/overrides/assets/benchmarks/filesystem-io/pressure-stream.svg
deleted file mode 100644
index 429d8c73..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/pressure-stream.svg
+++ /dev/null
@@ -1,3863 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:16:15.915496
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
-
-
-
-
-
-
-
-
-
- 64
-
-
-
-
-
-
-
-
-
-
-
-
- 128
-
-
-
- Bytes per round (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 100
-
-
-
-
-
-
-
-
-
-
-
-
- 200
-
-
-
-
-
-
-
-
-
-
-
-
- 300
-
-
-
-
-
-
-
-
-
-
-
-
- 400
-
-
-
-
-
-
-
-
-
-
-
-
- 500
-
-
-
-
-
-
-
-
-
-
-
-
- 600
-
-
-
- Completed throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- async
-
-
-
-
-
-
-
-
- capacity-4m
-
-
-
-
-
-
-
-
- capacity-16m
-
-
-
-
-
-
-
-
- capacity-256m
-
-
-
-
-
-
-
-
- batch-64k
-
-
-
-
-
-
-
-
- batch-256k
-
-
-
-
-
-
-
-
- delay-0us
-
-
-
-
-
-
-
-
- delay-100us
-
-
-
-
-
-
-
-
- delay-1000us
-
-
-
-
-
-
-
-
- delay-50000us
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
-
-
-
-
-
-
-
-
-
- 64
-
-
-
-
-
-
-
-
-
-
-
-
- 128
-
-
-
- Bytes per round (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 200
-
-
-
-
-
-
-
-
-
-
-
-
- 400
-
-
-
-
-
-
-
-
-
-
-
-
- 600
-
-
-
-
-
-
-
-
-
-
-
-
- 800
-
-
-
-
-
-
-
-
-
-
-
-
- 1000
-
-
-
- Accepted / loop throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
-
-
-
-
-
-
-
-
-
- 64
-
-
-
-
-
-
-
-
-
-
-
-
- 128
-
-
-
- Bytes per round (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.2
-
-
-
-
-
-
-
-
-
-
-
-
- 0.4
-
-
-
-
-
-
-
-
-
-
-
-
- 0.6
-
-
-
-
-
-
-
-
-
-
-
-
- 0.8
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
-
-
-
-
-
-
-
-
-
- 1.2
-
-
-
- VM paired throughput / async
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- pressure: stream | N=5 independent environments/point
- 95% bootstrap; N<30 exploratory; split points withhold overall median/ranking; N5 cannot test splits
- 0 failed environments retained; dependent rounds aggregated
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/readset-read.svg b/docs/overrides/assets/benchmarks/filesystem-io/readset-read.svg
deleted file mode 100644
index b7072bae..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/readset-read.svg
+++ /dev/null
@@ -1,2462 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:15:47.371974
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
-
-
-
-
-
-
-
-
-
- 32
-
-
-
- Warm upper read set (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 1000
-
-
-
-
-
-
-
-
-
-
-
-
- 2000
-
-
-
-
-
-
-
-
-
-
-
-
- 3000
-
-
-
-
-
-
-
-
-
-
-
-
- 4000
-
-
-
-
-
-
-
-
-
-
-
-
- 5000
-
-
-
-
-
-
-
-
-
-
-
-
- 6000
-
-
-
-
-
-
-
-
-
-
-
-
- 7000
-
-
-
- Completed throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sync
-
-
-
-
-
-
-
-
- async
-
-
-
-
-
-
-
-
- native
-
-
-
-
-
-
-
-
- async-old
-
-
-
-
-
-
-
-
- unmerged
-
-
-
-
-
-
-
-
- owned-sync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
-
-
-
-
-
-
-
-
-
- 32
-
-
-
- Warm upper read set (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 1000
-
-
-
-
-
-
-
-
-
-
-
-
- 2000
-
-
-
-
-
-
-
-
-
-
-
-
- 3000
-
-
-
-
-
-
-
-
-
-
-
-
- 4000
-
-
-
-
-
-
-
-
-
-
-
-
- 5000
-
-
-
-
-
-
-
-
-
-
-
-
- 6000
-
-
-
-
-
-
-
-
-
-
-
-
- 7000
-
-
-
- Accepted / loop throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
-
-
-
-
-
-
-
-
-
- 32
-
-
-
- Warm upper read set (MiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.5
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
-
-
-
-
-
-
-
-
-
- 1.5
-
-
-
-
-
-
-
-
-
-
-
-
- 2.0
-
-
-
- VM paired throughput / sync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- readset: read | N=5 independent environments/point
- 95% bootstrap; N<30 exploratory; split points withhold overall median/ranking; N5 cannot test splits
- 0 failed environments retained; dependent rounds aggregated
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/smallfiles-smallfiles.svg b/docs/overrides/assets/benchmarks/filesystem-io/smallfiles-smallfiles.svg
deleted file mode 100644
index 37ee346e..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/smallfiles-smallfiles.svg
+++ /dev/null
@@ -1,1459 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:15:47.971570
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- File size (KiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.5
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
-
-
-
-
-
-
-
-
-
- 1.5
-
-
-
-
-
-
-
-
-
-
-
-
- 2.0
-
-
-
-
-
-
-
-
-
-
-
-
- 2.5
-
-
-
-
-
-
-
-
-
-
-
-
- 3.0
-
-
-
- Completed throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sync
-
-
-
-
-
-
-
-
- async
-
-
-
-
-
-
-
-
- native
-
-
-
-
-
-
-
-
- async-old
-
-
-
-
-
-
-
-
- unmerged
-
-
-
-
-
-
-
-
- owned-sync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- File size (KiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 20
-
-
-
-
-
-
-
-
-
-
-
-
- 40
-
-
-
-
-
-
-
-
-
-
-
-
- 60
-
-
-
-
-
-
-
-
-
-
-
-
- 80
-
-
-
-
-
-
-
-
-
-
-
-
- 100
-
-
-
-
-
-
-
-
-
-
-
-
- 120
-
-
-
-
-
-
-
-
-
-
-
-
- 140
-
-
-
- Accepted / loop throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- File size (KiB)
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.2
-
-
-
-
-
-
-
-
-
-
-
-
- 0.4
-
-
-
-
-
-
-
-
-
-
-
-
- 0.6
-
-
-
-
-
-
-
-
-
-
-
-
- 0.8
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
-
-
-
-
-
-
-
-
-
- 1.2
-
-
-
- VM paired throughput / sync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- smallfiles: smallfiles | N=5 independent environments/point
- 95% bootstrap; N<30 exploratory; split points withhold overall median/ranking; N5 cannot test splits
- 0 failed environments retained; dependent rounds aggregated
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-io/sync-stream.svg b/docs/overrides/assets/benchmarks/filesystem-io/sync-stream.svg
deleted file mode 100644
index cbf15ed0..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-io/sync-stream.svg
+++ /dev/null
@@ -1,1399 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-17T16:15:48.380955
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- Writes per fsync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
-
-
-
-
-
-
-
-
-
- 6
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
-
-
-
-
-
-
-
-
-
- 10
-
-
-
- Completed throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sync
-
-
-
-
-
-
-
-
- async
-
-
-
-
-
-
-
-
- native
-
-
-
-
-
-
-
-
- async-old
-
-
-
-
-
-
-
-
- unmerged
-
-
-
-
-
-
-
-
- owned-sync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- Writes per fsync
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
-
-
-
-
-
-
-
-
-
-
- 6
-
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
-
-
-
-
-
-
-
-
-
- 10
-
-
-
- Accepted / loop throughput (MiB/s)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- Writes per fsync
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
-
-
-
-
-
- 0.2
-
-
-
-
-
-
-
-
-
-
-
-
- 0.4
-
-
-
-
-
-
-
-
-
-
-
-
- 0.6
-
-
-
-
-
-
-
-
-
-
-
-
- 0.8
-
-
-
-
-
-
-
-
-
-
-
-
- 1.0
-
-
-
- VM paired throughput / sync
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sync: stream | N=5 independent environments/point
- 95% bootstrap; N<30 exploratory; split points withhold overall median/ranking; N5 cannot test splits
- 0 failed environments retained; dependent rounds aggregated
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/filesystem-service-20261005/lazy-vm.svg b/docs/overrides/assets/benchmarks/filesystem-service-20261005/lazy-vm.svg
deleted file mode 100644
index 66ba9bc7..00000000
--- a/docs/overrides/assets/benchmarks/filesystem-service-20261005/lazy-vm.svg
+++ /dev/null
@@ -1,534 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-05T18:43:12.801193
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 50
-
-
-
-
-
-
-
-
-
-
-
-
- 100
-
-
-
-
-
-
-
-
-
-
-
-
- 150
-
-
-
-
-
-
-
-
-
-
-
-
- 200
-
-
-
- P50 elapsed-time change (%) · negative is faster
-
-
-
-
-
-
-
-
-
-
-
-
-
- First traversal
-
-
-
-
-
-
-
-
-
- Immediate repeat traversal
-
-
-
-
-
-
-
-
-
- Open/read/close 2,048 files
-
-
-
-
-
-
-
-
-
- Immediate repeat open/read
-
-
-
-
-
-
-
-
-
- Read + SHA256 64 MiB
-
-
-
-
-
-
-
-
-
- Copy up 32 small files
-
-
-
-
-
-
-
-
-
- Whole job (includes 1.2 s wait)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- +10.7%
-
-
- +32.6%
-
-
- -3.4%
-
-
- +2.2%
-
-
- -2.2%
-
-
- +159.4%
-
-
- +2.3%
-
-
- Cold client cache
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 50
-
-
-
-
-
-
-
-
-
-
-
-
- 100
-
-
-
-
-
-
-
-
-
-
-
-
- 150
-
-
-
- P50 elapsed-time change (%) · negative is faster
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- +13.7%
-
-
- +28.9%
-
-
- -8.6%
-
-
- -6.0%
-
-
- -6.6%
-
-
- +151.7%
-
-
- +0.6%
-
-
- Warm client disk cache; new guest
-
-
-
- Lazy-image VM: host FUSE → direct shared backend
-
-
- 30 samples per cell · archived optimized v3 → new integrated version · version comparison, not per-change attribution
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/full-ubuntu-20261004/ubuntu-startup.svg b/docs/overrides/assets/benchmarks/full-ubuntu-20261004/ubuntu-startup.svg
deleted file mode 100644
index 40839c95..00000000
--- a/docs/overrides/assets/benchmarks/full-ubuntu-20261004/ubuntu-startup.svg
+++ /dev/null
@@ -1,2046 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-04T11:29:38.040367
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/assets/benchmarks/full-ubuntu-20261004/ubuntu-workflows.svg b/docs/overrides/assets/benchmarks/full-ubuntu-20261004/ubuntu-workflows.svg
deleted file mode 100644
index 5e8bce8a..00000000
--- a/docs/overrides/assets/benchmarks/full-ubuntu-20261004/ubuntu-workflows.svg
+++ /dev/null
@@ -1,2672 +0,0 @@
-
-
-
-
-
-
-
- 2026-10-04T11:29:38.231851
- image/svg+xml
-
-
- Matplotlib v3.11.2, https://matplotlib.org/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/overrides/home.html b/docs/overrides/home.html
index 5d7a6f83..9a15aa08 100644
--- a/docs/overrides/home.html
+++ b/docs/overrides/home.html
@@ -15,7 +15,7 @@ {% if zh %}让自主 Agent 的执行可以规模化{% else %}Scaling autonom
{% if zh %}今天:在本机放手运行 Claude Code、Codex 或任意命令,结束后审查改动和证据,只合入你要的部分。{% else %}Today: run Claude Code, Codex, or any command unattended on your machine, then review the changes and evidence and keep only what you want.{% endif %}
diff --git a/docs/src/en/benchmarks/agent-tasks.md b/docs/src/en/benchmarks/agent-tasks.md
index 3ae31ab3..efcb2aba 100644
--- a/docs/src/en/benchmarks/agent-tasks.md
+++ b/docs/src/en/benchmarks/agent-tasks.md
@@ -1,41 +1,28 @@
-# End-to-end Agent tasks: when should you choose pVisor?
+# How long does a real Agent task take?
-## Conclusions {#conclusions}
+## Motivation {#motivation}
-**Evaluate pVisor staged when you repeatedly create task views, retain sparse edits and review/apply them: fixed repair takes 0.64 s versus Docker's 0.81 s, but seven-tool completion takes 1.09 s versus Docker's 0.82 s. pVisor VM repair takes 3.25 s, behind Firecracker's 2.20 s and QEMU microvm's 1.40 s; budget the cost of an independent guest boundary.**
+Judge an execution mode by the complete task: environment preparation, model and tool interaction, verification, review and application, and cleanup. Evaluate staged when you repeatedly create task views, keep sparse edits and review them; keep an existing container or native sandbox when the workspace is small; validate CLI compatibility and complete tool cost before choosing a VM. For managed clouds, compare repository synchronization, deployment and operations needs instead.
-| Need | Selection implication |
-| --- | --- |
-| Large workspace, sparse edits, fresh task view each time | Staged has a complete machine-workflow advantage; also budget tool overhead |
-| Small workspace, existing container or native Agent sandbox | Keep existing Git/tool flows; do not replace everything for individual operation speed |
-| Independent guest kernel | Validate CLI compatibility and complete tool cost before choosing VM |
-| Remote API and managed elasticity | Evaluate clouds by repository synchronization, deployment and operations needs; matched performance and billing are unmeasured |
+Fixed repair takes 0.64 s staged versus Docker's 0.81 s, but seven-tool completion takes 1.09 s versus 0.82 s. pVisor VM repair takes 3.25 s, behind Firecracker's 2.20 s and QEMU microvm's 1.40 s, so budget the cost of an independent guest boundary.
-The numbers and conclusions on this page still belong to the original historical cohorts. The new framework has no matching rerun yet; see [measurement coverage](index.md#measurement-coverage).
+These numbers and conclusions remain the original historical cohorts; the new framework has no matching rerun. See [measurement coverage](index.md#measurement-coverage).
-## Motivation {#motivation}
-
-A task includes environment preparation, model/tool interaction, verification, review/application and cleanup. Startup alone misses tool and result-handling costs; tool speed alone misses repeated workspace creation. A fixed tool plan removes inference and public-network variability, while a separate complete review workflow measures how the same edits reach the original workspace.
-
## Experiment design {#interpretation}
-Linux x86_64, AMD Ryzen 7 9700X, Fedora 7.2.8-200.fc44.x86_64. Launched process trees and the private Docker daemon are pinned to CPUs 0,1. VMs use 2 vCPU, 128 MiB for the shell probe and 16 GiB for tools. Native/Docker memory is uncapped: this is a CPU-controlled task comparison, not a capacity comparison under identical memory limits. Host/staged use rootless_process.
+Measure time from launch through exit for a fixed tool plan as complete-task time. That time is what one Agent task costs; a shorter time delivers the same verified result sooner.
-All backends share offline tools and fixed inputs, with a new workspace per trial. Warm caches, three warmups and 60 measured samples per fixed-plan cell; 30 for environment checks and real CLIs; backends alternate in seeded randomized order. Preparation, builds, image import and fixture resets are outside timing; complete tasks include launch and exit. Docker Engine 29.7.2 uses a private rootless **overlay2** daemon, the classic image store and writable bind mounts. Firecracker 1.13.1 PCI runs without jailer; QEMU 10.2.2 uses q35/microvm and private ext4. pVisor VM uses virtio-fs and its own firmware. Kernels, storage and staging semantics differ: these are task costs for the stated configurations, not pure VMM or security rankings.
+All backends share offline tools and fixed inputs, with a new workspace per trial, under Linux x86_64 / Ryzen 7 9700X / Fedora 7.2.8 on CPUs 0–1. VMs use 2 vCPU, 128 MiB for the shell probe and 16 GiB for tools; native and Docker memory is uncapped, so this compares CPU-controlled task time rather than capacity. Warm caches, three warmups and 60 samples per fixed-plan cell (30 for environment checks and real CLIs), with seeded randomized order.
-The fixed plan inspects/searches the repository, fixes Python, runs Python/Rust/Node tests, installs 32 offline npm packages and generates a diff. Result ends at checked returned results; Completion includes exit. Tests and expected edits must pass. The tool plan does not measure model inference or establish compatibility of real Agent CLIs.
-
-These samples do not verify equal Node/npm compile-cache state across backends. A fresh workspace does not establish an empty tool cache. Complete-task differences include each configuration's cache behavior; they cannot all be attributed to staging or the VMM.
-
-Scenario analysis also reuses separately registered [filesystem](filesystem.md), [complete review workflow](supervision-cost.md), [startup](startup.md), [lazy-image](lazy-image-startup.md) and [isolation](isolation-tests.md) experiments. Review has thirty samples per cell and includes view creation, twenty edits, review, application of ten files and cleanup; Git/reflink do not supply the same isolation. Experiments remain separate: do not sum medians to estimate a real Agent task or reuse their differing budgets for one ranking.
+The fixed plan inspects and searches the repository, runs Python, Rust and Node tests, installs 32 offline npm packages and generates a diff. Result ends at checked returned results; Completion includes exit. Docker uses a private rootless overlay2 daemon, Firecracker PCI runs without jailer, QEMU uses q35/microvm, and pVisor VM uses virtio-fs: kernels, storage and staging differ, so these are task costs, not VMM or security rankings. The plan does not measure model inference or establish real-CLI compatibility, and a fresh workspace does not imply an equal tool cache.
## Data and analysis {#results}
-Measured on 2026-10-06: each fixed-plan backend has 60/60 valid samples and zero measured failures; environment/CLI counts and preflight failures are listed separately. Outputs, exit and execution records must pass validation; staging also requires unchanged host originals and complete retained changes. Every valid slow sample is kept, with no timing-based exclusions. Tables normally show P50; separated distributions show cluster medians and counts. P95 is descriptive only. Raw reports, binaries and input/source manifests stay in ignored `.data/`; complete local CSV/JSON retains workload, cohort and provenance associations.
+Measured on 2026-10-06: each fixed-plan backend has 60/60 valid samples and zero measured failures; environment/CLI counts and preflight failures are listed separately. Outputs, exit and execution records must pass validation; staging also requires unchanged host originals and complete retained changes. Every valid slow sample is kept, with no timing-based exclusions. Tables normally show P50; separated distributions show cluster medians and counts. Raw reports, binaries and input/source manifests stay in ignored `.data/`; complete local CSV/JSON retains workload, cohort and provenance associations.
### Fixed repair and tests {#reference-env}
@@ -91,7 +78,6 @@ The environment check runs Python, Node, Git, Cargo/Rustc and CLI version checks
| QEMU q35 | 0.88 | 2.07 | 6.93 |
| QEMU microvm | 0.80 | 2.05 | 6.86 |
-
Claude Code in pVisor VM exceeded the 90 s initialization deadline during preflight: zero valid samples, excluded from latency comparisons. Other Claude conditions and every Codex condition completed the controlled tool loop.
Staged minus Docker completion median: Claude Code −127.83 ms, paired-bootstrap 95% interval [−137.91, −116.72] ms; Codex −3864.45 ms, interval [−3948.16, −3804.45] ms. These differences include client initialization, tool calls and exit waiting; they do not identify a single filesystem cost.
@@ -104,4 +90,4 @@ Claude uses `--bare` with only Bash allowed; Codex uses `--ephemeral` and `dange
Complete CSV/JSON and raw records remain in their local cohorts or the documentation data archive.
-[Method](methodology.md) · [Reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[Comparison method](index.md#interpretation) · [Reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/en/benchmarks/cluster-scalability.md b/docs/src/en/benchmarks/cluster-scalability.md
deleted file mode 100644
index 85765c62..00000000
--- a/docs/src/en/benchmarks/cluster-scalability.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# Which conclusions survive retirement of the Cluster measurements?
-
-## Main conclusions {#conclusions}
-
-**The old throughput and history measurements remain evidence only for their frozen, retired Controller/Worker implementation. They do not establish current daemon throughput, density or recovery costs. Independent local capacity and VM-memory benchmarks retain their own evidence scope; no new measurement is reported here.**
-
-| Need | Selection implication |
-|---|---|
-| Interpret old Cluster results | Use only the historical workload, artifacts and budgets below |
-| Size local execution or parked states | Use [capacity](density.md) and [VM memory](vm-memory/index.md), not Worker curves |
-| Size the daemon or compare schedulers | Unmeasured; do not transfer old throughput or history figures |
-
-
-
-The numbers and conclusions on this page still belong to the original historical cohorts. The new framework has no matching rerun yet; see [measurement coverage](index.md#measurement-coverage).
-
-
-
-## Motivation {#motivation}
-
-Capacity decisions require evidence for the implementation actually deployed. Retiring Controller/Worker removes the subject of these experiments; renaming its measurements would conceal that boundary. Readiness, validated work and recoverable parked states answer different questions.
-
-## Experiment design {#interpretation}
-
-Historical experiment only: Linux/x86_64, single-host KVM, release binaries built from frozen Controller/Worker source. The runners and their dedicated tests, plotting and publication helpers are retired; there is no active reproduction command. Each batch has a fresh Controller and 1/2/4 one-slot Workers. The complete group shares a two-core quota, CPU 0/1 affinity, 2 GiB memory and zero swap. The Controller has a separate 0.25-core/256 MiB cap and each Worker a 0.5-core/512 MiB cap; services and descendants remain in the common parent cgroup. One Worker therefore cannot consume the whole two-core budget.
-
-Each batch submits the same 12 tasks. Each task creates a 64-file Git repository, verifies all 32 MiB of data eight times, edits four files and checks Git status and all contents. Successful output must belong to the expected Worker and match the workload; each retained completion record is independently checked against the summary. Time runs from submission through verification of all 12 results, excluding earlier Controller/Worker startup.
-
-Three warmups and 30 formal batches per condition; Worker counts are randomized within each round. All slow valid samples remain. OOM, missing results, incorrect output or mismatched controls invalidate throughput samples. Common tools/rootfs are prepared and warm; some shared caches may be charged outside the group. This excludes inference, multi-host networking and cross-host reconciliation, and does not establish real-Agent task rates.
-
-## Data and analysis {#results}
-
-### Completed-task throughput and physical memory {#execution}
-
-Historical Controller/Worker cohort, measured on 2026-10-06 local time. The following tables describe retired artifacts, not the daemon. N=30 complete batches per condition, 12 tasks per batch. The three conditions verify 1,080 formal tasks, with zero failures or OOM. P50 is the median. Peak memory is the complete parent cgroup's `memory.peak`, including descendants, in MiB.
-
-| Workers | Completed / attempted tasks | 12-task P50, s | Validated rate P50, tasks/s | Whole-group peak P50, MiB |
-|---:|---:|---:|---:|---:|
-| 1 | 360/360 | 28.28 | 0.424 | 221.3 |
-| 2 | 360/360 | 12.47 | 0.962 | 389.0 |
-| 4 | 360/360 | 6.93 | 1.731 | 710.6 |
-
-A single Worker is capped at 0.5 cores. Additional execution slots increase available execution resources until the shared two-core limit constrains the group. This explains reduced waiting for the retired implementation within this budget; it does not show a faster scheduler at identical effective CPU utilization.
-
-| Comparison (candidate − one Worker) | Median 12-task difference, s | Paired bootstrap 95% interval, s |
-|---|---:|---:|
-| Two Workers | −15.81 | [−15.93, −15.03] |
-| Four Workers | −21.35 | [−21.36, −20.97] |
-
-Intervals use 30 paired rounds and 5,000 resamples; both exclude zero. P95 values in the complete local statistics are descriptive only, with no P99 or production-tail guarantee.
-
-### Long-term retained history {#controller}
-
-Each size uses three fresh independent processes/cgroups, two cores, 16 GiB and zero swap; WAL storage is NVMe. There is one ready probe and otherwise cancelled records. A synthetic failed terminal receipt verifies fencing and replay without executing tools. Physical peak includes history creation, record-validation temporaries, WAL cache and warm restart; it is not stationary retained-state memory. Each process measures 30 query batches, but restart and memory have only three independent observations, not 90 pooled samples.
-
-N=3 independent processes per size; table values are P50, with observed minimum–maximum in parentheses, not confidence intervals.
-
-| Retained records | Whole-lifecycle peak, MiB | Warm-log replay, s | WAL, MiB |
-|---:|---:|---:|---:|
-| 1,000 | 24.9 (22.8–31.4) | 0.017 (0.017–0.018) | 1.96 |
-| 10,000 | 96.3 (96.2–96.7) | 0.143 (0.143–0.145) | 19.62 |
-| 100,000 | 827.9 (827.9–828.0) | 1.422 (1.410–1.435) | 196.21 |
-| 1,000,000 | 8142.4 (8127.4–8144.1) | 14.622 (14.411–14.710) | 1962.11 |
-
-The retired Controller's million-record cohort observed about 8 GiB lifecycle peak and about 14.62 s warm-log replay; neither is a current sizing recommendation. Recovery excludes Worker reconciliation and cold-disk reads. The medians across processes for typed in-memory count calls are about 107–110 ns, describing synthetic state-count calls rather than HTTP/CLI latency; details remain in the complete local statistics.
-
-### Comparison with existing schedulers {#limits}
-
-Matched workloads and common budgets for Kubernetes, Ray and cloud sandboxes are unmeasured, so no numeric ranking is provided. The archived measurements do not size the current daemon or justify replacing a general scheduler. Single-task Docker, Firecracker and QEMU measurements are in the [end-to-end tasks](agent-tasks.md).
-
-### Sources and reproduction {#run}
-
-The five CSVs remain unchanged in the local documentation data archive as historical evidence for retired Controller/Worker artifacts. There is no active Cluster measurement or publishing entry; the [runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md) records retirement, not a new reproduction command.
-
-[Comparison method](methodology.md) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
-
-Derived tables link one raw report to the per-task evidence audit digest. Complete CSV/JSON, raw reports, completion records, service logs, controls, source and binaries stay in local `.data/` or the documentation data archive. Implementation analysis is in the [Cluster technical analysis](../design/cluster-performance-analysis.md).
diff --git a/docs/src/en/benchmarks/compare-rl-infra.md b/docs/src/en/benchmarks/compare-rl-infra.md
index f2aca2bb..00bd63b8 100644
--- a/docs/src/en/benchmarks/compare-rl-infra.md
+++ b/docs/src/en/benchmarks/compare-rl-infra.md
@@ -1,28 +1,21 @@
-# Where can pVisor reduce reinforcement-learning rollout costs?
+# Where can pVisor cut rollout costs?
-## Main conclusions {#conclusions}
+## Motivation {#motivation}
-**For local tool-heavy attempts, stage offers lower measured repair cost and higher tested active capacity than pVisor VM; choose VM when an independent guest kernel is required. Prefix preparation and lazy image reads address other rollout costs, with no demonstrated improvement in training throughput, success rate or reward.**
+Judge a rollout executor by the whole attempt: environment creation, model and tool alternation, verification, reward assignment and retries. For local tool-heavy attempts, stage offers the lower measured repair cost and the higher tested active capacity, at the price of a host-process boundary; choose a VM when the attempt needs an independent guest kernel. Keep the existing task, model and training layers, and treat dedicated integrations as unvalidated.
-| Scenario | Selection implication |
-|---|---|
-| Many short repository attempts | Evaluate stage for retained edits and active capacity; its boundary is a host process |
-| Independent guest kernel per attempt | Budget VM tool cost and lower tested capacity, even with short startup waiting |
-| Historical context or uncached images | Evaluate prefix preparation or lazy reads within their measured scope |
-| Existing RL stack | Keep task, model and training layers; dedicated integrations remain unvalidated |
+On a shared two-core, 2 GiB budget, stage completes 160/160 tasks at concurrency 32, while the VM completes 138/160 at 32 and 80/80 at 16. Fixed repair takes 0.64 s staged against 3.25 s on the VM. Prefix preparation takes 6.07–6.59 ms per format, and a cold lazy shell reads 2.58 MB of content against 41.84 MB for a full OCI image; none of these has a measured effect on training throughput, success rate or reward.
-The numbers and conclusions on this page still belong to the original historical cohorts. The new framework has no matching rerun yet; see [measurement coverage](index.md#measurement-coverage).
+These numbers and conclusions remain the original historical cohorts; the new framework has no matching rerun. See [measurement coverage](index.md#measurement-coverage).
-## Motivation {#motivation}
-
-A rollout creates an environment, alternates model inference with tool calls, runs verification, assigns a reward and retains or rejects the sample. Failed attempts may need context preparation, environment restoration and another execution. Choosing an executor requires budgeting these stages separately and preserving the task's required boundary.
-
## Experiment design {#interpretation}
+Measure active task capacity, tool and repair cost, and prefix-preparation cost as the three stages of one rollout attempt. Capacity sets how many attempts run at once, the two costs set what each attempt consumes; more capacity and lower cost mean more attempts per unit of infrastructure.
+
This scenario analysis reuses registered local Linux/x86_64 experiments; it makes no new measurements. The owning topics define artifacts, validation and controls:
- [Active capacity](density.md): shared 2 CPU / 2 GiB / zero swap, five fresh batches per cell, barrier-released Python/Git tasks with 32 MiB private data; failures remain in capacity denominators.
@@ -66,4 +59,4 @@ Training throughput, useful-sample success, reward, retries and end-to-end resou
Complete CSV/JSON, artifact digests, controls and raw records for each topic remain in their local cohorts or the documentation data archive, retaining provenance and statistical scope.
-[Comparison method](methodology.md) · [Reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[Comparison method](index.md#interpretation) · [Reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/en/benchmarks/density.md b/docs/src/en/benchmarks/density.md
index 0d5e46e8..f8daaefa 100644
--- a/docs/src/en/benchmarks/density.md
+++ b/docs/src/en/benchmarks/density.md
@@ -1,32 +1,26 @@
# How many tool tasks fit in two cores and 2 GiB?
-## Main conclusions {#conclusions}
+## Motivation {#motivation}
-**Under a shared two-core, 2 GiB, zero-swap budget, stage and Podman complete all five rounds at 32 concurrent Python/Git tasks. pVisor VM completes all five at 16, but only three at 32. Idle stage probes reach 128 and Podman reaches 64; idle occupancy does not establish active-task capacity.**
+When multiple Agents run together, count completed work rather than created environments. Stage and Podman reach the same tested task capacity under a shared budget, so choose between them by isolation and review needs; a VM boundary per task needs more room, and idle capacity does not predict active-task capacity.
-| Need | Selection implication |
-|---|---|
-| Parallel edits and Git checks | Stage and Podman reach the same tested task capacity; choose by isolation and review needs |
-| Many idle environments | Stage reaches higher tested concurrency, using a host-process boundary |
-| A VM boundary per task | Reserve more resources; do not size active tasks from idle counts |
+Under a shared two-core, 2 GiB, zero-swap budget, stage and Podman complete all five rounds at 32 concurrent Python/Git tasks; pVisor VM completes all five at 16 but only three at 32. Idle probes reach 128 for stage and 64 for Podman.
-The numbers and conclusions on this page still belong to the original historical cohorts. The new framework has no matching rerun yet; see [measurement coverage](index.md#measurement-coverage).
+These numbers and conclusions remain the original historical cohorts; the new framework has no matching rerun. See [measurement coverage](index.md#measurement-coverage).
-## Motivation {#motivation}
-
-When multiple Agents execute together, completed work matters more than created environments. Capacity planning must include runtimes, helpers, page cache and VM backing; neither single-process RSS nor configured RAM can establish capacity.
-
## Experiment design {#interpretation}
+Count the tasks that pass every check within one fixed cgroup budget as valid completed tasks. That count is how much real work the system finishes; more of them under the same budget means higher effective capacity.
+
Compare native processes, pVisor stage, pVisor VM and Podman 5.8.7 on Linux/x86_64. Each batch has a fresh cgroup with a shared two-core quota, CPU 0/1 affinity, a 2 GiB memory limit and zero swap. The coordinator, payloads and helpers are inside the budget; Podman payload/conmon membership is checked. Each VM has 2 vCPU/256 MiB, still constrained by the common total budget.
Scan concurrency 1, 2, 4, 8, 16, 32, 64 and 128, with five fresh batches per cell and no warmups. Conditions are randomized within each round. All tasks wait at a stdin readiness barrier before release. Idle tasks use the same Python environment without private data or edits. Useful tasks touch and checksum all 32 MiB of private data, edit four files in a 64-file Git repository, run `git status` and verify all contents. Stage/VM preserve the original workspace and match results to independent Run records.
-The primary memory metric is whole-cgroup physical accounting, including charged page cache, kernel memory and private backing. Prepared shared tool/image caches may be charged to a parent cgroup, so this does not rank net whole-machine memory. Failed, unknown and OOM outcomes remain counted; only entirely verified, no-OOM batches enter memory/timing summaries. All slow valid samples remain. Five rounds do not establish long-term reliability or tail latency. This workload excludes inference, large builds and real Agent CLIs.
+Memory is counted as whole-cgroup physical accounting, including charged page cache, kernel memory and private backing. Prepared shared tool/image caches may be charged to a parent cgroup, so this does not rank net whole-machine memory. Failed, unknown and OOM outcomes remain counted; only entirely verified, no-OOM batches enter memory/timing summaries, and slow valid samples remain. Five rounds cover this workload only: they do not establish long-term reliability or tail latency, and exclude inference, large builds and real Agent CLIs.
## Data and analysis {#results}
@@ -74,10 +68,10 @@ Stage and Podman each complete 160/160 tasks at concurrency 32. Both encounter O
Stage passes five rounds at idle concurrency 128, but adding private data and Git work reduces its highest wholly successful tested level to 32. Plan the two workloads separately; discrete levels also do not establish an exact maximum.
-Compressed parked snapshots versus container pause have not completed validation. Snapshot file size or single-VM reclamation cannot establish capacity. Firecracker/QEMU density under this budget is unmeasured; their single-task latency is in the [end-to-end tasks](agent-tasks.md). Matching macOS capacity is unmeasured.
+Compressed parked snapshots versus container pause have not completed validation, and snapshot file size or single-VM reclamation does not establish capacity. Firecracker/QEMU density under this budget and matching macOS capacity are unmeasured; their single-task latency is in the [end-to-end tasks](agent-tasks.md).
### Sources and reproduction {#run}
-[Comparison method](methodology.md) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[Comparison method](index.md#interpretation) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
Complete CSV/JSON retains attempts, complete batches, failure reasons, unknowns, OOM, observed ranges and source digests for every condition. It remains with raw records in local cohorts or the documentation data archive; failed batches remain in capacity denominators.
diff --git a/docs/src/en/benchmarks/filesystem.md b/docs/src/en/benchmarks/filesystem.md
index 2cba95e8..5b00626b 100644
--- a/docs/src/en/benchmarks/filesystem.md
+++ b/docs/src/en/benchmarks/filesystem.md
@@ -1,39 +1,26 @@
-# How long do filesystem tasks take in each execution mode?
+# How long do file-heavy tasks take?
-## Main conclusions {#conclusions}
+## Motivation {#motivation}
-**On the measured inspection and build tasks, pVisor host approaches direct-execution levels; when VM isolation is needed, writeback shortens the wait for batch artifact writes.**
+An agent inspects repositories, searches, builds incrementally and publishes artifacts, so file reads and writes dominate these tasks. Choosing between host, staged, container and VM is a trade-off between isolation needs and waiting, and the decision needs complete task time rather than startup alone.
-- **Writeback benefits depend on task shape.** The extraction/publication task with batch artifact writes shortens clearly; the read- and metadata-heavy repository inspection takes nearly the same time under both VM configurations, with no observed benefit.
-- **Synchronized writes are the main extra cost.** With synchronization after every write, writeback is slower and the default VM configuration is preferable; dense small writes that allow buffered merging are clearly shorter with writeback.
-- **Large working sets hit a completion limit.** For sustained writes at a 640 MiB working set, both pVisor VM configurations in this cohort timed out; other sizes require separate measurement.
-
-Results come from a local exploratory cohort of three independent environments. Applicability conditions are in [experiment design](#interpretation); per-configuration numbers are in [data and analysis](#results).
-
-## Motivation: what to answer before choosing an execution mode {#motivation}
-
-An agent's repository inspection, search, incremental builds and artifact publication repeatedly read and write files. Choosing an execution mode for these tasks — host, staged, container or VM — is a trade-off between isolation needs and waiting. Selection requires three answers: how long startup takes, how long a task takes from execution to artifacts on disk, and whether tasks still finish as the working set grows or concurrency increases.
+On the measured tasks, pVisor host approaches direct execution, and guest writeback shortens batch artifact writes when VM isolation is required. Writeback helps only when writes can merge before synchronization: extraction and publication shorten clearly, while read- and metadata-heavy inspection shows no benefit, and synchronizing after every 4 KiB write makes writeback slower than the default VM. At a 640 MiB working set, both VM configurations timed out in this cohort.
## Experiment design {#interpretation}
-### What is compared? {#comparison-design}
+Measure the time to finish a complete task — repository inspection, incremental build or artifact publication — as complete-task time. That time is what a file-heavy task costs in the chosen mode; shorter time means more tasks finish in the same budget.
-On the same machine, compare direct execution (Native), pVisor host, staged file changes, default pVisor VM, pVisor VM with guest writeback, Docker, Firecracker, QEMU q35 and QEMU microvm. Every configuration uses the same inputs, programs and tools, measuring the cost of its complete storage path separately. Container images and VM disks are prepared beforehand.
+Nine configurations on one machine — native, pVisor host, staged, default VM, VM with guest writeback, Docker, Firecracker, QEMU q35 and QEMU microvm — use the same inputs, programs and tools. Images and VM disks are prepared beforehand.
-| Workloads | What is measured | Question answered |
+| Workloads | Coverage | Question answered |
| --- | --- | --- |
| 3 complete tasks | Repository inspection/search; edit, incrementally compile and run; offline extraction, artifact generation and synchronized publication | Do caching and writeback benefits reach real workflows? |
| 12 basic operations | File queries, directory traversal, repeated reads, writes of different sizes, small files, per-write synchronization, mixed reads/writes, creation and deletion | Which access patterns benefit, and which retain extra waiting? |
| 4 resource combinations | 128 or 640 MiB working sets, 1 or 4 concurrent writers; fixed 1 GiB written per round | Do tasks finish as working sets or concurrency grow, and how does throughput change? |
-### Measurement method {#measurement}
+Each workload/configuration uses three fresh environments in randomized order, three rounds each, on Linux x86_64 / Ryzen 7 9700X / Btrfs. The process tree shares two CPUs and 2 GiB with swap disabled; VMs use 2 vCPU / 512 MiB. Host caches stay warm, and the median is taken across three environments, not nine independent samples.
-- **Resources and cache:** Linux x86_64, Ryzen 7 9700X, Btrfs; experiment processes and private background services share a two-CPU, 2 GiB memory budget with swap disabled. VMs use 2 vCPU and 512 MiB memory. Host page caches are retained, and later rounds reuse environment state and validation-warmed pages. Containers and VMs have different cache and memory-limit scopes.
-- **Sampling:** Each workload/configuration uses three fresh environments in randomized mode order, with three consecutive rounds per environment. Sum the rounds first, then report the median and range across three independent environments. The nine rounds are not nine independent samples, and no overall score is calculated.
-- **Timing:** Ready runs only from executor launch to the common test program becoming ready, excluding tasks, exit and cleanup. Task completion includes actual work and final file/directory synchronization. Preparation, additional full validation and exit are recorded separately.
-- **Validation and failures:** Check round outputs, final file content, compiled artifacts and workspace isolation. Each environment has a 90-second limit. After the first failure in a configuration/case, remaining planned observations are marked unexecuted; failures are not zero-filled and valid slow samples are retained. There is no external-interference gate. Cells with fewer than three valid environments receive no median.
-
-These are exploratory measurements from three environments, applicable to local tasks with prepared environments. Initial image acquisition, cold disks, reliable tails, network proxying and larger-scale concurrency require separate measurements. Kernels, filesystems and cache boundaries differ, so results describe complete configurations. See [reproduction configurations](#configuration-details) for storage paths and switches.
+Task completion includes the work and final synchronization; Ready stops at test-program readiness and excludes tasks, exit and cleanup. Every environment has a 90-second limit; outputs, final contents and isolation are checked, and after a first failure the remaining planned observations are marked unexecuted. Initial image acquisition, cold disks, tail latency and larger concurrency need separate measurements.
## Data and analysis {#results}
@@ -153,14 +140,13 @@ Each round writes **1 GiB**, varying only the **128/640 MiB** working set and **
| QEMU q35 | 2.566 | 1.685 |
| QEMU microvm | 2.605 | 2.414 |
-At 128 MiB, the writeback VM sits in the same range as the container and reference-VM configurations, while the default VM's continuous synchronized writes cost clearly more; four writers share the fixed 1 GiB per round, so summed completion is correspondingly shorter. At a 640 MiB working set, both default and writeback-enabled pVisor VMs have two cells that do not finish within 90 seconds; all four cells lack complete N=3 results. Timeouts are neither zero throughput nor ordinary durations.
+At 128 MiB, the writeback VM sits in the same range as the container and reference-VM configurations, while the default VM's continuous synchronized writes cost clearly more. Four writers share the fixed 1 GiB per round, so summed completion is correspondingly shorter. At a 640 MiB working set, both default and writeback-enabled pVisor VMs have two cells that do not finish within 90 seconds; all four cells lack complete N=3 results. Timeouts are neither zero throughput nor ordinary durations.
Working-set/concurrency curves and failure details

-
Each round fixes logical writes at 1 GiB, four files and 4 KiB requests, varying only the 128/640 MiB working set and 1/4 workers. Throughput uses completed time; points represent independent environments. Missing points identify cells without complete N=3 results, not zero throughput. Working-set changes also affect retained data and final synchronization costs; four points cannot locate a capacity knee.
| Workload | Configuration | Attempted failures / subsequently not executed | Result |
@@ -253,4 +239,4 @@ The former seven-tool N=5 Ready/resident statistics and provenance, the historic
In the complete local statistics, write_ops/read_ops count explicit logical workload operations, not guest→host requests or all I/O inside child tools.
-2026-10-17, an independent user-configuration cohort. Complete CSV/JSON, raw records, frozen entry points and tool/firmware receipts remain locally in `benchmark.new/filesystem/.data/user-layered-references-v2-20261017/`. [Reproduction steps](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/filesystem/README.md#user-workloads). The separate [cache and asynchronous-write engineering analysis](../design/filesystem-io-performance-analysis.md) explains implementation switches and request counts; it does not fill gaps in the user comparison.
+2026-10-17, an independent user-configuration cohort. Complete CSV/JSON, raw records, frozen entry points and tool/firmware receipts remain locally in `benchmark.new/filesystem/.data/user-layered-references-v2-20261017/`. [Reproduction steps](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/filesystem/README.md#user-workloads). The separate [cache and asynchronous-write engineering analysis](../lab-notes/filesystem-io-performance-analysis.md) explains implementation switches and request counts; it does not fill gaps in the user comparison.
diff --git a/docs/src/en/benchmarks/index.md b/docs/src/en/benchmarks/index.md
index d41e95c3..5d1c058f 100644
--- a/docs/src/en/benchmarks/index.md
+++ b/docs/src/en/benchmarks/index.md
@@ -1,56 +1,69 @@
-# Which workloads fit pVisor, and at what cost?
+# Which workloads fit pVisor?
-## Conclusions {#conclusions}
+## Motivation {#motivation}
-**For frequently created large workspaces with sparse changes, pVisor stage completes the machine workflow sooner: changing twenty of 10,000 files and retaining ten takes 141 ms in stage, 248 ms with Git worktree and 343 ms with btrfs reflink. Native workflows are faster for small workspaces; budget VM tool waiting from each configuration’s independent measurements.**
+Choose a mode by the total cost of producing the same result. Use stage for large workspaces with sparse changes, native workflows for small workspaces or tool-only execution, and a VM only from complete-task measurements. Match evidence to the decision: task comparisons for local execution, startup plus tool data for an independent guest kernel, and success rates with resource accounting for capacity.
-| Scenario | Selection implication |
-|---|---|
-| Large workspace, sparse changes, disposable view | Stage has a measured complete-workflow advantage |
-| Small workspace or tool execution alone | Compare native workflows and container costs |
-| VM or concurrent capacity | Require complete tool and resource measurements |
+Changing twenty of 10,000 files and retaining ten takes 141 ms in stage, 248 ms with Git worktree and 343 ms with btrfs reflink; native workflows are faster on small workspaces. Startup, tool execution, application and resource occupancy answer different questions and cannot substitute for one another.
-Filesystem measurements cover nine configurations and 19 layered workloads, with three independent environments per cell and three resident rounds, without an interference gate. Of 505 executed environments, 501 pass and 4 resource cells time out; 8 subsequent observations are explicitly skipped. Historical N5/N30 and single-pass tasks remain separate; other topics retain their own cohorts.
+Filesystem covers nine configurations and 19 layered workloads, with three independent environments per cell and three resident rounds; its [coverage note](filesystem.md) records executed, passed, failed and skipped environments. Historical N5/N30 and single-pass tasks remain separate, and other topics keep their own cohorts.
-## Motivation {#motivation}
+## Experiment design {#interpretation}
-Selection requires the total cost of producing the same result, beyond startup or a single command. Review/application, execution boundaries and resource use determine which Agent workflows suit pVisor.
+Measure the startup, tool execution, apply and resource occupancy that produce one accepted result as the cost of that result. That cost decides which execution mode fits a workload; lower cost for the same verified result means the workload runs more cheaply.
-## Experiment design {#interpretation}
+The numbers come from separately registered experiments. Startup and repair use 60 samples per backend with three warmups; filesystem covers nine configurations and 19 workloads with three fresh environments per cell and three rounds each; review uses 30 samples and three warmups; network uses 30 independent batches with 256-request medians; capacity uses five rounds per concurrency under a shared two-core, 2 GiB, zero-swap budget. All runs share the host and CPUs 0–1, with cache states defined by each topic and randomized interleaving.
-This reuses separately registered [startup](startup.md), [filesystem](filesystem.md), [repair](agent-tasks.md) and [complete review workflow](supervision-cost.md) experiments. Startup and repair use 60 samples per backend with three warmups; current filesystem measurements cover nine configurations and 19 workloads, with N3 fresh environments per cell and three resident rounds, without separate warmups; historical N5/N30 remains separate; review uses thirty samples and three warmups per size/condition/backend. Same host and CPUs 0,1, with cache states defined by each topic and randomized interleaving. Valid timings pass correctness checks; failures and skipped observations remain explicit, with no speed-based exclusions. Workloads, resources and timing boundaries differ across topics; distributions are not pooled. Docker uses rootless overlay2; workflow controls are native Git/reflink, not container or VM security rankings.
+Valid timings pass correctness checks; failures and skipped observations stay explicit, with no speed-based exclusions. Cohorts are not pooled. P95 is descriptive and omitted below 30 samples, public P99 is omitted, and separated clusters are reported with counts and per-cluster medians.
-[Network](network.md) uses thirty independent batches and three warmups per condition; each small-request sample is the median of 256 requests. The origin is outside the payload CPU budget and memory is not identically capped. [Capacity](density.md) uses a shared two-core, 2 GiB, zero-swap budget, five rounds per concurrency and separate idle/useful-tool conditions; every failure, unknown outcome and OOM remains counted.
+### Isolation and resources {#reference-resources}
-[Lazy images](lazy-image-startup.md) covers file loading through the same host staged executor and separate Docker/lazy VM shell and NumPy startup cohorts. For the matched four-file stage probe, pVisor has shorter cold- and warm-client median waits than OverlayBD; the historical VM comparisons favor lazy for cold clients and Docker for warm clients. Both studies use prepared local services and separate content, metadata and total-response accounting. Their cache states, execution boundaries and budgets remain distinct rather than forming a single ranking.
+Docker uses rootless overlay2, Firecracker and QEMU use private ext4, and pVisor VM uses virtio-fs with different kernels: these are complete-configuration costs, not a pure VMM or security ranking. Engineering A/B work stays in lab notes, and complete data remains in local cohorts.
## Data and analysis {#results}
-The 2026-10-06 startup/filesystem/repair cohorts have 1,440 valid samples and review has 360; the separate 2026-10-07 stock-kernel startup cohort has 240 valid samples. All have zero measured failures. The selected-source filesystem comparison on 2026-10-12 adds 240 valid samples and zero failures, with task-local caches and a common parent resource budget. Cohorts are not pooled; topic pages provide median differences and paired-bootstrap 95% intervals.
-
-The separate layered filesystem cohort executes 505 environments: 501 pass, 4 resource cells time out, and 8 subsequent observations are explicitly skipped. Complete tasks and resource boundaries are reported separately.
+The 2026-10-06 startup/filesystem/repair cohorts have 1,440 valid samples and review has 360; the separate 2026-10-07 stock-kernel startup cohort has 240 valid samples. All have zero measured failures. The full startup retest after the reboot on 2026-10-11 is the current cohort (numbers in [Startup](startup.md)); historical randomized-pair cohorts do not carry over. The selected-source filesystem comparison on 2026-10-12 adds 240 valid samples and zero failures, with task-local caches and a common parent resource budget. Topic pages provide median differences and paired-bootstrap 95% intervals.
| Question | Measured level (timing is P50) |
|---|---|
-| [Startup](startup.md) | Stock controls: VM 100.91 ms; Firecracker 285.04 ms; QEMU microvm 321.56 ms; q35 702.98 ms |
+| [Startup](startup.md) | 2026-10-11 retest: VM 130.71 ms; Firecracker MMIO 287.13 ms; QEMU microvm 260.10 ms; QEMU 663.25 ms |
| [Repair completion](agent-tasks.md) | staged 0.64 s; Docker 0.81 s; VM 3.25 s; QEMU microvm 1.40 s |
| [Layered filesystem tasks](filesystem.md#complete-task) | N=3, three publication rounds: VM 11.271 s; VM + writeback 5.928 s; Docker 2.053 s; Firecracker 4.305 s; QEMU q35/microvm 4.065/3.851 s |
| [Review workflow](supervision-cost.md) | 10,000 files: stage 141 ms; Git 248 ms; reflink 343 ms |
| [Network](network.md) | Eight-thread small requests: native 0.69 ms; host proxy 10.09 ms; VM 2.10 ms |
| [Active capacity](density.md) | 2 GiB: stage/Podman pass all five rounds at 32; VM at 16 |
+Network has 510 valid batches. Capacity retains all 320 batches, including 57 failures. These experiments remain separate and do not form one capacity or speed ranking. Daemon throughput, density and history costs are unmeasured.
+
+Net physical-memory savings and useful-task density from compression, trimmed-kernel benefits, full Ubuntu and macOS comparisons are not yet validated on current artifacts; no advantage is claimed for them. Cloud services, gVisor/Kata and complete RL throughput have no matched ranking. Apply, network, isolation and replay require their own evidence and cannot be inferred from these short tasks.
-Network has 510 valid batches. Capacity retains all 320 batches, including 57 failures. These experiments remain separate and do not form one capacity or speed ranking. Retired Controller/Worker results are [historical evidence](cluster-scalability.md), excluded from current comparisons and daemon sizing; daemon throughput, density and history costs are unmeasured.
+[End-to-end tasks](agent-tasks.md) combines tool waiting, workspace lifecycle and CLI compatibility to analyze Agent sandbox, container, VM and cloud tradeoffs. [Reinforcement learning](compare-rl-infra.md) maps tool costs, active capacity and historical-prefix preparation to rollouts; full training throughput and reward are unmeasured.
-Net physical-memory savings and useful-task density from compression, trimmed-kernel benefits, full Ubuntu and macOS comparisons have not completed validation with current artifacts; no advantage is claimed for them. Cloud services, gVisor/Kata and complete RL throughput have no matched ranking. Apply, network, isolation and replay require their own evidence and cannot be inferred from these short tasks.
+### Prepared environments {#reference-env}
-[Network](network.md) · [Apply](supervision-cost.md#apply-cost) · [Density](density.md) · [VM memory](vm-memory/index.md) · [Isolation](isolation-tests.md) · [Replay](replay-fidelity.md)
+Startup, filesystem and task cohorts share one prepared tool environment, and every table pins its artifacts by digest. A table describes that pinned release, not a current third-party release.
-[End-to-end tasks](agent-tasks.md) combines tool waiting, workspace lifecycle and CLI compatibility to analyze Agent sandbox, container, VM and cloud tradeoffs. [Reinforcement learning](compare-rl-infra.md) maps tool costs, active capacity and historical-prefix preparation to rollouts; full training throughput and reward are unmeasured.
+### Complete distributions {#full-ubuntu}
+
+Ubuntu uses its distribution kernel, initrd, systemd and private disks; pVisor reuses prepared tool directories. The comparison answers deployment waiting, rather than isolating VMM cost.
+
+### QEMU complete distributions {#full-ubuntu-qemu}
+
+q35 and microvm use one Ubuntu template. Their samples and percentiles remain separate from other cohorts.
+
+### Tasks and resources {#product-v1}
+
+Apply, network, isolation and replay use their own task sets and cohorts; none of them inherits the numbers in the table above.
+
+### Engineering experiments and data retention {#evidence-format}
+
+Engineering A/B, instrumented profiles and diagnostic probes remain in [technical analysis](../lab-notes/filesystem-performance-analysis.md), outside cross-product main tables.
+
+Markdown retains user-facing tables, with shared CSV downloads only for necessary user statistics. Static tables already in articles, per-round/per-environment records, historical tables and engineering intermediate tables do not receive additional exports by default. Complete CSV/JSON, raw reports, individual samples, logs, artifact manifests and frozen harnesses remain in their local cohorts or the `benchmark.new/.data/docs-assets-prune-20261018/` documentation data archive, outside the published site. Dynamic JSON is limited to display tables needed by the build; public engineering figures use SVG. See the [runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md) for reproduction and retention rules.
### Measurement coverage of the new framework {#measurement-coverage}
@@ -58,7 +71,7 @@ This table separates new measurements from historical evidence. Data is updated
{{ table("measurement-coverage.render.json", {"markdown":true}) }}
-Filesystem coverage refers to the nine-mode, 19-workload N3 protocol, with four incomplete resource cells; historical N5/N30 does not fill its gaps.
+Filesystem coverage refers to the nine-mode, 19-workload N3 protocol, with four incomplete resource cells; historical N5/N30 data does not fill those gaps.
### Sources and reproduction {#run}
@@ -66,4 +79,4 @@ Filesystem coverage refers to the nine-mode, 19-workload N3 protocol, with four
Complete CSV/JSON and raw records for other topics remain in their local cohorts or the documentation data archive.
-[Method](methodology.md) · [Reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[Reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/en/benchmarks/isolation-tests.md b/docs/src/en/benchmarks/isolation-tests.md
index 31c2c84c..6409c0a3 100644
--- a/docs/src/en/benchmarks/isolation-tests.md
+++ b/docs/src/en/benchmarks/isolation-tests.md
@@ -1,27 +1,21 @@
-# Which execution modes block host access outside the workspace?
+# Do executors block writes outside the workspace?
-## Main conclusions {#conclusions}
+## Motivation {#motivation}
-**In the tested Linux configurations, pVisor staged, safe and VM allow inside-view operations, block the listed outside host accesses and retain workspace writes in stage across 3/3 checks each. pVisor OCI and Podman also block outside access, but their authorized writable workspace mounts modify host files directly. Host allows the listed host accesses.**
+Choose an execution mode by both the accessible paths and where writes land. A successful command alone cannot distinguish a staged write from a host modification, and the boundary also determines which performance comparisons share the same semantics.
-| Need | Selection implication |
-|---|---|
-| Review execution results and merge selected workspace changes | Choose a validated staged, safe or VM configuration |
-| Use an OCI writable workspace mount | Writes reach the host directly; provide review and rollback separately |
-| Allow access to host paths | Tested host keeps host paths visible and is not a workspace file sandbox |
+In the tested Linux configurations, pVisor staged, safe and VM allowed inside-view operations, blocked the listed outside host accesses and kept workspace writes in stage, 3/3 checks each. pVisor OCI and Podman also blocked outside access, but their authorized writable workspace mounts modify host files directly. Host allowed the listed host accesses.
-The numbers and conclusions on this page still belong to the original historical cohorts. The new framework has no matching rerun yet; see [measurement coverage](index.md#measurement-coverage).
+These numbers and conclusions remain the original historical cohorts; the new framework has no matching rerun. See [measurement coverage](index.md#measurement-coverage).
-## Motivation {#motivation}
-
-Choosing an execution mode requires knowing both the accessible paths and where writes land. A successful command alone cannot distinguish a staged write from a host modification. The boundary also determines which performance controls offer comparable semantics.
-
## Experiment design {#interpretation}
+Check each execution mode against a fixture with known paths — what is allowed, what is denied, where writes land — as the isolation boundary it actually enforces. The tighter that boundary, the fewer host paths stay reachable or modifiable.
+
Seven configurations each run three fresh fixtures. A fixed seed shuffles configurations in each repetition, giving 21 attempts. Native and host provide host-accessible controls. Podman uses private overlay storage and a writable workspace mount; pVisor OCI uses crun and an explicit writable mount. VM and OCI use the same prepared Python/Git rootfs.
Each fixture must read the inside-view file, write and read back a workspace file, and use an internal Unix socketpair. Outside probes cover absolute paths, symlinks, `/proc/self/root`, parent traversal, absolute and symlink writes, a host Unix socket connection and an absolute lower-workspace alias write. Validation checks actual output, final host bytes, staged content and the Bundle's execution boundary rather than syscall status alone.
@@ -54,4 +48,4 @@ Mount grants, rootfs and configuration determine the boundary; other configurati
Complete CSV/JSON and raw records remain in their local cohorts or the documentation data archive.
-[Comparison method](methodology.md) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[Comparison method](index.md#interpretation) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/en/benchmarks/lazy-image-startup.md b/docs/src/en/benchmarks/lazy-image-startup.md
index 10ecd868..c6d44fb7 100644
--- a/docs/src/en/benchmarks/lazy-image-startup.md
+++ b/docs/src/en/benchmarks/lazy-image-startup.md
@@ -1,47 +1,22 @@
-# How much waiting can lazy images save for startup and file loading?
+# How much startup time do lazy images save?
-## Main conclusions {#conclusions}
+## Motivation {#motivation}
-**pVisor reads image files on demand, reducing environment preparation time for short tasks.**
+Agents create disposable environments constantly, and short tasks often read only a small part of an image, yet a complete pull must finish before they start. pVisor reads image files on demand, so a task can start before the download completes and later runs reuse cached content.
-- **Download on demand.** Tasks can start before the complete image is downloaded. Cold clients fetched less data in the shell and NumPy experiments.
-- **Reach results sooner.** Both short-task experiments showed shorter median waits from launch to checked output with cold client caches.
-- **Reuse downloaded files.** Warm clients use cached content. The experiments required no repeat downloads of file content.
-
-These results come from local experiments with prepared image services. Cache hits still leave mounting and executor startup costs; with the complete image cached, the Docker container had shorter startup waits in the application-startup experiments.
-
-## Motivation: how long does environment preparation take for short tasks? {#motivation}
-
-Agents frequently create disposable environments, and short tasks often read only a small part of an image — yet a complete pull must finish before they can start. Before adopting on-demand loading, two questions need answers: on first use, how much less data is downloaded and how much waiting is saved; and once content is cached locally, what startup overhead reuse still carries.
+A cold shell client reaches Ready in 186.1 ms while reading 2.58 MB of content, against 41.84 MB for a full Docker OCI image. In the matched four-file probe, pVisor's cold and warm client waits are shorter than OverlayBD's. With the complete image cached, Docker still starts faster in the application-startup experiment, because cache hits leave mounting and executor startup in place.
## Experiment design {#interpretation}
-### What is compared? {#evidence}
-
-Two experiments measure short-task startup and few-file reads separately. Startup uses Docker's complete pull as the reference; file reads use the same execution environment, with [TurboOCI][ref-turbooci] / [OverlayBD][ref-overlaybd] as the reference.
-
-### File-read comparison {#stage-file-design}
-
-On the same Linux machine, the same program reads and verifies four files from the same Ubuntu 26.04 image, comparing pVisor with OverlayBD. Both use the same execution environment, changing only image loading; each trial remounts the image and creates a working directory. This represents tasks that access few files, without running programs inside the image.
-
-The task uses two fixed CPUs and image services use two other CPUs; service memory is not constrained to an equal total limit.
-
-### Short-task startup comparison {#vm-design}
-
-Run an Ubuntu shell and a Python script performing NumPy array calculations, covering a lightweight command and a short task that loads dependencies. Each task fixes the same image, command and output checks across paths: Docker pulls the complete image, while pVisor reads on demand and runs in a VM. Every trial creates a new container or VM; the two workloads are analyzed separately.
-
-Both tasks use two CPUs. Docker has a 2 GiB memory limit, pVisor has 2 GiB guest RAM, and image services use two other CPUs. Container and VM limits cover different resource scopes, and background services are not covered by an equal whole-system limit; results describe each complete usage path.
+Measure the time from launch to the first checked output and the bytes a cold client fetches as cold-start cost. That cost is what a new environment pays before its first result; lower values start tasks sooner and move less data.
-### Measurement method {#measurement}
+Two experiments run on Linux with prepared local image services. The file-read comparison reads and verifies four files from one Ubuntu 26.04 image, comparing pVisor with OverlayBD in the same execution environment, changing only image loading. The startup comparison runs an Ubuntu shell and a NumPy script through Docker with a complete pull and through pVisor with on-demand reads in a VM; each trial creates a new container or VM.
-- **Cache and network:** Image services are prepared beforehand and accessed through local connections, retaining host page caches. Cold clients start with empty image caches; warm clients reuse previously fetched content. Both create a new execution environment.
-- **Sampling:** 3 warmup rounds precede 30 paired rounds with randomized path order; each path has a cold trial followed by a warm trial. Preflight and warmup trials are excluded, and all valid slow samples are retained. Predefined background interference invalidates the entire file-read cohort.
-- **Timing:** The primary metric, Ready, runs from launch to checked output, excluding exit and cleanup. Supplementary Completion runs through normal process exit and output-stream closure; the file-read comparison also includes unmount cleanup. Fetching, mounting and execution are timed; service preparation and cache reset are excluded. Response bytes are counted through Completion.
-- **Validation:** Check file content or calculation results, execution records, actual mounts and resource cleanup. Cold clients must fetch content, and warm clients must not fetch it again. An execution, validation or cleanup failure invalidates the cohort; failures are never counted as zero time.
+Both use two CPUs for the task and two for image services. Docker has a 2 GiB memory limit, pVisor has 2 GiB guest RAM, and the scopes differ. Cold clients start with empty image caches; warm clients reuse fetched content. Three warmup rounds precede 30 paired rounds with randomized path order; Ready is primary and Completion extends through normal exit. Cold clients must fetch content and warm clients must not. Execution, validation or cleanup failures invalidate the cohort.
-Results apply to local short tasks with prepared services. Initial service preparation, public networks, large-scale concurrency and bulk file I/O require separate measurements; file-read results also cannot substitute for application startup inside an image. See [downloads and sources](#run) for full environments, cache reset procedures and reproduction steps.
+Results apply to local short tasks with prepared services. Initial service preparation, public networks, large-scale concurrency and bulk file I/O require separate measurements, and file-read results do not substitute for application startup inside an image.
-## Experimental data and analysis {#results}
+## Data and analysis {#results}
A lazy image fetches files as they are accessed, so environment preparation advances with the task.
@@ -61,7 +36,7 @@ Cold clients fetch files on demand, with smaller response payloads and shorter m
#### Ubuntu shell client startup waiting {#startup}
-Measured 2026-10-10; n=30 per cell, 120 formal samples, zero formal failures or speed exclusions. Units ms. Unsplit distributions report P50; separated distributions report cluster medians and sample proportions. P95 is reference-only; cluster causes are undetermined.
+Measured 2026-10-10; n=30 per cell, 120 formal samples, zero formal failures or speed exclusions. Units ms. Unsplit distributions report P50; separated distributions report cluster medians and sample proportions. Cluster causes are undetermined.
| Path / cache | Ready: P50 or cluster medians (proportions) | Ready P95 | Completion: P50 or cluster medians (proportions) | Completion P95 |
|---|---:|---:|---:|---:|
diff --git a/docs/src/en/benchmarks/measurement-coverage.render.json b/docs/src/en/benchmarks/measurement-coverage.render.json
index 8a58b9ce..ae71cc8c 100644
--- a/docs/src/en/benchmarks/measurement-coverage.render.json
+++ b/docs/src/en/benchmarks/measurement-coverage.render.json
@@ -3,10 +3,6 @@
"Data status": "Historical data",
"Measured scope": "Original metrics and sources retained; no matching new measurements"
},
- "[cluster-scalability](cluster-scalability.md)": {
- "Data status": "Historical data",
- "Measured scope": "Original metrics and sources retained; no matching new measurements"
- },
"[compare-rl-infra](compare-rl-infra.md)": {
"Data status": "Historical data",
"Measured scope": "Original metrics and sources retained; no matching new measurements"
@@ -31,10 +27,6 @@
"Data status": "Partially rerun",
"Measured scope": "Same host staged executor, four-file lazy loading; N30 cold/warm including fetch and mount; VM application startup retains separate historical data"
},
- "[methodology](methodology.md)": {
- "Data status": "Historical data",
- "Measured scope": "Original metrics and sources retained; no matching new measurements"
- },
"[network](network.md)": {
"Data status": "Historical data",
"Measured scope": "Original metrics and sources retained; no matching new measurements"
@@ -45,7 +37,7 @@
},
"[startup](startup.md)": {
"Data status": "Partially rerun",
- "Measured scope": "Same-launch Ready / Exit; whole-command time is separate"
+ "Measured scope": "Launch to first checked output; exit time is not reported"
},
"[supervision-cost](supervision-cost.md)": {
"Data status": "Historical data",
diff --git a/docs/src/en/benchmarks/methodology.md b/docs/src/en/benchmarks/methodology.md
deleted file mode 100644
index fcc712aa..00000000
--- a/docs/src/en/benchmarks/methodology.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# Which benchmark results support an adoption decision?
-
-## Main conclusions {#conclusions}
-
-**Choose execution modes using measured workloads with matching budgets and timing boundaries; use different configurations to understand their individual performance levels.** Startup, tool execution, application and resource occupancy answer different questions.
-
-| Decision | Required evidence |
-|---|---|
-| Choose local tool execution | Native, Docker and pVisor host/staged/VM task comparisons |
-| Choose an independent guest kernel | Firecracker, QEMU and pVisor startup plus tool data |
-| Set capacity or timeouts | Success rates, complete-task waiting and matching resource accounting |
-
-
-
-The numbers and conclusions on this page still belong to the original historical cohorts. The new framework has no matching rerun yet; see [measurement coverage](index.md#measurement-coverage).
-
-
-
-## Motivation {#motivation}
-
-Faster startup does not guarantee faster compilation. Writable mounts and staged review also provide different workflows. Adoption decisions require speed, execution boundaries and how changes reach the original directory.
-
-## Experiment design {#interpretation}
-
-### Same-host controls
-
-B-STARTUP, B-FS-TOOLS and B-AGENT-TASK use one offline tool environment and fixed inputs across native, pVisor host/staged/VM, private rootless Docker, Firecracker PCI and QEMU q35/microvm. Images, tools and daemon are prepared beforehand. Every execution uses the same two-core affinity; tool VMs have matching configured memory. Each job gets a fresh workspace, with seeded randomized runtime order. Complete Ubuntu, macOS and distinct binaries remain separate cohorts.
-
-Downloads, benchmark compilation, image import and input copying are excluded. Timing separates first valid output, internal tools plus validation, returned results and launch-to-process-exit. Successful samples require validated outputs, observed executor and complete staging. Staged modes also verify that original host files remain unchanged.
-
-### JSON tables and hyperfine {#json-tables}
-
-Tables load resolved named-row JSON before Markdown rendering. Rendering reads data and executes no benchmark. Direct-command startup and replay cohorts use hyperfine statistics; their input preparation and Python hooks are outside timing. Conditions run independently, without the randomized paired-order claim used by historical campaigns. Historical distributions, correctness counts, capacity and physical-memory readings keep their original measurement scope. Reproduction and remaining workload prerequisites are listed in the [JSON benchmark manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/README.md).
-
-### Distributions and failures
-
-Cohorts are not pooled, and slow samples are not removed after measurement. Failures and invalid outputs are counted separately and never treated as zero latency. Capacity guards are not completed jobs. P95 is descriptive: it is omitted below 30 samples. Public P99 is omitted; small cohorts do not support stable tail-latency claims.
-
-Separated clusters are reported with counts and individual medians. The descriptive split rule is in the [runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md); it establishes no cause. Engineering A/B percentage claims need a 95% bootstrap interval for the median difference; user pages do not narrate optimization work.
-
-### Isolation and resources {#reference-resources}
-
-Docker writable bind mounts write directly to the host; pVisor staging retains changes until apply. Firecracker/QEMU use private ext4, while pVisor VM uses virtio-fs with different kernels and devices. This is not a pure VMM or production-security ranking. Standalone staging boundaries follow actual records and [isolation checks](isolation-tests.md).
-
-RSS sums sampled process scopes and may double-count shared pages or miss short peaks. Docker must include actual container processes and identify its dedicated daemon. Whole-group memory must include all descendants, backing and charged cache, without double-counting overlapping cgroups. Configured RAM, RSS, macOS RAM proxies and net physical memory are distinct metrics.
-
-## Data and analysis {#results}
-
-### Prepared environments {#reference-env}
-
-[Startup](startup.md) · [Files and tools](filesystem.md) · [Repair tasks and CLIs](agent-tasks.md). Tables retain cohort identities and counts, with pinned artifacts rather than claims about current third-party releases.
-
-### Complete distributions {#full-ubuntu}
-
-Ubuntu uses its distribution kernel, initrd, systemd and private disks; pVisor reuses prepared tool directories. The comparison answers deployment waiting, rather than isolating VMM cost.
-
-### QEMU complete distributions {#full-ubuntu-qemu}
-
-q35 and microvm use one Ubuntu template. Their samples and percentiles remain separate from other cohorts.
-
-### Tasks and resources {#product-v1}
-
-[Application](supervision-cost.md#apply-cost) · [Network](network.md) · [Concurrency](density.md) · [Isolation](isolation-tests.md) · [Replay](replay-fidelity.md) · [Review](supervision-cost.md). Unmeasured industry alternatives are marked explicitly, without marketing numbers filling gaps.
-
-### Filesystem engineering experiments {#filesystem-service}
-
-Engineering A/B, instrumented profiles and diagnostic probes remain in [technical analysis](../design/filesystem-performance-analysis.md), outside cross-product main tables.
-
-### Data location and retention {#evidence-format}
-
-Markdown retains user-facing tables, with shared CSV downloads only for necessary user statistics. Static tables already in articles, per-round/per-environment records, historical tables and engineering intermediate tables do not receive additional exports by default. Complete CSV/JSON, raw reports, individual samples, logs, artifact manifests and frozen harnesses remain in their local cohorts or the `benchmark.new/.data/docs-assets-prune-20261018/` documentation data archive, outside the published site. Dynamic JSON is limited to display tables needed by the build; public engineering figures use SVG.
-
-See the [runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md) for reproduction and retention rules.
-
-### Sources and reproduction {#run}
-
-[Comparison method](methodology.md) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/en/benchmarks/network.md b/docs/src/en/benchmarks/network.md
index 886c836a..d1ca514b 100644
--- a/docs/src/en/benchmarks/network.md
+++ b/docs/src/en/benchmarks/network.md
@@ -1,32 +1,26 @@
-# What does network policy add compared with ordinary OCI?
+# How much latency does network control add?
-## Main conclusions {#conclusions}
+## Motivation {#motivation}
-**For eight-thread local HTTP small requests, native, pVisor host proxy and VM median request times are about 0.69, 10.09 and 2.10 ms. A 32 MiB VM transfer takes about 193.62 ms. Host-proxy small-request cost warrants attention; local measurements do not establish public model-response latency.**
+Agents request models, download dependencies and consume streams, and each workload reacts differently to proxy overhead. Separate request latency, first byte, full transmission and startup to see where waiting comes from. Budget host-proxy latency for frequent local small requests, and transmission separately from startup for downloads inside a VM.
-| Need | Selection implication |
-|---|---|
-| Frequent local small requests | Host proxy adds noticeable waiting; check your request rate |
-| Dependency downloads inside a VM | Budget transmission separately from environment startup |
-| Blocking direct TCP connections | Host/VM deny-all positive and negative controls are tested; latency is not isolation evidence |
+Eight-thread local HTTP small requests take 0.69 ms natively, 10.09 ms through the pVisor host proxy and 2.10 ms in a VM; a 32 MiB VM transfer takes about 193.62 ms. Local measurements do not establish public model-response latency, and blocking direct TCP connections is an isolation result rather than a latency figure.
-The numbers and conclusions on this page still belong to the original historical cohorts. The new framework has no matching rerun yet; see [measurement coverage](index.md#measurement-coverage).
+These numbers and conclusions remain the original historical cohorts; the new framework has no matching rerun. See [measurement coverage](index.md#measurement-coverage).
-## Motivation {#motivation}
-
-Agents request models, download dependencies and consume streams. These workloads respond differently to proxy overhead. Separate request latency, first byte, full transmission and startup to understand the waiting involved.
-
## Experiment design {#interpretation}
+Measure per-request time for small requests, and time to first byte plus full transfer for bulk transfers, as request latency. That latency is what an Agent pays on every call; lower latency fits more model turns or downloads into the same time.
+
Linux/x86_64, one local HTTP origin on the same host, without Internet, TLS or DNS. Compare native, pVisor host proxy, VM auto TCP, Podman host network and pVisor OCI proxy. Every payload uses two fixed CPUs (host 0/1, two VM vCPU); memory is not identically capped and the HTTP origin sits outside the payload budget. This is not a resource-density ranking.
Small requests use 256 fresh TCP connections per batch, eight threads and 1 KiB responses. Take the median within each batch, then summarize 30 independent batches; 7,680 correlated requests are not independent samples. Bulk sends 32 MiB per batch in 1 KiB writes. Stream sends ten 13-byte events, 2 ms apart. First byte means the first HTTP body byte, not model TTFT. Transfer time includes connection and reading, excluding later digest validation; worker total time includes validation.
-Three warmups and 30 formal batches per condition; 17 conditions are randomized within each round. Full content length/SHA-256, CPU affinity, retained command output and Run boundaries must pass. Host/VM deny-all independently test direct-socket rejection and Bundle enforcement evidence. Failed batches cannot contribute latency; all slow valid samples remain without retrospective exclusions. P95 is descriptive only, with no P99.
+Three warmups and 30 formal batches per condition; 17 conditions are randomized within each round. Full content length/SHA-256, CPU affinity, retained command output and Run boundaries must pass. Host/VM deny-all independently test direct-socket rejection and Bundle enforcement evidence. Failed batches cannot contribute latency; all slow valid samples remain without retrospective exclusions.
## Data and analysis {#results}
@@ -66,6 +60,6 @@ Podman host network supplies an ordinary OCI control. pVisor OCI additionally us
### Sources and reproduction {#run}
-[Comparison method](methodology.md) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[Comparison method](index.md#interpretation) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
Complete CSV/JSON, raw reports, response timings, command logs, input/build receipts and per-invocation output audits remain in their local cohorts or the documentation data archive.
diff --git a/docs/src/en/benchmarks/replay-fidelity.md b/docs/src/en/benchmarks/replay-fidelity.md
index 52fd76ee..f8de38ff 100644
--- a/docs/src/en/benchmarks/replay-fidelity.md
+++ b/docs/src/en/benchmarks/replay-fidelity.md
@@ -1,27 +1,15 @@
-# Can recorded trajectories prepare a faithful execution starting point?
-
-## Main conclusions {#conclusions}
-
-**In the new framework, each of seven adapters passes 60/60 checks for fixed task 0, with whole prepare-only CLI medians of 5.56–5.74 ms. No tools execute and workspaces remain unchanged. Historical clusters across twenty trajectories use a different input cohort and retain their original scope; consistency of real model continuation remains unmeasured.**
-
-| Need | Selection implication |
-|---|---|
-| Prepare historical tool context across Agents | Use the validated pinned-format adapters |
-| Restore actual file state | Restore the task environment separately; prefix preparation does not replay file changes |
-| Compare native resume or RL pipeline speed | No matched-trajectory timing control is available for a ranking |
-
-
-
-New experiments and historical data are published separately. Each table retains its timing scope and inputs from the design and provenance; distinct cohorts are not pooled.
-
-
+# Can a recorded trajectory start a new run?
## Motivation {#motivation}
-Training and reproduction need tasks to continue at an accurate historical boundary. Missing tool observations or including a future action changes the model's context; executing tools during preparation may introduce additional side effects. These properties determine whether recorded trajectories provide reliable task inputs.
+Training and reproduction need a task to continue from an accurate historical boundary. Missing tool observations or including a future action changes the model's context, and executing tools during preparation may add side effects. Use the validated pinned-format adapters to prepare context, restore file state separately, and do not rank native resume or RL pipeline speed from these numbers.
+
+Each of seven adapters passes 60/60 checks for fixed task 0, with whole prepare-only CLI medians of 5.56–5.74 ms; no tools run and workspaces stay unchanged. Historical clusters across twenty trajectories use a different input cohort and keep their original scope, and consistency of real model continuation remains unmeasured.
## Experiment design {#interpretation}
+Check whether each adapter reconstructs the recorded boundary exactly — digests, arguments, observations, no tool execution — as replay fidelity. Fidelity decides whether a recorded trajectory can serve as a real task input; higher fidelity carries more of the original context into the new run.
+
Each adapter receives twenty synthetic native-format trajectories, each with two tool batches, using `after-step=1` and `prepare-only`. Three repetitions shuffle adapter/task order with a fixed seed, giving 420 attempts. The table pins format profiles separately from installed Agent CLI versions.
Valid samples must preserve the source digest, exact command arguments and historical observations for the complete first batch, exclude the second action, report `replayed_tool_calls=0` with no Agent started, and retain both the pre-existing workspace file's contents and the file inventory. An independent publication audit rechecks every retained command, native prefix and workspace. Failures are counted separately rather than assigned zero latency.
@@ -32,7 +20,7 @@ Native Agent resume and RL pipeline prefix preparation are relevant alternatives
## Data and analysis {#results}
-Measured on 2026-10-06. N=60 per adapter, all passing; units are ms. Separated clusters have their own shares and medians. P95 describes the entire adapter distribution as an observation reference, with no stable tail-latency claim.
+Measured on 2026-10-06. N=60 per adapter, all passing; units are ms. Separated clusters have their own shares and medians.
| Adapter | Pinned format profile | Passed / planned (failed) | Lower cluster: share; median ms | Higher cluster: share; median ms | Reference P95 ms |
|---|---|---:|---|---|---:|
@@ -62,4 +50,4 @@ These results support structure, argument and observation fidelity for pinned sh
Complete CSV/JSON and raw records remain in their local cohorts or the documentation data archive.
-[Comparison method](methodology.md) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[Comparison method](index.md#interpretation) · [Runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/en/benchmarks/startup-timing.exit.render.json b/docs/src/en/benchmarks/startup-timing.exit.render.json
deleted file mode 100644
index 1462d62e..00000000
--- a/docs/src/en/benchmarks/startup-timing.exit.render.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "Native": {
- "N": 60,
- "Exit median ms": "0.52",
- "Exit mean ms": "0.57",
- "Exit SD ms": "0.21",
- "Exit min ms": "0.50",
- "Exit max ms": "1.72"
- },
- "pVisor host": {
- "N": 60,
- "Exit median ms": "123.63",
- "Exit mean ms": "138.94",
- "Exit SD ms": "27.73",
- "Exit min ms": "112.02",
- "Exit max ms": "215.84"
- },
- "pVisor staged": {
- "N": 60,
- "Exit median ms": "146.35",
- "Exit mean ms": "148.10",
- "Exit SD ms": "17.21",
- "Exit min ms": "133.55",
- "Exit max ms": "275.00"
- },
- "pVisor VM": {
- "N": 60,
- "Exit median ms": "243.53",
- "Exit mean ms": "248.75",
- "Exit SD ms": "17.71",
- "Exit min ms": "218.45",
- "Exit max ms": "288.92"
- },
- "Docker": {
- "N": 60,
- "Exit median ms": "129.31",
- "Exit mean ms": "130.37",
- "Exit SD ms": "7.66",
- "Exit min ms": "114.19",
- "Exit max ms": "152.93"
- },
- "Firecracker": {
- "N": 60,
- "Exit median ms": "722.06",
- "Exit mean ms": "722.77",
- "Exit SD ms": "6.03",
- "Exit min ms": "711.09",
- "Exit max ms": "741.23"
- },
- "QEMU": {
- "N": 60,
- "Exit median ms": "691.72",
- "Exit mean ms": "695.44",
- "Exit SD ms": "28.63",
- "Exit min ms": "656.02",
- "Exit max ms": "766.89"
- },
- "QEMU microvm": {
- "N": 60,
- "Exit median ms": "281.33",
- "Exit mean ms": "282.00",
- "Exit SD ms": "11.50",
- "Exit min ms": "261.02",
- "Exit max ms": "315.55"
- }
-}
diff --git a/docs/src/en/benchmarks/startup.md b/docs/src/en/benchmarks/startup.md
index c1dfb006..8f0e5f4a 100644
--- a/docs/src/en/benchmarks/startup.md
+++ b/docs/src/en/benchmarks/startup.md
@@ -1,171 +1,39 @@
# How long does a usable environment take to start?
-## Conclusions {#conclusions}
-
-**In the independent-condition retest after the reboot on 2026-10-11, median Ready times are 33.52 ms for pVisor host, 50.59 ms for staged, 130.71 ms for VM, 105.03 ms for Docker, 287.13 ms for Firecracker MMIO, 663.25 ms for QEMU and 260.10 ms for microvm. Ready and normal Exit share sixty launches per condition. Use these tables for the measured artifacts; historical randomized-pair rankings and intervals do not carry over to the new cohorts.**
-
-The selection summary below retains the scope of its historical cohorts.
-
-| Need | Selection implication |
-| --- | --- |
-| Frequent short commands | Host and staged startup waits are in the tens of milliseconds |
-| Frequently created disposable VMs | pVisor VM waits about 0.1 seconds for the first command |
-| Complete Agent tool tasks | Use tool and repair results to choose an execution mode |
-
-
-
-New experiments and historical data are published separately. Each table retains its timing scope and inputs from the design and provenance; distinct cohorts are not pooled.
-
-
-
## Motivation {#motivation}
-Disposable environments repeatedly pay for the first command. Choosing host, staged, containers or VMs requires knowing their startup waits and the cost of the isolation you need. Short tasks also pay for exit and tools.
+Agent workloads arrive in bursts of short-lived calls: a task finishes and its environment is discarded, then the next task builds a new one. Each call pays the startup wait again, so the cost accumulates with call volume. Startup latency decides how soon the first command runs and how often a developer is willing to create an isolated environment for one task.
+
+pVisor's VM work brings startup close to a container: median Ready 130.71 ms against Docker rootless at 105.03 ms, and below the reference VMs (Firecracker MMIO 287.13 ms, QEMU microvm 260.10 ms, QEMU q35 663.25 ms). Host and staged runs are faster still, at 33.52 ms and 50.59 ms.
## Experiment design {#interpretation}
-The historical Ready / Exit comparison uses Linux x86_64 / KVM, AMD Ryzen 7 9700X, Fedora host. The controls are native, pVisor host, pVisor staged, pVisor VM, rootless Docker / overlay2, Firecracker PCI, QEMU q35 and QEMU microvm. Launch trees are pinned to CPUs 0,1; every VM has 2 vCPU / 128 MiB. Processes and containers have no memory limit.
+Measure the interval from launch to the first checked shell output as environment Ready time. That interval is how quickly the system answers a caller: a shorter Ready time means the system handles bursts of large-scale requests better.
-Firecracker, QEMU and microvm use the full Fedora distribution kernel, Linux 7.2.8-200.fc44.x86_64. pVisor's virtualization is based on libkrun and uses its companion libkrunfw project's customized kernel, Linux 6.12.109.
+The comparison runs on Linux x86_64 / KVM, AMD Ryzen 7 9700X, Fedora host. The controls are native, pVisor host, pVisor staged, pVisor VM, rootless Docker / overlay2, Firecracker with virtio-MMIO, QEMU q35 and QEMU microvm. Launch trees are pinned to CPUs 0,1; every VM has 2 vCPU / 128 MiB. Processes and containers have no memory limit.
-Prepared userspace environments run the same `/bin/sh` output probe. Each execution uses a fresh environment and private workspace; every VM boots afresh, without snapshots or environment pools. Warm page caches, three warmups and sixty measured samples per backend, with randomized interleaving within each measurement group. Environment preparation and input copying are outside startup timing. Kernel, device and storage paths differ, so results cover each complete startup configuration. This probe does not cover full distribution boot, cold images, Agent CLI initialization, concurrent capacity or snapshot restoration.
+Firecracker, QEMU and QEMU microvm use the full Fedora distribution kernel, Linux 7.2.8-200.fc44.x86_64. pVisor's virtualization is based on libkrun and uses its companion libkrunfw project's customized kernel, Linux 6.12.109.
-Historical Ready ends at the checked first shell marker. Exit includes execution and teardown, requiring correct output and a normal zero exit. Firecracker is stopped under control after checking markers and results and confirming no panic; only Ready is reported. Failures, panic, mismatched output or changed artifacts are excluded from timing distributions; valid slow samples are retained.
+Prepared userspace environments run the same `/bin/sh` output probe. Each execution uses a fresh environment and private workspace; every VM boots afresh, without snapshots or environment pools. Warm page caches, three warmups and sixty measured samples per backend, with randomized interleaving within each measurement group. Environment preparation and input copying are outside startup timing. Kernel, device and storage paths differ, so results cover each complete startup configuration. The probe does not cover full distribution boot, cold images, Agent CLI initialization, concurrent capacity or snapshot restoration.
-The historical hyperfine measurements used the independent JSON templates available at the time, executed by semspec bench, with three warmups and sixty samples. They measure the complete command through normal exit, not first-output Ready; input preparation and correctness checks are outside timing. Conditions sample independently, without pooling batches or deriving paired improvement percentages. Those batches validate the observed executor in each Run Bundle: host and staged use `rootless_process` on this machine, and VM uses `vm`; artifact digests and batch provenance are recorded separately.
+Ready ends at the checked first shell marker. Firecracker is stopped under control after checking markers and results and confirming no panic. Failures, panic, mismatched output or changed artifacts are excluded from timing distributions; valid slow samples are retained.
## Data and analysis {#results}
-### Python: Ready / Exit from the same launch {#python-ready-exit}
-
-Each process launch records its start, receipt of the complete `REFERENCE_READY` line and
-normal exit. Three warmups and sixty formal samples are fixed; both tables below project
-columns from one command's output, without repeated sampling. Inputs are a prepared rootfs,
-2 vCPU / 128 MiB, warm caches and CPU 0,1 affinity. Python `perf_counter_ns` excludes
-interpreter startup and input preparation. Ready includes process creation, pipe reading and
-observer scheduling; Exit uses the same start through observed normal exit. Output, Run Bundle
-and unchanged inputs must pass for every sample.
-New Firecracker uses the stock kernel, the same initrd and virtio-MMIO. Two PCI preflights failed to exit normally after successful guest markers and were rejected. Historical Firecracker PCI Ready and new MMIO use different configurations; subtracting them does not establish an improvement.
+### Environment Ready time {#ready}
-#### Ready
+Eight conditions measured on 2026-10-11, N=60 formal samples after three warmups. Inputs are the prepared rootfs, 2 vCPU / 128 MiB for VMs, warm caches and CPU 0,1 affinity. Python `perf_counter_ns` starts immediately before process creation and stops on receipt of the complete `REFERENCE_READY` line: process creation, pipe reading and observer scheduling are included, interpreter startup and input preparation are not. Output, Run Bundle and unchanged-input checks must pass for every sample.
{{ table("startup-timing.ready.render.json") }}
-#### Exit
-
-{{ table("startup-timing.exit.render.json") }}
-
-The [paired-sample statistics CSV](../../../overrides/assets/benchmarks/data/startup/startup-timing.csv) and [provenance JSON](../assets/benchmarks/startup-timing.provenance.json)
-identify each condition’s latest successful independent batch. Standard deviation uses the formal samples and sample formula. These are
-Python event-clock data, independent of the hyperfine completion experiment. Historical results
-from different artifacts are not pooled. Rerun the entire table with `just benchmark startup/timing`,
-or just VM with `just benchmark startup/timing "pvisor vm"`.
-The earlier VM-only cohort remains separate in local evidence.
-
-All eight conditions were remeasured after the reboot on 2026-10-11. The
-complete before/after CSV/JSON remains local, retaining full-precision statistics
-and provenance digests for both independent cohorts. The measured pVisor binary SHA-256 is
-`d3f09687cca60b617629c215fa1359c441ab6ac19f8c63b68f1dcdf7614e6b30`, unchanged across the reboot;
-userspace inputs, measured commands, timing and statistics functions are also unchanged.
-Failure handling and provenance fields were added to the harness outside timing.
-VM median Ready fell from 179.22 ms to 130.71 ms (a descriptive change of -27.07%), and
-Exit from 297.79 ms to 243.53 ms. Host median Ready fell from 37.45 ms to 33.52 ms, but
-its standard deviation rose from 1.38 ms to 29.70 ms, with the final seventeen formal
-samples noticeably slower. All valid slow samples are retained. These independently sampled,
-warm-cache cohorts do not establish a causal reboot effect on their own. The historical VM
-Ready of about 101 ms used different binary and firmware artifacts; attributing the remaining
-gap requires controls with fixed artifacts.
-
-### Startup and exit times {#reference-startup}
-
-
-
-
-Historical controls: unit ms, N=60 per backend, zero measured failures. Process/container and VM measurements were collected separately, with each row retaining its own statistics; all four VM controls were randomly interleaved within one group. P95 describes the distribution rather than guaranteeing stable tail latency.
-
-| Runtime | Valid / failed | Ready P50 ms | Ready P95 ms | Exit P50 ms | Exit P95 ms |
-| --- | --- | --- | --- | --- | --- |
-| Native | 60 / 0 | 1.28 | 1.71 | 1.35 | 1.82 |
-| pVisor host | 60 / 0 | 12.72 | 14.18 | 24.03 | 24.71 |
-| pVisor staged | 60 / 0 | 25.13 | 26.85 | 33.84 | 44.55 |
-| pVisor VM | 60 / 0 | 100.91 | 151.27 | 141.52 | 176.59 |
-| Docker | 60 / 0 | 74.48 | 87.13 | 98.29 | 110.22 |
-| Firecracker | 60 / 0 | 285.04 | 291.88 | — | — |
-| QEMU | 60 / 0 | 702.98 | 789.36 | 725.55 | 818.85 |
-| microvm | 60 / 0 | 321.56 | 404.39 | 347.99 | 428.27 |
-
-Host and staged wait tens of milliseconds, making them suitable for frequently launched short commands. VMs also initialize a kernel and devices; choose isolation with complete-task timing in mind. Blank Firecracker Exit cells mean normal shutdown is unmeasured.
-
-| VM control | Wait saved by pVisor ms | 95% interval for difference ms | Wait reduction | Control time / pVisor time |
-| --- | --- | --- | --- | --- |
-| Firecracker | 184.12 | 181.60–185.84 | 64.6% | 2.82× |
-| QEMU | 602.06 | 582.17–635.99 | 85.6% | 6.97× |
-| microvm | 220.64 | 195.91–251.74 | 68.6% | 3.19× |
-
-Differences are differences between the two medians, with 95% intervals from 5,000 bootstrap resamples of matching rounds. All three intervals exclude zero, supporting faster pVisor VM startup for these configurations. Dedicated firmware and simplified initialization provide a shorter startup path; this comparison cannot separately quantify kernel, filesystem and VMM contributions.
-
-For cold-image client waiting and content downloads, see the separate [on-demand image startup](lazy-image-startup.md) experiment. Image-service preparation is recorded separately, and its samples are not pooled with these prepared-environment results.
-
-
+pVisor VM starts at a median 130.71 ms, between rootless Docker at 105.03 ms and the reference VMs at 260–663 ms. Host and staged skip the kernel and device path and stop at 33.52 ms and 50.59 ms.
-### Historical Python: Ready-only data {#python-ready}
+The table selects the latest validated row for each `condition` from the [statistics CSV](../../../overrides/assets/benchmarks/data/startup/startup-timing.csv); `condition` and `batch` together identify a result. Standard deviation uses the formal samples and the sample formula. Rerun the table with `just benchmark startup/timing`, or only the VM with `just benchmark startup/timing "pvisor vm"`.
-This experiment uses a prepared rootfs, 2 vCPU / 128 MiB, warm caches and CPU 0,1 affinity.
-Three warmups and sixty formal samples are fixed in the script. Python `perf_counter_ns`
-starts immediately before Popen and stops on receipt of the complete `REFERENCE_READY` line.
-Process creation, pipe reading and observer scheduling are included; interpreter startup,
-input preparation, subsequent exit and cleanup are excluded. Correct output, normal zero exit
-and a valid Run Bundle remain required after the clock stops.
-
-| | N | Ready median ms | Ready mean ms | Ready SD ms | Ready min ms | Ready max ms |
-| --- | --- | --- | --- | --- | --- | --- |
-| pVisor VM | 60 | 132.95 | 132.51 | 5.09 | 123.00 | 147.53 |
-
-The complete Ready statistics CSV and provenance JSON remain local,
-retaining the latest successful batch for this condition. Standard deviation uses formal samples
-and the sample formula. These are Python clock measurements, separate from hyperfine completion.
-Historical Ready used a different binary artifact; timing boundaries alone cannot explain the difference.
-The current Ready / Exit experiment uses `just benchmark startup/timing "pvisor vm"`; this section retains the older Ready-only cohort.
-
-### Historical Hyperfine: direct launch to normal exit {#hyperfine-startup}
-
-Each row uses that condition's latest successful independent batch, without pooling samples. Three warmups and sixty measured samples; median, mean and standard deviation come from the same raw hyperfine export, in ms. Python preparation and checks, semspec processing and external CPU affinity setup are outside timing.
-
-| | N | Median ms | Mean ms | SD ms |
-| --- | --- | --- | --- | --- |
-| Native | 60 | 0.42 | 0.42 | 0.02 |
-| pVisor host | 60 | 208.79 | 217.94 | 34.13 |
-| pVisor staged | 60 | 153.85 | 154.58 | 5.88 |
-| pVisor VM | 60 | 278.83 | 305.77 | 63.45 |
-| Docker | 60 | 163.92 | 168.87 | 21.38 |
-| Firecracker | — | — | — | — |
-| QEMU | 60 | 722.08 | 711.24 | 26.75 |
-| QEMU microvm | 60 | 339.47 | 355.08 | 86.50 |
-
-Empty conditions have no validated new batch. This measures the command through normal exit, not first-output Ready. Rows show independent levels, without paired improvement percentages or confidence intervals. Commands, extrema and per-row provenance remain in the complete local CSV/JSON.
-
-
-Historical complete commands (including wrappers)
-
-| | N | Median ms | Mean ms | SD ms |
-| --- | --- | --- | --- | --- |
-| Native | 60 | 2.13 | 2.17 | 0.23 |
-| pVisor host | 60 | 165.12 | 315.84 | 259.74 |
-| pVisor staged | — | — | — | — |
-| pVisor VM | — | — | — | — |
-| Docker | 60 | 167.27 | 381.08 | 509.32 |
-| Firecracker | — | — | — | — |
-| QEMU | 60 | 748.41 | 896.73 | 319.03 |
-| QEMU microvm | 60 | 353.76 | 451.13 | 219.93 |
-
-The local historical CSV includes an outer shell, taskset and timeout. Its original scope is preserved. These are different batches and scopes; subtracting them cannot estimate wrapper cost or establish product performance improvements.
-
-
-
-
+For cold-image client waiting and content downloads, see the separate [on-demand image startup](lazy-image-startup.md) experiment. Image-service preparation is recorded separately, and its samples are not pooled with these prepared-environment results.
### Sources and reproduction {#run}
-Complete CSV/JSON for startup statistics, VM differences and 95% intervals, source and artifact provenance, and raw records remain in their local cohorts or the documentation data archive. See the [startup manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/startup/README.md) to reproduce the current Ready / Exit experiment.
+Complete statistics, source and artifact provenance, and raw records remain in their local cohorts or the documentation data archive. See the [startup manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/startup/README.md) to reproduce the experiment, and the [provenance JSON](../assets/benchmarks/startup-timing.provenance.json) for the measured artifacts.
-[Method](methodology.md) · [Historical reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md#explicit-firecracker-kernel-controls)
+[Comparison method](index.md#interpretation)
diff --git a/docs/src/en/benchmarks/supervision-cost.md b/docs/src/en/benchmarks/supervision-cost.md
index c0edb1f4..6d1fd27a 100644
--- a/docs/src/en/benchmarks/supervision-cost.md
+++ b/docs/src/en/benchmarks/supervision-cost.md
@@ -1,60 +1,30 @@
-# How much time do review, application and disposal take?
+# How long does review and apply take?
-## Main conclusions {#conclusions}
-
-**Creating a fresh task workspace, changing 20 of 10,000 files and retaining ten takes 141 ms at complete machine-workflow P50 with pVisor stage, 248 ms with Git worktree and 343 ms with a btrfs reflink copy. Stage suits sparse changes in large workspaces; Git costs less in small workspaces. A separate experiment on a prepared twenty-file view measures review/application/disposal at P50 of 27.71 ms for stage and 4.69 ms for Git.**
+## Motivation {#motivation}
-Applying prepared changes alone takes pVisor apply P50 of **17 ms, 0.93 s and 14.26 s** for 10, 1,000 and 10,000 small text files, all higher than Git patches. At 100,000 files, two clusters have medians of **109.73 s and 196.87 s**. The complete workflow applies only ten files; its 141 ms cannot estimate the cost of applying all 10,000 files.
+An Agent task needs a private workspace, diff review, selective application and disposal as well as tool execution, and per-operation timings miss these costs. Compare the whole workflow that produces the same result, and keep machine time separate from human reading and decisions.
-| User scenario | Selection implication |
-|---|---|
-| Large workspace, sparse changes, disposable task view | Stage reduces whole-tree creation, scanning and disposal costs |
-| Small workspace or a prepared, reused Git worktree | Git is faster for small workspaces and review of a prepared twenty-file view; long-term reuse is unmeasured |
-| Estimate human supervision cost | Machine timings exclude human reading and decisions |
+Creating a fresh workspace, changing 20 of 10,000 files and retaining ten takes 141 ms with pVisor stage, 248 ms with Git worktree and 343 ms with btrfs reflink. Applying prepared changes alone takes 17 ms, 0.93 s and 14.26 s for 10, 1,000 and 10,000 small files, all above Git patches; at 100,000 files two clusters center at 109.73 s and 196.87 s. The complete workflow applies only ten files, so its 141 ms cannot estimate a full 10,000-file apply. On a prepared twenty-file view, review, application and disposal take 27.71 ms for stage and 4.69 ms for Git.
-The numbers and conclusions on this page still belong to the original historical cohorts. The new framework has no matching rerun yet; see [measurement coverage](index.md#measurement-coverage).
+These numbers and conclusions remain the original historical cohorts; the new framework has no matching rerun. See [measurement coverage](index.md#measurement-coverage).
-## Motivation {#motivation}
-
-An Agent task needs a private workspace, diff review, selective application and disposal as well as tool execution. Individual filesystem timings omit these costs. If you frequently create task workspaces, compare the entire workflow that produces the same result.
-
-Also estimate review cost with an already prepared view, and waiting and recovery costs as the number of applied files grows. Three independent experiments answer these questions without pooling samples.
-
## Experiment design {#interpretation}
-### Complete task workflow: B-WORKFLOW
-
-The controls are pVisor rootless stage, a detached Git worktree and a btrfs reflink copy. Inputs are identical prepared, committed and packed Git repositories containing either 100 or 10,000 files of 4 KiB each. Each task changes twenty files, produces their complete content diffs, applies the first ten and discards the rest. Git and reflink workflows extract a patch for the selected paths with `git diff`, run `git apply --check`, then apply it.
-
-Timing covers task-view creation, executing edits, content review, selective application and disposal, summed across machine steps. Stage's view creation is included in run. Preparing input repositories, resetting every control to an identical starting point and harness correctness checks are excluded. Prepared, long-lived worktree reuse is unmeasured.
+Measure the machine time of the complete workflow — create the view, review, apply selected paths, discard the rest — as complete-workflow time. That time is the overhead between an Agent finishing and a change landing; shorter time means more changes are reviewed per hour.
-Linux/x86_64, AMD Ryzen 7 9700X, Fedora kernel 7.2.8-200.fc44.x86_64, btrfs; the entire execution tree is pinned to host CPUs 0,1. Each backend, size and application condition has thirty independent samples and three warmups, randomized and interleaved with a fixed seed and warm caches. Git automatic maintenance is disabled; reflink is required and cannot fall back to a regular copy. Local provenance identifies frozen artifacts and source digests.
+Three backends — pVisor stage, a detached Git worktree and a btrfs reflink copy — run identical prepared repositories of 100 or 10,000 files. Each task changes twenty files, applies the first ten and discards the rest. Timing covers view creation, edits, content review, selective application and disposal; input preparation and resets are excluded. Each cell has thirty samples and three warmups, randomized with a fixed seed, warm caches, on CPUs 0–1.
-Normal application and a host conflict are separate conditions. Every sample must pass complete file inventory and content checks: execution leaves the original unchanged; normal application changes only the ten selected files. The conflict case changes one selected host file before application and requires refusing the entire application while preserving all host content. Stage also requires Run Bundle evidence of staging and rootless isolation. Failures are retained and counted, never timed as zero; no samples are excluded for their speed. Two sizes × two conditions × three backends produce 360 measured samples, with zero failures.
-
-This fixed file-editing task excludes inference, compilation and human reading. Git/reflink execute native processes with different isolation. Conflict checks do not cover races between Git's check and write, or compare crash recovery and durability guarantees. These results do not rank containers, VMs or security.
-
-### Prepared-view review: B-SUPERVISION
-
-A separate experiment measures only review of a prepared view: twenty small text files already contain identical edits; review every original/edited content, apply the first ten and discard the other ten. Stage timing includes `status --review --diff`, selective `apply` and `drop`. Git timing includes complete diff review, selected patch extraction, `git apply --check`, application and worktree removal. View creation, task execution, fixtures and validation are excluded. Git 2.55.0 is identified by executable digest before sampling; the frozen stage artifact has separate provenance. Each group has thirty samples and three warmups, CPUs 0 and 1, warm caches and no benchmark-specific host memory cap. All sixty formal samples pass content, selection and execution-boundary checks, with final workspaces retained for independent audit and no speed-based exclusions. Prepared-view review is summarized separately and is not added to the complete-workflow table.
-
-### Application scale and recovery: B-APPLY
-
-The host is an AMD Ryzen 7 9700X running Linux 7.2.8-200.fc44 x86_64. Measured processes are pinned to CPUs 0 and 1, with no benchmark-specific host memory cap. Caches are warm and the page cache is not actively cleared. The workload updates small text files in one directory; staged changes and Git patches are generated before timing. Workspace preparation and subsequent verification are outside timing.
-
-At 10, 1,000, 10,000 and 100,000 files, measure pVisor apply, Git apply, native copying, drop and rejection of a conflict introduced before application. Each condition has three warmups and 30 samples, totaling 600 formal timings; a fixed seed randomizes size and operation order within each round. Successful samples must pass complete target-content checks and applicable application-ledger checks. Failures are retained separately, and all valid slow samples are retained without exclusions based on duration.
-
-Independent correctness checks include three actual SIGKILL hits at each of three durable states in a 10,000-file application, and three host-edit injections during application using the same binary. For the latter, pause after one file has changed while the file to be edited still has its original content, write and synchronize the external edit, then resume. These checks cover finite injection windows, not every concurrent schedule.
+Every sample passes full inventory and content checks: the original stays unchanged, a normal apply changes only the ten selected files, and a conflict case must refuse the whole batch while preserving host content. Failures are counted, never timed as zero. A separate prepared-view experiment measures review, apply and drop over twenty files, and an apply-scale experiment covers 10 to 100,000 files with SIGKILL and host-edit injections. The fixed editing task excludes inference, compilation and human reading, and is not a container, VM or security ranking.
## Data and analysis {#results}
### Complete task cost {#baseline-meaning}
-Same host and batch, 2026-10-06; milliseconds, N=30 per cell. P95 is descriptive only. No cell meets the predefined separated-cluster rule.
+Same host and batch, 2026-10-06; milliseconds, N=30 per cell. No cell meets the predefined separated-cluster rule.
| Workspace files | pVisor stage P50 / P95 | Git worktree P50 / P95 | btrfs reflink P50 / P95 |
|---|---:|---:|---:|
@@ -65,7 +35,7 @@ For 10,000 files, the stage-minus-Git median difference is **-107.27 ms, 95% CI
### Review cost with a prepared view {#prepared-review}
-Separate matched controls measured on 2026-10-06: twenty small text files, ten applied and ten discarded, N=30 per cell, zero failures. Milliseconds; P95 is descriptive. No cell triggers the split rule.
+Separate matched controls measured on 2026-10-06: twenty small text files, ten applied and ten discarded, N=30 per cell, zero failures. Milliseconds. No cell triggers the split rule.
| Step | pVisor stage P50 / P95 | Git worktree P50 / P95 |
|---|---:|---:|
@@ -103,7 +73,7 @@ No participant study was conducted. Batch review and machine timing cannot be co
### Application and disposal by scale {#apply-cost}
-Measured on 2026-10-06. Units: ms; each cell is **P50 / reference P95, N=30**, with zero failures. P95 from 30 samples describes observations rather than a stable tail-latency commitment.
+Measured on 2026-10-06. Units: ms; each cell is **P50 / reference P95, N=30**, with zero failures.
| Files | pVisor apply | Git apply | Native copy | drop | Pre-apply conflict rejection |
|---:|---:|---:|---:|---:|---:|
@@ -163,6 +133,4 @@ The data covers warm caches and small text files in one directory. It does not c
Local provenance records binary, source, harness and raw-report digests. Timing and concurrent checks use the same binary in separate cohorts. Complete CSV/JSON, raw commands, reports and audit records remain in their local cohorts or the documentation data archive.
-### Sources and reproduction {#run}
-
-[Comparison method](methodology.md) · [Reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+Reproduction follows the [comparison method](index.md#interpretation) and the [runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md).
diff --git a/docs/src/en/benchmarks/vm-memory/index.md b/docs/src/en/benchmarks/vm-memory/index.md
index 409e2a33..4bac092b 100644
--- a/docs/src/en/benchmarks/vm-memory/index.md
+++ b/docs/src/en/benchmarks/vm-memory/index.md
@@ -1,39 +1,22 @@
# How can multiple VMs use less memory?
-## Main conclusions {#conclusions}
-
-Agent tools load dependencies, read files and process data, and multiple environments may use identical contents at similar times. **pVisor shares duplicate pages early and retains that sharing on subsequent reads, reducing the memory resident across these execution environments.**
-
-- **Establish sharing early.** In the shared-random preflight, the physical pool reaches the observed sustained 128 MiB drop at about 1.7 seconds, providing evidence of early reclamation for short-lived working sets.
-- **Carry sharing through the next read.** Physical sharing retains low usage after readback. Explicit immutable files can also be reused directly through DAX, while file-read hints help the scanner discover candidates earlier.
-- **Evaluate the complete cost for the working set.** Savings depend on duplication and page lifetime. Consider scanning CPU, end-of-window memory usage and the cost of restoring private RAM from compressed storage together.
-
## Motivation {#motivation}
-Agent file reads, searches and small script calls can be brief. For short-lived tool environments or working sets that are soon released or overwritten, low memory usage after tens of seconds may arrive after the sharing opportunity has passed; both the first few seconds and the end of the window matter. Library pages in a persistent VM can survive multiple calls, so tool duration is not a direct measure of how long pages remain shareable. Deployment decisions should use the working set's lifetime to balance reclamation speed, scanning CPU, readback costs and the complete runtime group's memory budget.
-
-## Experiment design {#interpretation}
-
-Evaluate deduplication with compressible repeated contents, identical random contents across instances and instance-unique random contents. Use the same observation window to compare idle usage, reclamation speed, CPU and first complete readback. Evaluate library loading, file-read hints and explicit immutable DAX separately to avoid combining different workloads into one ranking.
+Agent tools load dependencies, read files and process data, and several environments may use identical contents at the same time. pVisor shares duplicate pages early and keeps that sharing across later reads, cutting resident memory. Choose by the working set's lifetime: short-lived tools and long-lived library pages exercise different trade-offs.
-The engineering preflights use four instances per group with 64 MiB of data each. VMs have 256 MiB RAM / 1 vCPU; each Docker container has a 256 MiB limit and one CPU quota. Complete groups have four CPUs / 2 GiB / zero swap and include the pool or dedicated rootless Docker runtime. Each condition has N=1 and a 60-second ready window. Content, private-write, exit and resource checks must pass; failed and incomplete cohorts are excluded. See the [engineering experiment design](../../design/vm-memory-performance-analysis.md#pool-design) for the environment and sampling boundaries.
+In the shared-random preflight, the physical pool reaches the observed sustained 128 MiB drop at about 1.7 s, while KSM takes about 27.8 s and finishes with lower memory. Evaluate scanning CPU, end-of-window memory and private-RAM restoration cost together rather than one peak.
-This compares complete configurations under common budgets and workloads. Docker uses a dedicated rootless daemon whose runtime costs are borne by four containers; a shared-daemon deployment can amortize them differently. Firecracker and pVisor use different guest kernels and virtio-blk / virtio-fs file paths, while Docker shares the host kernel. Global ksmd runs outside the group's CPU quota and is reported separately, so the results cannot all be attributed to the scanning algorithm.
-
-**Cgroup-charged memory** includes cache and kernel costs charged to the group. **PSS** proportionally allocates shared pages mapped by processes. File pages may be charged outside the group, so retain both metrics separately; do not add them or directly convert them into incremental whole-host usage. Repeated rounds, real-Agent latency and long-term capacity remain unmeasured.
-
-### Whole-group totals and per-VM averages {#memory-accounting}
+## Experiment design {#interpretation}
-**The figures show totals for all four instances, without dividing by the VM count.** Daemon-backed modes include the `pvisor-daemon memory-pool` process, all VM processes and in-group helper processes. To calculate average usage per VM:
+Measure whole-group charged memory over time, PSS and the cost of the first complete readback as memory occupancy. That occupancy is what the group costs while it runs; lower occupancy at the same readback cost fits more environments.
-- **Average process PSS** = (pool-process PSS + all VM-process PSS + in-group helper-process PSS) / 4. PSS proportionally allocates shared pages across mappings; summing RSS would count shared pages repeatedly.
-- **Average group-charged memory** = the complete cgroup's `memory.current` / 4. This already includes the pool, file cache and kernel costs charged to the group; do not add daemon memory again.
+Four instances per group, 64 MiB of data each, inside a four-CPU / 2 GiB / zero-swap budget. VMs use 256 MiB and one vCPU; each container has a 256 MiB limit and one CPU quota. Each condition runs one 60-second window after readiness; content, private-write, exit and resource checks must pass, and incomplete cohorts are excluded.
-This average allocates the complete group cost and does not measure the marginal cost of another VM. The experiment starts the standalone memory-pool component, without the full OpenSandbox API service. External observers are also excluded from these memory totals.
+Report whole-group totals. PSS allocates shared pages proportionally, and group-charged memory is the cgroup's `memory.current`; per-VM averages divide these totals by four and do not measure the marginal cost of another VM. Docker uses a dedicated rootless daemon, Firecracker and pVisor use different kernels and file paths, and global ksmd runs outside the group's CPU quota. Repeated rounds, real-Agent latency and long-term capacity remain unmeasured.
### Distinguishing deduplication from compression {#dedup-modes}
-Physical page sharing retains one copy during reads; cold compression restores private memory on access. Evaluate idle usage, reclamation speed, scanning CPU and memory after the first complete read together.
+The labels below are experimental controls, not combinable options. Physical sharing works on 4 KiB pages; local and pooled compression use 64 KiB blocks and reject poorly compressible data. Immutable-file DAX maps one backing file directly, and file-read hints only prioritize scanner candidates.
| Experimental label | Memory mechanism | Cross-VM reuse | On subsequent reads |
|---|---|---|---|
@@ -43,15 +26,11 @@ Physical page sharing retains one copy during reads; cold compression restores p
| `physical` | Daemon holds shared physical pages with identical contents | VMs map the same page | Retain sharing; copy on write |
| `compressed` | Daemon stores reusable compressed cold blocks | VMs reuse compressed objects | Restore instance-private RAM |
-Physical sharing currently operates on 4 KiB pages. Local and pooled compression mainly use 64 KiB blocks with a minimum compression-savings requirement. Identical cross-VM data that compresses poorly can therefore be rejected by the compressed path. These labels identify experimental controls, not configuration options that can all be combined.
-
-Immutable-file DAX sharing uses a separate path: VMs directly map the same offsets of one backing file, without first scanning those file pages. The library experiment uses an explicit immutable attachment; ordinary rootfs `.so` files do not acquire this property automatically. Ordinary file-read hints only prioritize candidates for the physical scanner; merging still requires content validation.
-
-## Experimental data and analysis {#results}
+## Data and analysis {#results}
### Deduplication and shared-library curves {#linux-lifecycle}
-The [static working-set curves](../../design/vm-memory-performance-analysis.md#pool-static-results) include stock Firecracker, dedicated rootless Docker, and pVisor off, KSM, physical, compressed and local. Each of the three workloads has 0–60-second group-charged memory and PSS curves, with first-readback and CPU readings retained.
+The [static working-set curves](../../lab-notes/vm-memory-performance-analysis.md#pool-static-results) include stock Firecracker, dedicated rootless Docker, and pVisor off, KSM, physical, compressed and local. Each of the three workloads has 0–60-second group-charged memory and PSS curves, with first-readback and CPU readings retained.

@@ -73,7 +52,7 @@ The table uses identical random contents across instances, with N=1 per conditio
KSM additionally has **0.41 CPU seconds** of global ksmd work outside the group quota, which cannot be attributed entirely to this group. Group CPU includes VMs, the pool and in-group control work; these readings measure the complete path.
-These curves show a tradeoff between reclamation speed and sustained cost: the physical pool reaches the observed target at about 1.7 seconds, while KSM reaches it at about 27.8 seconds and has lower memory and CPU readings at 60 seconds. Short-lived working sets place more value on memory released in the first few seconds; long-lived pages have more time to accumulate sharing benefits. Selection depends on shareable page lifetime and CPU budget.
+These curves trade reclamation speed against sustained cost. The physical pool reaches the observed target in about 1.7 s; KSM takes about 27.8 s but reads lower on memory and CPU at 60 s. Short-lived working sets place more value on memory released in the first few seconds; long-lived pages have more time to accumulate sharing benefits. Selection depends on shareable page lifetime and CPU budget.
This experiment does not measure real-Agent call-duration distributions or establish benefits for subsecond calls. Time to target is not the first merge or full convergence time; pages in persistent VMs can retain sharing across multiple tool calls.
@@ -92,13 +71,13 @@ Physical sharing retains low usage after reads but still incurs access costs. Co
### Shared libraries: file hints and DAX {#library-curves}
-The [shared-library curves](../../design/vm-memory-performance-analysis.md#pool-library-results) compare loading paths for the same `.so`, including file hints off/on and explicit DAX. Time starts when all instances are ready; sharing during startup appears in the initial footprint. Complete readback and private-write validation remain intact; post-write curves are omitted.
+The [shared-library curves](../../lab-notes/vm-memory-performance-analysis.md#pool-library-results) compare loading paths for the same `.so`, including file hints off/on and explicit DAX. Time starts when all instances are ready; sharing during startup appears in the initial footprint. Complete readback and private-write validation remain intact; post-write curves are omitted.


-Both library figures use the same N=1 preflight and whole-group MiB on the vertical axes. The first-five-second view retains original samples to show early differences with file hints off/on; explicit DAX sharing is already reflected in the initial footprint. See the [detailed analysis](../../design/vm-memory-performance-analysis.md#pool-readback) for scanning CPU and readback costs.
+Both library figures use the same N=1 preflight and whole-group MiB on the vertical axes. The first-five-second view retains original samples to show early differences with file hints off/on; explicit DAX sharing is already reflected in the initial footprint. See the [detailed analysis](../../lab-notes/vm-memory-performance-analysis.md#pool-readback) for scanning CPU and readback costs.
### Sources and configuration {#run}
diff --git a/docs/src/en/cases/index.md b/docs/src/en/cases/index.md
index 73704d9c..f414e5d9 100644
--- a/docs/src/en/cases/index.md
+++ b/docs/src/en/cases/index.md
@@ -60,7 +60,7 @@ just cases --suite use --output target/pvisor-learning-report.json
Specifications and the complete Markdown documents containing preparation participate in semspec digests. New cases remain UNREVIEWED: execution success and human semantic approval are separate. After human review of the engine, vocabulary, and cases, add --require-reviewed. Test execution does not approve cases or update the review ledger.
-[DOC cases](../reference/cases.md), [VM control cases](../reference/cases-vm.md), STAGE and USE scenarios run through `just cases`, selected with `--suite doc/stage/use/vm`; `just examples` runs examples/pvisor. CI runs existing isolation regressions and network/Gateway mock scenarios alongside this learning path. Retired standalone snapshot hardware records remain historical evidence. Legacy Controller/Worker acceptance records are not validation of the new daemon. Validate native execution restoration separately against the [execution-checkpoint contract](../reference/cli.md#full-vm-execution-checkpoints); the daemon's [runtime boundaries](../guides/daemon/boundaries.md) do not include VM restore. This learning path does not count unexecuted VM/Gateway capabilities as success.
+[DOC cases](../reference/cases.md), [VM control cases](../reference/cases-vm.md), STAGE and USE scenarios run through `just cases`, selected with `--suite doc/stage/use/vm`; `just examples` runs examples/pvisor. CI runs existing isolation regressions and network/Gateway mock scenarios alongside this learning path. Retired standalone snapshot hardware records remain historical evidence. Legacy Controller/Worker acceptance records are not validation of the new daemon. Validate native execution restoration separately against the [execution-checkpoint contract](../reference/cli.md#full-vm-execution-checkpoints); the daemon's [runtime boundaries](../guides/daemon/index.md) do not include VM restore. This learning path does not count unexecuted VM/Gateway capabilities as success.
The full execution gate currently targets Linux. On macOS, select applicable cases individually; loopback policy differs from Linux namespaces, so the host-loopback refusal checked by S-USE-014 is not a macOS guarantee.
diff --git a/docs/src/en/community/adopters.md b/docs/src/en/community/adopters.md
deleted file mode 100644
index 33b2240f..00000000
--- a/docs/src/en/community/adopters.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Adopters and case studies
-
-If you are considering pVisor, start with your task type: let a coding agent modify a project, collect candidate changes in CI, or generate scored rollouts in a batch. One small task can establish whether execution, review, and change acceptance fit your workflow.
-
-No organization case with public authorization is currently registered here. The following are reproducible trial paths; organization names, logos, and production scale require confirmation before publication.
-
-## Start from your workflow {#start}
-
-| Scenario | First trial | Results to inspect |
-| --- | --- | --- |
-| Local coding agent | One small staged change | File diff, tests, and apply selection |
-| CI repair | An offline script, then an agent | Failure records, Stage artifacts, and review handoff |
-| Parallel agents | Two independent worktrees | Separately traceable results and clear integration |
-| RL rollout | One candidate collected and scored | Input version, trajectory, reward, and failure category |
-
-Follow [CI](../guides/ci.md), [Parallel agents](../guides/parallel-agents.md), or [Rollouts](../guides/rl-rollouts.md). Validate your task before measuring speed and capacity with your actual workload.
-
-## Share a useful case study {#case}
-
-Describe the original workflow, problem, pVisor version, platform and executor, agent and model versions, key commands or configuration, and review process. Include a public task input and result, explaining what adoption changed in practice.
-
-Attach task counts, hardware, and methodology to performance figures. Connect experience claims to concrete actions such as approval counts, consolidated diff review, or conflict handling. Failure cases and subsequent configuration changes are useful too.
-
-Confirm permission to publish organization names, logos, quotations, and data. Replace private code and credentials with a public reproduction; full logs containing secrets are unnecessary.
-
-## Case record fields {#fields}
-
-Record organization or individual attribution, publication permission scope, date, versions, task type, integration, scale, metric definitions, and links to original material. Keep unauthorized cases unnamed and distinguish experimental trials from production use.
diff --git a/docs/src/en/community/code-of-conduct.md b/docs/src/en/community/code-of-conduct.md
deleted file mode 100644
index 64c65fb3..00000000
--- a/docs/src/en/community/code-of-conduct.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Code of conduct
-
-When discussing implementation, reporting problems, or reviewing contributions, focus on observable behavior and evidence so people with different experience, backgrounds, and communication styles can keep collaborating.
-
-Formal adoption of the Contributor Covenant and a private conduct-reporting contact have not yet been published. The following provides practical discussion expectations; the formal policy needs maintainer confirmation.
-
-## Make discussions easier to resolve {#participation}
-
-- Include versions, platforms, reproductions, or specific passages so others can act on a report.
-- Explain the impact and acceptable changes in code review without judging a contributor's ability or identity.
-- When views differ, restate the problem both sides need to solve, then compare options and acceptance results.
-- Give newcomers necessary context and allow questions, corrections, and uncertainty.
-
-Insults, harassment, discrimination, threats, disclosure of private information, and persistent personal attacks undermine collaboration. Keep technical disagreement focused on proposals.
-
-## Responding to inappropriate interactions {#response}
-
-You can pause a conversation and retain relevant links, timestamps, and records without escalating the conflict. If you already have a private maintainer contact, ask about the appropriate reporting route. Public issues can discuss process improvements, but should not disclose affected people's identities, private messages, or sensitive incident details.
-
-The project still needs to publish an available private conduct-reporting channel, responsible people, recusal process, and response times. The vulnerability channel is for security vulnerabilities; follow [Disclosure policy](../security/disclosure.md) for those reports.
-
-## Scope {#adoption}
-
-These discussion expectations apply to issues, PRs, reviews, and community exchanges. Technical discussions can retain differing views while allowing participants to contribute and receive responses.
-
-Formal conduct incident handling requires a private channel and responsible people. No dedicated contact is currently published; the repository's vulnerability channel continues to follow the security disclosure policy.
diff --git a/docs/src/en/community/governance.md b/docs/src/en/community/governance.md
index ca936338..bb868646 100644
--- a/docs/src/en/community/governance.md
+++ b/docs/src/en/community/governance.md
@@ -1,28 +1,19 @@
# Governance and maintainers
-Choose an entry by change size: submit a PR for wording fixes and small issues, and discuss larger interface or behavior changes in an issue with clear acceptance criteria. Report security-boundary vulnerabilities through [private disclosure](../security/disclosure.md).
+pVisor is currently decided by a single maintainer: code merges, releases, semspec approvals, and the authoritative documentation all go through the same entry point. There is no formal committee or multi-maintainer voting mechanism. This page describes current practice, not a charter that has yet to be established.
-## Current contribution and decision workflow {#workflow}
+## How contributions land {#workflow}
-1. Describe the user problem, expected behavior, and reproduction.
-2. For design changes, explain options, costs, and compatibility effects, with clear acceptance requirements.
-3. Submit implementation, matching documentation, and validation, following [Contributing](contributing.md).
-4. Reviewers check behavior, evidence, and tests; maintainers with the relevant repository permissions merge and release changes.
+1. Describe the user problem, expected behavior, and how to reproduce it; align on the problem and acceptance criteria in an issue first for substantial interface or behavior changes.
+2. Submit the implementation, corresponding documentation, and verification results; run the relevant checks per [Contributing](contributing.md).
+3. The maintainer reviews behavior, evidence, and tests before merging. Vulnerabilities touching security boundaries use the [private disclosure process](../security/disclosure.md).
-Code review, merge permission, and semantic approval are separate responsibilities. Passing PR tests does not automatically approve a product commitment; new public boundaries need matching specifications and human review.
+Code review, merging, and semantic-spec approval are handled separately: a passing PR does not automatically approve a product commitment; new user-visible boundaries need corresponding specs and human review.
-## Human responsibility for semspec approval {#semspec}
+## semspec approval {#semspec}
-Contributors can draft cases, fix implementations, and maintain runner tests. Maintainers assess claim accuracy and coverage before approve/revoke actions and approval-record updates. AI does not approve cases, edit real `REVIEWED.toml` or `.approved/` snapshots, or weaken existing checks to obtain PASS.
+Contributors may draft cases, fix implementations, and maintain runner tests. semspec approve/revoke and the real `REVIEWED.toml` and `.approved/` snapshots are executed only by the maintainer; AI does not perform approvals and does not weaken existing checks to obtain PASS. See [Testing and semspec](testing.md) for the commands and rules.
-Provide source version, environment, results, and limitations with the review. See [Testing and semspec](testing.md) for commands and rules.
+## Not yet established {#records}
-## Becoming a sustained contributor {#contributors}
-
-Start with a reproducible problem and maintain a module's implementation, documentation, and regression cases over time. Propose broader responsibilities in a public issue, describing the intended scope and work already completed.
-
-Repository permissions determine who can merge and release; expanded responsibilities need confirmation from maintainers with that authority. When views differ, collect the disputed points, alternatives, and validation in one issue and request a maintainer decision linked to the resulting change.
-
-## What governance records should publish {#records}
-
-Maintainer entries should include accounts, responsibilities, and effective dates. Design decisions should link to issues, PRs, or ADRs; permission and release-responsibility changes should remain recorded. Sensitive security reports follow disclosure procedures, with public records referencing only publishable conclusions.
+A formal maintainer list, governance charter, and private conduct-reporting channel have not been established; they will be announced on this page once they are. Until then, design decisions are anchored by issue, PR, or ADR links, and discussion norms are in [Community](index.md).
diff --git a/docs/src/en/community/index.md b/docs/src/en/community/index.md
index 2f9bdcfb..429d673d 100644
--- a/docs/src/en/community/index.md
+++ b/docs/src/en/community/index.md
@@ -21,3 +21,11 @@ Keep a PR focused on one change: repair the implementation, add relevant regress
Unit and integration tests check implementation. Semspec expresses product commitments as claims, violation examples, and executable checks. You may draft new cases, fix implementations, and maintain runner tests, but must not weaken existing claims, checks, or `xfail` annotations to obtain PASS.
Human semantic review is separate from tests and PR merging. AI must not run `semspec approve` / `revoke` or edit real `REVIEWED.toml` or `.approved/` snapshots. See [Testing and semspec](testing.md) for the rules. Contributions are licensed under Apache-2.0.
+
+## Discussion norms
+
+Keep discussions about implementation, issue reports, and contribution reviews focused on observable behavior and evidence: include version, platform, and reproduction when reporting a problem; explain impact and acceptable changes when reviewing, without judging a contributor's ability or identity; when disagreeing, first restate the problem each side needs solved, then compare options and verification results. Insults, harassment, discrimination, publishing others' private information, and sustained personal attacks are not acceptable. The project has not yet formally adopted a Contributor Covenant or a private conduct-reporting channel; both will be announced here once established. Report security vulnerabilities through the [disclosure policy](../security/disclosure.md).
+
+## Trying it out and sharing a case
+
+No organization case is currently registered here with public authorization; organization names, logos, and production scale are published only after the user's confirmation. If you have tried pVisor, a useful case record includes the original workflow and the problem, the pVisor version, platform and executor, agent and model versions, key commands or configuration, how results were reviewed, and what actually changed after adoption. Attach task counts, machine specs, and measurement methods to performance numbers; failed attempts and the configurations adjusted afterward are equally valuable. Confirm public authorization for names, quotes, and data before submitting, and replace private code and credentials with publicly reproducible material.
diff --git a/docs/src/en/community/roadmap.md b/docs/src/en/community/roadmap.md
index 525044df..f4ac7815 100644
--- a/docs/src/en/community/roadmap.md
+++ b/docs/src/en/community/roadmap.md
@@ -1,6 +1,6 @@
# Roadmap
-See [Trust ladder](../why/trust-ladder.md) for the levels and scale axes. The table below lists ongoing L1 work (individual local Jobs) and its acceptance criteria.
+See [Why pVisor](../why/index.md#trust-ladder) for the levels and scale axes. The table below lists ongoing L1 work (individual local Jobs) and its acceptance criteria.
| Work | Acceptance criteria |
| --- | --- |
@@ -36,7 +36,7 @@ The [daemon](../guides/daemon/index.md) has VM-only `NativeRuntime` embedding pV
## L2 and L3 milestones
!!! note "Under construction"
- The entry criteria and gap list for L2/L3 are not final, and no schedule is set. The requirements and acceptance criteria below describe the current work. For the level definitions see the [trust ladder](../why/trust-ladder.md); for the capacity rationale see [concurrency density](../benchmarks/density.md).
+ The entry criteria and gap list for L2/L3 are not final, and no schedule is set. The requirements and acceptance criteria below describe the current work. For the level definitions see the [trust ladder](../why/index.md#trust-ladder); for the capacity rationale see [concurrency density](../benchmarks/density.md).
### L2: multiple local Jobs / one pipeline
@@ -49,7 +49,7 @@ Acceptance criteria:
### L3: clustered execution, centralized evidence
-Entry criteria (TBD): the boundary with schedulers is defined—pVisor provides execution semantics and evidence, while cross-node orchestration goes to Kubernetes and Ray; see [cluster execution](../design/research/cluster-execution.md).
+Entry criteria (TBD): the boundary with schedulers is defined—pVisor provides execution semantics and evidence, while cross-node orchestration goes to Kubernetes and Ray; see [cluster execution](../design/research/index.md).
Acceptance criteria:
diff --git a/docs/src/en/concepts/capabilities-and-evidence.md b/docs/src/en/concepts/capabilities-and-evidence.md
index f94bf20d..9179d603 100644
--- a/docs/src/en/concepts/capabilities-and-evidence.md
+++ b/docs/src/en/concepts/capabilities-and-evidence.md
@@ -2,6 +2,10 @@
To judge what a Job actually guarantees, check the requested permissions, admission plans, installed controls and observed outcomes separately. `--safe`, a stage directory, or an executor name alone does not prove that every capability is enforced.
+## Policy layering rules {#layering}
+
+Policies narrow layer by layer: a later `allow` cannot override an earlier explicit `deny`. A layer that declares rules but omits `default_action` denies by default; with no policy configured at all, the network runs public and reads are unrestricted—to restrict them you must declare it. `--safe` requires isolation to be installed and rejects sensitive paths; `--strict` validates every requested dimension and refuses to run without evidence. For fields and presets, see the [policy fields reference](../reference/policy.md).
+
## Check each dimension
| Dimension | Check |
@@ -38,7 +42,7 @@ Execution is rejected when a required control cannot be satisfied. Modes that al
## What records show
```text
-请求的权限 → 准入计划 → 安装控制 → 执行与观察 → 终态结果和 Run Bundle
+Requested permissions → admission plan → installed controls → execution and observations → terminal result and Run Bundle
```
`status --review` displays the Run Bundle's controls, warnings and staged changes. File observations cover only operations that reach OverlayFS; network observations cover only traffic that reaches OverlayNet. `null` means unobserved; zero means observed with no hits. Operation counts are not a substitute for the final file diff.
diff --git a/docs/src/en/concepts/glossary.md b/docs/src/en/concepts/glossary.md
deleted file mode 100644
index 42a22767..00000000
--- a/docs/src/en/concepts/glossary.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Glossary
-
-| Term | Meaning |
-| --- | --- |
-| [Job](jobs.md) | A persistent unit of work in pVisor: command, evidence, and staged changes |
-| [Stage](staging.md) | A copy-on-write staging workspace |
-| [apply / drop](staging.md) | Selectively merge staged changes into the target / discard them |
-| [Run Bundle](../reference/run-bundle.md) | The result, control observations, artifacts, and summary of one run |
-| [Capability](capabilities-and-evidence.md) | The request and actual control of one capability dimension (files, network, subprocess, …) |
-| [Evidence](capabilities-and-evidence.md) | The controls an executor actually installed and the results observed, not the declaration |
-| [Placement](../design/operations-events.md) | The chosen execution location (host / container / VM, and Overlay combinations) |
-| Plan level | What the executor plans to install at admission: `Unsupported`, `Cooperative`, `Planned`—not proof it is installed |
-| Observed level | What the executor observes at teardown: `Unenforced`, `Cooperative`, `Enforced` |
-| [Interception](../guides/policies/network.md) | Network-layer interception of egress traffic (explicit proxy or VM data plane) |
-| [L0–L3](../why/trust-ladder.md) | Trust ladder levels |
-
-For mechanisms and fields, see [design](../design/index.md) and [reference](../reference/index.md).
diff --git a/docs/src/en/concepts/index.md b/docs/src/en/concepts/index.md
deleted file mode 100644
index fb1ad64e..00000000
--- a/docs/src/en/concepts/index.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Concepts and boundaries
-
-Judge three results separately for each task: whether the command completed, which net file changes it produced, and whether requested restrictions actually took effect. Exit codes, stages, and executor names describe different things and cannot substitute for each other.
-
-## The Job is the review unit
-
-A Job associates a managed command with its execution evidence and staged changes. After the command stops, you can still locate it and review the result; a failed command can leave useful candidate files.
-
-In default storage, `last` searches by current workspace. An explicit `--stage PATH` stores the Job in that directory; use its path or the printed Job ID to avoid selecting the wrong result with custom storage or parallel projects. See [Jobs and storage](jobs.md) for identity and cleanup rules.
-
-## The file view and publication are separate stages
-
-With staging enabled, the Job reads workspace lower files combined with its own upper changes. Writes, deletions, and renames change that view first. Review shows the net effect; operation counts are not the final diff.
-
-Apply compares selected changes against the baseline recorded at first modification before publishing to the original workspace. It refuses to overwrite targets changed by another writer. Stop other writers during publication: multi-file updates are not atomic against external editors. Drop only discards staged changes that have not been applied. See [staging and apply](staging.md) for the full contract and semantic cases.
-
-Drop cannot undo explicitly shared direct-write host paths, applied batches, or remote API effects. Logical checkpoints save the upper and conflict preimages; they freeze neither every host lower file nor process memory or external service state.
-
-## Check policy intent separately from installed controls
-
-```text
-Requested permissions → Policy narrowing and admission plan → Installed controls → Observed execution and outcome
-```
-
-User, workspace, session, and executor base policies narrow permissions layer by layer. An allow in one layer cannot override a deny in another. `Planned` in an admission plan means a mechanism is intended for installation, not that it has been enforced; executor observations at teardown report actual controls. See [policy model](policy-model.md) for policy composition.
-
-Check file reads, file writes, network, subprocesses, credentials, and resources separately in the Run Bundle. Staging does not prove network isolation, and captured requests do not prove the absence of uncaptured connections. Observations cover only operations reaching their control points; `null` means unobserved, while zero means observed with no hits. See [capabilities and evidence](capabilities-and-evidence.md) for levels and guarantee scope.
-
-## Records have distinct responsibilities
-
-`run.json` stores Job identity, state, and local resources; the Run Bundle stores outcomes, control observations, and artifact summaries; an optional Event Journal links published facts and causal references. The Journal replaces neither the Bundle nor a global ordering of external side effects across Jobs.
-
-These records support local review and diagnosis, not cryptographic remote attestation or hostile multi-tenancy guarantees. See the [execution model](../design/execution-model.md) for ownership of Operation, Attempt, and Session implementations.
diff --git a/docs/src/en/concepts/jobs.md b/docs/src/en/concepts/jobs.md
index a42b127f..4a165386 100644
--- a/docs/src/en/concepts/jobs.md
+++ b/docs/src/en/concepts/jobs.md
@@ -7,7 +7,7 @@ pvisor run --safe --stage ../stage-001 -- codex
pvisor status --review ../stage-001
```
-`pvisor run` creates a Job; `status`, `kill`, `inspect`, `fork`, `apply`, and `drop` operate on it directly, with no `job` subcommand. On disk it keeps the `run-*` and Run Bundle names.
+`pvisor run` creates a Job; `status`, `kill`, `inspect`, `fork`, `apply`, and `drop` operate on it directly, with no `job` subcommand. On disk, the directory and Run Bundle use the `run-*` name.
## Finding it again later
@@ -16,8 +16,8 @@ Lifecycle commands accept a selector: a Job ID, a stage directory, `run.json`, o
`last` is a convenience that searches **default storage** only, by current workspace. With `--stage PATH` the Job lives in the stage directory, not default storage, so pass the path or ID explicitly:
```bash
-pvisor status --review ../stage-001 # 推荐:用暂存路径
-pvisor status --review run-20260102-abc # 或者用 Job ID
+pvisor status --review ../stage-001 # stage path
+pvisor status --review run-20260102-abc # or the Job ID
```
When no Job belongs to the current workspace, pVisor fails instead of substituting another project's Job.
diff --git a/docs/src/en/concepts/policy-model.md b/docs/src/en/concepts/policy-model.md
deleted file mode 100644
index 28d424f2..00000000
--- a/docs/src/en/concepts/policy-model.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Policy model
-
-An execution passes through five steps, each recording something different; they cannot substitute for one another:
-
-- **Request**: the permissions you declare (`--safe`, `--access`, `--overlaynet-*`, and so on).
-- **Admission**: what the selected executor can provide, at most `Planned`.
-- **Effective constraints**: the result of intersecting the user, workspace, session, and executor base policies.
-- **Installed controls**: which enforcement mechanisms the executor actually installed.
-- **Observed results**: the observations the executor reports at teardown—this is the evidence of what actually took effect.
-
-Policy **narrows layer by layer**: a later `allow` cannot override an earlier explicit `deny`. A layer that declares rules but omits `default_action` denies by default; with no policy configured at all, the network runs public and reads are unrestricted—to restrict them you must declare it. `--safe` requires isolation to be installed and rejects sensitive paths; `--strict` validates every requested dimension and refuses to run without evidence.
-
-For fields and presets see the [policy fields reference](../reference/policy.md) (in progress); for the evidence definitions see [capabilities and evidence](capabilities-and-evidence.md).
diff --git a/docs/src/en/concepts/staging.md b/docs/src/en/concepts/staging.md
index 2b58a406..b044a33e 100644
--- a/docs/src/en/concepts/staging.md
+++ b/docs/src/en/concepts/staging.md
@@ -2,7 +2,7 @@
Staging keeps a Job's workspace changes in a copy-on-write upper layer. Only an explicit `apply` changes the target workspace. This makes file changes reversible before apply: select what to merge, discard the stage, or fork it.
-This page defines the staging contract. Each promise corresponds to a case in `docs/src/zh/cases/06-stage-apply.md`, reproducible with `just cases --suite stage`. For the workflow, see [Review and apply changes](../guides/review-apply.md).
+Each promise below corresponds to a case in `docs/src/zh/cases/06-stage-apply.md`, reproducible with `just cases --suite stage`. For the workflow, see [Review and apply changes](../guides/review-apply.md).
## Promises
diff --git a/docs/src/en/design/architecture.md b/docs/src/en/design/architecture.md
index 57681ab7..8605eb7f 100644
--- a/docs/src/en/design/architecture.md
+++ b/docs/src/en/design/architecture.md
@@ -4,7 +4,7 @@ pVisor processes Operations: it accepts requests, decides how to handle and plac
There are two responsibilities: **core provides definitions; pvisor provides implementation.** External callers submit execution requests, control execution through a run handle and observe progress and results through Events.
-
+For the overall diagram and an end-to-end task walkthrough see [Design and internals](index.md). The contracts below cover crate ownership, API boundaries and the host authority path.
## Definitions and implementation
@@ -20,10 +20,11 @@ There are two responsibilities: **core provides definitions; pvisor provides imp
| `pvisor-gateway` | Optional model protocol routing, conversion and call observation |
| `pvisor-daemon` | Separate single-node sandbox admission, durable ownership, native VM supervisor lifecycle and endpoint proxy |
| `pvisor-cli` | CLI, TUI, cache/replay frontends and Host Job application adapters; consumes the runtime |
+| `pvisor-shim` | containerd Runtime v2 shim (`io.containerd.pvisor.v2`); task lifecycle, exec and FIFO/PTY IO for the host process path |
| `pvisor-vm` | VMs, devices, freezing, snapshots and RAM mappings; uniform api and private platform implementations |
| `pvisor-replay` | Agent trajectory replay mechanisms; consumes Core/Journal contracts, with frontends in CLI |
-The [daemon](daemon/index.md) uses VM-only NativeRuntime: detached supervisors embed `PVisor::run` and retain RunHandles across daemon restart. The executable constructs NativeRuntime with native CLI settings; stage/apply, checkpoint/fork and Gateway APIs are absent, and node sharing is not automatically acquired. See [responsibility convergence](daemon/responsibility-convergence.md). External orchestration owns host choice and workflows.
+The [daemon](daemon/index.md) uses VM-only NativeRuntime: detached supervisors embed `PVisor::run` and retain RunHandles across daemon restart. The executable constructs NativeRuntime with native CLI settings; stage/apply, checkpoint/fork and Gateway APIs are absent, and node sharing is not automatically acquired. External orchestration owns host choice and workflows.
Core neither owns the execution loop nor starts processes or opens control sockets. pvisor implements AgentCtl clients/servers and approval sockets. Drivers implement file, network and isolation boundaries. The default core does not depend on Gateway, TUI or replay; the `gateway` feature enables capture.
@@ -44,7 +45,7 @@ Migrated `api` modules declare public data, fields and trait methods. Opaque own
Migration proceeds one crate at a time, updating its consumers, README, public documentation and boundary checks together while preserving external contract coverage. Unmigrated crates should not gain blanket re-export layers or duplicate DTOs merely to appear uniform, nor expose internals to bypass compilation boundaries. Hardware/private-state checks remain inside the crate; callers rely on ownership, lifecycle, post-failure state and synchronization contracts.
-This Rust boundary does not automatically establish stable wire protocols or old-record compatibility. CLI `JobCommand`/tickets still require exact build matching, and stored formats have independent readers. See [Records and version matrix](records-and-versions.md) and the VM rationale in [ADR 0005](decisions/0005-rust-vm-api.md). Status follows static inspection of `lib.rs`, VM `runtime_modules.rs`, `api.rs` and directory READMEs; it does not claim fresh contract-test or platform validation.
+This Rust boundary does not automatically establish stable wire protocols or old-record compatibility. CLI `JobCommand`/tickets still require exact build matching, and stored formats have independent readers. See [Records and version matrix](records-and-versions.md). Status follows static inspection of `lib.rs`, VM `runtime_modules.rs`, `api.rs` and directory READMEs; it does not claim fresh contract-test or platform validation.
## Host and Guest AgentCtl {#host-agentctl}
@@ -166,9 +167,7 @@ full platform behavior; see above for macOS identity and cleanup limits.
## A production execution path
-
-
-Driver preparation creates real file and network resources; executor dispatch starts the workload. Separating these steps lets a failed required launch-fact commit prevent dispatch while the Session reclaims prepared resources. Completion similarly converges resources and observations before terminal publication; cancelling a caller wait does not establish that those actions finished.
+For the full preparation, launch-fact commit, dispatch, cleanup and terminal-publication sequence see the walkthrough in [Design and internals](index.md#execution). The three ownership-level contracts follow.
`RunSpec` is execution configuration supplied by the caller; `Operation` is the structured operation description. The only current production operation is `run.execute`, with program, arguments and working directory. Executors consume the effective RunSpec and prepared driver attachments. `PVisor::resolve_operation` uses the same admission path for pre-launch review; it cannot replace execution or evidence that controls were installed.
@@ -188,8 +187,6 @@ Process/VM executors clean up their managed process groups; containers use the r
External callers observe Events without depending on Session's internal fields. See [Operation and Event](operations-events.md) for chains, identities, causal references and recording boundaries.
-The implementation prepares drivers, commits startup facts, then calls the executor. Failure to commit required startup facts prevents dispatch and triggers prepared-resource cleanup. Preparation can still have file or socket effects.
-
## Policy, controls and evidence
Policy, admission plans and completion observations are separate layers. See [Capabilities and evidence](../concepts/capabilities-and-evidence.md) for `ExecutorPlan`/`ExecutorObservations` levels and evidence rules.
diff --git a/docs/src/en/design/cli.md b/docs/src/en/design/cli.md
index 664ecd30..a6e058d4 100644
--- a/docs/src/en/design/cli.md
+++ b/docs/src/en/design/cli.md
@@ -87,7 +87,7 @@ pvisor-daemon memory-pool --help
Use `pvisor-daemon` directly for sandbox lifecycle and optional pool ownership. The cache, replay and TUI remain separate from Job commands; replay/TUI companion lookup reports missing tools explicitly. The daemon CLI constructs the native VM runtime and dispatches supervisors, with synchronous internal VM dispatch before Tokio. Node resource protocols belong to the runtime and have no daemon acquire/release adapter. Packaging does not expose staging/checkpoint APIs or automatically acquire node resources.
-Tools come from a static table and only a trusted installation directory; discovery neither searches PATH nor executes companions. The directory/executables belong to the current user or root, must not be group/world writable, and reject symlinks. Unix `exec` preserves argv, stdio, signals and exit codes. Tool `--help`/`--version` arguments pass through unchanged, and tools cannot shadow Job commands. See [daemon operations](daemon/operations.md) for sandbox deployment and [responsibility convergence](daemon/responsibility-convergence.md) for separate native resource budgets.
+Tools come from a static table and only a trusted installation directory; discovery neither searches PATH nor executes companions. The directory/executables belong to the current user or root, must not be group/world writable, and reject symlinks. Unix `exec` preserves argv, stdio, signals and exit codes. Tool `--help`/`--version` arguments pass through unchanged, and tools cannot shadow Job commands. See the [daemon architecture](daemon/index.md) and [operations](daemon/operations.md) for sandbox deployment and native resource budgets.
The default core build excludes Gateway. Use `--features gateway` for capture; wheel builds enable it. Without capture, OverlayNet still authorizes and forwards ordinary explicit proxy traffic. Requesting uncompiled capture or Gateway debug capabilities returns an error.
diff --git a/docs/src/en/design/cluster-benchmark-plan.md b/docs/src/en/design/cluster-benchmark-plan.md
deleted file mode 100644
index cd09ce94..00000000
--- a/docs/src/en/design/cluster-benchmark-plan.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Retired Cluster benchmark plan
-
-**The Controller/Worker experiment plan is retired, not transferred to the daemon.** B-CLUSTER has no active runner or acceptance protocol. The [historical measurements](../benchmarks/cluster-scalability.md) answer questions only about their frozen artifacts; they do not validate the proposals below or current daemon density.
-
-## Existing evidence {#existing}
-
-The [technical archive](cluster-performance-analysis.md) distinguishes growing-budget readiness probes, synthetic history queries and the independent completed-task cohort. Readiness is not completion throughput; fixture RSS is not net control-plane memory; warm replay is not full recovery. Historical tables, CSVs and raw `.data/` remain in their original cohorts, without relabeling or new measurements.
-
-## Startup attribution proposal {#q1}
-
-Comparing direct VM execution with old Cluster dispatch was an unfulfilled attribution proposal, not a current Controller/Worker experiment. Old debug, release and quota configurations cannot be subtracted to infer scheduling cost.
-
-## Marginal-memory proposal {#q2}
-
-Separating shared bases, private working sets and offload recovery remains a measurement question, not a proven Cluster density benefit. Independent B-DENSITY and B-VM-MEMORY probes continue under their own registry entries and receipts. Single-VM reclaimed memory cannot be converted into daemon capacity.
-
-## Fixed-budget useful-work proposal {#q3}
-
-The proposed model-wait/CPU-release A/B was not validated by shell readiness or by the separate Python/Git completion cohort. The retired `release_cpu_on_idle` path is not an active measurement target. No current effective-Agent-throughput or unit-cost claim follows.
-
-## History-scaling proposal {#q4}
-
-Archived count calls and retained-record replay do not establish HTTP scheduling throughput, large active-set behavior or current daemon history costs. No old scheduler example is an active measurement entry.
-
-## Recovery proposal {#q5}
-
-The old Controller/Worker reconciliation experiment is retired. Local warm-log replay cannot establish end-to-end recovery, convergence under partition or exactly-once execution. No safety claim or receipt is weakened by retiring the experiment.
-
-## Sustained-operation proposal {#q6}
-
-Short probes cannot establish bounded long-term resource use. The former persistent-Worker plan is not a current daemon reliability or retention test.
-
-## Requirements for any replacement experiment {#protocol}
-
-A replacement needs its own registered subject and user question, frozen source/binary/input identities, verified whole-tree CPU/memory/zero-swap controls, identical workloads, declared sample counts and stopping rules, and complete correctness, conflict and recovery checks. Retain failures, unknown outcomes and OOMs. Keep independent batches and correlated in-batch observations distinct; use paired uncertainty for A/B claims. Freeze the protocol before formal sampling, and never retrospectively approve a hypothesis from exploratory data.
-
-These requirements do not authorize a new measurement or semantic approval. Human-reviewed claims, receipts, semspec checks and approval records remain unchanged.
-
-## Current scope {#priority}
-
-There is no executable Cluster priority list or reproduction command. Use [local capacity](../benchmarks/density.md) and [VM memory](../benchmarks/vm-memory/index.md) only within their documented native-probe scope. Daemon density, multi-host scalability and matched scheduler comparisons remain unmeasured. The [runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md) lists the retired entries and independent active probes.
diff --git a/docs/src/en/design/cluster-performance-analysis.md b/docs/src/en/design/cluster-performance-analysis.md
deleted file mode 100644
index ccd42e1b..00000000
--- a/docs/src/en/design/cluster-performance-analysis.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Retired Cluster performance evidence
-
-**Controller/Worker measurements describe retired artifacts, not the current daemon.** B-CLUSTER has no active measurement, plotting or publication entry. The [historical benchmark](../benchmarks/cluster-scalability.md) preserves completed-task and history tables with their original CSV provenance. No new measurements or daemon-density conclusions are added.
-
-## Historical VM readiness probes {#execution}
-
-The 2026-10-05 shell/sleep experiment increased both Worker count and CPU budget, using one independent Worker per VM. It observed parallel readiness for one to four guests, not fixed-budget useful-task throughput or single-Worker density.
-
-
-
-| Live VMs | Total memory P50, MiB | Readiness P50, s | Burst readiness rate, guests/s |
-|---:|---:|---:|---:|
-| 1 | 92.93 | 3.807 | 0.261 |
-| 2 | 178.00 | 3.789 | 0.525 |
-| 4 | 342.96 | 4.383 | 0.901 |
-
-Five measured batches per size followed one warmup. Guests used 128 MiB/one vCPU; each Worker and descendants had 512 MiB/0.5-core caps, and Controller 256 MiB/0.25 core, with zero swap. The shared Linux/KVM host used prepared minimal inputs and debug artifacts; other host workloads continued. Readiness includes submit CLI/HTTP, persistence, scheduling and VM startup. Memory is the sum of non-overlapping service cgroups while all guests are ready, not startup peak. Charts show observed ranges, not confidence intervals. These observations do not establish production capacity, tail latency, shared-working-set benefits or current daemon performance.
-
-## Historical Controller costs {#controller}
-
-| Retained records | Indexed counts P50, ns | Full-scan reference P50, ms | Process + ID fixture RSS, MiB | Journal, MiB | Warm replay, s |
-|---:|---:|---:|---:|---:|---:|
-| 1,000 | 202.83 | 0.068 | 12.13 | 1.93 | 0.079 |
-| 10,000 | 286.78 | 5.254 | 70.59 | 19.33 | 0.388 |
-| 100,000 | 129.40 | 20.789 | 658.82 | 193.25 | 1.744 |
-| 1,000,000 | 169.47 | 134.204 | 6,540.58 | 1,932.55 | 16.090 |
-
-The archived `controller-indexes-20261005-v3-history-*` results used one release process per size, one CPU, NVMe and warm replay. There was one ready record and otherwise cancelled history, without guest execution or HTTP load. Counts used twenty query samples, with one hundred indexed calls per sample; RSS and replay had one observation per size. RSS includes the ID fixture and allocator retention. Warm replay excludes Worker reconciliation and cold-disk recovery. The scan is an algorithm reference, not another Controller binary's throughput. Do not merge this cohort with the independent later history cohort in the historical benchmark.
-
-## Evidence boundaries {#limits}
-
-The readiness and query observations remain historical descriptions of their frozen implementations. They provide no current optimization priority, daemon sizing recommendation or scheduler/runtime ranking. Local [capacity](../benchmarks/density.md) and [VM memory](../benchmarks/vm-memory/index.md) have independent subjects and retained evidence; single-VM memory reclamation does not establish concurrent density. The [retired plan](cluster-benchmark-plan.md) records the boundary between old proposals and measured claims.
-
-## Retention, not active reproduction {#reproduce}
-
-`cluster_scalability.py`, `cluster_worker.py`, `controller_history.py`, their dedicated tests, `plot_cluster_scalability.py` and `publish_controller_history.py` are removed. There is no current build/run/publish command for the retired scheduler example. Original logs, samples, manifests and frozen harnesses remain local under `.data/`; retained copies are archives, not active entry points. Removal of old crate measurements does not authorize rewriting receipts or assigning those measurements to daemon source.
-
-Historical chart inputs are recorded under `docs/src/assets/benchmarks/.data/cluster-scalability-20261005/`: `vm.tsv`, `vm-summary.csv`, `controller-summary.csv`, `controller-provenance.tsv`, `manifest.tsv` and `setup-failure.tsv`. These are local provenance locations, not public download links. The [runner manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md) documents retirement and the independent active native probes.
diff --git a/docs/src/en/design/daemon/admission.md b/docs/src/en/design/daemon/admission.md
deleted file mode 100644
index dea9ef21..00000000
--- a/docs/src/en/design/daemon/admission.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Local sandbox admission
-
-Bound accepted sandbox resources on one machine before native VM creation. The daemon admits hard-limit sums; it does not queue work, choose hosts or infer spare capacity from a low RSS sample.
-
-## Request validation {#model}
-
-Creation requires a local prepared-image key in `image.uri`, nonempty argv and `resourceLimits` containing exactly `cpu` and `memory`. CPU accepts whole/fractional cores or millicores; memory accepts bytes and supported decimal/binary suffixes. Quantities must be positive, exactly representable and checked for overflow.
-
-```json
-{
- "image": {"uri": "prepared-agent-1.1.0"},
- "entrypoint": ["sleep", "600"],
- "resourceLimits": {"cpu": "500m", "memory": "256Mi"},
- "timeout": 600,
- "metadata": {"purpose": "local-example"}
-}
-```
-
-This is a request-shape example, not a validated image recipe. The manifest `entrypoint` bootstrap must supervise these arguments and the required services; [operations](operations.md#image-contract) defines that contract. No image is pulled during creation.
-
-Optional platform selection must match the native Linux architecture. Unsupported snapshots/templates, resource requests, network policy, credential proxy, secure access, volumes, image authentication, lifecycle hooks and nonempty extensions fail before native creation. Environment and metadata maps are bounded and validated.
-
-## Capacity accounting {#admission}
-
-| Bound | Admission rule |
-| --- | --- |
-| Sandbox count | Registry record count must remain within `max_sandboxes` |
-| CPU | Sum of all records' `cpu_millis` plus the request must fit configured capacity |
-| Memory | Sum of all records' `memory_bytes` plus the request must fit configured capacity |
-
-The serialized durable insertion is the reservation barrier. Concurrent creations cannot both spend the same capacity. Refusal returns `429 CAPACITY_EXCEEDED`, not an assignment for later execution. There are no tenant quotas or authenticated per-tenant resource accounts.
-
-Paused, terminated, failed and uncertain records retain their full CPU/memory/count charge until explicitly deleted or failed creation has verified cleanup. Pause does **not** release logical CPU. Native deletion and absence confirmation precede durable record removal; unknown cleanup cannot create reusable capacity.
-
-## Installed controls and physical memory {#reservations}
-
-Requires Linux x86_64, usable `/dev/kvm`, trusted absolute paths and a writable delegated cgroup v2 hierarchy with enabled CPU/memory/PID controllers and `cgroup.kill`. Preflight checks real controller writes and the KVM API; there is no host, OCI command or registry-pull fallback.
-
-The native supervisor embeds `pvisor::PVisor` with only `VmExecutor` and holds its RunHandle in a detached subprocess. The sandbox cgroup caps the entire supervisor/VMM/helper tree: aggregate CPU rate **10–8000 millicores**, hard memory, zero swap, `pids.max=512` and group OOM. vCPU count rounds quota up to whole CPUs (at most 8); guest RAM rounds down to MiB, while the hard memory cap also includes host overhead. Full limit/readiness checks remain at create, Inspect and resume; endpoint lookup authenticates live Running state and deletion fences without repeating full health/cgroup checks per data request. See [service access](lifecycle.md#endpoints). Paused, failed and uncertain records retain conservative admission charges.
-
-The launch callback joins the identity-bound cgroup **before exec**, using a pre-opened `cgroup.procs` FD under the owner lock and checking started/deletion/tombstone markers. Supervisor startup verifies membership instead of moving an already-running Tokio process; supervisor/Tokio allocations and subsequent VM/helper children are charged inside the sandbox budget. Direct hidden-command invocation outside that cgroup fails closed.
-
-Logical admitted sums, installed supervisor/VM-tree limits and whole-node physical occupancy are different quantities. Daemon, helpers, caches and the host need headroom outside sandbox limits. There is no implicit CPU/RAM overcommit, pressure-based admission or measured node-wide physical budget. Native [shared working sets](shared-working-set.md) do not authorize lower daemon reservations.
-
-Validation and arithmetic live in `daemon/models.rs`; serialized reservation insertion lives in `daemon/mod.rs`; native KVM/cgroup preflight and controls live in `runtime.rs`.
diff --git a/docs/src/en/design/daemon/index.md b/docs/src/en/design/daemon/index.md
index 0d841519..78f61174 100644
--- a/docs/src/en/design/daemon/index.md
+++ b/docs/src/en/design/daemon/index.md
@@ -19,23 +19,88 @@ Manage local sandboxes through `pvisor-daemon`: one process accepts resource-bou
The Runtime trait has one implementation: VM-only NativeRuntime. Detached supervisors embed `pvisor::PVisor` with only VmExecutor and retain RunHandles across daemon restart. No host/OCI/pull fallback exists. The executable's `serve` command constructs NativeRuntime using required `--images-dir`/`--cgroup-root`; synchronous internal VM dispatch runs before Tokio, and the hidden supervisor command is dispatched. See [operations](operations.md#deployment).
-## Create and access {#task-flow}
+Responsibility convergence means assigning every node-local resource a clear owner, not merging every service into the daemon process: sandbox lifecycle, native immutable backing and unlosable live RAM have different authorities and failure boundaries. Shipping in one package, a unified entry point or fewer ports cannot substitute for the missing runtime adapters, and establishes neither faster startup, lower memory nor higher density. Define acquisition, cancellation, termination and pin-release contracts before wiring a new path, and evaluate through fixed-budget measurement; convergence does not establish live-VM takeover, shared cold-pool arbitration, automatic node acquisition or density advantages.
-1. Validate the image, argv, environment, metadata, hard CPU/memory limits and optional TTL. Reject unsupported controls before admission.
-2. Under registry serialization, check local capacity and durably insert a random `sb-*` identity, reservation and `Pending` record.
-3. Persist native preparation/identity, install identity-bound cgroup limits, place the child in that cgroup before exec, launch the detached supervisor and verify acknowledged live VM controls plus real service readiness.
-4. Persist `Running` only after native creation succeeds. Verified failed-create cleanup releases the record; uncertain cleanup retains its identity and reservation.
-5. Resolve supported service endpoints through the daemon. Inspect reconciles native state; deletion persists intent and confirms native absence before releasing capacity.
+## Admission and capacity accounting {#admission}
-This is sandbox management, not a task/result protocol. Private runtime records bind generation to native Run/Attempt IDs, but `sb-*` is not a public Job ID and the API does not expose Job review, checkpoints or Run Bundle export.
+Before creating native VMs, bound the total resources of accepted sandboxes on the node. The daemon admits by the sum of hard limits; it does not queue, choose hosts, or infer available capacity from low RSS samples.
+
+Creation must provide a local prepared-image key in `image.uri`, a non-empty argv, and a `resourceLimits` containing only `cpu` and `memory`. CPU accepts integer/decimal cores or millicores; memory accepts bytes and supported decimal/binary suffixes. Amounts must be positive, exactly representable and overflow-checked. An optional platform must match the local Linux architecture. Unsupported snapshot/template, resource requests, network policy, credential proxy, secure access, volumes, image auth, lifecycle hooks and non-empty extensions fail before native creation. Environment and metadata maps are bounded and validated.
+
+```json
+{
+ "image": {"uri": "prepared-agent-1.1.0"},
+ "entrypoint": ["sleep", "600"],
+ "resourceLimits": {"cpu": "500m", "memory": "256Mi"},
+ "timeout": 600,
+ "metadata": {"purpose": "local-example"}
+}
+```
+
+This is a request-shape example, not a validated image recipe; no image is pulled during creation.
+
+| Boundary | Admission rule |
+| --- | --- |
+| Sandbox count | Registry records must not exceed `max_sandboxes` |
+| CPU | The sum of `cpu_millis` over all records plus the new request must fit the configured capacity |
+| Memory | The sum of `memory_bytes` over all records plus the new request must fit the configured capacity |
+
+Serialized durable insertion is the reservation barrier: concurrent creations cannot double-spend capacity. Rejection returns `429 CAPACITY_EXCEEDED`; no pending allocation is produced. There are no tenant quotas or authenticated per-tenant resource accounts. Paused, Terminated, Failed and uncertain records keep their full CPU/memory/count charges until explicit deletion or verified failed-create cleanup. Pause does **not** release logical CPU.
+
+Logical admission totals, installed limits on each supervisor/VM tree and node-wide physical occupancy are different quantities. The daemon, helpers, caches and host need headroom beyond sandbox limits. There is no implicit CPU/RAM oversubscription, pressure-based admission or measured node-wide physical budget. Native [shared working sets](shared-working-set.md) do not authorize lowering daemon reservations.
+
+## Actual controls and physical memory {#reservations}
+
+For platform prerequisites (Linux x86_64, `/dev/kvm`, a delegated cgroup v2 hierarchy) and their checks, see the [operations guide](../../guides/daemon/index.md#prerequisites).
+
+The native supervisor embeds `pvisor::PVisor` in a separate child process outside the daemon's lifecycle, configures only `VmExecutor`, and holds the RunHandle. The sandbox cgroup limits the whole supervisor/VMM/helper tree: total CPU rate **10–8000 millicores**, hard memory, zero swap, `pids.max=512` and group OOM. vCPU count rounds the quota up (at most 8); guest RAM rounds down to MiB; the hard memory limit also covers host-side overhead. Full limit/readiness checks remain at create, Inspect and resume; endpoint resolution authenticates the live Running state and checks deletion fences, without repeating full health/cgroup checks per data request.
+
+The startup callback checks started/delete/tombstone markers under the owner lock and joins the identity-bound cgroup **before exec** through a pre-opened `cgroup.procs` FD. The supervisor verifies membership at startup and does not migrate already-running Tokio processes; supervisor/Tokio allocations and later VM/helper children all count toward the sandbox budget. Invoking the hidden command outside that cgroup fails closed.
+
+## Lifecycle controls {#control}
+
+Confirm node-local native state before reporting control completion or releasing resources. The daemon serializes operations per sandbox; operations on different sandboxes proceed independently.
+
+| Operation | Durable/native order | Response |
+| --- | --- | --- |
+| Create | Persist `Pending` and reservation → create/start → verify configuration and service readiness → persist `Running` | 202 JSON |
+| Pause | Query → persist `Pausing` → acknowledged vCPU pause → confirm Paused → persist `Paused` | 202 empty body |
+| Resume | Query → persist `Resuming` → acknowledged vCPU resume and readiness → confirm Running → persist `Running` | 202 empty body |
+| Delete | Persist `Stopping` → confirm native absence and hold the owner lock exclusively → publish tombstone → reclaim cgroup/private run storage → confirm Missing → durably remove the registry record | 204 |
+
+Pause/resume return the live state in an authenticated native acknowledgement; the daemon consumes it without a second post-control Inspect. When the target state is already observed, success may be returned without repeating native control; a native error is never a control success. Accepted lifecycle operations run in self-owned async tasks; HTTP disconnects do not cancel them. Losing a create response is not an idempotent-retry contract; blind resubmission may create another sandbox.
+
+Private IPC verifies same-UID peer, owner, sandbox ID, generation and a secret token; persistent identity binds the boot ID and cgroup device/inode. IDs are never reused or restarted. IPC loss means unknown, not Missing or cleanup evidence. Persistent delete intent and the supervisor's exclusive lock block late starts; cleanup uses identity-bound `cgroup.kill`, never stores PIDs or kills by PID, and releases capacity only after the cgroup is empty and the owner lock is released. A replaced or lost cgroup without persistent tombstone evidence under the same boot does not prove the object is absent.
+
+Cleanup uses ownership binding and does not depend on image/startup validation; a removed rootfs/firmware does not block it. The persistent tombstone supports retrying interrupted reclamation and ends with a minimal ID barrier. Cleanup errors retain the reservation. See [storage](storage.md#gc).
+
+## Expiration {#expiration}
+
+An omitted/null timeout means manual cleanup. A TTL is at least 60 seconds and bounded by the configured maximum (default one day, maximum one year). Renewal supplies a future RFC3339 time within the cap; an existing deadline must be extended, and expired or non-renewable states are rejected.
+
+Maintenance scans once per second with at most eight concurrent cleanup tasks. Cleanup rechecks expiration under the same lock as renewal, so a stale scan cannot delete a renewed sandbox. Pending delete intent is retained and retried after cleanup failures.
+
+TTL is best-effort cleanup, not a hard execution deadline. Slow native commands, upload/header waits and same-sandbox controls delay deletion. New proxy requests are rejected after expiration; established response streams have no total timeout. Maintenance stops while the daemon is down; stronger deadlines need independent host supervision.
+
+## Service access and concurrency {#endpoints}
+
+Only execd 44772 and egress 18080 are published. Endpoint discovery and every data request's endpoint resolution authenticate the live supervisor, require the current RunHandle to be Running, check deletion fences and resolve the current publication, without trusting persisted observation caches. Discovery returns a daemon-routed authority and does not expose supervisor loopback addresses. Resolution does not repeat service health probes or full cgroup reconciliation per data request. Create, Inspect and resume retain full configuration/readiness checks; upstream connection failures are handled by the API adapter and are not readiness evidence. Proxy connection establishment shares the lifecycle lock with control/deletion, so daemon-managed deletion or port reuse cannot race a connection.
+
+The proxy streams real upstream command/file/health/metrics traffic, including multipart and SSE. Upload plus response-header wait is capped at 120 seconds; established responses have no total timeout. WebSocket, CONNECT and arbitrary application ports are unsupported. Traffic/output quotas belong to the upstream services.
## Concurrency and failure boundaries {#documents}
The [registry commit lock](storage.md#commit) serializes capacity checks and durable mutations. A per-sandbox lifecycle lock orders controls and proxy connection establishment; slow VM operations do not hold a global runtime mutex. This keeps unrelated sandboxes moving while preventing two creations from spending the same reservation or a connection from racing daemon-managed deletion.
-Durable intentions and live observations have different authority. Persist `Stopping` before native deletion, and release capacity only after absence is confirmed. Lost IPC or an acknowledgement leaves work to reconcile; it cannot authorize a replacement VM or reusable capacity. A [daemon-only restart](state-and-recovery.md#reconcile) reconnects surviving supervisors using the same ownership state. Host reboot loses live VMs.
+Durable intentions and live observations have different authority. Persist `Stopping` before native deletion, and release capacity only after absence is confirmed. Lost IPC or an acknowledgement leaves work to reconcile; it cannot authorize a replacement VM or reusable capacity. A [daemon-only restart](storage.md#reconcile) reconnects surviving supervisors using the same ownership state. Host reboot loses live VMs.
+
+Conservative reservations trade utilization for explicit cleanup accounting: paused, failed and uncertain records remain charged until verified removal. Low RSS and native cache sharing do not reduce those reservations; admission and physical working-set accounting remain separate.
+
+## Independent execution semantics {#integration}
+
+Native pause/resume controls the same Attempt's live vCPUs through the RunHandle; it is not cgroup freeze, memory offload, checkpoint/restore or VM reconstruction. Admission accounting is retained. Execd forwarding is not Gateway routing, capture or inference-idle CPU release.
-Conservative reservations trade utilization for explicit cleanup accounting: paused, failed and uncertain records remain charged until verified removal. Low RSS and native cache sharing do not reduce those reservations; [admission](admission.md#reservations) and physical working-set accounting remain separate.
+Ordinary Jobs keep their independent [checkpoint/fork semantics](../execution-model.md). The daemon cannot stage/apply files, restore native VM state, acquire node backing or coordinate model responses. Wiring those paths requires explicit adapters with lifecycle/evidence contracts, not renaming the retired distributed control.
## Compatibility and evidence {#invariants}
@@ -43,4 +108,4 @@ The partial API profile is pinned to **OpenSandbox 1.1.0**, `release-1.1.0`, com
Native VM execution is wired in the runtime. Stage/apply, checkpoint/fork and offload APIs, Gateway inference-wait coordination and automatic node-resource acquisition are not implemented. Historical Cluster results do not validate daemon SDK conformance, performance or density; no node-wide physical-memory gain is established.
-Implementation ownership: `crates/pvisor-daemon/src/daemon/{models,store,mod,api}.rs`, `runtime.rs` and `main.rs`. The retired Cluster implementation is not this architecture.
+Implementation ownership: `crates/pvisor-daemon/src/daemon/{models,store,mod,api}.rs`, `crates/pvisor-daemon/src/runtime.rs` and `crates/pvisor-daemon/src/main.rs`. Validation and resource arithmetic live in `daemon/models.rs`; serialized reservation insertion and lifecycle orchestration in `daemon/mod.rs`; native KVM/cgroup preflight and controls in `runtime.rs`; streaming forwarding in `daemon/api.rs`. The retired Cluster implementation is not this architecture.
diff --git a/docs/src/en/design/daemon/lifecycle.md b/docs/src/en/design/daemon/lifecycle.md
deleted file mode 100644
index 5576de5f..00000000
--- a/docs/src/en/design/daemon/lifecycle.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Sandbox lifecycle
-
-Confirm local native state before reporting a completed control or releasing resources. The daemon serializes operations per sandbox, while unrelated sandbox operations can progress independently.
-
-## Creation and controls {#control}
-
-| Operation | Durable/native sequence | Response |
-| --- | --- | --- |
-| Create | Persist `Pending` and reservation → create/start → verify configuration and service readiness → persist `Running` | 202 JSON |
-| Pause | Inspect → persist `Pausing` → acknowledged vCPU pause → confirm Paused → persist `Paused` | 202 empty |
-| Resume | Inspect → persist `Resuming` → acknowledged vCPU resume and readiness → confirm Running → persist `Running` | 202 empty |
-| Delete | Persist `Stopping` → confirm native absence and exclusive owner lock → publish tombstone → reclaim cgroup/private run storage → confirm Missing → durably remove registry record | 204 |
-
-Pause/resume return the confirmed live state in the authenticated native acknowledgement; the daemon consumes it without issuing a second post-control Inspect. Resume confirmation includes readiness and enforcement checks. Lost acknowledgements or unexpected states retain the durable transition intention for reconciliation and do not prove that the control was unapplied.
-
-An already observed desired pause/resume state can return success without another native control. Native errors cannot be treated as successful controls. Accepted lifecycle operations run in owned asynchronous tasks: an HTTP disconnect does not cancel them. A lost create response is not an idempotent retry contract; blindly resubmitting can create another sandbox.
-
-Private IPC authenticates same-UID peers plus owner, sandbox ID, generation and secret token; durable identity binds boot ID and cgroup device/inode. IDs are never reused or relaunched. Lost IPC is uncertainty, not Missing or cleanup proof. Durable deletion intent and the supervisor exclusive lock fence late launch; cleanup uses identity-bound `cgroup.kill`, never a persisted PID or PID-based kill, and confirms an empty cgroup plus released lock before capacity release. Replaced or missing same-boot cgroups without durable tombstone proof do not prove absence.
-
-Cleanup uses ownership bindings rather than image/launch validation; removed rootfs/firmware do not prevent it. A durable tombstone makes interrupted cgroup/private-storage reclamation retryable; only a minimal ID fence remains. Cleanup errors retain reservations. See [storage](storage.md#gc).
-
-## Expiration {#expiration}
-
-Omitted/null timeout means manual cleanup. A TTL is at least 60 seconds and within the configured maximum (one day by default, configuration ceiling one year). Renewal supplies a future RFC3339 deadline within the maximum; an existing deadline must extend, and expired or nonrenewable states are rejected.
-
-Maintenance scans once per second and runs at most eight cleanup tasks concurrently. Cleanup rechecks expiration under the same lock as renewal, so a stale scan cannot delete a renewed sandbox. Pending deletion retries remain pending on failure.
-
-TTL is best-effort cleanup, not a hard execution deadline. Slow native commands, upload/header waits and same-sandbox controls can delay deletion. New proxy requests are refused after expiration; established streams have no total response timeout. Daemon downtime suspends maintenance, so independent host supervision is needed for a stronger deadline.
-
-## Service access and concurrency {#endpoints}
-
-Only execd port 44772 and egress port 18080 are published. Endpoint discovery and each data-request endpoint lookup authenticate the live supervisor, require current RunHandle Running state, check deletion fences and resolve a current publication; they do not trust a durable observation cache. Discovery returns a daemon-routed authority, not the supervisor's loopback address. Lookup does not repeat service health probes or full cgroup-limit reconciliation for every data request. Create, Inspect and resume retain full configuration/readiness checks; upstream connection failures are handled by the API adapter rather than treated as readiness proof. Proxy establishment shares the lifecycle lock with control/deletion, preventing daemon-managed deletion/port reuse while connecting. External runtime manipulation is outside that coordination.
-
-The proxy streams real upstream command/file/health/metrics traffic, including multipart and SSE. Upload plus response-header wait is capped at 120 seconds; established responses stream without a total timeout. WebSocket, CONNECT and arbitrary application ports are unsupported. Stream/output quotas belong to the upstream service.
-
-## Separate execution semantics {#integration}
-
-Native pause/resume controls live vCPUs through RunHandle on the same Attempt, not cgroup freeze, memory offload, checkpoint/restore or VM reconstruction. Admission charges remain. Execd forwarding is not Gateway routing, capture or inference-idle CPU release.
-
-Ordinary Jobs retain their own [checkpoint/fork semantics](../execution-model.md). The daemon cannot stage/apply changes, restore native VM state, acquire node backing or coordinate model replies. Adding those paths would require an explicit adapter and lifecycle/evidence contract, not renaming retired distributed controls.
-
-Lifecycle orchestration resides in `daemon/mod.rs`; native controls/readiness are in `runtime.rs`; streaming is in `daemon/api.rs`.
diff --git a/docs/src/en/design/daemon/operations.md b/docs/src/en/design/daemon/operations.md
index bf21a696..dc6d4e1e 100644
--- a/docs/src/en/design/daemon/operations.md
+++ b/docs/src/en/design/daemon/operations.md
@@ -4,7 +4,7 @@ Run a single-node sandbox service with the native VM runtime, private state and
## Deployment {#deployment}
-Requires Linux x86_64, usable `/dev/kvm`, trusted absolute paths and a writable delegated cgroup v2 hierarchy with enabled CPU/memory/PID controllers and `cgroup.kill`. Preflight checks real controller writes and the KVM API; there is no host, OCI command or registry-pull fallback.
+Platform prerequisites (Linux x86_64, `/dev/kvm`, a delegated cgroup v2 hierarchy) and how they are checked are documented in the [operations guide's prerequisites](../../guides/daemon/index.md#prerequisites).
Set `OPEN_SANDBOX_API_KEY` to a protected random secret of at least 32 bytes, not argv.
@@ -24,15 +24,13 @@ pvisor-daemon serve \
Keep state and runtime configuration compatible across restarts. Use TLS termination in a trusted reverse proxy before non-loopback exposure. Set `--public-endpoint` to the externally routed host:port authority; wildcard or ephemeral listeners require it. Automatic endpoint publication is not implemented.
-Keep runtime paths absolute and unchanged across daemon restarts. Use short state paths such as `/run/user/1000/pvd`: per-sandbox `control.sock` must be shorter than 104 bytes, and vsock Unix sockets also have path limits. Retain state; this `/run` example does not promise persistence across logout/reboot, and VMs cannot survive host reboot. `/sys/fs/cgroup/pvd` must be a real delegated hierarchy, not an ordinary directory.
+Runtime/state path absoluteness, length and persistence constraints are documented in the [operations guide's install and start](../../guides/daemon/index.md#install).
-An occupied version-1 `sandboxes.json` without the native `owner.json` marker is rejected under the existing exclusive store lock: it may still own live Podman containers. Use fresh native state while preserving and cleaning up the old deployment, or delete every sandbox through the old Podman daemon and confirm cleanup before switching backends with the emptied registry. Never erase registry entries, reservations or ownership state, or fabricate a native marker to bypass this guard. The native daemon neither adopts those containers as Missing nor silently releases their reservations.
-
-A v2 header is also rejected without `owner.json`, even with its intentionally empty `sandboxes` map. Preserve the native marker, header and private `records/` tree together; see [storage migration and activation](storage.md#migration).
+An occupied v1 registry or a v2 header without the native `owner.json` marker is rejected, even with an intentionally empty map: it may still own live Podman containers. Preserve the original ownership state; use fresh native state or clean up through the old Podman daemon before switching, and never erase records/reservations or fabricate markers. Rejection and migration rules live in [storage](storage.md#migration).
## Prepared image contract {#image-contract}
-Images are trusted local `images_dir/.json` manifests, not registry references. Fields are absolute independent Linux `rootfs` (never host `/` or overlapping daemon state), absolute guest bootstrap `entrypoint` argv, optional `cmd`, optional `env` and optional absolute firmware `library_dir`. Requested workload argv (or `cmd` if empty) is appended to `entrypoint`; request env overrides manifest env, without host environment inheritance or shell interpolation.
+Image manifest fields and environment semantics are documented in the [operations guide's prerequisites](../../guides/daemon/index.md#prerequisites).
The long-lived guest bootstrap must supervise workload, real OpenSandbox 1.1.0 execd and egress, initialize/authenticate services, forward signals and reap children. It must expose byte-transparent AF_VSOCK listeners on guest **CID 3**, ports **44772/18080**, bridging to real services. Supervisor loopback TCP publications connect through private Unix sockets and native vsock forwarding. A stock rootfs or sleeping process is insufficient.
@@ -77,4 +75,4 @@ Native OverlayNet supplies VM outbound networking; OpenSandbox network-policy re
## Evidence scope {#validation}
-Source tests cover fake-runtime admission/lifecycle/restart/TTL, HTTP auth/schemas/filtering/endpoints and pure runtime parsing/argv. They do not establish native isolation, SDK end-to-end compatibility or density gains. No build, test, native sandbox or benchmark was run for this documentation change. Prior distributed Cluster gates and measurements do not validate this daemon.
+Source tests cover fake-runtime admission/lifecycle/restart/TTL, HTTP auth/schemas/filtering/endpoints and pure runtime parsing/argv. They do not establish native isolation, SDK end-to-end compatibility or density gains. No build, test, native sandbox or benchmark validates the current daemon. Prior distributed Cluster gates and measurements do not validate this daemon.
diff --git a/docs/src/en/design/daemon/responsibility-convergence.md b/docs/src/en/design/daemon/responsibility-convergence.md
deleted file mode 100644
index 43e63d37..00000000
--- a/docs/src/en/design/daemon/responsibility-convergence.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Service responsibility convergence
-
-Reduce duplicated management by giving each local resource a clear owner, not by combining every service into the daemon process. Sandbox lifecycle, native immutable backing and indispensable live RAM have different authority and failure boundaries.
-
-## Current responsibilities {#roles}
-
-| Responsibility | Owner | Relationship to daemon |
-| --- | --- | --- |
-| Sandbox admission, intentions, expiration, endpoints | `pvisor-daemon` | Implemented by VM-only NativeRuntime with integrated executable/CLI |
-| Job/Attempt lifecycle, staging, Gateway and native VM checkpoints | `pvisor` Session/executors | VM execution embedded in supervisors; staging/Gateway/checkpoint APIs not exposed |
-| Immutable environment mounts and shared read-only RAM backing | Native node resource service (`pvisor/src/node.rs`) | Runtime protocols for native callers; no daemon acquire/release adapter |
-| Image preparation, publication, serving and reads | Independent `pvisor-cache` and runtime cache modules | Separate executable, data path and budgets; not absorbed by daemon |
-| Optional shared pages and session references | `pvisor-daemon/src/memory_pool.rs` | `serve --memory-pool` starts/reuses a detached `memory-pool --directory DIR` component; off by default |
-| Host selection, workflows and retry policy | External orchestration | Outside the product control plane |
-
-Node runtime protocols are available to embedded native callers. Its identity is an image handle/digest or sealed RAM identity/compatibility, not a sandbox ID. A connection pins one owner. Same-identity preparation is single-flight; active owner/session/preparation counts and warming are bounded. A process-local registry remains available where native callers do not configure a node socket.
-
-```mermaid
-flowchart TB
- Caller[Caller or external orchestration] --> Daemon[Sandbox daemon]
- Daemon --> Supervisor[Native pVisor VM supervisor]
- Supervisor --> Image[Prepared execd and egress image]
- Native[Native pVisor execution] --> Node[Native node resource service]
- Node --> Cache[Immutable cache and lazy reads]
- Node --> RAM[Shared read-only RAM backing]
- Daemon --> Pool[Optional detached shared-page pool]
- Supervisor --> Pool
-```
-
-There is deliberately no daemon-to-node arrow. Shared packaging, a common launch entry or fewer ports does not supply a missing runtime adapter or establish faster startup, lower memory or improved useful-work density.
-
-## Data authority and restart boundaries {#authority}
-
-| Object | What may be reclaimed? | Failure boundary |
-| --- | --- | --- |
-| Refetchable image/decoded blocks | Unpinned hot contents with a valid durable source | Hits do not replace publication authorization |
-| Active read-only RAM/FUSE owner | Idle warmth after active pins end, not active mounts | Durable source does not automatically recover a live VM after owner failure |
-| Private cold RAM transferred to pool | Not its only remaining copy | Lost sessions/pool contents may fail-stop dependent VMs |
-| Published checkpoints/evidence | Only through their own retention and GC roots | Native registry warmth cannot authorize deletion |
-| Daemon sandbox record | After confirmed native deletion | Normal daemon shutdown preserves supervisors/VMs and registry |
-
-A daemon-only restart preserves detached native supervisors/VMs and the configuration-bound pool component. It does not recover a failed pool or recreate its live pages. Restarting a backing owner or cold pool is a different operation and cannot promise transparent session reconnect. Keep pins until native runners are reaped; without lossless draining, wait for dependent VMs before upgrades. Do not infer live RAM reconstruction from a restored metadata file.
-
-## Budgets and concurrency {#budget}
-
-Native node configuration bounds owners, warm owners, sessions, preparations and retained cache payload. That payload counter aggregates content blocks, paged metadata and Linux decoded RAM; it excludes complete metadata, scratch, external references and kernel residency. The daemon pool has separate bounded page/object/connection/reference budgets, outside individual sandbox cgroups. They are not dynamically arbitrated against node caches or equal to a whole-process cap; see [pool budgets](../../guides/daemon/index.md#memory-pool).
-
-Reserve headroom for active objects and restoration before optional caches/prefetch. Under pressure, drop expendable warmth/refetchable contents or refuse new preparations, never the only live bytes. Slow teardown and I/O stay outside management map locks; same-identity serialization must retain authorization and compatibility checks.
-
-Daemon CPU/memory admission remains a separate conservative sum of supervisor/VM-tree hard limits. It has no combined physical-memory accounting with native node/pool resources. Host cgroup supervision and observations must include services and transient work, not only workloads.
-
-## Integration direction {#migration}
-
-1. Retain separate owners and failure scopes while obsolete distributed roles are retired.
-2. Before connecting the existing native runtime to node resources, define acquisition, private writable state, cancellation, native termination and pin release before sharing resources.
-3. Unify observations and controllable budgets only after distinguishing reservations, shared physical pages, evictable payload and indispensable RAM.
-4. Consider process merging only after explicit restart/drain and data-preservation contracts, followed by fixed-budget measurements.
-
-No live-VM takeover, shared cold-pool arbitration, automatic node acquisition or density advantage is established by consolidation. Native resource correctness evidence and legacy service experiments keep their original scope; they are not daemon acceptance results.
-
-The independent cache provides `prepare`, `publish`, `serve`, `list`, `stat` and `read`. Cache and node protocols have separate ownership from daemon sandbox lifecycle.
-
-Related contracts: [shared working sets](shared-working-set.md), [state and recovery](state-and-recovery.md), [native shared image storage](../shared-image-cache-storage.md) and [experimental pool](../memory-optimization/proof-of-concept.md).
diff --git a/docs/src/en/design/daemon/shared-working-set.md b/docs/src/en/design/daemon/shared-working-set.md
index f453d2e0..2c7e7b30 100644
--- a/docs/src/en/design/daemon/shared-working-set.md
+++ b/docs/src/en/design/daemon/shared-working-set.md
@@ -41,7 +41,7 @@ node memory = service overhead
Count physically shared pages once. Shared costs vary with revisions and access patterns; private costs grow with executions and write ratios. Disjoint accesses and many writes can eliminate gains. File copy-up, transfer blocks, read-ahead and COW may amplify requested bytes.
-Keep logical reservations, physical occupancy and reclaimable cache separate. Native node retained-payload accounting covers content blocks, paged metadata and decoded RAM, not complete metadata, scratch, external references or kernel pages. Kernel caps and whole-group observation remain necessary. None of this relaxes daemon [hard-limit admission](admission.md).
+Keep logical reservations, physical occupancy and reclaimable cache separate. Native node retained-payload accounting covers content blocks, paged metadata and decoded RAM, not complete metadata, scratch, external references or kernel pages. Kernel caps and whole-group observation remain necessary. None of this relaxes daemon [hard-limit admission](index.md#admission).
## Ownership and future connections {#integration}
@@ -67,4 +67,4 @@ Use at most four simultaneous real native guests, counting live source VMs; cap
The daemon pool is separate from node-backed restoration. Physical-pool loss fails dependent VMs; sealed-compressed clients retain delivered handles for local recovery and stop new publication; API restart retains the detached component but cannot recover failed pool contents. See [activation, ownership and limits](../../guides/daemon/index.md#memory-pool).
-Related designs: [responsibility convergence](responsibility-convergence.md), [shared image storage](../shared-image-cache-storage.md), [memory optimization](../memory-optimization/index.md) and [experimental cold RAM pool](../memory-optimization/proof-of-concept.md).
+Related designs: [daemon architecture](index.md), [shared image storage](../shared-image-cache-storage.md), [memory optimization](../memory-optimization/index.md) and [experimental cold RAM pool](../memory-optimization/proof-of-concept.md).
diff --git a/docs/src/en/design/daemon/state-and-recovery.md b/docs/src/en/design/daemon/state-and-recovery.md
deleted file mode 100644
index b69b32aa..00000000
--- a/docs/src/en/design/daemon/state-and-recovery.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Local state and restart recovery
-
-Restart with the same private state directory and compatible runtime configuration to retain native ownership and unresolved reservations. A stored state is the last durable observation, not proof that a VM survived.
-
-## Authority and identity {#authority}
-
-| State | Authority | Restart behavior |
-| --- | --- | --- |
-| Registry version and owner UUID | Durable daemon registry | Validate and retain the same owner |
-| Sandbox identity, image/argv/env/metadata, resources, TTL and endpoint token | Durable record | Preserve intentions, access identity and conservative capacity |
-| Running/Paused/Terminated | Native runtime observation | Inspect registered objects and update changed observations |
-| `Stopping` | Durable deletion intent | Retry delete; inspection cannot overwrite it |
-| Actual VM and service readiness | Native supervisor, VM controls, kernel cgroup and real services | Registry cannot recreate them |
-
-One daemon exclusively locks `daemon.lock`. Private IPC authenticates same-UID peers plus owner, sandbox ID, generation and secret token; durable identity binds boot ID and cgroup device/inode. IDs are never reused or relaunched. Lost IPC is uncertainty, not Missing or cleanup proof. Durable deletion intent and the supervisor exclusive lock fence late launch; cleanup uses identity-bound `cgroup.kill`, never a persisted PID or PID-based kill, and confirms an empty cgroup plus released lock before capacity release. Replaced or missing same-boot cgroups without durable tombstone proof do not prove absence.
-
-An occupied version-1 `sandboxes.json` without the native `owner.json` marker is rejected under the existing exclusive store lock: it may still own live Podman containers. Use fresh native state while preserving and cleaning up the old deployment, or delete every sandbox through the old Podman daemon and confirm cleanup before switching backends with the emptied registry. Never erase registry entries, reservations or ownership state, or fabricate a native marker to bypass this guard. The native daemon neither adopts those containers as Missing nor silently releases their reservations.
-
-A version-2 header without `owner.json` is rejected even though its `sandboxes` map is empty: that header activates private per-sandbox records, not an empty inventory. Restore original ownership state, never manufacture a marker. See [storage activation and migration](storage.md#migration).
-
-## Startup reconciliation {#reconcile}
-
-1. Open and validate the private registry, rejecting corrupt, oversized or incompatible contents rather than forgetting native ownership.
-2. Construct the runtime with the persisted owner. Only after its factory accepts that owner, initialize/migrate storage: commit owner-wrapped records and metadata, then atomically activate the v2 header. Until activation the v1 full snapshot remains authoritative. Complete native preflight after storage initialization and before API binding.
-3. Retry records with `Stopping`; inspect other registered sandboxes under their lifecycle lock.
-4. Map native Running/Paused/Stopped/Missing to `Running`/`Paused`/`Terminated`/`Failed`. A missing sandbox remains visible and reserved until explicit deletion.
-5. Report deferred reconciliation errors without inventing successful cleanup. Start maintenance to retry expired/pending deletion.
-
-Normal daemon shutdown leaves detached supervisors/VMs and records. Restart reconnects private IPC, not a recreated VM or new Attempt; loss of IPC preserves uncertainty. GET reconciles while list returns durable observations. Startup does not adopt unknown VMs or relaunch missing/crashed workloads; host reboot cannot retain a live VM.
-
-Cleanup validates durable owner/ID/generation and boot/cgroup bindings independently of launch resources: it does not require the original rootfs or firmware directory to remain present or guest argv/env/resource settings to pass launch validation. After proving native absence and acquiring the owner lock, it durably publishes `tombstone.json`, removes the empty owned cgroup and reclaims private run storage, live RAM backing, temporary overlays/specs, sockets and secret-bearing identity records and any legacy observation caches. A minimal directory retains the tombstone, owner lock and lifecycle markers to fence ID reuse. Interrupted reclamation resumes from the tombstone, including after cgroup removal; errors retain the reservation. Missing/replaced same-boot cgroups without this durable proof still do not authorize absence. See [storage](storage.md#gc).
-
-## Uncertainty and recovery {#failures}
-
-| Failure | Preserved boundary | Action |
-| --- | --- | --- |
-| Create fails, cleanup confirmed | Record/reservation removed | Diagnose image/runtime before another request |
-| Create cleanup uncertain | Failed record, ID in error, full reservation | Query/delete that ID; do not blindly resubmit |
-| Native inspect unavailable | No fabricated native state | Repair runtime access and query again |
-| Delete fails or absence unknown | `Stopping`, token/record and reservation retained | Restore runtime access and retry |
-| Registry commit uncertain | Storage-failed latch refuses subsequent registry access | Preserve state, repair storage, restart and reconcile |
-| Daemon down past TTL | No maintenance while down | Use host supervision if execution must end independently |
-
-The registry is an incrementally committed local inventory, not a complete execution history or business-effect ledger. Version 2 reconstructs it from the owner/header and validated per-sandbox records; it does not fall back to v1 when an activated records tree is corrupt or incomplete. Restart does not roll back external calls, restore lost RAM or provide cross-host failover. Consistent automated backup/native-state restore is not implemented; copying a live directory or deleting state is not a recovery procedure.
-
-The recovery path is implemented in `daemon/mod.rs`; registry validation and durability are in `daemon/store.rs`. See [storage](storage.md) and [operations](operations.md#runbook).
diff --git a/docs/src/en/design/daemon/storage.md b/docs/src/en/design/daemon/storage.md
index 0a285abc..73206f34 100644
--- a/docs/src/en/design/daemon/storage.md
+++ b/docs/src/en/design/daemon/storage.md
@@ -1,7 +1,29 @@
-# Daemon storage and reclamation
+# Daemon storage, recovery and reclamation
Keep durable sandbox intentions in a bounded local registry. The native runtime owns private per-sandbox run state; prepared services own workload files and streamed outputs. These stores are not a centralized pVisor evidence repository.
+Restart with the same private state directory and a compatible runtime configuration, preserving native ownership and unresolved reservations. Persisted state is the most recent durable observation; it does not prove a VM is still alive.
+
+## Authority and identity {#authority}
+
+| State | Authority | Restart behavior |
+| --- | --- | --- |
+| Registry version and owner UUID | Daemon's durable registry | Validate and retain the same owner |
+| Sandbox identity, image/argv/env/metadata, resources, TTL and endpoint tokens | Durable records | Retain intentions, access identity and conservative capacity |
+| Running/Paused/Terminated | Native runtime observation | Query registered objects and update changed observations |
+| `Stopping` | Durable delete intent | Retry deletion; queries cannot override it |
+| Actual VM and service readiness | Native supervisor, VM control, kernel cgroups and real services | The registry cannot rebuild them |
+
+## Startup reconciliation {#reconcile}
+
+1. Open and validate the private registry; reject corrupt, over-limit or incompatible content instead of continuing startup by forgetting native ownership.
+2. Construct the runtime with the persisted owner. Storage initializes/migrates only after the factory accepts that owner: commit records and metadata with the owner envelope, then activate the v2 header atomically. Before activation the complete v1 snapshot remains authoritative. Native preflight checks run after storage initialization and before binding the API.
+3. Retry `Stopping` records; query other registered sandboxes under their lifecycle locks.
+4. Map native Running/Paused/Stopped/Missing to `Running`/`Paused`/`Terminated`/`Failed`. Missing sandboxes stay visible and reserved until explicitly deleted.
+5. Report deferred reconciliation errors without fabricating cleanup success. Startup maintenance retries expired/delete-pending objects.
+
+A normal daemon shutdown preserves detached supervisors/VMs and records. Restart reconnects over private IPC without rebuilding VMs or minting new Attempts; IPC loss preserves an uncertain state. GET reconciles; list returns persisted observations. Startup neither adopts unknown VMs nor restarts missing/crashed workloads; a host reboot does not preserve live VMs.
+
## Private registry {#metadata}
```text
@@ -24,7 +46,7 @@ Records retain image/argv, environment, metadata, CPU/memory reservation, creati
Runtime state additionally retains private `owner.json`, per-sandbox `preparing.json`/`identity.json`, `run.json` (generation/Run/Attempt IDs), lifecycle markers, owner lock, `control.sock`, `ports/` bridges and `run/` native storage, including `live-ram` backing and `tmp/` scratch (set as supervisor `TMPDIR`). A completed cleanup retains only its minimal tombstone/lock/marker fence. These support reconciliation/cleanup, not a public stage/checkpoint/artifact API.
-Native runtime does not write `observation.json` caches or use them as liveness proof. Endpoint lookup authenticates the live supervisor and checks current Running state and deletion fences; full readiness checks remain at create, Inspect and resume. See [service access](lifecycle.md#endpoints).
+Native runtime does not write `observation.json` caches or use them as liveness proof. Endpoint lookup authenticates the live supervisor and checks current Running state and deletion fences; full readiness checks remain at create, Inspect and resume. See [service access](index.md#endpoints).
## Commit barrier {#commit}
@@ -46,10 +68,25 @@ NativeRuntime rejects occupied v1 state without `owner.json` before migration, a
Persist deletion intent before native removal. Only confirmed native absence permits durable record removal and release of CPU/memory/count charges. Pending deletion, uncertain creation and missing-native Failed records are not opportunistically evicted to make room.
-Cleanup validates durable owner/ID/generation and boot/cgroup bindings independently of launch resources: it does not require the original rootfs or firmware directory to remain present or guest argv/env/resource settings to pass launch validation. After proving native absence and acquiring the owner lock, it durably publishes `tombstone.json`, removes the empty owned cgroup and reclaims private run storage, live RAM backing, temporary overlays/specs, sockets and secret-bearing identity records and any legacy observation caches. A minimal directory retains the tombstone, owner lock and lifecycle markers to fence ID reuse. Interrupted reclamation resumes from the tombstone, including after cgroup removal; errors retain the reservation. Missing/replaced same-boot cgroups without this durable proof still do not authorize absence.
+Cleanup validates durable owner/ID/generation and boot/cgroup bindings independently of launch resources: it does not require the original rootfs or firmware directory to remain present or guest argv/env/resource settings to pass launch validation. After proving native absence and acquiring the owner lock, it durably publishes `tombstone.json`, removes the empty owned cgroup and reclaims private run storage, live RAM backing, temporary overlays/specs, sockets and secret-bearing identity records and any legacy observation caches.
+
+A minimal directory retains the tombstone, owner lock and lifecycle markers to fence ID reuse. Interrupted reclamation resumes from the tombstone, including after cgroup removal; errors retain the reservation. Missing/replaced same-boot cgroups without this durable proof still do not authorize absence.
Deleting a sandbox does not undo remote effects or provide a retained evidence bundle. Externally provisioned image manifests/rootfs/firmware are not deleted by sandbox cleanup. The daemon API has no stage review/apply, artifact retention/download or external object-GC protocol. Do not remove native resources or registry state independently as recovery.
-Native immutable cache/snapshot stores retain separate publication, integrity, pin and GC contracts; see [shared image storage](../shared-image-cache-storage.md) and [responsibility convergence](responsibility-convergence.md#authority). No daemon-to-node storage bridge is implemented.
+## Uncertainty and recovery {#failures}
+
+| Failure | Retained boundary | Action |
+| --- | --- | --- |
+| Creation failed, cleanup confirmed | Record/reservation removed | Investigate the image/runtime before requesting again |
+| Create cleanup uncertain | Failed record, ID from the error, full reservation | Query/delete that ID; do not blindly resubmit |
+| Native query unavailable | No fabricated native state | Restore runtime access and query again |
+| Delete failed or absence unknown | `Stopping`, tokens/records and reservation retained | Restore runtime access and retry |
+| Registry commit uncertain | Storage-failed marker rejects further registry access | Retain state, repair storage, restart to reconcile |
+| Daemon down beyond TTL | No maintenance while down | Independent termination requirements belong to host supervision |
+
+The registry is an incrementally committed local inventory, not a complete execution history or business side-effect ledger. Version 2 rebuilds the inventory from the owner/header and validated per-sandbox records; a corrupt or incomplete activated record tree does not fall back to v1. Restart does not roll back external calls, restore lost RAM or provide cross-host failover. Automatic consistent backup/native-state restoration is unimplemented; copying a live directory or deleting state is not a recovery procedure.
+
+Native immutable cache/snapshot stores retain separate publication, integrity, pin and GC contracts; see [shared image storage](../shared-image-cache-storage.md). No daemon-to-node storage bridge is implemented.
-Implementation: `daemon/store.rs` owns per-record publication, budget accounting and v1 activation; `daemon/mod.rs` owns reservation and deletion ordering.
+Implementation: `daemon/store.rs` owns per-record publication, budget accounting and v1 activation; `daemon/mod.rs` owns reservation, deletion ordering and the recovery path.
diff --git a/docs/src/en/design/decisions/0001-plan-and-evidence.md b/docs/src/en/design/decisions/0001-plan-and-evidence.md
deleted file mode 100644
index 6eb3d66f..00000000
--- a/docs/src/en/design/decisions/0001-plan-and-evidence.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0001: A plan cannot prove that controls were installed {#adr-0001}
-
-**Status: implementation backfill.** This records the existing contract without inferring independent maintainer approval.
-
-**Context.** Before launch, pVisor can plan how a requested policy should be implemented. Permissions, platforms, and startup failures can prevent installation.
-
-**Options.** Let plans assert enforcement, or wait for executor observations.
-
-**Current choice.** Admission plans reach at most `Planned`; executor observations supply actual enforcement evidence. The Run Bundle retains requests, plans, and observations. See [Evidence design](../../concepts/capabilities-and-evidence.md).
-
-**Consequences.** Automation must inspect actual observations, and platform adapters must report installation outcomes. Task completion or a configuration field does not replace that evidence.
diff --git a/docs/src/en/design/decisions/0002-capture-and-replay.md b/docs/src/en/design/decisions/0002-capture-and-replay.md
deleted file mode 100644
index a0e2a64b..00000000
--- a/docs/src/en/design/decisions/0002-capture-and-replay.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0002: Capture and replay have separate data responsibilities {#adr-0002}
-
-**Status: implementation backfill.** This records the existing contract without inferring independent maintainer approval.
-
-**Context.** Running tasks, recording model traffic, and restoring native agent context require different protocols and dependencies.
-
-**Options.** Put every protocol in the execution core, or exchange explicit records across independent components.
-
-**Current choice.** Gateway owns model traffic capture and routing; Replay consumes native agent trajectories and re-executes tools; the execution core maintains Run lifecycle and shared records. Gateway is an optional feature, and Replay has a separate crate and command. See [Replay design](../replay.md).
-
-**Consequences.** Users can use execution and staging alone. Capture journals and native trajectories must be collected separately; new agent integrations primarily belong in the Replay adapter boundary.
diff --git a/docs/src/en/design/decisions/0003-explicit-safe-executor.md b/docs/src/en/design/decisions/0003-explicit-safe-executor.md
deleted file mode 100644
index f14f7f6e..00000000
--- a/docs/src/en/design/decisions/0003-explicit-safe-executor.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0003: Safe expresses requirements while executor selection stays explicit {#adr-0003}
-
-**Status: implementation backfill.** This records the existing contract without inferring independent maintainer approval.
-
-**Context.** Users choose executors for speed, Linux userspace, or kernel isolation while expecting their file and network policies to take effect.
-
-**Options.** Safe could silently select an executor, or impose requirements on the chosen executor.
-
-**Current choice.** `--safe` configures staging, file access, environment, and related settings without selecting an executor. Missing required controls cause startup rejection. See [Network policies](../../guides/policies/network.md) for network paths.
-
-**Consequences.** Identical arguments can encounter capability errors on different machines. Install the prerequisites or explicitly select an executor that meets the requirements; reviewers inspect the Bundle for the outcome.
diff --git a/docs/src/en/design/decisions/0004-human-semspec-approval.md b/docs/src/en/design/decisions/0004-human-semspec-approval.md
deleted file mode 100644
index f27bd9a8..00000000
--- a/docs/src/en/design/decisions/0004-human-semspec-approval.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0004: Passing a test and approving a commitment are separate actions {#adr-0004}
-
-**Status: existing contribution rule backfill.** This records the existing contract without inferring independent maintainer approval.
-
-**Context.** A passing test establishes one successful verification. A public commitment also needs human judgment about scope and conditions.
-
-**Options.** Automatically approve passing cases, or retain a separate human review step.
-
-**Current choice.** AI and contributors can draft cases, fix implementations, and maintain runner tests. Humans maintain `semspec approve`, `revoke`, real `REVIEWED.toml` ledgers, and `.approved/` snapshots. Existing checks and xfail annotations must not be weakened to obtain PASS. See [Testing and semspec](../../community/testing.md).
-
-**Consequences.** Reviews consider claims, execution results, and human approval records together. Green tests do not automatically expand support.
diff --git a/docs/src/en/design/decisions/0005-rust-vm-api.md b/docs/src/en/design/decisions/0005-rust-vm-api.md
deleted file mode 100644
index b4bf5c24..00000000
--- a/docs/src/en/design/decisions/0005-rust-vm-api.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0005: Keep VM backend differences inside one Rust runtime {#adr-0005}
-
-**Status.** Implementation backfill; this records the implemented boundary, not independent maintainer approval.
-
-**Context.** VM configuration, device customizations and snapshots were split between pVisor and multiple libkrun crates. C contexts, borrowed raw pointers and public backend structs made ownership and platform differences leak into consumers.
-
-**Options.** Retain an external C context ABI and vendored component crates, or consolidate private runtime modules behind one Rust contract.
-
-**Current choice.** `pvisor-vm` compiles the core modules together. Only `api` is public; portable structs and traits define every public method signature without conditional compilation or default implementations. Private adapters implement those traits. Architecture layout and hypervisor behavior have separate internal traits; callers receive explicit unsupported errors and inspect capabilities. Firmware data ABI and OS FFI remain private.
-
-**Migration and consequences.** Executor, shim, snapshot/checkpoint/pager, examples and the init benchmark use the new API. Hardware/device tests move inside the crate. Static kernel packing belongs to the runtime. Old core crate dependencies and VM control C functions are removed; existing evidence identifiers and serialized snapshot fields remain compatible. Uniform API shape does not promise cross-architecture restore. `api_contract` and `repository_boundary` guard the boundary; native tests and target compile checks supply distinct evidence. See [development](../../community/development.md) and the [runtime contract](https://github.com/deeplink-org/pvisor/blob/main/crates/pvisor-vm/README.md).
diff --git a/docs/src/en/design/decisions/0006-stage-snapshot.md b/docs/src/en/design/decisions/0006-stage-snapshot.md
index cb427c90..3ece0e90 100644
--- a/docs/src/en/design/decisions/0006-stage-snapshot.md
+++ b/docs/src/en/design/decisions/0006-stage-snapshot.md
@@ -25,4 +25,4 @@ Keep existing full-environment formats readable. New manifests/profiles distingu
Hold stage/RAM fixed while increasing the base: warm save/fork must not traverse or copy an unchanged base. Then vary stage bytes, entry count, large-file copy-up, and 1/8/64 branches. Preserve branch isolation, deletion/metadata/hardlinks, open handles, dependency GC, corruption rejection, and failed-publication contracts. Budgets such as 100 ms must state size, preparation, durability, and first-useful-work boundaries; this record makes no latency commitment.
-The runtime retains one public `api`, uniform cross-platform traits/structs, and private backend implementations. Image resolution, base pins, and store publication stay outside the VMM. See the [current full-environment implementation](../environment-snapshot.md), [OverlayCore](../overlayfs.md), and [ADR 0005](0005-rust-vm-api.md#adr-0005).
+The runtime retains one public `api`, uniform cross-platform traits/structs, and private backend implementations. Image resolution, base pins, and store publication stay outside the VMM. See the [current full-environment implementation](../environment-snapshot.md) and [OverlayCore](../overlayfs.md).
diff --git a/docs/src/en/design/decisions/0007-shared-filesystem-service.md b/docs/src/en/design/decisions/0007-shared-filesystem-service.md
deleted file mode 100644
index 47392b1c..00000000
--- a/docs/src/en/design/decisions/0007-shared-filesystem-service.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# 0007: Share file services between host FUSE and virtio-fs {#adr-0007}
-
-**Status: implementation backfill.** Records current source responsibilities without new formal approval or performance claims.
-
-## Context {#context}
-
-Host staging serves files through host FUSE; VMs request files through guest virtio-fs. Layer lookup, policy, copy-up, preimages and lazy-lower reads need identical semantics. Inodes, handles, credentials and queue completion depend on each protocol entry.
-
-## Alternatives and choice {#decision}
-
-Options include duplicating file semantics in both adapters, routing VM requests through host FUSE, or calling a shared service directly. The implementation chooses the third: `pvisor-overlay-core::service::FilesystemService` owns OverlayCore and is called directly by host FUSE and VM virtio-fs. It unifies local-file and immutable-image backend reads.
-
-The service accepts file operations, paths and backing identities rather than `fuser::Reply*`, virtqueue descriptors or guest RAM pointers. Adapters retain protocol inodes/handles, permission translation, operation guards and completion publication. VMs require no intermediate `/dev/fuse` mount.
-
-## Consequences {#consequences}
-
-File semantics have one implementation, while the two entries retain platform and concurrency differences. virtio-fs workers hold RAM leases until used-ring publication, and freezing drains in-flight I/O. Shared-service content reads should not hold whole protocol handle-table locks. Lazy-lower copy-up or full export can still materialize unread content; interface reuse does not establish end-to-end speedups.
-
-## Implementation and scope {#implementation}
-
-Source entries are `crates/pvisor-overlay-core/src/service.rs`, `crates/pvisor-overlayfs/src/fs.rs`, `crates/pvisor-vm/src/devices/virtio/fs/`, and `crates/pvisor/src/image/cache/backend.rs`, `direct.rs`, `lazy.rs`. `pvisor-overlay-core` has not yet migrated to a sole `api` entry. Shared file services and API-visibility migration remain separate concerns.
-
-[Filesystem subsystem](../overlayfs.md#filesystem-service) owns request paths, layouts and existing measurement scope; [VM subsystem](../vm-runtime.md#virtio) owns mapping lifetimes.
diff --git a/docs/src/en/design/decisions/0008-host-guest-control-authority.md b/docs/src/en/design/decisions/0008-host-guest-control-authority.md
deleted file mode 100644
index ccd2d1b4..00000000
--- a/docs/src/en/design/decisions/0008-host-guest-control-authority.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# 0008: Separate Host and Guest control authority {#adr-0008}
-
-**Status: implementation backfill.** Records current protocol and ownership boundaries without expanding platform-validation scope.
-
-## Context {#context}
-
-Guests report state, receive directives and participate in checkpoint quiescence. Host callers manage Jobs, VMs, stages and supervisors. Their trust scopes differ, so guest cooperation credentials cannot grant host lifecycle authority.
-
-## Alternatives and choice {#decision}
-
-Host operations could be added to Guest `Hello`/`Sync`, or use separate endpoints, schemas and credentials. The implementation chooses separation: Guest AgentCtl retains workload cooperation, while Host envelopes carry typed host requests whose endpoint owners validate Job/Attempt/generation and authority.
-
-The CLI Job listener accepts requests under a private same-UID authority root, handing off through separate tickets and worker channels. Native daemon supervisors use Host envelopes with owner/token credentials, not Guest tokens or CLI worker tickets. Shared Core defines envelopes and validation; implementations retain CLI DTOs and transport.
-
-## Consequences {#consequences}
-
-Bundle `agentctl` state still describes Guest cooperation, not Host authorization receipts. Both protocols currently use version 1, but are not interchangeable. CLI worker schema, package version and executable digest jointly determine internal compatibility; old listeners/supervisors follow their drain-and-upgrade contract.
-
-Host `request_id` provides correlation rather than durable deduplication for every command. Timeout or cancellation requires reconciling Job state and effects. Private directories and same-UID peer checks define host trust scope rather than isolating all other same-UID processes. macOS identity/descendant cleanup and real VM TUI paths retain the documented validation gaps.
-
-## Implementation and scope {#implementation}
-
-Source entries: `crates/pvisor-core/src/host_protocol.rs`, `protocol.rs`; `crates/pvisor-cli/src/cli/host_service.rs`, `host_fds.rs`; `crates/pvisor/src/runtime/host_transport.rs`, `supervisor.rs`, `instance_control.rs`.
-
-[Host/Guest AgentCtl](../architecture.md#host-agentctl) owns detailed authority and upgrades, the [Protocol matrix](../records-and-versions.md#control-protocols) lists versions, and [Failure semantics](../failure-semantics.md#idempotency) explains disconnects and retries.
diff --git a/docs/src/en/design/decisions/index.md b/docs/src/en/design/decisions/index.md
index 639a7e2f..681fbbc9 100644
--- a/docs/src/en/design/decisions/index.md
+++ b/docs/src/en/design/decisions/index.md
@@ -4,14 +4,14 @@ ADRs retain context, alternatives and consequences. Subsystem articles own curre
| Number | Decision | Boundary or cost retained | Record status |
| --- | --- | --- | --- |
-| 0001 | [Separate plans from installed-control evidence](0001-plan-and-evidence.md) | Plans reach Planned; consumers still inspect observations | Implementation backfill |
-| 0002 | [Separate capture and replay](0002-capture-and-replay.md) | Execution works independently; model capture and native trajectories are collected separately | Implementation backfill |
-| 0003 | [Keep executor selection explicit under safe](0003-explicit-safe-executor.md) | Reject missing controls; platform prerequisites remain | Implementation backfill |
-| 0004 | [Human approval of semantic commitments](0004-human-semspec-approval.md) | Test results and product commitments receive separate review | Existing contribution rule backfill |
-| 0005 | [One Rust VM crate and trait API](0005-rust-vm-api.md) | Private backends; uniform declarations do not promise cross-architecture restore | Implementation backfill |
+| 0001 | Separate plans from installed-control evidence | Plans reach Planned; consumers still inspect observations | Implementation backfill |
+| 0002 | Separate capture and replay | Execution works independently; model capture and native trajectories are collected separately | Implementation backfill |
+| 0003 | Keep executor selection explicit under safe | Reject missing controls; platform prerequisites remain | Implementation backfill |
+| 0004 | Human approval of semantic commitments | Test results and product commitments receive separate review | Existing contribution rule backfill |
+| 0005 | One Rust VM crate and trait API | Private backends; uniform declarations do not promise cross-architecture restore | Implementation backfill |
| 0006 | [Snapshot stages and reuse immutable bases](0006-stage-snapshot.md) | Bases require validation and pins; historical standalone CLI profiles differ from current Job interfaces | accepted; retains the original 2026-10-04 status |
-| 0007 | [Share file services between host FUSE and virtio-fs](0007-shared-filesystem-service.md) | Shared semantics; adapters retain protocol state and concurrency | Implementation backfill |
-| 0008 | [Separate Host and Guest control authority](0008-host-guest-control-authority.md) | Separate credentials/endpoints; internal Host protocols require exact compatibility | Implementation backfill |
+| 0007 | Share file services between host FUSE and virtio-fs | Shared semantics; adapters retain protocol state and concurrency | Implementation backfill |
+| 0008 | Separate Host and Guest control authority | Separate credentials/endpoints; internal Host protocols require exact compatibility | Implementation backfill |
Implementation backfill means the choice can be checked against source or existing contribution rules, without new maintainer approval. ADR 0006 retains its independent record's accepted status; its old CLI and measurements remain historical artifacts. [Environment snapshots](../environment-snapshot.md) and [Job checkpoints](../job-checkpoint-cli.md#10-当前实现与验收边界) define current behavior.
diff --git a/docs/src/en/design/environment-snapshot.md b/docs/src/en/design/environment-snapshot.md
index e83a0b95..62824cd4 100644
--- a/docs/src/en/design/environment-snapshot.md
+++ b/docs/src/en/design/environment-snapshot.md
@@ -51,7 +51,7 @@ The former save maps to suspend; resume continues the current head, while fork -
The [single-node daemon](daemon/index.md) uses native VM execution, but does not implement capture/restore APIs. Its pause/resume is acknowledged live vCPU control on the same Attempt, not cgroup freeze or a snapshot. Snapshot, checkpoint/fork, stage/apply and offload APIs remain absent. Do not use retired Cluster controls as snapshot entries.
-Native node backing ownership remains separate from daemon lifecycle; see [responsibility convergence](daemon/responsibility-convergence.md).
+Native node backing ownership remains separate from daemon lifecycle; see the [daemon architecture](daemon/index.md).
## Historical evidence {#historical-evidence}
diff --git a/docs/src/en/design/experimental/agent-io-completion/index.md b/docs/src/en/design/experimental/agent-io-completion/index.md
index 92ad3c1e..2726efaa 100644
--- a/docs/src/en/design/experimental/agent-io-completion/index.md
+++ b/docs/src/en/design/experimental/agent-io-completion/index.md
@@ -1,4 +1,4 @@
-# EXP-003 (restricted PoC): Agent asynchronous I/O and completion queues
+# Agent asynchronous I/O and completion queues (EXP-003)
Let pVisor own the inputs, execution and results of downloads, model calls and bulk writes. After submitting work, the guest can compute further or offload memory when the whole guest is waiting. The host continues I/O, retains completion results, and lets the existing Attempt owner resume the guest and deliver them.
diff --git a/docs/src/en/design/experimental/guest-stage-cache/index.md b/docs/src/en/design/experimental/guest-stage-cache/index.md
index 9c0f2992..fadb7c89 100644
--- a/docs/src/en/design/experimental/guest-stage-cache/index.md
+++ b/docs/src/en/design/experimental/guest-stage-cache/index.md
@@ -1,4 +1,4 @@
-# EXP-002 (design stage): guest kernel filesystem cache and deferred backend binding
+# Guest kernel filesystem cache and deferred backend binding (EXP-002)
Let the guest kernel use a versioned filesystem view to complete cached path resolution, attribute queries and ordinary read-only open locally. Call the VMM for missing data, stage mutations and durability. The host retains authoritative stage, baseline observation, access policy, review/apply and restoration state.
@@ -29,7 +29,7 @@ File traversal and tool initialization repeatedly resolve paths, query attribute
Identify requests the guest kernel can complete from a stable view by supplying immutable-lower metadata and protocol-managed stage state, while preserving host mutation, authorization and durability ownership. Traversal, open/fstat/close and mixed stage views expose metadata delivery, open lifetime and cache coherence as separate problems.
-The existing [Writeback comparison](../../filesystem-performance-analysis.md#writeback-ab) supports improvement for that write workload with writeback disabled, without detected full-task acceleration. This proposal targets structural metadata/open costs and requires independent end-to-end evidence. Writeback, copy-up and durability costs still need separate diagnosis.
+The existing [Writeback comparison](../../../lab-notes/filesystem-performance-analysis.md#writeback-ab) supports improvement for that write workload with writeback disabled, without detected full-task acceleration. This proposal targets structural metadata/open costs and requires independent end-to-end evidence. Writeback, copy-up and durability costs still need separate diagnosis.
### 1.2 Foundations and design gaps
@@ -291,7 +291,7 @@ Existing control owners continue to schedule quiescence, seal and snapshot. Thes
The host trims invisible paths, protected aliases and object grants before metadata delivery. Mode/owner/ACL/xattr inputs must be complete. Preserve raw path bytes; symlinks cannot request arbitrary host paths. Content digests do not grant cross-tenant access.
-Guest Linux checks permissions locally; VMM still validates host-recognized authorization for data/mutations. Session tokens, guest uid and mutation lists cannot replace Host-control credentials or alter host permission ledgers. See [Host/Guest authority](../../decisions/0008-host-guest-control-authority.md).
+Guest Linux checks permissions locally; VMM still validates host-recognized authorization for data/mutations. Session tokens, guest uid and mutation lists cannot replace Host-control credentials or alter host permission ledgers (Host/Guest authority separation).
Profiles requiring per-operation host policy/audit callbacks exclude local open. Policy changes revoke new cache admission and coordinate references; resume only after rebuilding permission/retention contracts.
diff --git a/docs/src/en/design/experimental/index.md b/docs/src/en/design/experimental/index.md
index 1b3f184c..9e2921d8 100644
--- a/docs/src/en/design/experimental/index.md
+++ b/docs/src/en/design/experimental/index.md
@@ -1,4 +1,4 @@
-# pVisor experimental features
+# Experimental features
Register implementable, verifiable capabilities that support higher execution density and lower supervision cost. Designs, implementation plans and validation records live here. Feature code stays in existing crates, and measurements stay with the benchmark registry.
diff --git a/docs/src/en/design/experimental/vcpu-idle-offload/index.md b/docs/src/en/design/experimental/vcpu-idle-offload/index.md
index bc1fca51..0bf96997 100644
--- a/docs/src/en/design/experimental/vcpu-idle-offload/index.md
+++ b/docs/src/en/design/experimental/vcpu-idle-offload/index.md
@@ -1,4 +1,4 @@
-# EXP-001 (observation prototype): vCPU idle observation and automatic RAM offload
+# vCPU idle observation and automatic RAM offload (EXP-001)
| Item | Current status |
|---|---|
diff --git a/docs/src/en/design/gateway.md b/docs/src/en/design/gateway.md
index 81f846d6..32430461 100644
--- a/docs/src/en/design/gateway.md
+++ b/docs/src/en/design/gateway.md
@@ -50,7 +50,9 @@ delegated; WebSocket transport retains its explicit unsupported response.
Journal positions express commit order; stable event IDs support idempotent retries; causal references express known dependencies. Run and embedded Gateway share a Journal. Story workers commit facts before updating Story/SessionIndex and notifying observers. Observer failure does not roll back committed facts.
-Startup reconstructs projections from committed facts without replaying HTTP requests, repeating observer notifications or rewriting logs. The bounded input queue remains best effort; only a Journal receipt proves durability. `spawn_apply` uses nonblocking bounded admission; direct `apply` waits for admission to the same FIFO. Acceptance is not durability, and cancellation after admission does not cancel the owned job. Flush waits behind accepted jobs and the backfills they await, reporting rejected/failed work; it neither fences producers still admitting new work nor acts as a rejected-event diagnostic-writer barrier. Subagent link backfills flow to the main story; same-story backfills execute directly under the owner instead of waiting on their own mailbox. A missing backfill receipt is a capture gap. Shutdown stops admission, drains accepted tails/backfills and persists final projections/index even when another story reports a gap; consumers then release the Journal.
+Startup reconstructs projections from committed facts without replaying HTTP requests, repeating observer notifications or rewriting logs. The bounded input queue remains best effort; only a Journal receipt proves durability. `spawn_apply` uses nonblocking bounded admission; direct `apply` waits for admission to the same FIFO. Acceptance is not durability, and cancellation after admission does not cancel the owned job.
+
+Flush waits behind accepted jobs and the backfills they await, reporting rejected/failed work; it neither fences producers still admitting new work nor acts as a rejected-event diagnostic-writer barrier. Subagent link backfills flow to the main story; same-story backfills execute directly under the owner instead of waiting on their own mailbox. A missing backfill receipt is a capture gap. Shutdown stops admission, drains accepted tails/backfills and persists final projections/index even when another story reports a gap; consumers then release the Journal.
Failed prepared backfills retain `prepared_story` (the target StoryContext) and `prepared_record_json`, including the stamped event ID and timestamp. Recovery submits that retained record to the target story's same bounded owner, bypassing preparation and Run re-enrichment so an already-matched link is not lost or assigned a fresh identity. Capture-level filtering and sensitive-body redaction still apply to retained payloads. Entries without `prepared_story` remain legacy source-event retries through ordinary `apply`; diagnostics are retry input, not proof of a Journal commit.
diff --git a/docs/src/en/design/index.md b/docs/src/en/design/index.md
index 26ca2e43..1c32c9e2 100644
--- a/docs/src/en/design/index.md
+++ b/docs/src/en/design/index.md
@@ -1,4 +1,4 @@
-# pVisor design and underlying mechanisms
+# How pVisor works
Letting an Agent work continuously means entrusting a system with processes, file changes, network requests and memory state. Once the task starts, a developer needs to know what it can access, which state can survive an interruption, and which results to accept. Running many tasks adds another question: which contents can be stored once, and which costs necessarily grow with task count?
@@ -12,12 +12,7 @@ The runtime organizes an execution as a Session: admission resolves effective co
Files and networks have different publication behavior. File changes can remain in a private upper until someone accepts them; a request sent to a remote service may already have produced an effect. File apply is consequently a separate publication action, while execution controls must act before requests leave. Examining logs afterwards cannot replace runtime restrictions.
-| Layer | Main owner | Question it must answer |
-| --- | --- | --- |
-| User and service entry | `pvisor-cli`, embedded applications, `pvisor-daemon` | Who requests an operation, which execution is targeted, and how do cancellation and results travel? |
-| Execution lifecycle | `pvisor` Job service and Session | Who owns the Attempt and dispatches, cleans up, saves and publishes its terminal state? |
-| Execution and access paths | Host/OCI/VM executors, OverlayCore, OverlayNet | Which kernel or device processes a request, and where does authorization take effect? |
-| State and facts | Snapshot store, image cache, Journal, apply ledger | Which contents are immutable, who holds references, and how is failure reconciled? |
+The layer-to-crate mapping for requests, Attempt ownership and state lives in the ownership tables in [Core architecture](architecture.md). The walkthrough below connects the layers through one task.
The separate daemon embeds the runtime in a supervisor for each sandbox. After an API-process restart it can reconcile ownership of surviving supervisors; the VM does not automatically end with that API process. The daemon exposes sandbox lifecycle and service proxies, while native Jobs expose file review and supported checkpoint workflows. Their interfaces are described in [Core architecture](architecture.md) and [Daemon design](daemon/index.md). External orchestration owns cross-node placement, queues and application retries.
@@ -35,7 +30,7 @@ Cancellation shows why these identities matter. Closing a frontend changes obser
The runtime resolves RunSpec, effective policy and executor capabilities before preparing filesystem, network and execution attachments. It calls `RunExecutor::execute` only after required launch facts commit successfully. Preparation may already have created directories or sockets, so a commit failure still requires resource cleanup.
-The executor returns `ExecutorOutput`; the Session continues with cleanup, observation checks and result storage. The durable Job service's `ManagedJobRun` separately owns the real Attempt join and `Server::finish`, while the frontend receives a wait adapter. A failed or dropped frontend wait requests cancellation. Accepted completion publication remains owned by a runtime task while its Tokio runtime survives.
+The executor returns `ExecutorOutput`; the Session continues with cleanup, observation checks and result storage. The durable Job service's `ManagedJobRun` separately owns the real Attempt join and `Server::finish`. The frontend receives a wait adapter. A failed or dropped frontend wait requests cancellation. Accepted completion publication remains owned by a runtime task while its Tokio runtime survives.
### Why resolve policy once?
@@ -98,7 +93,7 @@ The optional Linux daemon physical pool handles equal resident 4 KiB pages acros
Two orderings matter. Recheck content before replacing a mapping, or writes after sampling can be lost. Release a still-mapped old slot only after removing its mapping, or slot reuse can change bytes visible to another VM. A disconnected connection alone cannot release those references: the pool waits for pidfd confirmation of peer exit.
-Raw-page sharing needs no userfaultfd and does not compress unique contents. It adds reference overhead and a pool-process failure domain; losing the current pool fails dependent VMs. Snapshot COW, KSM, physical pooling, cold compression and offload each have compatibility constraints. Their separate savings cannot be added into an assumed delivered combination. See [Memory optimization](memory-optimization/index.md) for budgets.
+Raw-page sharing needs no userfaultfd and does not compress unique contents. It adds reference overhead and a pool-process failure domain; losing the current pool fails dependent VMs. Snapshot COW, KSM, physical pooling, cold compression and offload each have compatibility constraints. Their savings cannot be added together into an assumed delivered total. See [Memory optimization](memory-optimization/index.md) for budgets.
### Why cold compression needs two quiescent windows
@@ -134,7 +129,7 @@ While an Agent reads A and produces C, a developer may change the target to D. T

-For a live lower, protection begins with the first actual content observation, or the pre-mutation state for a write without a prior read. Frozen layouts use an explicit target baseline. Ordinary stat and directory listing do not hash every file. If an extra lower supplies B while the eventual target contains A, A remains the conflict baseline.
+For a live lower, protection starts at the first actual observation of file contents; a write without a prior read uses the pre-mutation state. Frozen layouts use an explicit target baseline. Ordinary stat and directory listing do not hash every file. If an extra lower supplies B while the eventual target contains A, A remains the conflict baseline.
Under the target lock, apply first recovers pending batches, closes the selected paths over required dependencies, and compares the target with preimages. It persists Prepared intent before modifying the target, records TargetApplied after target updates, prunes accepted upper entries and finally records Committed. An interrupted operation can reconcile retained phases and recover forward.
@@ -152,7 +147,7 @@ Separating paths from content identity lets different paths in two images refere
A `read(offset, length)` locates the inode and file-content index, computes intersecting blocks, and fetches local or remote objects only on cache misses. After the corresponding integrity checks it slices the requested range. Metadata paging and content caching have separate boundaries. Content misses do not hold a global file-service lock.
-A VM lazy lower directly uses the shared file service. A private metadata projection preserves structures needed for native inode/FD and path checks, while READ contents come from the content backend; sparse placeholder holes are not returned as actual file bytes. A first ordinary modification must materialize the original file and copy it up. Complete export or snapshot can also fetch previously untouched content.
+A VM lazy lower directly uses the shared file service. A private metadata projection preserves structures needed for native inode/FD and path checks, while file contents come from the content backend on a FUSE `READ`; sparse placeholder holes are not returned as actual file bytes. A first ordinary modification must materialize the original file and copy it up. Complete export or snapshot can also fetch previously untouched content.
Lazy loading consequently moves some preparation work into first access. Hot-cache benefits, cold misses, metadata and copy-up costs need separate measurements. See [Shared image cache](shared-image-cache-storage.md) for storage and publication contracts. Source entry points are `pvisor/src/image/cache/backend.rs`, `direct.rs` and `storage.rs`.
@@ -227,5 +222,3 @@ The example now forms a complete path. Admission fixes policy; the Session prepa
Execution isolation constrains access, staging constrains file publication, snapshots constrain recoverable state, and Journal constrains committed facts. Each module has a state owner, publication point and failure result on which an external orchestrator can base retry, fork or acceptance decisions.
Implementation scope remains explicit: the daemon has a VM-only NativeRuntime and an opt-in Linux physical pool, while its API does not expose native Job stage/apply or execution checkpoints. External orchestration and RL integration still need a separate handoff and end-to-end validation. Implemented mechanisms alone do not establish production density or long-term recovery conclusions.
-
-The organization follows [ByteHook's project introduction and principles](https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md): explain prerequisite mechanisms, request paths and engineering constraints continuously. See [Open-source design references](research/design-documents.md) for further writing references and their application.
diff --git a/docs/src/en/design/job-checkpoint-cli.md b/docs/src/en/design/job-checkpoint-cli.md
index 10d337f1..f1dd5c61 100644
--- a/docs/src/en/design/job-checkpoint-cli.md
+++ b/docs/src/en/design/job-checkpoint-cli.md
@@ -5,6 +5,8 @@
> Status: native execution capture, suspension, continuation and branches are integrated with ordinary Jobs; section 10 defines support and acceptance.
> Constraint: preserve ordinary run configuration and default execution behavior; actual executor/profile determines capability.
+>
+> How to read: sections 1–9 are the target-state design (the design contract) of the Job-centered command tree, not an availability promise; whether a capability is integrated is governed by the implementation boundary in [section 10](#10-当前实现与验收边界).
## 1. Objects and basic constraints
diff --git a/docs/src/en/design/journal.md b/docs/src/en/design/journal.md
index c72f3ce1..d4e9c754 100644
--- a/docs/src/en/design/journal.md
+++ b/docs/src/en/design/journal.md
@@ -133,7 +133,7 @@ This revision reads source/existing documentation without compiling or running p
These cover deduplication, order and some failure boundaries. Read-only FD injection does not simulate every post-write sync_all failure. Cancellation uses memory mode rather than disk durability, and concurrent-position checks are not throughput benchmarks. A full process/power-loss matrix, long-log recovery, subscriber-lag recovery and storage-device failures remain unmeasured here.
-No disk throughput, p99 fsync or recovery peak-memory results are attributable to this documentation revision. Source confirms one sync_all per new disk Event, no file rewrite on duplicate submission, and full open/records scans. Growth and synchronization cost should guide the next measurements.
+Disk throughput, p99 fsync and recovery peak-memory remain unmeasured. The source confirms one `sync_all` per new disk Event, no file rewrite on duplicate submission, and full open/records scans. Growth and synchronization cost should guide the next measurements.
## 5. Usage recommendations {#usage}
diff --git a/docs/src/en/design/lazy-image-v2.md b/docs/src/en/design/lazy-image-v2.md
index 4742acab..5714777c 100644
--- a/docs/src/en/design/lazy-image-v2.md
+++ b/docs/src/en/design/lazy-image-v2.md
@@ -1,4 +1,4 @@
-# Lazy Image V2: Directory-Local Packing and On-Demand Indexes
+# Lazy image v2: directory-local packing and on-demand indexes
Use directories as access-locality boundaries, combine small files at publication time, and load exact indexes and content blocks on demand at read time to reduce small-object requests and startup index residency for S3-backed images.
diff --git a/docs/src/en/design/memory-optimization/compression-local.md b/docs/src/en/design/memory-optimization/compression-local.md
index 0c21c222..a85b8336 100644
--- a/docs/src/en/design/memory-optimization/compression-local.md
+++ b/docs/src/en/design/memory-optimization/compression-local.md
@@ -112,5 +112,5 @@ physical-sharing path.
[Memory evidence](proof-of-concept.md#memory-evidence) does not establish known
production net gains. Compare total host occupancy, temporary peaks, CPU cost,
-and application tails, not encoded size alone. See the [overview](compression.md)
+and application tails, not encoded size alone. See the [architecture index](index.md)
and [pooled alternative](compression-pool.md) for the ownership choice.
diff --git a/docs/src/en/design/memory-optimization/compression-pool.md b/docs/src/en/design/memory-optimization/compression-pool.md
index 57b2e737..c22ca36c 100644
--- a/docs/src/en/design/memory-optimization/compression-pool.md
+++ b/docs/src/en/design/memory-optimization/compression-pool.md
@@ -116,5 +116,5 @@ configuration; drain old instances and use fresh state to change it.
[Memory evidence](proof-of-concept.md#memory-evidence) establishes no known
production net gains or verified net physical-memory savings. Historical pool
measurements do not validate sealed backing. The [architecture index](index.md)
-and [compression overview](compression.md) distinguish implementation, component
+distinguishes implementation, component
correctness, the scoped real-guest probe and remaining workload acceptance gates.
diff --git a/docs/src/en/design/memory-optimization/compression.md b/docs/src/en/design/memory-optimization/compression.md
deleted file mode 100644
index e604766a..00000000
--- a/docs/src/en/design/memory-optimization/compression.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Memory compression
-
-Compression can reduce the cost of retaining cold RAM when encoding savings outweigh
-storage, CPU, and recovery costs. Choose local ownership first; add a pool only
-when sharing across instances justifies coordination.
-
-## Target and current status {#status}
-
-[Per-instance compression](compression-local.md) is delivered experimentally on
-Linux x86_64 through the default-off `vm.cold_ram_compression` /
-`--vm-cold-ram-compression`: a runtime-owned userfaultfd pager with bounded local
-storage, no FUSE and no external pool. It is distinct from `vm.ram_compression`
-(FUSE file backing), and is eviction/refault probing rather than a read-access
-heat detector. Neither it nor [pooled-server compression](compression-pool.md)
-is a production-benefit claim. The macOS/HVF heap pool remains experimental and
-can fail dependent VMs when its service is lost. Linux sealed compressed backing
-is implemented experimentally, with process-level handoff/recovery tests and a
-passing two-VM guest discard/refault and file-I/O probe after service termination.
-
-## Ownership and data flow {#architecture}
-
-Each instance owns checkpoint save, compression, and restore independently of
-runtime optimization. A [complete environment snapshot](../environment-snapshot.md)
-includes machine state and durability; runtime cold objects retain only current
-RAM fragments. A compressed checkpoint does not automatically reclaim live RAM.
-
-The VM runtime owns cold-page selection and mapping changes; the codec transforms
-bytes, and backing carries them. `memfd` does not compress automatically. The
-target restores writable pages into instance-private RAM, even with shared objects.
-
-## Choices and tradeoffs {#tradeoffs}
-
-Local compression avoids service coordination but cannot share payloads across
-instances. A pool adds optional [deduplication](deduplication.md), shared storage,
-and host-wide budgets, at the cost of IPC, contention, and broader failure risks.
-Both need temporary-memory and recovery headroom, CPU budgets, and acceptable tails.
-
-## Direction and evidence {#direction}
-
-The Linux local pager publishes and validates objects before reclaiming RAM,
-then validates restoration through `UFFD_COPY`. Kernel-fault userfaultfd authority
-is required; compiled support does not grant permission and missing authority
-fails startup. It rejects dedup, file/FUSE backing, snapshot capture/restore,
-whole-VM [offload](offload.md), and external memory pools; see the
-[local contract](compression-local.md#direction). Linux sealed `memfd` pool
-delivery has process-level tests and a passing scoped real-guest UFFD probe;
-a macOS sealed equivalent is not delivered. Start from the
-[optimization architecture](index.md); [memory evidence](proof-of-concept.md#memory-evidence)
-establishes no known production net gains or verified net physical-memory savings.
diff --git a/docs/src/en/design/memory-optimization/deduplication.md b/docs/src/en/design/memory-optimization/deduplication.md
index 2465bc88..cc9b5009 100644
--- a/docs/src/en/design/memory-optimization/deduplication.md
+++ b/docs/src/en/design/memory-optimization/deduplication.md
@@ -102,7 +102,7 @@ correctness probe are separate from physical-page-sharing evidence; see
- **Sharing versus isolation:** Restrict trust domains and assess content-presence side channels. KSM advice has no pVisor-defined domain parameter, so product labels alone cannot establish isolation.
- **Simplicity versus coverage:** The current physical pool uses bounded resident scanning. Arbitrary instant hot-page merging and P2P remain outside its scope; active shared slots and durable machine recovery are designed separately.
-The first version does not combine KSM and userspace cold reclamation on the same region, avoiding redundant merging followed by copying and compression. See [Memory compression](compression.md) for unique but compressible cold content.
+The first version does not combine KSM and userspace cold reclamation on the same region, avoiding redundant merging followed by copying and compression. See [Per-instance compression](compression-local.md) for unique but compressible cold content.
## Current integration and evidence {#direction}
diff --git a/docs/src/en/design/memory-optimization/index.md b/docs/src/en/design/memory-optimization/index.md
index b402ca00..10060990 100644
--- a/docs/src/en/design/memory-optimization/index.md
+++ b/docs/src/en/design/memory-optimization/index.md
@@ -38,7 +38,9 @@ Pin a reliable backing or recovery source before unmapping or reclaiming origina
| Local live compression | Unique compressible cold content within an instance | userfaultfd permissions, encoding CPU and refault costs |
| Whole-VM offload | Idle state with a retained recovery source | Write/restore costs, storage and peak headroom |
-See [Memory deduplication](deduplication.md), [Memory compression](compression.md), [Per-instance compression](compression-local.md) and [Offload format](offload-format.md). [Pooled-server compression](compression-pool.md) shares sealed encoded objects in an explicit Linux mode; the default daemon physical pool shares raw pages. They remain separate mechanisms.
+See [Memory deduplication](deduplication.md), [Per-instance compression](compression-local.md), [RAM offload](offload.md) and the [byte-layout appendix](../offload/disk-layout-and-schema.md). [Pooled-server compression](compression-pool.md) shares sealed encoded objects in an explicit Linux mode; the default daemon physical pool shares raw pages. They remain separate mechanisms.
+
+The default route is instance-local ownership: local compression avoids service coordination but cannot share encoded results across instances. Pooling adds optional deduplication, shared storage and host-level budgets at the cost of IPC, contention and a wider failure radius; introduce it only when cross-instance sharing of encoded objects is needed. Both need scratch memory, restoration headroom, a CPU budget and acceptable tail latency.
## Ownership and publication order {#ownership}
@@ -71,12 +73,12 @@ Losing the physical/legacy pool fails dependent VMs. Linux sealed-compressed cli
## Implementation and combinations {#direction}
-The Linux daemon enables raw-page sharing explicitly with `serve --memory-pool`; it does not require userfaultfd. Per-instance live compression and `--memory-pool-mode compressed` use userfaultfd. The sealed pool has component-level service-loss tests and a passing two-VM probe covering eviction/refault and file I/O after service termination; production-density and latency acceptance remain open. Snapshot capture/restore, file backing, whole-VM offload, KSM advice and cold-page paths have explicit incompatibility checks. Callers select supported profiles; combinations do not switch automatically at runtime.
+The Linux daemon enables raw-page sharing explicitly with `serve --memory-pool`; it does not require userfaultfd. Per-instance live compression and `--memory-pool-mode compressed` use userfaultfd. The sealed pool has component-level service-loss tests and a passing two-VM probe covering eviction/refault and file I/O after service termination; the equivalent sealed pooling is not delivered on macOS, and production-density and latency acceptance remain open. Snapshot capture/restore, file backing, whole-VM offload, KSM advice and cold-page paths have explicit incompatibility checks. Callers select supported profiles; combinations do not switch automatically at runtime.
[VM memory benchmarks](../../benchmarks/vm-memory/index.md) retain sharing and offload evidence by configuration, samples and accounting scope. Ready-stage savings do not guarantee lower lifecycle peaks, and writes reduce sharing. [Proofs of concept](proof-of-concept.md) retain historical mechanisms and failures; [Environment snapshots](../environment-snapshot.md) define complete-state contracts.
## System connections and source map {#integration}
-Mappings and block state stay inside the VM; pools and stores supply referenced content. Virtual devices join the same quiescence boundary through RAM leases. [Complete snapshots](../environment-snapshot.md#consistent-cut) additionally combine CPU, RAM, devices and files. [Daemon admission](../daemon/admission.md) must budget private pages, shared services and restore peaks across the node, rather than converting a local compression ratio directly into concurrency.
+Mappings and block state stay inside the VM; pools and stores supply referenced content. Virtual devices join the same quiescence boundary through RAM leases. [Complete snapshots](../environment-snapshot.md#consistent-cut) additionally combine CPU, RAM, devices and files. [Daemon admission](../daemon/index.md#admission) must budget private pages, shared services and restore peaks across the node, rather than converting a local compression ratio directly into concurrency.
Source entries: `crates/pvisor-vm/src/memory.rs`, `handle.rs`, `cold_ram_linux.rs`, `ram_dedup.rs` and `devices/virtio/memory_gate.rs`. `api.rs` defines interfaces and lifecycles; [Shared working sets](../daemon/shared-working-set.md) covers daemon object budgets and process ownership.
diff --git a/docs/src/en/design/memory-optimization/offload-format.md b/docs/src/en/design/memory-optimization/offload-format.md
deleted file mode 100644
index 680ae9c6..00000000
--- a/docs/src/en/design/memory-optimization/offload-format.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Offload file format
-
-The storage layout determines what can be read back, published and safely deleted.
-A raw file favors simplicity; a compressed base/delta bundle trades that simplicity for reuse.
-
-## Two storage models {#storage-models}
-
-Raw backing stores RAM bytes at the VMM's compact file offsets, without a pVisor format header.
-It is directly mappable, but logical length is not allocated disk space: the file can be sparse.
-Neither a raw RAM file nor a compressed bundle includes the complete state of a recoverable VM.
-
-In compressed mode the manifest identifies the sidecar directory and committed head.
-Immutable generations hold a full base followed by deltas that inherit unchanged blocks.
-Writable staging holds new raw pages; FUSE combines those pages with committed content
-into the logical RAM file used by the live instance. Staging is not a historical snapshot.
-
-## Random reads and integrity {#reads-and-integrity}
-
-A block index resolves the latest source in the chain; a seek table locates its compressed frame.
-Uniform blocks use fill entries. Reads validate metadata, ancestry, decoded length and block
-checksums instead of decoding the entire RAM image. Integrity detects corruption, not a complete
-VM checkpoint or an atomic capture of CPU, devices and external effects.
-
-Current staging uses 4 KiB pages and compression uses 64 KiB blocks; host pages are separate.
-Small units reduce partial-write and cold-read amplification but increase indexes and bookkeeping.
-Large units can improve compression and reduce metadata, but a small access may decode a whole
-block. [Local compression](compression-local.md) discusses the related memory/CPU tradeoff.
-
-## Publication and retention {#publication-and-retention}
-
-The writer flushes logical-file writes into staging, builds and synchronizes a new generation,
-then publishes it without replacing an existing generation before appending a manifest head.
-FUSE writeback or fsync alone does not publish a committed epoch; offload coordinates that boundary.
-Immutability keeps published bytes stable, but it does not by itself keep their files alive.
-
-GC currently retains the current head and ancestors plus explicitly pinned historical roots.
-Old manifest head records are not retention roots, and standard offload does not automatically pin.
-Reader leases are a lifecycle requirement for future concurrent inspection or portable bundles,
-not a new lease facility promised by this format. Current inspection requires a stopped writer.
-The separate [full environment snapshot](../environment-snapshot.md) store has its own restore leases.
-
-## Compaction and capacity {#compaction}
-
-Deltas reduce repeated storage, but deepen dependencies. Current depth-triggered compaction builds
-a new full base while the VM is paused, decoding old blocks and encoding the entire logical RAM.
-Budget for the old chain, new base under construction, staging and pinned history simultaneously.
-Do not count the temporary file and its published name as two copies of the same new generation.
-Small deltas do not predict compaction latency, peak space or cold-read decode amplification.
-
-## Current limits and design direction {#status}
-
-The manifest currently stores an absolute sidecar path; copying or aliasing it does not relocate
-its dependencies. Open rejects a torn head-log tail rather than automatically falling back.
-Staging validity masks live only in memory, and dirty kernel pages may not yet be staged;
-normal exit does not commit post-resume writes. These files are not a crash-atomic full-VM archive.
-
-Portable references, recovery-safe publication and coordinated reader/GC leases are future goals,
-not capabilities established by these pages. See the [architecture](index.md) and
-[RAM offload](offload.md) for scope; the existing [byte layout and schema appendix](../offload/disk-layout-and-schema.md)
-owns binary fields, size formulas and parser limits rather than duplicating them here.
diff --git a/docs/src/en/design/memory-optimization/offload.md b/docs/src/en/design/memory-optimization/offload.md
index f802f064..d442ec46 100644
--- a/docs/src/en/design/memory-optimization/offload.md
+++ b/docs/src/en/design/memory-optimization/offload.md
@@ -45,7 +45,11 @@ This offload path must not be applied indiscriminately to snapshot-restored priv
Raw backing lets the kernel write RAM bytes directly to the file and satisfy later page faults.
The compressed path exposes a logical RAM file through FUSE: writeback stages raw pages,
then offload commits changed blocks into a base/delta bundle; reads decode committed blocks.
-[Offload file format](offload-format.md) explains the storage and publication model.
+Staging currently uses 4 KiB pages while compression uses 64 KiB blocks: a small granularity
+reduces partial-write and cold-read amplification; a large one improves compression and cuts
+metadata, but a small access may decode a whole block.
+[Offload file format](../offload/disk-layout-and-schema.md) defines the storage format,
+publication model and parsing limits.
Compression can reduce stored bytes, but adds encoding, checksums, staging I/O and FUSE work.
Resuming adds block decoding to cold reads. Incompressible data, frequent rewrites and compaction
diff --git a/docs/src/en/design/memory-optimization/proof-of-concept.md b/docs/src/en/design/memory-optimization/proof-of-concept.md
index b6a758f1..67d2dea9 100644
--- a/docs/src/en/design/memory-optimization/proof-of-concept.md
+++ b/docs/src/en/design/memory-optimization/proof-of-concept.md
@@ -1,6 +1,6 @@
# Experimental proof of concept
-Shared-baseline, COW, and cold-pool experiments provide foundations for memory optimization while exposing service availability, restoration contention, and physical-accounting limitations. [Memory optimization](index.md), [Memory deduplication](deduplication.md), and [Memory compression](compression.md) define the target architecture. The implementation, experiments, and failures below retain their version scope rather than establishing production guarantees for future approaches.
+Shared-baseline, COW, and cold-pool experiments provide foundations for memory optimization while exposing service availability, restoration contention, and physical-accounting limitations. [Memory optimization](index.md), [Memory deduplication](deduplication.md), and [Per-instance compression](compression-local.md) define the target architecture. The implementation, experiments, and failures below retain their version scope rather than establishing production guarantees for future approaches.
The current Linux daemon pool uses physical shared pages with COW; reads do not restore private copies. See the [daemon guide](../../guides/daemon/index.md#memory-pool) for activation and budgets. This page retains the macOS cold-compression and historical Linux mechanism records.
@@ -232,7 +232,9 @@ Current source moves PUT, health checks after rejection, RELEASE and STATS outsi
Each runner has one maintenance thread; it cannot create another Publishing batch before finishing the previous one, so the state check cannot confuse generations. RPCs still serialize through the same pool mutex, and cold restoration may wait behind publication. This does not promise to eliminate pool failures or all cold-restore tails. Release the pool lock before acquiring the pager lock or maintenance barrier.
-`pending_snapshot_bytes` is added to the RAM+pool proxy using the larger pre/post sampling count, conservatively accounting for staging. `pvisor-cold-transaction` sums both barrier-call durations per iteration and records publication_us separately: shorter individual barriers do not establish lower total overhead. Logs now include PID; invalidated_publications counts access-invalidated candidates, while total cancellations also include commit-budget exhaustion. All three matched three-round real dual-VM network pairs passed, with 238 access-invalidated candidates. Combined barrier-call P95 was 2.4–3.1 ms; maximum cold restoration was 41.4 ms. These are bounded-workload results, with connection-contention tails still unresolved.
+`pending_snapshot_bytes` is added to the RAM+pool proxy using the larger pre/post sampling count, conservatively accounting for staging. `pvisor-cold-transaction` sums both barrier-call durations per iteration and records publication_us separately: shorter individual barriers do not establish lower total overhead. Logs now include PID; invalidated_publications counts access-invalidated candidates, while total cancellations also include commit-budget exhaustion.
+
+All three matched three-round real dual-VM network pairs passed, with 238 access-invalidated candidates. Combined barrier-call P95 was 2.4–3.1 ms; maximum cold restoration was 41.4 ms. These are bounded-workload results, with connection-contention tails still unresolved.
### Memory accounting and unverified benefits {#memory-evidence}
@@ -266,7 +268,9 @@ pvisor-daemon serve --help
pvisor-daemon memory-pool --help
```
-The recorded macOS v1 default pool budgets were 16 MiB encoded payload, 8192 objects, 16 connections and 32768 references per connection; the reference budget covers 2 GiB RAM in 64 KiB blocks. That version's service flags set these four budgets independently; encoded payload excludes some heap metadata. The service accepts only the current UID, uses socket permissions 0600 and refuses to overwrite an endpoint. SIGINT/SIGTERM closes connections, waits for reference cleanup and removes its own socket. Stopping the pool fails dependent live VMs. That version was an operator-managed foreground component, without automatic restart or content recovery; these are historical limits, not current daemon defaults.
+The recorded macOS v1 default pool budgets were 16 MiB encoded payload, 8192 objects, 16 connections and 32768 references per connection; the reference budget covers 2 GiB RAM in 64 KiB blocks. That version's service flags set these four budgets independently; encoded payload excludes some heap metadata.
+
+The service accepts only the current UID, uses socket permissions 0600 and refuses to overwrite an endpoint. SIGINT/SIGTERM closes connections, waits for reference cleanup and removes its own socket. Stopping the pool fails dependent live VMs. That version was an operator-managed foreground component, without automatic restart or content recovery; these are historical limits, not current daemon defaults.
The v1 integration check used the shipped pool and explicit SDK option without the old pool environment variable in the parent. Two real VMs passed shared-object, restoration, independent-write and exit checks; service exit and socket cleanup passed in about 36.6 s, without host-guard errors. Raw evidence is `v1-product-integration.json`. Targeted Rust regression, Clippy and installation/packaging results are recorded in the convergence report.
diff --git a/docs/src/en/design/offload/index.md b/docs/src/en/design/offload/index.md
index 4a81bb98..49b53428 100644
--- a/docs/src/en/design/offload/index.md
+++ b/docs/src/en/design/offload/index.md
@@ -1,6 +1,6 @@
# VM RAM offload
-> See [VM RAM offload architecture](../memory-optimization/offload.md) for the architecture; this document remains the implementation and evidence appendix.
+> Architecture: [VM RAM offload](../memory-optimization/offload.md). The sections below are the implementation and evidence appendix.
## 1. Motivation {#motivation}
diff --git a/docs/src/en/design/overlayfs.md b/docs/src/en/design/overlayfs.md
index 279b3a59..08403807 100644
--- a/docs/src/en/design/overlayfs.md
+++ b/docs/src/en/design/overlayfs.md
@@ -91,7 +91,7 @@ miss locks only its content block. Tests cover cross-block and warm reads, hard-
copy-up, guest attributes, open handles, complete tree exports and runner attachment.
Protocol state is not fully shared between adapters; platform permissions and
descriptor semantics remain adapter-specific.
-[Filesystem measurements](filesystem-performance-analysis.md#filesystem-service) cover
+[Filesystem measurements](../lab-notes/filesystem-performance-analysis.md#filesystem-service) cover
local workloads and lazy cold/warm caches; version A/B shows localized read gains
and metadata/copy-up regressions, without a general end-to-end speedup. Concurrent
task capacity has not been validated in those measurements.
diff --git a/docs/src/en/design/overlaynet.md b/docs/src/en/design/overlaynet.md
index 5af3cf86..81009acc 100644
--- a/docs/src/en/design/overlaynet.md
+++ b/docs/src/en/design/overlaynet.md
@@ -101,8 +101,8 @@ OverlayNet sits behind the VM device, prepared by Session and reclaimed when the
Source entries: `ensure_listener`, `connect_vm_egress`, `drive_flows` and `SyntheticDns` in `crates/pvisor-overlaynet/src/vm.rs`. `egress.rs` owns shared egress connection paths, and `interception.rs` defines observations of the attached driver. `crates/pvisor-vm/src/devices/virtio/net/` owns the virtual NIC and frame transport; it does not infer network policy.
-!!! note "Transparent host / OCI interception: future designs"
- The Problem, Design A, Design B and delivery items 1–5 below describe unimplemented host/container drivers. They do not extend the current VM and explicit-proxy support described above.
+!!! note "Transparent host / OCI interception: proposal (not implemented)"
+ The Problem, Design A, Design B and delivery items 1–5 below describe unimplemented host/container drivers. They are an accepted-direction design proposal, not a description of the current implementation, and they do not extend the current VM and explicit-proxy support described above.
## Problem
diff --git a/docs/src/en/design/records-and-versions.md b/docs/src/en/design/records-and-versions.md
index 474225de..7c0e850e 100644
--- a/docs/src/en/design/records-and-versions.md
+++ b/docs/src/en/design/records-and-versions.md
@@ -47,7 +47,7 @@ Public persisted fields are in [Run Bundle](../reference/run-bundle.md); event b
Environment manifest versions describe different RAM/filesystem combinations. A maximum version of 5 does not mean every new snapshot writes 5. Stage profiles use v4 for raw RAM and v5 for compressed RAM; other profiles follow their field combinations. SDK readability of a storage format does not mean the current Job CLI can adopt arbitrary historical standalone snapshot stores.
-[Job checkpoint design](job-checkpoint-cli.md#10-当前实现与验收边界) owns entries and compatible profiles. [Environment snapshots](environment-snapshot.md#storage-contract) owns machine and file references, [Offload format](memory-optimization/offload-format.md) owns RAM subformats, and [Shared image cache](shared-image-cache-storage.md) owns image metadata/content versions.
+[Job checkpoint design](job-checkpoint-cli.md#10-当前实现与验收边界) owns entries and compatible profiles. [Environment snapshots](environment-snapshot.md#storage-contract) owns machine and file references, [Offload format](offload/disk-layout-and-schema.md) owns RAM subformats, and [Shared image cache](shared-image-cache-storage.md) owns image metadata/content versions.
## Control protocols and build identity {#control-protocols}
diff --git a/docs/src/en/design/replay.md b/docs/src/en/design/replay.md
index 00e467c7..832bd4c0 100644
--- a/docs/src/en/design/replay.md
+++ b/docs/src/en/design/replay.md
@@ -15,13 +15,53 @@ Follow the [trajectory replay guide](../guides/replay.md) to use it. The design
| Continue | Hand native reconstructed context to the pinned agent and validate that its first continuation request uses the prefix; inject boundary prompts after fresh observations |
| Finalize | Save results, quality, failures, reconstructed trajectories and continuation artifacts with actionable failure locations |
-`adapter/` owns parsing, tool semantics and launch selection; `bridge/` owns model protocol bridges for Claude/Codex/OpenCode. See [Replay guide](../guides/replay.md) for adapters/versions; pinned support does not promise compatibility with arbitrary new versions.
+`adapter/` owns parsing, tool semantics and launch selection; `bridge/` owns model protocol bridges for Claude/Codex/OpenCode. Adapter mechanisms and pinned versions are listed below; a pinned version declares "this version is verified", not "compatible with arbitrary new versions".
+
+## Adapter mechanisms and pinned versions
+
+### Claude Code
+
+Claude Code uses native JSONL/UUID sessions. SandboxReplay walks the active parent-UUID chain, replays the first N complete tool batches, writes the new observations into a rebuilt session, and then starts continuation through `claude --resume`.
+
+Claude Code's resume transport inserts temporary messages before the model request, so SandboxReplay starts a local protocol bridge that serves this continuation only. The bridge validates and removes the exactly matching temporary envelope, so the first model request still ends at `O′N`. It does not enable the pVisor Gateway and neither captures nor persists model traffic.
+
+Asynchronous sub-agent `Agent` and `TaskOutput` calls are treated as native Claude Code tools. The recovery boundary must be chosen where the native session can rebuild it unambiguously.
+
+### OpenHands
+
+OpenHands uses its native event trajectory and ReplayManager. SandboxReplay extracts the first N Actions; the OpenHands Runtime executes them in the new sandbox and produces fresh Observations. When the replay queue empties, OpenHands issues the continuation request directly.
+
+### mini-swe-agent
+
+mini-swe-agent uses native `mini-swe-agent-1.1` messages. The companion runner keeps the original system and task messages, replays the first N actions in the new sandbox, adds the results to `agent.messages` with the native observation formatter, and then calls the next `agent.step()` directly.
+
+### Pi agent
+
+The Pi agent adapter pins `@earendil-works/pi-coding-agent` `0.83.0` and takes native Pi RPC event JSONL as input. One replay step is one complete `turn_end` tool batch. SandboxReplay reruns `read`, `bash`, `edit`, and `write` with Pi's own tool implementations, writes the new observations into a fresh Pi v3 session, and then continues from the boundary through the Pi SDK. Trajectories that call any tool outside these four are refused, so tool semantics never change silently. Without a configured boundary prompt it calls Pi's native `continue()`; with one, it appends a single user message through `prompt()` after `O′N`.
+
+### OpenCode
+
+The OpenCode adapter pins `1.17.7` and takes the native event JSONL produced by `opencode run --format=json`. Events `user`, `step_start`, `text`, `reasoning`, `tool_use`, and `step_finish` are grouped by step; one replay step is one complete tool-call batch. SandboxReplay reruns command tools and the `read`, `write`, and `edit` file tools in the new sandbox, rebuilds the prefix from the new `state.output`, and continues from the boundary through `opencode run --format=json --session`. Intermediate `tool_use` states during tool execution are merged so the same call is not replayed twice.
+
+`opencode run` has no CLI step-count option, and 1.17.7 does not enforce the `agent.build.steps` budget on a resumed session. SandboxReplay therefore adds two external watchdogs for OpenCode only: pVisor watches the stderr progress log for continuation steps and sends SIGINT once the remaining budget is reached; ten minutes with no output triggers idle termination. A budget trigger produces `agent_status = max_steps` and records `opencode_step_budget` in the metadata. These mechanisms target the pinned adapter version; for the original measurements and diagnostics see the [experiment report](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/replay/qwen3.6-results.md).
+
+### Codex
+
+The Codex adapter pins CLI `0.149.0` and takes native Codex rollout JSONL as input. One replay step is one complete set of `function_call`/`custom_tool_call` entries and their outputs. SandboxReplay replays the prefix tools in the new sandbox, writes the native `response_item` prefix into an isolated `CODEX_HOME`, and runs `codex exec resume --json`. The native session ID is extracted automatically from `session_meta`; unknown tools or a missing native session ID fail explicitly instead of degrading into a brand-new session.
+
+Codex keeps its own system prompt, tool definitions, and task context; SandboxReplay replaces only the observations before the boundary. To stay compatible with older CLIs that require a resume prompt, SandboxReplay uses a local Responses bridge that removes the transport nonce before forwarding the request to the model service, and cleans the nonce from the native trajectory after continuation. The default mode's input condition is `replayed_boundary_only` and injects no extra prompt into the model.
+
+When `boundary_user_prompt` is configured, the prompt is injected once after `O′N` and retained; the input condition is then marked `boundary_user_prompt_appended`. A bridge validation failure refuses continuation rather than degrading to a direct connection.
Replaying tools repeats file/command and potentially remote effects. Filesystem checkpoints do not preserve external state. Unrefreshable observations fail closed by default; explicit permission records degradation. Fresh tool outputs can differ and the continuing model can choose different actions. Successful continuation is not deterministic reproduction of the original trajectory.
Historical Claude `Read` accepts only regular files within the workspace. Existing symlinks resolving inside the workspace remain supported. The actual open walks directory FDs without following replacement symlinks, uses nonblocking opens, and checks the opened inode to reject FIFOs, directories and devices. A FIFO returns a tool error without a writer or an outer Run timeout.
-Each `Read` scans at most 16 MiB, probing one additional byte to detect truncation, and returns at most 2,000 file-content lines, with the entire tool content bounded to 4 MiB. `offset` starts at 1; explicit `limit` keeps its meaning within these budgets. Reaching a scan, line or output-byte budget retains the available content, appends one `Read truncated by pvisor replay` notice line, and sets the observation's `truncated=true`. Including this notice, the result has at most 2,001 lines. An explicit range completed before the scan boundary is not marked truncated merely because the rest of the file is large. Offsets beyond the scan budget also receive the notice; this result does not establish EOF for the full file. Regular files can still change concurrently. These budgets provide neither a file snapshot nor an I/O deadline for remote or faulty filesystems.
+Each `Read` scans at most 16 MiB, probing one additional byte to detect truncation, and returns at most 2,000 file-content lines, with the entire tool content bounded to 4 MiB. `offset` starts at 1; explicit `limit` keeps its meaning within these budgets. Reaching a scan, line or output-byte budget retains the available content, appends one `Read truncated by pvisor replay` notice line, and sets the observation's `truncated=true`. Including this notice, the result has at most 2,001 lines.
+
+An explicit range completed before the scan boundary is not marked truncated merely because the rest of the file is large. Offsets beyond the scan budget also receive the notice; this result does not establish EOF for the full file.
+
+Regular files can still change concurrently. These budgets provide neither a file snapshot nor an I/O deadline for remote or faulty filesystems.
## Code and validation
diff --git a/docs/src/en/why/agent-lifecycle-cost.md b/docs/src/en/design/research/agent-lifecycle-cost.md
similarity index 78%
rename from docs/src/en/why/agent-lifecycle-cost.md
rename to docs/src/en/design/research/agent-lifecycle-cost.md
index b8a3222b..14ffa2cb 100644
--- a/docs/src/en/why/agent-lifecycle-cost.md
+++ b/docs/src/en/design/research/agent-lifecycle-cost.md
@@ -1,8 +1,8 @@
-# Why Agents Need pVisor
+# Agent task lifecycle cost
**pVisor aims to establish a new execution model for Agents: Agents retain their sequential programming model, while a shared execution engine takes over supported I/O, reclaims resources during waits, and resumes the original execution timeline when events are ready.**
-Scaling autonomous Agent execution requires changing how resources follow tasks. Faster sandbox startup is a foundation. The larger opportunity is to keep many stateful Agents progressing without retaining a complete resident environment for every timeline throughout its lifetime.
+Scaling autonomous Agent execution changes how resources must follow tasks. Faster sandbox startup is the foundation. The larger opportunity is keeping many stateful Agents progressing without reserving a complete resident environment for each timeline from start to finish.
## An Agent's timeline is continuous; its resource demand is intermittent {#waiting-cost}
@@ -10,7 +10,7 @@ A Coding Agent typically follows its own timeline: read a repository, request a
Computation and waiting alternate along this timeline. While the Agent waits for a model response, inference happens in an external service, but its sandbox may still retain memory, caches, and process state.
-DeepSeek's **DSec (DeepSeek Elastic Compute)** report provides production evidence. In a week of samples from early 2026, about 90% of sandboxes in both the container and microVM backends averaged at most 5% of their requested CPU. Median lifetimes were 17.4 and 15.5 minutes respectively, with both P99s exceeding three hours. The report also describes sandboxes waiting for the model's next action while retaining state and caches. [DSec §1 and §4.3, Figs. 5 and 7](https://arxiv.org/html/2609.22978v1#S4.SS3)
+DeepSeek's **DSec (DeepSeek Elastic Compute)** report provides production evidence: across one week of early-2026 samples, about 90% of sandboxes on both the container and microVM backends averaged at most 5% of their requested CPU. Median lifetimes were 17.4 and 15.5 minutes, and both P99s exceeded three hours. The report also describes sandboxes waiting for the model's next action while retaining state and caches. [DSec §1 and §4.3, Figs. 5 and 7](https://arxiv.org/html/2609.22978v1#S4.SS3)

@@ -24,15 +24,15 @@ High-concurrency servers have faced a similar change in resource organization. O

-Event-driven execution centralizes waiting so fewer threads can handle many connections. Reactors commonly use readiness notifications such as epoll; Proactors organize execution around asynchronous completion; IOCP provides completion notifications and concurrent processing. Adopting these models directly often requires splitting sequential code into state machines or callbacks and managing more execution state. [epoll](https://man7.org/linux/man-pages/man7/epoll.7.html), [IOCP](https://learn.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports)
+Event-driven execution centralizes waiting, so fewer threads serve many connections. Reactors wait for readiness notifications such as epoll. Proactors submit an operation and wait for its completion, as IOCP does. Adopting these models directly often requires splitting sequential code into state machines or callbacks and managing more execution state. [epoll](https://man7.org/linux/man-pages/man7/epoll.7.html), [IOCP](https://learn.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports)
Transparent coroutines concentrate this adaptation in the runtime. Programs continue to express logic sequentially, while syscall hooks or standard-library integration hand supported blocking I/O to an event engine. The runtime suspends the coroutine during the wait and resumes it at the original call when ready. For example, libco combines socket-function hooks with epoll / kqueue so business logic can retain synchronous calls while executing asynchronously. [libco](https://github.com/Tencent/libco), [Go runtime scheduling](https://go.dev/doc/faq#goroutines)

-The figure uses one worker to illustrate sharing; implementations can use several. A Reactor signals that I/O can be attempted; a Proactor signals completion of a submitted operation. Coroutines let applications avoid splitting their state around those events. Transparency means preserving call semantics on integrated I/O paths, rather than automatic, lossless migration of arbitrary multithreaded programs.
+The figure uses one worker to illustrate sharing; implementations can use several. A Reactor signals that I/O can be attempted; a Proactor signals completion of a submitted operation. Coroutines let applications avoid splitting their state around those events. Transparency applies to integrated I/O paths and preserves call semantics there. Arbitrary multithreaded programs still need explicit migration.
-**pVisor aims to bring this transition to Agent execution.** Agents continue using their existing code and Linux tools. The execution engine turns supported waits into event-driven progress and resumption. Adaptation is concentrated in the runtime, avoiding a concurrency rewrite for every Agent.
+**pVisor applies this transition to Agent execution.** Agents keep their existing code and Linux tools; the execution engine turns supported waits into event-driven progress and resumption. Adaptation stays in the runtime, so no Agent needs a concurrency rewrite.
## Use the VM to hold the Agent's execution context {#agent-iocp}
@@ -40,11 +40,11 @@ Following the coroutine model, pVisor extends the scheduling unit to the Agent's

-**Transparency to the Agent means running its existing code, using its existing Linux tools and making its existing calls.** File and network I/O crosses Linux and virtual devices into the host, where pVisor takes ownership on integrated device and protocol paths. Changes to the guest kernel, VMM and host services are concentrated at this layer. The Agent needs no asynchronous rewrite or explicit suspend, offload or resume interface. [VM execution path](../design/vm-runtime.md)
+**Transparency to the Agent means running its existing code, using its existing Linux tools and keeping its existing blocking calls.** File and network I/O crosses Linux and virtual devices into the host, where pVisor takes ownership on integrated device and protocol paths. Changes to the guest kernel, VMM and host services are concentrated at this layer. In the target design the Agent needs no asynchronous rewrite and no explicit suspend, offload or resume interface. [VM execution path](../vm-runtime.md)
## The Agent sees continuous execution; the host schedules events {#execution-path}
-Consider a model request on a supported proxy path. The Agent issues the request and waits as usual. pVisor hands it to the host to advance. When the entire guest can safely wait, pVisor retains its context and reclaims offloadable memory, making reusable resources available to other Agents. When a response arrives, pVisor restores that context and returns from the original call. The Agent proceeds to handle the result.
+Consider a model request on a supported proxy path. The Agent issues the request and waits as usual. pVisor hands the request to the host, which advances it. When the entire guest can safely wait, pVisor retains its context and reclaims offloadable memory, making reusable resources available to other Agents. When a response arrives, pVisor restores that context and returns from the original call. The Agent proceeds to handle the result.

@@ -52,7 +52,7 @@ This places several Agent timelines under a shared execution engine: **each Agen
Transparency is bounded by the original call's semantics: results, errors, file ordering and synchronization requirements must remain intact. The host must own independent requests and data before removing I/O's dependency on guest RAM. Model requests also require protocol integration; ordinary TCP forwarding cannot automatically take over a TLS session inside the guest. A guest with runnable background work continues executing.
-Bulk writes require the same ownership transfer. Once the host owns independent write data, it can queue, coalesce and persist it. While preserving ordering, errors and synchronization semantics, an entire guest waiting only for those operations may become eligible for offload. **A smaller host buffer can release a larger guest memory footprint, which makes asynchronous I/O at scale worth pursuing.** Queue backpressure, synchronization and runnable background tasks affect the eligible window, and the buffer itself counts toward resource cost. [Agent I/O completion](../design/experimental/agent-io-completion/index.md)
+Bulk writes require the same ownership transfer. Once the host owns independent write data, it can queue, coalesce and persist it. While preserving ordering, errors and synchronization semantics, an entire guest waiting only for those operations may become eligible for offload. **A smaller host buffer can release a larger guest memory footprint, which makes asynchronous I/O at scale worth pursuing.** Queue backpressure, synchronization and runnable background tasks affect the eligible window, and the buffer itself counts toward resource cost. [Agent I/O completion](../experimental/agent-io-completion/index.md)
A blocked vCPU already lets the host schedule other work. The additional capacity opportunity here comes primarily from reclaiming physical memory still retained by a waiting guest.
@@ -68,7 +68,7 @@ A blocked vCPU already lets the host schedule other work. The additional capacit
| [AgentSysBench, v1, §8.3, Fig. 25(c,d)](https://arxiv.org/html/2608.15127v1#S8.SS3) | Its Mini-SWE prototype offloads sandboxes after planning exceeds a time threshold and restores before the next tool step; average/peak resident memory falls to 1/4.6 and 1/2.1 of baseline, with latency increasing by at most 0.5% | Direct evidence for the potential of offloading during waits; memory is the aggregate across concurrent sandbox processes in this run, without establishing node density or whole-VM offload |
| [pVisor historical static memory measurements](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/memory/README.md#published-curves-and-archived-history) and underlying readings | Linux x86_64/KVM, 512 MiB guest, 64 MiB application working set; complete product-process PSS falls from about 179–181 MiB to 36 MiB, about 80%; product-group cgroup memory including cache falls from about 224 MiB to 19 MiB | A reference for retained memory after offload; N=1 per condition and a five-second window, from a historical batch, rather than a real-Agent or node-capacity measurement |
-AgentSysBench omits the experiment's threshold value, concurrency and underlying offload mechanism, so it supports the direction. pVisor's PSS and cgroup readings use different accounting; they cannot be added or substituted for net node-wide reclamation.
+AgentSysBench omits the threshold value, concurrency and underlying offload mechanism, so it establishes feasibility for the direction but not the parameter values below. pVisor's PSS and cgroup readings use different accounting; they cannot be added or substituted for net node-wide reclamation.
Public evidence also shows workload variation. In [AgentCgroup, v2, §3.2](https://arxiv.org/html/2602.09345v2#S3.SS2), LLM reasoning occupies only 26–44% of end-to-end SWE-rebench execution, with the remainder including tools and initialization. Offload eligibility therefore needs workload-specific assumptions. DSec's low average CPU usage likewise cannot establish that 95% of the timeline is offloadable.
@@ -98,9 +98,9 @@ Using `r = 80%` as a reference assumption and `h = 5%` as a budget target for ad
The central scenario is `1 - 70% × 80% + 5% = 49%`. An Agent averaging 1 GiB before optimization would average about 0.49 GiB under the same accounting. After reserving memory for the system, shared engine and restoration headroom, the same 100 GiB Agent budget would cover the average residency of about 100 → 204 execution contexts.
-`f = 70%` already requires safely capturing most relevant waits; it is an assumption, rather than a measured parameter obtained by rounding the published 69.4%. `r = 80%` takes its scale from small-working-set offload, with actual results depending on working sets, sharing and caches. `h = 5%` is a budget awaiting implementation validation: with 1 GiB of baseline residency it allows about 51 MiB of average additional residency. Smaller guests or large response backlogs require recalculation.
+`f = 70%` assumes most relevant waits can be captured safely. It is a design assumption, not a rounding of the published 69.4%. `r = 80%` takes its scale from small-working-set offload, with actual results depending on working sets, sharing and caches. `h = 5%` is a budget awaiting implementation validation: with 1 GiB of baseline residency it allows about 51 MiB of average additional residency. Smaller guests or large response backlogs require recalculation.
-The same model evaluates buffer spending. Holding `f = 70%` and `r = 80%`, increasing `h` from 5% to 15% or 30% lowers the multiplier from 2.04 to 1.69 or 1.35. The experimental host write buffer currently caps payload at 64 MiB per connection. A cap differs from average occupancy; multiple connections, metadata and response spooling must share a resource budget. [Buffer budget and current limits](../design/experimental/agent-io-completion/index.md)
+The same model evaluates buffer spending. Holding `f = 70%` and `r = 80%`, increasing `h` from 5% to 15% or 30% lowers the multiplier from 2.04 to 1.69 or 1.35. The experimental host write buffer currently caps payload at 64 MiB per connection. A cap differs from average occupancy; multiple connections, metadata and response spooling must share a resource budget. [Buffer budget and current limits](../experimental/agent-io-completion/index.md)
### Include restoration and peaks in the cost {#capacity-limits}
@@ -112,7 +112,7 @@ N_memory = floor((R_node - S_fixed - P_headroom) / m)
`S_fixed` covers the system and shared services; `P_headroom` reserves memory for active peaks, simultaneous restoration and temporary copies. The table's multiplier assumes the same available budget before and after optimization. Additional shared-engine memory or restoration headroom requires multiplying by the ratio of the new available budget to the old. Staggered waits, restoration admission and hard budgets determine deployable capacity.
-Offload and restoration can also extend task duration. In the same historical static batch, raw offload takes about 44–98 ms. The subsequent complete task—including restoration, a 64 MiB digest and write/fsync/read-back verification—takes about 156–178 ms longer than without offload. These are single observations during background compilation, rather than isolated resume latency or a tail-latency guarantee. [Timing definitions and data](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/memory/README.md#published-curves-and-archived-history)
+Offload and restoration can also extend task duration. In the same historical static batch, raw offload takes about 44–98 ms. The subsequent complete task—including restoration, a 64 MiB digest and write/fsync/read-back verification—takes about 156–178 ms longer than without offload. These are single observations taken during background compilation; they are not isolated resume latency or a tail-latency guarantee. [Timing definitions and data](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/memory/README.md#published-curves-and-archived-history)
If end-to-end task duration increases by a fraction `delta`, calculate average residency over the complete task in each implementation. Memory-time cost per completed task changes by:
@@ -146,6 +146,6 @@ The prototype should progressively replace the estimate's assumptions with obser
| Simultaneous wakeups, read/write bytes, active/restore peaks and the latency distribution to first useful execution | Whether headroom, bandwidth and queueing support the estimated capacity; tail latency requires enough samples |
| Original-call outputs, errors, ordering, synchronization, cancellation, task completions and end-to-end latency | Whether additional execution contexts preserve correctness and complete useful work |
-Existing foundations include controlled file and network paths, pause and RAM-offload primitives, and an experimental host write buffer. Automatic wait detection, I/O handoff, completion-driven wakeups and resumption scheduling still need end-to-end integration and validation. The two figures illustrate that target mechanism. [Wait and offload experiment](../design/experimental/vcpu-idle-offload/index.md), [Agent I/O completion](../design/experimental/agent-io-completion/index.md)
+Existing foundations include controlled file and network paths, pause and RAM-offload primitives, and an experimental host write buffer. Automatic wait detection, I/O handoff, completion-driven wakeups and resumption scheduling still need end-to-end integration and validation. [Wait and offload experiment](../experimental/vcpu-idle-offload/index.md), [Agent I/O completion](../experimental/agent-io-completion/index.md)
-**pVisor aims to give Agents the familiar execution style of transparent coroutines, with a runtime that turns waits into opportunities to share resources. The VM provides the context and control boundary for that transition.**
+**Transparent coroutines are the closest precedent: sequential code, shared resources, runtime-managed waits. pVisor applies that model to Agent execution, with the VM as the context and control boundary.**
diff --git a/docs/src/en/why/assets/agent-transparent-scheduling.svg b/docs/src/en/design/research/assets/agent-transparent-scheduling.svg
similarity index 100%
rename from docs/src/en/why/assets/agent-transparent-scheduling.svg
rename to docs/src/en/design/research/assets/agent-transparent-scheduling.svg
diff --git a/docs/src/en/why/assets/agent-vm-coroutine-bridge.svg b/docs/src/en/design/research/assets/agent-vm-coroutine-bridge.svg
similarity index 100%
rename from docs/src/en/why/assets/agent-vm-coroutine-bridge.svg
rename to docs/src/en/design/research/assets/agent-vm-coroutine-bridge.svg
diff --git a/docs/src/en/why/assets/agent-workload-phases.svg b/docs/src/en/design/research/assets/agent-workload-phases.svg
similarity index 100%
rename from docs/src/en/why/assets/agent-workload-phases.svg
rename to docs/src/en/design/research/assets/agent-workload-phases.svg
diff --git a/docs/src/en/why/assets/io-events-coroutines.svg b/docs/src/en/design/research/assets/io-events-coroutines.svg
similarity index 100%
rename from docs/src/en/why/assets/io-events-coroutines.svg
rename to docs/src/en/design/research/assets/io-events-coroutines.svg
diff --git a/docs/src/en/why/assets/io-thread-timelines.svg b/docs/src/en/design/research/assets/io-thread-timelines.svg
similarity index 100%
rename from docs/src/en/why/assets/io-thread-timelines.svg
rename to docs/src/en/design/research/assets/io-thread-timelines.svg
diff --git a/docs/src/en/design/research/cluster-execution.md b/docs/src/en/design/research/cluster-execution.md
deleted file mode 100644
index 863aae31..00000000
--- a/docs/src/en/design/research/cluster-execution.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Cluster-scale execution and centralized evidence
-
-Scale execution across hosts through **external orchestration**, while keeping each execution's boundary and evidence explicit. Kubernetes, Ray or a training framework may own host selection and business workflows; pVisor does not replace them with a distributed product control plane.
-
-## Local execution building blocks {#execution-flow}
-
-Ordinary `pvisor run` owns a Job/Run/Attempt through native executors, optional staging and Gateway, and produces execution records. The [single-node daemon](../daemon/index.md) instead owns local native VM sandbox admission, lifecycle, TTL and service endpoints. Its partial OpenSandbox profile does not automatically supply native Job semantics, VM restore, stage/apply, offload or centralized Run Bundles.
-
-Native node resources can retain immutable environment/backing ownership on one host, independently of the daemon. They do not share physical RAM across machines and are not integrated with the daemon backend. See [shared working sets](../daemon/shared-working-set.md).
-
-The earlier Controller/Worker implementation explored distributed execution and evidence delivery. Its archived measurements retain that historical scope; they do not describe the new daemon or validate a current distributed product.
-
-## Product and external integration boundaries {#boundary}
-
-| Layer | Current responsibility | Integration/validation remaining |
-| --- | --- | --- |
-| Native pVisor execution | Job lifecycle, executor controls, staging, optional Gateway and records | Orchestrator adapters and representative workload acceptance |
-| Sandbox daemon | NativeRuntime VM admission, durable supervisor ownership, lifecycle and real-service proxy | Supplied/validated bootstrap and SDK profile; no stage/checkpoint API or density evidence |
-| Native node resources | Same-host immutable ownership, pins and bounded warmth | Daemon wiring, full transient accounting and workload measurements |
-| External orchestration | Host choice, queues, dependencies, retries and tenancy | Explicit execution/evidence handoff and business-effect reconciliation |
-| Evidence/checkpoint repositories | Native integrity, publication and retention contracts | Central collection, authorization, replication and cross-host compatibility |
-| Review/release services | Consume explicitly retained outputs | Baseline checks, selective acceptance, business reconciliation and publication |
-
-A local record path or uploaded JSON is not a complete transfer of files. A downloadable checkpoint does not prove arbitrary-host restore compatibility. Define pinned inputs, runtime profiles, model versions and storage authorization before interpreting recovery as equivalent execution.
-
-## Experiments to design {#validation}
-
-Compare external orchestration using pVisor execution boundaries against pinned Kubernetes/Ray or training-framework baselines. Fix workloads, resources, models and output checks; measure useful completion throughput, first-result/restore tails, whole-group memory and centralized-review cost. Extend [concurrent-density methodology](../../benchmarks/density.md), without extrapolating daemon gains from historical empty tasks or native sharing mechanisms.
-
-Inject host loss, daemon/orchestrator downtime, partitions, full disks, interrupted collection and credential revocation. Track orchestrator work identity, local sandbox or Job/Run/Attempt identity, native observations and artifacts separately. A timeout or control identity does not prove external effects stopped; retry policy must reconcile unknown effects.
-
-No cross-host recovery, exactly-once external effects or daemon density advantage is established by this research direction. Current daemon [operations](../daemon/operations.md) define only local behavior.
-
-## Research questions {#research}
-
-- What minimal handoff preserves requested policy, installed controls, observed outcomes and complete evidence between execution and orchestration?
-- Which retained inputs and runtime compatibility checks make a restore portable, and which effects require business reconciliation rather than replay?
-- How much supervision does batch review save at fixed correctness and audit coverage, including collection and storage costs?
-- Does immutable sharing or bounded laziness improve first useful result and full completion under equal total resources?
-
-See [parallel agents](../../guides/parallel-agents.md) for local workflows and [RL execution substrate](rl-execution-substrate.md) for training integration. Research plans do not create a product scheduler or substitute for production acceptance.
diff --git a/docs/src/en/design/research/design-documents.md b/docs/src/en/design/research/design-documents.md
deleted file mode 100644
index c0873883..00000000
--- a/docs/src/en/design/research/design-documents.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# Open-source design references
-
-[ByteHook’s project introduction and principles](https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md) is the main writing reference for pVisor’s design chapter. It establishes prerequisite low-level models, diagrams objects and calls, then explains engineering choices and constraints. Readers reach implementation through causal reasoning.
-
-For pVisor, the sequence is execution problems and ownership → VMs, vCPUs and virtio → memory mappings, sharing and faults → filesystems, images and network requests → snapshot consistency and journal commits → costs and experiments. Figures should show actual buffers, files, queues, references and state changes; prose follows each figure to explain why its steps are necessary.
-
-[Design and underlying mechanisms](../index.md) connects these layers through a task that reads a file, accesses HTTPS and writes configuration. The projects below supply narrower references that complement this continuous explanation.
-
-## Projects and specific articles {#projects}
-
-These are recommendations about writing and organization, rather than project-quality or performance rankings. Sources were visited on 2026-10-07; implementation details retain each project's stated revision scope.
-
-| Project and article | Useful writing practice | Application to pVisor |
-| --- | --- | --- |
-| [ByteHook · Introduction and principles](https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md) | Derives mechanisms from prerequisite models, diagrams objects and calls, and explains constraints | Connect syscalls, virtqueues, backing, preimages and commit points to the complete execution path |
-| [TigerBeetle · Architecture](https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/ARCHITECTURE.md) | Starts with workloads and constraints, then explains persistence and decisions through an overall model | Describe reuse, writes, failure and budgets before slots/references, Journal and snapshots |
-| [Firecracker · Design](https://github.com/firecracker-microvm/firecracker/blob/main/docs/design.md) | Connects host integration, processes/threads and devices, showing fast paths and host responsibilities | Show API, supervisors, VMs, devices and pools; explain control and data paths separately |
-| [gVisor · Architecture guide](https://gvisor.dev/docs/architecture_guide/intro/) | Uses syscall examples to explain Sentry/host relationships, mechanisms and compatibility | Trace one file/network request through actual interception and Host/OCI/VM coverage |
-| [Tokio · Runtime](https://docs.rs/tokio/latest/tokio/runtime/index.html) | Moves from usage to thread lifetimes, fairness assumptions and scheduler behavior, separating guarantees from implementation | Explain waiter cancellation, accepted operations, completion tasks and runtime shutdown |
-| [etcd · Client design](https://etcd.io/docs/v3.6/learning/design-client/) | Explains connections and requests through client responsibilities, errors and retries | Describe lost ACKs, Unknown, request IDs, retries and reconciliation; locate ambiguity in sequences |
-| [Ray · Architecture whitepapers](https://docs.ray.io/en/latest/ray-contribute/whitepaper.html) | Separates overall architecture from internal topics and retains whitepaper versions | Separate orchestration, node ownership, execution paths and research; retain proposal status |
-| [Rust Compiler Development Guide · Overview](https://rustc-dev-guide.rust-lang.org/overview.html) | Moves from processing flow to queries, data structures and source entry points, identifying simplifications | Trace Job/Attempt calls into core data, lifecycle and implementation files |
-| [CockroachDB · Design](https://github.com/cockroachdb/cockroach/blob/master/docs/design.md) | Layer diagrams connect data abstractions, components and physical layout, with historical limits | Explain logical Jobs, persistent records and backing objects; identify historical designs |
-
-Choose narrower references by the question: Firecracker for host integration, Tokio for concurrency guarantees, etcd for failed requests and retries. Keep pVisor’s own data and execution paths as the narrative, so readers can understand behavior without first memorizing a component catalog.
-
-## Explaining one mechanism completely {#structure}
-
-
-
-1. **Problem and constraints.** Who encounters which cost? Which resources and trust assumptions are fixed?
-2. **Minimal system model.** Who owns state, may mutate it and must release it?
-3. **Normal flow.** Trace one real request through calls, data, commit points and results.
-4. **Failure flow.** Explain retained state and reconciliation after cancellation, disconnects, write failure and process exit.
-5. **Tradeoffs.** Describe costs removed and introduced, plus where alternatives fit.
-6. **Implementation and evidence.** Provide source entry points and materials; distinguish behavior, workload results and proposals.
-
-For Journal, explain event identities and idempotent retries before diagramming append, write, sync and receipts. Write failure retains Unknown; retrying the same event does not create a second record. Readers can understand failure semantics without interpreting LocalSync as remote replication. [Journal design](../journal.md) owns the detailed contract.
-
-## Choosing figures and their detail {#figures}
-
-| Reader's question | Suitable figure | Essential information |
-| --- | --- | --- |
-| Who owns each responsibility? | Layer or ownership diagram | Owners, boundaries, call direction and external dependencies |
-| How does an operation complete? | Sequence or lifecycle diagram | Acceptance, commit, confirmation, cancellation and return |
-| Where is data stored? | Physical layout or mapping diagram | Objects, references, offsets, private/shared state and reclaim conditions |
-| What survives a crash? | Failure-state diagram | Durable intent, live observations, Unknown and reconciliation |
-| Why is it cheaper or slower? | Sourced experiment figure | Budget, baseline, samples, failures, peaks and applicable workload |
-
-Each figure answers one main question. Arrows identify calls, data, references or state changes; each figure explicitly defines its solid and dashed lines. SVG retains searchable text and scalable geometry; prose supplies an example and the main tradeoff. Component relationships should map to code or contracts.
-
-The overall architecture matches the documentation with a navy background, blue-gray layers, light-blue headings and nested rounded shapes. Execution mechanisms remain the visual focus, with distinct outlines expressing nesting. Within `pvisor-vm`, vCPUs, RAM and virtual devices appear side by side, above their coordinated freeze and platform adaptation. Shared contracts and optional extensions remain supporting annotations. VM, memory, filesystem and network block diagrams reuse this visual language to expand their respective boundaries. Each topic explains the diagram and ownership, one access path, core data and mechanisms, failure and cleanup, then system connections and source entry points. Detailed mechanism figures use a textbook layered style: blue bands of different brightness separate execution layers, address spaces or phases; dark cards represent concrete objects; corresponding objects stay aligned across layers or before/after states. Numbers connect to the prose, and labels also express color meanings. Sequence diagrams retain their time axis, byte layouts retain offsets and proportions, and long figures split into independently readable details.
-
-Figures use `#0d1b30` for the canvas, `#142840` for cards, `#a8cefa` for accents and `#e9eef8` for text, matching the site theme. Teal, amber and muted red retain each figure's distinctions between states such as sharing, changes and conflicts, alongside text labels. SVGs contain their complete palette so standalone viewing and PNG exports retain the same appearance.
-
-## Separate designs, decisions and research {#status}
-
-Implementation designs describe current ownership and behavior; [ADRs](../decisions/index.md) retain context, options and consequences; research retains hypotheses, experiments and counterexamples. External articles guide expression. pVisor's implementation status and performance claims remain constrained by its own revisions and evidence.
diff --git a/docs/src/en/design/research/index.md b/docs/src/en/design/research/index.md
index ba7a6334..195e3817 100644
--- a/docs/src/en/design/research/index.md
+++ b/docs/src/en/design/research/index.md
@@ -1,6 +1,6 @@
# Research directions
-OS and MLSys research concerns correct task completions under a fixed resource budget and the human cost of handling their results. pVisor supplies execution, state and evidence mechanisms; orchestrators and trainers compose workloads and evaluate benefits through controlled experiments.
+OS and MLSys research concerns correct task completions under a fixed resource budget and the human cost of handling their results. pVisor supplies execution, state and evidence mechanisms; orchestrators and trainers compose workloads and evaluate benefits through controlled experiments. For the full cost narrative across environment preparation, tool execution, model waiting and failure rework, see [Agent task lifecycle cost](agent-lifecycle-cost.md).
## From mechanisms to falsifiable conclusions {#research-loop}
@@ -10,9 +10,19 @@ A useful hypothesis specifies workloads and counterexamples. VMs with equal base
## Execution and orchestration ownership {#ownership}
-pVisor owns individual execution boundaries and observations; the node-local daemon owns sandbox identity and lifecycle. External orchestration owns host selection, queues, dependencies and application retries; trainers own models, sampling, reward and evaluator versions. The [daemon API](../daemon/index.md) does not expose native Job staging, execution checkpoints or Run Bundle export, so research integration needs an explicit execution/evidence handoff.
+pVisor owns individual execution boundaries and observations; the node-local daemon owns sandbox identity and lifecycle. External orchestration (Kubernetes, Ray or training frameworks) owns host selection, queues, dependencies and application retries; trainers own models, sampling, reward and evaluator versions. pVisor does not replace them with a distributed product control plane.
-A proposed adapter binds external work identities to local Jobs/Attempts or sandboxes, pins inputs and runtime revisions, and collects results with artifacts. Timeouts and disconnects preserve unknown outcomes for reconciliation before retry. [External orchestration research](cluster-execution.md) examines this handoff; placement remains external.
+The [daemon API](../daemon/index.md) does not expose native Job staging, execution checkpoints or Run Bundle export, so research integration needs an explicit execution/evidence handoff. Current responsibilities and open items per layer:
+
+| Layer | Current responsibility | To integrate / validate |
+| --- | --- | --- |
+| Native pVisor execution | Job lifecycle, executor control, staging, optional Gateway and recording | Orchestration adapters and representative workload acceptance |
+| Sandbox daemon | NativeRuntime VM admission, persistent supervisor identity, lifecycle and real service proxy | Bootstrap provisioning/validation and SDK profiles; no stage/checkpoint API or density evidence |
+| Native node resources | Node-local immutable ownership, pins and bounded warming | Daemon integration, complete transient accounting and workload measurement |
+| External orchestration | Host selection, queues, dependencies, retries and tenants | Explicit execution/evidence handoff and business side-effect reconciliation |
+| Evidence/checkpoint stores | Native integrity, publication and retention contracts | Centralized collection, authorization, replication and cross-host compatibility |
+
+A local record path or an uploaded JSON does not represent complete file transfer; a downloadable checkpoint does not prove compatible restoration on an arbitrary host. Archived measurements from the retired Controller/Worker implementation keep their historical scope and do not describe the current daemon.
## Three kinds of state and evaluation {#state}
@@ -22,7 +32,15 @@ A proposed adapter binds external work identities to local Jobs/Attempts or sand
| Agent trajectory | Model context and tool history | Prefix preparation, re-execution differences and model continuation |
| VM execution checkpoint | CPU/RAM/device/file state of supported profiles | Consistency, compatibility, restoration and fork costs |
-Tool re-execution produces fresh observations; remote service state and training metadata are retained separately. Execution success, task reward and file acceptance are evaluated independently; see the [RL substrate](rl-execution-substrate.md) for the proposed integration.
+Tool re-execution produces fresh observations; remote service state and training metadata are retained separately. Execution success, task reward and file acceptance are evaluated independently: reward is computed by the evaluator, and a pVisor success is only an execution result.
+
+## The execution contract of one rollout {#rollout-contract}
+
+Inputs include the task ID, attempt ID, repository commit or image digest, workspace, agent command, policy, resource budget and random seed. Outputs include the end state, exit code, file candidates, the Run Bundle, the native trajectory, and the Gateway Journal when capture is enabled. The trainer associates these artifacts with model versions, sampling parameters, reward and evaluator versions. Environment-preparation failures, permission denials and upstream request failures have their own categories; infrastructure failures are handled by predetermined rules when evaluating model problem-solving.
+
+The minimal integration order: first follow the [rollout guide](../../guides/rl-rollouts.md) to collect and score candidates for one offline task; then increase concurrency with separate workspaces so each attempt's files and records stay independent; finally attach native Agent trajectories and validate prefix preparation, tool re-execution and model continuation separately. Replay tools produce fresh observations, so a replayed run's new observations and the old session text are not simply the same experimental input.
+
+What still needs experimental evidence: completed rollouts per second, tail latency, disk and resident memory per candidate, fork/checkpoint cost, tool re-execution cost and reward delta. Pin model-serving capacity and separate substrate bottlenecks from model-serving bottlenecks. Async queues, cross-node fault tolerance, reward deduplication, shared-prefix benefits and large-scale sampling still require integration and measurement.
## Levels of benefit evidence {#evidence}
@@ -33,8 +51,17 @@ Tool re-execution produces fresh observations; remote service state and training
- **Product evidence:** include preparation, SDKs, guest services, reclamation, sustained concurrency and failure scope.
- **Supervision evidence:** measure actual review effort, rejection and rework; machine CPU cost does not measure human attention.
-Native pool or offload probes alone do not establish complete daemon density. Controller/Worker data retains its historical identity. Orchestration and RL adapters remain research/planning work, with benefits requiring their own workload validation.
+Native pool or offload probes alone do not establish complete daemon density. Orchestration and RL adapters remain research/planning work, with benefits requiring their own workload validation; when injecting host loss, daemon/orchestrator downtime, partitions or full disks, a timeout or control identity does not prove that external side effects stopped, and retry policies must reconcile unknown side effects. This direction establishes neither cross-host restoration, exactly-once external side effects, nor daemon density advantages.
+
+## Research questions {#questions}
+
+- What minimal handoff between execution and orchestration preserves requested policy, installed controls, observed results and complete evidence?
+- Which retained inputs and runtime compatibility checks make restoration portable, and which side effects need business reconciliation instead of replay?
+- Under fixed correctness and audit coverage, how much supervision cost does batch review save, including collection and storage costs?
+- Under the same total resources, can immutable sharing or bounded on-demand loading improve first useful results and complete completions?
+
+Research plans do not create a product scheduler and do not replace production acceptance.
-## Using designs and papers {#references}
+## Public materials and writing references {#references}
-[Public research outputs](publications.md) retain materials, revisions and experiment scope; no formal papers, external reports or talks are registered yet. [Open-source design references](design-documents.md) explain problem statements, layer diagrams, sequences, failure semantics and tradeoffs without turning writing practices into product guarantees.
+No formal papers, external reports or talks are currently registered; the public technical material is the design documentation and benchmark evidence in this repository (for example [replay fidelity](../../benchmarks/replay-fidelity.md)). Cite conclusions with the report date, machine, executor, workload and statistical scope. Design-writing practice and open-source expression references are maintained in the repository's [docs/README.md](https://github.com/DeepLink-org/pvisor/blob/main/docs/README.md) and are not repeated here.
diff --git a/docs/src/en/design/research/publications.md b/docs/src/en/design/research/publications.md
deleted file mode 100644
index 00300024..00000000
--- a/docs/src/en/design/research/publications.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Papers, reports, and talks
-
-pVisor's public technical material currently consists of repository designs and engineering experiments. Use these records to understand execution mechanisms, select experiment subjects, and trace results to their source revisions and environments.
-
-## Existing engineering material {#materials}
-
-The [Replay fidelity report](../../benchmarks/replay-fidelity.md) measures short-prefix preparation for pinned trajectory formats: it checks historical boundaries, command arguments and tool observations, and records elapsed time from CLI launch through preparation exit. `prepare-only` executes no tools, starts no Agent and leaves the workspace unchanged. Use these results to select historical context inputs; the [Replay design](../replay.md) explains the responsibilities of prefix preparation, tool re-execution and live continuation.
-
-The [RAM offload appendix](../offload/index.md#experiments) retains the 2026-10-03 storage/control checks and a compressed backing sample. Use it to study publication order, base/delta inheritance and storage-size accounting. The record separately lists passing mechanism checks, tests blocked before guest execution, and the sample files' logical sizes and allocated space.
-
-Retired [Controller/Worker evidence](../cluster-performance-analysis.md) provides historical measurements of frozen artifacts. Readiness probes describe VM readiness time; history-query measurements describe query and warm-replay costs for retained records. Completed-task cohorts retain their own provenance and statistical definitions. Cite data separately by experiment subject and cohort.
-
-Specific measurement gaps: the replay report has not measured fidelity of continuation with a real model; the offload sample has not measured net physical-memory savings or multi-VM density; current daemon performance and density await independent experiments.
-
-## Record a new public output {#record}
-
-Each entry needs title, authors or speaker, publication date, public link, material type, source commit, agent/model versions, data and reproduction entry, and conclusion scope. Papers should include venue and DOI; identify preprints, engineering reports, and talks by type.
-
-If research uses an unreleased branch, record its commit and differences from the release. Preserve the original record when implementation changes, adding new validation or a superseding explanation.
-
-## How to cite {#citation}
-
-Cite performance conclusions with report date, hardware, executor, task, and statistical definitions. Cite designs with a source commit or release version. Retain the environment conditions for effects observed in a specific environment.
-
-No formal paper, external report, or talk is currently registered here. Contributions should provide accessible links and reproduction details using the fields above. Distinguish a design proposal, a passing mechanism test and a measured workload result when citing them; implementation guarantees belong to the matching version's documentation and tests.
diff --git a/docs/src/en/design/research/rl-execution-substrate.md b/docs/src/en/design/research/rl-execution-substrate.md
deleted file mode 100644
index eb6062b1..00000000
--- a/docs/src/en/design/research/rl-execution-substrate.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# An execution substrate for reinforcement learning
-
-Agent training needs traceable attempts: their starting inputs, tool calls, results, and reasons for stopping. pVisor can provide individual execution and evidence collection while the trainer retains reward, sampling, and scheduling in its control layer.
-
-## The execution contract for a rollout {#contract}
-
-Inputs include task ID, attempt ID, repository commit or image digest, workspace, agent command, policy, resource budget, and seed. Outputs include terminal status, exit code, candidate files, Run Bundle, native trajectory, and a Gateway Journal when capture is enabled.
-
-The trainer associates these artifacts with model version, sampling parameters, reward, and evaluator version. Setup failures, permission rejection, and upstream failures have distinct categories; evaluate model task-solving ability using predetermined handling for these infrastructure failures.
-
-## Three kinds of reusable state {#state}
-
-| State | What it reuses | What must be saved separately |
-| --- | --- | --- |
-| File checkpoint | Candidate files and staged layers over a fixed baseline | Model context and external service state |
-| Native agent trajectory | Session lineage, tool calls, and observations | Resettable workspace, agent and model versions |
-| VM snapshot | VM runtime state supported by the specific implementation | Scheduler metadata, model service, and remote side effects |
-
-Re-executing tools produces fresh observations. Reproducibility experiments should fix inputs and versions while recording those differences; fresh replay observations and old session text cannot simply be treated as identical experimental inputs.
-
-## A minimal integration sequence {#integration}
-
-Start with the [rollout guide](../../guides/rl-rollouts.md) to collect and score one offline candidate. Increase concurrency with independent workspaces and verify that every attempt has separate files and records. Then add native agent trajectories and validate prefix preparation, tool re-execution, and model continuation separately.
-
-The evaluator calculates reward. Successful pVisor completion is an execution outcome; task scores require task-specific tests, and file changes must be judged against the task requirements.
-
-## What experiments must establish {#experiments}
-
-Measure completed rollouts per second, tail latency, candidate storage and resident memory, fork/checkpoint cost, tool replay cost, and reward delta. Fix model-service capacity and distinguish substrate bottlenecks from model-service bottlenecks.
-
-Asynchronous queues, cross-node recovery, reward deduplication, shared-prefix benefits, and large-scale sampling need integration and measurement. See [Replay fidelity](../../benchmarks/replay-fidelity.md), [Concurrent density](../../benchmarks/density.md), and [Cluster execution](cluster-execution.md) for methods.
diff --git a/docs/src/en/guides/agents/aider.md b/docs/src/en/guides/agents/aider.md
deleted file mode 100644
index 4f7f159c..00000000
--- a/docs/src/en/guides/agents/aider.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# aider
-
-!!! note "Experimental"
- The commands below use only existing pVisor options, but no pinned Agent-version end-to-end regression has been run yet.
-
-## Integration starting point using the existing CLI
-
-Install aider inside the selected executor and verify it runs in an independent test project. The target below is api.openai.com:443; the example assumes you already selected the matching OpenAI service in the agent's own configuration — pVisor does not configure providers for you.
-
-```bash
-pvisor run --safe --overlaynet-allow api.openai.com:443 \
- --pass-env OPENAI_API_KEY -- aider
-pvisor status --review last
-pvisor apply last --path src
-```
-
-Explicit allow replaces safe preset lists. Add authentication/provider/dependency destinations individually. Only the direct executable name selects adaptation; shell wrappers change matching. Safe HOME writes are discarded, so do not depend on persistent login state from this run.
diff --git a/docs/src/en/guides/agents/gemini-cli.md b/docs/src/en/guides/agents/gemini-cli.md
deleted file mode 100644
index 70eec9eb..00000000
--- a/docs/src/en/guides/agents/gemini-cli.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Gemini CLI
-
-!!! note "Experimental"
- The commands below use only existing pVisor options, but no pinned Agent-version end-to-end regression has been run yet.
-
-## Integration starting point using the existing CLI
-
-Install Gemini CLI inside the selected executor and verify it runs in an independent test project. The target below is generativelanguage.googleapis.com:443; configure the model provider in the agent itself — pVisor does not do that for you.
-
-```bash
-pvisor run --safe --overlaynet-allow generativelanguage.googleapis.com:443 \
- --pass-env GEMINI_API_KEY -- gemini
-pvisor status --review last
-pvisor apply last --path src
-```
-
-Explicit allow replaces safe preset lists. Add authentication/provider/dependency destinations individually. Only the direct executable name selects adaptation; shell wrappers change matching. Safe HOME writes are discarded, so do not depend on persistent login state from this run.
diff --git a/docs/src/en/guides/agents/index.md b/docs/src/en/guides/agents/index.md
index 5f183e46..59d6089e 100644
--- a/docs/src/en/guides/agents/index.md
+++ b/docs/src/en/guides/agents/index.md
@@ -14,15 +14,28 @@ pvisor apply last --path src
| --- | --- | --- | --- |
| Claude Code | `claude` | `api.anthropic.com` | [Claude Code](claude-code.md) |
| Codex CLI | `codex` | `api.openai.com`, `chatgpt.com`, `ab.chatgpt.com` | [Codex CLI](codex.md) |
-| Gemini CLI | `gemini` | `generativelanguage.googleapis.com` | [Gemini CLI](gemini-cli.md) |
+| Gemini CLI | `gemini` | `generativelanguage.googleapis.com` | See [`--safe` presets](../../reference/cli.md#safe-参数预设) |
| ZCode | `zcode` | `api.z.ai`, `open.bigmodel.cn` | See [`--safe` presets](../../reference/cli.md#safe-参数预设) |
-| aider | — | No preset; needs `--overlaynet-allow` | [aider](aider.md) |
-| OpenCode | — | No preset; needs `--overlaynet-allow` | [OpenCode](opencode.md) |
+| aider | `aider` | No preset; needs `--overlaynet-allow` | See "Agents without presets" below |
+| OpenCode | `opencode` | No preset; needs `--overlaynet-allow` | See "Agents without presets" below |
| Any script | Any | None; `bash`, `sh`, `zsh`, `fish` reuse the Codex destinations | [Any script](custom-scripts.md) |
Unknown commands deny outbound access. `--overlaynet-allow HOST:PORT` grants it explicitly and replaces preset lists. Matching uses the **direct executable filename**; shell wrappers do not trigger agent-specific adaptation.
+## Agents without presets {#custom-agent}
+
+Take aider as the example: install it in the selected executor, pick the provider in the agent's own configuration, then explicitly allow its API destination and pass the credential variable (variable names come from the agent's own documentation, such as `OPENAI_API_KEY` or `GEMINI_API_KEY`):
+
+```bash
+pvisor run --safe --overlaynet-allow api.openai.com:443 \
+ --pass-env OPENAI_API_KEY -- aider
+pvisor status --review last
+pvisor apply last --path src
+```
+
+Logins, other providers and dependency downloads each need their own allowed destination.
+
After a run, check the installed controls and observations in the Run Bundle. Supported agent version ranges are not systematically tested; see [end-to-end tasks](../../benchmarks/agent-tasks.md).
!!! note "Experimental integrations"
- The aider, Gemini CLI, and OpenCode guides use only existing pVisor options and stay experimental until a pinned-version regression exists. The Linux host selective proxy is cooperative; use a prepared VM when you need enforcement.
+ The aider, Gemini CLI, and OpenCode integrations use only existing pVisor options and stay experimental until a pinned-version regression exists. The Linux host selective proxy is cooperative; use a prepared VM when you need enforcement.
diff --git a/docs/src/en/guides/agents/opencode.md b/docs/src/en/guides/agents/opencode.md
deleted file mode 100644
index 17f5b253..00000000
--- a/docs/src/en/guides/agents/opencode.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# OpenCode
-
-!!! note "Experimental"
- The commands below use only existing pVisor options, but no pinned Agent-version end-to-end regression has been run yet.
-
-## Integration starting point using the existing CLI
-
-Install OpenCode inside the selected executor and verify it runs in an independent test project. The target below is api.openai.com:443; the example assumes you already selected the matching OpenAI service in the agent's own configuration — pVisor does not configure providers for you.
-
-```bash
-pvisor run --safe --overlaynet-allow api.openai.com:443 \
- --pass-env OPENAI_API_KEY -- opencode
-pvisor status --review last
-pvisor apply last --path src
-```
-
-Explicit allow replaces safe preset lists. Add authentication/provider/dependency destinations individually. Only the direct executable name selects adaptation; shell wrappers change matching. Safe HOME writes are discarded, so do not depend on persistent login state from this run.
diff --git a/docs/src/en/guides/daemon/boundaries.md b/docs/src/en/guides/daemon/boundaries.md
deleted file mode 100644
index 6fb939ff..00000000
--- a/docs/src/en/guides/daemon/boundaries.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Daemon runtime and integration boundaries
-
-Choose `pvisor-daemon` for node-local native VM sandbox lifecycle, or `pvisor run` for the public Job/file-review workflow. The daemon embeds native execution but keeps separate API identities, state and capabilities.
-
-## Prepared-image contract {#images}
-
-Images are trusted local `images_dir/.json` manifests, not registry references. Fields are absolute independent Linux `rootfs` (never host `/` or overlapping daemon state), absolute guest bootstrap `entrypoint` argv, optional `cmd`, optional `env` and optional absolute firmware `library_dir`. Requested workload argv (or `cmd` if empty) is appended to `entrypoint`; request env overrides manifest env, without host environment inheritance or shell interpolation.
-
-The long-lived guest bootstrap must supervise workload, real OpenSandbox 1.1.0 execd and egress, initialize/authenticate services, forward signals and reap children. It must expose byte-transparent AF_VSOCK listeners on guest **CID 3**, ports **44772/18080**, bridging to real services. Supervisor loopback TCP publications connect through private Unix sockets and native vsock forwarding. A stock rootfs or sleeping process is insufficient.
-
-Create, Inspect of a Running VM and resume readiness checks require genuine HTTP 200 execd `/ping`, `/ready` with JSON `initialized: true`, and egress `/healthz` through the bridges, with bounded bodies. The daemon does not inject/initialize execd or synthesize command/SSE/file responses. Python SDK initialization resolves both endpoints even without network policy.
-
-Prepare the bootstrap and vsock bridges described above; an upstream image name alone cannot meet these requirements. The project **has not supplied a bootstrap or image recipe or performed end-to-end validation**; SDK-conformance validation and density measurements are also unavailable. This native VM backend does not use the old container `cap-drop=ALL` restriction.
-
-## Isolation and resource limits {#isolation}
-
-Requires Linux x86_64, usable `/dev/kvm`, trusted absolute paths and a writable delegated cgroup v2 hierarchy with enabled CPU/memory/PID controllers and `cgroup.kill`. Preflight checks real controller writes and the KVM API; there is no host, OCI command or registry-pull fallback.
-
-The native supervisor embeds `pvisor::PVisor` with only `VmExecutor` and holds its RunHandle in a detached subprocess. The sandbox cgroup caps the entire supervisor/VMM/helper tree: aggregate CPU rate **10–8000 millicores**, hard memory, zero swap, `pids.max=512` and group OOM. vCPU count rounds quota up to whole CPUs (at most 8); guest RAM rounds down to MiB, while the hard memory cap also includes host overhead. Full limit/readiness checks remain at create, Inspect and resume; endpoint lookup authenticates live Running state and deletion fences without repeating full health/cgroup checks per data request. See [service access](../../design/daemon/lifecycle.md#endpoints). Paused, failed and uncertain records retain conservative admission charges.
-
-The launch callback joins the identity-bound cgroup **before exec**, using a pre-opened `cgroup.procs` FD under the owner lock and checking started/deletion/tombstone markers. Supervisor startup verifies membership instead of moving an already-running Tokio process; supervisor/Tokio allocations and subsequent VM/helper children are charged inside the sandbox budget. Direct hidden-command invocation outside that cgroup fails closed.
-
-Native OverlayNet supplies VM outbound networking. OpenSandbox network-policy requests are unsupported and rejected; rejecting a request does not change egress to deny-all.
-
-The host account, daemon/firmware and prepared image must be trusted. Private state and same-UID IPC cannot block hostile same-UID or root code. Other local users may reach loopback publications, so configure service authentication and host access controls. Secrets stay out of supervisor argv and host environment but persist in private records. No security audit results are available; hostile multi-user isolation is outside the protection scope.
-
-Private IPC authenticates same-UID peers plus owner, sandbox ID, generation and secret token; durable identity binds boot ID and cgroup device/inode. IDs are never reused or relaunched. Lost IPC is uncertainty, not Missing or cleanup proof. Durable deletion intent and the supervisor exclusive lock fence late launch; cleanup uses identity-bound `cgroup.kill`, never a persisted PID or PID-based kill, and confirms an empty cgroup plus released lock before capacity release. Replaced or missing same-boot cgroups without durable tombstone proof do not prove absence.
-
-## OpenSandbox profile {#profile}
-
-Compatibility is pinned to OpenSandbox **1.1.0**, tag `release-1.1.0`, commit `b1a29cf93a823a95913f7943010febb3f29de05c`. Support is limited to the partial API profile below; full OpenSandbox and unmodified SDK end-to-end conformance have not been validated.
-
-| Capability | Current behavior |
-| --- | --- |
-| Image creation, list, inspect, delete | Local sandbox lifecycle; create accepts argv/env/metadata, CPU/memory limits and optional TTL |
-| Pause / resume | Acknowledged live vCPU pause/resume on the same Attempt, not a checkpoint |
-| Expiration renewal | Future RFC3339 deadline extending an existing TTL |
-| Endpoints | Daemon-routed execd 44772 and egress 18080 only |
-| Commands, files, health, metrics | Streamed to real upstream services in the prepared image |
-| Snapshots, templates/pools, metadata mutation, hooks | Unsupported |
-| Network policy, credential proxy, secure access, volumes, image auth | Unsupported creation options are rejected |
-| Arbitrary application ports, signed endpoints, WebSocket, CONNECT | Unsupported |
-| Stage/apply, checkpoint/fork, offload | Not integrated with this daemon backend |
-
-## Native VM, checkpoints and Gateway {#native}
-
-Native `pvisor run --executor vm` retains its KVM/HVF and rootfs requirements. The daemon uses the native VM executor, but does not expose these Job APIs. The [VM guide](../executors/vm.md) explains execution; [checkpoint and fork](../fork-checkpoint.md) covers local Job file checkpoints. Compatible owned-rootfs, no-network VM Jobs can use execution checkpoints; inspect `pvisor status --json` for capability and blockers, and follow the [CLI execution-checkpoint contract](../../reference/cli.md#full-vm-execution-checkpoints).
-
-A daemon pause is acknowledged vCPU pause on the same live Attempt, not a sealed RAM/CPU/device/filesystem snapshot. Daemon sandbox IDs are not Job IDs: do not pass them to `pvisor checkpoint`, `fork`, `apply` or `drop`. Native snapshot storage, node owners, shared image cache and the experimental macOS cold-page pool remain native facilities, not daemon templates or pools.
-
-For model request routing and capture in native Jobs, use the [Gateway guide](../capture.md) and [Agent integration](../agents/index.md). The daemon has no old Worker `gateway.routes` profile or integrated pVisor credential proxy/capture contract. Prepared services and applications own any model access; external API effects cannot be undone by file review.
diff --git a/docs/src/en/guides/daemon/index.md b/docs/src/en/guides/daemon/index.md
index ce70966a..59f10d1a 100644
--- a/docs/src/en/guides/daemon/index.md
+++ b/docs/src/en/guides/daemon/index.md
@@ -1,40 +1,37 @@
# Run the single-node daemon
-Install `pvisor-daemon` to manage image-based sandboxes on one Linux host through a partial OpenSandbox 1.1.0 API. It owns local admission, lifecycle, durable state and expiration. Use Kubernetes, Ray or your application for cross-node task scheduling, global DAGs and distributed leases; the daemon includes no Controller or Workers.
+Install `pvisor-daemon` to manage image sandboxes on one Linux host through an API partially compatible with OpenSandbox 1.1.0. The daemon owns node-local admission, lifecycle, persistent state and expiration cleanup.
+Cross-node scheduling, global DAGs and distributed leases belong to Kubernetes, Ray or your application. The daemon contains no Controller or Worker.
-## Prerequisites {#prerequisites}
+Use `pvisor-daemon` for node-local native VM sandbox lifecycles; use `pvisor run` for the public Job and file-review workflow.
-Requires Linux x86_64, usable `/dev/kvm`, trusted absolute paths and a writable delegated cgroup v2 hierarchy with enabled CPU/memory/PID controllers and `cgroup.kill`. Preflight checks real controller writes and the KVM API; there is no host, OCI command or registry-pull fallback.
+!!! warning
+ The project **has not supplied a guest bootstrap or image recipe and has not performed end-to-end validation**; SDK-conformance validation and density measurements are also unavailable. Every step below requires you to prepare images and vsock bridging yourself.
-Images are trusted local `images_dir/.json` manifests, not registry references. Fields are absolute independent Linux `rootfs` (never host `/` or overlapping daemon state), absolute guest bootstrap `entrypoint` argv, optional `cmd`, optional `env` and optional absolute firmware `library_dir`. Requested workload argv (or `cmd` if empty) is appended to `entrypoint`; request env overrides manifest env, without host environment inheritance or shell interpolation.
+## Prerequisites {#prerequisites}
-!!! warning
- Prepare your own guest bootstrap and vsock service bridges following the [image contract](boundaries.md#images). The project **has not supplied a bootstrap or image recipe or performed end-to-end validation**; SDK-conformance validation and density measurements are also unavailable.
+You need Linux x86_64, a usable `/dev/kvm`, trusted absolute paths, and a writable, delegated cgroup v2 hierarchy with the CPU/memory/PID controllers and `cgroup.kill` enabled.
-## Install the executable {#install}
+Preflight checks perform real controller writes and KVM API calls. There is no host, OCI-command or registry-pull fallback.
-On Linux x86_64, install the `pvisor` wheel to get the standalone `pvisor-daemon` executable in your Python environment's bin directory. macOS wheels do not include the daemon:
+An image is a trusted local `images_dir/.json` manifest, not a registry reference. Fields include an absolute-path standalone Linux `rootfs` (neither the host `/` nor overlapping daemon state), an absolute-path guest bootstrap `entrypoint` argv, optional `cmd`, optional `env`, and an optional absolute-path firmware `library_dir`. The requested workload argv (or `cmd` when empty) is appended to `entrypoint`; request env overrides manifest env, does not inherit the host environment, and receives no shell interpolation.
-```bash
-pip install pvisor
-pvisor-daemon --help
-pvisor-daemon protocol
-```
+The long-running guest bootstrap must supervise the workload, a real OpenSandbox 1.1.0 execd and egress; initialize/authenticate the services itself; forward signals and reap children. It must provide byte-transparent AF_VSOCK listeners on ports **44772/18080** of guest **CID 3**, bridging the real services. The supervisor's loopback TCP publications reach the guest over a private Unix socket and native vsock forwarding. A plain rootfs or a sleep-only process is not enough. Create, Inspect on a Running VM and resume readiness checks require, through the bridge, a real HTTP 200 from execd `/ping`, JSON `initialized: true` from `/ready`, and egress `/healthz`, with bounded response bodies. The daemon neither injects/initializes execd nor synthesizes command/SSE/file responses.
-For the latest `main` build, use the [nightly wheel installer](../../start/installation.md). Alternatively, prepare the [native build prerequisites](../../community/development.md) and run these local source-installation commands at your selected revision. This source-installation path has not yet been validated:
+## Install and start {#install}
+
+Install the `pvisor` wheel on Linux x86_64 to get the standalone `pvisor-daemon` executable in the Python environment's bin directory. macOS wheels do not include the daemon:
```bash
-cargo install --locked --path crates/pvisor-daemon --bin pvisor-daemon
+pip install pvisor
pvisor-daemon --help
pvisor-daemon protocol
```
-`protocol` prints the pinned OpenSandbox version and commit. Local source installation is separate from installing the Python `pvisor` package. Both installation paths require you to prepare images separately. Pin the source revision, SDK 1.1.0 and image contents together; SDK conformance still needs end-to-end validation.
+For the latest `main` build, use the [nightly wheel installer](../../start/installation.md). `protocol` prints the pinned OpenSandbox version and commit. Pin the source revision, SDK 1.1.0 and image contents together. The local source-install path (`cargo install --locked --path crates/pvisor-daemon`) is not verified.
-## Start the API {#start}
-
-`serve` constructs `NativeRuntime` using the implemented, required `--images-dir` and `--cgroup-root` flags. Cargo links `pvisor` and `pvisor-core`; synchronous `main` calls `pvisor::run_krun_internal_if_requested()` before argument parsing or Tokio, then dispatches the hidden `native-supervisor --sandbox-dir ABSOLUTE_PATH` command. Once the images and cgroup hierarchy are ready, start the API with the following CLI configuration.
+`serve` constructs the `NativeRuntime` from the implemented and required `--images-dir` and `--cgroup-root`:
```bash
export OPEN_SANDBOX_API_KEY="$(openssl rand -hex 32)"
@@ -49,11 +46,11 @@ pvisor-daemon serve \
--max-timeout-seconds 86400
```
-Keep runtime paths absolute and unchanged across daemon restarts. Use short state paths such as `/run/user/1000/pvd`: per-sandbox `control.sock` must be shorter than 104 bytes, and vsock Unix sockets also have path limits. Retain state; this `/run` example does not promise persistence across logout/reboot, and VMs cannot survive host reboot. `/sys/fs/cgroup/pvd` must be a real delegated hierarchy, not an ordinary directory.
+Runtime paths are absolute and must stay unchanged across daemon restarts. Keep the state path short, for example `/run/user/1000/pvd`: each sandbox's `control.sock` must be shorter than 104 bytes, and vsock Unix sockets also have path-length limits. Retain the state; this `/run` example does not guarantee persistence across logout/reboot, and VMs do not survive a host reboot. `/sys/fs/cgroup/pvd` must be a real delegated hierarchy, not a plain directory.
-Choose a private state directory outside the checkout. Generate the API key once and keep the same value in protected service secret storage on restart. The example sets an admission budget of 32 records, four CPU units and 8 GiB of summed hard memory limits. Whole-node physical usage has not been measured; leave daemon/cache/host headroom and configure host supervision separately.
+Choose a private state directory outside the checkout. Generate the API key once, keep it in protected service secret storage, and reuse the same value across restarts. The example admission budget is 32 records, four CPU units and an 8 GiB total hard memory limit. Whole-node physical occupancy is unmeasured; leave headroom for daemon/cache/host and configure host supervision separately.
-In a second shell with the same protected API key, query the lifecycle API:
+Query the lifecycle API from a second shell with the same protected API key:
```bash
curl --fail-with-body --config - < --json`. The native session ID is extracted automatically from `session_meta`; unknown tools or a missing native session ID fail explicitly instead of degrading into a brand-new session.
-
-Codex keeps its own system prompt, tool definitions, and task context; SandboxReplay replaces only the observations before the boundary. To stay compatible with older CLIs that require a resume prompt, SandboxReplay uses a local Responses bridge that removes the transport nonce before forwarding the request to the model service, and cleans the nonce from the native trajectory after continuation. The default mode's input condition is `replayed_boundary_only` and injects no extra prompt into the model.
-
-When `boundary_user_prompt` is configured, the prompt is injected once after `O′N` and retained; the input condition is then marked `boundary_user_prompt_appended`. A bridge validation failure refuses continuation rather than degrading to a direct connection.
-
-## 4. Usage
-
-### 4.1 Install pVisor
-
-The pVisor CLI ships in the `pvisor` wheel. When the sandbox has Python 3.10 or newer, install the released version directly:
+`pvisor replay` usually runs directly inside the new sandbox you prepared, so pVisor must be installed in that sandbox or mounted read-only on the sandbox's `PATH`. When the sandbox has Python 3.10 or newer, install the released version directly:
~~~bash
python -m pip install pvisor
@@ -97,115 +57,19 @@ pvisor --version
pvisor replay --help
~~~
-To test unreleased SandboxReplay code, install only pVisor from source inside the target sandbox:
-
-~~~bash
-git clone https://github.com/DeepLink-org/pvisor.git
-cd pvisor
-just install-cli
-
-export PATH="${CARGO_HOME:-$HOME/.cargo}/bin:$PATH"
-pvisor replay --help
-~~~
-
-During development you can skip installation and build and use the in-repo binary:
-
-~~~bash
-just build release
-./target/release/pvisor replay --help
-~~~
-
-`pvisor replay` usually runs directly inside the new sandbox you prepared, so pVisor must be installed in that sandbox or mounted read-only on the sandbox's `PATH`. If you build outside the sandbox and copy the binary in, the build machine and the target sandbox must share a compatible operating system, CPU architecture, and dynamic runtime. The agent runtime must also match the pinned version of the replay profile you select.
-
-### 4.2 CLI and TOML
+If you build outside the sandbox and copy the binary in, the build machine and the target sandbox must share a compatible operating system, CPU architecture, and dynamic runtime. The agent runtime must also match the pinned version of the replay profile you select; adapter mechanisms and pinned versions are documented in [Replay design](../design/replay.md).
-SandboxReplay assumes by default that you have already created a new sandbox and are running inside it:
+## 4. Minimal usage
~~~bash
pvisor replay \
--agent claude-code \
--trajectory /input/session.jsonl \
--after-step 30 \
- --agent-entrypoint /usr/bin/claude \
- --boundary-user-prompt '请检查新的 observation 后继续任务'
+ --agent-entrypoint /usr/bin/claude
~~~
-When the Pi agent runtime is installed at `/opt/pi-agent`, the command is:
-
-~~~bash
-pvisor replay \
- --agent pi-agent \
- --trajectory /input/pi-agent.events.jsonl \
- --after-step 30 \
- --agent-entrypoint /opt/pi-agent/bin/pi
-~~~
-
-The equivalent pVisor TOML for the Pi agent is:
-
-~~~toml
-[replay]
-agent = "pi-agent"
-trajectory = "/input/pi-agent.events.jsonl"
-after_step = 30
-agent_entrypoint = "/opt/pi-agent/bin/pi"
-max_steps = 200
-disable_thinking = true
-~~~
-
-OpenCode uses native event JSONL:
-
-~~~bash
-pvisor replay \
- --agent opencode \
- --trajectory /input/opencode.jsonl \
- --after-step 30 \
- --agent-entrypoint /usr/bin/opencode
-~~~
-
-Codex uses native rollout JSONL; SandboxReplay reads the Codex native session ID from the trajectory, so you never fill in `session_id` by hand:
-
-~~~bash
-pvisor replay \
- --agent codex \
- --trajectory /input/rollout.jsonl \
- --after-step 30 \
- --agent-entrypoint /usr/bin/codex
-~~~
-
-Both can also share one TOML file; just change `[replay].agent`, `trajectory`, and `agent_entrypoint` to `opencode` or `codex`.
-
-The equivalent pVisor TOML for Claude Code is:
-
-~~~toml
-[replay]
-agent = "claude-code"
-trajectory = "/input/session.jsonl"
-after_step = 30
-agent_entrypoint = "/usr/bin/claude"
-max_steps = 200
-session_id = "task-291-attempt-1"
-replay_only = false
-disable_thinking = true
-boundary_user_prompt = "请检查新的 observation 后继续任务"
-~~~
-
-### 4.3 Modes and results
-
-- The default mode executes the selected prefix, then starts the agent to continue running.
-- `--replay-only` executes the prefix but stops before the next model request.
-- `--prepare-only` only validates and builds the prefix; it runs no tools, starts no agent, and requires no agent runtime.
-
-`--max-steps` is the agent's total action budget including the replayed prefix. For example, `--after-step 30 --max-steps 50` leaves at most 20 continuation actions. Replay-only's budget must cover the prefix; continuation must leave at least one live action.
-
-The result protocol is `sandbox-playback.result/v3`: `phase` is `prepared`, `replayed`, or `continued`; `quality` is `verified` or `degraded`; `agent_status` distinguishes `not_started`, `completed`, `max_steps`, and `failed`. Failed results keep the logs and native trajectory already produced. Even when the OpenHands process exits 0, the result is still a failure if the controller reports a fatal status.
-
-Metadata on a successful result records whether the boundary prompt was requested and injected, along with its character length and SHA-256; the replay journal never records the prompt plaintext, and the agent's native prepared or continued trajectory may contain this user message. For Claude Code, the in-memory bridge adds the prompt only to the first cleaned upstream request and does not modify the rebuilt native session. After a prompt is configured, `next-action-comparison.json` uses the input condition `boundary_user_prompt_appended`. Text similarity and tool agreement are then observational only and cannot be read as replay fidelity under identical input.
-
-Claude observations that cannot be regenerated fail by default; only an explicit `--allow-stale-observations` reuses them and marks quality `degraded`.
-
-`disable_thinking` can also be set with `--disable-thinking`. Replay takes its own outer run options, separate from the agent flags: `--safe`, `--executor`, `--overlayfs-path`, `--overlayfs-compose`, and other managed-execution options, or the `[run]`, `[overlayfs]`, and `[overlaynet]` TOML tables. Its filesystem parameters are governed by `pvisor replay --help`; do not copy `run`'s `--stage/--mount` grammar directly.
-
-See the [`pvisor replay` command reference](../reference/cli.md#replay-an-agent-trajectory) for the full parameter list.
+Execution modes (default continuation, `--replay-only`, `--prepare-only`), step budgets, the boundary prompt, the `sandbox-playback.result/v3` result protocol, and per-agent CLI/TOML forms are governed by the [`pvisor replay` command reference](../reference/cli.md#replay-an-agent-trajectory).
## Experiments and development material
diff --git a/docs/src/en/guides/review-apply.md b/docs/src/en/guides/review-apply.md
index e5492b5f..2df7455a 100644
--- a/docs/src/en/guides/review-apply.md
+++ b/docs/src/en/guides/review-apply.md
@@ -8,9 +8,9 @@ pvisor status --review last
pvisor inspect last -- git status --short
```
-Without an explicit path, `--safe` keeps workspace changes in the Job store. To choose a location, pass `--stage PATH` with a fresh directory outside the project for each Run.
+Without `--stage`, `--safe` keeps workspace changes in the Job store. To choose a location, pass `--stage PATH`, using a fresh directory outside the project for each Run.
-`last` resolves the current workspace's most recent Job; after `--stage`, select that path instead of `last`. `status --review` shows evidence and changes, and `inspect` runs check commands in a read-only view. See [Jobs and storage](../concepts/jobs.md).
+`last` resolves the most recent Job for the current workspace. If you passed `--stage`, address that path instead of `last`. `status --review` shows evidence and changes, and `inspect` runs check commands in a read-only view. See [Jobs and storage](../concepts/jobs.md).
## Apply in batches
@@ -34,11 +34,11 @@ Stop other writers during apply: these checks cannot make a multi-file update at
pvisor drop last
```
-Drop removes only the staged changes that have not been applied. It cannot undo applied batches, network calls, or other external effects. To keep the current state and keep trying, see [checkpoints and forks](fork-checkpoint.md).
+Drop removes only the staged changes that have not been applied. It cannot undo applied batches, network calls, or other external effects. To keep the current state and try another approach, see [checkpoints and forks](fork-checkpoint.md).
## Review order and expected results
-Confirm the Job has stopped, then read in this order: outcome and exit code → actual file and network boundaries and warnings → denied or failed accesses → net file changes. Allow rules and captures do not replace mandatory-control evidence.
+Confirm the Job has stopped, then read the record in this order: outcome and exit code → actual file and network boundaries and warnings → denied or failed accesses → net file changes. Allow rules and captures do not replace mandatory-control evidence.
```bash
pvisor status --review --diff ../stage-001
diff --git a/docs/src/en/design/agent-task-performance-analysis.md b/docs/src/en/lab-notes/agent-task-performance-analysis.md
similarity index 91%
rename from docs/src/en/design/agent-task-performance-analysis.md
rename to docs/src/en/lab-notes/agent-task-performance-analysis.md
index b6110cb3..d5fd0f32 100644
--- a/docs/src/en/design/agent-task-performance-analysis.md
+++ b/docs/src/en/lab-notes/agent-task-performance-analysis.md
@@ -1,5 +1,7 @@
# Agent tool tasks: technical evidence
+> Note: "local original records" and paths such as `docs/src/assets/benchmarks/.data/` refer to local measurement archives that are not published with the repository or the site; they are kept for batch provenance only.
+
Complete repair/testing takes about **4.61 s** in image-free pVisor VM and **8.51 s** on Firecracker / complete Ubuntu; staging takes **0.72 s**. Ubuntu boot affects short jobs, while pVisor retains substantial tool-execution costs: fast startup does not establish leading tools. Claude/VM: initialization timeout / N=0; real Codex tool-loop results follow below.
## Motivation
@@ -18,7 +20,7 @@ These workloads were measured on Linux; macFUSE/FSKit overhead and capacity rema
### Image-free pVisor and complete Ubuntu: full Agent Env {#full-ubuntu}
-pVisor reuses installed host Python/Node/Rust/Git/rg/Claude/Codex without making an OS image. Firecracker/QEMU install distribution tools and the same Rust/Agent CLIs in complete official Ubuntu 26.04.1 LTS. Each trial creates a new environment, then runs the same repair plan and tests. VMs use 2 vCPU / 16 GiB; all groups share the two-core budget and warm host caches, with 10 planned samples, 3 warmups and randomized order; cells state effective N when below 10. Ubuntu Python/Node/Git versions differ from the host; full versions and kernel differences are in the [method](../benchmarks/methodology.md#full-ubuntu).
+pVisor reuses installed host Python/Node/Rust/Git/rg/Claude/Codex without making an OS image. Firecracker/QEMU install distribution tools and the same Rust/Agent CLIs in complete official Ubuntu 26.04.1 LTS. Each trial creates a new environment, then runs the same repair plan and tests. VMs use 2 vCPU / 16 GiB; all groups share the two-core budget and warm host caches, with 10 planned samples, 3 warmups and randomized order; cells state effective N when below 10. Ubuntu Python/Node/Git versions differ from the host; full versions and kernel differences are in the [method](../benchmarks/index.md#full-ubuntu).

@@ -62,17 +64,17 @@ Claude/VM preflight still exceeds 90 seconds during initialization, with formal
Codex uses uniform inner `danger-full-access`, with the outer runtime supplying its stated boundary; default nested sandbox compatibility is unmeasured. N=10 gives first-version budgets and repeatability, not long-term tail or real-model success guarantees. RSS sums the launcher tree every 20 ms, including separate Firecracker DNS/NAT support; QEMU uses built-in user networking. Shared pages may be counted twice and short peaks missed. Configured 16 GiB is not 16 GiB resident, and short-task RSS does not establish concurrency capacity.
-Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [Method and reproduction](../benchmarks/methodology.md#full-ubuntu) · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-workflows-private-tmp-20261004/evidence.tar.gz` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-clients-console-v2-20261004/evidence.tar.gz`
+Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [Method and reproduction](../benchmarks/index.md#full-ubuntu) · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-workflows-private-tmp-20261004/evidence.tar.gz` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-clients-console-v2-20261004/evidence.tar.gz`
Complete-Ubuntu repair/testing takes **8.12 s** on q35 and **10.33 s** on microvm, with internal tools taking **2.75 / 2.81 s**. Image-free pVisor reduces waiting for fresh jobs, while its 4.02 s worker time remains above these complete-Ubuntu paths, a priority when environments are reused. Selecting microvm does not automatically improve complete tasks in this configuration. Networking, devices and exposed CPU features differ; the entire difference cannot be assigned to block devices or FUSE.
-Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/manifest.tsv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/summary.tsv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/ubuntu-qemu-complete-20261004/evidence.tar.gz` · [QEMU method](../benchmarks/methodology.md#full-ubuntu-qemu)
+Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/manifest.tsv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/summary.tsv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/ubuntu-qemu-complete-20261004/evidence.tar.gz` · [QEMU method](../benchmarks/index.md#full-ubuntu-qemu)
### Historical controlled environment: shared tools and trimmed reference VMs {#reference-env}
This batch shares tool artifacts to control some version differences. Firecracker/QEMU use trimmed Linux 6.12.109 and static init, without a complete distribution boot. pVisor shares a tool directory through virtio-fs without an image. These results retain Docker and minimal-VM context; see the [complete Ubuntu and image-free hostroot deployment](#full-ubuntu) above.
-The deployed environment contains Python 3.14.7, Node 24.18.0/npm, Rust/Cargo 1.98.1, Git, rg, Claude Code 2.1.128, and Codex 0.160.0: about 3.58 GiB and 76,000 files. Native, Docker and VMs use the same tool artifacts, projects and checks. Each case has 30 samples and 3 warmups, a two-core budget, and 2 vCPU / 16 GiB for complete VMs. Full [parameters and boundaries](../benchmarks/methodology.md#reference-env) are stated separately.
+The deployed environment contains Python 3.14.7, Node 24.18.0/npm, Rust/Cargo 1.98.1, Git, rg, Claude Code 2.1.128, and Codex 0.160.0: about 3.58 GiB and 76,000 files. Native, Docker and VMs use the same tool artifacts, projects and checks. Each case has 30 samples and 3 warmups, a two-core budget, and 2 vCPU / 16 GiB for complete VMs. Full [parameters and boundaries](../benchmarks/index.md#reference-env) are stated separately.
The workflow inspects a project, searches for the bug, repairs Python, runs Python/Rust/Node tests, installs 32 local dependencies, and generates a diff. Fixed model responses request that plan. Real CLIs must return actual passing tool results and exit normally. This covers environment deployment and tool execution, not large repositories, real model success rates or Internet dependency installation.
@@ -111,7 +113,7 @@ VM npm installation takes about 1.74 s, its largest phase here; Rust compilation
Do not rank Claude against Codex by absolute time. Codex also has seconds of client waiting in this path: roughly 6.26 s in Docker and 10.93 s in pVisor VM. These numbers describe the complete client experience more closely than bare startup, for these versions and controlled tasks, not model speed.
-**Deployment is separate.** Offline tool copying, image import and ext4 creation take about 109 s; adding the CPU affinity helper takes another 5.3 s. Downloads and kernel compilation are excluded. Per-run workspace/private-disk preparation is recorded as `prepare_ms`, outside the task table. These are prepared-environment task budgets, not first-install-to-completion costs. See the [memory audit](../benchmarks/methodology.md#reference-resources); 16 GiB configured RAM does not mean each Agent consumes 16 GiB resident memory.
+**Deployment is separate.** Offline tool copying, image import and ext4 creation take about 109 s; adding the CPU affinity helper takes another 5.3 s. Downloads and kernel compilation are excluded. Per-run workspace/private-disk preparation is recorded as `prepare_ms`, outside the task table. These are prepared-environment task budgets, not first-install-to-completion costs. See the [memory audit](../benchmarks/index.md#reference-resources); 16 GiB configured RAM does not mean each Agent consumes 16 GiB resident memory.
Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
@@ -150,4 +152,4 @@ python3 benchmark/pvisor/product_v1.py \
Start with `--samples 1 --warmups 0` to check prerequisites. Workloads and correctness assertions live in `benchmark/pvisor/v1/`. Reports pin binaries, firmware and harness source with hashes. Failed operations never enter performance distributions. Effective sample counts are stated per page; P95/P99 from small samples describe this batch rather than production tail probabilities.
-[Environment, artifacts and method](../benchmarks/methodology.md#product-v1) · Local raw record `docs/src/assets/benchmarks/.data/product-v1-20261004/manifest.tsv` · Local raw record `docs/src/assets/benchmarks/.data/product-v1-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/product-v1-20261004/evidence.tar.gz`. Reports retain dirty source status; executable SHA256 identifies the measured artifact. The archive excludes large rootfs/binaries and reproducible workspace payloads, while retaining input hashes and each batch's harness.
+[Environment, artifacts and method](../benchmarks/index.md#product-v1) · Local raw record `docs/src/assets/benchmarks/.data/product-v1-20261004/manifest.tsv` · Local raw record `docs/src/assets/benchmarks/.data/product-v1-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/product-v1-20261004/evidence.tar.gz`. Reports retain dirty source status; executable SHA256 identifies the measured artifact. The archive excludes large rootfs/binaries and reproducible workspace payloads, while retaining input hashes and each batch's harness.
diff --git a/docs/src/en/design/benchmark-methodology-evidence.md b/docs/src/en/lab-notes/benchmark-methodology-evidence.md
similarity index 93%
rename from docs/src/en/design/benchmark-methodology-evidence.md
rename to docs/src/en/lab-notes/benchmark-methodology-evidence.md
index b0ded415..4f7e9f3f 100644
--- a/docs/src/en/design/benchmark-methodology-evidence.md
+++ b/docs/src/en/lab-notes/benchmark-methodology-evidence.md
@@ -1,10 +1,12 @@
# Benchmark measurement protocols and evidence
+> Note: "local original records" and paths such as `docs/src/assets/benchmarks/.data/` refer to local measurement archives that are not published with the repository or the site; they are kept for batch provenance only.
+
All benchmarks follow the same protocol:
- State the hardware, operating system, kernel or macOS version, FUSE implementation, pVisor version, and commit.
-- Report p50, p95, and p99 with the sample count.
-- Provide a script that reproduces the result in one command (under `benchmark/`), reporting through the `pvisor-benchmark/v1` schema.
+- Report sample counts and distributions; follow the registry’s sample-size limits for tail statistics. Thirty samples do not support P99.
+- Use the registered measurement entry and retain its native evidence format; historical reports keep their original schema.
- State the configuration of every control group; do not compare against untuned competitors.
- Keep results by date instead of overwriting old data.
@@ -39,20 +41,19 @@ Start every report with this table:
## Start from the existing measurement entry points
```bash
-just benchmark
-just benchmark nightly target/pvisor-benchmark/nightly
-just benchmark-compare target/pvisor-benchmark/candidate/raw-report.json target/pvisor-benchmark/main/raw-report.json
-# Linux:启动与资源占用矩阵
-just benchmark-startup --warmups 10 --samples 100
+just benchmark smoke --output benchmark.new/process/.data/candidate
+just benchmark nightly --output benchmark.new/process/.data/nightly-new
+just benchmark-compare benchmark.new/process/.data/candidate/in.bench.json benchmark.new/process/.data/main/in.bench.json
+just benchmark startup/timing --output benchmark.new/startup/.data/measurement
```
-`just benchmark` measures the process-level cost of a minimal host Run and of reading its Run Bundle: smoke uses 2 warmups and 10 samples, nightly uses 10 warmups and 50 samples. Both use `pvisor-benchmark/v1`. `benchmark-startup` writes separate `startup.json`/`startup.md` files and does not pretend to share the same report schema; its default is 3 warmups and 30 samples, overridden explicitly above.
+The process regression gate uses semspec bench and hyperfine: smoke has 2 warmups/10 samples, nightly has 10 warmups/50 samples. It measures native launch, minimal host Run, status and review as independent conditions. `benchmark-compare` accepts validated `in.bench.json` files from matching configurations and harnesses; measure the baseline separately with the same suite into `.data/main`.
-Building, image downloads, and rootfs preparation are not counted in the existing startup samples; reports must state this boundary. Executors that fail preflight are listed separately as SKIP with stderr retained. A successful measurement requires the command to succeed and the Bundle to be completed with a zero exit. Failures, skips, or degraded controls cannot count as faster successful samples.
+The startup event-clock table uses 3 warmups/60 samples per condition and records Ready and normal Exit from the same launch. It does not replace the retired startup/resource matrix or reproduce its historical sampling settings. See the [current benchmark manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/README.md) for prepared binary, rootfs, image and kernel prerequisites. Every explicit output directory must be new; failures retain evidence and block publication. Building and input preparation occur outside these timers.
## Interpretation and archiving
-Compare candidate and baseline on the same host, suite, and inputs. `benchmark-compare` defaults to a 15% regression threshold and reports only unless `--fail-on-regression` is explicitly enabled. Save raw samples, summaries, complete parameters, input hashes, and commits; distinguish cold images, warm disk caches, and warm page caches, and record background load and power state.
+Compare candidate and baseline on the same host, suite, and inputs. `benchmark-compare` defaults to a 15% regression threshold and exits nonzero when a regression is detected. Save raw samples, summaries, complete parameters, input hashes, and commits; distinguish cold images, warm disk caches, and warm page caches, and record background load and power state.
The first product measurements are recorded below; real-model success, human supervision and cloud timings remain unmeasured.
@@ -154,7 +155,7 @@ uv run --no-project --with matplotlib python benchmark/pvisor/render_ubuntu_base
--assets target/ubuntu-reference-new --output /tmp/full-ubuntu-report-new
```
-Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [Method and reproduction](../benchmarks/methodology.md#full-ubuntu)
+Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [Method and reproduction](../benchmarks/index.md#full-ubuntu)
See the Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-packages.txt`. Formal tasks uniformly place compiler/client temporary files in private workspace `_tmp` to accommodate hostroot read-only `/tmp`. Failed diagnostics are retained outside the new formal distributions.
diff --git a/docs/src/en/design/filesystem-io-performance-analysis.md b/docs/src/en/lab-notes/filesystem-io-performance-analysis.md
similarity index 99%
rename from docs/src/en/design/filesystem-io-performance-analysis.md
rename to docs/src/en/lab-notes/filesystem-io-performance-analysis.md
index dec09136..d7462326 100644
--- a/docs/src/en/design/filesystem-io-performance-analysis.md
+++ b/docs/src/en/lab-notes/filesystem-io-performance-analysis.md
@@ -1,5 +1,7 @@
# Filesystem I/O: caching, asynchronous batching and completed throughput
+> Note: "local original records" and `.data/` paths refer to local measurement archives that are not published with the repository or the site; they are kept for batch provenance only.
+
## Conclusions {#conclusions}
### 1. Overall verdict: two write-intensive tasks improve, with complete-task evidence
@@ -25,7 +27,7 @@ The [layered results and curves](#workload-v2-results) retain all 19 points and
## Motivation {#motivation}
-The goal is to let the host own bytes and continue filesystem work while the guest waits for I/O, reducing background dependence on guest RAM. After accepting a WRITE, the queue holds copied bytes and a pinned native file handle. Object lifetime is separate from path names, allowing subsequent close, rename, and unlink to follow the existing ordering boundaries. The [Agent I/O completion design](experimental/agent-io-completion/index.md) owns file-lifetime and error semantics.
+The goal is to let the host own bytes and continue filesystem work while the guest waits for I/O, reducing background dependence on guest RAM. After accepting a WRITE, the queue holds copied bytes and a pinned native file handle. Object lifetime is separate from path names, allowing subsequent close, rename, and unlink to follow the existing ordering boundaries. The [Agent I/O completion design](../design/experimental/agent-io-completion/index.md) owns file-lifetime and error semantics.
Three boundaries matter: accepted means bytes have transferred to the host, completed means the relevant write prefix has been applied, and durable means explicit synchronization has succeeded. Returning from WRITE cannot substitute for file or directory fsync. Queue capacity determines how much burst traffic can be absorbed; once the host page cache accepts bytes, a larger queue need not improve throughput. Whole-VM offload additionally requires other guest-RAM references and device activity to meet transfer conditions. These curves do not measure that process.
@@ -539,4 +541,4 @@ Warm-upper reads and immutable-lower reopens are different experiments; SDK nati
Operation-level tails, open-loop arrivals, fair multi-VM contention, power-loss or crash durability, other hardware, and cold disk remain unmeasured. Semantic tests of host-owned bytes and pinned handles also do not establish whole-VM-offload throughput, physical RAM reclaimed, or restoration cost.
-Reproduction commands, the full matrix and remaining paper-strength validation are in `benchmark.new/filesystem/CURVES.md`. Complete CSV/JSON, provenance summaries and raw records remain in each batch's local `.data/` or publication directory. Previously public data files are archived under `benchmark.new/.data/docs-assets-prune-20261018/`; the migration inventory retains original paths, byte hashes and archive locations.
+Reproduction commands, the full matrix and remaining paper-strength validation are in `benchmark.new/filesystem/CURVES.md`. Batch archival conventions are documented in the [lab-notes index](index.md).
diff --git a/docs/src/en/design/filesystem-performance-analysis.md b/docs/src/en/lab-notes/filesystem-performance-analysis.md
similarity index 99%
rename from docs/src/en/design/filesystem-performance-analysis.md
rename to docs/src/en/lab-notes/filesystem-performance-analysis.md
index 9012ad55..0a85e103 100644
--- a/docs/src/en/design/filesystem-performance-analysis.md
+++ b/docs/src/en/lab-notes/filesystem-performance-analysis.md
@@ -1,7 +1,13 @@
# Filesystem performance: technical analysis and experiment records
+> Note: "local original records" and paths such as `docs/src/assets/benchmarks/.data/` and `benchmark/.data/` refer to local measurement archives that are not published with the repository or the site; they are kept for batch provenance only.
+
## Current conclusions and measurement coverage {#filesystem-status}
+**In the latest independent N30 paired comparison, the current default configuration versus its own cohort baseline: start-to-clean-exit -1.73% (95% CI [-5.70, -0.22]), writing 256 files -14.19% ([-17.58, -9.82]). The historical filesystem regression is not yet fully repaired; write coalescing for new VMs and DAX are both off by default. Percentages below come from their own frozen baselines and cannot be summed across batches.**
+
+Batch coverage and conclusions follow.
+
The [filesystem I/O curves](filesystem-io-performance-analysis.md) compare request size, concurrency, synchronization, capacity and reuse working sets. Independent N30 and ordinary-CLI comparisons do not support enabling host-owned asynchronous batching by default; request counts distinguish backing coalescing from FUSE WRITE reduction.
The 2026-10-17 [guest-kernel writeback followup](filesystem-io-performance-analysis.md#guest-writeback) fixes object lifetime for closed unlink/rename followed by syncfs, and verifies cross-batch progress with delayed backing. Historical statements below that ENOENT remains unresolved describe their own frozen versions; their timings, failures, and conclusions remain intact. The SDK fix does not establish a new ordinary-CLI WB=1 performance result.
@@ -38,7 +44,7 @@ The [Immutable-lower negative-cache comparison](#immutable-lower-negative-cache)
[Directory-FD cache capacity and ATIME diagnostics](#directory-cache-atime) find no detected improvement in the cumulative three-round seven-tool time; default capacity remains 256. An independent request-mask probe confirms that stat requesting ATIME adds GETATTR after the first host READ, while a page-cache hit on the same fd adds none.
-**Latest independent N30 paired comparison: Selected C3 (new-VM writeback off by default): Launch through normal exit changes by -1.73%, 95% CI [-5.70, -0.22]%; Write 256 files changes by -14.19%, 95% CI [-17.58, -9.82]%. Results apply to the measured combined code/default configuration; complete recovery of historical performance is not established.**
+Latest independent N30 paired comparison (the cohort cited in this section's opening sentence; [details](#filesystem-optimization-n30)): Selected C3 (new-VM writeback off by default): Launch through normal exit changes by -1.73%, 95% CI [-5.70, -0.22]%; Write 256 files changes by -14.19%, 95% CI [-17.58, -9.82]%. Results apply to the measured combined code/default configuration; complete recovery of historical performance is not established.
Independent cohorts: [Linux: paired N30 comparison of filesystem optimizations with default-off writeback](#filesystem-optimization-n30). The existing overview retains each historical cohort's conclusions.
@@ -1616,13 +1622,13 @@ The latest batch randomizes native and both versions of staged and libkrun VM. H
## macOS
-These workloads were measured on Linux; macFUSE/FSKit overhead and capacity remain unmeasured. Existing macOS/HVF results are retained in [VM startup](../benchmarks/startup.md) and [VM memory](../benchmarks/vm-memory/index.md), and are not substituted for this workload.
+This round was measured on Linux only; for the platform coverage boundary and where existing macOS/HVF results live, see the [end-to-end task analysis](agent-task-performance-analysis.md).
## Linux: evaluation after the shared filesystem service refactor {#filesystem-service}
The frozen new source retains host FUSE while local, staged and lazy VM views
enter the shared service through virtio-fs. Lazy images no longer create an
-intermediate host FUSE mount. The [implementation](overlayfs.md#filesystem-service)
+intermediate host FUSE mount. The [implementation](../design/overlayfs.md#filesystem-service)
still keeps protocol state in the two adapters; DAX, writeback and long attribute
TTLs remain disabled.
@@ -2270,7 +2276,7 @@ The table excludes environment boot, measuring operations and grading. This new
These values locate waiting in traversal, search, compilation and installation. A single read does not establish that block devices always outperform FUSE: kernels, tool versions, storage and staging semantics differ together. For longer tasks, combine worker time with the [complete loop](../benchmarks/agent-tasks.md#full-ubuntu) rather than startup alone.
-Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [Method and reproduction](../benchmarks/methodology.md#full-ubuntu)
+Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [Method and reproduction](../benchmarks/index.md#full-ubuntu)
### Docker baseline in the complete tool environment {#reference-fs}
@@ -2291,7 +2297,7 @@ This establishes a concrete position: Docker metadata/read/write stay close to n
Tasks verify file counts/sizes, SHA256, clean Git state, search matches, compiled output, and installed package counts. Docker uses a writable bind mount, pVisor a staged view, and Firecracker/QEMU private ext4. Different file paths are part of actual deployment cost; this is not a causal experiment changing only the VMM over an identical filesystem. The summary also contains each operation's distribution for other runtimes.
-[Configuration and reproduction](../benchmarks/methodology.md#reference-env) · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
+[Configuration and reproduction](../benchmarks/index.md#reference-env) · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
### First-edition Linux matrix: separate batch
@@ -2383,9 +2389,7 @@ Main VM jobs use host rootfs `/`, 2 vCPU/1 GiB and a host read view. This is a t
## Sources and reproduction {#run}
-Complete CSV/JSON, provenance summaries and raw records remain in each batch's local `.data/` or publication directory. Previously public data files are archived under `benchmark.new/.data/docs-assets-prune-20261018/`; the migration inventory retains original paths, byte hashes and archive locations.
-
-Run from the repository root with a new output directory. This dynamic firmware entry requires the GNU/Linux CLI; static musl builds use a different firmware entry. This host has Linux, KVM/FUSE/user namespaces, Python 3.14, Rust/GCC, Git/rg, Node 24/npm and Podman/crun. The agent suite also needs the Claude/Codex CLIs.
+Batch archival conventions are documented in the [lab-notes index](index.md).
```bash
python3 benchmark/pvisor/product_v1.py \
@@ -2396,6 +2400,4 @@ python3 benchmark/pvisor/product_v1.py \
--suites filesystem --samples 30 --warmups 3
```
-Start with `--samples 1 --warmups 0` to check prerequisites. Workloads and correctness assertions live in `benchmark/pvisor/v1/`. Reports pin binaries, firmware and harness source with hashes. Failed operations never enter performance distributions. Effective sample counts are stated per page; P95/P99 from small samples describe this batch rather than production tail probabilities.
-
-[Environment, artifacts and method](../benchmarks/methodology.md#product-v1) · Local raw record `docs/src/assets/benchmarks/.data/product-v1-20261004/manifest.tsv` · Local raw record `docs/src/assets/benchmarks/.data/product-v1-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/product-v1-20261004/evidence.tar.gz`. Reports retain dirty source status; executable SHA256 identifies the measured artifact. The archive excludes large rootfs/binaries and reproducible workspace payloads, while retaining input hashes and each batch's harness.
+Harness environment, preflight and failure-classification conventions match the [end-to-end task analysis reproduction section](agent-task-performance-analysis.md#run); the local raw-record cohort is likewise product-v1-20261004, and the executable SHA256 identifies the measured artifact.
diff --git a/docs/src/en/lab-notes/index.md b/docs/src/en/lab-notes/index.md
new file mode 100644
index 00000000..bf0a3749
--- /dev/null
+++ b/docs/src/en/lab-notes/index.md
@@ -0,0 +1,16 @@
+# Lab notes
+
+This section keeps engineering experiment records for performance and mechanisms: measurements, analyses, and failure reviews made during design. They answer "why was it designed this way", not "which option should you choose now"—for selection decisions, see [benchmarks and comparisons](../benchmarks/index.md).
+
+Numbers on each page belong to their frozen cohorts and artifact versions and do not represent the performance level of the current build. `.data/` paths point to local archives that are not published with the repository or site; they exist for cohort provenance only.
+
+Complete CSV/JSON, provenance summaries and raw records remain in each batch's local `.data/` or publication directory. Previously public data files are archived under `benchmark.new/.data/docs-assets-prune-20261018/`; the migration inventory retains original paths, byte hashes and archive locations.
+
+| Page | Contents |
+| --- | --- |
+| [VM startup performance analysis](vm-startup-performance-analysis.md) | Startup-path breakdowns, regressions, and acceptance records |
+| [End-to-end task performance analysis](agent-task-performance-analysis.md) | End-to-end measurements of real agent tasks across executors |
+| [VM memory performance analysis](vm-memory-performance-analysis.md) | Static curves and readback costs for deduplication, shared libraries, and pooling |
+| [Filesystem performance analysis](filesystem-performance-analysis.md) | Load measurements and retest records for OverlayFS configurations |
+| [Cache and asynchronous-write performance curves](filesystem-io-performance-analysis.md) | Engineering curves for request size, concurrency, synchronization, and write coalescing |
+| [Benchmark methodology and evidence](benchmark-methodology-evidence.md) | Measurement scope and evidence inventory of historical cohorts |
diff --git a/docs/src/en/design/vm-memory-performance-analysis.md b/docs/src/en/lab-notes/vm-memory-performance-analysis.md
similarity index 92%
rename from docs/src/en/design/vm-memory-performance-analysis.md
rename to docs/src/en/lab-notes/vm-memory-performance-analysis.md
index fc18f391..14760dd3 100644
--- a/docs/src/en/design/vm-memory-performance-analysis.md
+++ b/docs/src/en/lab-notes/vm-memory-performance-analysis.md
@@ -1,10 +1,12 @@
# Memory deduplication curves: Firecracker, Docker and pVisor
+> Note: local `.data/` paths refer to local measurement archives that are not published with the repository or the site; they are kept for batch provenance only.
+
## Linux: preflight of deduplication speed, compression and shared libraries {#linux-pool-curves}
### Observed benefits and costs {#pool-findings}
-**The physical pool reclaims cross-VM duplicate random data early and retains sharing after complete reads.** File-read hints advance reclamation in the library experiment, while DAX directly reuses pages of an explicitly attached immutable file. The comparisons below record reclamation speed, CPU and end-of-window usage together to examine each path's benefits and costs.
+**With four instances each holding the same 64 MiB of random data, the physical pool starts sustained reclamation of 128 MiB of billed memory at about 1.7 seconds, while KSM needs about 27.8 seconds; when no shareable application pages exist, the pool occupies 391.62 MiB and spends 8.1 CPU seconds scanning for no benefit.** File-read hints advance reclamation in the library experiment, while DAX directly reuses pages of an explicitly attached immutable file. All readings are single observations with N=1 per cell: no confidence intervals, stable ranking or production-density claim. The comparisons below record reclamation speed, CPU and end-of-window usage together to examine each path's benefits and costs.
The two complete preflights dated 2026-10-18 contain 21 static-memory conditions and seven library conditions, with N=1 per condition. All 1,218 / 406 content, private-write and independent-exit checks passed, along with resource, provenance and raw-evidence audits. The analysis uses only these two complete preflights; additional partial repeated measurements are excluded from aggregates. These readings provide no confidence intervals, stable ranking or production-density claim.
diff --git a/docs/src/en/design/vm-startup-performance-analysis.md b/docs/src/en/lab-notes/vm-startup-performance-analysis.md
similarity index 97%
rename from docs/src/en/design/vm-startup-performance-analysis.md
rename to docs/src/en/lab-notes/vm-startup-performance-analysis.md
index b188860f..b4d69313 100644
--- a/docs/src/en/design/vm-startup-performance-analysis.md
+++ b/docs/src/en/lab-notes/vm-startup-performance-analysis.md
@@ -1,5 +1,7 @@
# VM startup: technical analysis and experiment records
+> Note: "local original records" and paths such as `docs/src/assets/benchmarks/.data/` refer to local measurement archives that are not published with the repository or the site; they are kept for batch provenance only.
+
## Linux: startup and exit fixes retest, 2026-10-11 {#concurrency-retest}
**Exit cleanup has a measured benefit, but startup regressions are not fully resolved.** Against the `cf8bfa5` GNU artifact, host Ready improves by about 9.11 ms and Exit by 75.00 ms. VM Exit improves by about 48.26 ms, with no detected Ready improvement. New staged Ready has two separated clusters and cannot be declared restored.
@@ -72,7 +74,7 @@ Optimization must preserve isolation, durable Run records and attestation semant
### Timing boundaries and workload
-We measure from launching pVisor until a new VM executes its first shell command and returns output, labeled **Ready** in the tables. This covers host preparation, VM startup and command execution: the startup wait after a user issues a command.
+Measurement starts when pVisor launches and ends when a new VM executes its first shell command and returns output, labeled **Ready** in the tables. It covers host preparation, VM startup and command execution: the startup wait after a user issues a command.
**Exit** runs from the same starting point until normal runtime exit, including result persistence and shutdown. Every trial creates a fresh VM with warm host caches. pVisor uses directories; reference image download and creation occur before timing. Complete Ubuntu additionally requires distribution services to be ready, with a separate new batch.
@@ -339,13 +341,13 @@ Linux / KVM, 2 vCPU / 2 GiB, the same two-core host budget, 30 samples for each
**QEMU boots the same complete Ubuntu, rather than the historical trimmed kernel.** q35 and microvm share Firecracker's stock kernel, initrd, tools and initialized disk template. A minimal device model does not remove seconds of distribution boot in this configuration. These are independent same-host cohorts; QEMU has N=10, background host load remains, and outliers are retained. Similar medians do not support a precise VMM ranking. QEMU first cloud-init boot is unmeasured.
-Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/samples.csv` · [QEMU protocol](../benchmarks/methodology.md#full-ubuntu-qemu)
+Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/samples.csv` · [QEMU protocol](../benchmarks/index.md#full-ubuntu-qemu)
**Selection meaning:** Creating environments for one or two commands benefits from avoiding seconds of OS boot. Complete Ubuntu provides distribution services and an independent Ubuntu environment at that startup cost. These are deployment paths with different kernels, initialization and storage; the table does not establish a roughly 50-times VMM advantage for libkrun. For longer jobs, compare [task and internal tool time](../benchmarks/agent-tasks.md#full-ubuntu), where boot cost is amortized.
Exit includes normal shutdown: pVisor P50 is 174 ms, Firecracker/Ubuntu about 9.23 / 12.86 seconds. Firecracker/Ubuntu uses default MMIO devices and the stock initrd, with zero VMM exit after guest reboot. Every trial retains full OS proof with no failed units. Workspace copying or private disk cloning is recorded as `prepare_ms`, with medians around 37 / 29 ms outside Ready. The chart uses a logarithmic axis, bars P50 and ticks P95. With N=30, P99 is near the maximum and describes this batch only.
-Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [Method and reproduction](../benchmarks/methodology.md#full-ubuntu) · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-ready-mmio-20261004/evidence.tar.gz`
+Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [Method and reproduction](../benchmarks/index.md#full-ubuntu) · Local raw record `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-ready-mmio-20261004/evidence.tar.gz`
#### New VM startup results {#linux-results}
@@ -389,7 +391,7 @@ QEMU q35's 218 ms does not establish QEMU's minimum startup cost: microvm with o
**First output does not establish that an Agent can complete a task.** Seven-tool version checking takes 1.40 seconds in pVisor VM. See the [complete tool environment](../benchmarks/agent-tasks.md#reference-env) for repair/test timing and CLI compatibility. The preceding 172.69 ms GNU/libkrunfw 5.5.0 batch remains historical evidence. This batch uses a new pinned static artifact; it is not a controlled single-configuration optimization experiment.
-[Configuration and reproduction](../benchmarks/methodology.md#reference-env) · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
+[Configuration and reproduction](../benchmarks/index.md#reference-env) · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
#### Full-exit follow-up: cleanup is separate from Ready {#reference-exit}
@@ -412,8 +414,6 @@ Local raw record `docs/src/assets/benchmarks/.data/reference-env-20261004/follow
## 5. Reproduction and raw data
-Complete CSV/JSON, provenance summaries and raw records remain in each batch's local `.data/` or publication directory. Previously public data files are archived under `benchmark.new/.data/docs-assets-prune-20261018/`; the migration inventory retains original paths, byte hashes and archive locations.
-
### macOS / HVF
Prepare the release CLI, Alpine rootfs and both firmware directories, then run:
diff --git a/docs/src/en/reference/cases-vm.md b/docs/src/en/reference/cases-vm.md
index 5ee41c8b..50f98a8a 100644
--- a/docs/src/en/reference/cases-vm.md
+++ b/docs/src/en/reference/cases-vm.md
@@ -130,7 +130,9 @@ assert_content "$CASE_ROOT/occupied.ram" keep
### S-DOC-062: N06 Seekable incremental backing reclaims and restores RAM
-**Semantics**: Compression selected at startup produces a valid PVZRAM v2 manifest and immutable base/delta bundle after offload. Logical RAM is complete, and allocated disk space for the entire bundle remains smaller than RAM for this workload after every offload. Writes after each resume produce a distinct generation whose chain reads original bytes. Ten offload/resume cycles exercise compaction from eight layers to one; unreachable generations are collected, and at most eight layers remain. The guest SHA-256 and continuously modified 1 MiB of page contents survive all cycles, with matching control observations and states. Linux requires FUSE; macOS requires the macFUSE kernel backend. A generation does not claim a device-consistent atomic VM snapshot.
+**Semantics**: Compression selected at startup produces a valid PVZRAM v2 manifest and immutable base/delta bundle after offload. Logical RAM is complete, and allocated disk space for the entire bundle remains smaller than RAM for this workload after every offload. Writes after each resume produce a distinct generation whose chain reads original bytes. Ten offload/resume cycles exercise compaction from eight layers to one; unreachable generations are collected, and at most eight layers remain. The guest SHA-256 and continuously modified 1 MiB of page contents survive all cycles, with matching control observations and states. A generation does not claim a device-consistent atomic VM snapshot.
+
+Linux requires FUSE; macOS requires the macFUSE kernel backend.
**Violation example**: The file is raw RAM, a missing parent is read as zero, no new head is committed, the Seekable index is corrupt, page faults return compressed bytes, mutable guest pages are lost after reclamation, or old layers accumulate after compaction.
diff --git a/docs/src/en/reference/cli.md b/docs/src/en/reference/cli.md
index 935052aa..46ddf661 100644
--- a/docs/src/en/reference/cli.md
+++ b/docs/src/en/reference/cli.md
@@ -91,7 +91,7 @@ pvisor-daemon memory-pool --help
pvisor-cache --help
```
-Add `--memory-pool` to `pvisor-daemon serve` to enable its default-off detached pool component. `pvisor-cache prepare/publish/serve/list/stat/read` remain independent. Node runtime protocols serve native callers, without a daemon acquire/release adapter. NativeRuntime embeds VM execution; checkpoint/fork and stage/apply APIs are absent. See [daemon and cache entry points](../guides/daemon/service.md) for ownership, installation and deployment boundaries.
+Add `--memory-pool` to `pvisor-daemon serve` to enable its default-off detached pool component. `pvisor-cache prepare/publish/serve/list/stat/read` remain independent. Node runtime protocols serve native callers, without a daemon acquire/release adapter. NativeRuntime embeds VM execution; checkpoint/fork and stage/apply APIs are absent. See the [daemon guide](../guides/daemon/index.md) for ownership, installation and deployment boundaries.
Other unknown names follow default execution rules. The `ctrl` name
is an explicit exception: `pvisor ctrl`, `pvisor ctrl --help` and
@@ -234,26 +234,28 @@ Proxy network auditing is a cooperative boundary: direct connections that bypass
the proxy do not trigger this prompt.
```text
-Jobs:
+Execution:
run Start a Job
status Show Job status
kill Terminate a Job
- suspend Save execution state and suspend a Job
- resume Continue a suspended Job
- fork Branch from staged files or VM execution state
- checkpoint Create, list, show, delete, verify, import-base, verify-base, gc
-
-Filesystems:
- inspect Open a read-only Job filesystem view
+Changes:
review Review staged changes and execution evidence
apply Accept selected staged changes
drop Discard staged changes
+ inspect Open a read-only Job filesystem view
-Extensions:
- service Native service lifecycle and installed daemon/cache/memory-pool companions
+Checkpoints:
+ checkpoint create, list, show, delete, verify, import-base, verify-base, gc
+ suspend Save execution state and suspend a Job
+ resume Continue a suspended Job
+ fork Branch from staged files or VM execution state
+
+Tools:
replay Replay an Agent trajectory (when installed)
tui Interactive Job terminal (when installed)
+ feature Query compile-time features
+ help Show command details
```
## Safe first run {#安全的第一次运行}
@@ -451,7 +453,7 @@ layers are retained, and the project base, rootfs and executor are unchanged.
Deliver credentials to the Agent with an explicit `--pass-env`, or let a
configured Gateway hold the upstream key on the trusted side.
-Startup prints the effective policy and override notices. Note that:
+Startup prints the effective policy and override notices:
- Without `--safe`, host/container selective proxies remain bypassable.
- Hostname rules cannot distinguish inference, telemetry and upload APIs under
@@ -586,7 +588,10 @@ pvisor replay --agent pi-agent \
Replay has three modes. The default replays the prefix and continues;
`--replay-only` executes the prefix and stops before a model request; and
`--prepare-only` constructs the prefix without executing tools or requiring a
-runtime. `--max-steps` is the total action budget, including replayed actions.
+runtime. `--max-steps` is the total action budget, including replayed actions:
+`--after-step 30 --max-steps 50` leaves at most 20 continuation actions;
+replay-only's budget must cover the prefix, and continuation must also leave at
+least one live action.
`--allow-stale-observations` is an explicit Claude-only escape hatch that marks
the v3 result `degraded`.
@@ -596,11 +601,18 @@ observation and before the first live model inference. The TOML spelling is
replay-only modes, and an omitted option preserves the unmodified replay
boundary. Structured results and replay journals store only injection state,
length and a digest; Agent-native prepared or continued trajectories may
-contain the user message.
-
-The result schema is `sandbox-playback.result/v3`, with typed `phase`, `quality`
-and `agent_status` fields plus state/output locations, artifacts and an optional
-structured failure. Non-Claude callers that used `replay_only = true` only to
+contain the user message. With a prompt configured, the input condition in
+`next-action-comparison.json` is `boundary_user_prompt_appended`; text
+similarity and tool agreement are then observational only and cannot be read
+as replay fidelity under identical input.
+
+The result schema is `sandbox-playback.result/v3`: `phase` is `prepared`,
+`replayed` or `continued`; `quality` is `verified` or `degraded`;
+`agent_status` distinguishes `not_started`, `completed`, `max_steps` and
+`failed`, plus state/output locations, artifacts and an optional structured
+failure. Failed results keep the logs and native trajectory already produced;
+even when the OpenHands process exits 0, the result is still a failure if the
+controller reports a fatal status. Non-Claude callers that used `replay_only = true` only to
construct a prefix must migrate to `prepare_only = true`.
`disable_thinking` belongs to `[replay]` and is also exposed as
@@ -608,7 +620,8 @@ construct a prefix must migrate to `prepare_only = true`.
request; OpenCode omits its `--thinking` flag when it is set. It does not turn
on Gateway capture. Optional `[run]`, `[overlayfs]` and `[overlaynet]` sections
create an outer managed `pvisor run`; they do not change the inner replay model
-path.
+path. Replay's filesystem parameters are governed by `pvisor replay --help`;
+do not copy `run`'s `--stage/--mount` grammar directly.
By default, replay's internal state, WAL, manifest, fresh-observation
comparisons and native working files remain under
@@ -1071,7 +1084,7 @@ project/ # reusable workspace / default base
├── lease.lock
├── control.sock # while a live OverlayFS Run is available
├── .capture/ # when OverlayNet/Gateway is enabled
- └── events.jsonl # when --record-destination is set
+ └── events.trace.jsonl # when --record-destination is set
```
Lifecycle commands accept a Run id, Run directory, project workspace,
@@ -1122,4 +1135,6 @@ and the native container executor keep their current behavior. See the
limits and SSH remote access.
-Enable the daemon-owned experimental pool with `pvisor-daemon serve --memory-pool`; its detached `memory-pool --directory DIR` component uses daemon-provisioned private configuration. Native `pvisor run --vm-memory-pool SOCKET` remains an explicit runtime option with platform/protocol limits, not a service launcher. Physical/legacy pool loss fails dependent VMs; Linux sealed-compressed clients retain local recovery and stop new publication. Select it with daemon `--memory-pool-mode compressed`. See [daemon pool activation and budgets](../guides/daemon/index.md#memory-pool); historical macOS compressed-pool results retain their [version scope](../design/memory-optimization/proof-of-concept.md#v1-integration).
+Enable the daemon-owned experimental pool with `pvisor-daemon serve --memory-pool`; its detached `memory-pool --directory DIR` component uses daemon-provisioned private configuration. Native `pvisor run --vm-memory-pool SOCKET` remains an explicit runtime option with platform/protocol limits, not a service launcher.
+
+Physical/legacy pool loss fails dependent VMs; Linux sealed-compressed clients retain local recovery and stop new publication. Select it with daemon `--memory-pool-mode compressed`. See [daemon pool activation and budgets](../guides/daemon/index.md#memory-pool); historical macOS compressed-pool results retain their [version scope](../design/memory-optimization/proof-of-concept.md#v1-integration).
diff --git a/docs/src/en/reference/config.md b/docs/src/en/reference/config.md
index 712cc444..d2eec74c 100644
--- a/docs/src/en/reference/config.md
+++ b/docs/src/en/reference/config.md
@@ -55,7 +55,7 @@ workload-aware-memory-offloading = true
## Daemon configuration {#daemon}
-`pvisor-daemon serve` accepts command-line settings, not this native `RunConfig` TOML or resolved `RunSpec`. Set `OPEN_SANDBOX_API_KEY` to a protected secret of at least 32 bytes. See [daemon startup](../guides/daemon/index.md#start) and [daemon and cache entry points](../guides/daemon/service.md).
+`pvisor-daemon serve` accepts command-line settings, not this native `RunConfig` TOML or resolved `RunSpec`. Set `OPEN_SANDBOX_API_KEY` to a protected secret of at least 32 bytes. See [daemon startup](../guides/daemon/index.md#install).
| Option | Default / meaning |
| --- | --- |
diff --git a/docs/src/en/reference/env-vars.md b/docs/src/en/reference/env-vars.md
index 915493d4..3fb9d7c1 100644
--- a/docs/src/en/reference/env-vars.md
+++ b/docs/src/en/reference/env-vars.md
@@ -27,7 +27,7 @@ See [shared cache](shared-image-cache.md) for endpoint grammar, security, and fa
`OPEN_SANDBOX_API_KEY` supplies the standalone `pvisor-daemon serve` lifecycle key. Use a protected random secret of at least 32 bytes; do not pass it in argv or project it to workloads. Clients send it as the `OPEN-SANDBOX-API-KEY` HTTP header. The environment name uses underscores; the HTTP name uses hyphens.
-Default daemon endpoints return a sandbox-scoped `X-PVISOR-SANDBOX-TOKEN` in endpoint headers; clients must preserve it. It is not a host environment setting or a lifecycle credential. See [endpoint authentication](../guides/daemon/operations.md#endpoints). Native cache/pool credentials and Job environment projection remain separate. Retired Cluster tokens are not daemon credentials.
+Default daemon endpoints return a sandbox-scoped `X-PVISOR-SANDBOX-TOKEN` in endpoint headers; clients must preserve it. It is not a host environment setting or a lifecycle credential. See [endpoint authentication](../guides/daemon/index.md#endpoints). Native cache/pool credentials and Job environment projection remain separate. Retired Cluster tokens are not daemon credentials.
## Runtime injection
@@ -47,13 +47,13 @@ The 0048 firmware negotiates bit 42 and applies pressure using actual dirty page
The subsequent 0049 patch sets the early-submission hint to one quarter of the pressure target, clamped to 1–16 MiB. Small writes still progress on the 10 ms timer, and the negotiated maximum WRITE remains 1 MiB. Queue admission reads an approximate dirty-page counter outside the connection lock, avoids repeating the per-folio pressure check, and does not schedule an empty pending list. Actual pressure checks, both WRITE barriers around integrity writeback, and error propagation remain. Version 0049v2 also preallocates bounded scatterlist metadata before starting request virtqueues and reuses it under the existing VQ lock. File pages and per-request argument buffers retain their original completion ownership; other atomic allocations remain.
-Historical 0048 evidence and the new 0049v2 cohorts remain separate. The new firmware passed Linux x86_64/KVM FULL/ERROR checks, seven firmware contracts, five replays of the original pressure history, independent N5 curves, and an ordinary-CLI WB0/1 comparison. Its correctness receipt retains the 50 Python contracts run at that point; subsequent CLI contracts have separate records. The CLI seven-tool total and Ready time show no detected benefit, and new sessions remain default-off. See the [independent experiments](../design/filesystem-io-performance-analysis.md#guest-writeback-tuning) for scope, workload results, and provenance.
+Historical 0048 evidence and the new 0049v2 cohorts remain separate. The new firmware passed Linux x86_64/KVM FULL/ERROR checks, seven firmware contracts, five replays of the original pressure history, independent N5 curves, and an ordinary-CLI WB0/1 comparison. Its correctness receipt retains the 50 Python contracts run at that point; subsequent CLI contracts have separate records. The CLI seven-tool total and Ready time show no detected benefit, and new sessions remain default-off. See the [independent experiments](../lab-notes/filesystem-io-performance-analysis.md#guest-writeback-tuning) for scope, workload results, and provenance.
Read `/sys/module/fuse/parameters/pvisor_wb_budget_bytes` inside the guest to inspect the active target. This diagnostic parameter is read-only through sysfs and rejects boot-argument assignment. Writable close may complete later; read-only close retains native FLUSH, and fsync/O_SYNC and final syncfs retain their error boundaries. The host retains upper object references or logical lower attributes after unlink/rename replacement until FORGET. Snapshots with detached/orphan references return Unsupported; finite legacy nodes with unknown snapshot counts remain conservative until DESTROY. Complete Agent IOCP/offload support remains unvalidated.
`PVISOR_VM_FS_HOST_WRITEBACK` enables an experimental host write cache, disabled by default: unset or `0` disables it, `1` enables it, and other values are rejected. It currently requires Linux staged virtio-fs, guest writeback disabled and DAX disabled. Each connection allows 64 MiB of payload and 1024 outstanding items; adjacent contiguous writes batch up to 1 MiB or 10 ms. Explicit synchronization and exit still observe background errors. Complete Agent IOCP and automatic offload remain pending. See [EXP-003](../design/experimental/agent-io-completion/index.md#host-write-buffer) for scope and synchronization contracts.
-`PVISOR_VM_FS_HOST_WRITEBACK_CONFIG` is a private engineering JSON control: `capacity_mib` is 4–256, `jobs` 1–4096, `batch_kib` 4–4096 and no larger than capacity, `chunks` 1–64, and `delay_us` 0–50000. Unset preserves the defaults above; unknown or duplicate fields, incorrect types and out-of-range values are rejected. `qualification_lock` and `synchronous` provide the old qualification lock and an owned-worker completion ablation. These are not stable product settings. See the [filesystem I/O experiments](../design/filesystem-io-performance-analysis.md) for curves and scope.
+`PVISOR_VM_FS_HOST_WRITEBACK_CONFIG` is a private engineering JSON control: `capacity_mib` is 4–256, `jobs` 1–4096, `batch_kib` 4–4096 and no larger than capacity, `chunks` 1–64, and `delay_us` 0–50000. Unset preserves the defaults above; unknown or duplicate fields, incorrect types and out-of-range values are rejected. `qualification_lock` and `synchronous` provide the old qualification lock and an owned-worker completion ablation. These are not stable product settings. See the [filesystem I/O experiments](../lab-notes/filesystem-io-performance-analysis.md) for curves and scope.
The following configure the guest kernel embedded **at build time** in Linux x86_64 musl builds:
diff --git a/docs/src/en/reference/exit-codes.md b/docs/src/en/reference/exit-codes.md
index bfaf1183..2c85436e 100644
--- a/docs/src/en/reference/exit-codes.md
+++ b/docs/src/en/reference/exit-codes.md
@@ -25,7 +25,7 @@ Apply conflicts, missing Jobs, and UnsupportedPolicy do not currently have disti
The standalone `pvisor-daemon` process returns 0 for successful `protocol` or normal server shutdown, 2 for clap argument errors, and 1 for startup/runtime errors reported on stderr. These are service process statuses, not sandbox workload exit codes. Companion dispatch preserves the companion's code when installed.
-Lifecycle clients must instead inspect HTTP status, `{code, message}` and `X-Request-ID`. Create returns 202 JSON; pause/resume return 202 with empty bodies; confirmed deletion returns 204. None establishes workload command success. Command results come from the prepared image's real execd data plane, not the native Job Run Bundle or retired Cluster aggregate result. Unsupported creation options are rejected rather than silently applied. See [daemon operations](../guides/daemon/operations.md).
+Lifecycle clients must instead inspect HTTP status, `{code, message}` and `X-Request-ID`. Create returns 202 JSON; pause/resume return 202 with empty bodies; confirmed deletion returns 204. None establishes workload command success. Command results come from the prepared image's real execd data plane, not the native Job Run Bundle or retired Cluster aggregate result. Unsupported creation options are rejected rather than silently applied. See [daemon operations](../guides/daemon/index.md#operations).
## Automation
diff --git a/docs/src/en/reference/platforms.md b/docs/src/en/reference/platforms.md
index f9728666..734c6f73 100644
--- a/docs/src/en/reference/platforms.md
+++ b/docs/src/en/reference/platforms.md
@@ -19,7 +19,7 @@ Current wheels target Linux x86_64 and macOS arm64. Source branches do not estab
## Single-node daemon {#daemon}
-The standalone daemon native runtime requires Linux x86_64/KVM and delegated cgroup v2; it does not support macOS HVF or Linux arm64. VM-only supervisors embed pVisor with trusted independent rootfs manifests and guest CID 3 vsock bridges to genuine execd/egress. Executable integration is implemented; bootstrap/images are neither supplied nor end-to-end validated, and SDK/density evidence is absent. See [daemon installation](../guides/daemon/index.md) and [runtime boundaries](../guides/daemon/boundaries.md); wheel/native executor support does not prove daemon readiness.
+The standalone daemon native runtime requires Linux x86_64/KVM and delegated cgroup v2; it does not support macOS HVF or Linux arm64. VM-only supervisors embed pVisor with trusted independent rootfs manifests and guest CID 3 vsock bridges to genuine execd/egress. Executable integration is implemented; bootstrap/images are neither supplied nor end-to-end validated, and SDK/density evidence is absent. See [daemon installation](../guides/daemon/index.md) and [runtime boundaries](../guides/daemon/index.md); wheel/native executor support does not prove daemon readiness.
## Verify capability evidence
diff --git a/docs/src/en/security/executor-boundaries.md b/docs/src/en/security/executor-boundaries.md
index cd15fcc2..2b8ba39f 100644
--- a/docs/src/en/security/executor-boundaries.md
+++ b/docs/src/en/security/executor-boundaries.md
@@ -22,7 +22,7 @@ Each executor provides the protection below per capability dimension. Every stat
The table describes requested controls for native Jobs, not the daemon API. VM-only NativeRuntime embeds pVisor in detached supervisors with independent immutable guest rootfs and private writes; delegated cgroup v2 caps the supervisor/VM tree. Stage/apply and checkpoint/fork APIs are not implemented, and node sharing is not automatically acquired. OpenSandbox network-policy options are rejected; native OverlayNet outbound networking is not a deny-all claim.
-Trust the host account, daemon/firmware and prepared image. Private state and same-UID IPC do not defend against hostile host-UID/root code. Other local users may reach loopback publications: use genuine service authentication and host controls. No hostile multi-user or security-audit assurance is claimed. See [daemon runtime boundaries](../guides/daemon/boundaries.md) for the unsupplied/unvalidated bootstrap and real-service checks.
+Trust the host account, daemon/firmware and prepared image. Private state and same-UID IPC do not defend against hostile host-UID/root code. Other local users may reach loopback publications: use genuine service authentication and host controls. No hostile multi-user or security-audit assurance is claimed. See the [daemon guide](../guides/daemon/index.md#prerequisites) for the unsupplied/unvalidated bootstrap and real-service checks.
## Reading the table
diff --git a/docs/src/en/security/index.md b/docs/src/en/security/index.md
index cc93700f..f4105971 100644
--- a/docs/src/en/security/index.md
+++ b/docs/src/en/security/index.md
@@ -1,6 +1,6 @@
# Security overview
-pVisor aims for **bounded, reversible, and auditable** execution: cap the blast radius of mistakes, let you discard file changes before apply, and record truthfully which controls actually took effect.
+pVisor aims for **bounded, reversible, and checkable** execution: cap the blast radius of mistakes, let you discard file changes before apply, and record truthfully which controls actually took effect.
## At a glance
diff --git a/docs/src/en/security/threat-model.md b/docs/src/en/security/threat-model.md
index 6a34595b..52a0aedb 100644
--- a/docs/src/en/security/threat-model.md
+++ b/docs/src/en/security/threat-model.md
@@ -51,6 +51,6 @@ A claim is not evidence. An admission-time plan can be at most `Planned`; actual
## Apply the model to a real review
-List the assets the task touches, then choose a control for each: staging and conflict checks for project files, an executor for reads outside the view, the matching network boundary for ordinary egress, and Gateway or a short-lived explicit grant for model keys. External writes that must be allowed need their own service-side permissions and review.
+List the assets the task touches, then choose a control for each. Project files use staging and conflict checks; reads outside the view use an executor; ordinary egress uses the matching network boundary; model keys use Gateway or a short-lived explicit grant. External writes that must be allowed need their own service-side permissions and review.
Record "request → plan → installed control → observation → uncovered part". When an observation is missing, mark the conclusion unknown; when only a cooperative control is available, describe how the workload bypasses it. Never treat an untriggered tool, an unreachable network, or a non-adversarial sample as proof that a boundary holds.
diff --git a/docs/src/en/start/first-run.md b/docs/src/en/start/first-run.md
index d1f37e55..b4be13d8 100644
--- a/docs/src/en/start/first-run.md
+++ b/docs/src/en/start/first-run.md
@@ -21,9 +21,9 @@ git init -q && git add -A && git commit -qm init
cat > ../agent.sh <<'SH'
#!/usr/bin/env bash
set -u
-printf 'print("patched")\n' >> src/app.py # 修改源码
-rm -f src/legacy.txt # 删除文件
-printf 'scratch\n' > scratch.txt # 工作区根目录的额外改动
+printf 'print("patched")\n' >> src/app.py # edit source
+rm -f src/legacy.txt # delete a file
+printf 'scratch\n' > scratch.txt # extra change at the workspace root
cat .ssh/id_rsa >/dev/null 2>&1 || echo 'read .ssh/id_rsa: denied'
curl -sS --max-time 5 https://example.com >/dev/null 2>&1 || echo 'reach example.com: blocked'
SH
@@ -68,3 +68,25 @@ pvisor status --review ../agent-stage-001
```
Installed Agent CLIs use the same entry point. With `--stage PATH`, pass that path or the printed Job ID (`run-*`) to later commands. `last` searches default storage only; do not rely on it when running projects in parallel.
+
+## 7. After switching to a real task
+
+Replace the demo with a narrowly scoped real task: retain the current repository baseline, confirm the agent is installed in the selected execution environment, and configure its model service and credentials—pVisor does not select the agent's provider. For an installed Codex with an explicitly delivered OpenAI key, set `OPENAI_API_KEY` in the host environment first:
+
+```bash
+pvisor run --safe --pass-env OPENAI_API_KEY --stage ../agent-task-001 -- codex
+pvisor status --review ../agent-task-001
+pvisor inspect ../agent-task-001 -- git --no-pager diff -- src
+```
+
+`--safe` matches network presets by the direct executable filename. Adding `--overlaynet-allow` replaces the preset list, so list model APIs alongside dependency downloads or other model services. HOME writes are discarded after exit; do not depend on this run to persist login state. See [Agent integration](../guides/agents/index.md) for other agents' credentials and prerequisites.
+
+After the Job stops, check its exit code, installed controls, warnings, and changes; a nonzero exit can still leave candidates. Workspace fork can retry from file state when all of these hold:
+
+- the parent Job is a stopped host Job with reconstructable launch policy;
+- parent and child stages share a filesystem;
+- you fork before a full apply or drop cleans up staging data.
+
+VM/container Jobs and Jobs with Gateway routes do not support this path. See [review and apply](../guides/review-apply.md) for conflict handling.
+
+Two constraints apply before expanding the task scope. Selective proxies on the Linux host remain cooperative, so prepare a VM with the agent installed when you need mandatory selective egress ([credentials and environment](../guides/policies/credentials.md)). When adding concurrency, give each task a separate worktree and stage, select results by explicit paths, review each separately, and never apply concurrently into the same target tree; the [parallel workspace workflow](../guides/parallel-agents.md#batch) verifies records and merging with two offline tasks before you substitute real agents.
diff --git a/docs/src/en/start/index.md b/docs/src/en/start/index.md
deleted file mode 100644
index 9fc40e1a..00000000
--- a/docs/src/en/start/index.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Start here
-
-**PolicyVisor (pVisor)** runs agents unattended and lets you keep only the file changes you approve. It runs your existing Agent CLI, script, or automation command and records the limits that actually applied to each execution.
-
-The Python package and CLI are both named `pvisor`. Follow [installation](installation.md) and check platform prerequisites first: staged host Jobs need FUSE/macFUSE, while ordinary host Jobs write directly to the workspace by default.
-
-## Complete your first loop
-
-From a disposable test project directory with no existing `result.txt`, verify staging and review with an offline command. No agent account or API key is needed:
-
-```bash
-pvisor run --safe --overlaynet-deny-all -- /bin/sh -c 'printf "candidate\n" > result.txt'
-pvisor status --review last
-pvisor inspect last -- cat result.txt
-```
-
-Expect exit code zero and no new `result.txt` in the original project yet. After the Job stops, `inspect` runs the host's `cat` in a kernel-read-only OverlayFS workspace view and should print `candidate`. Review terminal status, installed controls, and file changes, then choose whether to keep or discard the result.
-
-To keep the file, run:
-
-```bash
-pvisor apply last --path result.txt
-```
-
-Or discard the candidate instead:
-
-```bash
-pvisor drop last
-```
-
-This example has only one change, so apply completes it and cleans up disposable staging data; no subsequent drop is needed. When there are multiple changes and you apply in batches, unselected candidates remain for a later apply or drop. The full [first run](first-run.md) also demonstrates file deletion and access interception.
-
-## Use a real task
-
-Replace the command after `--` with an installed script or Agent CLI, explicitly configuring the credentials and network destinations it needs.
-
-To choose storage, use `--stage PATH` with a fresh directory outside the project, then select that path or the printed Job ID in later commands. Do not rely on `last`, which searches default storage only. See [staging and storage](../reference/cli.md#暂存与存储) for write destinations in HOME, the VM root, and the workspace. Remote APIs, database writes, and messages are outside file staging.
diff --git a/docs/src/en/start/installation.md b/docs/src/en/start/installation.md
index de5b6abd..f3143105 100644
--- a/docs/src/en/start/installation.md
+++ b/docs/src/en/start/installation.md
@@ -1,9 +1,5 @@
# Installation
-Once `pvisor` is installed, you can run Agent CLIs, scripts, and automation inside a policy boundary and get checkable execution records. The Python package, CLI, and core Rust crate are all named `pvisor`; other crates use `pvisor-*` and environment variables use `PVISOR_*`.
-
-When upgrading, update deployed `PVISOR_*` settings as well. Local state defaults to `.pvisor` and user caches to `pvisor/`; existing data is not migrated automatically.
-
## 1. Install the tools
```bash
@@ -16,7 +12,7 @@ Check the command:
pvisor --version
```
-The wheel installs a Python version marker and native CLI scripts directly in the current Python environment's bin directory; no Python launcher is involved. If your project has other Python dependencies, use a virtual environment:
+The wheel installs the native CLI into the current Python environment's bin directory; no Python launcher is involved. If your project has other Python dependencies, use a virtual environment:
```bash
python3 -m venv .venv
@@ -27,9 +23,11 @@ pip install pvisor
Published wheels target Linux x86_64 and macOS arm64. Check release artifacts or build from source for other architectures.
+Upgrading: update deployed `PVISOR_*` settings with the new release. Local state under `.pvisor` and user caches under `pvisor/` are not migrated automatically.
+
## 2. Check platform prerequisites
-Wheel installation supports macOS and Linux and requires Python 3.10 or newer; the installed native CLI does not use a Python launcher. Ordinary host Jobs write directly to the workspace; only `--safe` or `--stage` uses filesystem staging. Install macFUSE before running a staged host Job on macOS:
+Wheel installation supports macOS and Linux and requires Python 3.10 or newer. Ordinary host Jobs write directly to the workspace; only `--safe` or `--stage` uses filesystem staging. Install macFUSE before running a staged host Job on macOS:
```bash
brew install --cask macfuse
@@ -59,7 +57,7 @@ Or build the CLI from source:
just install-cli
```
-To test a specific native build, invoke its path directly (for example `target/debug/pvisor`) or put its directory first on `PATH`. The old launcher's `PVISOR_BIN` override is not used by installed native scripts. Editable Python installation is not a native CLI build; use `just build` or `just install-cli`.
+To test a specific native build, invoke its path directly (for example `target/debug/pvisor`) or put its directory first on `PATH`. Installed native scripts ignore `PVISOR_BIN`. Editable Python installation is not a native CLI build; use `just build` or `just install-cli`.
## Install the single-node daemon separately {#daemon}
diff --git a/docs/src/en/start/next-steps.md b/docs/src/en/start/next-steps.md
deleted file mode 100644
index dd917aa5..00000000
--- a/docs/src/en/start/next-steps.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# After your first run
-
-Replace the demo with a narrowly scoped real task, such as changing one implementation under `src`. Retain the current repository baseline, confirm the agent is installed in the selected execution environment, and configure its model service and credentials. pVisor does not select the agent's provider.
-
-## Connect a real agent
-
-For an installed Codex using an explicitly delivered OpenAI key, run from the project directory. Set `OPENAI_API_KEY` in the host environment first and use a fresh stage outside the project each time:
-
-```bash
-pvisor run --safe --pass-env OPENAI_API_KEY --stage ../agent-task-001 -- codex
-pvisor status --review ../agent-task-001
-pvisor inspect ../agent-task-001 -- git --no-pager diff -- src
-```
-
-`--safe` matches network presets by the direct executable filename. Adding `--overlaynet-allow` replaces the preset list, so list model APIs alongside dependency downloads or other model services. HOME writes are discarded after exit; do not depend on this run to persist login state. See [Agent integration](../guides/agents/index.md) for other agents' credentials and prerequisites.
-
-## Decide whether to keep, retry, or discard
-
-After the Job stops, check its exit code, installed controls, warnings, and changes; a nonzero exit can still leave candidates. `inspect` requires an OverlayFS workspace and uses host tools, not tools inside the original VM or container.
-
-Apply selected paths when satisfied. To retry from file state, workspace fork requires a stopped host Job with reconstructible launch policy; VM/container Jobs or Jobs with Gateway routes do not support this path. Parent and child stages must share a filesystem, and you must fork before a full apply/drop cleans up staging data. See [review and apply](../guides/review-apply.md) for conflict handling.
-
-## Before expanding the task
-
-Selective proxies on Linux host remain cooperative. For mandatory selective egress, prepare a VM with the agent installed. See [credentials and environment](../guides/policies/credentials.md) for credential delivery methods.
-
-When adding concurrency, give each task a separate worktree and stage, select results by explicit paths, and review each one separately. Do not apply concurrently into the same target tree. The [parallel workspace workflow](../guides/parallel-agents.md#batch) uses two offline tasks to verify records and merging before substituting real agents.
diff --git a/docs/src/en/start/what-is-pvisor.md b/docs/src/en/start/what-is-pvisor.md
deleted file mode 100644
index e5db211b..00000000
--- a/docs/src/en/start/what-is-pvisor.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# What is PolicyVisor?
-
-**PolicyVisor (pVisor) runs agents unattended; you decide which file changes to keep.**
-
-It runs your existing Agent CLI, script, or automation command: the command runs unattended inside a policy boundary, and file changes go to a stage first. Afterwards you review changes and evidence like a pull request and apply only what you want to keep.
-
-pVisor provides a shared file-review, selective-merge, and run-record workflow across agents and executors. See [why pVisor](../why/index.md) for the path to scaling autonomous execution, and [comparisons](../why/comparisons.md) for point-by-point comparisons with Docker, built-in agent sandboxes, and similar approaches.
-
-## What you get
-
-- **Hands off:** no babysitting approval prompts. Agent file changes go to a stage first; network and sensitive paths follow policy.
-- **Gate the result:** review changes like a pull request, choose which paths to apply, and discard the rest in one step. If you edited the same file meanwhile, pVisor refuses to overwrite your changes.
-- **Keep a record:** every run leaves a checkable record of the limits that actually applied, the accesses it blocked, and optionally the model requests.
-
-## Three commands
-
-```bash
-pvisor run --safe -- codex
-pvisor status --review last
-pvisor apply last --path src # 或:pvisor drop last
-```
-
-!!! tip "Try a demo that needs no API key"
-
- [Your first run](first-run.md) uses a "fake agent" script to walk the full loop: it edits source, deletes a file, attempts to read a sensitive path and reach the internet, and you see the changes and blocked accesses during review before applying only `src`.
-
-## Where we are today
-
-The current workflow uses local Jobs: run an agent, review the result, and selectively merge file changes. See the [trust ladder](../why/trust-ladder.md) for the roadmap and [executor boundaries](../security/executor-boundaries.md) for each executor's protection scope.
-
-## Guarantee scope
-
-A run's boundary comes from its capability evidence; `apply` and `drop` manage staged files only and do not undo external side effects. See [capabilities, evidence, and guarantee boundaries](../concepts/capabilities-and-evidence.md) for the full scope and [security](../security/index.md) for the threat model.
diff --git a/docs/src/en/why/assets/agent-execution-path.svg b/docs/src/en/why/assets/agent-execution-path.svg
deleted file mode 100644
index 9a1fb906..00000000
--- a/docs/src/en/why/assets/agent-execution-path.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-
-How pVisor connects Linux execution to host services
-Agents and tools run inside guest Linux. Most system calls remain in the guest. Exported file-tree requests use virtio-fs to reach the host file service, and network requests use virtio-net to reach controlled egress. Host facilities also manage supported memory sharing and reclamation, plus staging and result acceptance for native Jobs.
-
-
-
-How pVisor connects Linux execution to host services
-Keep Linux application compatibility; coordinate control and resources at explicit boundaries.
-
-
-Guest execution environment
-Host services
-
-Agent CLI, shell, and development tools
-Separate user processes and address spaces
-
-Customized Linux guest kernel
-System calls, processes, caches, and TCP/IP
-Internal work and cache hits can stay local
-
-System calls
-
-OCI user space and shared image cache
-Pinned content versions; files read on demand
-
-
-File service and OverlayCore
-Policy, layered views, private writes, baselines
-
-Controlled network egress
-Host smoltcp, access policy, upstream connections
-
-virtio-fs
-
-virtio-net
-
-Virtualization boundary and VMM
-KVM / HVF, virtual devices, and controlled guest RAM access
-
-Memory lifecycle
-Share identical data; compress or offload as supported
-Keep recovery backing; coordinate CPU and devices
-
-Result acceptance for native Jobs
-Staged files and execution records → review
-Selective apply or discard unaccepted changes
-Mechanisms depend on platform and profile; automatic offload and wake during model waits remain research.
-
diff --git a/docs/src/en/why/assets/agent-io-completion.svg b/docs/src/en/why/assets/agent-io-completion.svg
deleted file mode 100644
index 98fb5822..00000000
--- a/docs/src/en/why/assets/agent-io-completion.svg
+++ /dev/null
@@ -1,77 +0,0 @@
-
- Core challenge: Agent-level I/O completion
- pVisor's core architecture and engineering path; the protocol loop remains incomplete. Time runs left to right. The guest submits a request and hands off its payload; the host takes ownership of independent buffers and requests. After guest RAM and descriptor borrowers are drained and recoverable state is committed, the guest can be offloaded without termination. Downloads, LLM requests and bulk writes continue using host-owned state without accessing offloaded guest RAM. Results enter a bounded completion queue or staged object and trigger wakeup. Guest RAM is restored before completion delivery and continuation of the same attempt. Host buffers and result staging consume memory and must be charged against savings. Current whole-VM offload still drains device requests first; this diagram does not describe an implemented feature.
-
-
-
-
-
-
- Core challenge: Agent-level I/O completion
- Park the execution environment safely; host-owned I/O keeps progressing and wakes execution when ready.
-
- Time →
-
-
-
- Guest execution
- Program + Linux state
- Host I/O
- Owned objects + tasks
-
- Run program
- Issue an I/O request
-
- Submit request + data
- Transfer data ownership
-
- Restore guest RAM
- Deliver completion; continue
-
- Safe offload · same attempt
- Park execution; reduce RAM residency
-
-
-
- Offload window: host I/O does not access guest RAM
-
- Data handoff
-
- Own buffer / request
- Keep owned data / objects
- No borrowed guest memory
-
- Download / LLM / bulk write progresses
- Host owns connection, request and payload
- No guest execution needed for this I/O
-
- Bounded completion queue
- Keep result or object handle
- Capacity limits, backpressure, expiry
-
-
-
- Complete → wake
-
- Prerequisites for safe parking
- Park vCPUs; drain guest RAM / descriptor borrowers.
- Host-owned I/O proceeds; guest delivery waits for restore.
- Accepted ≠ durable ≠ completed ≠ received by guest.
- Resolve timeout / cancel outcomes; no blind non-idempotent replay.
-
- Trade-off: host buffers versus whole-guest residency
- Memory saved (GiB·s) ≈ (G − H) × T
- G: physical RAM freed; H: added buffers, queues and page cache
- T: offloaded duration. Use residency integrals for actual savings.
- Include copy / restore costs and concurrent-wakeup memory peaks.
- Core architecture. Current whole-VM offload drains device requests; host handoff and automatic wakeup are not implemented.
- Uses submission / completion queues as a model; does not implement Windows IOCP APIs or terminate / restart the guest.
-
diff --git a/docs/src/en/why/assets/agent-isolation-boundaries.svg b/docs/src/en/why/assets/agent-isolation-boundaries.svg
deleted file mode 100644
index 8ab660f6..00000000
--- a/docs/src/en/why/assets/agent-isolation-boundaries.svg
+++ /dev/null
@@ -1,125 +0,0 @@
-
- Processes, containers and VMs: where isolation happens
- Three columns compare isolation. Ordinary processes have separate user address spaces but enter the same host kernel. Containers use namespaces and cgroups to separate resource views and limit resources, while sharing the host kernel and its address space. In a hosted virtual machine model, user processes enter separate guest kernels, then access the host platform through virtual I/O, a VMM or hypervisor, and the host kernel. Typical I/O paths below illustrate boundaries, not linear performance costs or absolute security guarantees.
-
-
-
-
-
-
-
- Processes, containers and VMs: where isolation happens
- Separate user address spaces, shared or separate kernels, and different paths for data I/O.
-
- User address space
-
- Shared host kernel
-
- Separate guest kernel
-
- Process
- Separate user spaces; shared kernel
-
- Container
- Separate resource views; shared kernel
-
- Virtual machine
- Separate user spaces and guest kernels
-
- Process A
- Own user address space
-
- Process B
- Own user address space
-
-
- Process A
- Own user address space
- namespace / cgroup
-
-
- Process B
- Own user address space
- namespace / cgroup
-
-
- Process A
- Own user address space
- System call
-
-
- Guest kernel
- Own kernel address space
- VM A
-
-
- Process B
- Own user address space
- System call
-
-
- Guest kernel
- Own kernel address space
- VM B
-
-
- System call
-
- Shared host kernel
- One kernel instance / address space
- Both processes execute kernel code here
-
-
- File / network / device I/O
- Kernel checks permissions and resources
-
-
- System call
-
- Shared host kernel
- One kernel instance / address space
- Implements namespaces and cgroups
-
-
- File / network / device I/O
- Kernel checks permissions, views and limits
- Virtual I/O
-
-
-
- VMM / hypervisor boundary
-
-
- Host kernel
-
-
- Host platform · CPU / RAM / devices
- Processes enter the same kernel instance.
-
- Host platform · CPU / RAM / devices
- Containers share the kernel address space.
-
- Host platform · CPU / RAM / devices
- Hosted VM model; separate guest kernels.
- Typical I/O paths: boundaries require permission checks or protocol handling
-
- Process → system call → host kernel
- Permissions, data copying and kernel work
-
- Process → system call → shared kernel
- Resource views and limits in the same kernel
-
- Guest → virtual I/O → host service
- Device, filesystem or network protocols
- Boundaries show structure, not a performance scale. I/O cost depends on the path, batching, shared memory and implementation.
- Isolation also depends on privileges, configuration and vulnerabilities. VMs do not guarantee absolute security.
-
diff --git a/docs/src/en/why/comparisons.md b/docs/src/en/why/comparisons.md
index 4d5f5278..87dcd867 100644
--- a/docs/src/en/why/comparisons.md
+++ b/docs/src/en/why/comparisons.md
@@ -1,14 +1,48 @@
-# Comparing existing approaches
+# Should you use pVisor?
+
+pVisor fits one pattern: **the agent runs unattended and you review the result afterward.** You do not need it when:
+
+- **You watch it run**: approval and correction happen in the moment, so review afterward adds nothing.
+- **`git` already rolls it back cleanly**: if the diff is small and `git checkout` always leaves a clean tree, staging and selective merging save little.
+- **The real side effects are external**: remote APIs, database writes, and sent messages are beyond staging's reach; rollback needs something else.
+- **You need adversarial isolation**: untrusted multi-tenancy needs a VM-grade substrate, and pVisor is one executor choice.
+
+When you want **unattended execution followed by review**, use pVisor to stage file changes, inspect execution records, and select the paths to apply.
+
+## Comparing existing approaches
| Approach | Strong at | Additional setup or integration | When to choose it |
| --- | --- | --- | --- |
-| Docker / devcontainer | Isolated environment, reproducible dependencies | Change review, refusing to overwrite on conflict, selective apply, evidence | You only need a reproducible environment |
-| Agent-native sandbox | OS sandboxing, approvals and client session records | Unified cross-client stage/apply and executor-capability evidence require additional organization | Prefer native client protections first |
+| Docker / devcontainer | Isolated environment, reproducible dependencies | Change review, conflict refusal, selective apply, evidence | You only need a reproducible environment |
+| Agent-native sandbox | OS sandboxing, approvals and client session records | Cross-client stage/apply and capability evidence need extra tooling | Prefer native client protections first |
| git worktree | File-level parallelism | Network and credentials, execution evidence | File-only parallelism |
| Cloud sandboxes (E2B, Daytona, Modal) | Remote isolated execution | Local workspace integration and a local review flow | You need remote isolation |
| Kubernetes / Ray | Scheduling and orchestration | Task execution boundaries, file staging, and execution records | You already have an orchestration layer |
| gVisor / Firecracker / Kata | Isolation substrate | Execution semantics, review, and evidence | You need a stronger isolation substrate |
-Existing worktrees, patch validation, and merge workflows can be used with Docker and `git diff`. Writes through a bind mount need their own recovery procedure. pVisor provides staging, selective submission, preimage conflict checks, and capability observations; the benchmarks show the runtime cost.
+You can keep worktrees, patch validation and merge workflows with Docker and `git diff`. Writes through a bind mount need their own recovery procedure. pVisor adds staging, selective submission, preimage conflict checks and capability observations; the benchmarks measure their runtime cost.
+
+Compare overhead across the whole task flow: [end-to-end tasks](../benchmarks/agent-tasks.md) measures repair, filesystem tools, workspace review and CLI compatibility for agent-native sandboxes, Docker/devcontainers, VMs and cloud sandboxes. [Reinforcement learning](../benchmarks/compare-rl-infra.md) uses active-capacity and replay evidence to explain executor choices for rollout environment budgets. Cloud bills, nested agent sandbox defaults and end-to-end training throughput have no matched comparison.
+
+## FAQ
+
+**How does it differ from an agent-native sandbox?**
+An agent-native sandbox answers whether it can block something. On top of that, pVisor provides retrospective selective merging, conflict protection, and a checkable execution record, with consistent semantics across agents and executors (see the table above).
+
+**Does it slow agents down?**
+pVisor adds admission, file interception and recording costs. Measured startup and filesystem overhead is in [startup latency](../benchmarks/startup.md) and [filesystem tasks](../benchmarks/filesystem.md).
+
+**Can it run in CI?**
+Yes. Today you can use the L1 workflow in a pipeline: let the agent finish, review, and merge only what you want. Policy- and evidence-driven exemption and clustering (L2/L3) are the direction; see [running agents in CI](../guides/ci.md).
+
+**Which agents are supported?**
+Any command can run; Claude Code, Codex, and others get presets matched by executable name. See [connecting your agent](../guides/agents/index.md).
+
+**Does data leave my machine?**
+pVisor itself does not collect or upload usage data. The agent's own model API calls still leave the machine: under `--safe`, only that agent's model API allowlist is permitted and other egress follows policy. pVisor's own network behavior appears only when you enable Gateway capture or use a remote image cache service. See [security overview](../security/index.md).
+
+**Why does `last` not find the Job I just ran?**
+With `--stage PATH`, the Job lives in the stage directory, while `last` searches default storage by workspace. Pass the path or Job ID explicitly. See [Jobs and storage](../concepts/jobs.md).
-Assess overhead across the task flow: [end-to-end tasks](../benchmarks/agent-tasks.md) combines measured repair, filesystem tools, workspace review and CLI compatibility to analyze native Agent sandboxes, Docker/devcontainer, VMs and clouds. [Reinforcement learning](../benchmarks/compare-rl-infra.md) combines active-capacity and replay evidence to explain executor choices for rollout environment budgets. Cloud bills, default nested Agent sandboxes and complete training performance have no matched comparison.
+**Can staging undo external side effects?**
+No. Staging covers files only; external API calls, database writes, and sent messages are not rolled back by it. See [staging and apply semantics](../concepts/staging.md).
diff --git a/docs/src/en/why/faq.md b/docs/src/en/why/faq.md
deleted file mode 100644
index c23394ab..00000000
--- a/docs/src/en/why/faq.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# FAQ
-
-**How does it differ from an agent-native sandbox?**
-An agent-native sandbox answers whether it can block something. On top of that, pVisor provides retrospective selective merging, conflict protection, and a checkable execution record, with consistent semantics across agents and executors. See [comparisons](comparisons.md).
-
-**Does it slow agents down?**
-pVisor adds the cost of admission, file interception, and recording. Measured startup and filesystem overhead is in [benchmarks and comparisons](../benchmarks/index.md) (partly under construction).
-
-**Can it run in CI?**
-Yes. You can use it in a pipeline the L1 way today: let the agent finish, review, and merge only what you want. Policy- and evidence-driven exemption and clustering (L2/L3) are the direction; see [running agents in CI](../guides/ci.md).
-
-**Which agents are supported?**
-Any command can run; Claude Code, Codex, and others get presets matched by executable name. See [connecting your agent](../guides/agents/index.md).
-
-**Does data leave my machine?**
-pVisor itself does not collect or upload usage data. But an agent's calls to model APIs leave the machine anyway, and pVisor does not keep them local: under `--safe`, only that agent's model API allowlist is permitted and other egress follows policy. pVisor's own network behavior appears only when you explicitly enable Gateway capture or use a remote image cache service. See [security overview](../security/index.md).
-
-**Why does `last` not find the Job I just ran?**
-With `--stage PATH`, the Job lives in the stage directory, while `last` searches default storage by workspace. Pass the path or Job ID explicitly. See [Jobs and storage](../concepts/jobs.md).
-
-**Can staging undo external side effects?**
-No. Staging covers files only; external API calls, database writes, and sent messages are not rolled back by it. See [staging and apply semantics](../concepts/staging.md).
diff --git a/docs/src/en/why/index.md b/docs/src/en/why/index.md
index ef3866b9..a23ce25a 100644
--- a/docs/src/en/why/index.md
+++ b/docs/src/en/why/index.md
@@ -1,16 +1,16 @@
# Why pVisor
-Letting an agent complete a task unattended calls for limits on file and network access, followed by a review of its changes and execution record.
+Use pVisor when you want an agent to finish a task without watching every command. It limits what the agent can touch, holds its file changes until you decide what to merge, and records what ran. A mistake stays bounded, a failed attempt is cheap to drop, and a result can be checked after the run.
## Reduce intervention during execution
-How long an agent can run depends on how long you are willing to watch. Approve every command and human attention becomes the ceiling; go fully automatic and you must accept that it may corrupt files, read what it should not, and send requests where they should not go.
+An agent can run only as long as you are willing to watch it. Approve every command and your attention becomes the ceiling. Switch to full auto and you accept that it may corrupt files, read what it should not, or send requests to the wrong host.
-More tasks take more attention when every command needs approval. Execution boundaries and post-run review can reduce intervention while tasks run.
+Approval cost scales with steps; review cost scales with results. Deferring review lets you sample results, batch them, and machine-check them. A complete record can be verified in one pass after the run instead of intercepted during it.
## Decouple supervision from execution volume
-To let go, every execution needs three things at once:
+Unattended execution needs three properties at once:
| Property | Meaning | What it means for you |
| --- | --- | --- |
@@ -18,9 +18,9 @@ To let go, every execution needs three things at once:
| Reversible | Changes can be selectively merged, discarded, or forked before they are applied | Failure is cheap, so you dare to let go |
| Checkable | Execution leaves a record you can verify | Review can sample, or even be handed to a machine |
-pVisor is the execution layer that gives every execution these three properties.
+Each property has a mechanism: [file and network policies](../guides/policies/files.md) installed at runtime, [staging](../concepts/staging.md) that holds changes until you merge them, and [records](../concepts/capabilities-and-evidence.md) written for every Job.
-Scaling also calls for controlling environment preparation, tool execution, model waiting, and repeated work after failures. [Agent task lifecycle cost](agent-lifecycle-cost.md) connects these costs to pVisor's execution paths, choice of isolation mechanisms, and the core insight and engineering challenge of letting the host take over I/O while the guest is offloaded during waits.
+At scale, environment preparation, tool execution, model waiting and failure rework enter the bill too. [Agent task lifecycle cost](../design/research/agent-lifecycle-cost.md) accounts for them across pVisor's execution paths and isolation choices, including host-side I/O takeover while a guest is offloaded during a wait.
## Responsibilities of the execution layer
@@ -28,11 +28,23 @@ pVisor is the **semantic layer for each execution**: it defines boundaries, inst
Executors provide isolation through host namespaces/Seatbelt, containers, or VMs. pVisor manages execution policy, lifecycle, and records; external systems such as Kubernetes and Ray handle cross-node orchestration.
-## Today, and after
+## Today, and after {#trust-ladder}
-Today pVisor runs Job by Job on one machine: finish a task unattended, then afterward merge only the changes you want, as you would review a PR. This is L1, and it already has the three properties needed for higher levels of autonomy.
+Autonomous execution falls into four levels, by when and by how much a human intervenes:
-For how the four levels split, where pVisor places its bet, and the status of L2/L3, see [trust ladder and scale](trust-ladder.md); for usage at different scales see [use cases](use-cases.md).
+| Level | How humans intervene (trust axis) | What carries it (scale axis) | Status |
+| --- | --- | --- | --- |
+| L0 | Approve each command before it runs | A single interactive session | Common in agents, now with model-assisted approval |
+| L1 | Review each change after the run | Local, individual Jobs | **pVisor today** |
+| L2 | Policy and evidence determine exemptions; humans spot-check | Multiple local Jobs / one pipeline | Next |
+| L3 | Audit afterward; humans handle exceptions only | Clustered: cross-node scheduling, centralized evidence | pVisor's scale target |
+
+pVisor targets L1 today: enforce access boundaries at runtime, stage file changes, then inspect records and results. Use the `--ask` approval channel when an individual operation needs a human decision. The [single-node daemon](../guides/daemon/index.md) manages local sandbox lifecycle through an API separate from native Job review; Kubernetes, Ray and similar systems own cross-node scheduling, with pVisor supplying execution semantics and checkable records.
+
+- **One person, one agent.** An unattended refactor with the changes reviewed before merge: available today.
+- **One person, many agents.** Parallel runs with batch review: next ([parallel agents](../guides/parallel-agents.md)).
+- **Teams and platforms.** The L1 workflow in CI: available today ([running in CI](../guides/ci.md)).
+- **Agentic RL and evaluation.** A recorded, forkable, replayable batch substrate: direction ([RL rollouts](../guides/rl-rollouts.md), [research directions](../design/research/index.md)).
!!! note "Under construction"
- "Human supervision cost per unit of agent work" has no measured data yet; requirements and acceptance criteria are in [supervision cost](../benchmarks/supervision-cost.md).
+ Supervision cost per unit of agent work has no measurements yet; requirements and acceptance criteria are in [supervision cost](../benchmarks/supervision-cost.md). L2/L3 entry criteria are not final: see the [roadmap](../community/roadmap.md) for progress and [concurrency density](../benchmarks/density.md) for the capacity rationale.
diff --git a/docs/src/en/why/trust-ladder.md b/docs/src/en/why/trust-ladder.md
deleted file mode 100644
index 7dcc8c67..00000000
--- a/docs/src/en/why/trust-ladder.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Trust ladder and scale
-
-Autonomous execution can be viewed along two axes: **how humans intervene** (the trust axis) and **what carries execution** (the scale axis).
-
-## Post-run review
-
-**Enforce access boundaries during execution, then review changes and records together.**
-
-During execution, file and network policies limit access, and staging retains changes for review. After execution, review the process record and results together, reducing the need to approve each command.
-
-## Batch review
-
-Process review does not amortize. Every extra step is another decision, and a human must be present throughout—how fast the agent runs depends on how closely you watch. That is today's ceiling.
-
-Deferred review does amortize. Results can be sampled, batched, and machine-checked; once process facts are recorded completely, they can be verified after the fact in one pass instead of being intercepted during execution.
-
-## Four levels are a reference; the choice is the last one
-
-The four levels describe the timing and degree of human intervention. L0 requires approval before each command; L1 through L3 use post-run review and progressively introduce policy- and evidence-based exemptions. The table lists the usage scenarios for each level.
-
-| Level | How humans intervene (trust axis) | What carries it (scale axis) | Status |
-| --- | --- | --- | --- |
-| L0 | Approve each command before it runs | A single interactive session | Common in agents, now with model-assisted approval |
-| L1 | Review each change after the run | Local, individual Jobs | **pVisor today** |
-| L2 | Policy and evidence determine exemptions; humans spot-check | Multiple local Jobs / one pipeline | Next |
-| L3 | Audit afterward; humans handle exceptions only | Clustered: cross-node scheduling, centralized evidence | pVisor's scale target |
-
-pVisor focuses on post-run review: enforce access boundaries, stage file changes, then inspect records and results. Use the `--ask` runtime approval channel when individual operations need approval.
-
-## Review process and results together
-
-Execution records retain observed file access, denials, and network activity. After the task finishes, review these records alongside the file changes.
-
-## Where we are today
-
-What ships today is this stage at single-machine scale: individual Jobs on one machine—run unattended, then review changes and evidence afterward, and merge only what you want. L2's exemption decisions and L3's cluster scale are not here yet.
-
-The [single-node daemon](../guides/daemon/index.md) manages local sandbox lifecycle through an API separate from native Job review. External systems such as Kubernetes and Ray handle cross-node scheduling; pVisor provides execution semantics and checkable records within those systems.
-
-!!! note "Under construction"
- The entry criteria and gap list for L2/L3 are not final. See the [roadmap](../community/roadmap.md) for progress, [concurrency density](../benchmarks/density.md) for the capacity rationale, and [cluster execution](../design/research/cluster-execution.md) for the cluster direction.
diff --git a/docs/src/en/why/use-cases.md b/docs/src/en/why/use-cases.md
deleted file mode 100644
index 42fd3194..00000000
--- a/docs/src/en/why/use-cases.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Use cases
-
-The same pVisor solves different problems at different scales.
-
-## One person, one agent
-
-Let Claude Code or Codex complete a refactor fully unattended: it edits files and runs tests, and may delete a few things along the way. You do not watch; when it finishes you review the changes as you would a PR and merge only the paths you want. **Available today.**
-
-```bash
-pvisor run --safe -- claude
-pvisor status --review last
-pvisor apply last --path src
-```
-
-## One person, multiple agents
-
-Run several agents on different approaches at once. Each Job is isolated and leaves its own evidence, so you can review in batches and merge only the results you need. **Next (L2)**; see [parallel agents](../guides/parallel-agents.md).
-
-## Teams and platforms
-
-Put pVisor in CI: let the agent finish, review, and merge only what you want. **Available today (the L1 way)**; policy- and evidence-driven exemption and clustering (L2/L3) are the direction—see [running agents in CI](../guides/ci.md).
-
-## Research and training
-
-Agentic RL and evaluation want exactly a "large-scale, untrusted, recordable" execution substrate: trajectories can be recorded, forked from checkpoints, and replayed by tool prefix. **Direction**; see [RL rollouts](../guides/rl-rollouts.md) and [research directions](../design/research/index.md).
diff --git a/docs/src/en/why/when-not-to-use.md b/docs/src/en/why/when-not-to-use.md
deleted file mode 100644
index f9f1baf6..00000000
--- a/docs/src/en/why/when-not-to-use.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# When you do not need pVisor
-
-There is one test: **you are going to watch this execution from start to finish.**
-
-- **You are watching it run**: approval and correction happen in the moment, so reviewing afterward adds nothing.
-- **`git` already rolls it back cleanly**: if the diff is small and `git checkout` always leaves a clean tree, staging and selective merging do not save much.
-- **The real side effects are external**: remote APIs, database writes, and sent messages are beyond staging's reach; rollback needs something else.
-- **You need adversarial isolation**: for untrusted multi-tenancy you want a VM-grade isolation substrate, and pVisor is only one choice of executor.
-
-When you want **unattended execution followed by review**, use pVisor to stage file changes, inspect execution records, and select the paths to apply.
-
-For trade-offs against other tools see [comparisons](comparisons.md).
diff --git a/docs/src/zh/benchmarks/agent-tasks.md b/docs/src/zh/benchmarks/agent-tasks.md
index d5f0b01b..86d98da4 100644
--- a/docs/src/zh/benchmarks/agent-tasks.md
+++ b/docs/src/zh/benchmarks/agent-tasks.md
@@ -1,41 +1,28 @@
-# 端到端 Agent 任务:什么时候选择 pVisor?
+# 一次真实 Agent 任务要多久?
-## 主要结论 {#conclusions}
+## Motivation {#motivation}
-**需要频繁创建任务视图、保留少量改动并审查合入时,评估 pVisor staged:固定修复任务为 0.64 s,Docker 为 0.81 s;但七项工具任务 staged 为 1.09 s,Docker 为 0.82 s。pVisor VM 的修复为 3.25 s,长于 Firecracker 的 2.20 s 和 QEMU microvm 的 1.40 s,独立 guest 边界需要额外预算。**
+执行方式要按完整任务判断:环境准备、模型与工具交互、验证、审查合入和清理。频繁创建任务视图、保留少量改动并审查合入时,评估 staged;小工作区或已有容器、原生沙箱时,保留现有流程;选 VM 前先验证 CLI 兼容性和完整工具成本。云端按仓库同步、部署和运维需求比较,同条件性能与账单未测。
-| 需求 | 选型含义 |
-| --- | --- |
-| 大工作区、稀疏改动、每次新建任务视图 | staged 有完整机器流程优势;同时预算工具开销 |
-| 小工作区、现成容器或原生 Agent 沙箱 | 保留已有 Git/工具流程,不为单项速度全面替换 |
-| 独立 guest 内核 | 选择 VM 前验证 CLI 兼容性和完整工具成本 |
-| 远端 API 与托管弹性 | 按仓库同步、部署和运维需求评估云端;同条件性能与账单未测 |
+固定修复任务 staged 为 0.64 s,Docker 为 0.81 s;七项工具任务 staged 为 1.09 s,Docker 为 0.82 s。pVisor VM 的修复为 3.25 s,长于 Firecracker 的 2.20 s 和 QEMU microvm 的 1.40 s,独立 guest 边界要单独预算。
-本页数值和结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
+这些数值与结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
-## Motivation {#motivation}
-
-一次任务包括环境准备、模型与工具交互、测试验证、审查合入和清理。只看启动会漏掉工具与结果处理;只看工具速度,又会漏掉反复创建工作区的成本。固定工具计划排除推理和公网波动,独立的完整审查流程衡量同样改动如何进入原工作区。
-
## 实验设计 {#interpretation}
-Linux x86_64,AMD Ryzen 7 9700X,Fedora 7.2.8-200.fc44.x86_64。执行进程树与专用 Docker daemon 固定到 CPU 0,1;VM 为 2 vCPU,shell 探针配置 128 MiB,工具任务配置 16 GiB。原生/Docker 未限制内存,因此是 CPU 控制的任务对照,不能推导相同内存预算下的容量。host/staged 使用 rootless_process。
+测量固定工具计划下从启动到退出所需的时间,作为完整任务耗时。它是一次 Agent 任务付出的时间;耗时越短,同样通过校验的结果交付得越早。
-同一套离线工具与固定输入,每次新建工作区;热缓存、3 次预热、固定计划每格 60 次正式采样;环境检查与真实 CLI 每格 30 次,固定种子随机交替执行。环境准备、构建、镜像导入和输入重置不计时;启动和退出计入完整任务。Docker Engine 29.7.2 使用专用 rootless **overlay2** daemon、经典镜像存储和可写 bind mount;Firecracker 1.13.1 PCI 不使用 jailer,QEMU 10.2.2 分别使用 q35/microvm 与私有 ext4。pVisor VM 使用 virtio-fs 和自己的固件。内核、存储和暂存语义不同,结果是这些配置下的任务成本,不是纯 VMM 或安全排名。
+各后端共用离线工具与固定输入,每次试验新建工作区,运行在 Linux x86_64 / Ryzen 7 9700X / Fedora 7.2.8 上,固定 CPU 0–1。VM 为 2 vCPU,shell 探针 128 MiB、工具任务 16 GiB;原生与 Docker 不设内存上限,因此比较的是受 CPU 控制的任务耗时,不是容量。热缓存,固定计划每格 3 次预热、60 个样本(环境检查和真实 CLI 为 30 个),固定种子随机交替。
-固定计划检查和搜索仓库、修复 Python、执行 Python/Rust/Node 测试、安装 32 个离线 npm 包并生成 diff。Result 截止到校验后的结果返回,Completion 包括退出;测试和预期改动必须通过。该工具计划没有测量真实模型推理,也不能证明真实 Agent CLI 的兼容性。
-
-这些样本未验证 Node/npm 编译缓存跨后端一致。新工作区不等于空工具缓存;完整任务的差值包含各配置下的缓存行为,不能全部归因于 stage 或 VMM。
-
-场景分析还引用[文件系统](filesystem.md)、[完整审查流程](supervision-cost.md)、[启动](startup.md)、[惰性镜像](lazy-image-startup.md)和[隔离有效性](isolation-tests.md)的独立注册实验。审查流程每格 30 次,计时含视图创建、20 次修改、审查、合入 10 个文件与清理;Git/reflink 不提供同一隔离。各实验分别统计,不能相加中位数估算一次真实 Agent 任务,也不沿用它们的资源配置做统一排名。
+固定计划检查并搜索仓库、运行 Python/Rust/Node 测试、安装 32 个离线 npm 包并生成 diff。Result 截止到校验后的返回结果,Completion 包含退出。Docker 使用私有 rootless overlay2 daemon,Firecracker PCI 不使用 jailer,QEMU 使用 q35/microvm,pVisor VM 使用 virtio-fs:内核、存储和暂存语义不同,这些是任务成本,不是 VMM 或安全排名。计划不测模型推理,也不建立真实 CLI 兼容性;新工作区不等于相同的工具缓存。
## 实验数据和分析 {#results}
-测于 2026-10-06,固定计划每个后端 60/60 有效,正式失败 0;环境与 CLI 的样本数和预检失败另列。输出、退出和执行器记录必须通过校验;暂存模式还验证宿主原文件不变和完整改动保留。保留所有有效慢样本,没有按耗时剔除。表格通常为 P50;分离分布展示各簇中位数和数量,P95 仅作观察参考。原始报告、二进制、输入与源码摘要保存在忽略的 `.data/`,本地完整 CSV/JSON 保留负载、批次和来源关联。
+测于 2026-10-06,固定计划每个后端 60/60 有效,正式失败 0;环境与 CLI 的样本数和预检失败另列。输出、退出和执行器记录必须通过校验;暂存模式还验证宿主原文件不变和完整改动保留。保留所有有效慢样本,没有按耗时剔除。表格通常为 P50;分离分布展示各簇中位数和数量。原始报告、二进制、输入与源码摘要保存在忽略的 `.data/`,本地完整 CSV/JSON 保留负载、批次和来源关联。
### 固定修复与测试 {#reference-env}
@@ -91,7 +78,6 @@ staged 相对 Docker 的完整任务中位数差为 −175.84 ms,95% 配对 bo
| QEMU q35 | 0.88 | 2.07 | 6.93 |
| QEMU microvm | 0.80 | 2.05 | 6.86 |
-
Claude Code 在 pVisor VM 的预检中超过 90 s 初始化期限:有效样本为 0,此条件不参加耗时比较。其他 Claude 条件与所有 Codex 条件完成了受控工具闭环。
staged 相对 Docker 的完成时间中位数差:Claude Code 为 −127.83 ms,95% 配对 bootstrap 区间 [−137.91, −116.72] ms;Codex 为 −3864.45 ms,区间 [−3948.16, −3804.45] ms。这些差异包含客户端初始化、工具调用和退出等待,不能归因为单一文件系统成本。
@@ -104,4 +90,4 @@ Claude 使用 `--bare`、只允许 Bash;Codex 使用 `--ephemeral` 和 `danger
完整 CSV/JSON 和原始记录保存在对应本地批次或文档数据归档。
-[比较方法](methodology.md) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[比较方法](index.md#interpretation) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/zh/benchmarks/cluster-scalability.md b/docs/src/zh/benchmarks/cluster-scalability.md
deleted file mode 100644
index c97e7bac..00000000
--- a/docs/src/zh/benchmarks/cluster-scalability.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# 原 Cluster 测量退役后,哪些结论仍有效?
-
-## 主要结论 {#conclusions}
-
-**旧吞吐与历史成本测量只对冻结的、已退役的 Controller/Worker 实现有效,不能证明当前 daemon 的吞吐、密度或恢复成本。独立本机容量与 VM 内存 benchmark 仍保留各自的证据范围;这里没有新增测量。**
-
-| 需求 | 选型含义 |
-|---|---|
-| 解读旧 Cluster 结果 | 仅限下列历史负载、制品与预算 |
-| 规划本机执行或停驻状态 | 使用[容量](density.md)和[VM 内存](vm-memory/index.md),不使用 Worker 曲线 |
-| 规划 daemon 或比较调度系统 | 未测;不能沿用旧吞吐或历史成本数字 |
-
-
-
-本页数值和结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
-
-
-
-## Motivation {#motivation}
-
-容量决策需要与实际部署实现相匹配的证据。Controller/Worker 退役后,实验对象已不再存在,把旧测量改名会掩盖这一边界。就绪、有效任务完成和可恢复停驻状态回答不同问题。
-
-## 实验设计 {#interpretation}
-
-仅描述历史实验:Linux/x86_64、单宿主 KVM、从冻结 Controller/Worker 源码构建的 release 二进制。入口脚本、专属测试、绘图和发布 helper 已退役,没有活动复现命令。每批使用新的 Controller 和 1/2/4 个单槽 Worker;整组共同使用两核配额、CPU 0/1、2 GiB 内存和零 swap。Controller 单独限制为 0.25 核/256 MiB,每个 Worker 为 0.5 核/512 MiB;服务及其子进程都在共同父 cgroup 中。因此一个 Worker 不会单独使用整个两核预算。
-
-每批提交相同的 12 个任务,每个任务创建 64 文件 Git 仓库,完整校验 32 MiB 数据八次,修改四个文件并核对 Git 状态和全部内容。任务返回必须属于预期 Worker、状态成功且输出匹配;保留的每个完成记录与汇总再次核对。耗时从提交开始,到 12 个结果全部经过校验;不包含此前启动 Controller/Worker 的时间。
-
-每档三次预热、30 个正式批次;各轮随机交替 Worker 数,保留所有慢样本。OOM、缺失结果、错误输出或资源配置不符的批次不能进入吞吐统计。共同工具/rootfs 已准备并处于热缓存,部分共享缓存可能在父 cgroup 计费。它不包含模型推理、多主机网络或跨主机对账,也不代表真实 Agent 的任务速率。
-
-## 实验数据和分析 {#results}
-
-### 完整任务吞吐和物理内存 {#execution}
-
-历史 Controller/Worker 批次,测量日期 2026-10-06(本地时间)。以下表格对应退役制品,不是 daemon 测量。每档 N=30 个完整批次、每批 12 个任务;三个条件共校验完成 1,080 个正式任务,零失败、零 OOM。P50 为中位数;峰值内存是整个父 cgroup(含子 cgroup)的 `memory.peak`,单位 MiB。
-
-| Worker 数 | 完成任务 / 尝试 | 12 任务耗时 P50,s | 有效任务速率 P50,个/s | 整组峰值内存 P50,MiB |
-|---:|---:|---:|---:|---:|
-| 1 | 360/360 | 28.28 | 0.424 | 221.3 |
-| 2 | 360/360 | 12.47 | 0.962 | 389.0 |
-| 4 | 360/360 | 6.93 | 1.731 | 710.6 |
-
-单 Worker 上限为 0.5 核,增加执行槽会增加可用的执行资源,直到共同两核上限约束整组。结果解释了退役实现在这个预算内减少等待的原因;它没有证明调度器在相同有效 CPU 使用量下变得更快。
-
-| 对照(候选 − 单 Worker) | 12 任务中位耗时差,s | 配对 bootstrap 95% 区间,s |
-|---|---:|---:|
-| 两个 Worker | −15.81 | [−15.93, −15.03] |
-| 四个 Worker | −21.35 | [−21.36, −20.97] |
-
-区间来自同轮 30 对样本、5,000 次重采样;均不包含零。P95 仅在本地完整统计中作参考,没有 P99 或生产尾延迟保证。
-
-### 长期保留历史记录 {#controller}
-
-每个规模使用三个新的独立进程/cgroup,固定两核、16 GiB、零 swap;WAL 位于 NVMe。每进程只有一个 ready 探针任务,其余记录已取消;探针用合成失败终态验证 fencing 和回放,不执行工具。物理峰值包含创建历史、记录校验的临时分配、WAL 页缓存与热重启,不是稳定保留态占用。查询在每个进程内测 30 个批次,但重启和内存各只有三个独立观察值,不能合并成 90 个样本。
-
-N=3 个独立进程/规模,表内为 P50;括号是观察到的最小–最大值,不是置信区间。
-
-| 保留记录 | 整组生命周期峰值,MiB | 热日志恢复,s | WAL,MiB |
-|---:|---:|---:|---:|
-| 1,000 | 24.9 (22.8–31.4) | 0.017 (0.017–0.018) | 1.96 |
-| 10,000 | 96.3 (96.2–96.7) | 0.143 (0.143–0.145) | 19.62 |
-| 100,000 | 827.9 (827.9–828.0) | 1.422 (1.410–1.435) | 196.21 |
-| 1,000,000 | 8142.4 (8127.4–8144.1) | 14.622 (14.411–14.710) | 1962.11 |
-
-退役 Controller 的百万记录批次观察到约 8 GiB 生命周期峰值、约 14.62 秒热日志恢复;两者都不是当前容量建议。恢复不包括 Worker 对账或冷磁盘读取。类型化内存查询的各规模的进程中位数汇总约 107–110 ns,仅代表合成状态计数调用,不是 HTTP/CLI 请求延迟;详情保存在本地完整统计中。
-
-### 与已有调度方案的比较边界 {#limits}
-
-Kubernetes、Ray 和云端沙箱的相同负载、共同预算对照未测,不提供数值排名。历史测量不能规划当前 daemon 的容量,也不能作为替换通用调度平台的依据。单任务的 Docker、Firecracker、QEMU 对照见[端到端任务](agent-tasks.md)。
-
-### 来源与复现 {#run}
-
-原五份 CSV 已在本地文档数据归档中按原字节保留,仅作为退役 Controller/Worker 制品的历史证据。没有活动 Cluster 测量或发布入口;[运行手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)记录退役范围,不提供新复现命令。
-
-[比较方法](methodology.md) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
-
-整理表关联同一原始报告及逐任务证据审计摘要。完整 CSV/JSON、原始报告、完成记录、服务日志、控制配置、源码与二进制保存在本地 `.data/` 或文档数据归档。实现分析见[Cluster 技术分析](../design/cluster-performance-analysis.md)。
diff --git a/docs/src/zh/benchmarks/compare-rl-infra.md b/docs/src/zh/benchmarks/compare-rl-infra.md
index 35df9ba1..c42bca68 100644
--- a/docs/src/zh/benchmarks/compare-rl-infra.md
+++ b/docs/src/zh/benchmarks/compare-rl-infra.md
@@ -1,28 +1,21 @@
-# pVisor 能降低强化学习 rollout 的哪些成本?
+# pVisor 能降低 rollout 的哪些成本?
-## 主要结论 {#conclusions}
+## Motivation {#motivation}
-**对于本机工具密集型尝试,stage 的实测修复成本更低、通过验证的活跃容量高于 pVisor VM;需要独立 guest 内核时选择 VM。前缀准备和镜像按需读取分别覆盖其他 rollout 成本,尚无训练吞吐、成功率或 reward 提升的证据。**
+判断 rollout executor,要看整次尝试:创建环境、模型与工具交替、验证、赋 reward 和重试。本机工具密集型尝试中,stage 的实测修复成本更低、已测活跃容量更高,代价是宿主进程边界;需要独立 guest 内核时选 VM。任务、模型和训练层保持现有实现,专用集成按未验证看待。
-| 场景 | 选型含义 |
-|---|---|
-| 大量短仓库任务 | 评估 stage 的改动保留与活跃容量;其边界是宿主进程 |
-| 每次尝试需要独立 guest 内核 | 即使启动等待短,也要预算 VM 工具成本与较低的实测容量 |
-| 历史上下文或未缓存镜像 | 在已测范围内评估前缀准备或按需读取 |
-| 已有 RL 栈 | 保留任务、模型和训练层;专用集成仍未验证 |
+在两核、2 GiB 共同预算下,stage 在 32 路完成 160/160 个任务,VM 在 32 路完成 138/160、在 16 路完成 80/80。固定修复任务 stage 为 0.64 s,VM 为 3.25 s。前缀准备每种格式 6.07–6.59 ms;冷启动的 lazy shell 读取 2.58 MB 内容,完整 OCI 镜像为 41.84 MB。这些都没有训练吞吐、成功率或 reward 的实测提升。
-本页数值和结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
+这些数值与结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
-## Motivation {#motivation}
-
-一次 rollout 创建环境,交替进行模型推理与工具调用,执行验证、赋予 reward,再保留或拒绝样本。失败尝试可能需要准备上下文、恢复环境并重新执行。选择 executor 时,需要分别预算这些阶段,并保留任务要求的执行边界。
-
## 实验设计 {#interpretation}
+测量活跃任务容量、工具与修复成本、前缀准备成本,作为一次 rollout 尝试的三个阶段。容量决定同时能跑多少尝试,成本决定每次尝试消耗多少;容量越高、成本越低,同样的基础设施承载的尝试越多。
+
场景分析复用已登记的本机 Linux/x86_64 实验,不新增测量。所属主题定义制品、校验与控制条件:
- [活跃容量](density.md):共享 2 CPU / 2 GiB / 零 swap,每格五个新批次;Python/Git 任务触碰 32 MiB 私有数据,到共同 barrier 后释放;失败保留在容量分母中。
@@ -66,4 +59,4 @@ Lazy 冷客户端 Ready 排除镜像服务首次准备;镜像已缓存时,Do
各主题的完整 CSV/JSON、制品摘要、控制条件与原始记录保存在对应本地批次或文档数据归档,保留来源与统计口径。
-[比较方法](methodology.md) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[比较方法](index.md#interpretation) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/zh/benchmarks/density.md b/docs/src/zh/benchmarks/density.md
index ee8a0ff1..3a5481fe 100644
--- a/docs/src/zh/benchmarks/density.md
+++ b/docs/src/zh/benchmarks/density.md
@@ -1,32 +1,26 @@
# 两核、2 GiB 预算能同时完成多少个工具任务?
-## 主要结论 {#conclusions}
+## Motivation {#motivation}
-**在两核、2 GiB、禁用 swap 的共同预算下,stage 与 Podman 都在 32 路 Python/Git 任务中通过全部五轮;pVisor VM 在 16 路通过全部五轮,32 路只有三轮全部通过。stage 的空闲探针达到 128 路,Podman 达到 64 路;空闲容量不能代替活跃任务容量。**
+多个 Agent 同时执行时,要看完成了多少任务,而不是创建了多少环境。stage 与 Podman 在本负载下容量相同,按隔离和审查需求二选一;每个任务都要 VM 边界时需要更多预算,空闲容量不能推算活跃容量。
-| 需求 | 选型含义 |
-|---|---|
-| 并行修改代码并检查 Git 结果 | stage 与 Podman 的本负载容量相同;按隔离和审查需求选择 |
-| 大量空闲环境 | stage 达到更高的已测并发度;它使用宿主进程边界 |
-| 每个任务需要 VM 边界 | 为 VM 留出更多预算;不要按空闲数规划活跃任务 |
+在两核、2 GiB、禁用 swap 的共同预算下,stage 与 Podman 都在 32 路 Python/Git 任务中通过全部五轮;pVisor VM 在 16 路通过全部五轮,32 路只有三轮。空闲探针 stage 达到 128 路,Podman 达到 64 路。
-本页数值和结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
+这些数值与结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
-## Motivation {#motivation}
-
-多个 Agent 同时执行时,成功完成多少任务比创建多少环境更有用。容量规划还要计入运行时、辅助进程、页缓存和 VM backing,不能用单个进程 RSS 或配置内存推算。
-
## 实验设计 {#interpretation}
+统计在一个固定 cgroup 预算内通过全部校验的任务数,作为有效完成任务量。它衡量系统真正完成的工作;同一预算下完成得越多,有效容量越高。
+
Linux/x86_64 上比较原生进程、pVisor stage、pVisor VM 和 Podman 5.8.7。每批使用独立 cgroup:共同两核配额、CPU 0/1 亲和性、2 GiB 内存上限、零 swap;协调器、payload 和辅助进程包含在预算内,Podman payload/conmon 的归属经过检查。VM 每个配置 2 vCPU/256 MiB,仍受共同总预算限制。
并发扫描 1、2、4、8、16、32、64、128,每格五个新批次,无预热;每轮随机交替条件。所有任务先到 stdin readiness barrier,再共同释放。空闲组使用同一 Python 环境但不分配数据或改文件;工具组每任务触碰并校验全部 32 MiB 私有数据,在 64 文件 Git 仓库修改四个文件,执行 `git status` 并校验全部文件。stage/VM 的原工作区保持不变,结果与独立 Run 记录匹配。
-主指标为整个 cgroup 的物理内存计费,包括已计费页缓存、内核内存和私有 backing。预先准备的共享工具/镜像缓存可能在父 cgroup 计费,因此这不是整机净内存排名。每批都记录失败、未知结果和 OOM;只有全部任务校验通过且没有 OOM 的批次进入内存/耗时摘要,保留所有慢样本。五轮不能建立长期可靠性或尾延迟保证。负载不包含模型推理、大型编译或真实 Agent CLI。
+内存按整个 cgroup 的物理计费统计,包括已计费页缓存、内核内存和私有 backing。预先准备的共享工具/镜像缓存可能在父 cgroup 计费,因此这不是整机净内存排名。每批都记录失败、未知结果和 OOM;只有全部任务校验通过且没有 OOM 的批次进入内存/耗时摘要,保留所有慢样本。五轮只覆盖该负载:不建立长期可靠性与尾延迟保证,也不包含模型推理、大型编译或真实 Agent CLI。
## 实验数据和分析 {#results}
@@ -78,6 +72,6 @@ stage 在空闲 128 路通过五轮,但相同环境加入私有数据和 Git
### 来源与复现 {#run}
-[比较方法](methodology.md) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[比较方法](index.md#interpretation) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
完整 CSV/JSON 保留每个条件的尝试数、完整批次数、失败原因、未知数、OOM、观察范围和来源摘要,与原始记录一起保存在对应本地批次或文档数据归档;没有将失败批次移出容量统计。
diff --git a/docs/src/zh/benchmarks/filesystem.md b/docs/src/zh/benchmarks/filesystem.md
index 9f1a760d..c6532d00 100644
--- a/docs/src/zh/benchmarks/filesystem.md
+++ b/docs/src/zh/benchmarks/filesystem.md
@@ -1,39 +1,26 @@
-# 选择执行模式后,文件系统任务要等多久?
+# 文件密集任务要等多久?
-## 主要结论 {#conclusions}
+## Motivation {#motivation}
-**pVisor host 在已测的巡检和编译任务中接近直接运行;需要 VM 隔离时,写回能缩短批量产物写入的等待。**
+Agent 会反复检查仓库、搜索、增量构建和发布产物,这些任务以文件读写为主。在 host、staged、容器和 VM 之间选择,是在隔离需求与等待之间取舍,需要完整任务耗时而不是只看启动。
-- **写回的收益取决于任务形态。** 含批量产物写入的解包发布明显缩短;以读取和元数据为主的仓库巡检在两种 VM 配置下耗时接近,未观察到明显收益。
-- **同步写入是主要额外成本。** 逐写即同步时写回反而更慢,宜用默认 VM 配置;允许缓冲合并的密集小写,写回明显更短。
-- **大工作集写入存在完成性短板。** 640 MiB 工作集的持续写入,本批两种 pVisor VM 配置均超时;其他规模需另测。
-
-结果来自三个独立环境的本机浅测;适用条件见[实验设计](#interpretation),逐项数字见[实验数据和分析](#results)。
-
-## Motivation:选择执行模式前要回答什么 {#motivation}
-
-Agent 的仓库巡检、搜索、增量编译和产物发布会反复读写文件。为这些任务选择执行模式——host、staged、容器或 VM——本质是在隔离需求和等待之间做权衡。选型前需要回答三个问题:启动要等多久,任务从执行到产物落盘要等多久,以及工作集变大或并发增加后任务能否顺利完成。
+在所测任务上,pVisor host 接近直接执行;需要 VM 隔离时,guest writeback 缩短批量产物写入。writeback 只在写入能在同步前合并时有效:解包与发布明显变短,读和元数据密集的仓库检查没有收益,每 4 KiB 同步一次时反而比默认 VM 更慢。640 MiB 工作集下,两种 VM 配置在该批次都超时。
## 实验设计 {#interpretation}
-### 比较什么 {#comparison-design}
+测量完成一个完整任务——仓库检查、增量构建或产物发布——所需的时间,作为完整任务耗时。它是文件密集任务在该模式下付出的时间;耗时越短,同一预算内完成的任务越多。
-在同一台机器上,对比直接运行(Native)、pVisor host、文件改动暂存模式(staged)、默认 pVisor VM、开启虚拟机写回的 pVisor VM,以及 Docker、Firecracker、QEMU q35 和 QEMU microvm。所有配置使用相同输入、程序和工具,分别衡量各自完整存储路径的成本。容器镜像和虚拟机磁盘均提前准备好。
+同机九种配置——原生、pVisor host、staged、默认 VM、启用 guest writeback 的 VM、Docker、Firecracker、QEMU q35、QEMU microvm——使用相同输入、程序和工具。镜像与 VM 磁盘预先准备。
-| 负载 | 测什么 | 回答什么问题 |
+| 负载 | 覆盖内容 | 回答的问题 |
| --- | --- | --- |
-| 3 个完整任务 | 仓库巡检与搜索;修改、增量编译并运行;离线解包、生成产物并同步发布 | 缓存与写回的收益能否进入实际工作流 |
-| 12 个基础操作 | 文件查询、目录遍历、重复读取、不同大小的写入、小文件、逐次同步、读写混合、创建与删除 | 哪些访问方式受益,哪些仍有额外等待 |
-| 4 个资源组合 | 128 或 640 MiB 工作集,1 或 4 个并发写入者;每轮固定写入 1 GiB | 工作集变大或并发增加后,任务能否完成、吞吐怎样变化 |
-
-### 怎样测量 {#measurement}
+| 3 个完整任务 | 仓库检查/搜索;编辑、增量编译并运行;离线解包、产物生成与同步发布 | 缓存和 writeback 的收益能否进入真实工作流 |
+| 12 项基本操作 | 文件查询、目录遍历、重复读取、不同大小写入、小文件、逐写同步、混合读写、创建删除 | 哪些访问模式受益,哪些仍有额外等待 |
+| 4 种资源组合 | 128 或 640 MiB 工作集,1 或 4 个并发写入者;每轮固定写 1 GiB | 工作集或并发增长时任务是否仍能完成,吞吐如何变化 |
-- **资源与缓存:** Linux x86_64、Ryzen 7 9700X、Btrfs;实验进程与私有后台服务共用两核、2 GiB 内存预算且禁用 swap,虚拟机配置 2 vCPU、512 MiB 内存。保留宿主页缓存,后续轮次复用环境状态和校验带来的缓存。容器与虚拟机的缓存和内存限制范围不同。
-- **采样:** 每个负载、每种配置使用三个新环境,随机交替执行;每个环境连续运行三轮。三轮合计后,以三个独立环境的中位数和范围报告,不把九轮当成九个独立样本,不合成总分。
-- **计时:** Ready 只计执行器启动到共同测试程序就绪,排除任务、退出和清理。任务完成时间包括实际工作和最后的文件、目录同步;准备、额外完整校验和退出分别记录。
-- **校验与失败:** 校验逐轮输出、最终文件内容、编译产物和工作区隔离。每环境上限 90 秒;某项配置首次失败后,其余计划样本标为未执行,不补零、不挑掉有效慢值,也不设置外部干扰门禁。不足三个有效环境的单元不报中位数。
+每个负载/配置使用三个独立新环境,模式顺序随机,每个环境三轮,运行在 Linux x86_64 / Ryzen 7 9700X / Btrfs 上。被测进程树共享两核与 2 GiB、禁用 swap;VM 为 2 vCPU / 512 MiB。宿主缓存保持温热;中位数取自三个环境,不代表九个独立样本。
-这些是三环境浅测,适用于已准备好环境的本机任务。首次镜像获取、冷磁盘、可靠尾延迟、网络代理和更大规模并发需另测。各方案的内核、文件系统与缓存边界不同,结果衡量完整配置;详细存储路径和开关见[复现配置](#configuration-details)。
+任务耗时包含实际工作和最终同步;Ready 只到测试程序就绪,不含任务、退出和清理。每个环境限时 90 秒,校验输出、最终内容和隔离;某配置首次失败后,剩余计划观察标记为未执行。首次镜像获取、冷磁盘、尾延迟和更大并发需要单独测量。
## 实验数据和分析 {#results}
@@ -252,4 +239,4 @@ Native/host/容器使用父组内存,VM 另受 guest 内存边界限制;不
本地完整统计中的 write_ops/read_ops 是负载显式逻辑操作数,不是 guest→host 请求数,也不包含子工具内部全部 I/O。
-2026-10-17,独立用户配置批次;完整 CSV/JSON、原始记录、冻结入口、工具及固件收据保存在本地 `benchmark.new/filesystem/.data/user-layered-references-v2-20261017/`。[复现步骤](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/filesystem/README.md#user-workloads)。[缓存与异步写工程分析](../design/filesystem-io-performance-analysis.md)独立解释实现开关与请求计数,不用于补齐用户对照。
+2026-10-17,独立用户配置批次;完整 CSV/JSON、原始记录、冻结入口、工具及固件收据保存在本地 `benchmark.new/filesystem/.data/user-layered-references-v2-20261017/`。[复现步骤](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/filesystem/README.md#user-workloads)。[缓存与异步写工程分析](../lab-notes/filesystem-io-performance-analysis.md)独立解释实现开关与请求计数,不用于补齐用户对照。
diff --git a/docs/src/zh/benchmarks/index.md b/docs/src/zh/benchmarks/index.md
index c0bcee37..f48a7b2c 100644
--- a/docs/src/zh/benchmarks/index.md
+++ b/docs/src/zh/benchmarks/index.md
@@ -1,56 +1,69 @@
-# pVisor 适合哪些场景,各自代价是多少?
+# pVisor 适合哪些场景?
-## 主要结论 {#conclusions}
+## Motivation {#motivation}
-**频繁创建大工作区、只合入少量改动时,pVisor stage 的完整机器流程更快:10,000 文件中修改 20 个、保留 10 个,stage 为 141 ms,Git worktree 为 248 ms,btrfs reflink 为 343 ms。小工作区原生流程更快;VM 工具等待参照各配置的独立测量。**
+选执行方式看的是完成同样结果的总成本。大工作区、稀疏改动用 stage;小工作区或只关心工具运行,用原生流程;VM 只在完整任务测量支持时才选。按决策匹配证据:选本地执行方式看任务对照,选独立 guest 内核看启动与工具数据,定容量看成功率和同口径的资源占用。
-| 场景 | 选型含义 |
-|---|---|
-| 大工作区、稀疏改动、用后丢弃 | stage 的完整流程有实测优势 |
-| 小工作区或只关心工具运行 | 比较原生流程与容器成本 |
-| VM 或高并发容量 | 需要完整工具和资源实测 |
+10,000 个文件中修改 20 个、保留 10 个,stage 为 141 ms,Git worktree 为 248 ms,btrfs reflink 为 343 ms;小工作区上原生流程更快。启动、工具执行、合入和资源占用回答不同问题,不能相互替代。
-文件系统采用九配置、19项分层负载,每个单元三个独立新环境、每环境三轮,无干扰门禁。实际执行505个环境,501个通过、4个资源单元超时,另有8个后续样本按协议未执行。历史N5/N30与一次性任务独立保留,其他主题继续使用各自批次。
+文件系统覆盖九配置、19 项分层负载,每个单元三个独立环境、每环境三轮;实际执行、通过、失败与未执行的计数见[文件系统](filesystem.md)。历史 N5/N30 与一次性任务独立保留,其他主题使用各自批次。
-## Motivation {#motivation}
+## 实验设计 {#interpretation}
-选型需要知道完成同样结果的总成本,而不只是启动或单个命令。审查合入、执行边界与资源占用决定哪类 Agent 工作适合 pVisor。
+测量产出一个通过校验结果所需的启动、工具执行、合入和资源占用,作为该结果的成本。这个成本决定哪种执行模式适合一个负载;同样结果下成本越低,该负载运行得越便宜。
-## 实验设计 {#interpretation}
+这些数字来自独立注册的实验。启动与修复每后端 60 个样本、3 次预热;文件系统为九配置、19 项负载,每个单元三个独立环境、每环境三轮;审查流程 30 个样本、3 次预热;网络为 30 个独立批次,小请求取 256 次请求的中位数;容量在共同两核、2 GiB、零 swap 预算下每并发度跑五轮。所有组共用同一宿主与 CPU 0–1,缓存状态按主题设定,随机交替执行。
-复用[启动](startup.md)、[文件系统](filesystem.md)、[修复任务](agent-tasks.md)和[完整审查流程](supervision-cost.md)的独立注册实验。启动与修复每后端 60 次、3 次预热;文件系统当前为九配置、19项负载,每个单元N3新环境、内部三轮、无额外预热,历史N5/N30单独保留;审查流程每规模/条件/后端 30 次、3 次预热。同机CPU 0,1,缓存按各专题设定,随机交替执行;有效计时均通过正确性校验,失败和未执行另列,没有按速度剔除。各主题的负载、资源和计时边界不同,不合并其分布。Docker 使用 rootless overlay2;完整审查流程对照是原生 Git/reflink,不是容器或 VM 安全排名。
+有效计时都通过正确性校验;失败和未执行的样本单独列出,不按速度剔除。批次不合并。P95 仅作观察参考,少于 30 个样本不展示;不展示公开 P99;分离簇按比例和各簇中位数报告。
-[网络](network.md)每条件 30 个独立批次、3 次预热;小请求以每批 256 请求的中位数作为一个样本,origin 在负载 CPU 预算之外,内存没有统一限额。[容量](density.md)在共同两核、2 GiB、零 swap 预算下,按并发度和空闲/有效工具负载分别运行五轮,保留所有失败、未知和 OOM。
+### 隔离与资源口径 {#reference-resources}
-[惰性镜像](lazy-image-startup.md)分别测量同一 host staged 执行器的文件加载,以及 Docker / lazy VM 的 shell、NumPy 应用启动。同一 stage 的四文件校验中,pVisor 文件级路径的冷、热客户端中位等待都短于 OverlayBD;历史 VM 对照支持冷客户端选择 lazy、热客户端选择 Docker。两类实验使用预准备的本机服务,分别记录文件内容、元数据和总响应,保留各自的缓存、执行边界与预算,不合并成统一排名。
+Docker 使用 rootless overlay2,Firecracker 与 QEMU 使用私有 ext4,pVisor VM 使用 virtio-fs 且内核不同:这些是完整配置的成本,不是纯 VMM 或安全排名。工程 A/B 留在实验记录,完整数据留在本地批次。
## 实验数据和分析 {#results}
-2026-10-06 的启动、文件系统和修复共 1,440 个有效样本,完整审查流程 360 个;2026-10-07 的独立 stock 内核启动对照为 240 个有效样本,失败均为 0。2026-10-12 所选冻结源码文件系统对照另有 240 个有效样本、失败 0,使用每任务独立缓存与统一父组资源约束。各批次不合并,中位数差异和 95% 配对 bootstrap 区间见各专题。
-
-分层文件系统对照独立执行505个环境,501个通过、4个资源单元超时,8个后续样本按协议未执行;完整任务与资源边界分别报告。
+2026-10-06 的启动、文件系统和修复共 1,440 个有效样本,完整审查流程 360 个;2026-10-07 的独立 stock 内核启动对照为 240 个有效样本,失败均为 0。2026-10-11 重启后的启动全条件复测为当前批次(数字见[启动](startup.md)),历史配对批次不沿用。2026-10-12 所选冻结源码文件系统对照另有 240 个有效样本、失败 0,使用每任务独立缓存与统一父组资源约束。中位数差异和 95% 配对 bootstrap 区间见各专题。
| 问题 | 实测水位(耗时为 P50) |
|---|---|
-| [Startup](startup.md) | stock 对照:VM 100.91 ms;Firecracker 285.04 ms;QEMU microvm 321.56 ms;q35 702.98 ms |
+| [Startup](startup.md) | 2026-10-11 复测:VM 130.71 ms;Firecracker MMIO 287.13 ms;QEMU microvm 260.10 ms;QEMU 663.25 ms |
| [Repair completion](agent-tasks.md) | staged 0.64 s; Docker 0.81 s; VM 3.25 s; QEMU microvm 1.40 s |
| [分层文件系统任务](filesystem.md#complete-task) | N=3,三轮发布:VM 11.271 s;VM + writeback 5.928 s;Docker 2.053 s;Firecracker 4.305 s;QEMU q35/microvm 4.065/3.851 s |
| [Review workflow](supervision-cost.md) | 10,000 files: stage 141 ms; Git 248 ms; reflink 343 ms |
| [网络](network.md) | 八线程小请求:原生 0.69 ms;host proxy 10.09 ms;VM 2.10 ms |
| [活跃容量](density.md) | 2 GiB:stage/Podman 32 路、VM 16 路通过全部五轮 |
+网络为 510 个有效批次;容量扫描保留全部 320 个批次,包括 57 个失败。两个实验分别统计,不能合并成一种容量或速度排名。daemon 吞吐、密度与历史成本均未测。
+
+内存压缩带来的净物理内存与有效任务密度、裁剪内核收益、完整 Ubuntu 和 macOS 对照尚未在当前制品上验证;没有相应优势结论。云端、gVisor/Kata 和完整 RL 吞吐没有同条件排名。合入、网络、隔离和回放的专题需按各自证据范围判断,不能由这里的短任务推导。
-网络为 510 个有效批次;容量扫描保留全部 320 个批次,包括 57 个失败。两个实验分别统计,不能合并成一种容量或速度排名。退役 Controller/Worker 结果是[历史证据](cluster-scalability.md),不进入当前比较或 daemon 容量规划;daemon 吞吐、密度与历史成本均未测。
+[端到端任务](agent-tasks.md)结合工具等待、工作区生命周期与 CLI 兼容性分析 Agent 沙箱、容器、VM 和云端的取舍。[强化学习训练](compare-rl-infra.md)把工具成本、活跃容量与历史前缀准备映射到 rollout;完整训练吞吐与 reward 未测。
-内存压缩带来的净物理内存与有效任务密度、裁剪内核收益、完整 Ubuntu 和 macOS 对照尚未完成当前制品验证;没有相应优势结论。云端、gVisor/Kata 和完整 RL 吞吐没有同条件排名。合入、网络、隔离和回放的专题需按各自证据范围判断,不能由这里的短任务推导。
+### 已准备环境 {#reference-env}
-[Network](network.md) · [Apply](supervision-cost.md#apply-cost) · [Density](density.md) · [VM memory](vm-memory/index.md) · [Isolation](isolation-tests.md) · [Replay](replay-fidelity.md)
+启动、文件系统与任务对照共用同一套已准备工具环境,每张表都按摘要固定其制品。表格描述的是当轮固定的制品,不代表第三方当前发布版。
-[端到端任务](agent-tasks.md)结合工具等待、工作区生命周期与 CLI 兼容性分析 Agent 沙箱、容器、VM 和云端的取舍。[强化学习训练](compare-rl-infra.md)把工具成本、活跃容量与历史前缀准备映射到 rollout;完整训练吞吐与 reward 未测。
+### 完整发行版 {#full-ubuntu}
+
+Ubuntu 使用发行版内核、initrd、systemd 和私有磁盘;pVisor 复用已准备工具目录。该对照回答部署等待,不隔离纯 VMM 成本。
+
+### QEMU 完整发行版 {#full-ubuntu-qemu}
+
+q35 和 microvm 使用同一 Ubuntu 模板;样本和百分位数与其他批次分开。
+
+### 任务与资源 {#product-v1}
+
+合入、网络、隔离与回放使用各自的任务集和批次,都不继承上表的数字。
+
+### 工程实验与数据保留 {#evidence-format}
+
+工程 A/B、带计数器的 profile 和诊断探针保存在[技术分析](../lab-notes/filesystem-performance-analysis.md),不作为跨产品主表。
+
+Markdown 保留面向用户的表格,仅为必要的用户统计提供共享 CSV 下载;正文已有的静态表、逐轮逐环境记录以及历史和工程中间表不默认另行导出。完整 CSV/JSON、原始报告、逐次样本、日志、制品清单和冻结 harness 保存在对应本地批次或 `benchmark.new/.data/docs-assets-prune-20261018/` 文档数据归档,不发布到站点。动态 JSON 只保留构建所需的展示表,公开工程图使用 SVG。复现与来源保留规则见[运行手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)。
### 新框架的复测覆盖 {#measurement-coverage}
@@ -58,7 +71,7 @@
{{ table("measurement-coverage.render.json", {"markdown":true}) }}
-文件系统覆盖对应九配置、19项负载的N3协议,四个资源单元不完整;历史N5/N30不填补新协议的缺失。
+文件系统覆盖对应九配置、19项负载的N3协议,四个资源单元不完整;历史 N5/N30 数据不填补新协议的缺失。
### 来源与复现 {#run}
@@ -66,4 +79,4 @@
其他主题的完整 CSV/JSON 和原始记录保存在对应本地批次或文档数据归档。
-[Method](methodology.md) · [Reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[Reproduction manual](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/zh/benchmarks/isolation-tests.md b/docs/src/zh/benchmarks/isolation-tests.md
index 4453c15e..56cd67fe 100644
--- a/docs/src/zh/benchmarks/isolation-tests.md
+++ b/docs/src/zh/benchmarks/isolation-tests.md
@@ -1,27 +1,21 @@
-# 哪些执行模式能阻止工作区外的宿主访问?
+# 各执行器能挡住工作区外的写入吗?
-## 主要结论 {#conclusions}
+## Motivation {#motivation}
-**所测 Linux 配置中,pVisor staged、safe 和 VM 在各自 3/3 次检查中允许视图内操作、阻止所列视图外宿主访问,并把工作区写入保留在 stage。pVisor OCI 和 Podman 也阻止了视图外访问,但授权的可写工作区挂载直接修改宿主文件。host 允许所列宿主访问。**
+选择执行模式时,既要看允许访问什么,也要看写入落在哪里。命令返回成功无法区分暂存写入和宿主修改;隔离边界也决定了哪些性能对照具有相同语义。
-| 需求 | 选型含义 |
-|---|---|
-| 执行后审查、选择合入工作区改动 | 选择经过验证的 staged、safe 或 VM 配置 |
-| 使用 OCI 可写工作区挂载 | 写入直接落到宿主,需另行提供审查和回滚机制 |
-| 允许访问宿主路径 | 所测 host 保持宿主可见,不能视为工作区文件沙箱 |
+所测 Linux 配置中,pVisor staged、safe 和 VM 在各自 3/3 次检查中允许视图内操作、阻止所列视图外宿主访问,并把工作区写入保留在 stage。pVisor OCI 和 Podman 也阻止了视图外访问,但授权的可写工作区挂载直接修改宿主文件。host 允许所列宿主访问。
-本页数值和结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
+这些数值与结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
-## Motivation {#motivation}
-
-选择执行模式时,需要同时知道允许访问什么,以及写入最终落在哪里。只看命令返回成功,会把暂存写入与宿主修改混为一谈。隔离边界也决定了哪些性能对照具有相同语义。
-
## 实验设计 {#interpretation}
+测量每个执行模式在路径已知的 fixture 中的边界——哪些访问放行、哪些拒绝、写入最终落在哪里——作为实际隔离边界。实际隔离边界是模式真正执行的那一层;边界越紧,宿主上可达或可改的路径越少。
+
七种配置各运行三次独立 fixture,每次用固定种子打乱配置顺序,共 21 次。native 与 host 提供宿主可访问的对照;Podman 使用私有 overlay 存储和可写工作区挂载,pVisor OCI 使用 crun 与显式可写挂载;VM 与 OCI 使用同一份预备 Python/Git rootfs。
每次必须成功读取视图内文件、写入并读回工作区文件、使用内部 Unix socketpair。视图外试探包括绝对路径、符号链接、`/proc/self/root`、父目录遍历、绝对路径和符号链接写入、宿主 Unix socket 连接,以及 lower 的绝对路径别名写入。检查实际输出、宿主最终字节、stage 内容和 Bundle 中的执行边界,不能只依据 syscall 返回值。
@@ -54,4 +48,4 @@
完整 CSV/JSON 和原始记录保存在对应本地批次或文档数据归档。
-[比较方法](methodology.md) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[比较方法](index.md#interpretation) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/zh/benchmarks/lazy-image-startup.md b/docs/src/zh/benchmarks/lazy-image-startup.md
index 623b94a8..11424ab2 100644
--- a/docs/src/zh/benchmarks/lazy-image-startup.md
+++ b/docs/src/zh/benchmarks/lazy-image-startup.md
@@ -1,45 +1,20 @@
-# 惰性镜像能缩短多少启动与文件加载等待?
+# 惰性镜像能省多少启动等待?
-## 主要结论 {#conclusions}
+## Motivation {#motivation}
-**pVisor 按需读取镜像文件,减少短任务的环境准备时间。**
+Agent 频繁创建一次性环境,短任务往往只读取镜像中的一小部分,却要等完整拉取完成才能开始。pVisor 按需读取镜像文件:任务可以在下载完成前开始,后续运行复用已缓存的内容。
-- **按需下载。** 任务可以在完整镜像下载前开始执行。Shell 和 NumPy 实验中,冷客户端获取的数据更少。
-- **更快获得结果。** 两种短任务的冷客户端实验均缩短了从启动到得到校验结果的中位等待。
-- **复用已下载的文件。** 热客户端直接使用缓存,实验中没有重复下载文件内容。
-
-以上结果来自镜像服务已准备好的本机实验。缓存命中后,挂载和执行器启动仍有开销;完整镜像已缓存时,应用启动实验中 Docker 容器的启动等待更短。
-
-## Motivation:短任务的环境准备要等多久 {#motivation}
-
-Agent 频繁创建一次性环境,短任务往往只读取镜像中的一小部分文件,却要等完整镜像拉取完成才能开始。采用按需加载前,需要回答两个问题:首次使用时,下载量能减少多少、等待能缩短多少;内容已缓存在本地后,复用的启动开销又是多少。
+冷启动的 shell 客户端 Ready 为 186.1 ms,只读取 2.58 MB 内容,完整 Docker OCI 镜像为 41.84 MB。同一镜像的四文件对照中,pVisor 冷、热客户端的等待都短于 OverlayBD。完整镜像已缓存时,应用启动实验里 Docker 的启动等待仍更短,因为缓存命中后挂载和执行器启动开销依然存在。
## 实验设计 {#interpretation}
-### 比较什么 {#evidence}
-
-两组实验分别测量短任务启动和少量文件读取。启动实验以 Docker 完整拉取为参照;文件读取实验使用相同执行环境,以 [TurboOCI][ref-turbooci] / [OverlayBD][ref-overlaybd] 为参照。
-
-### 文件读取对照 {#stage-file-design}
-
-在同一台 Linux 机器上,用同一程序读取并校验同一个 Ubuntu 26.04 镜像中的四个文件,对比 pVisor 与 OverlayBD。两边使用相同执行环境,只替换镜像加载方式;每次重新挂载镜像并创建工作目录。这组测试代表只访问少量文件的场景,不运行镜像内的程序。
-
-任务固定使用两个 CPU,镜像服务使用另外两个 CPU;两边服务的总内存没有统一限额。
-
-### 短任务启动对照 {#vm-design}
-
-分别运行一个 Ubuntu shell 和一个执行 NumPy 数组计算的 Python 脚本,覆盖轻量命令和需要加载依赖的短任务。每种任务固定同一份镜像、命令和输出校验:Docker 先拉取完整镜像,pVisor 按需读取并在虚拟机中运行。每次创建新容器或虚拟机,两种任务分别统计。
-
-两边任务均使用两个 CPU;Docker 内存上限为 2 GiB,pVisor 虚拟机内存为 2 GiB,镜像服务另用两个 CPU。容器与虚拟机的资源限制范围不同,后台服务也未纳入相同的整机限额;结果反映各自的完整使用路径。
+测量从启动到首条校验输出的时间,以及冷客户端实际取回的字节数,作为冷启动成本。冷启动成本是新环境在产出第一个结果前付出的等待与数据量;两项都越低,任务开始得越早、搬运的数据越少。
-### 怎样测量 {#measurement}
+两个实验都在 Linux 上使用预先准备好的本机镜像服务。文件读取对照从同一个 Ubuntu 26.04 镜像读取并校验四个文件,在同一执行环境中比较 pVisor 与 OverlayBD,只改镜像加载方式。启动对照分别运行 Ubuntu shell 和 NumPy 脚本:Docker 走完整拉取,pVisor 在 VM 中按需读取;每次试验都新建容器或 VM。
-- **缓存与网络:** 镜像服务预先准备,通过本机连接取数,保留宿主页缓存。冷缓存指客户端从空镜像缓存开始,热缓存指复用上次取得的内容;两种情况都重新创建执行环境。
-- **采样:** 每组预热 3 轮,再进行 30 轮配对,随机安排两条路径的执行顺序;每条路径先测冷缓存,再测热缓存。预检与预热不计入结果,所有有效慢样本均保留;文件读取对照出现预定的后台干扰时,整批作废。
-- **计时:** 主要比较启动到输出经过校验的结果所需的时间,记为 Ready,排除退出和清理。补充报告的 Completion 到进程正常退出和输出流关闭,文件读取对照还包含卸载清理。取数、挂载和执行均计时,服务准备和缓存重置不计入;响应字节统计到 Completion。
-- **校验:** 检查文件内容或计算结果、运行记录、实际挂载和资源清理;冷缓存必须取得内容,热缓存不得重复下载内容。执行、校验或清理失败则整批无效,失败不计为零耗时。
+两者都用两核跑任务、另两核跑镜像服务。Docker 限 2 GiB 内存,pVisor 为 2 GiB guest RAM,两者口径不同。冷客户端从空镜像缓存开始,热客户端复用已取回内容。3 轮预热后做 30 轮配对、路径顺序随机;Ready 为主指标,Completion 延伸到正常退出。冷客户端必须发生取回,热客户端不得重复取回;执行、校验或清理失败会使该批次无效。
-结果适用于服务已准备好的本机短任务。首次服务准备、公网、大量并发和大规模文件读写需另测;文件读取结果也不能代替镜像内应用启动。完整环境、缓存清理方法和复现步骤见[数据下载与来源](#run)。
+结果适用于服务已准备好的本机短任务。首次服务准备、公网、大并发和批量文件 I/O 需另测;文件读取结果不能代替镜像内应用启动。
## 实验数据和分析 {#results}
@@ -61,7 +36,7 @@ Shell 和 NumPy 分别测于 2026-10-10 的独立批次,每个条件 n=30,
#### Ubuntu shell 客户端启动等待 {#startup}
-测量日期 2026-10-10,每格 n=30、共 120 正式样本,零正式失败、零按速度剔除。单位 ms;非分离分布报告 P50,分离分布报告各簇中位数与样本比例。P95 仅参考,分簇原因未确定。
+测量日期 2026-10-10,每格 n=30、共 120 正式样本,零正式失败、零按速度剔除。单位 ms;非分离分布报告 P50,分离分布报告各簇中位数与样本比例。分簇原因未确定。
| 路径 / 缓存 | Ready:P50 或簇中位数(占比) | Ready P95 | Completion:P50 或簇中位数(占比) | Completion P95 |
|---|---:|---:|---:|---:|
diff --git a/docs/src/zh/benchmarks/measurement-coverage.render.json b/docs/src/zh/benchmarks/measurement-coverage.render.json
index 9714e6e0..1d92591a 100644
--- a/docs/src/zh/benchmarks/measurement-coverage.render.json
+++ b/docs/src/zh/benchmarks/measurement-coverage.render.json
@@ -3,10 +3,6 @@
"数据状态": "历史数据",
"实测范围": "保留原始指标与来源;暂无匹配的新测量"
},
- "[cluster-scalability](cluster-scalability.md)": {
- "数据状态": "历史数据",
- "实测范围": "保留原始指标与来源;暂无匹配的新测量"
- },
"[compare-rl-infra](compare-rl-infra.md)": {
"数据状态": "历史数据",
"实测范围": "保留原始指标与来源;暂无匹配的新测量"
@@ -31,10 +27,6 @@
"数据状态": "部分复测",
"实测范围": "同一 host staged 执行器的四文件惰性加载;冷/热各 N30,含取数和挂载;VM 应用启动保留独立历史数据"
},
- "[methodology](methodology.md)": {
- "数据状态": "历史数据",
- "实测范围": "保留原始指标与来源;暂无匹配的新测量"
- },
"[network](network.md)": {
"数据状态": "历史数据",
"实测范围": "保留原始指标与来源;暂无匹配的新测量"
@@ -45,7 +37,7 @@
},
"[startup](startup.md)": {
"数据状态": "部分复测",
- "实测范围": "同次启动 Ready / Exit;完整命令另列"
+ "实测范围": "启动到首条校验输出;不报告退出时间"
},
"[supervision-cost](supervision-cost.md)": {
"数据状态": "历史数据",
diff --git a/docs/src/zh/benchmarks/methodology.md b/docs/src/zh/benchmarks/methodology.md
deleted file mode 100644
index 267e6b42..00000000
--- a/docs/src/zh/benchmarks/methodology.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# 哪些 benchmark 数字可以用于选型?
-
-## 主要结论 {#conclusions}
-
-**用同负载、同预算、同计时口径的实测选择执行模式;跨配置数据只用于了解各自性能水位。** 启动、工具执行、合入和资源占用回答不同问题,不能相互替代。
-
-| 决策 | 需要的数据 |
-|---|---|
-| 选本地工具执行方式 | 原生、Docker、pVisor host/staged/VM 的任务对照 |
-| 选独立 guest kernel | Firecracker、QEMU 与 pVisor 的启动和工具数据 |
-| 设置容量或超时 | 成功率、完整任务等待、相同口径的资源占用 |
-
-
-
-本页数值和结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
-
-
-
-## Motivation {#motivation}
-
-启动更快并不保证编译更快,可写挂载与暂存审查也提供不同工作流。选型需要同时知道速度、执行边界和改动最终如何进入原目录。
-
-## 实验设计 {#interpretation}
-
-### 同机对照
-
-B-STARTUP、B-FS-TOOLS、B-AGENT-TASK 使用相同离线工具和固定输入,对照原生、pVisor host/staged/VM、私有 rootless Docker、Firecracker PCI、QEMU q35 和 microvm。镜像、工具与 daemon 预先准备,所有组使用同一两核亲和性,工具 VM 的内存预算相同;每个任务使用新的工作区,按固定种子随机交替执行。完整 Ubuntu、macOS 和不同制品单独成批。
-
-下载、编译 benchmark 制品、镜像导入和输入复制不计入任务等待。计时区分首条有效输出、内部工具与校验、结果返回,以及启动到进程退出。成功样本必须通过输出、执行器和暂存完整性校验;暂存模式还检查宿主原目录未改动。
-
-### JSON 表格与 hyperfine {#json-tables}
-
-表格在 Markdown 渲染前读取已完成的“行名 → 列名 → 标量”JSON;文档构建只读取数据。启动与 replay 的直接命令批次采用 hyperfine 统计值,输入准备和 Python hooks 均在计时外。各条件独立采样,不沿用历史 campaign 的随机配对执行声明。历史分布、正确性计数、容量与物理内存读数保留各自的测量口径。复现方式和其余负载的准备要求见 [JSON benchmark 手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/README.md)。
-
-### 分布与失败
-
-不合并批次,不事后剔除慢样本。失败与校验不通过单列,不能计作零耗时。未执行的容量 guard 不能当成完成任务。P95 只是所测样本的观察参考,少于 30 次不展示,公开统计不展示 P99;小样本不给稳定尾延迟结论。
-
-存在分离簇时分别展示比例和各簇中位数。复测的描述性分簇规则在[运行手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)中给出,不据此推断原因。工程 A/B 的百分比变化需配中位数差异的 95% bootstrap 区间;用户页不展示优化过程。
-
-### 隔离与资源 {#reference-resources}
-
-Docker writable bind mount 直接写宿主;pVisor staged 保留改动到 apply。Firecracker/QEMU 使用私有 ext4,pVisor VM 使用 virtio-fs,内核与设备不同;对照不是纯 VMM 或生产安全排名。独立 stage 的隔离能力以实际记录和[隔离校验](isolation-tests.md)为准。
-
-RSS 是定期采样的进程范围求和,可能重复共享页、漏掉短峰;Docker 必须包含实际容器进程与专属 daemon 并标明范围。整组内存必须包含全部子进程、backing 和已计费缓存,不重复相加重叠 cgroup。配置 RAM、RSS、macOS RAM proxy 和净物理内存不可混算。
-
-## 实验数据和分析 {#results}
-
-### 已准备环境 {#reference-env}
-
-[启动](startup.md) · [文件与工具](filesystem.md) · [修复任务和 CLI](agent-tasks.md)。各表保留独立批次与样本数,使用固定制品,不代表第三方当前最新版。
-
-### 完整发行版 {#full-ubuntu}
-
-Ubuntu 使用发行版内核、initrd、systemd 和私有磁盘;pVisor 复用已准备工具目录。该对照回答部署等待,不隔离纯 VMM 成本。
-
-### QEMU 完整发行版 {#full-ubuntu-qemu}
-
-q35 和 microvm 使用同一 Ubuntu 模板;样本和百分位数与其他批次分开,不合并。
-
-### 任务与资源 {#product-v1}
-
-[合入](supervision-cost.md#apply-cost) · [网络](network.md) · [并发](density.md) · [隔离](isolation-tests.md) · [回放](replay-fidelity.md) · [审查](supervision-cost.md)。未测的业界方案明确标记,不填入厂商宣传数字。
-
-### 文件系统工程实验 {#filesystem-service}
-
-工程 A/B、带计数器的 profile 和诊断探针保存在[技术分析](../design/filesystem-performance-analysis.md),不作为跨产品主表。
-
-### 数据位置与保留 {#evidence-format}
-
-Markdown 保留面向用户的表格,仅为必要的用户统计提供共享 CSV 下载;正文已有的静态表、逐轮逐环境记录以及历史和工程中间表不默认另行导出。完整 CSV/JSON、原始报告、逐次样本、日志、制品清单和冻结 harness 保存在对应本地批次或 `benchmark.new/.data/docs-assets-prune-20261018/` 文档数据归档,不发布到站点。动态 JSON 只保留构建所需的展示表,公开工程图使用 SVG。
-
-复现与来源保留规则见[运行手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)。
-
-### 来源与复现 {#run}
-
-[比较方法](methodology.md) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/zh/benchmarks/network.md b/docs/src/zh/benchmarks/network.md
index 0474b380..d62d1ad1 100644
--- a/docs/src/zh/benchmarks/network.md
+++ b/docs/src/zh/benchmarks/network.md
@@ -1,32 +1,26 @@
-# 网络策略增加多少等待,与普通 OCI 相比如何?
+# 网络控制会增加多少延迟?
-## 主要结论 {#conclusions}
+## Motivation {#motivation}
-**在本地 HTTP、八线程并发小请求中,原生、pVisor 宿主代理和 VM 的请求中位耗时分别约 0.69、10.09、2.10 ms;32 MiB 的 VM 传输约 193.62 ms。宿主代理的小请求成本值得关注;本地网络结果不能换算为公网模型响应时间。**
+Agent 会请求模型、下载依赖、读取流式响应,三种负载对代理开销的敏感度不同。把请求延迟、首字节、完整传输和启动开销分开,才能判断等待来自哪里。高频本地小请求要预算宿主代理延迟;VM 内下载依赖时,传输与启动分别预算。
-| 需求 | 选型含义 |
-|---|---|
-| 高频本地小请求 | 宿主代理的附加等待明显,先核对业务请求频率 |
-| VM 内下载依赖 | 把传输与环境启动分别预算 |
-| 阻止直接 TCP 连接 | host/VM deny-all 的正负对照已测;延迟不是隔离证明 |
+八线程本地 HTTP 小请求:原生 0.69 ms,pVisor 宿主代理 10.09 ms,VM 2.10 ms;32 MiB 的 VM 传输约 193.62 ms。本地测量不能换算为公网模型响应时间;阻止直接 TCP 连接是隔离结果,不是延迟数字。
-本页数值和结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
+这些数值与结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
-## Motivation {#motivation}
-
-Agent 会请求模型、下载依赖和读取流式响应,三种负载对代理成本的敏感度不同。请求延迟、首字节、完整传输和启动开销需要分开,才能判断等待来自哪里。
-
## 实验设计 {#interpretation}
+测量小请求的单次耗时,以及大块传输的首字节与完整传输耗时,作为请求延迟。它是 Agent 每次调用实际支付的时间;延迟越低,同样时间内能完成更多模型轮次或下载。
+
Linux/x86_64,同一宿主上的本地 HTTP 服务,没有公网、TLS 或 DNS。比较原生、pVisor host proxy、VM auto TCP、Podman host network 和 pVisor OCI proxy。所有 payload 使用两个固定 CPU(宿主 0/1、VM 两个 vCPU),但内存没有相同的硬上限,HTTP 服务在 payload 预算之外;这不是资源密度排名。
小请求每批 256 个新 TCP 连接、八线程、每次 1 KiB;先取每批请求中位数,再统计 30 个独立批次,不能把 7,680 个相关请求当作独立样本。bulk 每批传输 32 MiB,服务按 1 KiB 块写出;stream 为十个 13 字节事件,每次间隔 2 ms。首字节是 HTTP 响应体首字节,不是模型 TTFT。传输计时包括建立连接和读取,之后的摘要校验不计入传输,但计入 worker 总时间。
-每个条件三次预热、30 个正式批次,17 个条件按轮随机交替。完整内容长度与 SHA-256、CPU 亲和性、保留的命令输出和 Run 边界均须通过;host/VM deny-all 另测直接 socket 拒绝,并核对 Bundle 的强制边界证据。失败不能进入耗时统计;全部慢样本保留,没有事后剔除。P95 仅作参考,不报告 P99。
+每个条件三次预热、30 个正式批次,17 个条件按轮随机交替。完整内容长度与 SHA-256、CPU 亲和性、保留的命令输出和 Run 边界均须通过;host/VM deny-all 另测直接 socket 拒绝,并核对 Bundle 的强制边界证据。失败不能进入耗时统计;全部慢样本保留,没有事后剔除。
## 实验数据和分析 {#results}
@@ -66,6 +60,6 @@ Podman 使用 host network,提供普通 OCI 对照;pVisor OCI 还经过策
### 来源与复现 {#run}
-[比较方法](methodology.md) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[比较方法](index.md#interpretation) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
完整 CSV/JSON、原始报告、响应计时、命令日志、输入与构建清单,以及逐次输出证据审计保存在对应本地批次或文档数据归档。
diff --git a/docs/src/zh/benchmarks/replay-fidelity.md b/docs/src/zh/benchmarks/replay-fidelity.md
index 4e36ff75..2d33a38c 100644
--- a/docs/src/zh/benchmarks/replay-fidelity.md
+++ b/docs/src/zh/benchmarks/replay-fidelity.md
@@ -1,27 +1,15 @@
-# 历史轨迹能否准确准备为新的执行起点?
-
-## 主要结论 {#conclusions}
-
-**新框架中,七个适配器的固定 task 0 各通过 60/60 次校验,完整 prepare-only CLI 时间的中位数为 5.56–5.74 ms;不执行工具,不修改工作区。下方 20 条轨迹的历史分簇结果属于不同输入集合,保留原口径;真实模型继续执行的一致率仍未测量。**
-
-| 需求 | 选型含义 |
-|---|---|
-| 准备跨 Agent 的历史工具上下文 | 使用经过校验的固定格式适配器 |
-| 恢复实际文件状态 | 单独恢复任务环境;前缀准备不重放文件修改 |
-| 比较原生 resume 或 RL 管线的速度 | 尚无同轨迹计时对照,不能据此排名 |
-
-
-
-本页新增实验与历史数据分开发布;各表适用的计时范围和输入见实验设计与来源,不合并不同批次。
-
-
+# 录下的轨迹能作为新运行的起点吗?
## Motivation {#motivation}
-训练和复现需要在准确的历史边界继续任务。丢失工具观测或混入下一步动作,会改变模型看到的上下文;准备时重新执行工具,还可能产生额外副作用。这决定了历史轨迹能否作为可靠的任务输入。
+训练和复现需要任务从准确的历史边界继续。丢失工具观测或混入下一步动作会改变模型看到的上下文,准备时重新执行工具还可能产生额外副作用。用经过校验的固定格式适配器准备上下文,文件状态单独恢复;不要用这些数字给原生 resume 或 RL 管线排名。
+
+七个适配器的固定 task 0 各通过 60/60 次校验,完整 prepare-only CLI 中位数为 5.56–5.74 ms;不执行工具,也不修改工作区。下方 20 条轨迹的历史分簇属于不同输入集合,保留原口径;真实模型继续执行的一致率仍未测量。
## 实验设计 {#interpretation}
+检查每个适配器是否精确重建录制边界——摘要、参数、观测、不执行工具——作为回放保真度。回放保真度决定一条录制轨迹能否当作真实任务输入;保真度越高,新运行携带的原始上下文越多。
+
每个适配器使用 20 条合成原生格式轨迹,每条有两个工具批次,选择 `after-step=1`、`prepare-only`。重复三次,每次用固定种子打乱适配器与任务顺序,共 420 次。固定格式版本见表,与安装的 Agent CLI 版本分开。
有效样本必须保留源轨迹摘要、完整第一批的命令参数和历史观测,排除第二批动作,报告 `replayed_tool_calls=0`、Agent 未启动,且工作区中预置文件的内容和文件集合不变。独立发布审计复查全部保留的命令、原生前缀和工作区证据。失败单列,不当作零耗时。
@@ -32,7 +20,7 @@
## 实验数据和分析 {#results}
-测量日期:2026-10-06。每个适配器 N=60,全部通过;单位 ms。分离簇分别列比例和中位数,P95 为整个适配器分布的观察参考,不承诺稳定尾延迟。
+测量日期:2026-10-06。每个适配器 N=60,全部通过;单位 ms。分离簇分别列比例和中位数。
| 适配器 | 固定格式版本 | 通过 / 计划(失败) | 较低簇:比例;中位数 ms | 较高簇:比例;中位数 ms | P95 参考 ms |
|---|---|---:|---|---|---:|
@@ -62,4 +50,4 @@ Mini-SWE-Agent 未触发分簇规则,该行列出全体样本的 P50。分簇
完整 CSV/JSON 和原始记录保存在对应本地批次或文档数据归档。
-[比较方法](methodology.md) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+[比较方法](index.md#interpretation) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
diff --git a/docs/src/zh/benchmarks/startup-timing.exit.render.json b/docs/src/zh/benchmarks/startup-timing.exit.render.json
deleted file mode 100644
index 22bb5654..00000000
--- a/docs/src/zh/benchmarks/startup-timing.exit.render.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "Native": {
- "N": 60,
- "Exit 中位数 ms": "0.52",
- "Exit 均值 ms": "0.57",
- "Exit 标准差 ms": "0.21",
- "Exit 最小 ms": "0.50",
- "Exit 最大 ms": "1.72"
- },
- "pVisor host": {
- "N": 60,
- "Exit 中位数 ms": "123.63",
- "Exit 均值 ms": "138.94",
- "Exit 标准差 ms": "27.73",
- "Exit 最小 ms": "112.02",
- "Exit 最大 ms": "215.84"
- },
- "pVisor staged": {
- "N": 60,
- "Exit 中位数 ms": "146.35",
- "Exit 均值 ms": "148.10",
- "Exit 标准差 ms": "17.21",
- "Exit 最小 ms": "133.55",
- "Exit 最大 ms": "275.00"
- },
- "pVisor VM": {
- "N": 60,
- "Exit 中位数 ms": "243.53",
- "Exit 均值 ms": "248.75",
- "Exit 标准差 ms": "17.71",
- "Exit 最小 ms": "218.45",
- "Exit 最大 ms": "288.92"
- },
- "Docker": {
- "N": 60,
- "Exit 中位数 ms": "129.31",
- "Exit 均值 ms": "130.37",
- "Exit 标准差 ms": "7.66",
- "Exit 最小 ms": "114.19",
- "Exit 最大 ms": "152.93"
- },
- "Firecracker": {
- "N": 60,
- "Exit 中位数 ms": "722.06",
- "Exit 均值 ms": "722.77",
- "Exit 标准差 ms": "6.03",
- "Exit 最小 ms": "711.09",
- "Exit 最大 ms": "741.23"
- },
- "QEMU": {
- "N": 60,
- "Exit 中位数 ms": "691.72",
- "Exit 均值 ms": "695.44",
- "Exit 标准差 ms": "28.63",
- "Exit 最小 ms": "656.02",
- "Exit 最大 ms": "766.89"
- },
- "QEMU microvm": {
- "N": 60,
- "Exit 中位数 ms": "281.33",
- "Exit 均值 ms": "282.00",
- "Exit 标准差 ms": "11.50",
- "Exit 最小 ms": "261.02",
- "Exit 最大 ms": "315.55"
- }
-}
diff --git a/docs/src/zh/benchmarks/startup.md b/docs/src/zh/benchmarks/startup.md
index 7a9bce28..d6e67f59 100644
--- a/docs/src/zh/benchmarks/startup.md
+++ b/docs/src/zh/benchmarks/startup.md
@@ -1,161 +1,39 @@
# 启动一个可用环境要等多久?
-## 主要结论 {#conclusions}
-
-**2026-10-11 重启后的独立条件复测中,Ready 中位数为 pVisor host 33.52 ms、staged 50.59 ms、VM 130.71 ms、Docker 105.03 ms、Firecracker MMIO 287.13 ms、QEMU 663.25 ms 和 microvm 260.10 ms。Ready 与正常 Exit 来自同次启动的 60 个样本;当前制品的数字应按这组表格读取,历史随机配对的排名和区间不沿用到新批次。**
-
-以下选型摘要保留历史批次的适用范围。
-
-| 需求 | 选型含义 |
-| --- | --- |
-| 频繁执行短命令 | host 和 staged 的启动等待为十几到几十毫秒 |
-| 频繁创建一次性 VM | pVisor VM 的首条命令等待约 0.1 秒 |
-| 完整 Agent 工具任务 | 结合工具与修复任务结果选择执行模式 |
-
-
-
-本页新增实验与历史数据分开发布;各表适用的计时范围和输入见实验设计与来源,不合并不同批次。
-
-
-
## Motivation {#motivation}
-频繁创建一次性环境时,首条命令的等待会累积。选择 host、staged、容器或 VM,需要知道各模式的启动等待,以及隔离需求带来的成本。短任务还要预算退出和工具执行。
+Agent 应用存在大量突发、短时的调用:一个任务结束就丢弃环境,下一个任务重新创建。每次调用都要重新支付启动等待,成本随调用量累积。启动延迟决定第一条命令多久能开始,也决定开发者愿意多频繁地为单个任务创建隔离环境。
+
+pVisor 在 VM 上的优化把启动压到接近容器:Ready 中位数 130.71 ms,对比 Docker rootless 的 105.03 ms,也低于参考 VM(Firecracker MMIO 287.13 ms、QEMU microvm 260.10 ms、QEMU q35 663.25 ms)。host 与 staged 更快,分别为 33.52 ms 和 50.59 ms。
## 实验设计 {#interpretation}
-历史 Ready / Exit 对照使用 Linux x86_64 / KVM,AMD Ryzen 7 9700X,Fedora 宿主。对照为 native、pVisor host、pVisor staged、pVisor VM、Docker rootless / overlay2、Firecracker PCI、QEMU q35 和 QEMU microvm。进程固定到 CPU 0,1,VM 均为 2 vCPU / 128 MiB;进程和容器不设内存上限。
+测量从启动到首条校验通过的 shell 输出,作为环境 Ready 时间。这段时间是系统响应调用方的能力;Ready 时间越短,整个体系应付突发性大规模请求的能力越强。
-Firecracker、QEMU 和 microvm 使用 Fedora 的完整发行版内核,Linux 7.2.8-200.fc44.x86_64。pVisor 的虚拟化基于 libkrun,使用该项目配套 libkrunfw 的定制内核,Linux 6.12.109。
+对照使用 Linux x86_64 / KVM,AMD Ryzen 7 9700X,Fedora 宿主。对照为 native、pVisor host、pVisor staged、pVisor VM、Docker rootless / overlay2、Firecracker(virtio-MMIO)、QEMU q35 和 QEMU microvm。进程固定到 CPU 0,1,VM 均为 2 vCPU / 128 MiB;进程和容器不设内存上限。
-使用已准备的用户态环境和相同的 `/bin/sh` 输出探针,每次执行使用新环境与私有工作区,VM 每次重新启动,不使用快照或环境池。热页缓存,每组 3 次预热、60 次正式样本,组内随机交替执行。环境准备和输入复制不计入启动时间。内核、设备和存储路径不同,结果反映各配置的完整启动成本;这个探针不代表完整发行版开机、冷镜像、Agent CLI 初始化、并发容量或快照恢复。
+Firecracker、QEMU 和 QEMU microvm 使用 Fedora 的完整发行版内核,Linux 7.2.8-200.fc44.x86_64。pVisor 的虚拟化基于 libkrun,使用该项目配套 libkrunfw 的定制内核,Linux 6.12.109。
-历史 Ready 截止到校验后的首条 shell 标记;Exit 包含执行和收尾,要求正确输出并正常零退出。Firecracker 在校验标记和结果、确认无 panic 后受控终止,只报告 Ready。失败、panic、输出不匹配或制品改变的样本不计入耗时分布;保留有效慢样本。
+使用已准备的用户态环境和相同的 `/bin/sh` 输出探针,每次执行使用新环境与私有工作区,VM 每次重新启动,不使用快照或环境池。热页缓存,每组 3 次预热、60 次正式样本,组内随机交替执行。环境准备和输入复制不计入启动时间。内核、设备和存储路径不同,结果反映各配置的完整启动成本;这个探针不代表完整发行版开机、冷镜像、Agent CLI 初始化、并发容量或快照恢复。
-历史 hyperfine 对照使用当时每个条件的独立 JSON 模板,通过 semspec bench 执行,统一 3 次预热和 60 次采样。它测量完整命令到正常退出,不测首条 Ready;每次输入准备与结果校验在计时外。各条件独立采样,不合并批次或推导配对改善比例。该批次校验 Run Bundle 中的实际执行模式:本机 host 和 staged 使用 `rootless_process`,VM 使用 `vm`;制品摘要与批次来源独立记录。
+Ready 截止到校验后的首条 shell 标记。Firecracker 在校验标记和结果、确认无 panic 后受控终止。失败、panic、输出不匹配或制品改变的样本不计入耗时分布;保留有效慢样本。
## 实验数据和分析 {#results}
-### Python:同次启动的 Ready / Exit {#python-ready-exit}
-
-同一进程启动中记录开始、收到完整 `REFERENCE_READY` 行和正常退出三个时刻,固定
-3 次预热、60 次正式样本;下面两张表只是同一个命令输出的列投影,不重复采样。
-已准备 rootfs、2 vCPU / 128 MiB、热缓存、CPU 0,1 亲和性。Python `perf_counter_ns`
-计时不包含解释器启动和输入准备;Ready 包含进程创建、管道读取和观察者调度,
-Exit 从同一开始时刻计至观察到正常退出。全部样本还须通过输出、Run Bundle 和输入校验。
-新 Firecracker 使用 stock 内核、同一 initrd 和 virtio-MMIO;PCI 配置两次预检在成功 guest 标记后无法正常退出,整批拒绝发布。历史 Firecracker PCI 的 Ready 与新 MMIO 是不同配置,不能相减解释为性能改善。
+### 各配置的 Ready 时间 {#ready}
-#### Ready
+八个条件于 2026-10-11 测量,3 次预热后各 60 个正式样本。输入为已准备 rootfs、VM 的 2 vCPU / 128 MiB、热缓存和 CPU 0,1 亲和性。Python `perf_counter_ns` 在进程创建前开始,收到完整的 `REFERENCE_READY` 行时停止:包含进程创建、管道读取和观察者调度,不包含解释器启动和输入准备。全部样本还须通过输出、Run Bundle 和输入不变的校验。
{{ table("startup-timing.ready.render.json") }}
-#### Exit
-
-{{ table("startup-timing.exit.render.json") }}
-
-[同次样本统计 CSV](../../../overrides/assets/benchmarks/data/startup/startup-timing.csv) 与 [来源 JSON](../assets/benchmarks/startup-timing.provenance.json)
-记录各条件最新成功的独立批次,标准差采用正式样本的样本标准差。这是 Python 事件时钟数据,独立于
-hyperfine 完整命令实验;历史不同制品的数字不与这组样本合并。整表复测使用
-`just benchmark startup/timing`;仅复测 VM 使用 `just benchmark startup/timing "pvisor vm"`。
-此前 VM 单条件批次独立保留在本地,不混入新样本。
-
-2026-10-11 重启后重新测量全部八个条件,重启前后对照的完整 CSV/JSON 保存在本地,
-保留两批各自的完整精度统计与来源摘要。被测 pVisor 二进制 SHA-256 为
-`d3f09687cca60b617629c215fa1359c441ab6ac19f8c63b68f1dcdf7614e6b30`,重启前后相同;
-用户态输入、被测命令、计时和统计函数也相同。框架期间新增失败处理与来源字段,均位于计时外。
-VM Ready 中位数从 179.22 ms 降至 130.71 ms(描述性差值为 -27.07%),Exit 从
-297.79 ms 降至 243.53 ms。Host Ready 中位数从 37.45 ms 降至 33.52 ms,但标准差
-从 1.38 ms 升至 29.70 ms,后 17 个正式样本明显变慢;全部有效慢样本保留。
-两批独立采样,且仍使用热缓存,这组比较不能单独建立重启的因果效果。
-历史约 101 ms 的 VM Ready 使用不同二进制及固件,剩余差距需要固定制品的对照才能定位。
-
-### 历史配对:启动与退出耗时 {#reference-startup}
-
-
-
-
-历史对照单位为 ms,每组 N=60,正式失败均为 0。进程/容器与 VM 分别采样,各行保留自己的统计值;四种 VM 在同组内随机交替执行。P95 仅供分布观察,不是稳定尾延迟保证。
+pVisor VM 的 Ready 中位数为 130.71 ms,位于 Docker rootless 的 105.03 ms 与参考 VM 的 260–663 ms 之间。host 与 staged 跳过内核和设备路径,分别为 33.52 ms 和 50.59 ms。
-| Runtime | Valid / failed | Ready P50 ms | Ready P95 ms | Exit P50 ms | Exit P95 ms |
-| --- | --- | --- | --- | --- | --- |
-| Native | 60 / 0 | 1.28 | 1.71 | 1.35 | 1.82 |
-| pVisor host | 60 / 0 | 12.72 | 14.18 | 24.03 | 24.71 |
-| pVisor staged | 60 / 0 | 25.13 | 26.85 | 33.84 | 44.55 |
-| pVisor VM | 60 / 0 | 100.91 | 151.27 | 141.52 | 176.59 |
-| Docker | 60 / 0 | 74.48 | 87.13 | 98.29 | 110.22 |
-| Firecracker | 60 / 0 | 285.04 | 291.88 | — | — |
-| QEMU | 60 / 0 | 702.98 | 789.36 | 725.55 | 818.85 |
-| microvm | 60 / 0 | 321.56 | 404.39 | 347.99 | 428.27 |
-
-host 和 staged 的等待为十几到几十毫秒,适合频繁启动的短命令。VM 需要额外的内核和设备初始化;选择隔离方式时,应结合完整任务耗时,而不是只看启动。Firecracker 的空白 Exit 表示未测正常关机。
-
-| VM 对照 | pVisor 减少的等待 ms | 差异的 95% 区间 ms | 等待减少 | 对照耗时 / pVisor 耗时 |
-| --- | --- | --- | --- | --- |
-| Firecracker | 184.12 | 181.60–185.84 | 64.6% | 2.82× |
-| QEMU | 602.06 | 582.17–635.99 | 85.6% | 6.97× |
-| microvm | 220.64 | 195.91–251.74 | 68.6% | 3.19× |
-
-差异为两组中位数之差;对匹配轮次做 5,000 次配对 bootstrap 得到 95% 区间。三个区间均不含零,支持这些配置下 pVisor VM 启动更快。专用固件和精简初始化提供较短的启动路径;这个对照不能分别量化内核、文件系统和 VMM 的贡献。
+表格按每个 `condition` 取[统计 CSV](../../../overrides/assets/benchmarks/data/startup/startup-timing.csv)中最新的有效行;`condition` 与 `batch` 共同定位结果。标准差采用正式样本的样本标准差。整表复测使用 `just benchmark startup/timing`;仅复测 VM 使用 `just benchmark startup/timing "pvisor vm"`。
冷镜像的客户端等待与内容下载见独立的[镜像按需启动](lazy-image-startup.md)实验;镜像服务准备成本单列,样本不与这里的预准备环境合并。
-
-
-### 历史 Python:仅 Ready 数据 {#python-ready}
-
-这组实验使用已准备好的 rootfs、2 vCPU / 128 MiB、热缓存和 CPU 0,1 亲和性。
-固定 3 次预热、60 次正式样本;Python `perf_counter_ns` 从 Popen 前计到收到完整的
-`REFERENCE_READY` 行,包含进程创建、管道读取和观察者调度开销。解释器启动、输入准备、
-后续退出和清理不计入 Ready。停表后仍要求正确输出、正常零退出和通过 Run Bundle 校验。
-
-| | N | Ready 中位数 ms | Ready 均值 ms | Ready 标准差 ms | Ready 最小 ms | Ready 最大 ms |
-| --- | --- | --- | --- | --- | --- | --- |
-| pVisor VM | 60 | 132.95 | 132.51 | 5.09 | 123.00 | 147.53 |
-
-该条件的 Ready 完整统计 CSV 与来源 JSON 保存在本地,
-保留最新成功批次;标准差是正式样本的样本标准差。这是 Python 时钟数据,不是 hyperfine
-完整退出耗时。历史 Ready 使用不同二进制制品,不能只根据计时边界解释两者数值差异。
-当前 Ready / Exit 实验使用 `just benchmark startup/timing "pvisor vm"`;本节保留旧的 Ready-only 批次。
-
-### 历史 Hyperfine:直接启动到正常退出 {#hyperfine-startup}
-
-每行取该条件最新成功批次,独立采样,不合并批次。3 次预热、60 次正式样本;中位数、均值和标准差来自同一份 hyperfine 原始导出,单位为 ms。Python 准备和校验、semspec 处理及外部 CPU 亲和性设置均在计时外。
-
-| | N | 中位数 ms | 均值 ms | 标准差 ms |
-| --- | --- | --- | --- | --- |
-| Native | 60 | 0.42 | 0.42 | 0.02 |
-| pVisor host | 60 | 208.79 | 217.94 | 34.13 |
-| pVisor staged | 60 | 153.85 | 154.58 | 5.88 |
-| pVisor VM | 60 | 278.83 | 305.77 | 63.45 |
-| Docker | 60 | 163.92 | 168.87 | 21.38 |
-| Firecracker | — | — | — | — |
-| QEMU | 60 | 722.08 | 711.24 | 26.75 |
-| QEMU microvm | 60 | 339.47 | 355.08 | 86.50 |
-
-空白条件尚无通过校验的新批次。它测量命令到正常退出,不等于首条输出 Ready;各行仅并列展示水平,不提供随机配对改善比例或置信区间。实际命令、极值及逐行来源保存在本地完整 CSV/JSON 中。
-
-
-历史完整命令结果(包含包装器)
-
-| | N | 中位数 ms | 均值 ms | 标准差 ms |
-| --- | --- | --- | --- | --- |
-| Native | 60 | 2.13 | 2.17 | 0.23 |
-| pVisor host | 60 | 165.12 | 315.84 | 259.74 |
-| pVisor staged | — | — | — | — |
-| pVisor VM | — | — | — | — |
-| Docker | 60 | 167.27 | 381.08 | 509.32 |
-| Firecracker | — | — | — | — |
-| QEMU | 60 | 748.41 | 896.73 | 319.03 |
-| QEMU microvm | 60 | 353.76 | 451.13 | 219.93 |
-
-本地历史 CSV 的计时包含外层 shell、taskset 和 timeout,保留原始口径。它与直接命令是不同批次、不同范围,不能通过相减估计包装器成本或解释为产品性能改善。
-
-
-
-
-
### 来源与复现 {#run}
-启动统计、VM 差异与 95% 区间、源码与制品来源的完整 CSV/JSON 和原始记录保存在对应本地批次或文档数据归档。当前 Ready / Exit 复现见[启动实验手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/startup/README.md)。
+统计、源码与制品来源和原始记录保存在对应本地批次或文档数据归档。复现见[启动实验手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/startup/README.md),被测制品见[来源 JSON](../assets/benchmarks/startup-timing.provenance.json)。
-[比较方法](methodology.md) · [历史复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md#explicit-firecracker-kernel-controls)
+[比较方法](index.md#interpretation)
diff --git a/docs/src/zh/benchmarks/supervision-cost.md b/docs/src/zh/benchmarks/supervision-cost.md
index b064a505..56b7342f 100644
--- a/docs/src/zh/benchmarks/supervision-cost.md
+++ b/docs/src/zh/benchmarks/supervision-cost.md
@@ -1,60 +1,30 @@
-# 审查、合入与丢弃要花多少时间?
+# 审查与合入要花多少时间?
-## 主要结论 {#conclusions}
-
-**每次新建任务工作区,在 10,000 个文件中修改 20 个、合入 10 个,pVisor stage 的完整机器流程 P50 为 141 ms,Git worktree 为 248 ms,btrfs reflink 副本为 343 ms。stage 适合大工作区的稀疏改动;小工作区 Git 更省时。另一个独立实验中,预备好的 20 文件视图只做审查、合入和丢弃,stage P50 为 27.71 ms,Git 为 4.69 ms。**
+## Motivation {#motivation}
-单独合入已准备好的改动时,10、1,000、10,000 个小文本文件的 pVisor apply P50 分别为 **17 ms、0.93 s、14.26 s**,均高于 Git patch;100,000 文件出现双峰,两个簇的中位数为 **109.73 s 和 196.87 s**。完整流程只合入 10 个文件,不能用它的 141 ms 估算全量合入 10,000 个文件的成本。
+一次 Agent 任务除了执行工具,还需要独立工作区、查看 diff、保留指定改动和清理剩余结果,只比较单项文件操作会漏掉这些成本。要比较完成同样结果的整个流程,并把机器时间与人的阅读判断分开。
-| 用户场景 | 选型含义 |
-|---|---|
-| 大工作区、少量改动、任务工作区用后丢弃 | stage 减少创建、扫描和清理整棵工作区的成本 |
-| 小工作区或已准备并复用的 Git worktree | 小工作区及 20 文件预备视图的审查流程 Git 较快;长期复用未测 |
-| 估算人工监督成本 | 机器流程不包含人的阅读和判断时间 |
+每次新建任务工作区,在 10,000 个文件中修改 20 个、合入 10 个,pVisor stage 为 141 ms,Git worktree 为 248 ms,btrfs reflink 为 343 ms。单独合入已准备的改动,10、1,000、10,000 个小文件分别需要 17 ms、0.93 s、14.26 s,均高于 Git patch;100,000 文件出现双峰,两个簇的中位数为 109.73 s 和 196.87 s。完整流程只合入 10 个文件,不能用 141 ms 估算全量合入 10,000 个文件的成本。在预备好的 20 文件视图上,审查、合入和丢弃在 stage 为 27.71 ms,Git 为 4.69 ms。
-本页数值和结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
+这些数值与结论仍属于原始历史批次;新框架尚无匹配的复测数据,见[复测覆盖](index.md#measurement-coverage)。
-## Motivation {#motivation}
-
-一次 Agent 任务除了执行工具,还需要独立工作区、查看 diff、保留指定改动和清理剩余结果。只比较单项文件操作,会漏掉这些成本。需要频繁创建任务工作区时,应比较完成同样结果的整个流程。
-
-还需分别估算视图已准备好时的审查成本,以及合入文件数增长后的等待和中断恢复成本。三个独立实验分别回答这些问题,不合并样本。
-
## 实验设计 {#interpretation}
-### 完整任务流程:B-WORKFLOW
-
-对照 pVisor rootless stage、Git detached worktree 和 btrfs reflink 副本。输入是预先提交并打包的相同 Git 仓库,分别含 100 或 10,000 个 4 KiB 文件;每次修改 20 个文件,生成全部内容 diff,只合入前 10 个并丢弃其余改动。Git 和 reflink 流程用 `git diff` 提取选中路径的 patch,先 `git apply --check`,再合入。
-
-计时涵盖任务视图创建、执行修改、内容审查、选择性合入和清理,按各步骤机器耗时求和。stage 的视图创建包含在 run 中。预先准备输入仓库、为所有对照恢复相同起点,以及测试程序核对结果不计时。已准备并长期复用 worktree 的场景未测。
+测量完整流程——创建视图、审查、合入选定路径、丢弃其余——的机器耗时,作为完整流程耗时。它是 Agent 完成后到改动落地之间的开销;耗时越短,单位时间内能审查合入的改动越多。
-Linux/x86_64、AMD Ryzen 7 9700X、Fedora 内核 7.2.8-200.fc44.x86_64、btrfs;整个执行树固定到宿主 CPU 0,1。每个后端、规模和合入条件独立采样 30 次、预热 3 次,固定种子随机交替执行,热缓存。Git 自动维护关闭,reflink 强制启用,不能回退成普通复制。冻结制品与源码摘要保存在本地来源记录中。
+三个对照——pVisor stage、detached Git worktree、btrfs reflink 副本——跑同一批准备好的仓库,规模为 100 或 10,000 个文件。每个任务改 20 个文件、合入前 10 个、丢弃其余。计时覆盖视图创建、修改、内容审查、选择性合入和丢弃;输入准备与重置不计入。每格 30 个样本、3 次预热,固定种子随机交替,热缓存,CPU 固定 0–1。
-普通合入和宿主冲突分别测量。所有样本必须通过完整文件清单和内容校验:执行前后原目录保持原样,普通合入仅改变选中的 10 个文件;冲突条件在合入前修改一个选中宿主文件,要求拒绝整次合入并保留全部宿主内容。stage 还核验 Run Bundle 的暂存和 rootless 隔离证据。失败保留并单列,不作为零耗时;没有按速度剔除样本。两规模 × 两条件 × 三后端共 360 个正式样本,失败 0。
-
-这个固定的文件修改任务不含模型推理、编译或人的阅读时间;Git/reflink 执行是原生进程,不提供相同隔离。冲突测试不覆盖 Git 检查与写入之间的竞态,也不比较崩溃恢复与持久化保证。不能据此给容器、VM 或安全性排名。
-
-### 预备视图审查:B-SUPERVISION
-
-另一个独立实验只测已准备视图的审查成本:20 个小文本文件已经完成相同修改,查看全部原始/修改内容,合入前 10 个并丢弃其余 10 个。stage 计时包含 `status --review --diff`、选择性 `apply` 和 `drop`;Git 包含完整 diff、选中 patch 提取、`git apply --check`、apply 和 worktree 移除。工作区创建、任务执行、fixture 和校验均在计时之外。Git 2.55.0 的可执行文件在采样前记录摘要,stage 的冻结制品来源单列;每组 30 次、3 次预热,CPU 0、1,热缓存,无专用宿主内存上限。全部 60 个正式样本通过内容、选择结果和执行边界检查,最终工作区保留供独立审计;没有速度剔除。预备视图单独统计,不计入完整流程表。
-
-### 合入规模与恢复:B-APPLY
-
-在 AMD Ryzen 7 9700X、Linux 7.2.8-200.fc44 x86_64 上,将被测进程固定到 CPU 0、1;没有另设宿主内存上限。环境采用热缓存,不主动清空页缓存。负载是同一目录中的小文本文件更新,暂存改动和 Git patch 都在计时前生成,工作区准备和计时后的校验另计。
-
-10、1,000、10,000、100,000 文件各测 pVisor apply、Git apply、原生复制、drop 和合入前冲突拒绝。每格预热 3 次、采样 30 次,共 600 个正式计时样本;每轮以固定种子随机交替执行规模和操作。成功样本必须通过完整目标内容和适用的合入账本检查;失败保留并单列,所有有效慢样本保留,不按耗时剔除。
-
-独立正确性检查包括:10,000 文件合入的三个持久化阶段,各做 3 次实际命中的 SIGKILL;以及使用同一二进制的 3 次合入中宿主编辑注入。后者在一个文件已更新、待编辑文件仍为原内容时暂停合入,写入并同步外部改动,再恢复进程。这些检查覆盖有限的注入窗口,不证明任意并发时序。
+每个样本都要通过完整的文件清单和内容校验:原工作区不变,正常合入只改选中的 10 个文件,冲突场景必须拒绝整批并保留宿主内容。失败单独计数,不当作零耗时。另有预备视图实验(20 个文件只做审查、合入、丢弃)和合入规模实验(10 到 100,000 个文件,含 SIGKILL 与宿主并发修改注入)。固定编辑任务不包含推理、编译和人工阅读,也不构成容器、VM 或安全排名。
## 实验数据和分析 {#results}
### 完整任务成本 {#baseline-meaning}
-2026-10-06,同机同批;单位 ms,N=30/格。P95 仅为观察参考。各格没有按预定规则检出分离簇。
+2026-10-06,同机同批;单位 ms,N=30/格。各格没有按预定规则检出分离簇。
| 工作区文件数 | pVisor stage P50 / P95 | Git worktree P50 / P95 | btrfs reflink P50 / P95 |
|---|---:|---:|---:|
@@ -65,7 +35,7 @@ Linux/x86_64、AMD Ryzen 7 9700X、Fedora 内核 7.2.8-200.fc44.x86_64、btrfs
### 预备视图的审查成本 {#prepared-review}
-2026-10-06 的独立同批对照;20 个小文本文件,合入 10 个、丢弃 10 个,N=30/格,失败 0。单位 ms,P95 仅作观察参考,各格未触发分簇规则。
+2026-10-06 的独立同批对照;20 个小文本文件,合入 10 个、丢弃 10 个,N=30/格,失败 0。单位 ms;各格未触发分簇规则。
| 步骤 | pVisor stage P50 / P95 | Git worktree P50 / P95 |
|---|---:|---:|
@@ -103,7 +73,7 @@ stage 的工具执行和合入仍有额外成本,但创建独立视图、按
### 合入与丢弃的规模成本 {#apply-cost}
-2026-10-06 测量。单位:ms;每格为 **P50 / 参考 P95,N=30**,失败均为 0。30 个样本的 P95 仅描述观察结果,不作为稳定尾延迟承诺。
+2026-10-06 测量。单位:ms;每格为 **P50 / 参考 P95,N=30**,失败均为 0。
| 文件数 | pVisor apply | Git apply | 原生复制 | drop | 合入前冲突拒绝 |
|---:|---:|---:|---:|---:|---:|
@@ -163,6 +133,4 @@ stage 的工具执行和合入仍有额外成本,但创建独立视图、按
本地来源记录保留二进制、源码、harness 和原始报告的摘要。性能与并发检查使用同一二进制、分别采样;完整 CSV/JSON、原始命令、报告和审计记录保存在对应本地批次或文档数据归档。
-### 来源与复现 {#run}
-
-[比较方法](methodology.md) · [复现手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)
+复现步骤见[比较方法](index.md#interpretation)与[运行手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)。
diff --git a/docs/src/zh/benchmarks/vm-memory/index.md b/docs/src/zh/benchmarks/vm-memory/index.md
index a3f0a99d..560c6eec 100644
--- a/docs/src/zh/benchmarks/vm-memory/index.md
+++ b/docs/src/zh/benchmarks/vm-memory/index.md
@@ -1,57 +1,36 @@
# 多个 VM 如何节省内存?
-## 主要结论 {#conclusions}
+## Motivation {#motivation}
-Agent 在工具执行期间加载依赖、读取文件和处理数据,多个环境可能在相近时间使用相同内容。**pVisor 通过尽早共享重复页面,并在后续读取时保持共享,减少这些执行环境同时驻留的内存。**
+Agent 在工具执行期间加载依赖、读取文件、处理数据,多个环境可能同时使用相同内容。pVisor 尽早共享重复页面,并在后续读取时保持共享,减少同时驻留的内存。选择机制要看工作集寿命:短命工具和长期驻留的库页面对应的取舍不同。
-- **让共享尽早生效。** 相同随机内容的预检中,物理池约 1.7 秒达到持续减少 128 MiB 的观测目标,为短时工作集提供了早期回收的依据。
-- **把共享延续到下一次读取。** 物理页共享在读回后保持低占用;显式不可变文件还可通过 DAX 直接复用,文件读取提示帮助扫描器更早发现候选页。
-- **结合工作集评估整体成本。** 共享收益取决于重复程度和页面存活时间,需要同时考察扫描 CPU、观察窗末尾占用,以及压缩路径恢复私有 RAM 的代价。
-
-## 实验动机 {#motivation}
-
-Agent 的读文件、搜索和小脚本调用可以很短。对于短命工具环境,或者很快被释放、改写的工作集,即使几十秒后的内存占用很低,也可能赶不上实际可共享的窗口;因此要同时看曲线前几秒和窗口末尾。持久 VM 的库页可能跨多次调用保留,工具执行时间不能直接当作页面可共享时间。部署时应按工作集生命周期,权衡回收速度、扫描 CPU、读回开销和完整运行组的内存预算。
+相同随机内容的预检中,物理池约 1.7 秒达到持续减少 128 MiB 的观测目标,KSM 约需 27.8 秒,但窗口末占用更低。评估时要同时看扫描 CPU、窗口末尾占用和私有 RAM 恢复代价,而不是单一峰值。
## 实验设计 {#interpretation}
-评估去重应分别使用易压缩的重复内容、跨实例相同随机内容和各实例独有随机内容,在相同观察窗口下比较空闲占用、回收速度、CPU 和首次完整读回。共享库单独比较普通文件加载、文件读取提示和显式不可变 DAX,避免把不同负载混成一个排名。
-
-当前工程预检每组四实例,各有 64 MiB 数据;VM 为 256 MiB RAM/1 vCPU,Docker 每容器限制为 256 MiB/一核配额。完整组统一四核/2 GiB/零 swap,包含共享池或专用 rootless Docker 运行时。就绪后观察 60 秒,每条件 N=1,内容、私有写入、退出和资源校验均须通过;失败与不完整批次不参与汇总。具体环境和采样边界见[工程实验设计](../../design/vm-memory-performance-analysis.md#pool-design)。
-
-这是同预算、同负载的完整配置对照。Docker 使用专属 rootless daemon,运行时成本由四容器承担;共用 daemon 的部署可有不同的摊销结果。Firecracker 与 pVisor 的客户机内核、virtio-blk/virtio-fs 文件路径不同,Docker 共享宿主内核。全局 ksmd 在组 CPU 配额外单列,因此这些结果不能全部归因于扫描算法。
-
-**cgroup 计费内存**包含归属于组的缓存和内核开销;**PSS**按比例分摊进程映射的共享页。文件页可能计费在组外,因此两个指标分别保留,不能相加,也不能直接换算整机新增占用。重复轮次、真实 Agent 延迟与长期容量仍未测。
+测量一段时间内整组的计费内存与 PSS,以及首次完整读回的耗时,作为内存占用。内存占用是这组环境运行时的实际代价;同样读回耗时下占用越低,同一宿主能放下的环境越多。
-### 整组总量与每 VM 平均值 {#memory-accounting}
+每组四个实例、每个 64 MiB 数据,整体处在四核 / 2 GiB / 零 swap 的预算内。VM 为 256 MiB、1 vCPU;每个容器限制 256 MiB、一个 CPU 配额。每个条件在就绪后跑一个 60 秒窗口;内容、私有写、退出和资源检查必须通过,不完整的批次不计入。
-**图中显示四实例整组总量,尚未除以 VM 数量。** daemon 方式包含 `pvisor-daemon memory-pool` 进程、全部 VM 进程和组内辅助进程。换算每 VM 的平均占用时:
+数值按整组报告。PSS 按映射比例分摊共享页,组计费内存取 cgroup 的 `memory.current`;每 VM 平均值等于总量除以四,不代表再加一个 VM 的边际成本。Docker 使用专用 rootless daemon,Firecracker 与 pVisor 的内核和文件路径不同,全局 ksmd 在组的 CPU 配额之外运行。重复轮次、真实 Agent 延迟和长期容量仍未测量。
-- **平均进程 PSS** =(内存池进程 PSS + 全部 VM 进程 PSS + 组内辅助进程 PSS)÷ 4。PSS 按映射比例分摊共享页;直接相加 RSS 会重复计算共享页。
-- **平均组计费内存** = 完整 cgroup 的 `memory.current` ÷ 4。这个读数已经包含内存池,以及归属于组的文件缓存和内核开销,无需另加 daemon 内存。
+### 区分去重与压缩 {#dedup-modes}
-这里的平均值是整组成本的分摊,不代表新增一个 VM 的边际成本。实验启动的是独立内存池组件,没有启动完整 OpenSandbox API 服务;组外观察者也不计入上述内存。
+下表的标签是实验对照,不是可以任意组合的配置项。物理共享以 4 KiB 页为单位;本地与池化压缩以 64 KiB 块为单位,并拒绝压缩收益不足的数据。不可变文件的 DAX 直接映射同一个 backing 文件,文件读取提示只用于给扫描器排优先级。
-### 如何区分去重与压缩 {#dedup-modes}
-
-物理页共享在读取时继续复用同一份数据;冷压缩在访问时恢复私有内存。评估收益需要同时看空闲占用、回收速度、扫描 CPU 和首次读回后的占用。
-
-| 实验标签 | 内存处理方式 | 跨 VM 复用 | 重新读取时 |
+| 实验标签 | 内存机制 | 跨 VM 复用 | 后续读取 |
|---|---|---|---|
-| `off` | 关闭额外 RAM 去重和冷压缩 | 不主动合并 RAM | 读取原有页面 |
-| `ksm` | 宿主内核扫描并合并相同页 | 内核持有共享页 | 保持共享,写入时复制 |
-| `local` | 每实例独立压缩冷块,可在本地池内去重 | 不跨 VM 共享压缩对象 | 恢复为本实例私有 RAM |
-| `physical` | daemon 持有相同内容的共享物理页 | 多 VM 映射同一份页 | 保持共享,写入时复制 |
-| `compressed` | daemon 保存可复用的压缩冷块 | 多 VM 复用压缩对象 | 恢复为本实例私有 RAM |
-
-当前物理共享按 4 KiB 页处理;本地压缩和公共压缩池主要按 64 KiB 块处理,并要求达到压缩收益门槛。因此,跨 VM 完全相同但难以压缩的数据,仍可能被压缩路径拒绝。模式标签用于工程对照,不代表可直接叠加的配置选项。
-
-不可变文件的 DAX 共享是另一条路径:各 VM 直接映射同一底层文件的相同偏移,无需先扫描这些文件页。当前共享库实验使用显式不可变挂载;普通 rootfs 的所有 `.so` 不会自动获得这一属性。普通文件读取提示只调整物理池候选页的扫描顺序,合并前仍需验证内容。
+| `off` | 关闭额外的 RAM 去重与冷压缩 | 不做主动合并 | 读取已有页面 |
+| `ksm` | 宿主内核扫描并合并相同页 | 内核管理共享页 | 保持共享,写时复制 |
+| `local` | 每个实例压缩冷块,可在本地存储内去重 | 不跨 VM 共享压缩对象 | 恢复实例私有 RAM |
+| `physical` | daemon 持有内容相同的共享物理页 | VM 映射同一页 | 保持共享,写时复制 |
+| `compressed` | daemon 保存可复用的压缩冷块 | VM 复用压缩对象 | 恢复实例私有 RAM |
## 实验数据和分析 {#results}
### 去重与共享库曲线 {#linux-lifecycle}
-[静态工作集曲线](../../design/vm-memory-performance-analysis.md#pool-static-results)包含原版 Firecracker、独立 rootless Docker,以及 pVisor off、KSM、physical、compressed 和 local。三种工作集分别绘制 0–60 秒的整组计费内存和 PSS,并保留首次读回与 CPU 读数。
+[静态工作集曲线](../../lab-notes/vm-memory-performance-analysis.md#pool-static-results)包含原版 Firecracker、独立 rootless Docker,以及 pVisor off、KSM、physical、compressed 和 local。三种工作集分别绘制 0–60 秒的整组计费内存和 PSS,并保留首次读回与 CPU 读数。

@@ -92,13 +71,13 @@ KSM 另有 **0.41 CPU 秒**全局 ksmd 开销,位于组配额外,不能完
### 共享库:文件提示与 DAX {#library-curves}
-[共享库曲线](../../design/vm-memory-performance-analysis.md#pool-library-results)比较相同 `.so` 的加载路径,包含文件提示开启/关闭及显式 DAX。曲线从全部就绪开始;启动期间已发生的共享体现在起始占用中。完整读回和私有写入校验保留,暂不展示 post-write 曲线。
+[共享库曲线](../../lab-notes/vm-memory-performance-analysis.md#pool-library-results)比较相同 `.so` 的加载路径,包含文件提示开启/关闭及显式 DAX。曲线从全部就绪开始;启动期间已发生的共享体现在起始占用中。完整读回和私有写入校验保留,暂不展示 post-write 曲线。


-共享库两图来自同一组 N=1 预检,纵轴均为整组 MiB。前 5 秒放大图保留原始采样点,便于观察文件提示开启/关闭的早期差异;显式 DAX 的共享已体现在起始占用中。扫描 CPU 和读回代价见[详细分析](../../design/vm-memory-performance-analysis.md#pool-readback)。
+共享库两图来自同一组 N=1 预检,纵轴均为整组 MiB。前 5 秒放大图保留原始采样点,便于观察文件提示开启/关闭的早期差异;显式 DAX 的共享已体现在起始占用中。扫描 CPU 和读回代价见[详细分析](../../lab-notes/vm-memory-performance-analysis.md#pool-readback)。
### 来源与配置 {#run}
diff --git a/docs/src/zh/cases/index.md b/docs/src/zh/cases/index.md
index 14fe0e2e..886777e7 100644
--- a/docs/src/zh/cases/index.md
+++ b/docs/src/zh/cases/index.md
@@ -60,7 +60,7 @@ just cases --suite use --output target/pvisor-learning-report.json
规格和包含准备块的完整 Markdown 文档都参与 semspec 摘要。新规格保持 UNREVIEWED;执行成功与人工语义批准是两件事。人工完成引擎、词汇和规格审核后,可增加 `--require-reviewed`。测试执行不会批准规格或更新审核账本。
-[DOC cases](../reference/cases.md)、[VM 控制 cases](../reference/cases-vm.md)、STAGE 和 USE 场景统一由 `just cases` 执行,用 `--suite doc/stage/use/vm` 选择;`examples/pvisor` 由 `just examples` 执行。CI 同时运行原有隔离回归、网络/Gateway mock 场景和新学习路线。旧独立 snapshot 的硬件记录保留作历史证据;旧 Controller/Worker 验收记录不验证新 daemon。完整原生执行恢复按 [execution checkpoint 契约](../reference/cli.md#full-vm-execution-checkpoints)单独验证;daemon 的[运行时边界](../guides/daemon/boundaries.md)不包含 VM 恢复;本学习路线没有把未运行的 VM/Gateway 能力算作成功。
+[DOC cases](../reference/cases.md)、[VM 控制 cases](../reference/cases-vm.md)、STAGE 和 USE 场景统一由 `just cases` 执行,用 `--suite doc/stage/use/vm` 选择;`examples/pvisor` 由 `just examples` 执行。CI 同时运行原有隔离回归、网络/Gateway mock 场景和新学习路线。旧独立 snapshot 的硬件记录保留作历史证据;旧 Controller/Worker 验收记录不验证新 daemon。完整原生执行恢复按 [execution checkpoint 契约](../reference/cli.md#full-vm-execution-checkpoints)单独验证;daemon 的[运行时边界](../guides/daemon/index.md)不包含 VM 恢复;本学习路线没有把未运行的 VM/Gateway 能力算作成功。
全量执行门禁当前以 Linux 为目标。macOS 可以选择适用的场景运行;本机 loopback 的网络策略与 Linux namespace 不同,S-USE-014 的宿主 loopback 拒绝检查不作为 macOS 承诺。
diff --git a/docs/src/zh/community/adopters.md b/docs/src/zh/community/adopters.md
deleted file mode 100644
index 52278617..00000000
--- a/docs/src/zh/community/adopters.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# 使用者与案例
-
-如果你正在考虑采用 pVisor,可以先按任务类型试用:让编码 Agent 自主修改项目,在 CI 中收集候选改动,或者批量生成可评分的 rollout。一次小任务足以验证执行、评审和接受改动是否适合你的工作流。
-
-当前没有在此登记、获得公开授权的组织案例。下面是可复现的试用路径;组织名称、logo 与生产规模需要使用者确认后再发布。
-
-## 从你的工作流开始 {#start}
-
-| 使用场景 | 第一次试什么 | 看什么结果 |
-| --- | --- | --- |
-| 本地编码 Agent | 一项小修改,暂存后检查 | 文件 diff、测试结果与 apply 选择 |
-| CI 自动修复 | 一个离线脚本,再替换为 Agent | 失败记录、Stage 产物与评审交接 |
-| 多 Agent 并行 | 两个独立 worktree | 各自结果可定位,合入没有混淆 |
-| RL rollout | 单个候选收集与评分 | 输入版本、轨迹、reward 与失败类别对应 |
-
-对应步骤见[CI](../guides/ci.md)、[并行 Agent](../guides/parallel-agents.md)与[rollout](../guides/rl-rollouts.md)。先验证你的任务,再按实际负载测量速度与容量。
-
-## 分享一份有用的案例 {#case}
-
-描述原来的工作流、要解决的问题、pVisor 版本、平台与执行器、Agent 和模型版本、关键命令或配置,以及任务后的评审方式。给出一段能公开的任务输入和结果,说明采用之后实际改变了什么。
-
-性能数字带上任务数量、机器与测量方法;人工体验描述对应到具体操作,例如授权次数、集中看 diff 或处理冲突。失败案例和后来调整的配置同样有价值。
-
-提交前确认组织名、logo、引用和数据得到公开授权。私有代码与凭据可以替换为公开复现;无需上传包含秘密的完整日志。
-
-## 案例记录字段 {#fields}
-
-每条记录保存组织或个人署名、公开授权范围、日期、版本、任务类型、集成方式、规模、指标定义和原始材料链接。尚未授权的案例不列名;实验性试用与生产使用分别说明。
diff --git a/docs/src/zh/community/code-of-conduct.md b/docs/src/zh/community/code-of-conduct.md
deleted file mode 100644
index 7b5275e1..00000000
--- a/docs/src/zh/community/code-of-conduct.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# 行为准则
-
-讨论实现、报告问题和评审贡献时,请把注意力放在可观察的行为与证据上,让不同经验、背景和表达方式的参与者都能继续合作。
-
-当前尚未正式公布 Contributor Covenant 的采用记录与行为事件私密联络渠道。以下是参与讨论的实用约定;正式政策仍待维护者确认。
-
-## 让讨论更容易推进 {#participation}
-
-- 指出问题时附上版本、平台、复现或具体段落,让对方能采取行动。
-- 评审代码时解释影响与可接受的修改,不评价贡献者的能力或身份。
-- 出现分歧时先复述双方需要解决的问题,再比较方案和验收结果。
-- 对新参与者解释必要上下文;允许提问、修正理解和承认不确定性。
-
-侮辱、骚扰、歧视、威胁、公开他人私人信息以及持续针对个人的攻击会破坏合作。技术分歧应围绕方案展开。
-
-## 遇到不当互动时 {#response}
-
-可以暂停对话,保留相关链接、时间与记录,避免继续扩大冲突。若你已有维护者的私密联络方式,可询问适合的处理入口。公开 issue 可以讨论流程改进,但不要在其中披露受影响者身份、私人消息或事件敏感细节。
-
-项目仍需公布可用的私密行为事件报告渠道、负责处理的人员、回避机制和反馈时间。漏洞报告渠道用于安全漏洞;安全问题按[披露政策](../security/disclosure.md)提交。
-
-## 适用范围 {#adoption}
-
-这些讨论约定适用于项目的 issue、PR、评审与社区交流。技术争论可以保留不同观点,但应让参与者能够继续贡献和获得回应。
-
-正式行为事件处理需要私密渠道与负责人员。目前没有公开的专用联系人;本仓库的安全漏洞渠道继续按安全披露政策使用。
diff --git a/docs/src/zh/community/governance.md b/docs/src/zh/community/governance.md
index c340451e..03e74792 100644
--- a/docs/src/zh/community/governance.md
+++ b/docs/src/zh/community/governance.md
@@ -1,28 +1,19 @@
# 治理与维护者
-参与 pVisor 时,先按变更规模选择入口:修正文字或小问题可以提交 PR,较大的接口与行为变化先用 issue 对齐问题和验收方式。涉及安全边界的漏洞使用[私密披露流程](../security/disclosure.md)。
+pVisor 目前由单一维护者决策:代码合并、发布、semspec 批准和文档权威版本都由同一入口处理,没有正式的委员会或多维护者投票机制。本页描述当前的实际做法,而不是一套尚未建立的章程。
-## 当前贡献与决策流程 {#workflow}
+## 贡献如何进入 {#workflow}
-1. 描述用户遇到的问题、预期行为和复现方式。
-2. 对设计变更说明选项、代价和兼容影响;把验收要求写清楚。
-3. 提交实现、对应文档与验证结果;按[贡献指南](contributing.md)运行相关检查。
-4. 评审者核对行为、证据与测试;合并和发布由具有相应仓库权限的维护者执行。
+1. 描述用户遇到的问题、预期行为和复现方式;较大的接口与行为变化先用 issue 对齐问题和验收方式。
+2. 提交实现、对应文档与验证结果;按[贡献指南](contributing.md)运行相关检查。
+3. 维护者核对行为、证据与测试后合并。涉及安全边界的漏洞使用[私密披露流程](../security/disclosure.md)。
-代码评审、合并权限与语义规格批准分别处理。一个 PR 的测试通过不自动批准产品承诺;新增用户可见边界需要对应的规格与人工审核。
+代码评审、合并与语义规格批准分别处理:一个 PR 的测试通过不自动批准产品承诺;新增用户可见边界需要对应的规格与人工审核。
-## semspec 的人工批准职责 {#semspec}
+## semspec 批准 {#semspec}
-贡献者可以起草案例、修复实现并维护 runner 测试。维护者人工判断主张是否准确、覆盖是否足够,再执行 approve/revoke 和更新批准记录。AI 不执行批准,不修改真实 `REVIEWED.toml` 或 `.approved/` 快照,也不弱化现有检查来获得 PASS。
+贡献者可以起草案例、修复实现并维护 runner 测试。semspec 的 approve/revoke 与真实 `REVIEWED.toml`、`.approved/` 快照只由维护者人工执行;AI 不执行批准,也不弱化现有检查来获得 PASS。具体命令与规则见[测试与 semspec](testing.md)。
-评审时同时提供源码版本、运行环境、结果和适用限制。具体命令与规则见[测试与 semspec](testing.md)。
+## 尚未建立的部分 {#records}
-## 如何成为长期贡献者 {#contributors}
-
-从一个可复现的问题开始,持续维护某个模块的实现、文档与回归案例。较大的职责变化可以通过公开 issue 提出范围,说明你希望负责的内容和已经完成的工作。
-
-仓库权限决定谁能合并和发布,职责扩展需要与有权限的维护者确认。讨论意见不一致时,把争议点、备选方案与验证结果放在同一 issue 中,请维护者给出决定并链接到对应变更。
-
-## 治理记录需要公开什么 {#records}
-
-维护者名单应包含账号、职责和生效时间;设计决定应链接 issue、PR 或 ADR;权限与发布职责变动保留记录。安全报告中的敏感内容遵循披露流程,公开记录只引用可以公开的结论。
+正式的维护者名单、治理章程和行为事件私密报告渠道尚未设立,设立后将在此页公布。在此之前,设计决定以 issue、PR 或 ADR 链接为准,讨论约定见[社区](index.md)。
diff --git a/docs/src/zh/community/index.md b/docs/src/zh/community/index.md
index 9054b20e..c993cf48 100644
--- a/docs/src/zh/community/index.md
+++ b/docs/src/zh/community/index.md
@@ -21,3 +21,11 @@ pVisor 是 Apache-2.0 开源项目。
单元和集成测试检查实现;semspec 把产品承诺写成声明、违反示例和可执行检查。可以起草新用例、修复实现和维护 runner 测试,不得削弱已有 claims、checks 或 `xfail` 来获得 PASS。
人工语义审核独立于测试和 PR 合并。AI 不运行 `semspec approve` / `revoke`,不编辑真实 `REVIEWED.toml` 或 `.approved/` 快照;具体规则见[测试与 semspec](testing.md)。贡献内容按 Apache-2.0 授权。
+
+## 讨论约定
+
+讨论实现、报告问题和评审贡献时,把注意力放在可观察的行为与证据上:指出问题时附上版本、平台与复现方式;评审时解释影响与可接受的修改,不评价贡献者的能力或身份;出现分歧时先复述双方需要解决的问题,再比较方案和验收结果。侮辱、骚扰、歧视、公开他人私人信息以及持续针对个人的攻击不被接受。项目尚未正式公布 Contributor Covenant 的采用记录与行为事件私密联络渠道,设立后将在此公布;安全漏洞按[披露政策](../security/disclosure.md)提交。
+
+## 试用与案例
+
+当前没有在此登记、获得公开授权的组织案例;组织名称、logo 与生产规模需要使用者确认后再发布。如果你试用了 pVisor,一份有用的案例记录包括:原来的工作流与要解决的问题、pVisor 版本、平台与执行器、Agent 和模型版本、关键命令或配置、任务后的评审方式,以及采用之后实际改变了什么。性能数字请带上任务数量、机器与测量方法;失败案例和后来调整的配置同样有价值。提交前确认组织名、引用和数据得到公开授权,私有代码与凭据替换为可公开复现的内容。
diff --git a/docs/src/zh/community/roadmap.md b/docs/src/zh/community/roadmap.md
index 8d031a84..a0b69cae 100644
--- a/docs/src/zh/community/roadmap.md
+++ b/docs/src/zh/community/roadmap.md
@@ -1,6 +1,6 @@
# 路线图
-主线的分级与规模轴见[信任阶梯](../why/trust-ladder.md)。下表列出 L1(本机逐个 Job)的持续工作与验收标准。
+主线的分级与规模轴见[为什么是 pVisor](../why/index.md#trust-ladder)。下表列出 L1(本机逐个 Job)的持续工作与验收标准。
| 工作 | 验收标准 |
| --- | --- |
@@ -36,7 +36,7 @@
## L2 与 L3 里程碑
!!! note "建设中"
- L2/L3 的进入条件与缺口清单尚未定稿,排期未确定。以下列出当前要求与验收标准。级别定义见[信任阶梯](../why/trust-ladder.md),容量依据见[并发密度](../benchmarks/density.md)。
+ L2/L3 的进入条件与缺口清单尚未定稿,排期未确定。以下列出当前要求与验收标准。级别定义见[信任阶梯](../why/index.md#trust-ladder),容量依据见[并发密度](../benchmarks/density.md)。
### L2:本机多个 Job/一条流水线
@@ -49,7 +49,7 @@
### L3:集群化执行、集中证据
-进入条件(待定稿):明确与调度器的边界——pVisor 提供执行语义与证据,跨节点编排交给 Kubernetes、Ray,见[集群化执行](../design/research/cluster-execution.md)。
+进入条件(待定稿):明确与调度器的边界——pVisor 提供执行语义与证据,跨节点编排交给 Kubernetes、Ray,见[集群化执行](../design/research/index.md)。
验收标准:
diff --git a/docs/src/zh/concepts/capabilities-and-evidence.md b/docs/src/zh/concepts/capabilities-and-evidence.md
index d6e6a25f..759eb33c 100644
--- a/docs/src/zh/concepts/capabilities-and-evidence.md
+++ b/docs/src/zh/concepts/capabilities-and-evidence.md
@@ -3,6 +3,10 @@
判断一次 Job 真正保证了什么,要分别核对请求的权限、准入计划、实际安装的控制和观察到的结果。
`--safe`、暂存目录或执行器名称都不能单独证明所有能力已经强制执行。
+## 策略叠加规则 {#layering}
+
+策略逐层收窄:后面的 `allow` 不能覆盖前面任何一层的显式 `deny`。某一层写了规则却没写 `default_action`,这一层默认拒绝;完全不配置策略时,网络按 public 放行、文件读取也不受限——要限制就得显式声明。`--safe` 要求落实隔离并拒绝敏感路径;`--strict` 校验全部请求维度,缺证据就拒绝运行。字段与预设见[策略字段参考](../reference/policy.md)。
+
## 按维度检查
| 维度 | 应检查的内容 |
@@ -43,7 +47,7 @@ Run Bundle 的 `executor_observations` 是当前执行的强制力证据,安
## 记录能说明什么
```text
-请求的权限 → 准入计划 → 安装控制 → 执行与观察 → 终态结果和 Run Bundle
+Requested permissions → admission plan → installed controls → execution and observations → terminal result and Run Bundle
```
`status --review` 展示 Run Bundle 的控制、警告和暂存改动。文件观察只覆盖到达
diff --git a/docs/src/zh/concepts/glossary.md b/docs/src/zh/concepts/glossary.md
deleted file mode 100644
index 52c6bb9c..00000000
--- a/docs/src/zh/concepts/glossary.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# 术语表
-
-| 术语 | 含义 |
-| --- | --- |
-| [Job](jobs.md) | pVisor 里一项持久的工作:命令、证据与暂存改动 |
-| [Stage](staging.md) | 写时复制的暂存工作区 |
-| [apply / drop](staging.md) | 把暂存改动选择性合入目标/丢弃 |
-| [Run Bundle](../reference/run-bundle.md) | 一次运行的结果、控制观察、产物与摘要 |
-| [Capability](capabilities-and-evidence.md) | 一个能力维度(文件、网络、子进程…)的请求与实际控制 |
-| [Evidence](capabilities-and-evidence.md) | 执行器实际安装的控制与观察到的结果,而不是声明 |
-| [Placement](../design/operations-events.md) | 选定的执行位置(host/container/VM,以及 Overlay 组合) |
-| 控制计划等级 | 准入时执行器计划安装的等级:`Unsupported`、`Cooperative`、`Planned`,不等于已安装 |
-| 实际控制等级 | 执行器收尾观察到的等级:`Unenforced`、`Cooperative`、`Enforced` |
-| [Interception](../guides/policies/network.md) | 网络层对出口流量的拦截(显式代理或 VM 数据面) |
-| [L0–L3](../why/trust-ladder.md) | 信任阶梯的级别 |
-
-机制与字段见[设计与研究](../design/index.md)和[参考](../reference/index.md)。
diff --git a/docs/src/zh/concepts/index.md b/docs/src/zh/concepts/index.md
deleted file mode 100644
index dceadf27..00000000
--- a/docs/src/zh/concepts/index.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# 概念与边界
-
-一次任务有三种需要分别判断的结果:命令是否完成、文件产生了什么净改动、请求的限制是否实际生效。退出码、stage 和执行器名称分别描述不同事情,不能替代彼此。
-
-## Job 是审查单位
-
-Job 把受管理的命令、执行证据和暂存改动关联起来。命令停止后,仍可定位它并审查结果;命令失败也可能留下有用的候选文件。
-
-默认存储中的 `last` 按当前工作区查找。显式 `--stage PATH` 把 Job 存在该目录,应使用路径或输出的 Job ID,避免在自定义存储或并行项目中找错结果。身份与清理规则见 [Job 与存储](jobs.md)。
-
-## 文件视图与发布是两个阶段
-
-启用暂存后,Job 读取工作区底层文件和自己的 upper 改动;写入、删除和重命名先改变这个视图。审查展示净效果,操作次数不等于最终 diff。
-
-apply 将选中改动与首次修改时记录的基线比较,再发布到原工作区。目标被其他写入者改动时会拒绝覆盖;发布期间仍应停止其他写入者,多文件更新相对于外部编辑器不具备原子性。drop 只丢弃尚未合入的暂存改动。完整契约与语义用例见[暂存与 apply](staging.md)。
-
-显式直接写宿主的共享路径、已合入批次和远程 API 效果不受 drop 撤销。逻辑检查点保存 upper 和冲突基线,不冻结所有宿主底层文件,也不保存进程内存或外部服务状态。
-
-## 策略意图与实际控制分开核对
-
-```text
-请求权限 → 策略收窄与准入计划 → 安装控制 → 执行观察与结果
-```
-
-user、workspace、session 和执行器基础策略逐层收窄权限,一层的 allow 不能覆盖其他层的 deny。准入计划中的 `Planned` 表示将安装机制,不能当作已经强制执行;收尾的执行器观察才报告实际控制。策略组合见[策略模型](policy-model.md)。
-
-在 Run Bundle 中逐个核对文件读取、文件写入、网络、子进程、凭据与资源维度。暂存不能证明网络隔离,捕获请求不能证明没有未捕获连接。观察只覆盖到达对应控制点的操作;`null` 表示未观测,零表示已观测但没有命中。等级与保证范围见[能力与证据](capabilities-and-evidence.md)。
-
-## 记录各自承担什么
-
-`run.json` 保存 Job 身份、状态和本地资源;Run Bundle 保存执行结果、控制观察和产物摘要;可选 Event Journal 关联已发布事实与因果引用。Journal 不替代 Bundle,也不能建立跨 Job 外部副作用的全局顺序。
-
-这些记录支持本地审查与诊断,不提供密码学远程证明或敌对多租户保证。Operation、Attempt 和 Session 的实现归属见[执行模型](../design/execution-model.md)。
diff --git a/docs/src/zh/concepts/jobs.md b/docs/src/zh/concepts/jobs.md
index ffe0dd12..34f0c96a 100644
--- a/docs/src/zh/concepts/jobs.md
+++ b/docs/src/zh/concepts/jobs.md
@@ -7,7 +7,7 @@ pvisor run --safe --stage ../stage-001 -- codex
pvisor status --review ../stage-001
```
-`pvisor run` 创建 Job;`status`、`kill`、`inspect`、`fork`、`apply`、`drop` 都直接操作它,没有 `job` 子命令。磁盘上沿用 `run-*` 和 Run Bundle 的名字。
+`pvisor run` 创建 Job;`status`、`kill`、`inspect`、`fork`、`apply`、`drop` 都直接操作它,没有 `job` 子命令。磁盘上的目录与 Run Bundle 沿用 `run-*` 名称。
## 之后怎么再找到它
@@ -16,8 +16,8 @@ pvisor status --review ../stage-001
`last` 是便利写法,只在**默认存储**里按当前工作区查找。用 `--stage PATH` 时 Job 存在暂存目录中,不在默认存储里,这时显式给出路径或 ID:
```bash
-pvisor status --review ../stage-001 # 推荐:用暂存路径
-pvisor status --review run-20260102-abc # 或者用 Job ID
+pvisor status --review ../stage-001 # stage path
+pvisor status --review run-20260102-abc # or the Job ID
```
找不到当前工作区的 Job 时,pVisor 会报错,而不是拿别的项目的 Job 顶上。
diff --git a/docs/src/zh/concepts/policy-model.md b/docs/src/zh/concepts/policy-model.md
deleted file mode 100644
index 5b890b43..00000000
--- a/docs/src/zh/concepts/policy-model.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# 策略模型
-
-一次执行经过五步,每一步记录的东西不同,不能互相替代:
-
-- **请求**:你声明的权限(`--safe`、`--access`、`--overlaynet-*` 等)。
-- **准入**:所选执行器能提供什么,最高只到 `Planned`。
-- **有效约束**:user、workspace、session 与执行器基础策略叠加后的结果。
-- **安装控制**:执行器实际装上了哪些强制机制。
-- **观察到的结果**:执行器收尾时报回的观察——这才是实际生效的证据。
-
-策略**逐层收窄**:后面的 `allow` 不能覆盖前面的显式 `deny`。某一层写了规则却没写 `default_action`,这一层默认拒绝;完全不配置策略时,网络按 public 放行、文件读取也不受限——要限制,得显式声明。`--safe` 要求落实隔离并拒绝敏感路径;`--strict` 校验全部请求维度,缺证据就拒绝运行。
-
-字段与预设见[策略字段参考](../reference/policy.md)(建设中),证据口径见[能力与证据](capabilities-and-evidence.md)。
diff --git a/docs/src/zh/concepts/staging.md b/docs/src/zh/concepts/staging.md
index 680413d7..4fff95d8 100644
--- a/docs/src/zh/concepts/staging.md
+++ b/docs/src/zh/concepts/staging.md
@@ -2,7 +2,7 @@
暂存把 Job 的工作区改动留在写时复制的 upper 层。只有显式的 `apply` 才会改变目标工作区。因此文件改动在 apply 之前是可逆的:选择合入、丢弃,或分叉。
-这里定义暂存契约,每条承诺对应 `docs/src/zh/cases/06-stage-apply.md` 中的一个用例,可用 `just cases --suite stage` 复现。操作流程见[审查与应用](../guides/review-apply.md)。
+每条承诺对应 `docs/src/zh/cases/06-stage-apply.md` 中的一个用例,可用 `just cases --suite stage` 复现。操作流程见[审查与应用](../guides/review-apply.md)。
## 承诺
@@ -10,7 +10,7 @@
| --- | --- | --- |
| apply 前工作区不变 | 成功、非零退出或信号终止后,工作区的路径、类型、内容、权限位与链接目标都与初始状态一致,直到 apply | S-STAGE-001 |
| Job 读取自己的变更 | Job 能看到自己的写入、删除与重命名,而宿主工作区不变 | S-STAGE-002 |
-| Review 表示净效果 | 清单等于净新增、删除与修改;创建后又删除的文件不出现 | S-STAGE-003 |
+| 审查清单表示净效果 | 清单等于净新增、删除与修改;创建后又删除的文件不出现 | S-STAGE-003 |
| 全部 apply 等价直接运行 | 暂存一个脚本后执行 `apply --all`,得到的树与直接在 workspace 中运行脚本一致 | S-STAGE-004 |
| drop 后拒绝 apply | drop 保持工作区不变;之后的 apply 被拒绝且无效果 | S-STAGE-005 |
| 选择性 apply 只影响所选子树 | `apply --path P` 只改 P 及其后代;两个覆盖全部改动的选择性批次等价于一次 `--all` | S-STAGE-006 |
diff --git a/docs/src/zh/design/architecture.md b/docs/src/zh/design/architecture.md
index b5b623a0..420e9e60 100644
--- a/docs/src/zh/design/architecture.md
+++ b/docs/src/zh/design/architecture.md
@@ -4,7 +4,7 @@ pVisor 是 Operation 的处理核心:接收操作请求,根据策略决定
这条主线分成两个职责:**core 提供定义,pvisor 提供实现。** 外部调用方提交执行请求,通过运行句柄控制一次执行,通过 Event 观察它的过程和结果。
-
+总体框图与一次任务的端到端走读见[设计与底层原理](index.md)。下列合同覆盖 crate 所有权、API 边界与宿主权限路径。
## 定义与实现
@@ -20,10 +20,11 @@ pVisor 是 Operation 的处理核心:接收操作请求,根据策略决定
| `pvisor-gateway` | 可选的模型协议路由、转换和调用观察 |
| `pvisor-daemon` | 独立的单节点 sandbox 准入、持久归属、原生 VM supervisor 生命周期与端点代理 |
| `pvisor-cli` | CLI、TUI、cache/replay 前端与 Host Job 应用适配;消费 runtime |
+| `pvisor-shim` | containerd Runtime v2 shim(`io.containerd.pvisor.v2`);宿主进程路径的任务生命周期、exec 与 FIFO/PTY IO |
| `pvisor-vm` | VM、设备、冻结、snapshot 与 RAM 映射;统一 api、私有平台实现 |
| `pvisor-replay` | Agent 轨迹回放机制;消费 Core/Journal 合同,前端位于 CLI |
-[Daemon](daemon/index.md) 使用 VM-only NativeRuntime:独立 supervisor 嵌入 `PVisor::run`,跨 daemon 重启保留 RunHandle。可执行入口通过原生 CLI 设置构造 NativeRuntime;stage/apply、checkpoint/fork 和 Gateway API 未实现,也不自动获取 node 共享。见[职责收敛](daemon/responsibility-convergence.md)。主机选择和工作流属于外部编排。
+[Daemon](daemon/index.md) 使用 VM-only NativeRuntime:独立 supervisor 嵌入 `PVisor::run`,跨 daemon 重启保留 RunHandle。可执行入口通过原生 CLI 设置构造 NativeRuntime;stage/apply、checkpoint/fork 和 Gateway API 未实现,也不自动获取 node 共享。主机选择和工作流属于外部编排。
core 不拥有执行循环,也不启动进程或打开控制 socket。pvisor 实现 AgentCtl 客户端/服务端和审批 socket;驱动实现各自的文件、网络与隔离边界。默认核心不依赖 Gateway、TUI 或 replay,捕获通过 `gateway` feature 启用。
@@ -44,7 +45,7 @@ crate 的逻辑职责和 Rust 可见性需要分别检查。当前只有 `pvisor
迁移按 crate 进行:同时调整该 crate 的调用方、README、公开文档和边界检查,保留外部 API 合同覆盖。尚未迁移的 crate 不应临时套一层全量 re-export 或重复 DTO 来制造一致外观,也不能公开内部模块绕过编译边界。硬件/私有状态检查留在 crate 内;外部调用方只依据所有权、生命周期、失败后状态和同步合同。
-这套 Rust 边界不自动提供稳定线上协议或旧记录兼容性。CLI 的 `JobCommand`/ticket 仍要求精确构建匹配,磁盘格式也有独立 reader。版本对应关系见[记录与版本矩阵](records-and-versions.md),VM 边界的背景见[ADR 0005](decisions/0005-rust-vm-api.md)。状态依据 `lib.rs`、VM 的 `runtime_modules.rs`、各 `api.rs` 与目录 README 静态核对;不代表本次重新运行了契约测试或平台验证。
+这套 Rust 边界不自动提供稳定线上协议或旧记录兼容性。CLI 的 `JobCommand`/ticket 仍要求精确构建匹配,磁盘格式也有独立 reader。版本对应关系见[记录与版本矩阵](records-and-versions.md)。状态依据 `lib.rs`、VM 的 `runtime_modules.rs`、各 `api.rs` 与目录 README 静态核对;不代表本次重新运行了契约测试或平台验证。
## Host 与 Guest AgentCtl {#host-agentctl}
@@ -145,9 +146,7 @@ Host AgentCtl 路径尚无真实 VM TUI 端到端验证。现有传输、进程
## 一条生产执行路径
-
-
-准备驱动会建立真实的文件与网络资源,执行器派发才让工作负载开始运行。把这两个步骤分开,可以在必要启动事实提交失败时阻止派发,同时由 Session 收回已经准备的资源。结束时同样先收敛资源和观察,再公布终态;调用方取消等待不等于这些动作已经完成。
+准备、事实提交、派发、清理与终态的完整时序见[设计与底层原理](index.md#execution)的走读。下面是所有权视角的三条合同。
`RunSpec` 是调用方的执行配置输入;`Operation` 是结构化的操作描述。目前唯一生产操作是 `run.execute`,包含程序、参数和工作目录。执行器实际消费有效 RunSpec 及准备好的驱动附件。`PVisor::resolve_operation` 使用同一准入路径,供启动前审查,不能代替实际执行及安装证据。
@@ -167,8 +166,6 @@ Process/VM 清理其受管理的进程组;容器使用 runtime 的终止接
外部观察的是 Event,不需要依赖 Session 的内部字段。事件链、身份、因果引用与记录边界见 [Operation 与 Event](operations-events.md)。
-当前实现先准备驱动,再提交启动事实,最后调用执行器。必要启动事实提交失败会阻止执行器派发并清理准备资源;准备阶段仍可能产生文件或 socket 副作用。
-
## 策略、控制与证据
策略、准入计划与执行后观察是三个独立层次,不能互相替代;`ExecutorPlan`/`ExecutorObservations` 的等级与证据口径见[能力与证据](../concepts/capabilities-and-evidence.md)。
diff --git a/docs/src/zh/design/cli.md b/docs/src/zh/design/cli.md
index 93a91f60..6997ec20 100644
--- a/docs/src/zh/design/cli.md
+++ b/docs/src/zh/design/cli.md
@@ -98,7 +98,7 @@ pvisor-daemon memory-pool --help
Sandbox 生命周期及可选池所有权直接调用 `pvisor-daemon`。缓存、replay 和 TUI 仍独立于 Job 命令;replay/TUI 伴随程序查找会明确报告工具缺失。Daemon CLI 构造原生 VM 运行时并派发 supervisor,同步内部 VM 派发先于 Tokio。Node 资源协议属于运行时,没有 daemon acquire/release 适配器。打包不暴露 staging/checkpoint API,也不自动获取 node 资源。
-工具来自静态表,只查可信安装目录,不搜索 PATH 或执行 discovery。安装目录与可执行文件归当前用户或 root 所有,不得 group/world 可写,拒绝符号链接。Unix `exec` 保留参数、stdio、信号和退出码;子命令自己的 `--help`/`--version` 原样转交,工具不能覆盖 Job 命令。Sandbox 部署见 [daemon 运维](daemon/operations.md),独立原生资源预算见[职责收敛](daemon/responsibility-convergence.md)。
+工具来自静态表,只查可信安装目录,不搜索 PATH 或执行 discovery。安装目录与可执行文件归当前用户或 root 所有,不得 group/world 可写,拒绝符号链接。Unix `exec` 保留参数、stdio、信号和退出码;子命令自己的 `--help`/`--version` 原样转交,工具不能覆盖 Job 命令。Sandbox 部署与原生资源预算见 [daemon 架构](daemon/index.md)与[运维](daemon/operations.md)。
核心默认构建不包含 Gateway。启用捕获使用 `--features gateway`;wheel 构建启用该 feature。
无捕获时,普通显式代理仍由 OverlayNet 授权与转发。请求未编译的捕获或 Gateway debug 能力会报错。
diff --git a/docs/src/zh/design/cluster-benchmark-plan.md b/docs/src/zh/design/cluster-benchmark-plan.md
deleted file mode 100644
index 7417c39f..00000000
--- a/docs/src/zh/design/cluster-benchmark-plan.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# 已退役的 Cluster benchmark 计划
-
-**Controller/Worker 实验计划已退役,不转移给 daemon。** B-CLUSTER 没有活动 runner 或验收协议。[历史测量](../benchmarks/cluster-scalability.md)只回答冻结制品的问题,不能验证下列提案或当前 daemon 密度。
-
-## 已有证据 {#existing}
-
-[技术归档](cluster-performance-analysis.md)区分增配预算的就绪探针、合成历史查询和独立完整任务批次。就绪不是完成吞吐;fixture RSS 不是控制面的净内存;热回放不是完整恢复。历史表格、CSV 和原始 `.data/` 保留各自批次,不改名、不新增测量。
-
-## 启动归因提案 {#q1}
-
-直接 VM 执行与旧 Cluster 分发的对照是未完成的归因提案,不是当前 Controller/Worker 实验。旧 debug、release 和不同配额的配置不能相减推导调度成本。
-
-## 边际内存提案 {#q2}
-
-区分共享基底、私有工作集与 offload 恢复仍是测量问题,不是已证实的 Cluster 密度收益。独立 B-DENSITY 和 B-VM-MEMORY 探针按各自 registry 与 receipt 继续保留。单 VM 回收内存不能换算成 daemon 容量。
-
-## 固定预算有效工作提案 {#q3}
-
-模型等待/释放 CPU 的 A/B 提案没有被 shell 就绪或独立 Python/Git 完成批次验证。退役的 `release_cpu_on_idle` 路径不是活动测量对象,不能据此给出当前有效 Agent 吞吐或单位成本结论。
-
-## 历史扩展提案 {#q4}
-
-归档计数调用与保留记录回放不能证明 HTTP 调度吞吐、大活跃集合行为或当前 daemon 历史成本。旧 scheduler example 没有活动测量入口。
-
-## 恢复提案 {#q5}
-
-旧 Controller/Worker 对账实验已退役。本地热日志回放不能证明端到端恢复、分区收敛或 exactly-once 执行。退役实验不弱化任何安全 claim 或 receipt。
-
-## 持续运行提案 {#q6}
-
-短探针不能证明长期资源有界。原常驻 Worker 计划不是当前 daemon 可靠性或保留策略测试。
-
-## 替代实验必须满足的条件 {#protocol}
-
-替代实验需要独立登记的对象与用户问题、冻结源码/二进制/输入身份、核验全进程树 CPU/内存/零 swap 控制、相同负载、预先声明的样本数和停止规则,以及完整正确性、冲突与恢复检查。保留失败、未知和 OOM。独立批次与批次内相关观察分开;A/B 结论报告配对不确定性。正式采样前冻结协议,不得从探索数据事后批准假设。
-
-这些条件不授权新增测量或语义审批。人工审阅的 claim、receipt、semspec 检查与批准记录均不变。
-
-## 当前范围 {#priority}
-
-没有可执行的 Cluster 优先级列表或复现命令。[本机容量](../benchmarks/density.md)和[VM 内存](../benchmarks/vm-memory/index.md)仅在各自 native 探针范围内使用。daemon 密度、多主机扩展和相同条件调度系统对照均未测。[运行手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)列出退役入口与独立活动探针。
diff --git a/docs/src/zh/design/cluster-performance-analysis.md b/docs/src/zh/design/cluster-performance-analysis.md
deleted file mode 100644
index 9ac9d8d6..00000000
--- a/docs/src/zh/design/cluster-performance-analysis.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# 已退役的 Cluster 性能证据
-
-**Controller/Worker 测量描述的是退役制品,不是当前 daemon。** B-CLUSTER 没有活动测量、绘图或发布入口。[历史 benchmark](../benchmarks/cluster-scalability.md)保留完整任务与历史成本表格及原 CSV 来源。没有新增测量,也没有 daemon 密度结论。
-
-## 历史 VM 就绪探针 {#execution}
-
-2026-10-05 的 shell/sleep 实验同时增加 Worker 数和 CPU 预算,每个 VM 使用独立 Worker。它观察一到四个 guest 的并行就绪,不是固定预算有效任务吞吐或单 Worker 密度。
-
-
-
-| 存活 VM | 总内存 P50,MiB | 就绪 P50,s | 批量就绪速率,台/s |
-|---:|---:|---:|---:|
-| 1 | 92.93 | 3.807 | 0.261 |
-| 2 | 178.00 | 3.789 | 0.525 |
-| 4 | 342.96 | 4.383 | 0.901 |
-
-每档一次预热、五个测量批次。guest 为 128 MiB/一 vCPU;每个 Worker 及其子进程限制为 512 MiB/0.5 核,Controller 为 256 MiB/0.25 核,零 swap。共享 Linux/KVM 宿主使用预备最小输入和 debug 制品,其他宿主负载未停止。就绪包含提交 CLI/HTTP、持久化、调度与 VM 启动。内存是全部 guest 就绪时互不重叠服务 cgroup 之和,不是启动峰值。图中为观察范围,不是置信区间。这些观察不能证明生产容量、尾延迟、共享工作集收益或当前 daemon 性能。
-
-## 历史 Controller 成本 {#controller}
-
-| 保留记录 | 索引计数 P50,ns | 全扫描参考 P50,ms | 进程与 ID fixture RSS,MiB | 日志,MiB | 热回放,s |
-|---:|---:|---:|---:|---:|---:|
-| 1,000 | 202.83 | 0.068 | 12.13 | 1.93 | 0.079 |
-| 10,000 | 286.78 | 5.254 | 70.59 | 19.33 | 0.388 |
-| 100,000 | 129.40 | 20.789 | 658.82 | 193.25 | 1.744 |
-| 1,000,000 | 169.47 | 134.204 | 6,540.58 | 1,932.55 | 16.090 |
-
-归档 `controller-indexes-20261005-v3-history-*` 每档使用一个 release 进程、一个 CPU、NVMe 和热回放。只有一个 ready 记录,其余为已取消历史,不执行 guest 或 HTTP 压测。计数使用二十个查询样本,每样本一百次索引调用;RSS 与回放每档只有一次观察。RSS 含 ID fixture 和分配器留存。热回放不包含 Worker 对账或冷磁盘恢复。全扫描是算法参考,不是另一 Controller 制品的吞吐。不能与历史 benchmark 中独立的后续历史批次合并。
-
-## 证据边界 {#limits}
-
-就绪和查询观察仍是冻结实现的历史描述,不提供当前优化优先级、daemon 容量建议或调度系统/运行时排名。本机[容量](../benchmarks/density.md)和[VM 内存](../benchmarks/vm-memory/index.md)拥有独立实验对象与保留证据;单 VM 内存回收不能证明并发密度。[退役计划](cluster-benchmark-plan.md)区分旧提案与已测结论。
-
-## 保留证据,不提供活动复现 {#reproduce}
-
-`cluster_scalability.py`、`cluster_worker.py`、`controller_history.py`、专属测试、`plot_cluster_scalability.py` 和 `publish_controller_history.py` 已删除。退役 scheduler example 没有当前构建/运行/发布命令。原日志、样本、manifest 和冻结 harness 保留在本地 `.data/`;保留副本是归档,不是活动入口。删除旧 crate measurements 不授权改写 receipt 或将旧测量归于 daemon 源码。
-
-历史图表输入记录于 `docs/src/assets/benchmarks/.data/cluster-scalability-20261005/`:`vm.tsv`、`vm-summary.csv`、`controller-summary.csv`、`controller-provenance.tsv`、`manifest.tsv` 和 `setup-failure.tsv`。这些是本地来源位置,不是站点下载链接。[运行手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/pvisor/README.md)记录退役范围与独立活动 native 探针。
diff --git a/docs/src/zh/design/daemon/admission.md b/docs/src/zh/design/daemon/admission.md
deleted file mode 100644
index db2a4586..00000000
--- a/docs/src/zh/design/daemon/admission.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# 本机 Sandbox 准入
-
-创建原生 VM 前,限制单机已接受 sandbox 的资源总量。Daemon 按硬限制之和准入,不排队、不选择主机,也不从低 RSS 样本推断可用容量。
-
-## 请求校验 {#model}
-
-创建必须在 `image.uri` 提供本机 prepared-image key、非空 argv,以及只含 `cpu` 和 `memory` 的 `resourceLimits`。CPU 接受整数/小数核或 millicore;内存接受字节及支持的十进制/二进制后缀。资源量必须为正、可精确表示,并检查溢出。
-
-```json
-{
- "image": {"uri": "prepared-agent-1.1.0"},
- "entrypoint": ["sleep", "600"],
- "resourceLimits": {"cpu": "500m", "memory": "256Mi"},
- "timeout": 600,
- "metadata": {"purpose": "local-example"}
-}
-```
-
-这是请求格式示例,不是已验证镜像配方。Manifest `entrypoint` bootstrap 必须监督这些参数及所需服务,合同见[运维](operations.md#image-contract)。创建期间不拉取镜像。
-
-可选 platform 必须与本机 Linux 架构一致。不支持的 snapshot/template、resource requests、network policy、credential proxy、secure access、volumes、镜像认证、lifecycle hooks 和非空 extensions 在原生创建前失败。环境与 metadata map 有界且经过校验。
-
-## 容量记账 {#admission}
-
-| 边界 | 准入规则 |
-| --- | --- |
-| Sandbox 数 | Registry 记录数不得超过 `max_sandboxes` |
-| CPU | 全部记录的 `cpu_millis` 与新请求之和不超过配置容量 |
-| 内存 | 全部记录的 `memory_bytes` 与新请求之和不超过配置容量 |
-
-串行的持久插入构成预留屏障,并发创建不能重复消费容量。拒绝返回 `429 CAPACITY_EXCEEDED`,不会生成等待执行的分配。没有租户配额或经鉴权的逐租户资源账户。
-
-Paused、Terminated、Failed 和不确定记录保留完整 CPU/内存/数量记账,直到显式删除,或失败创建已确认清理。Pause **不释放**逻辑 CPU。原生删除及不存在确认先于持久记录移除;未知清理不能形成可复用容量。
-
-## 实际控制与物理内存 {#reservations}
-
-要求 Linux x86_64、可用 `/dev/kvm`、可信绝对路径,以及可写、已委派且启用 CPU/memory/PID controller 与 `cgroup.kill` 的 cgroup v2 层级。前置检查验证真实 controller 写入和 KVM API;没有 host、OCI 命令或 registry-pull 降级。
-
-原生 supervisor 在独立、脱离 daemon 生命周期的子进程中嵌入 `pvisor::PVisor`,只配置 `VmExecutor` 并持有 RunHandle。Sandbox cgroup 限制整个 supervisor/VMM/helper 树:总 CPU 速率 **10–8000 millicores**、硬内存、零 swap、`pids.max=512` 与 group OOM。vCPU 数按 quota 向上取整(最多 8),guest RAM 向下取整到 MiB;硬内存上限还包含宿主侧开销。完整限制/就绪检查保留在 create、Inspect 和 resume;端点解析认证 live Running 状态并检查删除屏障,不为每次数据请求重复完整 health/cgroup 检查。见[服务访问](lifecycle.md#endpoints)。Paused、Failed 和不确定记录继续保守预留资源。
-
-启动 callback 在 owner 锁内检查 started/删除/tombstone marker,通过预先打开的 `cgroup.procs` FD 在 **exec 之前**加入身份绑定的 cgroup。Supervisor 启动时核验成员关系,不迁移已运行的 Tokio 进程;supervisor/Tokio 分配与后续 VM/helper 子进程均计入 sandbox 预算。直接在该 cgroup 外调用隐藏命令会失败关闭。
-
-逻辑准入总量、逐 supervisor/VM 树已安装限制和全节点物理占用是不同量。Daemon、helper、缓存及宿主需要 sandbox 限制之外的余量。没有隐式 CPU/RAM 超卖、基于压力的准入或已测量的全节点物理预算。原生[共享工作集](shared-working-set.md)不授权降低 daemon 预留。
-
-校验与资源算术属于 `daemon/models.rs`,串行预留插入属于 `daemon/mod.rs`,原生 KVM/cgroup 前置检查与控制属于 `runtime.rs`。
diff --git a/docs/src/zh/design/daemon/index.md b/docs/src/zh/design/daemon/index.md
index 6460e183..4145e70a 100644
--- a/docs/src/zh/design/daemon/index.md
+++ b/docs/src/zh/design/daemon/index.md
@@ -19,23 +19,88 @@
Runtime trait 只有一个实现:VM-only NativeRuntime。独立 supervisor 嵌入 `pvisor::PVisor`,只配置 VmExecutor,跨 daemon 重启保留 RunHandle。没有 host/OCI/pull 降级。可执行程序的 `serve` 命令使用必需的 `--images-dir`/`--cgroup-root` 构造 NativeRuntime;同步内部 VM 派发先于 Tokio,隐藏 supervisor 命令负责 supervisor 派发。见[运维](operations.md#deployment)。
-## 创建与访问 {#task-flow}
+职责收敛的原则是为每种本机资源明确所有者,而不是把所有服务合并进 daemon 进程:sandbox 生命周期、原生不可变 backing 和不可丢失的活动 RAM 有不同权威与故障边界。同包发布、统一启动入口或更少端口不能补齐缺失的 runtime 适配器,也不建立更快启动、更低内存或更高密度。接入新路径前先定义获取、取消、终止与 pin 释放合同,并通过固定预算测量评估;职责收敛不建立 live-VM 接管、共享 cold-pool 仲裁、自动 node 获取或密度优势。
-1. 校验镜像、argv、环境、metadata、CPU/内存硬限制与可选 TTL。在准入前拒绝不支持的控制。
-2. 串行更新 registry 时检查本机容量,持久写入随机 `sb-*` 身份、预留与 `Pending` 记录。
-3. 持久化原生 preparation/identity,安装身份绑定的 cgroup 限制,在 exec 前将子进程放入该 cgroup,启动独立 supervisor,验证已确认的 live VM 控制与真实服务就绪。
-4. 原生创建成功后才持久化 `Running`。失败创建的清理已确认时释放记录;清理不确定时保留身份与预留。
-5. 通过 daemon 解析支持的服务端点。查询对账原生状态;删除先持久化意图,确认原生对象不存在后才释放容量。
+## 准入与容量记账 {#admission}
-这是 sandbox 管理,不是任务/结果协议。私有运行时记录将 generation 绑定到原生 Run/Attempt ID,但 `sb-*` 不是公开 Job ID,API 不暴露 Job review、checkpoint 或 Run Bundle 导出。
+创建原生 VM 前,限制单机已接受 sandbox 的资源总量。Daemon 按硬限制之和准入,不排队、不选择主机,也不从低 RSS 样本推断可用容量。
+
+创建必须在 `image.uri` 提供本机 prepared-image key、非空 argv,以及只含 `cpu` 和 `memory` 的 `resourceLimits`。CPU 接受整数/小数核或 millicore;内存接受字节及支持的十进制/二进制后缀。资源量必须为正、可精确表示,并检查溢出。可选 platform 必须与本机 Linux 架构一致。不支持的 snapshot/template、resource requests、network policy、credential proxy、secure access、volumes、镜像认证、lifecycle hooks 和非空 extensions 在原生创建前失败。环境与 metadata map 有界且经过校验。
+
+```json
+{
+ "image": {"uri": "prepared-agent-1.1.0"},
+ "entrypoint": ["sleep", "600"],
+ "resourceLimits": {"cpu": "500m", "memory": "256Mi"},
+ "timeout": 600,
+ "metadata": {"purpose": "local-example"}
+}
+```
+
+这是请求格式示例,不是已验证镜像配方;创建期间不拉取镜像。
+
+| 边界 | 准入规则 |
+| --- | --- |
+| Sandbox 数 | Registry 记录数不得超过 `max_sandboxes` |
+| CPU | 全部记录的 `cpu_millis` 与新请求之和不超过配置容量 |
+| 内存 | 全部记录的 `memory_bytes` 与新请求之和不超过配置容量 |
+
+串行的持久插入构成预留屏障,并发创建不能重复消费容量。拒绝返回 `429 CAPACITY_EXCEEDED`,不会生成等待执行的分配。没有租户配额或经鉴权的逐租户资源账户。Paused、Terminated、Failed 和不确定记录保留完整 CPU/内存/数量记账,直到显式删除,或失败创建已确认清理。Pause **不释放**逻辑 CPU。
+
+逻辑准入总量、逐 supervisor/VM 树已安装限制和全节点物理占用是不同量。Daemon、helper、缓存及宿主需要 sandbox 限制之外的余量。没有隐式 CPU/RAM 超卖、基于压力的准入或已测量的全节点物理预算。原生[共享工作集](shared-working-set.md)不授权降低 daemon 预留。
+
+## 实际控制与物理内存 {#reservations}
+
+平台前提(Linux x86_64、`/dev/kvm`、委派的 cgroup v2 层级)与检查方式见[运维指南的前提条件](../../guides/daemon/index.md#prerequisites)。
+
+原生 supervisor 在独立、脱离 daemon 生命周期的子进程中嵌入 `pvisor::PVisor`,只配置 `VmExecutor` 并持有 RunHandle。Sandbox cgroup 限制整个 supervisor/VMM/helper 树:总 CPU 速率 **10–8000 millicores**、硬内存、零 swap、`pids.max=512` 与 group OOM。vCPU 数按 quota 向上取整(最多 8),guest RAM 向下取整到 MiB;硬内存上限还包含宿主侧开销。完整限制/就绪检查保留在 create、Inspect 和 resume;端点解析认证 live Running 状态并检查删除屏障,不为每次数据请求重复完整 health/cgroup 检查。
+
+启动 callback 在 owner 锁内检查 started/删除/tombstone marker,通过预先打开的 `cgroup.procs` FD 在 **exec 之前**加入身份绑定的 cgroup。Supervisor 启动时核验成员关系,不迁移已运行的 Tokio 进程;supervisor/Tokio 分配与后续 VM/helper 子进程均计入 sandbox 预算。直接在该 cgroup 外调用隐藏命令会失败关闭。
+
+## 生命周期控制 {#control}
+
+报告控制完成或释放资源前,确认本机原生状态。Daemon 按 sandbox 串行执行操作,不同 sandbox 的操作可以独立推进。
+
+| 操作 | 持久/原生顺序 | 响应 |
+| --- | --- | --- |
+| Create | 持久化 `Pending` 与预留 → 创建/启动 → 核对配置及服务就绪 → 持久化 `Running` | 202 JSON |
+| Pause | 查询 → 持久化 `Pausing` → 已确认的 vCPU pause → 确认 Paused → 持久化 `Paused` | 202 空体 |
+| Resume | 查询 → 持久化 `Resuming` → 已确认的 vCPU resume 与就绪 → 确认 Running → 持久化 `Running` | 202 空体 |
+| Delete | 持久化 `Stopping` → 确认原生对象不存在并独占 owner 锁 → 发布 tombstone → 回收 cgroup/私有 run 存储 → 确认 Missing → 持久移除 registry 记录 | 204 |
+
+Pause/resume 在已认证的原生确认回复中返回 live 状态;daemon 消费该结果,不再发起第二次控制后 Inspect。已观察到目标状态时,可以不重复原生控制而返回成功;原生错误不能视为控制成功。已接受生命周期操作运行于自持有的异步任务,HTTP 断开不会取消它。丢失 create 响应不构成幂等重试合同;盲目重提可能创建另一个 sandbox。
+
+私有 IPC 校验同 UID peer、owner、sandbox ID、generation 与秘密 token;持久身份绑定 boot ID 和 cgroup device/inode。ID 不复用、不重新启动。IPC 丢失表示不确定,不是 Missing 或清理证据。持久删除意图与 supervisor 独占锁阻止迟到启动;清理使用身份绑定的 `cgroup.kill`,不保存 PID 或按 PID kill,确认 cgroup 为空且 owner 锁释放后才释放容量。同一 boot 下没有持久 tombstone 证据的 cgroup 被替换或丢失不证明对象不存在。
+
+清理使用所有权绑定,不依赖镜像/启动校验;rootfs/firmware 已移除不妨碍清理。持久 tombstone 支持重试中断的回收,最终只保留最小 ID 屏障。清理错误保留预留。见[存储](storage.md#gc)。
+
+## 过期 {#expiration}
+
+省略/null timeout 表示手动清理。TTL 至少 60 秒,并受配置上限约束(默认一天,配置最大一年)。续期提供上限以内、未来的 RFC3339 时间;已有截止时间必须延长,已过期或不可续期状态会被拒绝。
+
+维护每秒扫描一次,最多并发八个清理任务。清理在与续期相同的锁内重新检查过期,陈旧扫描不能删除已经续期的 sandbox。待删除意图在清理失败后保留并重试。
+
+TTL 是尽力清理,不是硬执行截止时间。慢原生命令、上传/等待响应头及同 sandbox 控制会延迟删除。过期后拒绝新代理请求;已建立响应流没有总超时。Daemon 停机期间维护停止,更强截止要求需独立宿主监督。
+
+## 服务访问与并发 {#endpoints}
+
+只发布 execd 44772 和 egress 18080 端口。端点发现与每次数据请求的端点解析都会认证 live supervisor,要求当前 RunHandle 为 Running,检查删除屏障并解析当前发布,不信任持久 observation 缓存。发现返回 daemon 路由的 authority,不公开 supervisor loopback 地址。解析不会为每次数据请求重复服务健康探测或完整 cgroup 额度对账。Create、Inspect 和 resume 保留完整配置/就绪检查;上游连接失败由 API adapter 处理,不作为就绪证据。代理建立连接与控制/删除共用生命周期锁,避免连接期间由 daemon 管理的删除/端口复用。
+
+代理流式转发真实上游 command/file/health/metrics 流量,包括 multipart 和 SSE。上传加等待响应头限制为 120 秒,已建立响应没有总超时。不支持 WebSocket、CONNECT 和任意应用端口。流量/输出配额属于上游服务。
## 并发与故障边界 {#documents}
[Registry commit 锁](storage.md#commit)串行化容量检查与持久修改;每个 sandbox 的生命周期锁排序控制操作和代理建连。慢 VM 操作不持有全局运行时 mutex,让无关 sandbox 继续推进,同时防止两个创建请求重复消费预留,或建连与 daemon 管理的删除发生竞争。
-持久意图和 live 观察具有不同权威。原生删除前先持久化 `Stopping`,确认对象不存在后才释放容量。IPC 或确认回复丢失时保留待对账工作,不能据此启动替代 VM 或复用容量。[只重启 daemon](state-and-recovery.md#reconcile)会使用相同归属状态重连仍存活的 supervisor;宿主重启则丢失 live VM。
+持久意图和 live 观察具有不同权威。原生删除前先持久化 `Stopping`,确认对象不存在后才释放容量。IPC 或确认回复丢失时保留待对账工作,不能据此启动替代 VM 或复用容量。[只重启 daemon](storage.md#reconcile)会使用相同归属状态重连仍存活的 supervisor;宿主重启则丢失 live VM。
+
+保守预留用利用率换取明确的清理记账:Paused、Failed 和不确定记录在确认移除前持续计费。低 RSS 与原生缓存共享不会减少预留;准入和物理工作集记账仍然独立。
+
+## 独立执行语义 {#integration}
+
+原生 pause/resume 通过 RunHandle 控制同一 Attempt 的 live vCPU,不是 cgroup freeze、内存 offload、checkpoint/restore 或重建 VM。准入记账保留。Execd 转发不是 Gateway 路由、捕获或推理空闲 CPU 释放。
-保守预留用利用率换取明确的清理记账:Paused、Failed 和不确定记录在确认移除前持续计费。低 RSS 与原生缓存共享不会减少预留;[准入](admission.md#reservations)和物理工作集记账仍然独立。
+普通 Job 保持独立的[checkpoint/fork 语义](../execution-model.md)。Daemon 不能 stage/apply 文件、恢复原生 VM 状态、获取 node backing 或协调模型响应。接入这些路径需要显式适配器及生命周期/证据合同,不能靠重命名已退役的分布式控制完成。
## 兼容性与证据 {#invariants}
@@ -43,4 +108,4 @@ Runtime trait 只有一个实现:VM-only NativeRuntime。独立 supervisor 嵌
运行时已接入原生 VM 执行。Stage/apply、checkpoint/fork 和 offload API、Gateway 推理等待协调与自动 node 资源获取未实现。旧 Cluster 结果不验证 daemon SDK 兼容、性能或密度,也没有全节点物理内存收益证据。
-实现归属:`crates/pvisor-daemon/src/daemon/{models,store,mod,api}.rs`、`runtime.rs` 和 `main.rs`。已退役 Cluster 实现不属于该架构。
+实现归属:`crates/pvisor-daemon/src/daemon/{models,store,mod,api}.rs`、`crates/pvisor-daemon/src/runtime.rs` 和 `crates/pvisor-daemon/src/main.rs`。校验与资源算术属于 `daemon/models.rs`,串行预留插入与生命周期编排属于 `daemon/mod.rs`,原生 KVM/cgroup 前置检查与控制属于 `runtime.rs`,流式转发属于 `daemon/api.rs`。已退役 Cluster 实现不属于该架构。
diff --git a/docs/src/zh/design/daemon/lifecycle.md b/docs/src/zh/design/daemon/lifecycle.md
deleted file mode 100644
index 046f2bfc..00000000
--- a/docs/src/zh/design/daemon/lifecycle.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Sandbox 生命周期
-
-报告控制完成或释放资源前,确认本机原生状态。Daemon 按 sandbox 串行执行操作,不同 sandbox 的操作可以独立推进。
-
-## 创建与控制 {#control}
-
-| 操作 | 持久/原生顺序 | 响应 |
-| --- | --- | --- |
-| Create | 持久化 `Pending` 与预留 → 创建/启动 → 核对配置及服务就绪 → 持久化 `Running` | 202 JSON |
-| Pause | 查询 → 持久化 `Pausing` → 已确认的 vCPU pause → 确认 Paused → 持久化 `Paused` | 202 空体 |
-| Resume | 查询 → 持久化 `Resuming` → 已确认的 vCPU resume 与就绪 → 确认 Running → 持久化 `Running` | 202 空体 |
-| Delete | 持久化 `Stopping` → 确认原生对象不存在并独占 owner 锁 → 发布 tombstone → 回收 cgroup/私有 run 存储 → 确认 Missing → 持久移除 registry 记录 | 204 |
-
-Pause/resume 在已认证的原生确认回复中返回 live 状态;daemon 消费该结果,不再发起第二次控制后 Inspect。Resume 确认包含就绪及执行约束检查。确认丢失或状态不符时保留持久转换意图以供对账,不证明控制尚未生效。
-
-已观察到目标 pause/resume 状态时,可以不重复原生控制而返回成功。原生错误不能视为控制成功。已接受生命周期操作运行于自持有的异步任务,HTTP 断开不会取消它。丢失 create 响应不构成幂等重试合同;盲目重提可能创建另一个 sandbox。
-
-私有 IPC 校验同 UID peer、owner、sandbox ID、generation 与秘密 token;持久身份绑定 boot ID 和 cgroup device/inode。ID 不复用、不重新启动。IPC 丢失表示不确定,不是 Missing 或清理证据。持久删除意图与 supervisor 独占锁阻止迟到启动;清理使用身份绑定的 `cgroup.kill`,不保存 PID 或按 PID kill,确认 cgroup 为空且 owner 锁释放后才释放容量。同一 boot 下没有持久 tombstone 证据的 cgroup 被替换或丢失不证明对象不存在。
-
-清理使用所有权绑定,不依赖镜像/启动校验;rootfs/firmware 已移除不妨碍清理。持久 tombstone 支持重试中断的 cgroup/私有存储回收,最终只保留最小 ID 屏障。清理错误保留预留。见[存储](storage.md#gc)。
-
-## 过期 {#expiration}
-
-省略/null timeout 表示手动清理。TTL 至少 60 秒,并受配置上限约束(默认一天,配置最大一年)。续期提供上限以内、未来的 RFC3339 时间;已有截止时间必须延长,已过期或不可续期状态会被拒绝。
-
-维护每秒扫描一次,最多并发八个清理任务。清理在与续期相同的锁内重新检查过期,陈旧扫描不能删除已经续期的 sandbox。待删除意图在清理失败后保留并重试。
-
-TTL 是尽力清理,不是硬执行截止时间。慢原生命令、上传/等待响应头及同 sandbox 控制会延迟删除。过期后拒绝新代理请求;已建立响应流没有总超时。Daemon 停机期间维护停止,更强截止要求需独立宿主监督。
-
-## 服务访问与并发 {#endpoints}
-
-只发布 execd 44772 和 egress 18080 端口。端点发现与每次数据请求的端点解析都会认证 live supervisor,要求当前 RunHandle 为 Running,检查删除屏障并解析当前发布,不信任持久 observation 缓存。发现返回 daemon 路由的 authority,不公开 supervisor loopback 地址。解析不会为每次数据请求重复服务健康探测或完整 cgroup 额度对账。Create、Inspect 和 resume 保留完整配置/就绪检查;上游连接失败由 API adapter 处理,不作为就绪证据。代理建立连接与控制/删除共用生命周期锁,避免连接期间由 daemon 管理的删除/端口复用。外部操作运行时不在此协调范围内。
-
-代理流式转发真实上游 command/file/health/metrics 流量,包括 multipart 和 SSE。上传加等待响应头限制为 120 秒,已建立响应没有总超时。不支持 WebSocket、CONNECT 和任意应用端口。流量/输出配额属于上游服务。
-
-## 独立执行语义 {#integration}
-
-原生 pause/resume 通过 RunHandle 控制同一 Attempt 的 live vCPU,不是 cgroup freeze、内存 offload、checkpoint/restore 或重建 VM。准入记账保留。Execd 转发不是 Gateway 路由、捕获或推理空闲 CPU 释放。
-
-普通 Job 保持独立的[checkpoint/fork 语义](../execution-model.md)。Daemon 不能 stage/apply 文件、恢复原生 VM 状态、获取 node backing 或协调模型响应。接入这些路径需要显式适配器及生命周期/证据合同,不能靠重命名已退役的分布式控制完成。
-
-生命周期编排属于 `daemon/mod.rs`,原生控制/就绪属于 `runtime.rs`,流式转发属于 `daemon/api.rs`。
diff --git a/docs/src/zh/design/daemon/operations.md b/docs/src/zh/design/daemon/operations.md
index 621b6610..3ad3f149 100644
--- a/docs/src/zh/design/daemon/operations.md
+++ b/docs/src/zh/design/daemon/operations.md
@@ -4,7 +4,7 @@
## 部署 {#deployment}
-要求 Linux x86_64、可用 `/dev/kvm`、可信绝对路径,以及可写、已委派且启用 CPU/memory/PID controller 与 `cgroup.kill` 的 cgroup v2 层级。前置检查验证真实 controller 写入和 KVM API;没有 host、OCI 命令或 registry-pull 降级。
+平台前提(Linux x86_64、`/dev/kvm`、委派的 cgroup v2 层级)与检查方式见[运维指南的前提条件](../../guides/daemon/index.md#prerequisites)。
将 `OPEN_SANDBOX_API_KEY` 设置为至少 32 字节的受保护随机秘密,不放入 argv。
@@ -24,15 +24,13 @@ pvisor-daemon serve \
重启保持状态与运行时配置兼容。非 loopback 暴露前在可信反向代理终止 TLS。`--public-endpoint` 设置外部路由可达的 host:port authority;通配或临时端口监听必须提供它。自动端点发布未实现。
-运行时路径使用绝对路径,daemon 重启时保持不变。状态路径保持短,例如 `/run/user/1000/pvd`:逐 sandbox 的 `control.sock` 必须短于 104 字节,vsock Unix socket 也有路径长度限制。保留状态;此 `/run` 示例不保证跨注销/重启持久化,VM 不能跨宿主重启存活。`/sys/fs/cgroup/pvd` 必须是真实委派层级,不能是普通目录。
+运行时与状态路径的绝对路径、长度与持久性约束见[运维指南的安装与启动](../../guides/daemon/index.md#install)。
-版本 1 中已有记录的 `sandboxes.json` 若缺少原生 `owner.json` marker,会在既有 store 独占锁内被拒绝:它可能仍持有活动 Podman 容器。使用全新原生状态并保留/清理旧部署,或通过旧 Podman daemon 删除全部 sandbox、确认清理后,再用已清空的 registry 切换后端。不要删除 registry 条目、预留或所有权状态,也不要伪造原生 marker 绕过检查。原生 daemon 不会把这些容器接管为 Missing 或静默释放其预留。
-
-v2 header 缺少 `owner.json` 时也会被拒绝,即使它按设计使用空 `sandboxes` map。原生 marker、header 与私有 `records/` 树须一同保留;见[存储迁移与激活](storage.md#migration)。
+已有记录的 v1 registry 或 v2 header 缺少原生 `owner.json` marker 时拒绝启动,即使 map 为空;它可能仍持有活动 Podman 容器。保留原始归属状态,使用全新原生状态或经旧 Podman daemon 清理后切换,不要删除记录/预留或伪造 marker。拒绝与迁移规则见[存储](storage.md#migration)。
## 预制镜像合同 {#image-contract}
-镜像是可信本机 `images_dir/.json` manifest,不是 registry reference。字段包括绝对路径的独立 Linux `rootfs`(不能是宿主 `/` 或与 daemon 状态重叠)、绝对路径的 guest bootstrap `entrypoint` argv、可选 `cmd`、可选 `env` 与可选绝对路径 firmware `library_dir`。请求的工作负载 argv(为空则使用 `cmd`)追加到 `entrypoint`,请求 env 覆盖 manifest env,不继承宿主环境,也不经 shell 插值。
+镜像 manifest 的字段与环境语义见[运维指南的前提条件](../../guides/daemon/index.md#prerequisites)。
长期运行的 guest bootstrap 必须监督工作负载、真实 OpenSandbox 1.1.0 execd 与 egress,自行初始化/鉴权服务、转发信号并回收子进程。它必须在 guest **CID 3** 的 **44772/18080** 端口提供字节透明的 AF_VSOCK listener,桥接真实服务。Supervisor 的 loopback TCP 发布经私有 Unix socket 与原生 vsock 转发连接 guest。普通 rootfs 或只运行 sleep 的进程不够。
@@ -77,4 +75,4 @@ Bootstrap 与镜像配方**未提供,也未经端到端验证**。旧容器的
## 证据范围 {#validation}
-源码测试覆盖 fake-runtime 准入/生命周期/重启/TTL、HTTP 鉴权/schema/过滤/端点及纯运行时解析/argv,不建立原生隔离、SDK 端到端兼容或密度收益。本次文档修改没有运行构建、测试、原生 sandbox 或 benchmark。旧分布式 Cluster gate 和测量不验证该 daemon。
+源码测试覆盖 fake-runtime 准入/生命周期/重启/TTL、HTTP 鉴权/schema/过滤/端点及纯运行时解析/argv,不建立原生隔离、SDK 端到端兼容或密度收益。构建、测试、原生 sandbox 和 benchmark 都还没有验证当前 daemon。旧分布式 Cluster gate 和测量不验证该 daemon。
diff --git a/docs/src/zh/design/daemon/responsibility-convergence.md b/docs/src/zh/design/daemon/responsibility-convergence.md
deleted file mode 100644
index e919fe21..00000000
--- a/docs/src/zh/design/daemon/responsibility-convergence.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# 服务职责收敛
-
-为每种本机资源明确所有者,减少重复管理,而不是把所有服务合并到 daemon 进程。Sandbox 生命周期、原生不可变 backing 和不可丢失的活动 RAM 有不同权威与故障边界。
-
-## 当前职责 {#roles}
-
-| 职责 | 所有者 | 与 daemon 的关系 |
-| --- | --- | --- |
-| Sandbox 准入、意图、过期、端点 | `pvisor-daemon` | 由 VM-only NativeRuntime 实现,已接入可执行入口/CLI |
-| Job/Attempt 生命周期、暂存、Gateway、原生 VM 检查点 | `pvisor` Session/执行器 | Supervisor 嵌入 VM 执行;不暴露 staging/Gateway/checkpoint API |
-| 不可变环境挂载与共享只读 RAM backing | 原生 node 资源服务(`pvisor/src/node.rs`) | 供原生调用方使用的运行时协议;没有 daemon acquire/release 适配器 |
-| 镜像准备、发布、服务和读取 | 独立 `pvisor-cache` 与运行时 cache 模块 | 独立程序、数据路径与预算;未并入 daemon |
-| 可选共享页与 session 引用 | `pvisor-daemon/src/memory_pool.rs` | `serve --memory-pool` 启动/复用独立 `memory-pool --directory DIR` 组件;默认关闭 |
-| 主机选择、工作流与重试策略 | 外部编排 | 不属于产品控制面 |
-
-Node 运行时协议供嵌入式原生调用方使用。它的身份是 image handle/digest 或 sealed RAM 身份/兼容性,不是 sandbox ID。一个连接 pin 一个 owner。同身份准备 single-flight,活动 owner/session/preparation 数量与 warming 有界。原生调用方不配置 node socket 时,仍可使用进程本地 registry。
-
-```mermaid
-flowchart TB
- Caller[Caller or external orchestration] --> Daemon[Sandbox daemon]
- Daemon --> Supervisor[Native pVisor VM supervisor]
- Supervisor --> Image[Prepared execd and egress image]
- Native[Native pVisor execution] --> Node[Native node resource service]
- Node --> Cache[Immutable cache and lazy reads]
- Node --> RAM[Shared read-only RAM backing]
- Daemon --> Pool[Optional detached shared-page pool]
- Supervisor --> Pool
-```
-
-刻意不画 daemon 到 node 的连接。同包发布、统一启动入口或更少端口不补齐缺失 runtime 适配器,也不建立更快启动、更低内存或更高有效工作密度。
-
-## 数据权威与重启边界 {#authority}
-
-| 对象 | 可以回收什么? | 故障边界 |
-| --- | --- | --- |
-| 可重新获取的镜像/decoded 块 | 有有效持久来源、未 pin 的热内容 | 命中不能替代发布授权 |
-| 活动只读 RAM/FUSE owner | 活动 pin 结束后的闲置 warming,不能回收活动挂载 | 持久来源不自动恢复 owner 故障后的 live VM |
-| 转移到 pool 的私有冷 RAM | 不能回收唯一剩余副本 | Session/pool 内容丢失可能使依赖 VM fail-stop |
-| 已发布 checkpoint/证据 | 仅通过各自保留与 GC roots 回收 | 原生 registry 保温不能授权删除 |
-| Daemon sandbox 记录 | 确认原生删除后 | 正常 daemon 关闭保留 supervisor/VM 与 registry |
-
-只重启 daemon 会保留独立原生 supervisor/VM 及绑定配置的池组件,不会恢复已失败的池或重建其活动页。重启 backing owner 或 cold pool 是另一种操作,不能承诺透明 session reconnect。原生 runner 回收前保持 pin;没有无损排空时,升级须等待依赖 VM 退出。不能从 metadata 文件恢复推断 live RAM 可重建。
-
-## 预算与并发 {#budget}
-
-原生 node 配置限制 owner、warm owner、session、preparation 和 retained cache payload。Payload counter 聚合内容块、分页 metadata 与 Linux decoded RAM,不含完整 metadata、scratch、外部引用和内核驻留。Daemon 池有独立、有界的页/对象/连接/引用预算,位于单个 sandbox cgroup 之外,不与 node cache 动态仲裁,也不等于整个进程上限;见[池预算](../../guides/daemon/index.md#memory-pool)。
-
-给可选缓存/预取分配预算前,先预留活动对象与恢复余量。压力下丢弃可牺牲 warming/可重新获取内容,或拒绝新准备,不删除唯一活动字节。慢 teardown 与 I/O 不持管理 map 锁;同身份串行仍须保留授权与兼容性检查。
-
-Daemon CPU/内存准入仍是 supervisor/VM 树硬限制的独立保守求和,不与原生 node/pool 形成联合物理内存记账。宿主 cgroup 监督与观察需覆盖服务及瞬时工作,而非只算工作负载。
-
-## 接入方向 {#migration}
-
-1. 退役旧分布式角色时,保留独立 owner 与故障范围。
-2. 为已有原生运行时接入 node 资源前,定义获取、私有写入状态、取消、原生终止和 pin 释放。
-3. 区分预留、物理共享页、可驱逐 payload 与不可丢失 RAM 后,再统一观察及可控预算。
-4. 明确重启/排空和数据保全合同后才考虑进程合并,并通过固定预算测量评估。
-
-职责收敛不建立 live-VM 接管、共享 cold-pool 仲裁、自动 node 获取或密度优势。原生资源正确性证据和旧 service 实验保留原范围,不是 daemon 验收结果。
-
-独立缓存提供 `prepare`、`publish`、`serve`、`list`、`stat`、`read`。Cache 和 node 协议的所有权与 daemon sandbox 生命周期分开。
-
-相关合同:[共享工作集](shared-working-set.md)、[状态与恢复](state-and-recovery.md)、[原生共享镜像存储](../shared-image-cache-storage.md)与[实验 pool](../memory-optimization/proof-of-concept.md)。
diff --git a/docs/src/zh/design/daemon/shared-working-set.md b/docs/src/zh/design/daemon/shared-working-set.md
index 7be86ed3..12a65082 100644
--- a/docs/src/zh/design/daemon/shared-working-set.md
+++ b/docs/src/zh/design/daemon/shared-working-set.md
@@ -41,7 +41,7 @@
物理共享页只计一次。共享成本随版本和访问模式改变,私有成本随执行数和写比例增长。分散访问与大量写入可以消除收益。文件 copy-up、传输块、read-ahead 与 COW 可能放大请求字节。
-逻辑预留、物理占用和可回收缓存分开。原生 node retained-payload 记账覆盖内容块、分页 metadata 和 decoded RAM,不含完整 metadata、scratch、外部引用或内核页。仍需内核上限和整组观察。这些机制不放宽 daemon 的[硬限制准入](admission.md)。
+逻辑预留、物理占用和可回收缓存分开。原生 node retained-payload 记账覆盖内容块、分页 metadata 和 decoded RAM,不含完整 metadata、scratch、外部引用或内核页。仍需内核上限和整组观察。这些机制不放宽 daemon 的[硬限制准入](index.md#admission)。
## 所有权与未来接入 {#integration}
@@ -67,4 +67,4 @@
Daemon 池与 node backing 恢复分开。物理池丢失会使依赖 VM 失败;sealed 压缩客户端保留已交付句柄的本地恢复并停止新发布;API 重启保留独立组件,但不能恢复已失败的池内容。见[启用、所有权和限制](../../guides/daemon/index.md#memory-pool)。
-相关设计:[职责收敛](responsibility-convergence.md)、[共享镜像存储](../shared-image-cache-storage.md)、[内存优化](../memory-optimization/index.md)与[实验冷 RAM pool](../memory-optimization/proof-of-concept.md)。
+相关设计:[Daemon 架构](index.md)、[共享镜像存储](../shared-image-cache-storage.md)、[内存优化](../memory-optimization/index.md)与[实验冷 RAM pool](../memory-optimization/proof-of-concept.md)。
diff --git a/docs/src/zh/design/daemon/state-and-recovery.md b/docs/src/zh/design/daemon/state-and-recovery.md
deleted file mode 100644
index 59cf113a..00000000
--- a/docs/src/zh/design/daemon/state-and-recovery.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# 本机状态与重启恢复
-
-重启使用相同私有状态目录和兼容运行时配置,保留原生归属及未解决的预留。已存状态是最近一次持久观察,不证明 VM 仍存活。
-
-## 权威与身份 {#authority}
-
-| 状态 | 权威 | 重启行为 |
-| --- | --- | --- |
-| Registry 版本与 owner UUID | Daemon 持久 registry | 校验并保留相同 owner |
-| Sandbox 身份、镜像/argv/env/metadata、资源、TTL 与端点 token | 持久记录 | 保留意图、访问身份与保守容量 |
-| Running/Paused/Terminated | 原生运行时观察 | 查询已登记对象,更新变化后的观察 |
-| `Stopping` | 持久删除意图 | 重试删除,查询不能覆盖它 |
-| 实际 VM 与服务就绪 | 原生 supervisor、VM 控制、内核 cgroup 与真实服务 | Registry 不能重建它们 |
-
-一个 daemon 独占锁定 `daemon.lock`。私有 IPC 校验同 UID peer、owner、sandbox ID、generation 与秘密 token;持久身份绑定 boot ID 和 cgroup device/inode。ID 不复用、不重新启动。IPC 丢失表示不确定,不是 Missing 或清理证据。持久删除意图与 supervisor 独占锁阻止迟到启动;清理使用身份绑定的 `cgroup.kill`,不保存 PID 或按 PID kill,确认 cgroup 为空且 owner 锁释放后才释放容量。同一 boot 下没有持久 tombstone 证据的 cgroup 被替换或丢失不证明对象不存在。
-
-版本 1 中已有记录的 `sandboxes.json` 若缺少原生 `owner.json` marker,会在既有 store 独占锁内被拒绝:它可能仍持有活动 Podman 容器。使用全新原生状态并保留/清理旧部署,或通过旧 Podman daemon 删除全部 sandbox、确认清理后,再用已清空的 registry 切换后端。不要删除 registry 条目、预留或所有权状态,也不要伪造原生 marker 绕过检查。原生 daemon 不会把这些容器接管为 Missing 或静默释放其预留。
-
-版本 2 header 缺少 `owner.json` 时也会被拒绝,即使 `sandboxes` map 为空:该 header 激活私有逐 sandbox 记录,不表示清单为空。恢复原始归属状态,不要自行制造 marker。见[存储激活与迁移](storage.md#migration)。
-
-## 启动对账 {#reconcile}
-
-1. 打开并校验私有 registry,拒绝损坏、超限或不兼容内容,不通过遗忘原生归属继续启动。
-2. 使用已持久 owner 构造运行时。只有 factory 接受该 owner 后才初始化/迁移存储:提交带 owner 信封的记录与 metadata,再原子激活 v2 header。激活前 v1 完整快照始终是权威。存储初始化后、绑定 API 前完成原生前置检查。
-3. 重试 `Stopping` 记录;持有各自生命周期锁查询其他已登记 sandbox。
-4. 将原生 Running/Paused/Stopped/Missing 映射为 `Running`/`Paused`/`Terminated`/`Failed`。缺失 sandbox 保持可见且预留资源,直到显式删除。
-5. 报告延后对账错误,不虚构清理成功。启动维护以重试过期/待删除对象。
-
-正常 daemon 关闭保留独立 supervisor/VM 与记录。重启重新连接私有 IPC,不重建 VM 或生成新 Attempt;IPC 丢失保留不确定状态。GET 对账,list 返回持久观察。启动不接管未知 VM,也不重新启动缺失/崩溃工作负载;宿主重启不能保留 live VM。
-
-清理独立于启动资源,校验持久 owner/ID/generation 与 boot/cgroup 绑定:不要求原 rootfs 或 firmware 目录仍存在,也不要求 guest argv/env/资源设置通过启动校验。证明原生对象不存在并取得 owner 锁后,持久发布 `tombstone.json`,删除空的所属 cgroup,回收私有 run 存储、live RAM backing、临时 overlay/spec、socket 与含秘密的 identity 记录及可能遗留的 observation 缓存。最小目录保留 tombstone、owner 锁和生命周期 marker,阻止 ID 复用。中断的回收从 tombstone 继续,包含 cgroup 已移除的情况;报错保留预留。同一 boot 下没有此持久证据的 cgroup 丢失/被替换仍不授权不存在结论。 见[存储](storage.md#gc)。
-
-## 不确定性与恢复 {#failures}
-
-| 故障 | 保留边界 | 操作 |
-| --- | --- | --- |
-| 创建失败,清理已确认 | 记录/预留已移除 | 再次请求前排查镜像/运行时 |
-| 创建清理不确定 | Failed 记录、错误中的 ID、完整预留 | 查询/删除该 ID,不盲目重提 |
-| 原生查询不可用 | 不虚构原生状态 | 修复运行时访问,再次查询 |
-| 删除失败或不存在状态未知 | 保留 `Stopping`、token/记录与预留 | 恢复运行时访问并重试 |
-| Registry 提交不确定 | Storage-failed 标记拒绝后续 registry 访问 | 保留状态,修复存储,重启对账 |
-| Daemon 停机超过 TTL | 停机期间无维护 | 独立终止要求由宿主监督落实 |
-
-Registry 是增量提交的本机清单,不是完整执行历史或业务副作用账本。版本 2 根据 owner/header 与已校验的逐 sandbox 记录重建清单;已激活的记录树损坏或不完整时不回退到 v1。重启不回滚外部调用、不恢复丢失 RAM,也不提供跨主机故障切换。自动一致备份/原生状态恢复未实现;复制活动目录或删除状态不是恢复流程。
-
-恢复路径属于 `daemon/mod.rs`,registry 校验与持久化属于 `daemon/store.rs`。见[存储](storage.md)与[运维](operations.md#runbook)。
diff --git a/docs/src/zh/design/daemon/storage.md b/docs/src/zh/design/daemon/storage.md
index 77874c43..9d68bf9a 100644
--- a/docs/src/zh/design/daemon/storage.md
+++ b/docs/src/zh/design/daemon/storage.md
@@ -1,7 +1,29 @@
-# Daemon 存储与回收
+# Daemon 存储、恢复与回收
在有界本机 registry 中保留 sandbox 持久意图。原生运行时持有逐 sandbox 私有 run 状态,预制服务拥有工作负载文件与流式输出。这些存储不是集中式 pVisor 证据仓库。
+重启使用相同私有状态目录和兼容运行时配置,保留原生归属及未解决的预留。已存状态是最近一次持久观察,不证明 VM 仍存活。
+
+## 权威与身份 {#authority}
+
+| 状态 | 权威 | 重启行为 |
+| --- | --- | --- |
+| Registry 版本与 owner UUID | Daemon 持久 registry | 校验并保留相同 owner |
+| Sandbox 身份、镜像/argv/env/metadata、资源、TTL 与端点 token | 持久记录 | 保留意图、访问身份与保守容量 |
+| Running/Paused/Terminated | 原生运行时观察 | 查询已登记对象,更新变化后的观察 |
+| `Stopping` | 持久删除意图 | 重试删除,查询不能覆盖它 |
+| 实际 VM 与服务就绪 | 原生 supervisor、VM 控制、内核 cgroup 与真实服务 | Registry 不能重建它们 |
+
+## 启动对账 {#reconcile}
+
+1. 打开并校验私有 registry,拒绝损坏、超限或不兼容内容,不通过遗忘原生归属继续启动。
+2. 使用已持久 owner 构造运行时。只有 factory 接受该 owner 后才初始化/迁移存储:提交带 owner 信封的记录与 metadata,再原子激活 v2 header。激活前 v1 完整快照始终是权威。存储初始化后、绑定 API 前完成原生前置检查。
+3. 重试 `Stopping` 记录;持有各自生命周期锁查询其他已登记 sandbox。
+4. 将原生 Running/Paused/Stopped/Missing 映射为 `Running`/`Paused`/`Terminated`/`Failed`。缺失 sandbox 保持可见且预留资源,直到显式删除。
+5. 报告延后对账错误,不虚构清理成功。启动维护以重试过期/待删除对象。
+
+正常 daemon 关闭保留独立 supervisor/VM 与记录。重启重新连接私有 IPC,不重建 VM 或生成新 Attempt;IPC 丢失保留不确定状态。GET 对账,list 返回持久观察。启动不接管未知 VM,也不重新启动缺失/崩溃工作负载;宿主重启不能保留 live VM。
+
## 私有 Registry {#metadata}
```text
@@ -24,7 +46,7 @@ Store 拒绝符号链接状态/记录目录,Unix 上打开 lock/registry 文
运行时状态另有私有 `owner.json`,逐 sandbox 的 `preparing.json`/`identity.json`、`run.json`(generation/Run/Attempt ID)、生命周期 marker、owner 锁、`control.sock`、`ports/` bridge 与 `run/` 原生存储(含 `live-ram` backing 和作为 supervisor `TMPDIR` 的 `tmp/` scratch);清理完成后只保留最小 tombstone/锁/marker 屏障,用于对账/清理,不是公开 stage/checkpoint/artifact API。
-原生运行时不写入 `observation.json` 缓存,也不以其作为存活证据。端点查询认证 live supervisor,并检查当前 Running 状态与删除屏障;完整就绪检查仍保留在 create、Inspect 和 resume。见[服务访问](lifecycle.md#endpoints)。
+原生运行时不写入 `observation.json` 缓存,也不以其作为存活证据。端点查询认证 live supervisor,并检查当前 Running 状态与删除屏障;完整就绪检查仍保留在 create、Inspect 和 resume。见[服务访问](index.md#endpoints)。
## 提交屏障 {#commit}
@@ -46,10 +68,25 @@ NativeRuntime 在迁移前拒绝缺少 `owner.json` 的非空 v1 状态;任何
原生移除前先持久化删除意图。只有确认原生对象不存在,才能持久移除记录并释放 CPU/内存/数量记账。不能为腾容量而随意驱逐待删除、不确定创建或原生缺失的 Failed 记录。
-清理独立于启动资源,校验持久 owner/ID/generation 与 boot/cgroup 绑定:不要求原 rootfs 或 firmware 目录仍存在,也不要求 guest argv/env/资源设置通过启动校验。证明原生对象不存在并取得 owner 锁后,持久发布 `tombstone.json`,删除空的所属 cgroup,回收私有 run 存储、live RAM backing、临时 overlay/spec、socket 与含秘密的 identity 记录及可能遗留的 observation 缓存。最小目录保留 tombstone、owner 锁和生命周期 marker,阻止 ID 复用。中断的回收从 tombstone 继续,包含 cgroup 已移除的情况;报错保留预留。同一 boot 下没有此持久证据的 cgroup 丢失/被替换仍不授权不存在结论。
+清理独立于启动资源,校验持久 owner/ID/generation 与 boot/cgroup 绑定:不要求原 rootfs 或 firmware 目录仍存在,也不要求 guest argv/env/资源设置通过启动校验。证明原生对象不存在并取得 owner 锁后,持久发布 `tombstone.json`,删除空的所属 cgroup,回收私有 run 存储、live RAM backing、临时 overlay/spec、socket 与含秘密的 identity 记录及可能遗留的 observation 缓存。
+
+最小目录保留 tombstone、owner 锁和生命周期 marker,阻止 ID 复用。中断的回收从 tombstone 继续,包含 cgroup 已移除的情况;报错保留预留。同一 boot 下没有此持久证据的 cgroup 丢失/被替换仍不授权不存在结论。
删除 sandbox 不撤销远端副作用,也不提供保留证据包。Sandbox 清理不删除外部预制的镜像 manifest/rootfs/firmware。Daemon API 没有 stage review/apply、产物保留/下载或外部对象 GC 协议。不要通过独立删除原生资源或 registry 状态进行恢复。
-原生不可变缓存/快照 store 保留各自的发布、完整性、pin 与 GC 合同,见[共享镜像存储](../shared-image-cache-storage.md)与[职责收敛](responsibility-convergence.md#authority)。Daemon 到 node 存储的桥接尚未实现。
+## 不确定性与恢复 {#failures}
+
+| 故障 | 保留边界 | 操作 |
+| --- | --- | --- |
+| 创建失败,清理已确认 | 记录/预留已移除 | 再次请求前排查镜像/运行时 |
+| 创建清理不确定 | Failed 记录、错误中的 ID、完整预留 | 查询/删除该 ID,不盲目重提 |
+| 原生查询不可用 | 不虚构原生状态 | 修复运行时访问,再次查询 |
+| 删除失败或不存在状态未知 | 保留 `Stopping`、token/记录与预留 | 恢复运行时访问并重试 |
+| Registry 提交不确定 | Storage-failed 标记拒绝后续 registry 访问 | 保留状态,修复存储,重启对账 |
+| Daemon 停机超过 TTL | 停机期间无维护 | 独立终止要求由宿主监督落实 |
+
+Registry 是增量提交的本机清单,不是完整执行历史或业务副作用账本。版本 2 根据 owner/header 与已校验的逐 sandbox 记录重建清单;已激活的记录树损坏或不完整时不回退到 v1。重启不回滚外部调用、不恢复丢失 RAM,也不提供跨主机故障切换。自动一致备份/原生状态恢复未实现;复制活动目录或删除状态不是恢复流程。
+
+原生不可变缓存/快照 store 保留各自的发布、完整性、pin 与 GC 合同,见[共享镜像存储](../shared-image-cache-storage.md)。Daemon 到 node 存储的桥接尚未实现。
-实现:`daemon/store.rs` 拥有逐记录发布、预算记账与 v1 激活,`daemon/mod.rs` 拥有预留与删除顺序。
+实现:`daemon/store.rs` 拥有逐记录发布、预算记账与 v1 激活,`daemon/mod.rs` 拥有预留、删除顺序与恢复路径。
diff --git a/docs/src/zh/design/decisions/0001-plan-and-evidence.md b/docs/src/zh/design/decisions/0001-plan-and-evidence.md
deleted file mode 100644
index 590290e8..00000000
--- a/docs/src/zh/design/decisions/0001-plan-and-evidence.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0001:计划不能证明控制已经安装 {#adr-0001}
-
-**状态:实现回填。** 记录现有合同,不据此推断维护者另行批准。
-
-**背景。** 启动前可以判断请求的策略如何落实,但执行器可能因权限、平台或启动失败而没有安装控制。
-
-**选项。** 可以让计划直接声明强制力,也可以等执行器返回实际观察。
-
-**当前选择。** 准入计划最高到 `Planned`;实际强制力由执行器观察提供。Run Bundle 同时保留请求、计划与观察,见[证据设计](../../concepts/capabilities-and-evidence.md)。
-
-**后果。** 自动化需要检查实际观察;平台适配器必须返回控制安装结果。任务结束或配置含有某个字段,都不能替代这份证据。
diff --git a/docs/src/zh/design/decisions/0002-capture-and-replay.md b/docs/src/zh/design/decisions/0002-capture-and-replay.md
deleted file mode 100644
index d2b7768c..00000000
--- a/docs/src/zh/design/decisions/0002-capture-and-replay.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0002:捕获与回放有各自的数据职责 {#adr-0002}
-
-**状态:实现回填。** 记录现有合同,不据此推断维护者另行批准。
-
-**背景。** 运行一个任务、记录模型通信、恢复 Agent 原生上下文,需要的协议和依赖不同。
-
-**选项。** 可以把所有协议放进执行核心,也可以通过独立组件交换明确的数据记录。
-
-**当前选择。** Gateway 负责模型通信捕获与路由;Replay 使用原生 Agent 轨迹和工具重执行;执行核心维护 Run 生命周期与共享记录。Gateway 使用可选 feature,Replay 有独立 crate 与命令。见[回放设计](../replay.md)。
-
-**后果。** 用户可以只使用执行与暂存。捕获日志与原生轨迹需要分别收集;新增 Agent 适配主要进入 Replay 的适配器边界。
diff --git a/docs/src/zh/design/decisions/0003-explicit-safe-executor.md b/docs/src/zh/design/decisions/0003-explicit-safe-executor.md
deleted file mode 100644
index afc1d3a5..00000000
--- a/docs/src/zh/design/decisions/0003-explicit-safe-executor.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0003:safe 表达要求,执行器选择保持显式 {#adr-0003}
-
-**状态:实现回填。** 记录现有合同,不据此推断维护者另行批准。
-
-**背景。** 用户可能为了速度、Linux 用户空间或内核隔离选择不同执行器,同时希望文件与网络策略得到落实。
-
-**选项。** safe 可以暗中改成某个执行器,也可以给所选执行器提出必须满足的要求。
-
-**当前选择。** `--safe` 配置暂存、文件访问和环境等设置,不替用户选择执行器;无法满足所需控制时拒绝启动。具体网络路径见[网络策略](../../guides/policies/network.md)。
-
-**后果。** 相同参数在不同机器上可能得到能力错误。解决方式是安装前置条件或显式选择满足要求的执行器;评审者从 Bundle 检查结果。
diff --git a/docs/src/zh/design/decisions/0004-human-semspec-approval.md b/docs/src/zh/design/decisions/0004-human-semspec-approval.md
deleted file mode 100644
index 3d8793ed..00000000
--- a/docs/src/zh/design/decisions/0004-human-semspec-approval.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0004:通过测试与批准产品承诺分别进行 {#adr-0004}
-
-**状态:现有贡献规则回填。** 记录现有合同,不据此推断维护者另行批准。
-
-**背景。** 测试通过说明一次验证成功,公开承诺还需要人判断覆盖范围与适用条件。
-
-**选项。** 可以自动批准所有通过的案例,也可以保留独立的人工审核步骤。
-
-**当前选择。** AI 和贡献者可以新增草案、修复实现和维护 runner 测试。`semspec approve`、`revoke`、真实 `REVIEWED.toml` 与 `.approved/` 快照由人工维护;不得为了 PASS 弱化已有检查或 xfail。见[测试与 semspec](../../community/testing.md)。
-
-**后果。** 评审同时看案例主张、验证结果和人工批准记录。绿色测试不会自动扩大支持范围。
diff --git a/docs/src/zh/design/decisions/0005-rust-vm-api.md b/docs/src/zh/design/decisions/0005-rust-vm-api.md
deleted file mode 100644
index 7c766901..00000000
--- a/docs/src/zh/design/decisions/0005-rust-vm-api.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 0005:将 VM 后端差异收敛到单一 Rust 运行时 {#adr-0005}
-
-**状态。** 实现回填;记录已实现的边界,不代表维护者另行批准了 ADR。
-
-**背景。** VM 配置、设备定制与快照逻辑分散在 pVisor 和多个 libkrun crate。C context、借用裸指针和公开后端结构使所有权与平台差异泄漏给调用方。
-
-**备选。** 保留外部 C context ABI 和独立 vendor 组件,或合并私有运行时模块并提供统一 Rust 契约。
-
-**当前选择。** `pvisor-vm` 统一编译核心模块。只有 `api` 对外公开;跨平台 struct 与 trait 定义全部公开方法签名,不包含条件编译或默认实现。私有适配器实现 trait。架构布局与虚拟化行为使用独立的内部 trait;调用方查询能力并接收明确的不支持错误。固件数据 ABI 与操作系统 FFI 保持私有。
-
-**迁移与后果。** Executor、shim、snapshot/checkpoint/pager、示例和 init 基准使用新 API。硬件/设备测试归入本 crate。静态内核打包归运行时负责。旧核心 crate 依赖和 VM 控制 C 函数移除;已有证据标识及快照序列化字段兼容。统一 API 不承诺跨架构恢复。`api_contract` 与 `repository_boundary` 检查边界;本机测试和目标平台编译检查提供不同证据。见[开发文档](../../community/development.md)和[运行时契约](https://github.com/deeplink-org/pvisor/blob/main/crates/pvisor-vm/README.md)。
diff --git a/docs/src/zh/design/decisions/0006-stage-snapshot.md b/docs/src/zh/design/decisions/0006-stage-snapshot.md
index 78fcf737..ed8a8031 100644
--- a/docs/src/zh/design/decisions/0006-stage-snapshot.md
+++ b/docs/src/zh/design/decisions/0006-stage-snapshot.md
@@ -25,4 +25,4 @@ stage 是逻辑状态,不等于仅复制 upper 目录。可写 workspace 也
固定 stage/RAM、增长 base,warm save/fork 不应遍历或复制不变 base;再测 stage 大小、条目数、大文件 copy-up 和 1/8/64 分支。保持分支独立、删除/metadata/hardlink、打开句柄、依赖 GC、损坏拒绝和发布失败的契约。100 ms 等预算需注明规模、预备、持久化与 first useful work,不是本记录承诺。
-运行时依旧遵循唯一 `api`、跨平台一致 trait/struct、私有后端实现;镜像解析、base pin 与 store 发布不进入 VMM。见[完整环境快照的当前实现](../environment-snapshot.md)、[OverlayCore](../overlayfs.md)和[ADR 0005](0005-rust-vm-api.md#adr-0005)。
+运行时依旧遵循唯一 `api`、跨平台一致 trait/struct、私有后端实现;镜像解析、base pin 与 store 发布不进入 VMM。见[完整环境快照的当前实现](../environment-snapshot.md)和[OverlayCore](../overlayfs.md)。
diff --git a/docs/src/zh/design/decisions/0007-shared-filesystem-service.md b/docs/src/zh/design/decisions/0007-shared-filesystem-service.md
deleted file mode 100644
index 967c8de4..00000000
--- a/docs/src/zh/design/decisions/0007-shared-filesystem-service.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# 0007:Host FUSE 与 virtio-fs 共用文件服务 {#adr-0007}
-
-**状态:实现回填。** 记录当前源码中的职责划分,不代表新增正式批准或性能结论。
-
-## 背景 {#context}
-
-Host 暂存通过宿主 FUSE 服务文件,VM 通过 guest virtio-fs 请求文件。分层查找、权限、copy-up、原像与 lazy lower 读取需要保持同一语义;inode、handle、凭据和队列完成则依赖各自协议入口。
-
-## 备选与选择 {#decision}
-
-可在两个适配器中分别维护文件语义,也可让 VM 请求再穿过宿主 FUSE,或直接调用共享文件服务。当前选择第三种:`pvisor-overlay-core::service::FilesystemService` 持有 OverlayCore,Host FUSE 和 VM virtio-fs 直接调用;本地文件与不可变镜像后端在服务中统一读取。
-
-服务接收文件操作、路径和 backing 身份,不接收 `fuser::Reply*`、virtqueue descriptor 或 guest RAM 指针。适配器仍拥有协议 inode/handle、权限转换、operation guard 与完成发布。VM 不需要中间 `/dev/fuse` 挂载。
-
-## 后果 {#consequences}
-
-文件语义只有一个实现,但两个入口仍有平台和并发差异。virtio-fs worker 持有 RAM lease 到 used-ring 发布,冻结需要排空在途 I/O;共享服务的内容读取不应持有整个协议 handle 表锁。lazy lower 的 copy-up 或完整导出仍可能物化此前未读内容,不能由接口复用推断端到端性能收益。
-
-## 实现与范围 {#implementation}
-
-源码入口是 `crates/pvisor-overlay-core/src/service.rs`、`crates/pvisor-overlayfs/src/fs.rs`、`crates/pvisor-vm/src/devices/virtio/fs/` 以及 `crates/pvisor/src/image/cache/backend.rs`、`direct.rs`、`lazy.rs`。当前 `pvisor-overlay-core` 尚未迁移到单一 `api` 入口;复用文件服务与 API 可见性迁移分别管理。
-
-请求路径、数据布局和已有测量范围见[文件系统子系统](../overlayfs.md#filesystem-service),映射生命周期见[VM 子系统](../vm-runtime.md#virtio)。
diff --git a/docs/src/zh/design/decisions/0008-host-guest-control-authority.md b/docs/src/zh/design/decisions/0008-host-guest-control-authority.md
deleted file mode 100644
index b712c247..00000000
--- a/docs/src/zh/design/decisions/0008-host-guest-control-authority.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# 0008:Host 与 Guest 控制权限分离 {#adr-0008}
-
-**状态:实现回填。** 记录当前协议与所有权边界,不据此扩大平台验证范围。
-
-## 背景 {#context}
-
-guest 需要报告状态、接收 directive 并参与 checkpoint 静默点;宿主调用方需要管理 Job、VM、stage 和 supervisor。两者的信任范围不同,guest 协作凭据不能获得宿主生命周期权限。
-
-## 备选与选择 {#decision}
-
-可以把宿主操作塞进 Guest `Hello`/`Sync` 协议,也可以分别定义端点、schema 和凭据。当前选择后者:Guest AgentCtl 保留工作负载协作,Host envelope 承载宿主类型化请求,端点所有者核对 Job/Attempt/generation 与权限。
-
-CLI Job listener 在同 UID 的私有权限根下接入请求,通过独立 ticket 与 worker 通道交接。daemon native supervisor 使用 Host envelope 加 owner/token,不借用 Guest token 或 CLI worker ticket。共享 Core 只定义 envelope 与校验;CLI DTO 和传输保留在对应实现。
-
-## 后果 {#consequences}
-
-Bundle 的 `agentctl` 状态仍表示 Guest 协作,不能作为 Host 授权回执。两个协议当前都为 version 1,也不能互换。CLI worker schema、包版本和 executable digest 共同决定内部兼容性;旧 listener/supervisor 需要按合同排空升级。
-
-Host `request_id` 提供关联,不提供所有命令的持久去重。超时或取消后先核对 Job 与效果。私有目录和同 UID peer 检查限定宿主信任边界,不隔离同 UID 的全部其他进程;macOS 身份、后代清理和真实 VM TUI 路径保留当前文档列出的验证缺口。
-
-## 实现与范围 {#implementation}
-
-源码入口:`crates/pvisor-core/src/host_protocol.rs`、`protocol.rs`;`crates/pvisor-cli/src/cli/host_service.rs`、`host_fds.rs`;`crates/pvisor/src/runtime/host_transport.rs`、`supervisor.rs`、`instance_control.rs`。
-
-详细权限与升级合同见[Host/Guest AgentCtl](../architecture.md#host-agentctl),各版本见[协议矩阵](../records-and-versions.md#control-protocols),断连与重试见[失败语义](../failure-semantics.md#idempotency)。
diff --git a/docs/src/zh/design/decisions/index.md b/docs/src/zh/design/decisions/index.md
index f024b472..409d119b 100644
--- a/docs/src/zh/design/decisions/index.md
+++ b/docs/src/zh/design/decisions/index.md
@@ -4,14 +4,14 @@ ADR 保存设计取舍的背景、备选方案与后果。当前实现合同由
| 编号 | 决定 | 保留的边界或代价 | 记录状态 |
| --- | --- | --- | --- |
-| 0001 | [计划与实际强制证据分开](0001-plan-and-evidence.md) | 计划最高到 Planned;消费者还需检查执行观察 | 实现回填 |
-| 0002 | [捕获与回放独立](0002-capture-and-replay.md) | 执行可独立使用;模型捕获与原生轨迹分别收集 | 实现回填 |
-| 0003 | [safe 保留显式执行器选择](0003-explicit-safe-executor.md) | 缺少控制时拒绝,平台前置条件仍需满足 | 实现回填 |
-| 0004 | [人工批准语义承诺](0004-human-semspec-approval.md) | 测试结果与产品承诺分别审核 | 现有贡献规则回填 |
-| 0005 | [单一 Rust VM crate 与 trait API](0005-rust-vm-api.md) | 后端私有,统一声明不承诺跨架构恢复 | 实现回填 |
+| 0001 | 计划与实际强制证据分开 | 计划最高到 Planned;消费者还需检查执行观察 | 实现回填 |
+| 0002 | 捕获与回放独立 | 执行可独立使用;模型捕获与原生轨迹分别收集 | 实现回填 |
+| 0003 | safe 保留显式执行器选择 | 缺少控制时拒绝,平台前置条件仍需满足 | 实现回填 |
+| 0004 | 人工批准语义承诺 | 测试结果与产品承诺分别审核 | 现有贡献规则回填 |
+| 0005 | 单一 Rust VM crate 与 trait API | 后端私有,统一声明不承诺跨架构恢复 | 实现回填 |
| 0006 | [快照保存 stage,复用不可变基底](0006-stage-snapshot.md) | 基底需要验证与 pin;历史独立 CLI profile 不等于当前 Job 接口 | accepted;沿用原记录的 2026-10-04 状态 |
-| 0007 | [Host FUSE 与 virtio-fs 共用文件服务](0007-shared-filesystem-service.md) | 共享文件语义,协议状态与并发仍由适配器负责 | 实现回填 |
-| 0008 | [Host 与 Guest 控制权限分离](0008-host-guest-control-authority.md) | 两套凭据与端点;Host 内部协议要求精确兼容 | 实现回填 |
+| 0007 | Host FUSE 与 virtio-fs 共用文件服务 | 共享文件语义,协议状态与并发仍由适配器负责 | 实现回填 |
+| 0008 | Host 与 Guest 控制权限分离 | 两套凭据与端点;Host 内部协议要求精确兼容 | 实现回填 |
“实现回填”说明可以从源码或现有开发规则核对选择,不表示新获得维护者批准。0006 的 accepted 状态沿用其独立记录;其中旧 CLI 与测量仍属于历史制品,当前行为以[环境快照](../environment-snapshot.md)和[Job 检查点](../job-checkpoint-cli.md#10-当前实现与验收边界)为准。
diff --git a/docs/src/zh/design/environment-snapshot.md b/docs/src/zh/design/environment-snapshot.md
index f7f150b0..5bcf56de 100644
--- a/docs/src/zh/design/environment-snapshot.md
+++ b/docs/src/zh/design/environment-snapshot.md
@@ -51,7 +51,7 @@ pvisor fork last --state workspace --stage ./stage/branch -- codex
[单节点 daemon](daemon/index.md) 使用原生 VM 执行,但没有捕获/恢复 API。其 pause/resume 是同一 Attempt 上已确认的 live vCPU 控制,不是 cgroup freeze 或快照。Snapshot、checkpoint/fork、stage/apply 和 offload API 仍未实现。不要把已退役 Cluster 控制当作快照入口。
-原生 node backing 归属仍独立于 daemon 生命周期,见[职责收敛](daemon/responsibility-convergence.md)。
+原生 node backing 归属仍独立于 daemon 生命周期,见[daemon 架构](daemon/index.md)。
## 历史证据 {#historical-evidence}
diff --git a/docs/src/zh/design/experimental/agent-io-completion/index.md b/docs/src/zh/design/experimental/agent-io-completion/index.md
index 200c9867..0096ac72 100644
--- a/docs/src/zh/design/experimental/agent-io-completion/index.md
+++ b/docs/src/zh/design/experimental/agent-io-completion/index.md
@@ -1,4 +1,4 @@
-# EXP-003(受限 PoC):Agent 异步 I/O 与完成队列
+# Agent 异步 I/O 与完成队列(EXP-003)
让 pVisor 接管下载、模型请求和批量写入的输入、执行与结果。guest 提交工作后可以继续计算,或者在整个 guest 进入等待时卸载内存;host 继续推进 I/O,保存完成结果,再由现有 Attempt 控制者恢复 guest 并交付。
diff --git a/docs/src/zh/design/experimental/guest-stage-cache/index.md b/docs/src/zh/design/experimental/guest-stage-cache/index.md
index 71912e59..bda82026 100644
--- a/docs/src/zh/design/experimental/guest-stage-cache/index.md
+++ b/docs/src/zh/design/experimental/guest-stage-cache/index.md
@@ -1,4 +1,4 @@
-# EXP-002(设计阶段):Guest 内核文件系统缓存与延迟后端绑定
+# Guest 内核文件系统缓存与延迟后端绑定(EXP-002)
让 guest 内核使用版本明确的文件系统视图,直接完成缓存命中的路径查询、属性查询和普通只读 open;在数据缺失、stage 修改或持久化时调用 VMM。宿主继续持有 stage、基线观察、访问策略、review/apply 与恢复的权威状态。
@@ -29,7 +29,7 @@
因此,需要判断哪些请求可以在 guest 内核依据稳定视图完成,把不可变 lower 的元数据和受协议管理的 stage 状态交给 guest,同时保留宿主的修改、授权和持久化职责。目录扫描、open/fstat/close 和混合 stage 视图分别对应元数据供给、打开生命周期和缓存一致性三个问题。
-现有[写合并对照](../../filesystem-performance-analysis.md#writeback-ab)支持关闭写合并后该写入负载改善,完整任务仍未检出加速。缓存方案针对元数据与打开路径的结构性成本,其端到端收益需要独立实验;写回、copy-up 和持久化成本仍需各自定位。
+现有[写合并对照](../../../lab-notes/filesystem-performance-analysis.md#writeback-ab)支持关闭写合并后该写入负载改善,完整任务仍未检出加速。缓存方案针对元数据与打开路径的结构性成本,其端到端收益需要独立实验;写回、copy-up 和持久化成本仍需各自定位。
### 1.2 当前基础与设计缺口
@@ -291,7 +291,7 @@ namespace 修改、普通数据写入和策略变化分别更新相关版本。
宿主在交付元数据时裁剪不可见路径、受保护别名和对象访问范围;必要的访问模式、ownership、ACL/xattr 输入要完整。原始路径字节保留,symlink 不能使 guest 请求任意宿主路径。对象摘要仅表达内容身份,不能作为跨租户读取权限。
-guest 做本地 Linux 权限检查;VMM 对数据和修改请求继续验证宿主认可的授权。会话 token、guest uid 或修改清单不能替代 Host 控制凭据,不能修改宿主权限账本。[Host/Guest 权限分离](../../decisions/0008-host-guest-control-authority.md)
+guest 做本地 Linux 权限检查;VMM 对数据和修改请求继续验证宿主认可的授权。会话 token、guest uid 或修改清单不能替代 Host 控制凭据,不能修改宿主权限账本(Host/Guest 权限分离)。
需要每次宿主回调的动态策略或审计 profile 不进入本地 open 快速路径。策略变化先撤销新缓存准入并协调现存引用;恢复只在权限与引用合同重建后继续。
diff --git a/docs/src/zh/design/experimental/index.md b/docs/src/zh/design/experimental/index.md
index 7d3b45c5..b9e03105 100644
--- a/docs/src/zh/design/experimental/index.md
+++ b/docs/src/zh/design/experimental/index.md
@@ -1,4 +1,4 @@
-# pVisor 实验性特性
+# 实验性特性
围绕“提升执行密度,降低监督成本”,登记可实施、可验证的实验能力。这里保存设计、实施计划与验收记录;功能代码仍归属现有 crate,性能测量仍归属 benchmark 注册表,避免形成另一套产品实现。
diff --git a/docs/src/zh/design/experimental/vcpu-idle-offload/index.md b/docs/src/zh/design/experimental/vcpu-idle-offload/index.md
index 4c8bfb4c..7b2db7e4 100644
--- a/docs/src/zh/design/experimental/vcpu-idle-offload/index.md
+++ b/docs/src/zh/design/experimental/vcpu-idle-offload/index.md
@@ -1,4 +1,4 @@
-# EXP-001(观测原型):vCPU 空闲观测与自动内存卸载
+# vCPU 空闲观测与自动内存卸载(EXP-001)
| 项目 | 当前状态 |
|---|---|
diff --git a/docs/src/zh/design/gateway.md b/docs/src/zh/design/gateway.md
index 4abe2746..27970b6d 100644
--- a/docs/src/zh/design/gateway.md
+++ b/docs/src/zh/design/gateway.md
@@ -48,7 +48,9 @@ Run 与内嵌 Gateway 共用 Journal。story worker 先提交事实,再更新
启动时从已提交事实重建投影,不重放 HTTP 请求、不重复通知观察者,
也不重写日志。有界输入队列仍是尽力而为的,只有 Journal 回执证明持久化。
-`spawn_apply` 采用非阻塞有界准入;直接 `apply` 等待进入同一 FIFO。接受不等于持久化,准入后取消等待不取消已持有的任务。flush 等待已接受任务及其等待的 backfill,报告拒绝或失败的工作,但不阻止生产者继续准入,也不是被拒事件诊断 writer 的屏障。子 Agent 链接 backfill 流向主 story;同 story 的 backfill 在所有者内直接执行,不等待自己的 mailbox。缺失 backfill 回执就是捕获缺口。shutdown 停止准入、排空已接受的尾部任务/backfill;即使另一个 story 报告缺口,也持久化最终投影/索引,随后消费者释放 Journal。
+`spawn_apply` 采用非阻塞有界准入;直接 `apply` 等待进入同一 FIFO。接受不等于持久化,准入后取消等待不取消已持有的任务。
+
+flush 等待已接受任务及其等待的 backfill,报告拒绝或失败的工作,但不阻止生产者继续准入,也不是被拒事件诊断 writer 的屏障。子 Agent 链接 backfill 流向主 story;同 story 的 backfill 在所有者内直接执行,不等待自己的 mailbox。缺失 backfill 回执就是捕获缺口。shutdown 停止准入、排空已接受的尾部任务/backfill;即使另一个 story 报告缺口,也持久化最终投影/索引,随后消费者释放 Journal。
失败的已准备 backfill 保留 `prepared_story`(目标 StoryContext)与 `prepared_record_json`,包含已赋值的 event ID 和 timestamp。恢复将此保留记录提交给目标 story 的同一个有界所有者,绕过准备与 Run re-enrichment,避免已匹配的链接丢失或获得新身份。保留载荷仍受捕获级别过滤和敏感 body 脱敏约束。没有 `prepared_story` 的条目仍通过普通 `apply` 重试旧 source event;诊断是重试输入,不证明 Journal 已提交。
diff --git a/docs/src/zh/design/index.md b/docs/src/zh/design/index.md
index 7b322d40..52281e2a 100644
--- a/docs/src/zh/design/index.md
+++ b/docs/src/zh/design/index.md
@@ -1,4 +1,4 @@
-# pVisor 设计与底层原理
+# pVisor 如何工作
让 Agent 连续执行一项任务,实际上是把一组进程、文件修改、网络请求和内存状态交给系统管理。任务启动以后,开发者关心三件事:它能触及哪些资源,执行到一半能否保留状态,最终哪些结果值得接受。大量任务同时运行时,还要回答第四件事:哪些内容可以只保存一份,哪些成本必然随任务数增长。
@@ -12,12 +12,7 @@ pVisor 将这些问题落实到执行、文件、网络和状态存储的具体
文件和网络从这里分开。文件修改可以先留在私有 upper,等运行结束后再决定是否合入;发给远程服务的请求通常已经产生了外部效果。因此,文件 apply 是一个独立的发布动作,而执行边界必须在请求发出之前生效。仅在结束后检查日志无法替代运行时限制。
-| 层次 | 主要所有者 | 必须解决的问题 |
-| --- | --- | --- |
-| 用户与服务入口 | `pvisor-cli`、嵌入应用、`pvisor-daemon` | 谁发起操作,目标是哪次运行,如何传递取消和结果? |
-| 运行生命周期 | `pvisor` 的 Job 服务与 Session | 谁拥有 Attempt,何时派发、清理、保存与公布终态? |
-| 执行与访问路径 | Host/OCI/VM executor、OverlayCore、OverlayNet | 哪个内核或设备处理请求,权限检查在哪里生效? |
-| 状态与事实 | snapshot store、image cache、Journal、apply ledger | 哪些内容不可变,谁持有引用,失败后如何核对? |
+层次与 crate 的对应关系由[核心架构](architecture.md)的所有权表维护,本页不再重复;下面只用一次任务把各层串起来。
独立 daemon 在每个 sandbox 的 supervisor 中嵌入 runtime。API 进程重启后可以重新核对存活 supervisor 的归属;VM 的生命周期不会因此自动结束。daemon 暴露 sandbox 生命周期与服务代理,原生 Job 提供文件审查和受支持的检查点流程;两者的接口范围见[核心架构](architecture.md)和[daemon 设计](daemon/index.md)。跨节点选机、队列和业务重试属于外部编排。
@@ -35,7 +30,7 @@ Job 表示需要持续管理的任务身份;Attempt 表示一次实际执行
实际顺序是先解析 RunSpec,确定有效策略与执行器能力,再准备文件、网络和运行附件。必要启动事实提交成功后才调用 `RunExecutor::execute`。准备本身可能创建目录或 socket,所以提交失败仍需要清理已准备资源。
-执行器返回 `ExecutorOutput`,Session 继续做清理、控制观察核对和结果保存。持久 Job 服务的 `ManagedJobRun` 另外拥有真实 Attempt join 与 `Server::finish`;前端拿到等待适配器。前端等待出错或被丢弃会请求取消,已接受的完成发布仍由 runtime 任务持有,只要其 Tokio runtime 继续存活。
+执行器返回 `ExecutorOutput`,Session 继续做清理、控制观察核对和结果保存。持久 Job 服务的 `ManagedJobRun` 另外拥有真实 Attempt join 与 `Server::finish`。前端拿到的是等待适配器。前端等待出错或被丢弃会请求取消,已接受的完成发布仍由 runtime 任务持有,只要其 Tokio runtime 继续存活。
### 策略为何要解析一次
@@ -98,7 +93,7 @@ Linux daemon 的可选物理池处理不同 VM session 中相同的驻留 4 KiB
这里有两个关键顺序。内容必须在替换映射前复核,否则采样后发生的 guest 写入会丢失;仍被映射的旧槽位必须在撤销映射后释放,否则被复用的槽位会改变另一个 VM 看到的字节。连接断开也不能直接释放引用,池需等 pidfd 确认对端退出。
-raw-page 共享不需要 userfaultfd,也不压缩独有内容。它增加了池进程的故障域和引用开销;当前池丢失会让依赖 VM 失败。snapshot COW、KSM、物理池、冷压缩和 offload 有各自的兼容性限制,不能把它们的收益相加成一个已交付组合。具体预算见[内存优化](memory-optimization/index.md)。
+raw-page 共享不需要 userfaultfd,也不压缩独有内容。它增加了池进程的故障域和引用开销;当前池丢失会让依赖 VM 失败。snapshot COW、KSM、物理池、冷压缩和 offload 有各自的兼容性限制,不能把各自的收益相加,当成一个已经交付的总量。具体预算见[内存优化](memory-optimization/index.md)。
### 冷压缩为何需要两次静止窗口
@@ -134,7 +129,7 @@ Agent 读到 A 并生成 C 时,开发者可能已把目标文件改成 D。upp

-live lower 的保护起点是首次实际内容观察,或未读即写时的修改前状态;冻结布局使用明确对应目标的 baseline。普通 stat 和目录枚举不会哈希所有文件。若额外 lower 提供 B,而真正要覆盖的 target 是 A,冲突基线仍是 A。
+对 live lower,保护从第一次实际观察文件内容开始;没有先读的写入,则从修改前状态开始。冻结布局使用明确对应目标的 baseline。普通 stat 和目录枚举不会哈希所有文件。若额外 lower 提供 B,而真正要覆盖的 target 是 A,冲突基线仍是 A。
apply 在目标锁下恢复已有未完成批次,展开选中路径的必要依赖,再检查目标是否匹配 preimage。通过后先持久化 Prepared 意图,再写目标;目标更新完成后记录 TargetApplied,裁剪已接受的 upper,最后提交 Committed。中断后可以根据保留的阶段向前核对和恢复。
@@ -152,7 +147,7 @@ apply 在目标锁下恢复已有未完成批次,展开选中路径的必要
一次 `read(offset, length)` 先定位 inode 和文件内容索引,计算所需块;缓存未命中才访问本地或远程对象,完成对应完整性校验后截取所需范围。元数据分页和内容缓存有各自边界;内容 miss 不占用整个文件服务的全局锁。
-VM 的 lazy lower 直接接入共享文件服务。私有元数据投影保留本地 inode/FD 与路径检查所需结构,文件 READ 由内容后端提供;占位文件的空洞不作为真实文件内容返回。首次普通修改需要物化原文件并 copy-up,完整导出或快照也可能下载此前未访问的内容。
+VM 的 lazy lower 直接接入共享文件服务。私有元数据投影保留本地 inode/FD 与路径检查所需结构,文件内容由内容后端通过 FUSE `READ` 提供;占位文件的空洞不作为真实文件内容返回。首次普通修改需要物化原文件并 copy-up,完整导出或快照也可能下载此前未访问的内容。
因此 lazy 的主要取舍是把部分准备成本转到第一次访问。热缓存下减少的读取与冷 miss、元数据、copy-up 的成本需要分别测量。存储格式与发布规则见[共享镜像缓存](shared-image-cache-storage.md),源码入口是 `pvisor/src/image/cache/backend.rs`、`direct.rs`、`storage.rs`。
@@ -227,5 +222,3 @@ workspace checkpoint 只保存文件分支;Agent trajectory 保存模型上下
执行隔离约束访问,暂存约束文件发布,快照约束可恢复状态,Journal 约束已提交事实。每个模块因此有明确的状态所有者、发布点和失败结果,外部编排才能在这些结果上决定重试、分叉或接受。
当前实现状态也需要保持清楚:daemon 已有 VM-only NativeRuntime 和显式启用的 Linux 物理池,其 API 尚未暴露原生 Job 的 stage/apply 或 execution checkpoint;外部编排与 RL 接入仍需要独立交接和端到端验证。实现机制并不自动建立生产密度或长期恢复结论。
-
-组织方式参考 [ByteHook 的项目介绍和原理概述](https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md):把必要基础原理、请求路径与工程约束连续讲清楚。更多表达参考及使用方式见[开源设计文档参考](research/design-documents.md)。
diff --git a/docs/src/zh/design/job-checkpoint-cli.md b/docs/src/zh/design/job-checkpoint-cli.md
index 9ec1f727..9d969fab 100644
--- a/docs/src/zh/design/job-checkpoint-cli.md
+++ b/docs/src/zh/design/job-checkpoint-cli.md
@@ -5,6 +5,9 @@
> 状态:普通 Job 原生执行捕获、暂停、恢复与分支已接入;支持范围和验收见第 10 节。
> 约束:保持普通 `run` 的配置和默认执行行为;执行能力由实际 executor/profile 判断。
+>
+> 阅读方式:第 1–9 节是 Job 核心命令树的目标态设计(设计契约),不是可用性承诺;
+> 某条能力是否已接入,一律以[第 10 节](#10-当前实现与验收边界)的实现边界为准。
## 1. 对象与基本约束
diff --git a/docs/src/zh/design/journal.md b/docs/src/zh/design/journal.md
index 92e61f42..5b85e0d8 100644
--- a/docs/src/zh/design/journal.md
+++ b/docs/src/zh/design/journal.md
@@ -131,7 +131,7 @@ live 只在成功提交后 send,重复 receipt 不再次 send,没有 receive
这些检查验证去重、顺序和部分故障边界。只读 FD 注入不是 sync_all 在写后失败的完整实验;Future 取消测试使用内存模式,不测磁盘持久化;并发位置测试也不是吞吐基准。当前缺少每种 syscall 时刻的进程崩溃、断电、长日志恢复、subscriber lag 补读与设备存储故障矩阵。
-没有可归入本次文档的磁盘吞吐 / p99 fsync / 恢复峰值内存数据,因此不虚构数值。代码路径明确每条磁盘新事件一次 sync_all、重复提交不再写文件、open / records 做全量扫描。量级增长与同步成本是下一轮应测的重点。
+磁盘吞吐、p99 fsync 与恢复峰值内存尚无测量。代码路径明确每条磁盘新事件一次 `sync_all`、重复提交不再写文件、open / records 做全量扫描。量级增长与同步成本是下一轮应测的重点。
## 5. 使用建议 {#usage}
diff --git a/docs/src/zh/design/lazy-image-v2.md b/docs/src/zh/design/lazy-image-v2.md
index 798a380c..d59ee593 100644
--- a/docs/src/zh/design/lazy-image-v2.md
+++ b/docs/src/zh/design/lazy-image-v2.md
@@ -1,4 +1,4 @@
-# Lazy Image V2:目录局部化打包与按需索引
+# 惰性镜像 v2:目录局部化打包与按需索引
以目录为访问局部性边界,在发布时合并小文件,在读取时按需加载精确索引与内容块,减少 S3-backed 镜像的小对象请求与启动期索引驻留。
diff --git a/docs/src/zh/design/memory-optimization/compression-local.md b/docs/src/zh/design/memory-optimization/compression-local.md
index becc712a..41ed2c92 100644
--- a/docs/src/zh/design/memory-optimization/compression-local.md
+++ b/docs/src/zh/design/memory-optimization/compression-local.md
@@ -97,4 +97,4 @@ memfd 槽位经引用固定后,由 VM 以 `MAP_PRIVATE` 映射;它不注册
[内存证据](proof-of-concept.md#memory-evidence)尚未建立已知的生产净收益。
比较宿主总占用、临时峰值、CPU 成本和业务尾延迟,不能只看编码大小。
-所有权选择见[概览](compression.md)与[池化方案](compression-pool.md)。
+所有权选择见[架构索引](index.md)与[池化方案](compression-pool.md)。
diff --git a/docs/src/zh/design/memory-optimization/compression-pool.md b/docs/src/zh/design/memory-optimization/compression-pool.md
index 1e26a443..500eee19 100644
--- a/docs/src/zh/design/memory-optimization/compression-pool.md
+++ b/docs/src/zh/design/memory-optimization/compression-pool.md
@@ -93,5 +93,5 @@ just test pvisor-vm -- -E 'test(cold_ram_linux::)' --run-ignored all --test-thre
[内存证据](proof-of-concept.md#memory-evidence)尚未建立已知的生产净收益,
也未验证净物理内存节省。历史池测量不能验证 sealed backing。
-[架构索引](index.md)与[压缩概览](compression.md)区分实现、组件正确性,
+[架构索引](index.md)区分实现、组件正确性,
真实 guest 正确性探针,以及仍需完成的业务负载验收。
diff --git a/docs/src/zh/design/memory-optimization/compression.md b/docs/src/zh/design/memory-optimization/compression.md
deleted file mode 100644
index b70e8a06..00000000
--- a/docs/src/zh/design/memory-optimization/compression.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# 内存压缩
-
-当编码节省超过存储、CPU 和恢复成本时,压缩可以降低保留冷 RAM 的成本。
-先选择实例本地所有权;只有跨实例共享足以抵偿协调成本时,才引入池化服务。
-
-## 目标与现状 {#status}
-
-[实例内压缩](compression-local.md) 已在 Linux x86_64 实验性交付:默认关闭的
-`vm.cold_ram_compression` / `--vm-cold-ram-compression` 使用 runtime 持有的
-userfaultfd pager 及有界本地存储,不需要 FUSE 或外部池。它区别于
-`vm.ram_compression`(FUSE 文件 backing),采用驱逐/refault 探测,而非
-读访问热度检测。它与[池化服务器压缩](compression-pool.md)都不是生产
-收益承诺。macOS/HVF 堆冷池仍属实验,服务丢失可能导致依赖它的 VM 失败;
-Linux 客户端持有 sealed 压缩 backing 已实验性实现,并有进程级交付/恢复测试;
-双 VM 探针已验证服务终止后的 guest discard/refault 与文件 I/O。
-
-## 所有权与数据流 {#architecture}
-
-每个实例独立负责 checkpoint 保存、压缩和恢复,不依赖运行态优化。
-[完整环境快照](../environment-snapshot.md)包含机器状态与持久性合同;
-运行态冷对象只保留当前 RAM 片段。压缩 checkpoint 不会自动回收活跃 RAM。
-
-VM 运行时负责冷页选择和映射变更;codec 转换字节,backing 承载字节。
-`memfd` 不会自动压缩。即使对象共享,目标设计也将可写页恢复到实例私有 RAM。
-
-## 选择与取舍 {#tradeoffs}
-
-本地压缩避免服务协调,但不能跨实例共享 payload。
-池化增加可选的[去重](deduplication.md)、共享存储和宿主级预算,
-代价是 IPC、竞争和更广的故障风险。
-两者都需要临时内存与恢复余量、CPU 预算,以及可接受的尾延迟。
-
-## 实施方向与证据 {#direction}
-
-Linux 本地 pager 在回收 RAM 前发布并校验对象,恢复通过经过校验的
-`UFFD_COPY` 完成。必须具备内核缺页 userfaultfd 权限;编译支持不代表
-授权,缺少权限时启动失败。它拒绝去重、文件/FUSE backing、快照捕获/恢复、
-整 VM [offload](offload.md) 及外部内存池,见[本地合同](compression-local.md#direction)。
-Linux sealed `memfd` 池化交付已有进程级测试和通过的真实 guest UFFD 正确性探针;
-macOS 的等价 sealed 方案尚未交付。
-从[优化架构](index.md)出发;[内存证据](proof-of-concept.md#memory-evidence)
-尚未建立已知的生产净收益,也未验证净物理内存节省。
diff --git a/docs/src/zh/design/memory-optimization/deduplication.md b/docs/src/zh/design/memory-optimization/deduplication.md
index 8a1cd606..8cff59d1 100644
--- a/docs/src/zh/design/memory-optimization/deduplication.md
+++ b/docs/src/zh/design/memory-optimization/deduplication.md
@@ -90,7 +90,7 @@ KSM 不合并文件 page cache;当前 `MAP_SHARED` live backing 不能只添
- **共享与隔离:** 限定信任域并评估内容存在性侧信道。KSM advice 没有 pVisor 自定义域参数,产品标签不能单独证明隔离。
- **简单与覆盖面:** 当前 physical pool 采用有界 resident 扫描;任意热页即时合并与 P2P 不属于交付范围。主动共享槽位与完整机器持久恢复分别设计。
-同一区域首版不叠加 KSM 与用户态冷回收,避免先合并再复制压缩的重复工作。独特但可压缩的冷内容见[内存压缩](compression.md)。
+同一区域首版不叠加 KSM 与用户态冷回收,避免先合并再复制压缩的重复工作。独特但可压缩的冷内容见[实例内压缩](compression-local.md)。
## 当前接入与验证基础 {#direction}
diff --git a/docs/src/zh/design/memory-optimization/index.md b/docs/src/zh/design/memory-optimization/index.md
index e47d13e9..b838ccc0 100644
--- a/docs/src/zh/design/memory-optimization/index.md
+++ b/docs/src/zh/design/memory-optimization/index.md
@@ -38,7 +38,9 @@ VM runtime 拥有地址映射和 CPU/设备一致性,Job 与 snapshot store
| local live compression | 实例内独特但可压缩的冷内容 | userfaultfd 权限、编码 CPU 与 refault 成本 |
| whole-VM offload | 可停驻并保留恢复来源的闲置状态 | 写入与恢复成本、存储和峰值余量 |
-去重机制见[内存去重](deduplication.md),编码与存储取舍见[内存压缩](compression.md)、[实例内压缩](compression-local.md)与[卸载文件格式](offload-format.md)。[池化服务器压缩](compression-pool.md)通过显式 Linux 模式共享 sealed 编码对象,默认 daemon physical pool 共享原文页,两种机制分别维护。
+去重机制见[内存去重](deduplication.md),编码与恢复取舍见[实例内压缩](compression-local.md),存储布局见[内存卸载](offload.md)与[字节布局附录](../offload/disk-layout-and-schema.md)。[池化服务器压缩](compression-pool.md)通过显式 Linux 模式共享 sealed 编码对象,默认 daemon physical pool 共享原文页,两种机制分别维护。
+
+默认路线是实例本地所有权:本地压缩避免服务协调,但不能跨实例共享编码结果。池化增加可选的去重、共享存储和宿主级预算,代价是 IPC、竞争和更广的故障风险;只在需要跨实例共享编码对象时才引入。两者都需要临时内存与恢复余量、CPU 预算,以及可接受的尾延迟。
## 所有权与发布顺序 {#ownership}
@@ -71,12 +73,12 @@ Linux 实例内冷压缩以 64 KiB 块工作。第一次短静止窗口捕获候
## 当前实现与组合限制 {#direction}
-Linux daemon 使用显式 `serve --memory-pool` 启用原文页共享;它不需要 userfaultfd。实例内 live compression 和 `--memory-pool-mode compressed` 使用 userfaultfd。sealed 池已有组件级服务退出测试,双 VM 探针也已验证服务终止后的回收/refault 与文件 I/O;生产密度和延迟仍待验收。Snapshot capture/restore、file backing、whole-VM offload、KSM advice与冷页路径存在明确互斥检查;调用方应按支持profile选择,组合不自动热切换。
+Linux daemon 使用显式 `serve --memory-pool` 启用原文页共享;它不需要 userfaultfd。实例内 live compression 和 `--memory-pool-mode compressed` 使用 userfaultfd。sealed 池已有组件级服务退出测试,双 VM 探针也已验证服务终止后的回收/refault 与文件 I/O;macOS 的等价 sealed 池化尚未交付,生产密度和延迟仍待验收。Snapshot capture/restore、file backing、whole-VM offload、KSM advice与冷页路径存在明确互斥检查;调用方应按支持profile选择,组合不自动热切换。
新共享和offload证据按配置、样本和计费范围保留在[VM 内存基准](../../benchmarks/vm-memory/index.md)。Ready省内存不保证更低lifecycle peak,高写入会减少共享收益。[概念验证](proof-of-concept.md)保留历史机制和失败材料;完整状态合同见[环境快照](../environment-snapshot.md)。
## 回到整体架构与源码 {#integration}
-映射与块状态留在 VM 内,池或 store 只提供受引用保护的内容。虚拟设备经 RAM lease 加入同一静止边界;[完整快照](../environment-snapshot.md#consistent-cut)再把 CPU、RAM、设备和文件状态组合起来。[Daemon 准入](../daemon/admission.md)需要按整个节点预算容纳私有页、共享服务与恢复峰值,不能把某个局部压缩比直接换成并发上限。
+映射与块状态留在 VM 内,池或 store 只提供受引用保护的内容。虚拟设备经 RAM lease 加入同一静止边界;[完整快照](../environment-snapshot.md#consistent-cut)再把 CPU、RAM、设备和文件状态组合起来。[Daemon 准入](../daemon/index.md#admission)需要按整个节点预算容纳私有页、共享服务与恢复峰值,不能把某个局部压缩比直接换成并发上限。
源码入口:`crates/pvisor-vm/src/memory.rs`、`handle.rs`、`cold_ram_linux.rs`、`ram_dedup.rs` 与 `devices/virtio/memory_gate.rs`。接口与生命周期由 `api.rs` 定义;daemon 的共享对象预算与进程归属见[共享工作集](../daemon/shared-working-set.md)。
diff --git a/docs/src/zh/design/memory-optimization/offload-format.md b/docs/src/zh/design/memory-optimization/offload-format.md
deleted file mode 100644
index 3f5a8216..00000000
--- a/docs/src/zh/design/memory-optimization/offload-format.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# 卸载文件格式
-
-存储布局决定哪些内容可以读回、发布和安全删除。
-原始文件偏重简单;压缩 base/delta bundle 则用额外复杂度换取复用。
-
-## 两种存储模型 {#storage-models}
-
-原始 backing 按 VMM 的紧凑文件 offset 保存 RAM 字节,没有 pVisor 格式头。
-它可以直接映射,但逻辑长度不等于磁盘分配量:文件可能是稀疏的。
-原始 RAM 文件和压缩 bundle 都不包含恢复完整 VM 所需的全部状态。
-
-压缩模式的 manifest 标识 sidecar 目录和 committed head。
-不可变 generation 保存完整 base,后续 delta 继承未变化的块。
-可写 staging 保存新的原始页;FUSE 将这些页与已提交内容组合,
-形成活动实例使用的逻辑 RAM 文件。staging 不是历史快照。
-
-## 随机读取与完整性 {#reads-and-integrity}
-
-块索引解析链中最新的数据来源,seek table 定位对应压缩 frame。
-均匀块使用 fill entry。读取校验 metadata、祖先关系、解码长度和块
-checksum,无须解码整份 RAM。完整性校验检测损坏,不等于完整
-VM 检查点,也不代表 CPU、设备和外部副作用的原子捕获。
-
-当前 staging 使用 4 KiB 页,压缩使用 64 KiB 块;宿主页是另一粒度。
-小粒度减少部分写入与冷读取放大,却增加索引和管理开销。
-大粒度可能提高压缩率、减少 metadata,但一次小访问也可能解码整个
-块。[本地压缩](compression-local.md)讨论相关的内存与 CPU 权衡。
-
-## 发布与保留 {#publication-and-retention}
-
-writer 先将逻辑文件写入刷到 staging,构建并同步新 generation,
-再以不覆盖已有 generation 的方式发布,最后追加 manifest head。
-仅有 FUSE 写回或 fsync 不会发布 committed epoch;该边界由卸载协调。
-不可变性保持已发布字节稳定,但本身不保证对应文件一直存在。
-
-当前 GC 保留 current head 及祖先,以及显式 pin 的历史保留根。
-旧 manifest head 记录不是保留根,标准卸载也不会自动 pin。
-读者租约是未来并发检查或可移植 bundle 所需的生命周期约束,
-不是该格式新承诺的租约能力。当前检查要求 writer 已停止。
-独立的[完整环境快照](../environment-snapshot.md)存储有自己的恢复租约。
-
-## 合并与容量 {#compaction}
-
-delta 减少重复存储,却加深依赖。当前按链深触发的合并在 VM 暂停时
-构建新完整 base,解码旧块并重新编码全部逻辑 RAM。
-容量预算应同时计入旧链、正在构建的新 base、staging 和 pin 保留历史。
-不要把同一新 generation 的临时文件与发布后的名称重复计为两份数据。
-小 delta 不能预测合并延迟、空间峰值或冷读取的解码放大。
-
-## 当前限制与设计方向 {#status}
-
-manifest 当前保存 sidecar 的绝对路径;复制或建立 alias 不会迁移
-它的依赖。open 拒绝撕裂的 head log 尾部,而不是自动回退。
-staging 有效页掩码只在内存中,内核脏页也可能尚未进入 staging;
-正常退出不会提交恢复后的新写入。这些文件不是崩溃原子的完整 VM 归档。
-
-可移植引用、可安全恢复的发布以及协调读者与 GC 的租约是未来目标,
-不是这些文档确立的能力。[架构](index.md)与
-[内存卸载](offload.md)说明范围;现有[字节布局与 schema 附录](../offload/disk-layout-and-schema.md)
-负责定义二进制字段、大小公式与解析限制,不在这里重复。
diff --git a/docs/src/zh/design/memory-optimization/offload.md b/docs/src/zh/design/memory-optimization/offload.md
index c2f9be28..f2ea0e35 100644
--- a/docs/src/zh/design/memory-optimization/offload.md
+++ b/docs/src/zh/design/memory-optimization/offload.md
@@ -45,7 +45,10 @@ tmpfs 文件或 memfd 仍由内存支撑:更换 backing 类型并不等于磁
原始 backing 让内核直接把 RAM 字节写入文件,并处理后续缺页。
压缩路径通过 FUSE 暴露逻辑 RAM 文件:写回先暂存原始页,
卸载再将变化块提交到 base/delta bundle;读取时解码已提交块。
-[卸载文件格式](offload-format.md)解释其存储与发布模型。
+当前 staging 使用 4 KiB 页、压缩使用 64 KiB 块:小粒度减少部分写入与
+冷读取放大,大粒度提高压缩率、减少 metadata,但一次小访问也可能解码
+整个块。[字节布局与 schema 附录](../offload/disk-layout-and-schema.md)
+定义存储格式、发布模型与解析限制。
压缩可能减少存储字节,但增加编码、校验、staging I/O 和 FUSE 工作。
恢复后的冷读取还需要块解码。不可压缩数据、频繁重写和合并
diff --git a/docs/src/zh/design/memory-optimization/proof-of-concept.md b/docs/src/zh/design/memory-optimization/proof-of-concept.md
index 94f04eb7..9142377c 100644
--- a/docs/src/zh/design/memory-optimization/proof-of-concept.md
+++ b/docs/src/zh/design/memory-optimization/proof-of-concept.md
@@ -1,6 +1,6 @@
# 实验性概念验证
-共享基线、COW 和冷页池实验提供了内存优化的机制基础,也暴露了服务可用性、恢复竞争和物理计量的限制。目标架构由[内存优化](index.md)、[内存去重](deduplication.md)及[内存压缩](compression.md)主导;以下保留对应版本的实现、实验与失败记录,不作为未来方案的生产保证。
+共享基线、COW 和冷页池实验提供了内存优化的机制基础,也暴露了服务可用性、恢复竞争和物理计量的限制。目标架构由[内存优化](index.md)、[内存去重](deduplication.md)及[实例内压缩](compression-local.md)主导;以下保留对应版本的实现、实验与失败记录,不作为未来方案的生产保证。
当前 Linux daemon 池已改为物理共享页+COW,读取不会恢复私有副本;开启与预算见 [daemon 指南](../../guides/daemon/index.md#memory-pool)。本文保留 macOS 冷压缩及历史 Linux 路径的机制记录。
@@ -232,7 +232,9 @@ RAM+pool 代理为两 runner 的 `resident_bytes + pending_file_bytes` 之和
同一 runner 只有一个维护线程,上一批完成前不会重新创建 Publishing,故该状态检查不会将另一轮候选误当成当前候选。连接 RPC 仍由同一个 pool mutex 串行,冷恢复可能等待正在进行的发布请求;本修改不承诺消除全部池故障或冷恢复尾延迟。pool 锁必须在申请 pager 锁或维护屏障前释放。
-`pending_snapshot_bytes` 加入 RAM+pool 代理,按每秒采样前后计数的较大值保守计入,避免遗漏暂存成本。`pvisor-cold-transaction` 汇总同轮两个屏障调用的耗时,publication_us 单独记录;单次屏障变短不等于整轮总开销一定下降。日志补充 PID;invalidated_publications 只统计访问使候选失效,总取消计数还包括提交预算耗尽。三对三轮真实双 VM 网络检查全部通过,238 个候选因实际访问失效。同轮两个屏障调用合计 P95 为 2.4–3.1 ms,冷恢复最大耗时 41.4 ms;这些是限定负载的实验结果,仍有连接竞争尾延迟。
+`pending_snapshot_bytes` 加入 RAM+pool 代理,按每秒采样前后计数的较大值保守计入,避免遗漏暂存成本。`pvisor-cold-transaction` 汇总同轮两个屏障调用的耗时,publication_us 单独记录;单次屏障变短不等于整轮总开销一定下降。日志补充 PID;invalidated_publications 只统计访问使候选失效,总取消计数还包括提交预算耗尽。
+
+三对三轮真实双 VM 网络检查全部通过,238 个候选因实际访问失效。同轮两个屏障调用合计 P95 为 2.4–3.1 ms,冷恢复最大耗时 41.4 ms;这些是限定负载的实验结果,仍有连接竞争尾延迟。
### 内存计量与尚未证明的收益 {#memory-evidence}
@@ -266,7 +268,9 @@ pvisor-daemon serve --help
pvisor-daemon memory-pool --help
```
-记录中的 macOS v1 池默认预算为 16 MiB 编码 payload、8192 对象、16 连接、每连接 32768 引用;最后一项覆盖 2 GiB RAM 的 64 KiB 分块。该版本的四项预算可通过服务参数分别设置,编码预算不包含全部堆元数据。服务仅接受当前 UID,socket 权限为 0600,拒绝覆盖已有端点。SIGINT/SIGTERM 关闭连接、等待引用回收并删除自己创建的 socket;停止池会使依赖的活 VM 失败。该版本是操作方管理的前台组件,不自动重启或恢复池内容;这些是历史限制,不是当前 daemon 默认值。
+记录中的 macOS v1 池默认预算为 16 MiB 编码 payload、8192 对象、16 连接、每连接 32768 引用;最后一项覆盖 2 GiB RAM 的 64 KiB 分块。该版本的四项预算可通过服务参数分别设置,编码预算不包含全部堆元数据。
+
+服务仅接受当前 UID,socket 权限为 0600,拒绝覆盖已有端点。SIGINT/SIGTERM 关闭连接、等待引用回收并删除自己创建的 socket;停止池会使依赖的活 VM 失败。该版本是操作方管理的前台组件,不自动重启或恢复池内容;这些是历史限制,不是当前 daemon 默认值。
v1 接入验证使用产品池程序和显式 SDK 参数,父进程未设置旧池环境变量。两个真实 VM 的共享对象、内容恢复、独立写入和正常退出通过;池退出及 socket 清理通过,约 36.6 s,无宿主守卫错误。原始记录为 `v1-product-integration.json`。定向 Rust 回归、Clippy 与安装/打包检查见 review 的收敛报告。
diff --git a/docs/src/zh/design/offload/index.md b/docs/src/zh/design/offload/index.md
index dc86be50..e26c6e79 100644
--- a/docs/src/zh/design/offload/index.md
+++ b/docs/src/zh/design/offload/index.md
@@ -1,6 +1,6 @@
# VM RAM offload
-> 架构说明见 [VM RAM offload 架构](../memory-optimization/offload.md);本文仍作为实现与证据附录保留。
+> 架构见 [VM RAM offload 架构](../memory-optimization/offload.md);以下是实现与证据附录。
## 1. Motivation {#motivation}
diff --git a/docs/src/zh/design/overlayfs.md b/docs/src/zh/design/overlayfs.md
index a267e35b..d33e817c 100644
--- a/docs/src/zh/design/overlayfs.md
+++ b/docs/src/zh/design/overlayfs.md
@@ -77,7 +77,7 @@ virtio-fs 文件服务入口分开,随 VM teardown 释放。
内容读取不持有服务全局锁或元数据表锁,缓存 miss 仅锁住相应的内容块。
测试覆盖跨块与热缓存读取、硬链接 copy-up、guest 属性、打开句柄、完整目录
导出及 runner 接入。两套入口的协议状态尚未全部共享;平台权限和描述符
-语义仍由各自适配器处理。[文件系统测量](filesystem-performance-analysis.md#filesystem-service)
+语义仍由各自适配器处理。[文件系统测量](../lab-notes/filesystem-performance-analysis.md#filesystem-service)
已覆盖本地完整负载和 lazy 冷/热缓存:读路径有局部收益,元数据和 copy-up
出现回归,尚未显示普遍端到端加速;并发任务容量未在这批测量中验证。
统一文件服务处理文件系统及 lazy image;[快照 RAM lazy 恢复](environment-snapshot.md)
diff --git a/docs/src/zh/design/overlaynet.md b/docs/src/zh/design/overlaynet.md
index fb6c4449..d24fbbeb 100644
--- a/docs/src/zh/design/overlaynet.md
+++ b/docs/src/zh/design/overlaynet.md
@@ -129,8 +129,8 @@ OverlayNet 接在 VM 设备后,由 Session 准备并在 Attempt 结束时收
源码入口:`crates/pvisor-overlaynet/src/vm.rs` 的 `ensure_listener`、`connect_vm_egress`、`drive_flows` 与 `SyntheticDns`;`egress.rs` 拥有共享出口连接路径,`interception.rs` 定义实际 driver 的观察。`crates/pvisor-vm/src/devices/virtio/net/` 只拥有虚拟网卡和帧传输,网络策略不由设备自行推断。
-!!! note "Host / OCI 透明拦截:后续设计"
- 下方“问题”、Design A、Design B 和交付计划第 1–5 项描述待实现的 host/container driver。它们不扩展上方当前 VM 与显式代理的支持面。
+!!! note "Host / OCI 透明拦截:提案(未实现)"
+ 下方“问题”、Design A、Design B 和交付计划第 1–5 项描述待实现的 host/container driver,是已接受方向的设计提案,不代表当前实现。它们不扩展上方当前 VM 与显式代理的支持面。
## 问题
diff --git a/docs/src/zh/design/records-and-versions.md b/docs/src/zh/design/records-and-versions.md
index 654cb5d9..144dfd52 100644
--- a/docs/src/zh/design/records-and-versions.md
+++ b/docs/src/zh/design/records-and-versions.md
@@ -47,7 +47,7 @@ Event version 5 与 Journal format 5 在当前实现中共用 Event 的版本常
环境 manifest 的多个版本代表不同 RAM/文件系统组合,不能把“最高版本为 5”解释成“所有新快照都写 5”。stage profile 的 raw RAM 使用 v4,压缩 RAM 使用 v5;其他 profile 按各自字段组合判定。SDK 可以读取某种存储格式,也不表示当前 Job CLI 能直接采用任意历史独立 snapshot store。
-Job 的检查点入口与兼容 profile 见[Job 检查点设计](job-checkpoint-cli.md#10-当前实现与验收边界)。完整机器与文件引用见[环境快照](environment-snapshot.md#storage-contract),RAM 子格式见[卸载文件格式](memory-optimization/offload-format.md),镜像元数据与内容版本见[共享镜像缓存](shared-image-cache-storage.md)。
+Job 的检查点入口与兼容 profile 见[Job 检查点设计](job-checkpoint-cli.md#10-当前实现与验收边界)。完整机器与文件引用见[环境快照](environment-snapshot.md#storage-contract),RAM 子格式见[卸载文件格式](offload/disk-layout-and-schema.md),镜像元数据与内容版本见[共享镜像缓存](shared-image-cache-storage.md)。
## 控制协议与构建身份 {#control-protocols}
diff --git a/docs/src/zh/design/replay.md b/docs/src/zh/design/replay.md
index a0b31bba..3826d089 100644
--- a/docs/src/zh/design/replay.md
+++ b/docs/src/zh/design/replay.md
@@ -15,13 +15,76 @@ Replay 把“Agent 曾经调用过哪些工具”转换成“这些工具在当
| Continue | 把重建的原生上下文交给指定版本的 Agent,校验首个续跑请求使用了该前缀;边界提示在 fresh observation 之后注入 |
| Finalize | 保存结果、质量、失败、重建轨迹与续跑产物;保留可定位的失败信息 |
-`adapter/` 负责轨迹解析、工具语义和启动选择;`bridge/` 负责 Claude、Codex、OpenCode 的模型协议桥。完整适配器与版本表见[回放指南](../guides/replay.md),版本不是“兼容任意新版”的承诺。
+`adapter/` 负责轨迹解析、工具语义和启动选择;`bridge/` 负责 Claude、Codex、OpenCode 的模型协议桥。各适配器的机制与固定版本见下文;固定版本是"已验证该版本"的声明,不是"兼容任意新版"的承诺。
+
+## 适配器机制与固定版本
+
+### Claude Code
+
+Claude Code 使用原生 JSONL/UUID session。SandboxReplay 解析活动 parent UUID 链,重放前 N 个完整工具批次,将新 observation 写入重建 session,然后通过 `claude --resume` 启动续跑。
+
+Claude Code 的 resume transport 会在模型请求前插入临时消息,因此 SandboxReplay 启动一个仅供本次续跑使用的本地协议桥。该桥验证并删除准确匹配的临时 envelope,使第一次模型请求仍结束在 `O′N`。它不启用 pVisor Gateway,也不捕获或持久化模型流量。
+
+异步子 Agent 的 `Agent` 与 `TaskOutput` 被视为 Claude Code 原生工具。恢复边界必须选在能够由原生 session 无歧义重建的位置。
+
+### OpenHands
+
+OpenHands 使用原生 event trajectory 和 ReplayManager。SandboxReplay 提取前 N 个 Action,OpenHands Runtime 在新沙箱中执行这些 Action 并产生新的 Observation;replay queue 耗尽后,OpenHands 直接发起续跑请求。
+
+### mini-swe-agent
+
+mini-swe-agent 使用原生 `mini-swe-agent-1.1` messages。配套 runner 保留原始 system 和任务消息,在新沙箱中重放前 N 个 action,并使用原生 observation formatter 将结果加入 `agent.messages`,随后直接调用下一次 `agent.step()`。
+
+### Pi agent
+
+Pi agent 适配固定支持 `@earendil-works/pi-coding-agent` `0.83.0`,输入为
+Pi 原生 RPC event JSONL。一个 replay step 对应一个完整的 `turn_end` 工具批次。
+SandboxReplay 使用 Pi 自身的工具实现重新执行 `read`、`bash`、`edit`、`write`,
+将新 observation 写入新建的 Pi v3 session,再通过 Pi SDK 从边界续跑。轨迹包含
+这四种工具之外的调用时会拒绝执行,避免静默改变工具语义。未配置边界提示词时调用
+Pi 的原生 `continue()`;配置后则在 `O′N` 后通过 `prompt()` 追加一次用户消息。
+
+### OpenCode
+
+OpenCode 适配固定支持 `1.17.7`,输入为 `opencode run --format=json` 产生的原生
+事件 JSONL。`user`、`step_start`、`text`、`reasoning`、`tool_use` 和
+`step_finish` 事件会按 step 分组;一个 replay step 对应一个完整的工具调用批次。
+SandboxReplay 在新沙箱中重新执行命令型工具以及 `read`、`write`、`edit` 文件工具,
+用新的 `state.output` 重建前缀,并通过 `opencode run --format=json --session` 从边界
+继续。工具执行期间的中间 `tool_use` 状态会合并,避免同一调用被重复回放。
+
+`opencode run` 没有 CLI 步数参数,且 1.17.7 在 resume 会话上不执行
+`agent.build.steps` 配置预算。SandboxReplay 因此为 OpenCode 引入了两个外部看门狗
+(对其它 Agent 不启用):续跑步数由 pVisor 监督 stderr 进度日志,达到剩余预算后发送
+SIGINT;连续 10 分钟无输出会触发空闲终止。预算触发结果为 `agent_status = max_steps`,
+metadata 记录 `opencode_step_budget`。这些机制针对固定适配版本;
+原始实测和诊断见 [实验报告](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/replay/qwen3.6-results.md)。
+
+### Codex
+
+Codex 适配固定支持 CLI `0.149.0`,输入为 Codex 原生 rollout JSONL。一个 replay step
+对应一组完整的 `function_call`/`custom_tool_call` 及其 outputs。SandboxReplay 在新沙箱
+中重放前缀工具,将原生 `response_item` 前缀写入隔离的 `CODEX_HOME`,再执行
+`codex exec resume --json`。native session ID 从 `session_meta` 自动提取;
+未知工具或缺少 native session ID 时显式失败,不会退化成全新会话。
+
+Codex 保留自身的 system prompt、工具定义和任务上下文,SandboxReplay 只替换边界前的
+observation。为兼容需要 resume prompt 的旧版 CLI,SandboxReplay 使用本地 Responses
+bridge 删除 transport nonce,再将请求转发到模型服务;续跑结束后也会从 native trajectory
+中清理 nonce。默认模式的输入条件为 `replayed_boundary_only`,不会向模型注入额外提示词。
+
+配置 `boundary_user_prompt` 时,提示词只在 `O′N` 后注入一次并保留;此时输入条件标记为
+`boundary_user_prompt_appended`。bridge 校验失败会拒绝续跑,不降级为直连。
回放历史工具会再次产生文件、命令和可能的远程副作用。文件检查点不保存这些外部状态;旧 observation 无法刷新时,默认拒绝,只有显式允许才记录降级。新上下文中的工具输出可以不同,模型继续时也可以选择不同动作,不能把成功续跑理解为确定性再现原轨迹。
Claude 历史 `Read` 只接受 workspace 内的普通文件。它保留指向 workspace 内部的既有 symlink 解析,但实际打开时以目录 FD 逐段拒绝新的 symlink,并以非阻塞打开后的 inode 类型检查拒绝 FIFO、目录和设备;FIFO 不需要 writer 或外层 Run timeout 才能返回工具错误。
-每次 `Read` 最多扫描 16 MiB(另探测一个字节以确认截断),最多返回 2,000 行文件正文,整个工具正文不超过 4 MiB。`offset` 从 1 开始,显式 `limit` 在这些预算内保持原义;达到扫描、行数或输出字节预算时保留已读内容,追加一行 `Read truncated by pvisor replay` 提示,并设置 observation 的 `truncated=true`。因此含提示的结果最多 2,001 行。若显式请求的范围已在扫描边界前完整取得,不因文件其他部分很大而标记截断。高 offset 超出扫描范围也会显示截断,不能将该结果解释为完整文件的 EOF。普通文件仍可能被并发修改;这些预算不构成文件快照,也不保证远程或故障文件系统的 I/O 延迟。
+每次 `Read` 最多扫描 16 MiB(另探测一个字节以确认截断),最多返回 2,000 行文件正文,整个工具正文不超过 4 MiB。`offset` 从 1 开始,显式 `limit` 在这些预算内保持原义;达到扫描、行数或输出字节预算时保留已读内容,追加一行 `Read truncated by pvisor replay` 提示,并设置 observation 的 `truncated=true`。因此含提示的结果最多 2,001 行。
+
+若显式请求的范围已在扫描边界前完整取得,不因文件其他部分很大而标记截断。高 offset 超出扫描范围也会显示截断,不能将该结果解释为完整文件的 EOF。
+
+普通文件仍可能被并发修改;这些预算不构成文件快照,也不保证远程或故障文件系统的 I/O 延迟。
## 代码与验证
diff --git a/docs/src/zh/why/agent-lifecycle-cost.md b/docs/src/zh/design/research/agent-lifecycle-cost.md
similarity index 78%
rename from docs/src/zh/why/agent-lifecycle-cost.md
rename to docs/src/zh/design/research/agent-lifecycle-cost.md
index 8b2513de..9a1ae45d 100644
--- a/docs/src/zh/why/agent-lifecycle-cost.md
+++ b/docs/src/zh/design/research/agent-lifecycle-cost.md
@@ -1,8 +1,8 @@
-# Agent 时代为何需要 pVisor
+# Agent 任务的生命周期成本
**pVisor 要建立一种新的 Agent 执行范式:Agent 保持原有的顺序执行方式,由共享执行引擎接管可代理的 I/O,在等待期间回收资源,事件就绪后恢复原来的执行时间线。**
-让自主 Agent 的执行可以规模化,需要改变资源跟随任务的方式。启动更快的沙箱是基础;更大的机会在于,让大量有状态的 Agent 可以持续推进,而不必为每条时间线始终保留一份完整的驻留环境。
+让自主 Agent 的执行规模化,会改变资源跟随任务的方式。更快的沙箱启动是基础;更大的机会在于,让大量有状态的 Agent 持续推进,而不必为每条时间线从头到尾保留一份完整驻留环境。
## Agent 的时间线连续,资源需求却是间歇的 {#waiting-cost}
@@ -10,7 +10,7 @@
计算与等待在这条时间线上反复交替。等待模型回答时,推理发生在外部服务,沙箱却可能继续持有内存、缓存和进程状态。
-DeepSeek 的 **DSec(DeepSeek Elastic Compute)** 报告给出了生产证据:在 2026 年初一周的样本中,约 90% 的容器和 microVM 沙箱,平均 CPU 使用量不超过申请量的 5%;生命周期中位数分别为 17.4 和 15.5 分钟,两者 P99 均超过 3 小时。报告也明确指出,沙箱会等待模型生成下一步动作,而状态和缓存仍然保留。[DSec §1、§4.3,图 5、图 7](https://arxiv.org/html/2609.22978v1#S4.SS3)
+DeepSeek 的 **DSec(DeepSeek Elastic Compute)** 报告给出了生产证据:2026 年初一周的样本中,容器与 microVM 两类后端约 90% 的沙箱,平均 CPU 使用量不超过申请量的 5%。生命周期中位数分别为 17.4 和 15.5 分钟,P99 均超过 3 小时。报告也明确指出,沙箱会等待模型生成下一步动作,而状态和缓存仍然保留。[DSec §1、§4.3,图 5、图 7](https://arxiv.org/html/2609.22978v1#S4.SS3)

@@ -24,15 +24,15 @@ DeepSeek 的 **DSec(DeepSeek Elastic Compute)** 报告给出了生产证据

-事件驱动把等待集中起来,让较少的线程处理大量连接。Reactor 常用 epoll 等就绪通知,Proactor 围绕异步完成组织执行,IOCP 则提供完成通知与并发处理机制。直接采用这些模型,往往需要把顺序代码拆成状态机或回调,开发者也要管理更多执行状态。[epoll](https://man7.org/linux/man-pages/man7/epoll.7.html)、[IOCP](https://learn.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports)
+事件驱动把等待集中起来,用更少的线程处理大量连接。Reactor 等待 epoll 这类就绪通知;Proactor 提交操作后等待完成通知,IOCP 就是这种模型。直接采用这些模型,往往要把顺序代码拆成状态机或回调,并管理更多执行状态。[epoll](https://man7.org/linux/man-pages/man7/epoll.7.html)、[IOCP](https://learn.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports)
透明协程进一步把这种改造集中到运行时:程序继续按顺序表达逻辑,运行时通过系统调用挂钩或标准库适配,把支持的阻塞 I/O 交给事件引擎;等待时挂起协程,就绪后从原来的调用位置继续。例如 libco 通过 socket 函数挂钩和 epoll / kqueue,让业务保留同步写法、异步执行。[libco](https://github.com/Tencent/libco)、[Go 的运行时调度](https://go.dev/doc/faq#goroutines)

-图中用一个工作线程说明复用关系,实际可以扩展为多个。Reactor 通知“可以尝试读写”,Proactor 通知“已提交的操作完成”;协程则让应用不必直接围绕这些事件拆分状态。这里的透明,是在已适配的 I/O 上保留调用语义,并不意味着任意多线程程序都能自动、无损地迁移。
+图中用一个工作线程说明复用关系,实际可以扩展为多个。Reactor 通知“可以尝试读写”,Proactor 通知“已提交的操作完成”;协程则让应用不必直接围绕这些事件拆分状态。透明只覆盖已适配的 I/O 路径,并在那里保留调用语义;任意多线程程序仍需要显式迁移。
-**pVisor 希望把这种转变带到 Agent 执行层。** Agent 继续使用已有的代码和 Linux 工具,执行引擎负责把可接管的等待转成事件驱动的推进与恢复。适配工作集中在运行时,无须让每个 Agent 都重写自己的并发结构。
+**pVisor 把这种转变用到 Agent 执行层。** Agent 继续使用已有的代码和 Linux 工具;执行引擎把可接管的等待转成事件驱动的推进与恢复。适配留在运行时,Agent 不必重写并发结构。
## 用虚拟机承载 Agent 的执行上下文 {#agent-iocp}
@@ -40,11 +40,11 @@ DeepSeek 的 **DSec(DeepSeek Elastic Compute)** 报告给出了生产证据

-**Agent 无感,意味着它继续运行原来的代码、使用原来的 Linux 工具、发起原来的调用。** 文件和网络 I/O 经过 Linux 与虚拟设备进入宿主,pVisor 在已适配的设备与协议路径接管请求。对 guest 内核、VMM 和宿主服务的改造集中在这一层,Agent 无需改写成异步程序,也无需调用专用的挂起、卸载或恢复接口。[VM 执行路径](../design/vm-runtime.md)
+**Agent 无感,意味着它继续运行原来的代码、使用原来的 Linux 工具、保留原来的阻塞调用。** 文件和网络 I/O 经过 Linux 与虚拟设备进入宿主,pVisor 在已适配的设备与协议路径接管请求。对 guest 内核、VMM 和宿主服务的改造集中在这一层,目标设计中,Agent 无需改写成异步程序,也无需调用专用的挂起、卸载或恢复接口。[VM 执行路径](../vm-runtime.md)
## Agent 看到连续执行,宿主按事件调度 {#execution-path}
-以一次可代理的模型请求为例:Agent 发起请求后照常等待。pVisor 将请求交给宿主推进,在整个 guest 可以安全等待时保存上下文、回收可卸载内存,让可复用的资源服务其他 Agent。响应到达后,pVisor 恢复这份上下文,让原来的调用返回,Agent 接着处理结果。
+以一次可代理的模型请求为例:Agent 发起请求后照常等待。pVisor 把请求交给宿主,由宿主推进;在整个 guest 可以安全等待时保存上下文、回收可卸载内存,让可复用的资源服务其他 Agent。响应到达后,pVisor 恢复这份上下文,让原来的调用返回,Agent 接着处理结果。

@@ -52,7 +52,7 @@ DeepSeek 的 **DSec(DeepSeek Elastic Compute)** 报告给出了生产证据
透明性的边界是原有调用语义:结果、错误、文件顺序和同步要求都要保留。宿主必须先持有独立的请求和数据,才能解除 I/O 对 guest RAM 的依赖;模型请求还需要协议适配,普通 TCP 转发无法自动接管 guest 内的 TLS 会话。后台仍有可运行工作时,guest 继续执行。
-大批量写入也需要这种所有权转移。宿主取得独立的待写数据后,可以负责排队、合并和落盘;在保留写入顺序、错误及同步语义的前提下,当整个 guest 只剩对这些操作的等待,就有机会卸载它。**用较小的宿主缓冲,换回更大的 guest 驻留内存,是大规模异步化值得攻关的原因。** 队列背压、同步操作和仍在运行的后台任务都会影响可卸载窗口,缓冲本身也必须计入资源成本。[Agent I/O 完成机制](../design/experimental/agent-io-completion/index.md)
+大批量写入也需要这种所有权转移。宿主取得独立的待写数据后,可以负责排队、合并和落盘;在保留写入顺序、错误及同步语义的前提下,当整个 guest 只剩对这些操作的等待,就有机会卸载它。**用较小的宿主缓冲,换回更大的 guest 驻留内存,是大规模异步化值得攻关的原因。** 队列背压、同步操作和仍在运行的后台任务都会影响可卸载窗口,缓冲本身也必须计入资源成本。[Agent I/O 完成机制](../experimental/agent-io-completion/index.md)
阻塞的 vCPU 本来就允许宿主调度其他工作。这里进一步追求的容量收益,主要来自回收等待中的 guest 仍然持有的物理内存。
@@ -68,7 +68,7 @@ DeepSeek 的 **DSec(DeepSeek Elastic Compute)** 报告给出了生产证据
| [AgentSysBench,v1,§8.3、图 25(c,d)](https://arxiv.org/html/2608.15127v1#S8.SS3) | Mini-SWE 原型在模型规划调用超过固定时间阈值后卸载 sandbox,下一工具步骤前恢复;平均/峰值驻留内存降至基线的 1/4.6、1/2.1,延迟增加不超过 0.5% | 直接支持等待期卸载的收益潜力;指标是该次运行中全部并发 sandbox 进程的合计驻留内存,尚未证明整节点密度或整 VM 卸载 |
| [pVisor 历史静态内存测量](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/memory/README.md#published-curves-and-archived-history)及其归档读数 | Linux x86_64/KVM,512 MiB guest、64 MiB 应用工作集;完整产品进程 PSS 约 179–181 MiB → 36 MiB,下降约 80%;含缓存的产品组 cgroup 约 224 MiB → 19 MiB | 给卸载后残留量提供参考;每条件 N=1、5 秒窗口,属于历史批次,不能代替真实 Agent 或整节点容量测量 |
-AgentSysBench 未披露该卸载实验的阈值数值、并发数和底层卸载机制,适合作为方向证据。pVisor 的 PSS 与 cgroup 是不同口径,不能相加,也都不能直接替代整节点净回收量。
+AgentSysBench 未披露该卸载实验的阈值数值、并发数和底层卸载机制,足以说明方向可行,但不能给出下面的参数取值。pVisor 的 PSS 与 cgroup 是不同口径,不能相加,也都不能直接替代整节点净回收量。
负载差异同样有公开证据。[AgentCgroup,v2,§3.2](https://arxiv.org/html/2602.09345v2#S3.SS2) 的 SWE-rebench 实验中,LLM 推理仅占端到端时间的 26–44%,其余包含工具执行与初始化。因此,可卸载比例需要按目标负载设定;DSec 的低平均 CPU 使用率也不能换算成“95% 的时间可以卸载”。
@@ -98,9 +98,9 @@ K_memory = m0 / m1 = 1 / (1 - f * r + h)
例如中性情景是 `1 - 70% × 80% + 5% = 49%`。若原来每个 Agent 平均占用 1 GiB,相同口径下预计变为约 0.49 GiB。扣除系统、共享引擎与恢复余量后,同样的 100 GiB Agent 内存预算,对应约 100 → 204 个执行上下文的平均驻留预算。
-`f = 70%` 已经要求大部分相关等待都能安全接管;它不是把公开研究的 69.4% 四舍五入得到的实测参数。`r = 80%` 借鉴小工作集卸载的量级,实际还受工作集、共享和缓存影响。`h = 5%` 则是待实现验证的预算:对于 1 GiB 原驻留,它允许平均新增约 51 MiB;原驻留较小或同时积压大量响应时,需要重新估算。
+`f = 70%` 假设大部分相关等待都能安全接管。它是设计假设,不是把公开研究的 69.4% 四舍五入得到的实测参数。`r = 80%` 借鉴小工作集卸载的量级,实际还受工作集、共享和缓存影响。`h = 5%` 则是待实现验证的预算:对于 1 GiB 原驻留,它允许平均新增约 51 MiB;原驻留较小或同时积压大量响应时,需要重新估算。
-宿主缓冲值得投入多少内存,也可以用这个模型判断。固定 `f = 70%`、`r = 80%`,若 `h` 从 5% 增至 15% 或 30%,倍率会从 2.04 降到 1.69 或 1.35。现有实验性宿主写缓存的单连接 payload 上限为 64 MiB,上限并不等于平均占用;多连接、元数据与响应暂存仍要共同受预算约束。[缓冲预算与当前限制](../design/experimental/agent-io-completion/index.md)
+宿主缓冲值得投入多少内存,也可以用这个模型判断。固定 `f = 70%`、`r = 80%`,若 `h` 从 5% 增至 15% 或 30%,倍率会从 2.04 降到 1.69 或 1.35。现有实验性宿主写缓存的单连接 payload 上限为 64 MiB,上限并不等于平均占用;多连接、元数据与响应暂存仍要共同受预算约束。[缓冲预算与当前限制](../experimental/agent-io-completion/index.md)
### 把恢复和峰值计入成本 {#capacity-limits}
@@ -112,7 +112,7 @@ N_memory = floor((R_node - S_fixed - P_headroom) / m)
`S_fixed` 包含系统和共享服务,`P_headroom` 为活动峰值、同时恢复及临时复制保留空间。前后的可用预算相同时,才得到表中的倍率;共享引擎或恢复余量增加时,还要乘以前后可用预算之比。等待阶段错开、恢复准入和硬预算共同决定实际可部署容量。
-卸载与恢复也会增加任务时间。现有同一历史静态批次中,raw 卸载操作为约 44–98 ms;随后包含恢复、64 MiB 数据摘要及写入/fsync/读回校验的完整任务,相比不卸载增加约 156–178 ms。这是后台编译环境中的单次观察差值,不是独立 resume 延迟或尾延迟保证。[计时定义与数据](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/memory/README.md#published-curves-and-archived-history)
+卸载与恢复也会增加任务时间。现有同一历史静态批次中,raw 卸载操作为约 44–98 ms;随后包含恢复、64 MiB 数据摘要及写入/fsync/读回校验的完整任务,相比不卸载增加约 156–178 ms。这是后台编译环境中的单次观察差值;它既不是独立 resume 延迟,也不是尾延迟保证。[计时定义与数据](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/memory/README.md#published-curves-and-archived-history)
若端到端任务时间增加比例为 `delta`,分别按原方案与新方案的完整任务计算平均驻留,每次完成任务的内存时间成本比例为:
@@ -146,6 +146,6 @@ C_memory_time_new / C_memory_time_old = (m1 / m0) * (1 + delta)
| 同时唤醒数、读写字节、活动/恢复峰值和恢复至首次有效执行的延迟分布 | 恢复余量、带宽及排队是否允许预计承载量;尾延迟需要足够样本 |
| 原调用的输出、错误、顺序、同步、取消,以及任务完成数和端到端延迟 | 增加的执行上下文能否保持正确并完成有效工作 |
-现有基础包括受控文件与网络路径、暂停与内存卸载原语,以及实验性的宿主写缓存;自动识别等待、接管 I/O、完成唤醒与恢复调度仍需贯通验证。两图展示的是这一目标机制。[等待与卸载实验](../design/experimental/vcpu-idle-offload/index.md)、[Agent I/O 完成机制](../design/experimental/agent-io-completion/index.md)
+现有基础包括受控文件与网络路径、暂停与内存卸载原语,以及实验性的宿主写缓存;自动识别等待、接管 I/O、完成唤醒与恢复调度仍需贯通验证。[等待与卸载实验](../experimental/vcpu-idle-offload/index.md)、[Agent I/O 完成机制](../experimental/agent-io-completion/index.md)
-**pVisor 要让 Agent 像使用透明协程那样,保留熟悉的执行方式,由运行时把等待转化为资源共享的机会。虚拟机提供承载这次转变的上下文与控制边界。**
+**透明协程是最接近的先例:顺序代码、共享资源、运行时管理的等待。pVisor 把这套模型用到 Agent 执行上,由虚拟机提供上下文与控制边界。**
diff --git a/docs/src/zh/why/assets/agent-transparent-scheduling.svg b/docs/src/zh/design/research/assets/agent-transparent-scheduling.svg
similarity index 100%
rename from docs/src/zh/why/assets/agent-transparent-scheduling.svg
rename to docs/src/zh/design/research/assets/agent-transparent-scheduling.svg
diff --git a/docs/src/zh/why/assets/agent-vm-coroutine-bridge.svg b/docs/src/zh/design/research/assets/agent-vm-coroutine-bridge.svg
similarity index 100%
rename from docs/src/zh/why/assets/agent-vm-coroutine-bridge.svg
rename to docs/src/zh/design/research/assets/agent-vm-coroutine-bridge.svg
diff --git a/docs/src/zh/why/assets/agent-workload-phases.svg b/docs/src/zh/design/research/assets/agent-workload-phases.svg
similarity index 100%
rename from docs/src/zh/why/assets/agent-workload-phases.svg
rename to docs/src/zh/design/research/assets/agent-workload-phases.svg
diff --git a/docs/src/zh/why/assets/io-events-coroutines.svg b/docs/src/zh/design/research/assets/io-events-coroutines.svg
similarity index 100%
rename from docs/src/zh/why/assets/io-events-coroutines.svg
rename to docs/src/zh/design/research/assets/io-events-coroutines.svg
diff --git a/docs/src/zh/why/assets/io-thread-timelines.svg b/docs/src/zh/design/research/assets/io-thread-timelines.svg
similarity index 100%
rename from docs/src/zh/why/assets/io-thread-timelines.svg
rename to docs/src/zh/design/research/assets/io-thread-timelines.svg
diff --git a/docs/src/zh/design/research/cluster-execution.md b/docs/src/zh/design/research/cluster-execution.md
deleted file mode 100644
index 45a900f7..00000000
--- a/docs/src/zh/design/research/cluster-execution.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# 集群规模执行与集中证据
-
-通过**外部编排**把执行扩展到多主机,同时明确每次执行的边界与证据。Kubernetes、Ray 或训练框架可以拥有主机选择和业务工作流,pVisor 不用分布式产品控制面替代它们。
-
-## 本机执行基础 {#execution-flow}
-
-普通 `pvisor run` 通过原生执行器、可选暂存与 Gateway 管理 Job/Run/Attempt 并生成执行记录。[单节点 daemon](../daemon/index.md) 则拥有本机原生 VM sandbox 准入、生命周期、TTL 和服务端点。部分 OpenSandbox profile 不自动提供原生 Job 语义、VM restore、stage/apply、offload 或集中 Run Bundle。
-
-原生 node 资源可以在一台主机上保留不可变环境/backing 所有权,独立于 daemon。它们不跨机器共享物理 RAM,也未接入 daemon 后端,见[共享工作集](../daemon/shared-working-set.md)。
-
-早期 Controller/Worker 实现探索了分布式执行和证据交付。其归档测量保留历史范围,不描述新 daemon,也不验证当前分布式产品。
-
-## 产品与外部集成边界 {#boundary}
-
-| 层 | 当前职责 | 待集成/验证 |
-| --- | --- | --- |
-| 原生 pVisor 执行 | Job 生命周期、执行器控制、暂存、可选 Gateway 与记录 | 编排适配器和代表性工作负载验收 |
-| Sandbox daemon | NativeRuntime VM 准入、持久 supervisor 归属、生命周期与真实服务代理 | Bootstrap 提供/验证与 SDK profile;没有 stage/checkpoint API 或密度证据 |
-| 原生 node 资源 | 本机不可变所有权、pin 与有界 warming | Daemon 接入、完整瞬时记账和工作负载测量 |
-| 外部编排 | 主机选择、队列、依赖、重试与租户 | 显式执行/证据交接及业务副作用核对 |
-| 证据/检查点仓库 | 原生完整性、发布与保留合同 | 集中收集、授权、复制与跨主机兼容性 |
-| 评审/发布服务 | 消费明确保留的输出 | 基线核对、选择接受、业务核对与发布 |
-
-本机记录路径或上传 JSON 不代表完整文件传输。检查点可下载不证明任意主机兼容恢复。把恢复解释为等价执行前,需定义固定输入、运行时 profile、模型版本与存储授权。
-
-## 待设计实验 {#validation}
-
-将使用 pVisor 执行边界的外部编排与固定版本 Kubernetes/Ray 或训练框架基线比较。固定工作负载、资源、模型和输出检查,测量有效完成吞吐、首个结果/恢复长尾、整组内存与集中评审成本。从[并发密度方法](../../benchmarks/density.md)扩展,不从历史空任务或原生共享机制外推 daemon 收益。
-
-注入主机丢失、daemon/编排停机、分区、磁盘满、收集中断与凭据撤销。分别跟踪编排工作身份、本机 sandbox 或 Job/Run/Attempt 身份、原生观察及产物。超时或控制身份不证明外部副作用停止,重试策略必须核对未知副作用。
-
-该研究方向不建立跨主机恢复、恰好一次外部副作用或 daemon 密度优势。当前 daemon [运维](../daemon/operations.md)只定义本机行为。
-
-## 研究问题 {#research}
-
-- 执行与编排之间怎样的最小交接能保留请求策略、实际控制、观察结果和完整证据?
-- 哪些保留输入与运行时兼容检查让恢复可移植,哪些副作用需要业务核对而非 replay?
-- 在固定正确性与审计覆盖下,批量评审节省多少监督成本,包括收集与存储成本?
-- 在相同总资源下,不可变共享或有界按需加载能否改善首个有效结果和完整完成?
-
-本机流程见[并行 Agent](../../guides/parallel-agents.md),训练集成见 [RL 执行底座](rl-execution-substrate.md)。研究计划不创建产品调度器,也不替代生产验收。
diff --git a/docs/src/zh/design/research/design-documents.md b/docs/src/zh/design/research/design-documents.md
deleted file mode 100644
index 5e32a960..00000000
--- a/docs/src/zh/design/research/design-documents.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# 开源设计文档参考
-
-[ByteHook 的《项目介绍和原理概述》](https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md)是 pVisor 设计章节的主要写作参考。它先建立理解机制所需的底层模型,再用图说明对象和调用关系,最后解释工程选择与约束。读者沿着因果关系进入实现。
-
-对应到 pVisor,讲解顺序是:执行问题与总体所有权 → VM、vCPU 和 virtio → 内存映射、共享与缺页 → 文件系统、镜像与网络请求 → 快照一致性和日志提交 → 成本与实验。图里应出现真实的缓冲区、文件、队列、引用和状态变化,正文沿图解释每一步为什么必要。
-
-[设计与底层原理](../index.md)以一个读文件、访问 HTTPS、写回配置的任务贯穿这些层次。下面保留其他项目在局部主题上的参考,作为这种连续原理讲解的补充。
-
-## 参考项目与具体文章 {#projects}
-
-以下评价针对文档表达与组织,是设计写作建议,不评价项目整体质量或给出性能排名。来源于 2026-10-07 访问的官方文档;实现细节以各项目明确版本为准。
-
-| 项目与文章 | 值得学习的表达 | 在 pVisor 中的落点 |
-| --- | --- | --- |
-| [ByteHook · 项目介绍和原理概述](https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md) | 从必要底层模型推导机制,用图连接对象与调用,解释工程约束 | 将 syscall、virtqueue、backing、preimage 和提交点接回完整执行路径 |
-| [TigerBeetle · Architecture](https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/ARCHITECTURE.md) | 从工作负载和约束开始,沿总体模型进入持久化与设计决定,解释机制为何适合问题 | 先说明状态复用、写入、故障与预算,再解释 slot/reference、Journal 和 snapshot |
-| [Firecracker · Design](https://github.com/firecracker-microvm/firecracker/blob/main/docs/design.md) | 宿主集成、进程/线程与设备模型放在同一架构叙述中,明确热路径和宿主责任 | 画出 API、supervisor、VM、设备与 pool;分别解释控制路径和数据路径 |
-| [gVisor · Architecture guide](https://gvisor.dev/docs/architecture_guide/intro/) | 用系统调用例子解释 Sentry/宿主关系,把边界机制和兼容性放在一起 | 沿一次文件或网络请求展示实际拦截位置,说明 Host/OCI/VM 的不同覆盖 |
-| [Tokio · Runtime](https://docs.rs/tokio/latest/tokio/runtime/index.html) | 先给使用模型,再写线程寿命、公平性假设和具体调度行为;实现细节与保证分开 | 明确 waiter cancellation、accepted operation、completion task 与 runtime shutdown 的关系 |
-| [etcd · Client design](https://etcd.io/docs/v3.6/learning/design-client/) | 以客户端职责、错误和重试语义解释连接与请求行为 | 说明 lost ACK、Unknown、request ID、重试和核对;用时序图定位结果不明的窗口 |
-| [Ray · Architecture whitepapers](https://docs.ray.io/en/latest/ray-contribute/whitepaper.html) | 总体架构与内部专题分开,论文保留版本身份 | 将外部编排、节点 owner、执行数据面和研究材料分层,避免把提案写成现有控制面 |
-| [Rust Compiler Development Guide · Overview](https://rustc-dev-guide.rust-lang.org/overview.html) | 从处理流程进入 query、数据结构与源码入口,明确简化模型的边界 | 从 Job/Attempt 到调用链,再进入核心数据、生命周期和实现文件 |
-| [CockroachDB · Design](https://github.com/cockroachdb/cockroach/blob/master/docs/design.md) | 分层图连接数据抽象、组件与物理布局;历史设计保留局限 | 用 logical Job、persistent records、backing/object 层说明存储;引用历史文章时注明身份 |
-
-选择局部参考时,先确定要解释的具体问题:宿主集成可查 Firecracker,并发保证可查 Tokio,失败重试可查 etcd。pVisor 的主线仍围绕自身的数据和执行路径展开,避免让读者先记住大量组件名称才能理解行为。
-
-## 一项机制的完整解释 {#structure}
-
-
-
-1. **问题与约束。** 谁遇到什么成本?固定哪些资源和信任前提?
-2. **最小系统模型。** 哪个组件拥有状态,谁能修改,谁负责释放?
-3. **正常流程。** 沿一个实际请求画出调用、数据、提交点和返回值。
-4. **失败流程。** 找出取消、断联、写失败与进程退出时留下的状态及核对路径。
-5. **取舍。** 说明减少哪项成本、增加哪项成本,以及替代方案的适用范围。
-6. **实现与证据。** 给出源码入口和现有材料,将已实现行为、工作负载结果与提案分别标明。
-
-例如 Journal:先说明事件身份与幂等重试,再画 append、write、sync 与 receipt;写失败保留 Unknown,重复相同 event 不产生第二条记录。这样读者能理解失败语义,同时不会把 LocalSync 推成远端复制保证。[Journal 设计](../journal.md)维护具体合同。
-
-## 图的选择与信息密度 {#figures}
-
-| 读者的问题 | 合适的图 | 图中必须可辨认的内容 |
-| --- | --- | --- |
-| 谁负责哪件事? | 分层架构 / 所有权图 | owner、边界、调用方向、外部依赖 |
-| 一次操作如何完成? | 时序 / 生命周期图 | 接受、提交、确认、取消、返回 |
-| 数据究竟放在哪里? | 物理布局 / 映射图 | 对象、引用、偏移、private/shared、回收条件 |
-| 崩溃后会留下什么? | 故障状态图 | 持久意图、live observation、Unknown、核对 |
-| 为何更便宜或更慢? | 有来源的实验图 | 预算、基线、样本、失败、峰值与适用负载 |
-
-每张图只解释一个核心问题。箭头说明调用、数据、引用或状态变化;实线和虚线的含义在各图中明确标注。SVG 保持文字可搜索、矢量可缩放,正文补充一个具体例子与主要取舍。图中的组件关系应能在源码或合同中找到对应入口。
-
-总体架构图采用与文档一致的深蓝底、蓝灰分层、浅蓝标题和嵌套圆角,以执行机制为视觉中心,保留清晰的描边来表达嵌套关系。`pvisor-vm` 内并列展开 vCPU、RAM 和虚拟设备,下方呈现三者共同参与的一致性冻结与平台适配;共享契约和可选扩展只保留辅助标注。VM、内存、文件系统与网络的子系统框图沿用这套视觉语言,放大总图中的相应边界。每个专题依次解释框图与所有权、一次访问、核心数据和机制、失败与回收、与整体的连接及源码入口。更细的原理图采用教材分层风格:明暗不同的蓝色横带划分执行层、地址空间或阶段,深色卡片表示具体对象,同一对象在不同层或前后状态中保持对齐。编号连接正文步骤;颜色含义同时写在标签中。时序图保留时间轴,字节布局图保留偏移和比例,长图按主题拆成可单独阅读的局部图。
-
-图的底色使用 `#0d1b30`,卡片使用 `#142840`,强调色使用 `#a8cefa`,文字使用 `#e9eef8`,与站点主题保持一致。青绿、琥珀和暗红按原图语义区分共享、变化和冲突等状态,并保留文字标注。SVG 内保存完整配色,独立打开和导出的 PNG 也保持相同观感。
-
-## 设计、决策和研究分别维护 {#status}
-
-实现设计维护当前所有权与行为;[ADR](../decisions/index.md)维护决定的背景、选项和后果;研究材料维护假设、实验及反例。外部项目文章是表达参考;pVisor 的实现状态和性能结论继续由自己的版本与证据约束。
diff --git a/docs/src/zh/design/research/index.md b/docs/src/zh/design/research/index.md
index 143c899a..307f640c 100644
--- a/docs/src/zh/design/research/index.md
+++ b/docs/src/zh/design/research/index.md
@@ -1,6 +1,6 @@
# 研究方向
-OS 与 MLSys 研究关注固定资源下的正确任务完成量,以及人类处理这些结果的成本。pVisor 提供执行、状态与证据的机制;外部编排和训练器把它们组合成工作负载,再用对照实验判断收益。
+OS 与 MLSys 研究关注固定资源下的正确任务完成量,以及人类处理这些结果的成本。pVisor 提供执行、状态与证据的机制;外部编排和训练器把它们组合成工作负载,再用对照实验判断收益。从环境准备、工具运行、模型等待与失败重做的成本出发的完整叙事见[Agent 任务的生命周期成本](agent-lifecycle-cost.md)。
## 从机制到可证伪结论 {#research-loop}
@@ -10,9 +10,19 @@ OS 与 MLSys 研究关注固定资源下的正确任务完成量,以及人类
## 执行与编排的所有权 {#ownership}
-pVisor 拥有单次执行的边界与观察;单节点 daemon 拥有本机 sandbox 归属与生命周期。外部编排拥有主机选择、队列、依赖与业务重试;训练器拥有模型、采样、奖励和评估器版本。[Daemon API](../daemon/index.md)尚未暴露原生 Job 暂存、execution checkpoint 和 Run Bundle 导出,因此研究接入需要显式的执行/证据交接。
+pVisor 拥有单次执行的边界与观察;单节点 daemon 拥有本机 sandbox 归属与生命周期。外部编排(Kubernetes、Ray 或训练框架)拥有主机选择、队列、依赖与业务重试;训练器拥有模型、采样、奖励和评估器版本。pVisor 不用分布式产品控制面替代它们。
-拟议适配把外部工作身份绑定到本机 Job/Attempt 或 sandbox,固定输入与运行时版本,将结果和制品一起收集。超时或断联保留未知结果,先核对再重试。[外部编排研究](cluster-execution.md)研究这一交接边界,主机调度继续由外部提供。
+[Daemon API](../daemon/index.md) 尚未暴露原生 Job 暂存、execution checkpoint 和 Run Bundle 导出,因此研究接入需要显式的执行/证据交接。各层的当前职责与待验证项:
+
+| 层 | 当前职责 | 待集成/验证 |
+| --- | --- | --- |
+| 原生 pVisor 执行 | Job 生命周期、执行器控制、暂存、可选 Gateway 与记录 | 编排适配器和代表性工作负载验收 |
+| Sandbox daemon | NativeRuntime VM 准入、持久 supervisor 归属、生命周期与真实服务代理 | Bootstrap 提供/验证与 SDK profile;没有 stage/checkpoint API 或密度证据 |
+| 原生 node 资源 | 本机不可变所有权、pin 与有界 warming | Daemon 接入、完整瞬时记账和工作负载测量 |
+| 外部编排 | 主机选择、队列、依赖、重试与租户 | 显式执行/证据交接及业务副作用核对 |
+| 证据/检查点仓库 | 原生完整性、发布与保留合同 | 集中收集、授权、复制与跨主机兼容性 |
+
+本机记录路径或上传 JSON 不代表完整文件传输;检查点可下载不证明任意主机兼容恢复。早期 Controller/Worker 实现的归档测量保留历史范围,不描述当前 daemon。
## 三类状态、三个评价对象 {#state}
@@ -22,7 +32,15 @@ pVisor 拥有单次执行的边界与观察;单节点 daemon 拥有本机 sand
| Agent 轨迹 | 模型上下文与工具历史 | 前缀准备、工具重执行差异、模型续跑 |
| VM execution checkpoint | 支持 profile 的 CPU/RAM/设备/文件状态 | 一致性、兼容性、恢复与分叉成本 |
-工具重执行产生 fresh observation,远程服务状态和训练 metadata 另行保存。执行成功、任务 reward 和文件接受分别判定,具体接合见[RL 执行基座](rl-execution-substrate.md)。
+工具重执行产生 fresh observation,远程服务状态和训练 metadata 另行保存。执行成功、任务 reward 和文件接受分别判定:reward 由 evaluator 计算,pVisor 的成功结束只是执行结果。
+
+## 一次 rollout 的执行契约 {#rollout-contract}
+
+输入包含 task ID、attempt ID、仓库提交或镜像摘要、工作区、Agent 命令、策略、资源预算与随机种子;输出包含结束状态、退出码、文件候选、Run Bundle、原生轨迹,以及启用捕获时的 Gateway Journal。训练器把这些产物与模型版本、采样参数、reward 和 evaluator 版本关联。环境准备失败、权限拒绝和上游请求失败有自己的类别;评价模型解题能力时,按预先确定的规则处理这些基础设施失败。
+
+最小集成顺序:先按 [rollout 指南](../../guides/rl-rollouts.md) 完成一个离线任务的候选收集与评分;再用独立工作区增加并发,确保每个 attempt 的文件和记录相互独立;最后接入原生 Agent 轨迹,分别验证前缀准备、工具重执行和模型续跑。回放工具会产生新观察,replay 的新观察与旧会话文字不能简单视为相同实验输入。
+
+需要实验证明的部分:每秒完成的 rollout、尾延迟、每个候选的磁盘与驻留内存、fork/checkpoint 成本、工具重执行成本和 reward delta。固定模型服务容量,区分执行底座与模型服务瓶颈。异步队列、跨节点容错、奖励去重、共享前缀收益和大规模采样尚需集成与测量。
## 评价收益的证据层次 {#evidence}
@@ -33,8 +51,17 @@ pVisor 拥有单次执行的边界与观察;单节点 daemon 拥有本机 sand
- **产品证据:** 包含准备、SDK、guest 服务、回收、长期并发与故障波及范围。
- **监督证据:** 记录实际审查时间、拒绝与返工;machine CPU 成本不代替人类注意力。
-原生 pool 或 offload 探针不能单独建立完整 daemon 密度。旧 Controller/Worker 数据保留其历史身份。外部编排和 RL 适配仍在研究/规划阶段,收益需要各自工作负载验证。
+原生 pool 或 offload 探针不能单独建立完整 daemon 密度。外部编排和 RL 适配仍在研究/规划阶段,收益需要各自工作负载验证;注入主机丢失、daemon/编排停机、分区、磁盘满等故障时,超时或控制身份不证明外部副作用停止,重试策略必须核对未知副作用。该方向不建立跨主机恢复、恰好一次外部副作用或 daemon 密度优势。
+
+## 研究问题 {#questions}
+
+- 执行与编排之间怎样的最小交接能保留请求策略、实际控制、观察结果和完整证据?
+- 哪些保留输入与运行时兼容检查让恢复可移植,哪些副作用需要业务核对而非 replay?
+- 在固定正确性与审计覆盖下,批量评审节省多少监督成本,包括收集与存储成本?
+- 在相同总资源下,不可变共享或有界按需加载能否改善首个有效结果和完整完成?
+
+研究计划不创建产品调度器,也不替代生产验收。
-## 设计与论文的使用方式 {#references}
+## 公开材料与写作参考 {#references}
-[公开研究产出](publications.md)保留材料、版本与实验范围;当前尚未登记正式论文、外部报告或演讲。[开源设计文档参考](design-documents.md)解释如何借鉴问题定义、分层图、时序、失败语义与取舍,不把文档写法转成产品保证。
+当前没有登记的正式论文、外部报告或演讲;公开技术材料就是仓库中的设计文档与基准证据(如[回放保真度](../../benchmarks/replay-fidelity.md)),引用时带上报告日期、机器、执行器、任务和统计口径。设计文档的写作方式与开源项目表达参考维护在仓库的 [docs/README.md](https://github.com/DeepLink-org/pvisor/blob/main/docs/README.md),不在这里重复。
diff --git a/docs/src/zh/design/research/publications.md b/docs/src/zh/design/research/publications.md
deleted file mode 100644
index 1cf5f2a4..00000000
--- a/docs/src/zh/design/research/publications.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# 论文、报告与演讲
-
-pVisor 目前的公开技术材料由仓库设计与工程实验组成,可用于理解执行机制、选择实验对象,以及追溯结果对应的源码和运行环境。
-
-## 已有工程材料 {#materials}
-
-[回放保真度报告](../../benchmarks/replay-fidelity.md)测量固定版本轨迹格式的短前缀准备:校验历史边界、命令参数与工具观测,并记录从 CLI 启动到准备结束的耗时。`prepare-only` 不执行工具、不启动 Agent,也不修改工作区。这些结果可用于选择历史上下文输入;[回放设计](../replay.md)解释前缀准备、工具重执行与实时续跑的职责。
-
-[RAM offload 附录](../offload/index.md#experiments)保留 2026-10-03 的存储/控制检查及压缩 backing 样本,可用于研究发布顺序、base/delta 继承和存储大小核算。记录分别列出通过的机制检查、进入 guest 前被阻断的测试,以及样本文件的逻辑大小和实际分配量。
-
-已退役的[Controller/Worker 证据](../cluster-performance-analysis.md)提供冻结制品的历史测量。就绪探针描述 VM 就绪时间,历史查询测量描述保留记录的查询与热回放成本;完整任务批次保留自己的来源和统计口径。引用时按实验对象与批次分别取数。
-
-具体未测范围:回放报告尚未测量真实模型续跑的一致率;offload 样本尚未测量净物理内存节省或多 VM 密度;当前 daemon 的性能与密度仍待独立实验。
-
-## 新增公开产出的记录格式 {#record}
-
-每条记录包含标题、作者或演讲者、发布日期、公开链接、材料类型、源码提交、Agent/模型版本、数据与复现入口,以及结论适用范围。论文列出发表场所与 DOI;预印本、工程报告和演讲分别标明类型。
-
-若研究使用了尚未进入发布版的分支,写明分支提交和与发布版的差别。后续实现发生变化时保留原记录,追加新的验证结果或替代说明。
-
-## 如何引用 {#citation}
-
-引用某条性能结论时,带上报告日期、机器、执行器、任务和统计口径。引用设计时带上源码提交或发布版本。只在特定环境中观察到的效果,应保留该环境条件。
-
-当前没有在此登记的正式论文、外部报告或演讲条目。贡献公开材料时,按上述字段提供可访问链接和复现信息。引用时区分设计提案、通过的机制测试与实测工作负载结果;实现保证以对应版本的文档与测试为准。
diff --git a/docs/src/zh/design/research/rl-execution-substrate.md b/docs/src/zh/design/research/rl-execution-substrate.md
deleted file mode 100644
index d08f4237..00000000
--- a/docs/src/zh/design/research/rl-execution-substrate.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# 强化学习的执行底座
-
-Agent 训练需要大量可追踪的尝试:每次尝试从什么输入开始,调用了哪些工具,得到什么结果,为什么结束。pVisor 可以承接单次执行和证据收集,让训练器把奖励、采样与调度留在自己的控制层。
-
-## 一次 rollout 的执行契约 {#contract}
-
-输入包含 task ID、attempt ID、仓库提交或镜像摘要、工作区、Agent 命令、策略、资源预算与随机种子。输出包含结束状态、退出码、文件候选、Run Bundle、原生轨迹,以及启用捕获时的 Gateway Journal。
-
-训练器把这些产物与模型版本、采样参数、reward 和 evaluator 版本关联。环境准备失败、权限拒绝和上游请求失败有自己的类别;评价模型解题能力时,按预先确定的规则处理这些基础设施失败。
-
-## 三种可以复用的状态 {#state}
-
-| 状态 | 能复用什么 | 需要另行保存什么 |
-| --- | --- | --- |
-| 文件 checkpoint | 固定基线上的文件候选与暂存层 | 模型上下文、外部服务状态 |
-| 原生 Agent 轨迹 | 会话链路、工具调用与观察 | 可重置工作区、Agent 与模型版本 |
-| VM snapshot | 相应实现支持的 VM 运行状态 | 调度元数据、模型服务、远程副作用 |
-
-回放工具会产生新观察。研究可复现性时应固定输入与版本,同时记录工具重新执行后的差异;replay 的新观察与旧会话文字不能简单视为相同实验输入。
-
-## 最小集成顺序 {#integration}
-
-先按[rollout 指南](../../guides/rl-rollouts.md)完成一个离线任务的候选收集与评分。再用独立工作区增加并发,确保每个 attempt 的文件和记录相互独立。最后接入原生 Agent 轨迹,分别验证前缀准备、工具重执行和模型续跑。
-
-reward 由 evaluator 计算。pVisor 的成功结束是执行结果,任务得分需要题目自己的测试;文件变化也需要按任务要求判断。
-
-## 需要实验证明的部分 {#experiments}
-
-测量每秒完成的 rollout、尾延迟、每个候选的磁盘与驻留内存、fork/checkpoint 成本、工具重执行成本和 reward delta。固定模型服务容量,区分执行底座与模型服务瓶颈。
-
-异步队列、跨节点容错、奖励去重、共享前缀收益和大规模采样尚需集成与测量。方法分别见[回放保真度](../../benchmarks/replay-fidelity.md)、[并发密度](../../benchmarks/density.md)与[集群执行](cluster-execution.md)。
diff --git a/docs/src/zh/guides/agents/aider.md b/docs/src/zh/guides/agents/aider.md
deleted file mode 100644
index 3aefe2bc..00000000
--- a/docs/src/zh/guides/agents/aider.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# aider
-
-!!! note "实验性"
- 下面的命令只使用已有 pVisor 参数,但尚未完成固定 Agent 版本的端到端回归。
-
-## 基于现有 CLI 的接入起点
-
-先在所选 executor 内安装 aider,并确认在独立测试项目中可以运行。下面以 api.openai.com:443 作为目标;示例假设你已在 Agent 自身配置里选择对应的 OpenAI 服务,pVisor 不替你配置 provider。
-
-```bash
-pvisor run --safe --overlaynet-allow api.openai.com:443 \
- --pass-env OPENAI_API_KEY -- aider
-pvisor status --review last
-pvisor apply last --path src
-```
-
-显式 allow 会替换 `--safe` 预设列表,登录、其他 provider 或依赖下载需要逐个补充目标。只有直接可执行文件名才匹配 `--safe` 适配,shell 包装会改变匹配结果。`--safe` 下的 HOME 状态写入在退出后丢弃,不要依赖本次运行保存登录状态。
diff --git a/docs/src/zh/guides/agents/gemini-cli.md b/docs/src/zh/guides/agents/gemini-cli.md
deleted file mode 100644
index 859fa94b..00000000
--- a/docs/src/zh/guides/agents/gemini-cli.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Gemini CLI
-
-!!! note "实验性"
- 下面的命令只使用已有 pVisor 参数,但尚未完成固定 Agent 版本的端到端回归。
-
-## 基于现有 CLI 的接入起点
-
-先在所选 executor 内安装 Gemini CLI,并确认在独立测试项目中可以运行。下面以 generativelanguage.googleapis.com:443 作为目标;模型 provider 由你在 Agent 自身配置,pVisor 不代劳。
-
-```bash
-pvisor run --safe --overlaynet-allow generativelanguage.googleapis.com:443 \
- --pass-env GEMINI_API_KEY -- gemini
-pvisor status --review last
-pvisor apply last --path src
-```
-
-显式 allow 会替换 `--safe` 预设列表,登录、其他 provider 或依赖下载需要逐个补充目标。只有直接可执行文件名才匹配 `--safe` 适配,shell 包装会改变匹配结果。`--safe` 下的 HOME 状态写入在退出后丢弃,不要依赖本次运行保存登录状态。
diff --git a/docs/src/zh/guides/agents/index.md b/docs/src/zh/guides/agents/index.md
index 0259cc90..c1c74e0c 100644
--- a/docs/src/zh/guides/agents/index.md
+++ b/docs/src/zh/guides/agents/index.md
@@ -14,15 +14,28 @@ pvisor apply last --path src
| --- | --- | --- | --- |
| Claude Code | `claude` | `api.anthropic.com` | [Claude Code](claude-code.md) |
| Codex CLI | `codex` | `api.openai.com`、`chatgpt.com`、`ab.chatgpt.com` | [Codex CLI](codex.md) |
-| Gemini CLI | `gemini` | `generativelanguage.googleapis.com` | [Gemini CLI](gemini-cli.md) |
+| Gemini CLI | `gemini` | `generativelanguage.googleapis.com` | 见 [`--safe` 参数预设](../../reference/cli.md#safe-参数预设) |
| ZCode | `zcode` | `api.z.ai`、`open.bigmodel.cn` | 见 [`--safe` 参数预设](../../reference/cli.md#safe-参数预设) |
-| aider | — | 无预设,需 `--overlaynet-allow` | [aider](aider.md) |
-| OpenCode | — | 无预设,需 `--overlaynet-allow` | [OpenCode](opencode.md) |
+| aider | `aider` | 无预设,需 `--overlaynet-allow` | 见下方「无预设 Agent」 |
+| OpenCode | `opencode` | 无预设,需 `--overlaynet-allow` | 见下方「无预设 Agent」 |
| 任意脚本 | 任意 | 无;`bash`、`sh`、`zsh`、`fish` 沿用 Codex 的目标 | [任意脚本](custom-scripts.md) |
未知命令默认拒绝出站,用 `--overlaynet-allow HOST:PORT` 显式授权(会覆盖预设列表)。预设按**直接可执行文件名**匹配,shell 包装器不会触发 Agent 专属的适配。
+## 无预设 Agent 的接入 {#custom-agent}
+
+以 aider 为例:先在所选 executor 内安装 aider,并在 Agent 自身配置里选好 provider,然后显式放行它的 API 目标并传入凭据变量(变量名由 Agent 自身文档定义,如 `OPENAI_API_KEY`、`GEMINI_API_KEY`):
+
+```bash
+pvisor run --safe --overlaynet-allow api.openai.com:443 \
+ --pass-env OPENAI_API_KEY -- aider
+pvisor status --review last
+pvisor apply last --path src
+```
+
+登录、其他 provider 或依赖下载需要逐个补充放行目标。
+
运行后检查 Run Bundle 中实际安装的控制与观察结果。各 Agent 受支持的版本范围尚未系统测试,见[端到端任务](../../benchmarks/agent-tasks.md)。
!!! note "实验性接入"
- aider、Gemini CLI、OpenCode 的接入页只使用已有 pVisor 选项,在出现固定版本的回归之前都属于实验性。Linux host 的选择性代理是协作式;需要强制边界时使用其中已安装 Agent 的 VM。
+ aider、Gemini CLI、OpenCode 的接入只使用已有 pVisor 选项,在出现固定版本的回归之前都属于实验性。Linux host 的选择性代理是协作式;需要强制边界时使用其中已安装 Agent 的 VM。
diff --git a/docs/src/zh/guides/agents/opencode.md b/docs/src/zh/guides/agents/opencode.md
deleted file mode 100644
index ca5bd27e..00000000
--- a/docs/src/zh/guides/agents/opencode.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# OpenCode
-
-!!! note "实验性"
- 下面的命令只使用已有 pVisor 参数,但尚未完成固定 Agent 版本的端到端回归。
-
-## 基于现有 CLI 的接入起点
-
-先在所选 executor 内安装 OpenCode,并确认在独立测试项目中可以运行。下面以 api.openai.com:443 作为目标;示例假设你已在 Agent 自身配置里选择对应的 OpenAI 服务,pVisor 不替你配置 provider。
-
-```bash
-pvisor run --safe --overlaynet-allow api.openai.com:443 \
- --pass-env OPENAI_API_KEY -- opencode
-pvisor status --review last
-pvisor apply last --path src
-```
-
-显式 allow 会替换 `--safe` 预设列表,登录、其他 provider 或依赖下载需要逐个补充目标。只有直接可执行文件名才匹配 `--safe` 适配,shell 包装会改变匹配结果。`--safe` 下的 HOME 状态写入在退出后丢弃,不要依赖本次运行保存登录状态。
diff --git a/docs/src/zh/guides/daemon/boundaries.md b/docs/src/zh/guides/daemon/boundaries.md
deleted file mode 100644
index 6b31780f..00000000
--- a/docs/src/zh/guides/daemon/boundaries.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Daemon 运行时与集成边界
-
-管理本机原生 VM 沙箱生命周期时选择 `pvisor-daemon`;公开 Job/文件审查流程使用 `pvisor run`。daemon 嵌入原生执行,但 API 身份、状态与能力仍独立。
-
-## Prepared-image 契约 {#images}
-
-镜像是可信本机 `images_dir/.json` manifest,不是 registry reference。字段包括绝对路径的独立 Linux `rootfs`(不能是宿主 `/` 或与 daemon 状态重叠)、绝对路径的 guest bootstrap `entrypoint` argv、可选 `cmd`、可选 `env` 与可选绝对路径 firmware `library_dir`。请求的工作负载 argv(为空则使用 `cmd`)追加到 `entrypoint`,请求 env 覆盖 manifest env,不继承宿主环境,也不经 shell 插值。
-
-长期运行的 guest bootstrap 必须监督工作负载、真实 OpenSandbox 1.1.0 execd 与 egress,自行初始化/鉴权服务、转发信号并回收子进程。它必须在 guest **CID 3** 的 **44772/18080** 端口提供字节透明的 AF_VSOCK listener,桥接真实服务。Supervisor 的 loopback TCP 发布经私有 Unix socket 与原生 vsock 转发连接 guest。普通 rootfs 或只运行 sleep 的进程不够。
-
-Create、对 Running VM 的 Inspect 与 resume 就绪检查经 bridge 要求真实 HTTP 200 的 execd `/ping`、JSON `initialized: true` 的 `/ready` 和 egress `/healthz`,响应体有界。daemon 不注入/初始化 execd,也不合成 command/SSE/file 响应。Python SDK 初始化即使没有网络策略也会解析两个端点。
-
-需要自行准备上述 bootstrap 与 vsock bridge;直接使用 upstream 镜像名称不能满足这些要求。项目**尚未提供 bootstrap 或镜像配方,也未做端到端验证**,目前没有 SDK 兼容性验证或密度测量结果。此原生 VM 后端不使用旧容器的 `cap-drop=ALL` 限制。
-
-## 隔离与资源限制 {#isolation}
-
-要求 Linux x86_64、可用 `/dev/kvm`、可信绝对路径,以及可写、已委派且启用 CPU/memory/PID controller 与 `cgroup.kill` 的 cgroup v2 层级。前置检查验证真实 controller 写入和 KVM API;没有 host、OCI 命令或 registry-pull 降级。
-
-原生 supervisor 在独立、脱离 daemon 生命周期的子进程中嵌入 `pvisor::PVisor`,只配置 `VmExecutor` 并持有 RunHandle。Sandbox cgroup 限制整个 supervisor/VMM/helper 树:总 CPU 速率 **10–8000 millicores**、硬内存、零 swap、`pids.max=512` 与 group OOM。vCPU 数按 quota 向上取整(最多 8),guest RAM 向下取整到 MiB;硬内存上限还包含宿主侧开销。完整限制/就绪检查保留在 create、Inspect 和 resume;端点解析认证 live Running 状态并检查删除屏障,不为每次数据请求重复完整 health/cgroup 检查。见[服务访问](../../design/daemon/lifecycle.md#endpoints)。Paused、Failed 和不确定记录继续保守预留资源。
-
-启动 callback 在 owner 锁内检查 started/删除/tombstone marker,通过预先打开的 `cgroup.procs` FD 在 **exec 之前**加入身份绑定的 cgroup。Supervisor 启动时核验成员关系,不迁移已运行的 Tokio 进程;supervisor/Tokio 分配与后续 VM/helper 子进程均计入 sandbox 预算。直接在该 cgroup 外调用隐藏命令会失败关闭。
-
-原生 OverlayNet 提供 VM 出口网络。OpenSandbox 网络策略请求不受支持,会被拒绝;拒绝请求不会将出口改为 deny-all。
-
-宿主账户、daemon/firmware 和预制镜像必须可信。私有状态与同 UID IPC 无法阻止敌对同 UID 或 root 代码。其他本机用户可能访问 loopback 发布,应配置服务鉴权与宿主访问控制。秘密不进入 supervisor argv 或宿主环境,但保存在私有记录中。目前没有安全审计结果;敌对多用户隔离不在保护范围内。
-
-私有 IPC 校验同 UID peer、owner、sandbox ID、generation 与秘密 token;持久身份绑定 boot ID 和 cgroup device/inode。ID 不复用、不重新启动。IPC 丢失表示不确定,不是 Missing 或清理证据。持久删除意图与 supervisor 独占锁阻止迟到启动;清理使用身份绑定的 `cgroup.kill`,不保存 PID 或按 PID kill,确认 cgroup 为空且 owner 锁释放后才释放容量。同一 boot 下没有持久 tombstone 证据的 cgroup 被替换或丢失不证明对象不存在。
-
-## OpenSandbox 接口范围 {#profile}
-
-兼容基线固定为 OpenSandbox **1.1.0**,tag `release-1.1.0`,commit `b1a29cf93a823a95913f7943010febb3f29de05c`。支持范围限于下表中的部分 API;完整 OpenSandbox 与未经修改 SDK 的端到端兼容性尚未验证。
-
-| 能力 | 当前行为 |
-| --- | --- |
-| 镜像创建、列表、查询、删除 | 本机沙箱生命周期;创建接受 argv/env/metadata、CPU/memory 限制及可选 TTL |
-| Pause / resume | 同一 Attempt 上已确认的 live vCPU pause/resume,不是 checkpoint |
-| 续期 | 未来 RFC3339 时间,必须延长已有 TTL |
-| 端点 | 仅 daemon 路由的 execd 44772 与 egress 18080 |
-| 命令、文件、health、metrics | 流式转发到 prepared image 中的真实 upstream 服务 |
-| 快照、templates/pools、metadata 修改、hooks | 不支持 |
-| 网络策略、credential proxy、secure access、volumes、image auth | 不支持的创建选项被拒绝 |
-| 任意应用端口、签名端点、WebSocket、CONNECT | 不支持 |
-| Stage/apply、checkpoint/fork、offload | 未接入此 daemon 后端 |
-
-## 原生 VM、检查点与 Gateway {#native}
-
-原生 `pvisor run --executor vm` 保留 KVM/HVF 与 rootfs 前提,daemon 使用原生 VM executor,但不暴露这些 Job API。执行步骤见 [VM 指南](../executors/vm.md),本机 Job 文件检查点见[检查点与分叉](../fork-checkpoint.md)。兼容的独立 rootfs、无网络 VM Job 可以使用 execution checkpoint;通过 `pvisor status --json` 检查 capability 与 blockers,并遵循 [CLI execution checkpoint 契约](../../reference/cli.md#full-vm-execution-checkpoints)。
-
-daemon pause 是同一 live Attempt 上已确认的 vCPU pause,不是封存 RAM/CPU/设备/文件系统快照。daemon sandbox ID 不是 Job ID,不要传给 `pvisor checkpoint`、`fork`、`apply` 或 `drop`。原生快照存储、node owner、共享镜像缓存与实验性 macOS 冷页池仍是原生设施,不是 daemon template 或 pool。
-
-原生 Job 的模型请求路由和捕获使用 [Gateway 指南](../capture.md)与 [Agent 接入](../agents/index.md)。daemon 没有旧 Worker 的 `gateway.routes` profile,也没有集成的 pVisor credential proxy/capture 契约。模型访问由 prepared service 和应用负责;文件审查不能撤销外部 API 副作用。
diff --git a/docs/src/zh/guides/daemon/index.md b/docs/src/zh/guides/daemon/index.md
index 8731941d..b9692de7 100644
--- a/docs/src/zh/guides/daemon/index.md
+++ b/docs/src/zh/guides/daemon/index.md
@@ -1,18 +1,25 @@
# 运行单机 daemon
-安装 `pvisor-daemon`,通过部分兼容 OpenSandbox 1.1.0 的 API 管理一台 Linux 主机上的镜像沙箱。daemon 负责本机准入、生命周期、持久状态与过期清理。跨节点任务调度、全局 DAG 和分布式 lease 由 Kubernetes、Ray 或你的应用管理;daemon 不包含 Controller 或 Worker。
+安装 `pvisor-daemon`,通过部分兼容 OpenSandbox 1.1.0 的 API,在一台 Linux 主机上管理镜像沙箱。daemon 负责本机准入、生命周期、持久状态与过期清理。
+跨节点调度、全局 DAG 和分布式 lease 由 Kubernetes、Ray 或你的应用管理。daemon 不包含 Controller 或 Worker。
+
+需要本机原生 VM 沙箱生命周期时用 `pvisor-daemon`;公开 Job 与文件审查流程仍用 `pvisor run`。
+
+!!! warning
+ 项目**尚未提供 guest bootstrap 或镜像配方,也未做端到端验证**;目前没有 SDK 兼容性验证或密度测量结果。下列每一步都需要自行准备镜像与 vsock 桥接。
## 前提条件 {#prerequisites}
-要求 Linux x86_64、可用 `/dev/kvm`、可信绝对路径,以及可写、已委派且启用 CPU/memory/PID controller 与 `cgroup.kill` 的 cgroup v2 层级。前置检查验证真实 controller 写入和 KVM API;没有 host、OCI 命令或 registry-pull 降级。
+需要 Linux x86_64、可用的 `/dev/kvm`、可信的绝对路径,以及可写、已委派并启用 CPU/memory/PID controller 与 `cgroup.kill` 的 cgroup v2 层级。
+
+前置检查会实际写入 controller 并调用 KVM API。没有 host、OCI 命令或 registry-pull 降级。
镜像是可信本机 `images_dir/.json` manifest,不是 registry reference。字段包括绝对路径的独立 Linux `rootfs`(不能是宿主 `/` 或与 daemon 状态重叠)、绝对路径的 guest bootstrap `entrypoint` argv、可选 `cmd`、可选 `env` 与可选绝对路径 firmware `library_dir`。请求的工作负载 argv(为空则使用 `cmd`)追加到 `entrypoint`,请求 env 覆盖 manifest env,不继承宿主环境,也不经 shell 插值。
-!!! warning
- 需要自行准备 guest bootstrap 与 vsock 服务桥接,具体要求见[镜像契约](boundaries.md#images)。项目**尚未提供 bootstrap 或镜像配方,也未做端到端验证**;目前没有 SDK 兼容性验证或密度测量结果。
+长期运行的 guest bootstrap 必须监督工作负载、真实 OpenSandbox 1.1.0 execd 与 egress,自行初始化/鉴权服务、转发信号并回收子进程。它必须在 guest **CID 3** 的 **44772/18080** 端口提供字节透明的 AF_VSOCK listener,桥接真实服务。Supervisor 的 loopback TCP 发布经私有 Unix socket 与原生 vsock 转发连接 guest。普通 rootfs 或只运行 sleep 的进程不够。Create、对 Running VM 的 Inspect 与 resume 就绪检查经 bridge 要求真实 HTTP 200 的 execd `/ping`、JSON `initialized: true` 的 `/ready` 和 egress `/healthz`,响应体有界。daemon 不注入/初始化 execd,也不合成 command/SSE/file 响应。
-## 安装可执行文件 {#install}
+## 安装与启动 {#install}
在 Linux x86_64 上安装 `pvisor` wheel,即可在 Python 环境的 bin 目录获得独立可执行文件 `pvisor-daemon`。macOS wheel 不包含 daemon:
@@ -22,19 +29,9 @@ pvisor-daemon --help
pvisor-daemon protocol
```
-需要 `main` 最新构建时,使用 [nightly wheel 安装器](../../start/installation.md)。也可按[原生构建前提](../../community/development.md)准备环境,在选定 revision 上运行以下本地源码安装命令;这条源码安装路径尚未验证:
-
-```bash
-cargo install --locked --path crates/pvisor-daemon --bin pvisor-daemon
-pvisor-daemon --help
-pvisor-daemon protocol
-```
-
-`protocol` 打印固定的 OpenSandbox 版本与 commit。本地源码安装独立于 Python `pvisor` 包安装。两条安装路径都需要单独准备镜像。源码 revision、SDK 1.1.0 与镜像内容应一起固定;SDK 兼容性仍需端到端验证。
-
-## 启动 API {#start}
+需要 `main` 最新构建时,使用 [nightly wheel 安装器](../../start/installation.md)。`protocol` 打印固定的 OpenSandbox 版本与 commit。源码 revision、SDK 1.1.0 与镜像内容应一起固定。本地源码安装路径(`cargo install --locked --path crates/pvisor-daemon`)尚未验证。
-`serve` 使用已实现且必需的 `--images-dir` 与 `--cgroup-root` 构造 `NativeRuntime`。Cargo 链接 `pvisor` 与 `pvisor-core`;同步 `main` 在参数解析或 Tokio 之前调用 `pvisor::run_krun_internal_if_requested()`,随后派发隐藏的 `native-supervisor --sandbox-dir ABSOLUTE_PATH` 命令。准备好镜像与 cgroup 层级后,使用以下 CLI 配置启动 API。
+`serve` 使用已实现且必需的 `--images-dir` 与 `--cgroup-root` 构造 `NativeRuntime`:
```bash
export OPEN_SANDBOX_API_KEY="$(openssl rand -hex 32)"
@@ -64,38 +61,102 @@ EOF
预期返回 JSON 沙箱列表;全新状态下列表为空。此查询验证 API 访问;沙箱创建、原生资源强制与 SDK 数据面就绪需要另行验证。不要公开密钥,也不要把带凭据的日志贴进 issue。
-## 启用 daemon 内存池 {#memory-pool}
+## OpenSandbox 接口范围 {#profile}
+
+兼容基线固定为 OpenSandbox **1.1.0**,tag `release-1.1.0`,commit `b1a29cf93a823a95913f7943010febb3f29de05c`。支持范围限于下表中的部分 API;完整 OpenSandbox 与未经修改 SDK 的端到端兼容性尚未验证。
-在上述 `serve` 命令中添加 `--memory-pool`,即可让新沙箱接入 daemon 持有的物理共享页池;默认关闭。运行时扫描已驻留的 4 KiB 页面,优先收纳跨实例重复内容,daemon 保存一份物理页。VM 读取时保持共享,写入时由内核 COW 生成私有页;扫描随后释放已被改写的旧引用。运行时先停驻 CPU、排空设备访问并复核内容,再替换映射。这个 Linux 路径不需要 userfaultfd,也不压缩独有页。实际占用与重复程度、扫描和写入有关,见[内存 benchmark](../../benchmarks/vm-memory/index.md#linux-lifecycle)。
+| 能力 | 当前行为 |
+| --- | --- |
+| 镜像创建、列表、查询、删除 | 本机沙箱生命周期;创建接受 argv/env/metadata、CPU/memory 限制及可选 TTL |
+| Pause / resume | 同一 Attempt 上已确认的 live vCPU pause/resume,不是 checkpoint |
+| 续期 | 未来 RFC3339 时间,必须延长已有 TTL |
+| 端点 | 仅 daemon 路由的 execd 44772 与 egress 18080 |
+| 命令、文件、health、metrics | 流式转发到 prepared image 中的真实 upstream 服务 |
+| 快照、templates/pools、metadata 修改、hooks | 不支持 |
+| 网络策略、credential proxy、secure access、volumes、image auth | 不支持的创建选项被拒绝 |
+| 任意应用端口、签名端点、WebSocket、CONNECT | 不支持 |
+| Stage/apply、checkpoint/fork、offload | 未接入此 daemon 后端 |
-共享池与空闲释放可以同时工作,无需额外开关。guest 报告不再使用的页面后,运行时解除这些页的映射并释放池引用,再确认 guest 可以复用这些内存,避免继续保留已空闲的内容。
+## 查询、删除与过期 {#operations}
-池组件独立于 API 进程,可跨 API 重启保留页面。连接断开后,用 pidfd 确认 VM 进程退出才释放映射引用,防止仍被读取的槽位被复用。池进程丢失会使依赖 VM 失败,不会自动替换活动池。默认上限为 512 MiB 页面数据、32,768 个对象、32 个连接,每个连接 32,768 个引用:4 KiB 对象数限制使默认池最多保存 128 MiB 不同页面,每 VM 最多引用 128 MiB。独有候选仅保存有界摘要,预算不足时保留原页。索引、映射、线程和分配器另有开销;池在单个沙箱 cgroup 与准入额度之外,需预留宿主余量。扫描跳过未驻留页,总预算仍应包含启动和写入峰值。升级旧压缩池时先排空旧 VM,再使用新状态目录。这个开关的 VM/池测试不等于完整 OpenSandbox SDK 端到端验证。
+| 请求 | 含义 |
+| --- | --- |
+| `GET /v1/sandboxes` | 最近持久化的观察;支持重复 state 筛选、SDK 编码的 metadata 与 page/pageSize |
+| `GET /v1/sandboxes/{id}` | 与本机原生状态核对该沙箱 |
+| `DELETE /v1/sandboxes/{id}` | 确认原生删除后才释放预留;成功返回 204 |
+| `POST /v1/sandboxes/{id}/pause` | 确认 live vCPU 已暂停;202,空响应体 |
+| `POST /v1/sandboxes/{id}/resume` | 确认 live vCPU 已恢复;202,空响应体 |
+| `POST /v1/sandboxes/{id}/renew-expiration` | 用未来 RFC3339 时间 `expiresAt` 延长已有 TTL |
-若要选择实验性压缩模式,改为添加
-`--memory-pool --memory-pool-mode compressed`。相同的解码后 64 KiB 块共享
-sealed fill/zstd 对象,独有可压缩内容也能入池。VM 启动需要内核缺页
-userfaultfd 权限。客户端先校验不可变句柄再回收 RAM,恢复时本地解码;
-池丢失后已持有句柄仍可用,新发布停止。预算计入向页取整的编码文件,
-对象/描述符和引用数分别有界;压缩或预算拒绝会保留原 RAM。
-模式绑定持久配置,切换需排空旧实例并使用新状态目录。进程级共享与服务退出
-测试通过,双 VM 探针也已验证池终止后的 guest UFFD 回收/refault 与文件 I/O。
-见 [sealed 压缩池合同](../../design/memory-optimization/compression-pool.md)。
+将 `{id}` 替换为创建/列表返回的 sandbox ID。HTTP 断开不会取消已接受的操作。不同沙箱有独立生命周期锁;同一沙箱的控制与连接建立串行协调。
-## 连接客户端 {#clients}
+丢失创建响应后不要盲目重复创建:此 API 不是旧任务 ID 幂等协议。先检查保留状态。创建报告原生结果不确定时,保留错误消息中的 sandbox ID,再查询/删除它。创建失败且清理确认完成才释放准入;清理不确定则保留记录与预留。
-使用 OpenSandbox SDK 1.1.0,配置选定的 domain、protocol 与生命周期 API key。创建请求需要 `image`、`entrypoint` argv,以及恰好包含 `cpu`、`memory` 的 `resourceLimits`。可选 `timeout` 以秒计,至少 60 秒;省略或 null 表示手动清理。这里不提供 prepared-image 名称,因为目前没有经过验证的开箱即用镜像配方。
+创建 `timeout` 可选,省略/null 表示手动清理。配置 TTL 至少 60 秒,不超过 `--max-timeout-seconds`(默认一天,最高可配置一年)。续期必须延长已有期限。过期清理是 **best effort**,不是硬执行截止时间;过期后拒绝新的代理请求。正常停止 daemon 会保留原生沙箱与持久记录供重启使用;daemon 停机期间不保证清理。需要硬截止或停机清理时,另行配置原生宿主监督。
-daemon 检查真实 execd 的 `/ping`、`/ready` 和 egress 的 `/healthz` 后才把创建视为就绪。`202` 表示生命周期请求已接受;工作负载退出结果需通过命令接口获取。命令、文件与 metrics 流量转发到镜像中的 execd 和 egress 服务。
+## 端点认证 {#endpoints}
-默认只监听 loopback。对外访问前,在可信反向代理上配置 TLS,并用 `--public-endpoint HOST:PORT` 指定外部路由可达的 authority,不带 scheme 或路径。通配监听与开发用的零端口绑定也要求显式正确的 public endpoint。认证见[端点认证](operations.md#endpoints)。
+通过 `GET /v1/sandboxes/{id}/endpoints/44772` 解析 execd,端口 `18080` 解析 egress。返回的 authority 不含 URL scheme,流量经过 daemon,不直接指向 supervisor loopback 发布。
+
+- 设置 `use_server_proxy=true` 时,路由请求使用生命周期 `OPEN-SANDBOX-API-KEY` header 认证。
+- 默认模式在端点 `headers` 中提供随机、沙箱范围的 `X-PVISOR-SANDBOX-TOKEN`。客户端必须保留这些 header;该 token 不授权生命周期操作或访问其他沙箱。
+- 转发到 guest 前会移除控制凭据。调用方提供的 guest execd access token 不会被生命周期 key 替换。
+
+不支持签名端点过期、任意应用端口、WebSocket 或 CONNECT。请求/响应流式转发,包括 multipart 与 SSE。上传加等待 upstream header 的上限为 120 秒;已建立的响应流没有总超时。输出/流量配额仍由 upstream 服务负责。
+
+默认只监听 loopback。对外访问前,在可信反向代理上配置 TLS,并用 `--public-endpoint HOST:PORT` 指定外部路由可达的 authority,不带 scheme 或路径。
+
+## 启用 daemon 内存池 {#memory-pool}
+
+在 `serve` 命令中添加 `--memory-pool`,即可让新沙箱接入 daemon 持有的物理共享页池;默认关闭。运行时扫描已驻留的 4 KiB 页面,优先收纳跨实例重复内容,daemon 保存一份物理页。VM 读取时保持共享,写入时由内核 COW 生成私有页。这个 Linux 路径不需要 userfaultfd,也不压缩独有页。实际占用与重复程度、扫描和写入有关,见[内存 benchmark](../../benchmarks/vm-memory/index.md#linux-lifecycle)。
+
+池组件独立于 API 进程,可跨 API 重启保留页面。连接断开后,用 pidfd 确认 VM 进程退出才释放映射引用。池进程丢失会使依赖 VM 失败,不会自动替换活动池。默认上限为 512 MiB 页面数据、32,768 个对象、32 个连接,每个连接 32,768 个引用:4 KiB 对象数限制使默认池最多保存 128 MiB 不同页面,每 VM 最多引用 128 MiB。索引、映射、线程和分配器另有开销;池在单个沙箱 cgroup 与准入额度之外,需预留宿主余量。升级旧压缩池时先排空旧 VM,再使用新状态目录。
+
+若要选择实验性压缩模式,改为添加 `--memory-pool --memory-pool-mode compressed`。相同的解码后 64 KiB 块共享 sealed fill/zstd 对象,独有可压缩内容也能入池。VM 启动需要内核缺页 userfaultfd 权限。池丢失后已持有句柄仍可用,新发布停止。模式绑定持久配置,切换需排空旧实例并使用新状态目录。进程级共享与服务退出测试通过,双 VM 探针也已验证池终止后的 guest UFFD 回收/refault 与文件 I/O。见 [sealed 压缩池合同](../../design/memory-optimization/compression-pool.md)。这个开关的 VM/池测试不等于完整 OpenSandbox SDK 端到端验证。
+
+## 重启与状态所有权 {#restart}
+
+一个 daemon 独占私有状态;原生创建/控制前持久化 owner 身份。私有 IPC 校验同 UID peer、owner、sandbox ID、generation 与秘密 token;持久身份绑定 boot ID 和 cgroup device/inode。ID 不复用、不重新启动。IPC 丢失表示不确定,不是 Missing 或清理证据。持久删除意图与 supervisor 独占锁阻止迟到启动;清理使用身份绑定的 `cgroup.kill`,不保存 PID 或按 PID kill,确认 cgroup 为空且 owner 锁释放后才释放容量。同一 boot 下没有持久 tombstone 证据的 cgroup 被替换或丢失不证明对象不存在。
+
+待删除意图跨重启保留,不会被原生观察覆盖。删除状态未知时保留预留。原生沙箱丢失后仍以 Failed 显示,直到显式删除。不要删状态来修复错误,也不要让两个 daemon 共用它。注册表受配置容量和总计 16 MiB 逻辑版本 1 等价预算约束;它不是无限保留的分布式任务档案,也不是 Run Bundle/artifact store。
版本 1 中已有记录的 `sandboxes.json` 若缺少原生 `owner.json` marker,会在既有 store 独占锁内被拒绝:它可能仍持有活动 Podman 容器。使用全新原生状态并保留/清理旧部署,或通过旧 Podman daemon 删除全部 sandbox、确认清理后,再用已清空的 registry 切换后端。不要删除 registry 条目、预留或所有权状态,也不要伪造原生 marker 绕过检查。原生 daemon 不会把这些容器接管为 Missing 或静默释放其预留。
当前 v2 状态使用小型 `sandboxes.json` owner/header 与空 map,加上私有逐 sandbox `records/`。缺少原生 `owner.json` 仍会拒绝 v2 启动;空 header 不证明 sandbox 不存在。归属/记录状态须一同保留。原生 v1 存储只有在运行时 factory 接受 owner 后才迁移;见[存储迁移](../../design/daemon/storage.md#migration)。
-## 从 Cluster 迁移 {#migration}
+删除/对账可在原 rootfs 或 firmware 缺失时继续基于 tombstone 的清理,回收空的所属 cgroup 和私有 run/RAM/temp/socket/秘密记录,保留最小 ID 屏障。回收错误保留预留供重试;不要自行删除 tombstone 或 registry 状态。见[存储](../../design/daemon/storage.md#gc)。
+
+## 隔离与信任边界 {#isolation}
+
+原生 supervisor 在独立、脱离 daemon 生命周期的子进程中嵌入 `pvisor::PVisor`,只配置 `VmExecutor` 并持有 RunHandle。Sandbox cgroup 限制整个 supervisor/VMM/helper 树:总 CPU 速率 **10–8000 millicores**、硬内存、零 swap、`pids.max=512` 与 group OOM。vCPU 数按 quota 向上取整(最多 8),guest RAM 向下取整到 MiB;硬内存上限还包含宿主侧开销。Paused、Failed 和不确定记录继续保守预留资源。
+
+启动 callback 在 owner 锁内检查 started/删除/tombstone marker,通过预先打开的 `cgroup.procs` FD 在 **exec 之前**加入身份绑定的 cgroup。直接在该 cgroup 外调用隐藏命令会失败关闭。
+
+原生 OverlayNet 提供 VM 出口网络。OpenSandbox 网络策略请求不受支持,会被拒绝;拒绝请求不会将出口改为 deny-all。
+
+宿主账户、daemon/firmware 和预制镜像必须可信。私有状态与同 UID IPC 无法阻止敌对同 UID 或 root 代码。其他本机用户可能访问 loopback 发布,应配置服务鉴权与宿主访问控制。秘密不进入 supervisor argv 或宿主环境,但保存在私有记录中。目前没有安全审计结果;敌对多用户隔离不在保护范围内。
+
+## 与原生 Job、缓存和旧 Cluster 的关系 {#native}
+
+daemon sandbox ID 不是 Job ID,不要传给 `pvisor checkpoint`、`fork`、`apply` 或 `drop`。daemon pause 是同一 live Attempt 上已确认的 vCPU pause,不是封存 RAM/CPU/设备/文件系统快照。原生 Job 的文件审查、检查点与模型捕获继续走 `pvisor run` 路径:执行步骤见 [VM 指南](../executors/vm.md),本机 Job 文件检查点见[检查点与分叉](../fork-checkpoint.md),模型请求路由和捕获见 [Gateway 指南](../capture.md)。兼容的独立 rootfs、无网络 VM Job 可以使用 execution checkpoint;通过 `pvisor status --json` 检查 capability 与 blockers。
+
+`pvisor-cache prepare/publish/serve/list/stat/read` 保持为独立命令,不是 daemon 子命令;发布、后端、认证和访问见[共享镜像缓存参考](../../reference/shared-image-cache.md)。Daemon 状态与原生 Job 和缓存存储分开保存;Daemon API key 不授权独立缓存或 node 运行时 IPC。
+
+旧 Cluster 任务/客户端 SDK、Controller/Worker 注册、放置、DAG、lease 续期、完成 outbox 和 artifact 退役命令都不是 daemon 接口。不要把旧 task JSON、`worker.toml`、Controller 凭据或 journal 作为 daemon 输入;分布式任务历史没有自动转成沙箱状态的路径。退役部署前保留旧结果,为 OpenSandbox profile 使用新状态。
+
+## 排障 {#troubleshooting}
-旧 Cluster 任务/客户端 SDK、Controller/Worker 注册、放置、DAG、lease 续期、完成 outbox 和 artifact 退役命令都不是 daemon 接口。不要把旧 task JSON、`worker.toml`、Controller 凭据或 journal 作为 daemon 输入。分布式任务历史没有自动转成沙箱状态的路径。
+| 现象 | 检查 |
+| --- | --- |
+| 绑定前启动失败 | Linux x86_64/KVM、短绝对状态路径、可信 manifest 和真实委派 cgroup v2 |
+| 已有记录的 v1 registry 缺原生 `owner.json` | 保留旧状态/容器;使用全新原生状态,或通过旧 Podman daemon 清理全部 sandbox 后切换 |
+| v2 header 缺原生 `owner.json`,即使 map 为空 | 恢复原始归属状态;不要删除 `records/`、预留或伪造 marker |
+| 状态目录忙 | 其他 daemon 持有独占锁;不要删锁或状态绕过 |
+| 镜像不可用 | 先在本机准备镜像;不支持自动 pull 或 image auth |
+| SDK 创建无法就绪 | 真实 execd 初始化与 `/ping`/`/ready`、egress `/healthz` 及 guest CID 3 的 44772/18080 vsock bridge;普通 rootfs 不够 |
+| 外部端点不可达 | TLS 代理路由、domain/protocol、`--public-endpoint` 与端点提供的 headers |
+| 失败/pause 后准入仍满 | Failed/uncertain/paused 保留硬预留;查询并确认删除 |
+| 过期沙箱仍存在 | 清理是 best effort;检查 daemon 在线时间、生命周期锁与原生清理错误 |
+| 策略/template/volume 被拒绝 | 不支持的选项被拒绝,不会静默安装或模拟 |
-退役部署前保留旧结果,为 OpenSandbox profile 使用新状态。`NativeRuntime` 已接入原生 VM 执行;stage/apply 与 checkpoint/fork API 未实现,也不自动获取 node/cache 资源。可选池由 daemon 拥有,通过 `serve --memory-pool` 显式启用。见[运维](operations.md)。
+API 错误包含 `{code, message}`,响应包含 `X-Request-ID`。保留 HTTP status、request ID 和脱敏诊断;API 成功不是命令退出状态。见[退出码与错误](../../reference/exit-codes.md#daemon)。
diff --git a/docs/src/zh/guides/daemon/operations.md b/docs/src/zh/guides/daemon/operations.md
deleted file mode 100644
index 25a5fc99..00000000
--- a/docs/src/zh/guides/daemon/operations.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# 单机 daemon 运维
-
-重启时保留同一个私有状态目录和不变的原生运行时绝对路径/cgroup 身份。daemon 持有本机沙箱记录与删除意图,不恢复分布式任务,也不重放全局 DAG。
-
-## 查询与删除 {#lifecycle}
-
-使用[安装指南](index.md#start)中启动的带认证生命周期 API:
-
-| 请求 | 含义 |
-| --- | --- |
-| `GET /v1/sandboxes` | 最近持久化的观察;支持重复 state 筛选、SDK 编码的 metadata 与 page/pageSize |
-| `GET /v1/sandboxes/{id}` | 与本机原生状态核对该沙箱 |
-| `DELETE /v1/sandboxes/{id}` | 确认原生删除后才释放预留;成功返回 204 |
-| `POST /v1/sandboxes/{id}/pause` | 确认已确认的 live vCPU pause;202 空响应体 |
-| `POST /v1/sandboxes/{id}/resume` | 确认已确认的 live vCPU resume;202 空响应体 |
-| `POST /v1/sandboxes/{id}/renew-expiration` | 用未来 RFC3339 时间 `expiresAt` 延长已有 TTL |
-
-将 `{id}` 替换为创建/列表返回的 sandbox ID。HTTP 断开不会取消已接受的操作。不同沙箱有独立生命周期锁;同一沙箱的控制与连接建立串行协调。
-
-丢失创建响应后不要盲目重复创建:此 API 不是旧任务 ID 幂等协议。先检查保留状态。创建报告原生结果不确定时,保留错误消息中的 sandbox ID,再查询/删除它。创建失败且清理确认完成才释放准入;清理不确定则保留记录与预留。
-
-## 端点认证 {#endpoints}
-
-通过 `GET /v1/sandboxes/{id}/endpoints/44772` 解析 execd,端口 `18080` 解析 egress。返回的 authority 不含 URL scheme,流量经过 daemon,不直接指向supervisor loopback 发布。
-
-- 设置 `use_server_proxy=true` 时,路由请求使用生命周期 `OPEN-SANDBOX-API-KEY` header 认证。
-- 默认模式在端点 `headers` 中提供随机、沙箱范围的 `X-PVISOR-SANDBOX-TOKEN`。客户端必须保留这些 header;该 token 不授权生命周期操作或访问其他沙箱。
-- 转发到 guest 前会移除控制凭据。调用方提供的 guest execd access token 不会被生命周期 key 替换。
-
-不支持签名端点过期、任意应用端口、WebSocket 或 CONNECT。请求/响应流式转发,包括 multipart 与 SSE。上传加等待 upstream header 的上限为 120 秒;已建立的响应流没有总超时。输出/流量配额仍由 upstream 服务负责。
-
-## 过期与停止 {#expiration}
-
-创建 `timeout` 可选,省略/null 表示手动清理。配置 TTL 至少 60 秒,不超过 `--max-timeout-seconds`(默认一天,最高可配置一年)。续期必须延长已有期限。
-
-过期清理是 **best effort**,不是硬执行截止时间。原生命令、上传/header 等待和同一沙箱的控制可能推迟删除;过期后拒绝新的代理请求。续期与过期检查共用生命周期锁,过时扫描不会删除已延长期限的沙箱。
-
-正常停止 daemon 会保留原生沙箱与持久记录供重启使用。重启后恢复 maintenance;daemon 停机期间不保证清理。需要硬截止或停机清理时,另行配置原生宿主监督。退役部署前显式删除沙箱,确认原生清理,再停止对应 daemon。
-
-## 重启与状态所有权 {#restart}
-
-一个 daemon 独占私有状态;原生创建/控制前持久化 owner 身份。私有 IPC 校验同 UID peer、owner、sandbox ID、generation 与秘密 token;持久身份绑定 boot ID 和 cgroup device/inode。ID 不复用、不重新启动。IPC 丢失表示不确定,不是 Missing 或清理证据。持久删除意图与 supervisor 独占锁阻止迟到启动;清理使用身份绑定的 `cgroup.kill`,不保存 PID 或按 PID kill,确认 cgroup 为空且 owner 锁释放后才释放容量。同一 boot 下没有持久 tombstone 证据的 cgroup 被替换或丢失不证明对象不存在。
-
-待删除意图跨重启保留,不会被原生观察覆盖。删除状态未知时保留预留。原生沙箱丢失后仍以 Failed 显示,直到显式删除。maintenance 重试过期/待删除项;列表不是持续的原生进程监控,查询特定沙箱时使用 GET 核对。
-
-不要删状态来修复错误,也不要让两个 daemon 共用它。状态保存原生所有权与未解决预留;把旧 Controller journal 搬进来不会迁移历史。注册表受配置容量和总计 16 MiB 逻辑版本 1 等价预算约束,不计逐文件重复的 owner 信封;这不是物理目录大小上限。它不是无限保留的分布式任务档案,也不是 Run Bundle/artifact store。
-
-删除/对账可在原 rootfs 或 firmware 缺失时继续基于 tombstone 的清理,回收空的所属 cgroup 和私有 run/RAM/temp/socket/秘密记录,保留最小 ID 屏障。回收错误保留预留供重试;不要自行删除 tombstone 或 registry 状态。见[存储](../../design/daemon/storage.md#gc)。
-
-版本 1 中已有记录的 `sandboxes.json` 若缺少原生 `owner.json` marker,会在既有 store 独占锁内被拒绝:它可能仍持有活动 Podman 容器。使用全新原生状态并保留/清理旧部署,或通过旧 Podman daemon 删除全部 sandbox、确认清理后,再用已清空的 registry 切换后端。不要删除 registry 条目、预留或所有权状态,也不要伪造原生 marker 绕过检查。原生 daemon 不会把这些容器接管为 Missing 或静默释放其预留。
-
-版本 2 的 `sandboxes.json` 只保留 owner/header 与空 map;私有 `records/meta.json` 和带 owner 信封的逐 sandbox 文件持有清单。它们须与原生 `owner.json` 一同保留。修改只提交目标记录,v1 只在运行时接受 owner 后迁移;见[存储](../../design/daemon/storage.md#commit)与[激活](../../design/daemon/storage.md#migration)。
-
-## 排障 {#troubleshooting}
-
-| 现象 | 检查 |
-| --- | --- |
-| 绑定前启动失败 | Linux x86_64/KVM、短绝对状态路径、可信 manifest 和真实委派 cgroup v2 |
-| 已有记录的 v1 registry 缺原生 `owner.json` | 保留旧状态/容器;使用全新原生状态,或通过旧 Podman daemon 清理全部 sandbox 后切换 |
-| v2 header 缺原生 `owner.json`,即使 map 为空 | 恢复原始归属状态;不要删除 `records/`、预留或伪造 marker |
-| 状态目录忙 | 其他 daemon 持有独占锁;不要删锁或状态绕过 |
-| 镜像不可用 | 先在本机准备镜像;不支持自动 pull 或 image auth |
-| SDK 创建无法就绪 | 真实 execd 初始化与 `/ping`/`/ready`、egress `/healthz` 及 guest CID 3 的 44772/18080 vsock bridge;普通 rootfs 不够 |
-| 外部端点不可达 | TLS 代理路由、domain/protocol、`--public-endpoint` 与端点提供的 headers |
-| 失败/pause 后准入仍满 | Failed/uncertain/paused 保留硬预留;查询并确认删除 |
-| 过期沙箱仍存在 | 清理是 best effort;检查 daemon 在线时间、生命周期锁与原生清理错误 |
-| 策略/template/volume 被拒绝 | 不支持的选项被拒绝,不会静默安装或模拟 |
-
-API 错误包含 `{code, message}`,响应包含 `X-Request-ID`。保留 HTTP status、request ID 和脱敏诊断;API 成功不是命令退出状态。见[退出码与错误](../../reference/exit-codes.md#daemon)。
diff --git a/docs/src/zh/guides/daemon/service.md b/docs/src/zh/guides/daemon/service.md
deleted file mode 100644
index 201070ea..00000000
--- a/docs/src/zh/guides/daemon/service.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Daemon 与独立缓存入口
-
-直接运行 `pvisor-daemon` 提供 OpenSandbox 生命周期 API 及可选内存池。独立使用 `pvisor-cache` 发布和访问 OCI 缓存。Sandbox supervisor 嵌入原生运行时;node 资源协议仍是独立运行时设施。
-
-## 直接启动 daemon {#daemon}
-
-按[安装与启动步骤](index.md#install)安装后,调用独立可执行文件:
-
-```bash
-pvisor-daemon protocol
-pvisor-daemon serve --help
-```
-
-`OPEN_SANDBOX_API_KEY` 配置生命周期认证。监听地址、public endpoint、持久状态和准入预算是 daemon 选项。Daemon 不读取原生 `RunConfig` 或 `RunSpec`。Daemon 状态与原生 Job 和缓存存储分开保存。
-
-VM-only supervisor 跨 API 重启保留 RunHandle。Pause/resume 使用同一 Attempt 上已确认的 live vCPU 控制,不是 cgroup freeze 或快照。为 `serve` 添加 `--memory-pool`,启用默认关闭的 daemon 自有池。Daemon 在私有状态目录下启动或复用独立的 `pvisor-daemon memory-pool --directory DIR` 组件;组件需要已持久化的池配置。见[池启用与预算](index.md#memory-pool)。
-
-## 独立缓存与 node 运行时 {#native}
-
-```bash
-pvisor-cache --help
-pvisor-daemon memory-pool --help
-```
-
-`pvisor-cache prepare/publish/serve/list/stat/read` 保持为独立命令,不是 daemon 子命令。发布、后端、认证和访问见[共享镜像缓存参考](../../reference/shared-image-cache.md)。
-
-Node 运行时拥有不可变环境挂载与 snapshot RAM,保留授权 store、兼容性检查和连接 pin。Daemon 没有自动 node acquire/release 适配器、RAM restore 或 template API。嵌入式原生调用方仍须显式管理所有权;先停使用方,再停 backing owner。
-
-## 宿主监督与外部访问 {#supervision}
-
-Daemon 和缓存以各自所属宿主账户运行,使用私有状态和受保护凭据。宿主重启策略和资源上限与 sandbox 准入累计分别配置。独立池支持跨 API 重启存活,不支持池进程故障或宿主重启恢复。池丢失会使依赖 VM 失败;替换池状态前先排空它们。池位于单个 sandbox cgroup 之外,因此须为页、索引和进程开销预留宿主余量。
-
-Daemon sandbox 执行要求 Linux x86_64、可用 `/dev/kvm`、可信绝对路径,以及已委派、启用 CPU/memory/PID controller 和 `cgroup.kill` 的 cgroup v2。没有 host、OCI 命令或 registry-pull 降级。对外访问使用 TLS 和正确的 `--public-endpoint HOST:PORT`。Daemon API key 不授权独立缓存或 node 运行时 IPC。
-
-历史 Controller/Worker 和 service supervisor 验收记录保留原部署范围,不验证当前 daemon。见[运行时边界](boundaries.md)与[运维](operations.md)。
diff --git a/docs/src/zh/guides/index.md b/docs/src/zh/guides/index.md
index f68a4492..1baa4f5b 100644
--- a/docs/src/zh/guides/index.md
+++ b/docs/src/zh/guides/index.md
@@ -26,4 +26,4 @@ Job 停止后,依次检查结果与退出码、实际控制和警告、拒绝
并行任务各用独立 workspace、stage 和明确的 Job selector,不并发 apply 到同一目标树。CI 保留 stage 与运行证据,把运行退出码和上传产物分开处理;评审步骤决定合入。评测任务先检查执行结果,再读取候选文件评分,完成后丢弃不需发布的改动。
-需要从文件状态重新尝试时,先按[后续步骤](../start/next-steps.md)检查工作区 fork 的前提,再在全部 apply/drop 之前分叉。命令语法以 [CLI 参考](../reference/cli.md)为准。
+需要从文件状态重新尝试时,先按[第一次运行](../start/first-run.md)末节检查工作区 fork 的前提,再在全部 apply/drop 之前分叉。命令语法以 [CLI 参考](../reference/cli.md)为准。
diff --git a/docs/src/zh/guides/parallel-agents.md b/docs/src/zh/guides/parallel-agents.md
index 6d70bd78..dd6917d1 100644
--- a/docs/src/zh/guides/parallel-agents.md
+++ b/docs/src/zh/guides/parallel-agents.md
@@ -1,6 +1,6 @@
# 单机多 Agent 并行与批量审查
-让多个 Agent 并行解决任务时,每个任务使用独立工作区和独立 Stage。这样每份结果都有自己的基线、日志和改动,评审时不会把两个 Agent 的输出混在一起。
+让多个 Agent 并行解决任务时,每个任务使用独立工作区和独立 stage。这样每份结果都有自己的基线、日志和改动,评审时不会把两个 Agent 的输出混在一起。
从 Git 仓库根目录准备两个工作区:
@@ -9,11 +9,11 @@ git worktree add --detach ../pvisor-task-a HEAD
git worktree add --detach ../pvisor-task-b HEAD
```
-分别进入这两个目录,使用下面的命令启动任务。两个 Stage 都放在对应工作区之外。先从两个并发任务开始,按[并发密度实验](../benchmarks/density.md)测量资源,再增加并发。
+分别在各自的终端进入这两个目录并运行下面的命令。两个 stage 都放在对应工作区之外。先从两个并发任务开始,按[并发密度实验](../benchmarks/density.md)测量资源,再增加并发。
-## 现有工具能完成的手工方案
+## 在两个独立 worktree 中运行两个任务
-在两个独立 checkout/worktree 中各运行一个 Job,每个任务使用项目外的独立 stage 和明确选择器。这样 lower 不会因另一任务 apply 而变化,结果可以分别审查;网络和凭据仍由每个 Job 的策略决定。
+在两个独立 checkout/worktree 中各运行一个 Job,每个任务使用项目外的独立 stage 和明确选择器。一个任务 apply 不会改变另一个任务的 lower,两份结果可以分别审查。网络和凭据仍由每个 Job 的策略决定。
```bash
# Terminal A / workspace A
@@ -33,11 +33,11 @@ pvisor status --review ../stage-b
## 运行数量由什么决定
-先从两个任务验证,再记录进程、FUSE 挂载、VM 内存、磁盘、模型服务额度和代理端口占用。每个 Job 使用不冲突的端口;没有数据时不发布 8/32/128 的容量承诺。资源限制的实际效果读 Bundle;容量测试见[并发密度](../benchmarks/density.md)。
+先从两个任务验证,再记录进程、FUSE 挂载、VM 内存、磁盘、模型服务额度和代理端口占用。每个 Job 使用不冲突的端口;并发度按实测决定,8、32、128 不是默认值。资源限制的实际效果读 Bundle;容量测试见[并发密度](../benchmarks/density.md)。
## 两个离线任务跑通批量流程 {#batch}
-先用 shell 任务验证两个工作区和两份记录能独立运行。从原仓库目录启动下面的脚本;它使用前面创建的两个 worktree,两个任务分别创建自己的文件。此示例需要 Bash 和能够运行 safe 任务的宿主。
+先用 shell 任务验证两个工作区和两份记录能独立运行。从原仓库目录启动下面的脚本;它使用前面创建的两个 worktree,两个任务分别创建自己的文件。此示例需要 Bash,宿主执行器需要支持 `--safe`。
```bash
(
@@ -75,4 +75,4 @@ git -C ../pvisor-task-a status --short
A 的文件写回它自己的 worktree;新增文件会显示在 `git status`,尚未加入 Git 索引时不会出现在普通 `git diff`。需要集成到主分支时,在该 worktree 完成测试和提交,再走项目的合并流程。
-替换为 Agent 时保留每个任务自己的 Stage,按 [Codex](agents/codex.md)或 [Claude Code](agents/claude-code.md)设置凭据与网络。先将每份结果映射到 workspace,再逐份评审和 apply;同一目标树的合入顺序由你的流水线控制。
+替换为 Agent 时保留每个任务自己的 stage,按 [Codex](agents/codex.md)或 [Claude Code](agents/claude-code.md)设置凭据与网络。先将每份结果映射到 workspace,再逐份评审和 apply;同一目标树的合入顺序由你的流水线控制。
diff --git a/docs/src/zh/guides/policies/files.md b/docs/src/zh/guides/policies/files.md
index 98e77d59..7e711a97 100644
--- a/docs/src/zh/guides/policies/files.md
+++ b/docs/src/zh/guides/policies/files.md
@@ -53,6 +53,6 @@ pvisor run --safe --mount /opt/tool:read -- agent-command
## 分层策略
-除了命令行,策略还可以写在工作区 `.pvisor/policy.toml` 和用户 `~/.config/pvisor/policy.toml` 中,跨层取最严格的决定。见[策略模型](../../concepts/policy-model.md)。
+除了命令行,策略还可以写在工作区 `.pvisor/policy.toml` 和用户 `~/.config/pvisor/policy.toml` 中,跨层取最严格的决定。见[策略叠加规则](../../concepts/capabilities-and-evidence.md#layering)。
完整参数见 [文件访问规则](../../reference/cli.md),TOML 写法见 [一套配置模型](../../reference/cli.md)。
diff --git a/docs/src/zh/guides/replay.md b/docs/src/zh/guides/replay.md
index e3881475..45ebe029 100644
--- a/docs/src/zh/guides/replay.md
+++ b/docs/src/zh/guides/replay.md
@@ -1,4 +1,4 @@
-# SandboxReplay
+# 回放历史轨迹
SandboxReplay 在用户已创建的新沙箱中回放 Agent 轨迹:重新执行恢复边界之前的工具调用,用新沙箱产生的 observation 重建 Agent 原生上下文,再从边界后继续运行。它在 [Run 与 Attempt 模型](../design/execution-model.md) 中创建派生 Run。
@@ -48,73 +48,9 @@ Agent 原生 system prompt + 工具定义 + 原始任务
`prepare-only` 和 `replay-only` 不发起实时模型请求,因此不会注入。未配置时仍保持
“请求准确结束在 `O′N`”的原有语义。
-## 3. Agent 适配
+## 3. 安装与运行位置
-### 3.1 Claude Code
-
-Claude Code 使用原生 JSONL/UUID session。SandboxReplay 解析活动 parent UUID 链,重放前 N 个完整工具批次,将新 observation 写入重建 session,然后通过 `claude --resume` 启动续跑。
-
-Claude Code 的 resume transport 会在模型请求前插入临时消息,因此 SandboxReplay 启动一个仅供本次续跑使用的本地协议桥。该桥验证并删除准确匹配的临时 envelope,使第一次模型请求仍结束在 `O′N`。它不启用 pVisor Gateway,也不捕获或持久化模型流量。
-
-异步子 Agent 的 `Agent` 与 `TaskOutput` 被视为 Claude Code 原生工具。恢复边界必须选在能够由原生 session 无歧义重建的位置。
-
-### 3.2 OpenHands
-
-OpenHands 使用原生 event trajectory 和 ReplayManager。SandboxReplay 提取前 N 个 Action,OpenHands Runtime 在新沙箱中执行这些 Action 并产生新的 Observation;replay queue 耗尽后,OpenHands 直接发起续跑请求。
-
-### 3.3 mini-swe-agent
-
-mini-swe-agent 使用原生 `mini-swe-agent-1.1` messages。配套 runner 保留原始 system 和任务消息,在新沙箱中重放前 N 个 action,并使用原生 observation formatter 将结果加入 `agent.messages`,随后直接调用下一次 `agent.step()`。
-
-### 3.4 Pi agent
-
-Pi agent 适配固定支持 `@earendil-works/pi-coding-agent` `0.83.0`,输入为
-Pi 原生 RPC event JSONL。一个 replay step 对应一个完整的 `turn_end` 工具批次。
-SandboxReplay 使用 Pi 自身的工具实现重新执行 `read`、`bash`、`edit`、`write`,
-将新 observation 写入新建的 Pi v3 session,再通过 Pi SDK 从边界续跑。轨迹包含
-这四种工具之外的调用时会拒绝执行,避免静默改变工具语义。未配置边界提示词时调用
-Pi 的原生 `continue()`;配置后则在 `O′N` 后通过 `prompt()` 追加一次用户消息。
-
-### 3.5 OpenCode
-
-OpenCode 适配固定支持 `1.17.7`,输入为 `opencode run --format=json` 产生的原生
-事件 JSONL。`user`、`step_start`、`text`、`reasoning`、`tool_use` 和
-`step_finish` 事件会按 step 分组;一个 replay step 对应一个完整的工具调用批次。
-SandboxReplay 在新沙箱中重新执行命令型工具以及 `read`、`write`、`edit` 文件工具,
-用新的 `state.output` 重建前缀,并通过 `opencode run --format=json --session` 从边界
-继续。工具执行期间的中间 `tool_use` 状态会合并,避免同一调用被重复回放。
-
-`opencode run` 没有 CLI 步数参数,且 1.17.7 在 resume 会话上不执行
-`agent.build.steps` 配置预算。SandboxReplay 因此为 OpenCode 引入了两个外部看门狗
-(对其它 Agent 不启用)。
-
-续跑步数由 pVisor 监督 stderr 进度日志,达到剩余预算后发送 SIGINT。
-连续 10 分钟无输出会触发空闲终止。预算触发结果为 `agent_status = max_steps`,
-metadata 记录 `opencode_step_budget`。这些机制针对固定适配版本;
-原始实测和诊断见 [实验报告](https://github.com/DeepLink-org/pvisor/blob/main/benchmark/replay/qwen3.6-results.md)。
-
-### 3.6 Codex
-
-Codex 适配固定支持 CLI `0.149.0`,输入为 Codex 原生 rollout JSONL。一个 replay step
-对应一组完整的 `function_call`/`custom_tool_call` 及其 outputs。SandboxReplay 在新沙箱
-中重放前缀工具,将原生 `response_item` 前缀写入隔离的 `CODEX_HOME`,再执行
-`codex exec resume --json`。native session ID 从 `session_meta` 自动提取;
-未知工具或缺少 native session ID 时显式失败,不会退化成全新会话。
-
-Codex 保留自身的 system prompt、工具定义和任务上下文,SandboxReplay 只替换边界前的
-observation。为兼容需要 resume prompt 的旧版 CLI,SandboxReplay 使用本地 Responses
-bridge 删除 transport nonce,再将请求转发到模型服务;续跑结束后也会从 native trajectory
-中清理 nonce。默认模式的输入条件为 `replayed_boundary_only`,不会向模型注入额外提示词。
-
-配置 `boundary_user_prompt` 时,提示词只在 `O′N` 后注入一次并保留;此时输入条件标记为
-`boundary_user_prompt_appended`。bridge 校验失败会拒绝续跑,不降级为直连。
-
-## 4. 使用方式
-
-### 4.1 安装 pVisor
-
-pVisor CLI 随 `pvisor` wheel 发布。沙箱内有 Python 3.10 或更高版本时,推荐直接
-安装发布版:
+`pvisor replay` 通常直接运行在用户已经创建的新沙箱中,因此 pVisor 必须安装在该沙箱内,或者以只读方式挂载到沙箱的 `PATH`。沙箱内有 Python 3.10 或更高版本时,直接安装发布版:
~~~bash
python -m pip install pvisor
@@ -124,131 +60,19 @@ pvisor --version
pvisor replay --help
~~~
-如果需要测试尚未发布的 SandboxReplay 代码,可以在目标沙箱中从源码只安装 pVisor:
-
-~~~bash
-git clone https://github.com/DeepLink-org/pvisor.git
-cd pvisor
-just install-cli
-
-export PATH="${CARGO_HOME:-$HOME/.cargo}/bin:$PATH"
-pvisor replay --help
-~~~
-
-开发时也可以不安装,直接构建并使用仓库内二进制:
-
-~~~bash
-just build release
-./target/release/pvisor replay --help
-~~~
-
-`pvisor replay` 通常直接运行在用户已经创建的新沙箱中,因此 pVisor 必须安装在该
-沙箱内,或者以只读方式挂载到沙箱的 `PATH`。如果在沙箱外构建后复制二进制,构建机
-与目标沙箱的操作系统、CPU 架构和动态链接运行时必须兼容。Agent runtime 也必须与
-所选 replay profile 的固定版本一致。
+如果在沙箱外构建后复制二进制,构建机与目标沙箱的操作系统、CPU 架构和动态链接运行时必须兼容。Agent runtime 也必须与所选 replay profile 的固定版本一致;各适配器的机制与固定版本见[回放设计](../design/replay.md)。
-### 4.2 CLI 与 TOML
-
-SandboxReplay 默认假设用户已经创建了一个新沙箱,并在沙箱中直接运行:
+## 4. 最小用法
~~~bash
pvisor replay \
--agent claude-code \
--trajectory /input/session.jsonl \
--after-step 30 \
- --agent-entrypoint /usr/bin/claude \
- --boundary-user-prompt '请检查新的 observation 后继续任务'
+ --agent-entrypoint /usr/bin/claude
~~~
-Pi agent runtime 安装在 `/opt/pi-agent` 时,命令为:
-
-~~~bash
-pvisor replay \
- --agent pi-agent \
- --trajectory /input/pi-agent.events.jsonl \
- --after-step 30 \
- --agent-entrypoint /opt/pi-agent/bin/pi
-~~~
-
-Pi agent 等价的 pVisor TOML 配置为:
-
-~~~toml
-[replay]
-agent = "pi-agent"
-trajectory = "/input/pi-agent.events.jsonl"
-after_step = 30
-agent_entrypoint = "/opt/pi-agent/bin/pi"
-max_steps = 200
-disable_thinking = true
-~~~
-
-OpenCode 使用原生事件 JSONL:
-
-~~~bash
-pvisor replay \
- --agent opencode \
- --trajectory /input/opencode.jsonl \
- --after-step 30 \
- --agent-entrypoint /usr/bin/opencode
-~~~
-
-Codex 使用原生 rollout JSONL;SandboxReplay 会自动读取轨迹中的 Codex native
-session ID,用户无需手工填写 `session_id`:
-
-~~~bash
-pvisor replay \
- --agent codex \
- --trajectory /input/rollout.jsonl \
- --after-step 30 \
- --agent-entrypoint /usr/bin/codex
-~~~
-
-两者也可使用同一个 TOML 文件,只需将 `[replay].agent`、`trajectory` 和
-`agent_entrypoint` 分别改为 `opencode` 或 `codex`。
-
-Claude Code 等价的 pVisor TOML 配置为:
-
-~~~toml
-[replay]
-agent = "claude-code"
-trajectory = "/input/session.jsonl"
-after_step = 30
-agent_entrypoint = "/usr/bin/claude"
-max_steps = 200
-session_id = "task-291-attempt-1"
-replay_only = false
-disable_thinking = true
-boundary_user_prompt = "请检查新的 observation 后继续任务"
-~~~
-
-### 4.3 执行模式与结果
-
-- 默认模式会执行选中的前缀,然后启动 Agent 继续运行;
-- `--replay-only` 会执行前缀,但在下一次模型请求前停止;
-- `--prepare-only` 只校验并构造前缀,不执行工具、不启动 Agent,也不要求 Agent runtime。
-
-`--max-steps` 是包含回放前缀在内的 Agent 动作总预算。例如
-`--after-step 30 --max-steps 50` 最多留下 20 个续跑动作。仅回放模式的预算必须覆盖前缀;续跑模式还必须至少留下一个实时动作。
-
-结果协议为 `sandbox-playback.result/v3`:`phase` 为 `prepared`、`replayed`
-或 `continued`;`quality` 为 `verified` 或 `degraded`;`agent_status` 区分
-`not_started`、`completed`、`max_steps` 与 `failed`。失败结果会保留已经生成的日志和原生轨迹。即使 OpenHands 进程返回 0,只要控制器报告 fatal 状态,结果仍为失败。
-
-成功结果的 metadata 记录边界提示词是否请求和注入,以及字符长度和 SHA-256;
-replay journal 不记录提示词明文;Agent 原生的 prepared 或 continued trajectory
-可能包含这条 user 消息。对于 Claude Code,内存桥只把提示词加入第一次清理后的
-上游请求,不修改重建的原生 session。配置提示词后,
-`next-action-comparison.json` 的输入条件为 `boundary_user_prompt_appended`。
-此时文本相似度和工具一致性仅供观察,不能解释为相同输入下的 replay 一致性。
-
-无法重新生成的 Claude observation 默认失败,只有显式指定 `--allow-stale-observations` 才会复用并把质量标记为 `degraded`。
-
-`disable_thinking` 也可以通过 `--disable-thinking` 指定。
-Replay 伴随工具使用独立参数:`--safe`、`--executor`、`--overlayfs-path`、
-`--overlayfs-compose` 等外层运行选项,或 TOML 的 `[run]`、`[overlayfs]`、`[overlaynet]`
-会请求受管执行。其文件系统参数以 `pvisor replay --help` 为准,不能直接照搬 `run` 的 `--stage/--mount`。
-
-完整参数见 [`pvisor replay` 命令参考](../reference/cli.md#replay-an-agent-trajectory)。
+执行模式(默认续跑、`--replay-only`、`--prepare-only`)、步数预算、边界提示词、结果协议 `sandbox-playback.result/v3` 与各 Agent 的 CLI/TOML 写法,以 [`pvisor replay` 命令参考](../reference/cli.md#replay-an-agent-trajectory)为准。
## 实验与开发资料
diff --git a/docs/src/zh/guides/review-apply.md b/docs/src/zh/guides/review-apply.md
index 99f6d1f7..82655ea7 100644
--- a/docs/src/zh/guides/review-apply.md
+++ b/docs/src/zh/guides/review-apply.md
@@ -8,9 +8,9 @@ pvisor status --review last
pvisor inspect last -- git status --short
```
-`--safe` 不指定路径时,工作区改动保留在 Job 存储中;需要指定位置时用 `--stage PATH`(放在项目外,每次 Run 使用新目录)。
+不传 `--stage` 时,`--safe` 把工作区改动保留在 Job 存储中;需要指定位置时,用 `--stage PATH`,放在项目外,且每次 Run 使用新目录。
-`last` 解析当前工作区最新的 Job,使用 `--stage` 后由该路径代替 `last`。`status --review` 展示证据和改动,`inspect` 在只读视图中执行检查命令。见 [Job 与存储](../concepts/jobs.md)。
+`last` 解析当前工作区最新的 Job。使用了 `--stage` 时,用该路径代替 `last`。`status --review` 展示证据和改动,`inspect` 在只读视图中执行检查命令。见 [Job 与存储](../concepts/jobs.md)。
## 分批应用
@@ -34,11 +34,11 @@ pvisor apply last --all
pvisor drop last
```
-丢弃只移除尚未应用的暂存改动,不能撤销已应用批次、网络调用或其他外部影响。丢弃之前想保留当前状态继续尝试,见[逻辑检查点与分叉](fork-checkpoint.md)。
+丢弃只移除尚未应用的暂存改动,不能撤销已应用批次、网络调用或其他外部影响。想在丢弃前保留当前状态、换个思路继续,见[逻辑检查点与分叉](fork-checkpoint.md)。
## 审查顺序与预期结果
-先确认 Job 已停止,再按以下顺序阅读:结果与退出码 → 实际文件/网络边界和警告 → 拒绝或失败的访问 → 净文件改动。允许规则和捕获记录不能代替强制力证据。
+先确认 Job 已停止,再按以下顺序读记录:结果与退出码 → 实际文件/网络边界和警告 → 拒绝或失败的访问 → 净文件改动。允许规则和捕获记录不能代替强制力证据。
```bash
pvisor status --review --diff ../stage-001
diff --git a/docs/src/zh/design/agent-task-performance-analysis.md b/docs/src/zh/lab-notes/agent-task-performance-analysis.md
similarity index 91%
rename from docs/src/zh/design/agent-task-performance-analysis.md
rename to docs/src/zh/lab-notes/agent-task-performance-analysis.md
index e9c77f7a..a8009ab8 100644
--- a/docs/src/zh/design/agent-task-performance-analysis.md
+++ b/docs/src/zh/lab-notes/agent-task-performance-analysis.md
@@ -1,5 +1,7 @@
# Agent 工具任务:技术记录
+> 注:文中「本地原始记录」及 `docs/src/assets/benchmarks/.data/` 等路径指向测量时的本地归档,未随仓库或站点发布,仅用于批次溯源。
+
无镜像 pVisor VM 的完整修复测试任务约 **4.61 秒**,Firecracker / 完整 Ubuntu 约 **8.51 秒**;staged 约 **0.72 秒**。Ubuntu 的开机等待影响短任务,pVisor 的工具执行仍有明显成本;启动快不等于工具路径领先。Claude/VM:初始化超时 / N=0,Codex 的真实工具闭环结果见下表。
## Motivation
@@ -18,7 +20,7 @@
### 无镜像 pVisor 与完整 Ubuntu:完整 Agent Env {#full-ubuntu}
-pVisor 复用宿主已安装的 Python/Node/Rust/Git/rg/Claude/Codex,不制作系统镜像;Firecracker/QEMU 在完整官方 Ubuntu 26.04.1 LTS 中安装发行版工具及相同 Rust/Agent CLI。每次新建环境,再执行同一修复计划与测试。VM 2 vCPU / 16 GiB,所有组相同两核预算、热宿主缓存;每格计划 10 次、3 次预热,随机顺序;有效 N 不足 10 时在表内标明。Ubuntu 的 Python/Node/Git 版本与宿主不同,完整版本和内核差异见[方法](../benchmarks/methodology.md#full-ubuntu)。
+pVisor 复用宿主已安装的 Python/Node/Rust/Git/rg/Claude/Codex,不制作系统镜像;Firecracker/QEMU 在完整官方 Ubuntu 26.04.1 LTS 中安装发行版工具及相同 Rust/Agent CLI。每次新建环境,再执行同一修复计划与测试。VM 2 vCPU / 16 GiB,所有组相同两核预算、热宿主缓存;每格计划 10 次、3 次预热,随机顺序;有效 N 不足 10 时在表内标明。Ubuntu 的 Python/Node/Git 版本与宿主不同,完整版本和内核差异见[方法](../benchmarks/index.md#full-ubuntu)。

@@ -62,17 +64,17 @@ Claude/VM 预检仍在初始化超过 90 秒,正式 N=0;没有通过工具
Codex 使用统一内部 `danger-full-access`,外层运行时提供表明的边界,默认双层沙箱兼容性未测。每格 N=10 仅提供首版预算与重复性,P95/P99 接近最大值,不支持长期尾延迟或真实模型成功率保证。RSS 每 20 ms 求进程树之和,Firecracker 包含独立 DNS/NAT 辅助进程,QEMU 使用进程内用户态网络,可能重复统计共享页和漏掉短峰;配置 16 GiB 不等于驻留 16 GiB,也不能从短任务推算并发容量。
-本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [方法与复现](../benchmarks/methodology.md#full-ubuntu) · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-workflows-private-tmp-20261004/evidence.tar.gz` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-clients-console-v2-20261004/evidence.tar.gz`
+本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [方法与复现](../benchmarks/index.md#full-ubuntu) · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-workflows-private-tmp-20261004/evidence.tar.gz` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-clients-console-v2-20261004/evidence.tar.gz`
完整 Ubuntu 的 QEMU 修复任务为 q35 **8.12 秒**、microvm **10.33 秒**,内部工具分别 **2.75 / 2.81 秒**。无镜像 pVisor 降低新任务总等待,但其 4.02 秒工具时间仍高于这些完整 Ubuntu 路径;长期复用环境时,这个差距值得优先优化。更换为 microvm 没有在本配置下自动改善完整任务。网络、设备和 CPU 暴露方式仍有差别,不把全部差值归因于 block device 或 FUSE。
-本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/manifest.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/summary.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/ubuntu-qemu-complete-20261004/evidence.tar.gz` · [QEMU method](../benchmarks/methodology.md#full-ubuntu-qemu)
+本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/manifest.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/summary.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/ubuntu-qemu-complete-20261004/evidence.tar.gz` · [QEMU method](../benchmarks/index.md#full-ubuntu-qemu)
### 历史受控环境:同工具制品与裁剪参考 VM {#reference-env}
以下批次用相同工具制品隔离部分版本差异;Firecracker/QEMU 使用裁剪 Linux 6.12.109 与静态 init,不启动完整发行版。pVisor 使用工具目录,经 virtio-fs 共享,不使用镜像。保留这些数据解释 Docker 与最小 VM 的性能水位;完整 Ubuntu 的实际部署成本和无镜像 hostroot 路径见[上节](#full-ubuntu)。
-这里部署完整环境,再运行真实客户端:Python 3.14.7、Node 24.18.0/npm、Rust/Cargo 1.98.1、Git、rg、Claude Code 2.1.128、Codex 0.160.0。环境约 3.58 GiB、7.6 万文件;原生、Docker 与 VM 使用相同工具制品、项目与校验。每格 30 次、3 次预热,共两核预算,VM 为 2 vCPU / 16 GiB。完整[参数与边界](../benchmarks/methodology.md#reference-env)单独列出。
+这里部署完整环境,再运行真实客户端:Python 3.14.7、Node 24.18.0/npm、Rust/Cargo 1.98.1、Git、rg、Claude Code 2.1.128、Codex 0.160.0。环境约 3.58 GiB、7.6 万文件;原生、Docker 与 VM 使用相同工具制品、项目与校验。每格 30 次、3 次预热,共两核预算,VM 为 2 vCPU / 16 GiB。完整[参数与边界](../benchmarks/index.md#reference-env)单独列出。
任务从检查项目、搜索错误、修复 Python 开始,再执行 Python/Rust/Node 测试、安装 32 个本地依赖、生成 diff。模型响应固定为这一工具计划;CLI 必须把真实通过的测试结果传回服务并正常结束。它覆盖环境部署与工具执行,尚不能代表大型仓库、真实模型解题成功率或公网依赖安装。
@@ -111,7 +113,7 @@ VM 的 npm 阶段约 1.74 秒,是本任务中最大的耗时阶段;Rust 编
Claude 与 Codex 的绝对时间不宜互相排名。Codex 还存在约秒级的客户端等待路径,Docker 约 6.26 秒、pVisor VM 约 10.93 秒;这比裸启动数字更贴近本轮完整客户端体验。差异属于这些固定版本与受控任务,不能直接推广到模型速度。
-**部署成本另列。** 从已安装工具离线复制、导入镜像、制作 ext4 环境约 109 秒,之后增加 CPU affinity helper 约 5.3 秒;不含工具下载和内核编译。每次的工作区/私有磁盘准备时间记录在 `prepare_ms`,不计入表中任务耗时。这些是已准备环境的短任务预算,不是首次安装到结束的耗时。内存审计见[方法](../benchmarks/methodology.md#reference-resources),不由配置的 16 GiB 推导每个 Agent 实占 16 GiB。
+**部署成本另列。** 从已安装工具离线复制、导入镜像、制作 ext4 环境约 109 秒,之后增加 CPU affinity helper 约 5.3 秒;不含工具下载和内核编译。每次的工作区/私有磁盘准备时间记录在 `prepare_ms`,不计入表中任务耗时。这些是已准备环境的短任务预算,不是首次安装到结束的耗时。内存审计见[方法](../benchmarks/index.md#reference-resources),不由配置的 16 GiB 推导每个 Agent 实占 16 GiB。
本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
@@ -150,4 +152,4 @@ python3 benchmark/pvisor/product_v1.py \
先用 `--samples 1 --warmups 0` 检查环境。脚本、输入定义和正确性断言在 `benchmark/pvisor/v1/`;报告会复制二进制、firmware 和当轮脚本并记录摘要。失败不会进入性能分布;准备、策略拒绝和工作负载错误分别保留。每个页面写明有效样本数;小样本 P95/P99 只描述本批次,不估计长期尾延迟。
-[环境、制品与采样方法](../benchmarks/methodology.md#product-v1) · 本地原始记录 `docs/src/assets/benchmarks/.data/product-v1-20261004/manifest.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/product-v1-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/product-v1-20261004/evidence.tar.gz`。报告保留源码的未提交状态;当轮可执行制品 SHA256 是身份依据。归档不含数 GB 的 rootfs、二进制和可重建工作区;输入摘要及每轮脚本保留。
+[环境、制品与采样方法](../benchmarks/index.md#product-v1) · 本地原始记录 `docs/src/assets/benchmarks/.data/product-v1-20261004/manifest.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/product-v1-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/product-v1-20261004/evidence.tar.gz`。报告保留源码的未提交状态;当轮可执行制品 SHA256 是身份依据。归档不含数 GB 的 rootfs、二进制和可重建工作区;输入摘要及每轮脚本保留。
diff --git a/docs/src/zh/design/benchmark-methodology-evidence.md b/docs/src/zh/lab-notes/benchmark-methodology-evidence.md
similarity index 93%
rename from docs/src/zh/design/benchmark-methodology-evidence.md
rename to docs/src/zh/lab-notes/benchmark-methodology-evidence.md
index 4c0ae2f8..9f65464c 100644
--- a/docs/src/zh/design/benchmark-methodology-evidence.md
+++ b/docs/src/zh/lab-notes/benchmark-methodology-evidence.md
@@ -1,10 +1,12 @@
# Benchmark 测量协议与证据
+> 注:文中「本地原始记录」及 `docs/src/assets/benchmarks/.data/` 等路径指向测量时的本地归档,未随仓库或站点发布,仅用于批次溯源。
+
所有基准遵守同一套协议:
- 写明硬件、操作系统、内核或 macOS 版本、FUSE 实现、pVisor 版本与提交号;
-- 给出 p50、p95、p99 与样本数;
-- 提供可一条命令复现的脚本(放在仓库 `benchmark/` 下),报告使用 `pvisor-benchmark/v1` schema;
+- 给出样本数与分布,尾部统计遵守注册表的样本量限制;30 个样本不报告 P99;
+- 使用注册的测量入口并保留其原生证据格式,历史报告保留原 schema;
- 每个对照组写明配置,不与「未调优的对手」比较;
- 结果按日期保留,不覆盖旧数据。
@@ -39,20 +41,19 @@ macOS/HVF 与 Linux/KVM 的数据融入对应主题的 benchmark 文档并同时
## 从现有测量入口开始
```bash
-just benchmark
-just benchmark nightly target/pvisor-benchmark/nightly
-just benchmark-compare target/pvisor-benchmark/candidate/raw-report.json target/pvisor-benchmark/main/raw-report.json
-# Linux:启动与资源占用矩阵
-just benchmark-startup --warmups 10 --samples 100
+just benchmark smoke --output benchmark.new/process/.data/candidate
+just benchmark nightly --output benchmark.new/process/.data/nightly-new
+just benchmark-compare benchmark.new/process/.data/candidate/in.bench.json benchmark.new/process/.data/main/in.bench.json
+just benchmark startup/timing --output benchmark.new/startup/.data/measurement
```
-`just benchmark` 测最小 host Run 与读取 Run Bundle 的进程级成本:smoke 为 2 次预热/10 个样本,nightly 为 10 次预热/50 个样本。两者使用 `pvisor-benchmark/v1`。`benchmark-startup` 使用独立的 `startup.json`/`startup.md`,不会伪装成同一个报告 schema;默认入口为 3 次预热/30 个样本,上例显式覆盖。
+进程回归门禁使用 semspec bench 与 hyperfine:smoke 为 2 次预热/10 个样本,nightly 为 10 次预热/50 个样本;分别测量原生启动、最小 host Run、status 和 review。`benchmark-compare` 接受配置与 harness 一致且通过校验的 `in.bench.json`;基线需使用同一套件另测到 `.data/main`。
-构建、镜像下载和 rootfs 准备不计入现有 startup 样本;报告必须标明这一边界。无法通过前置探测的 executor 单独列为 SKIP,并保留 stderr;成功测量要求命令成功且 Bundle 为 completed/零退出。不能把失败、跳过或控制降级算成更快的成功样本。
+启动事件时钟表每条件固定 3 次预热/60 个样本,同次启动记录 Ready 与正常 Exit。它不替代已退役的启动/资源矩阵,也不复现其历史采样设置。预构建二进制、rootfs、镜像和内核的准备要求见[当前 benchmark 手册](https://github.com/DeepLink-org/pvisor/blob/main/benchmark.new/README.md)。每个显式输出目录必须全新;失败保留证据并阻止发布。构建与输入准备不计入这些时钟。
## 解释与归档
-同机、同套件、同输入比较 candidate 与 baseline。`benchmark-compare` 默认以 15% 为回归阈值,除非显式启用 `--fail-on-regression`,结果只作报告。保存原始样本、摘要、完整参数、输入摘要与提交号;区分冷镜像、热磁盘缓存与热页缓存,记录后台负载和电源状态。
+同机、同套件、同输入比较 candidate 与 baseline。`benchmark-compare` 默认以 15% 为回归阈值,检测到回归时返回非零退出码。保存原始样本、摘要、完整参数、输入摘要与提交号;区分冷镜像、热磁盘缓存与热页缓存,记录后台负载和电源状态。
2026-10-04 首版提供文件系统、网络、apply、并发密度、受控 Agent 工具闭环、机器审查流程、隔离和回放前缀数据。真实模型成功率、人工监督分钟数、云端延迟与 macOS 新工作负载仍未测;每页单独解释范围。
@@ -154,7 +155,7 @@ uv run --no-project --with matplotlib python benchmark/pvisor/render_ubuntu_base
--assets target/ubuntu-reference-new --output /tmp/full-ubuntu-report-new
```
-本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [方法与复现](../benchmarks/methodology.md#full-ubuntu)
+本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [方法与复现](../benchmarks/index.md#full-ubuntu)
Ubuntu 工具包清单另见本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-packages.txt`。正式任务统一将编译与客户端临时文件置于工作区私有 `_tmp`,避免 hostroot 的只读 `/tmp`;失败诊断保留,不计入新的正式分布。
diff --git a/docs/src/zh/design/filesystem-io-performance-analysis.md b/docs/src/zh/lab-notes/filesystem-io-performance-analysis.md
similarity index 99%
rename from docs/src/zh/design/filesystem-io-performance-analysis.md
rename to docs/src/zh/lab-notes/filesystem-io-performance-analysis.md
index 97cdbfb7..f8835f5b 100644
--- a/docs/src/zh/design/filesystem-io-performance-analysis.md
+++ b/docs/src/zh/lab-notes/filesystem-io-performance-analysis.md
@@ -1,5 +1,7 @@
# 文件系统 I/O:缓存、异步合批与完成吞吐
+> 注:文中「本地原始记录」及 `.data/` 路径指向测量时的本地归档,未随仓库或站点发布,仅用于批次溯源。
+
## 主要结论 {#conclusions}
### 1. 顶层判断:两项写密集任务更快,收益已有完整任务证据
@@ -25,7 +27,7 @@
## 优化动机 {#motivation}
-目标是在 guest 等待 I/O 时,让 host 持有写入字节并继续处理文件,减少后台对 guest RAM 的依赖。host 接受 WRITE 后,队列持有复制出的字节和固定的原生文件 handle;对象存活与路径名分离,使后续 close、rename 或 unlink 能按既有排序边界处理。文件生命周期和错误语义由[Agent I/O 完成设计](experimental/agent-io-completion/index.md)定义。
+目标是在 guest 等待 I/O 时,让 host 持有写入字节并继续处理文件,减少后台对 guest RAM 的依赖。host 接受 WRITE 后,队列持有复制出的字节和固定的原生文件 handle;对象存活与路径名分离,使后续 close、rename 或 unlink 能按既有排序边界处理。文件生命周期和错误语义由[Agent I/O 完成设计](../design/experimental/agent-io-completion/index.md)定义。
需要区分三个边界:accepted 表示字节已交给 host,completed 表示相关写入前缀已应用,durable 表示显式同步操作已成功完成。WRITE 返回不能代替文件或目录 fsync。队列容量解决的是吸收突发写入的能力;host 的页缓存已接受字节后,较大的队列不必然增加吞吐。完整 VM offload 还要求其他 guest RAM 引用和设备活动满足交接条件,当前曲线没有测量这个过程。
@@ -536,4 +538,4 @@ SDK upper 热读负对照与不可变 lower 重读是不同实验;SDK native
操作级尾延迟、开放到达负载、公平的多 VM 竞争、掉电或崩溃耐久、跨硬件和冷磁盘均未测量。队列持有 host 字节与固定 handle 的语义测试也不能证明完整 VM offload 期间的吞吐、释放的物理 RAM 或恢复成本。
-复现命令、完整实验矩阵和剩余论文强度验证见仓库 `benchmark.new/filesystem/CURVES.md`。完整 CSV/JSON、来源摘要与原始记录保存在对应批次的本地 `.data/` 或 publication 目录;此前公开的数据文件归档于 `benchmark.new/.data/docs-assets-prune-20261018/`,迁移清单保留原路径、字节摘要和归档位置。
+复现命令、完整实验矩阵和剩余论文强度验证见仓库 `benchmark.new/filesystem/CURVES.md`。批次归档约定见[实验记录索引](index.md)。
diff --git a/docs/src/zh/design/filesystem-performance-analysis.md b/docs/src/zh/lab-notes/filesystem-performance-analysis.md
similarity index 98%
rename from docs/src/zh/design/filesystem-performance-analysis.md
rename to docs/src/zh/lab-notes/filesystem-performance-analysis.md
index cbb3a187..73cde2d5 100644
--- a/docs/src/zh/design/filesystem-performance-analysis.md
+++ b/docs/src/zh/lab-notes/filesystem-performance-analysis.md
@@ -1,7 +1,13 @@
# 文件系统性能:技术分析与实验记录
+> 注:文中「本地原始记录」及 `docs/src/assets/benchmarks/.data/`、`benchmark/.data/` 等路径指向测量时的本地归档,未随仓库或站点发布,仅用于批次溯源。
+
## 当前结论与测量覆盖 {#filesystem-status}
+**最新独立 N30 配对对照下,当前默认配置相对同批基线:启动至正常退出 -1.73%(95% CI [-5.70, -0.22]),写入 256 文件 -14.19%([-17.58, -9.82])。历史文件系统退化尚未整体修复;新建 VM 写合并与 DAX 均默认关闭,下文各批次的百分比来自各自冻结基线,不能累加。**
+
+各批次的测量覆盖与结论如下。
+
[文件系统 I/O 曲线](filesystem-io-performance-analysis.md)系统比较请求粒度、并发、同步、容量与复用工作集;独立 N30 和普通 CLI 对照未支持默认开启 host-owned 异步合批,请求计数解释了 backing 合并与 FUSE WRITE 数量的区别。
2026-10-17 的[guest 内核写回后续](filesystem-io-performance-analysis.md#guest-writeback)修复了关闭后 unlink/rename 再 syncfs 的对象生命周期问题,并用真实延迟 backing 验证跨批流水推进。本页历史批次中“ENOENT 未修复”指各自当时的冻结版本,旧时间、失败与结论保持原状;后续 SDK 修复不构成新的普通 CLI WB=1 性能验收。
@@ -38,7 +44,7 @@
[目录 FD 缓存扩容与 ATIME 诊断](#directory-cache-atime)未检出三轮七工具累计耗时的改善,默认容量保留 256。独立请求掩码探针确认:首次宿主 READ 后,请求 ATIME 的 stat 会补充 GETATTR;同 fd 页缓存命中后未出现该请求。
-**最新独立 N30 配对对照:所选 C3(新 VM 写合并默认关):启动至正常退出变化 -1.73%,95% CI [-5.70, -0.22]%;写入 256 文件变化 -14.19%,95% CI [-17.58, -9.82]%。结果归因于该次代码与默认配置组合,未建立全面恢复历史性能的结论。**
+最新独立 N30 配对对照(即本节首句所引批次,[详情](#filesystem-optimization-n30)):所选 C3(新 VM 写合并默认关):启动至正常退出变化 -1.73%,95% CI [-5.70, -0.22]%;写入 256 文件变化 -14.19%,95% CI [-17.58, -9.82]%。结果归因于该次代码与默认配置组合,未建立全面恢复历史性能的结论。
独立批次详见[Linux:文件系统优化与写合并默认关闭的 N30 配对对照](#filesystem-optimization-n30)。以下已有汇总保留各历史批次的结论。
@@ -1612,13 +1618,13 @@ Agent 经常反复读目录、搜索和修改文件。应同时看到任务本
## macOS
-本轮在 Linux 实测,以下工作负载没有 macOS 样本;macFUSE/FSKit 开销与并发容量均未测。既有 macOS/HVF 数据继续保留在 [VM 启动时间](../benchmarks/startup.md)与[VM 内存报告](../benchmarks/vm-memory/index.md),不移作本页结果。
+本轮只在 Linux 实测,平台覆盖边界与既有 macOS/HVF 数据的归属见[端到端任务分析](agent-task-performance-analysis.md)。
## Linux:统一文件服务重构后的评测 {#filesystem-service}
本轮测试使用重构后的冻结源码,host 保留 FUSE,VM 的本地、staged 和
lazy 文件视图由 virtio-fs 接入共享服务;lazy 镜像不再建立中间宿主 FUSE
-挂载。[实现结构](overlayfs.md#filesystem-service)中的协议状态仍
+挂载。[实现结构](../design/overlayfs.md#filesystem-service)中的协议状态仍
分属两个入口,没有启用 DAX、writeback cache 或长期属性缓存。
### 对照与测量范围 {#service-protocol}
@@ -2186,7 +2192,7 @@ cargo nextest run --locked --release -p pvisor-vm \
可以据此定位遍历、搜索、编译和安装的实际等待;不能由某一个读取数字得出 block device 总是比 FUSE 快。数据同时改变了内核、工具版本、文件系统和暂存语义。长任务选型更应结合 worker 与[完整闭环](../benchmarks/agent-tasks.md#full-ubuntu),而不是只比较开机时间。
-本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [方法与复现](../benchmarks/methodology.md#full-ubuntu)
+本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [方法与复现](../benchmarks/index.md#full-ubuntu)
### 完整工具环境的 Docker 基线 {#reference-fs}
@@ -2207,7 +2213,7 @@ cargo nextest run --locked --release -p pvisor-vm \
任务核对文件数量/大小、SHA256、Git clean、搜索命中、编译结果与安装包数量。Docker 是 writable bind mount,pVisor 使用 staged 视图;Firecracker/QEMU 在私有 ext4 内执行。文件路径不同是实际部署成本的一部分;这不是相同文件系统只替换 VMM 的因果实验。其他运行时的各操作分布也在本轮汇总中。
-[配置与复现](../benchmarks/methodology.md#reference-env) · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
+[配置与复现](../benchmarks/index.md#reference-env) · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
### 首版 Linux 矩阵:独立批次
@@ -2299,9 +2305,7 @@ VM 主批次使用 host rootfs `/` 和 2 vCPU/1 GiB,并提供宿主只读视
## 来源与复现 {#run}
-完整 CSV/JSON、来源摘要和原始记录保留在对应批次的本地 `.data/` 或 publication 目录。此前公开的数据文件归档于 `benchmark.new/.data/docs-assets-prune-20261018/`,迁移清单保留原路径、字节摘要和归档位置。
-
-从仓库根目录运行;输出目录必须是新目录。动态 firmware 入口需要 GNU/Linux 版 CLI;静态 musl 制品使用另一套 firmware 入口,不能混用。Linux、KVM/FUSE/user namespaces、Python 3.14、Rust/GCC、Git/rg、Node 24/npm、Podman/crun 是本机工具环境;Agent 套件另需 Claude/Codex CLI。
+批次归档约定见[实验记录索引](index.md)。
```bash
python3 benchmark/pvisor/product_v1.py \
@@ -2312,6 +2316,4 @@ python3 benchmark/pvisor/product_v1.py \
--suites filesystem --samples 30 --warmups 3
```
-先用 `--samples 1 --warmups 0` 检查环境。脚本、输入定义和正确性断言在 `benchmark/pvisor/v1/`;报告会复制二进制、firmware 和当轮脚本并记录摘要。失败不会进入性能分布;准备、策略拒绝和工作负载错误分别保留。每个页面写明有效样本数;小样本 P95/P99 只描述本批次,不估计长期尾延迟。
-
-[环境、制品与采样方法](../benchmarks/methodology.md#product-v1) · 本地原始记录 `docs/src/assets/benchmarks/.data/product-v1-20261004/manifest.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/product-v1-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/product-v1-20261004/evidence.tar.gz`。报告保留源码的未提交状态;当轮可执行制品 SHA256 是身份依据。归档不含数 GB 的 rootfs、二进制和可重建工作区;输入摘要及每轮脚本保留。
+harness 环境、预检与失败分类约定同[端到端任务分析的复现节](agent-task-performance-analysis.md#run);本地原始记录批次同为 product-v1-20261004,当轮制品 SHA256 是身份依据。
diff --git a/docs/src/zh/lab-notes/index.md b/docs/src/zh/lab-notes/index.md
new file mode 100644
index 00000000..adddfc0e
--- /dev/null
+++ b/docs/src/zh/lab-notes/index.md
@@ -0,0 +1,16 @@
+# 实验记录
+
+这里保存性能与机制的工程实验记录:设计过程中的测量、分析与失败复盘。它们回答「当时为什么这样设计」,不回答「现在该怎么选型」——面向选型的结论以[基准与对比](../benchmarks/index.md)为准。
+
+每页的数值属于各自的冻结批次与制品版本,不代表当前构建的性能水位。`.data/` 路径指向本地归档,未随仓库或站点发布,仅用于批次溯源。
+
+完整 CSV/JSON、来源摘要和原始记录保留在对应批次的本地 `.data/` 或 publication 目录。此前公开的数据文件归档于 `benchmark.new/.data/docs-assets-prune-20261018/`,迁移清单保留原路径、字节摘要和归档位置。
+
+| 页面 | 内容 |
+| --- | --- |
+| [VM 启动性能分析](vm-startup-performance-analysis.md) | 启动路径的分解、回归与验收记录 |
+| [端到端任务性能分析](agent-task-performance-analysis.md) | 真实 Agent 任务在各执行器下的端到端测量 |
+| [VM 内存性能分析](vm-memory-performance-analysis.md) | 去重、共享库与池化的静态曲线与读回代价 |
+| [文件系统性能分析](filesystem-performance-analysis.md) | OverlayFS 各配置的负载测量与复测记录 |
+| [缓存与异步写入性能曲线](filesystem-io-performance-analysis.md) | 请求粒度、并发、同步与写合并的工程曲线 |
+| [Benchmark 方法与证据](benchmark-methodology-evidence.md) | 历史批次的测量口径与证据清单 |
diff --git a/docs/src/zh/design/vm-memory-performance-analysis.md b/docs/src/zh/lab-notes/vm-memory-performance-analysis.md
similarity index 93%
rename from docs/src/zh/design/vm-memory-performance-analysis.md
rename to docs/src/zh/lab-notes/vm-memory-performance-analysis.md
index acf9913c..2285fee3 100644
--- a/docs/src/zh/design/vm-memory-performance-analysis.md
+++ b/docs/src/zh/lab-notes/vm-memory-performance-analysis.md
@@ -1,10 +1,12 @@
# 内存去重曲线:Firecracker、Docker 与 pVisor
+> 注:文中本地 `.data/` 路径指向测量时的本地归档,未随仓库或站点发布,仅用于批次溯源。
+
## Linux:去重速度、压缩与共享库预检 {#linux-pool-curves}
### 观察到的收益与代价 {#pool-findings}
-**物理共享池能较早回收跨 VM 重复的随机数据,并在完整读回后保持共享。** 文件读取提示在共享库实验中提前了回收,DAX 则直接复用显式不可变文件的页。以下对照同时记录回收速度、CPU 和窗口末尾占用,用于分析不同路径的收益与成本。
+**四实例各持相同 64 MiB 随机数据时,物理池约 1.7 秒起持续回收 128 MiB 计费内存,KSM 需约 27.8 秒;没有可共享业务页时,池占用 391.62 MiB 并消耗 8.1 CPU 秒扫描,收益不成立。** 文件读取提示在共享库实验中提前了回收,DAX 则直接复用显式不可变文件的页。所有读数均为每格 N=1 的单次观察,不提供置信区间、稳定排名或生产密度结论。以下对照同时记录回收速度、CPU 和窗口末尾占用,用于分析不同路径的收益与成本。
2026-10-18 的两组完整预检分别包含 21 个静态内存条件和七个共享库条件,每格 N=1。全部 1,218/406 项内容、私有写入、独立退出校验以及资源、来源和原始数据审计通过。分析仅使用这两组完整预检;额外的部分重复测量不混入汇总。以下读数不提供置信区间、稳定排名或生产密度结论。
diff --git a/docs/src/zh/design/vm-startup-performance-analysis.md b/docs/src/zh/lab-notes/vm-startup-performance-analysis.md
similarity index 97%
rename from docs/src/zh/design/vm-startup-performance-analysis.md
rename to docs/src/zh/lab-notes/vm-startup-performance-analysis.md
index 190aa14b..b095defc 100644
--- a/docs/src/zh/design/vm-startup-performance-analysis.md
+++ b/docs/src/zh/lab-notes/vm-startup-performance-analysis.md
@@ -1,5 +1,7 @@
# VM 启动:技术分析与实验记录
+> 注:文中「本地原始记录」及 `docs/src/assets/benchmarks/.data/` 等路径指向测量时的本地归档,未随仓库或站点发布,仅用于批次溯源。
+
## Linux:启动与退出修复复测,2026-10-11 {#concurrency-retest}
**退出清理优化有明确收益,但启动退化尚未全部解决。** 相对 `cf8bfa5` GNU 制品,host Ready 减少约 9.11 ms、Exit 减少约 75.00 ms;VM Exit 减少约 48.26 ms,Ready 未检出改善。新版 staged Ready 出现两个明显分布簇,不能宣称已恢复。
@@ -72,7 +74,7 @@ Agent 执行器可能反复创建隔离环境,启动等待会直接影响首
### 计时边界与工作负载
-我们测量从启动 pVisor 到新 VM 执行第一条 shell 命令并返回输出的时间,表中记为 **Ready**。它覆盖宿主准备、VM 启动和命令执行,反映用户发出命令后的启动等待。
+计时从启动 pVisor 开始,到新 VM 执行第一条 shell 命令并返回输出结束,表中记为 **Ready**。它覆盖宿主准备、VM 启动和命令执行,反映用户发出命令后的启动等待。
**Exit** 从同一起点计到运行时正常退出,包含结果保存和关机等收尾工作。每次创建新 VM,宿主缓存已预热;pVisor 使用目录,参考运行时的镜像下载和制作在计时前完成。完整 Ubuntu 还要求发行版系统服务就绪,其新批次单独给出。
@@ -339,13 +341,13 @@ Linux / KVM,2 vCPU / 2 GiB、相同宿主两核预算,原批次前五行各
**QEMU 使用同一完整 Ubuntu,而不是历史裁剪内核。** q35 与 microvm 共用 Firecracker 的原厂内核、initrd、工具和已初始化磁盘模板。这个配置下,最小设备模型并没有消除发行版的秒级开机成本。各组是同机独立批次,QEMU N=10、宿主仍有后台负载,个别波动保留;相近的中位数不支持精细的 VMM 排名。QEMU 首次 cloud-init 尚未补测。
-本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/samples.csv` · [QEMU protocol](../benchmarks/methodology.md#full-ubuntu-qemu)
+本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-qemu-20261004/samples.csv` · [QEMU protocol](../benchmarks/index.md#full-ubuntu-qemu)
**选择含义:** 频繁创建环境、执行一两条命令时,无镜像路径能减少秒级 OS 开机等待;需要完整 Ubuntu 系统服务和发行版环境时,这些秒数是获得该环境的成本。此表比较两种真实部署方式,包含不同内核、初始化路径和文件系统,不能据此声称 libkrun 本身比 Firecracker 快约 50 倍。长任务更应看[任务与工具内部时间](../benchmarks/agent-tasks.md#full-ubuntu),启动差距会被摊薄。
Exit 还包含正常关机:pVisor 中位数 174 ms,Firecracker/Ubuntu 约 9.23 / 12.86 秒。Firecracker/Ubuntu 使用默认 MMIO 设备和原厂 initrd,正常 guest reboot 后 VMM 零退出;每次记录完整 OS 证明且无失败 unit。工作区复制或私有磁盘克隆单列 `prepare_ms`,中位数约 37 / 29 ms,不含在 Ready 内。图采用对数轴,条形 P50、标记 P95;N=30 的 P99 接近最大值,只描述本批次。
-本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [方法与复现](../benchmarks/methodology.md#full-ubuntu) · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-ready-mmio-20261004/evidence.tar.gz`
+本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/summary.tsv` · [方法与复现](../benchmarks/index.md#full-ubuntu) · 本地原始记录 `docs/src/assets/benchmarks/.data/full-ubuntu-20261004/ubuntu-ready-mmio-20261004/evidence.tar.gz`
#### 新 VM 启动结果 {#linux-results}
@@ -389,7 +391,7 @@ QEMU q35 的 218 ms 不能代表 QEMU 的最低启动成本;关闭可选传统
**首条输出不等于 Agent 已能完成任务。** 七种工具完成版本自检需要 pVisor VM 1.40 秒;实际修复测试任务与 CLI 兼容性见[完整工具环境](../benchmarks/agent-tasks.md#reference-env)。上一节 172.69 ms 的旧 GNU/libkrunfw 5.5.0 批次继续保留;本轮为新的固定静态制品,不能当作只改变一项配置的优化实验。
-[本轮配置与复现](../benchmarks/methodology.md#reference-env) · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
+[本轮配置与复现](../benchmarks/index.md#reference-env) · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/samples.csv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/summary.tsv` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/evidence.tar.gz` · 本地原始记录 `docs/src/assets/benchmarks/.data/reference-env-20261004/compatibility.tsv`
#### 完整退出补测:不要把清理时间当作 Ready {#reference-exit}
@@ -412,8 +414,6 @@ QEMU q35 的 218 ms 不能代表 QEMU 的最低启动成本;关闭可选传统
## 5. 复现与原始数据
-完整 CSV/JSON、来源摘要和原始记录保留在对应批次的本地 `.data/` 或 publication 目录。此前公开的数据文件归档于 `benchmark.new/.data/docs-assets-prune-20261018/`,迁移清单保留原路径、字节摘要和归档位置。
-
### macOS / HVF
先准备 release CLI、Alpine rootfs 和两个 firmware 目录,再运行:
diff --git a/docs/src/zh/reference/cases-vm.md b/docs/src/zh/reference/cases-vm.md
index 66a753ba..495f4141 100644
--- a/docs/src/zh/reference/cases-vm.md
+++ b/docs/src/zh/reference/cases-vm.md
@@ -126,6 +126,8 @@ assert_content "$CASE_ROOT/occupied.ram" keep
**语义**:启动时启用压缩,offload 返回合法 PVZRAM v2 manifest 与不可变 base/delta bundle;逻辑 RAM 大小完整,每次 offload 后整个 bundle 实际分配的磁盘空间均小于该测试负载的 RAM 范围。每次恢复后修改产生不同的 generation,其链可读取原文;十次回收、恢复覆盖从八层到一层的 compaction,不可达 generation 被回收,最多保留八层。guest 的固定数据 SHA-256 和持续更新的 1 MiB 页面内容在全部循环后均保持,暂停/恢复事件与状态一致。generation 不宣称跨设备的原子快照。
+Linux 需要 FUSE;macOS 需要 macFUSE 内核后端。
+
**违反示例**:写入的只是普通 RAM 文件、缺失父层被当作零、manifest 未生成新的 head、Seekable 索引损坏、guest 缺页读回压缩字节而不是原文、回收后可变页面丢失,或 compaction 后旧层持续累积。
diff --git a/docs/src/zh/reference/cli.md b/docs/src/zh/reference/cli.md
index 51bbd573..6d90a618 100644
--- a/docs/src/zh/reference/cli.md
+++ b/docs/src/zh/reference/cli.md
@@ -85,7 +85,7 @@ pvisor-daemon memory-pool --help
pvisor-cache --help
```
-为 `pvisor-daemon serve` 添加 `--memory-pool`,启用默认关闭的独立池组件。`pvisor-cache prepare/publish/serve/list/stat/read` 保持独立。Node 运行时协议供原生调用方使用,没有 daemon acquire/release 适配器。NativeRuntime 嵌入 VM 执行;checkpoint/fork 与 stage/apply API 未实现。所有权、安装与部署边界见 [daemon 与缓存入口](../guides/daemon/service.md)。
+为 `pvisor-daemon serve` 添加 `--memory-pool`,启用默认关闭的独立池组件。`pvisor-cache prepare/publish/serve/list/stat/read` 保持独立。Node 运行时协议供原生调用方使用,没有 daemon acquire/release 适配器。NativeRuntime 嵌入 VM 执行;checkpoint/fork 与 stage/apply API 未实现。所有权、安装与部署边界见 [daemon 指南](../guides/daemon/index.md)。
其他未知名称按默认执行规则处理。已退役的 `ctrl` 是明确例外:
`pvisor ctrl`、`pvisor ctrl --help` 和 `pvisor help ctrl` 在 Job 准入前
@@ -178,26 +178,28 @@ Session 决定写入当前 Job 目录的 `audit-policy.json`,workspace 和 use
代理网络审计属于协作式边界:未经过代理的直接连接不会触发此弹窗。
```text
-Jobs:
+Execution:
run 启动 Job
status 查看 Job 状态
kill 终止 Job
- suspend 保存执行状态并暂停 Job
- resume 继续暂停的 Job
- fork 从暂存文件或 VM 执行状态创建分支
- checkpoint Create, list, show, delete, verify, import-base, verify-base, gc
-
-Filesystems:
- inspect 只读查看 Job 文件系统
+Changes:
review 审查暂存变化与执行证据
apply 接受选定的暂存变化
drop 丢弃暂存变化
+ inspect 只读查看 Job 文件系统
-Extensions:
- service 原生服务生命周期与已安装的 daemon/cache/memory-pool companion
+Checkpoints:
+ checkpoint create, list, show, delete, verify, import-base, verify-base, gc
+ suspend 保存执行状态并暂停 Job
+ resume 继续暂停的 Job
+ fork 从暂存文件或 VM 执行状态创建分支
+
+Tools:
replay 回放 Agent 轨迹(安装后可见)
tui 交互式 Job 终端(安装后可见)
+ feature 查询编译期特性
+ help 查看命令详细选项
```
## 安全的第一次运行 {#安全的第一次运行}
@@ -345,7 +347,7 @@ HOME 状态改动在 Run 结束后丢弃,不包含在工作区 Run Bundle 中
已有容器挂载和文件系统底层仍保留;项目 base、rootfs、executor 不变。
需要向 Agent 交付凭据时显式使用 `--pass-env`;使用已配置的 Gateway 可由可信侧持有上游 Key。
-启动时会打印实际策略及覆盖提醒。必须注意:
+启动时会打印实际策略及覆盖提醒:
- 不使用 `--safe` 时,host/container 选择性代理仍可绕过。
- 域名规则无法区分同域名下的推理、遥测与上传 API,也无法阻止内容被夹带在模型请求中。
@@ -454,7 +456,9 @@ pvisor replay --agent pi-agent \
Replay 有三种模式。默认回放前缀并继续;`--replay-only` 执行前缀并在模型
请求前停止;`--prepare-only` 构造前缀,不执行工具、也不要求 runtime。
-`--max-steps` 是包含已回放动作的总动作预算。
+`--max-steps` 是包含已回放动作的总动作预算:`--after-step 30 --max-steps 50`
+最多留下 20 个续跑动作;replay-only 的预算必须覆盖前缀,续跑模式还必须
+至少留下一个实时动作。
`--allow-stale-observations` 是显式的仅 Claude 逃生口,会把 v3 结果标为
`degraded`。
@@ -462,17 +466,24 @@ Replay 有三种模式。默认回放前缀并继续;`--replay-only` 执行前
模型推理之前追加一条用户消息。TOML 写法是 `replay.boundary_user_prompt`。
prepare-only 和 replay-only 模式下它不参与推理;省略该选项则保持未修改的
replay 边界。结构化结果和 replay journal 只存储注入状态、长度和 digest;
-Agent 原生的 prepared 或 continued 轨迹可以包含这条用户消息。
-
-结果 schema 是 `sandbox-playback.result/v3`,带类型化的 `phase`、`quality`
-和 `agent_status` 字段,以及 state/output 位置、artifacts 和可选结构化失败。
+Agent 原生的 prepared 或 continued 轨迹可以包含这条用户消息。配置提示词后
+`next-action-comparison.json` 的输入条件为 `boundary_user_prompt_appended`,
+此时文本相似度与工具一致性仅供观察,不能解释为相同输入下的回放一致性。
+
+结果 schema 是 `sandbox-playback.result/v3`:`phase` 为 `prepared`、
+`replayed` 或 `continued`;`quality` 为 `verified` 或 `degraded`;
+`agent_status` 区分 `not_started`、`completed`、`max_steps` 与 `failed`,
+另带 state/output 位置、artifacts 和可选结构化失败。失败结果保留已经生成的
+日志和原生轨迹;即使 OpenHands 进程返回 0,只要控制器报告 fatal 状态,
+结果仍为失败。
原先只用 `replay_only = true` 来构造前缀的非 Claude 调用方必须迁移到
`prepare_only = true`。
`disable_thinking` 属于 `[replay]`,也暴露为 `--disable-thinking`。Claude Code
由协议 bridge 将其应用到上游请求;OpenCode 设置后会省略 `--thinking`。该选项
不会打开 Gateway capture。可选的 `[run]`、`[overlayfs]` 和 `[overlaynet]` 段会
-创建外层受管 `pvisor run`;它们不改变内部 replay 模型路径。
+创建外层受管 `pvisor run`;它们不改变内部 replay 模型路径。replay 的文件系统
+参数以 `pvisor replay --help` 为准,不能照搬 `run` 的 `--stage/--mount` 写法。
默认情况下,replay 的内部状态、WAL、manifest、新鲜 observation 比较和原生
工作文件留在 `/tmp/pvisor-sandbox-replay`,并随 sandbox 消失。Replay 不启用
@@ -876,7 +887,7 @@ project/ # reusable workspace / default base
├── lease.lock
├── control.sock # while a live OverlayFS Run is available
├── .capture/ # when OverlayNet/Gateway is enabled
- └── events.jsonl # when --record-destination is set
+ └── events.trace.jsonl # when --record-destination is set
```
生命周期命令接受 Run id、Run 目录、项目工作区、`run.json`、upper 或 merged
@@ -919,4 +930,6 @@ VM 镜像启动会自动探测默认 socket;服务可用时,将远程镜像
完整协议、限制和 SSH 远程访问方式见 [共享镜像缓存协议](shared-image-cache.md)。
-通过 `pvisor-daemon serve --memory-pool` 启用 daemon 自有实验池;独立 `memory-pool --directory DIR` 组件使用 daemon 准备的私有配置。原生 `pvisor run --vm-memory-pool SOCKET` 仍是带有平台/协议限制的显式运行时选项,不是服务启动器。物理/legacy 池丢失会使依赖 VM 失败;Linux sealed 压缩客户端保留本地恢复,停止新发布,通过 daemon `--memory-pool-mode compressed` 选择。启用与预算见 [daemon 池](../guides/daemon/index.md#memory-pool);历史 macOS 压缩池结果保留其[版本范围](../design/memory-optimization/proof-of-concept.md#v1-integration)。
+通过 `pvisor-daemon serve --memory-pool` 启用 daemon 自有实验池;独立 `memory-pool --directory DIR` 组件使用 daemon 准备的私有配置。原生 `pvisor run --vm-memory-pool SOCKET` 仍是带有平台/协议限制的显式运行时选项,不是服务启动器。
+
+物理/legacy 池丢失会使依赖 VM 失败;Linux sealed 压缩客户端保留本地恢复,停止新发布,通过 daemon `--memory-pool-mode compressed` 选择。启用与预算见 [daemon 池](../guides/daemon/index.md#memory-pool);历史 macOS 压缩池结果保留其[版本范围](../design/memory-optimization/proof-of-concept.md#v1-integration)。
diff --git a/docs/src/zh/reference/config.md b/docs/src/zh/reference/config.md
index 13df8dbc..9d644a5e 100644
--- a/docs/src/zh/reference/config.md
+++ b/docs/src/zh/reference/config.md
@@ -55,7 +55,7 @@ workload-aware-memory-offloading = true
## Daemon 配置 {#daemon}
-`pvisor-daemon serve` 使用命令行设置,不读取这里的原生 `RunConfig` TOML 或已解析 `RunSpec`。`OPEN_SANDBOX_API_KEY` 使用至少 32 字节的受保护秘密。见 [daemon 启动](../guides/daemon/index.md#start)与 [daemon 与缓存入口](../guides/daemon/service.md)。
+`pvisor-daemon serve` 使用命令行设置,不读取这里的原生 `RunConfig` TOML 或已解析 `RunSpec`。`OPEN_SANDBOX_API_KEY` 使用至少 32 字节的受保护秘密。见 [daemon 启动](../guides/daemon/index.md#install)。
| 选项 | 默认值 / 含义 |
| --- | --- |
diff --git a/docs/src/zh/reference/env-vars.md b/docs/src/zh/reference/env-vars.md
index 023edb25..200e0da3 100644
--- a/docs/src/zh/reference/env-vars.md
+++ b/docs/src/zh/reference/env-vars.md
@@ -27,7 +27,7 @@ PVISOR_RUN_HOME="$HOME/.pvisor/runs" pvisor run --safe \
`OPEN_SANDBOX_API_KEY` 为独立 `pvisor-daemon serve` 提供生命周期 key。使用至少 32 字节的受保护随机秘密,不放在 argv 中,不投影给工作负载。客户端通过 `OPEN-SANDBOX-API-KEY` HTTP header 发送它;环境变量名称使用下划线,HTTP 名称使用连字符。
-默认 daemon 端点在返回的 headers 中提供沙箱范围的 `X-PVISOR-SANDBOX-TOKEN`,客户端必须保留。它不是宿主环境设置,也不是生命周期凭据。见[端点认证](../guides/daemon/operations.md#endpoints)。原生 cache/pool 凭据与 Job 环境投影独立保留;已退役的 Cluster token 不是 daemon 凭据。
+默认 daemon 端点在返回的 headers 中提供沙箱范围的 `X-PVISOR-SANDBOX-TOKEN`,客户端必须保留。它不是宿主环境设置,也不是生命周期凭据。见[端点认证](../guides/daemon/index.md#endpoints)。原生 cache/pool 凭据与 Job 环境投影独立保留;已退役的 Cluster token 不是 daemon 凭据。
## 运行时注入
@@ -47,13 +47,13 @@ PVISOR_RUN_HOME="$HOME/.pvisor/runs" pvisor run --safe \
其上的0049将提前提交提示改为压力目标的1/4,截在1–16 MiB;小量写入仍由10 ms timer推进,协商的单次WRITE上限仍为1 MiB。入队在连接锁外只读近似脏页数,不重复逐folio背压检查,也不调度空pending;实际压力检查、完整性回写前后的两次WRITE屏障和错误传播保留。0049v2还在启动request virtqueue前预分配有界scatterlist元数据,按原VQ锁保护并复用;文件页与每请求argbuf保持原有完成期所有权,其他原子分配仍然存在。
-0048历史证据与0049v2新批次分别保留。新固件已通过Linux x86_64/KVM的FULL/ERROR、7项固件合同、五次原压力历史复跑、独立N5曲线及普通CLI的WB0/1对照;正确性收据保留当时50项Python合同,后续CLI合同另有记录。CLI七工具整体与Ready未检出收益,新会话默认仍关闭。范围、逐工作负载结果与来源见[独立实验](../design/filesystem-io-performance-analysis.md#guest-writeback-tuning)。
+0048历史证据与0049v2新批次分别保留。新固件已通过Linux x86_64/KVM的FULL/ERROR、7项固件合同、五次原压力历史复跑、独立N5曲线及普通CLI的WB0/1对照;正确性收据保留当时50项Python合同,后续CLI合同另有记录。CLI七工具整体与Ready未检出收益,新会话默认仍关闭。范围、逐工作负载结果与来源见[独立实验](../lab-notes/filesystem-io-performance-analysis.md#guest-writeback-tuning)。
在 guest 中读取 `/sys/module/fuse/parameters/pvisor_wb_budget_bytes` 可查看生效目标;这是只读诊断参数,不能经 sysfs 或 boot argument 设置。可写close可延迟完成,只读close保留原生FLUSH,fsync/O_SYNC和最终syncfs的错误边界保留。新宿主按FORGET保留unlink/rename覆盖后的upper对象引用或lower逻辑属性;仍有detached/orphan引用时snapshot返回Unsupported,旧快照未知计数的有限节点保守保留到DESTROY。完整Agent IOCP/offload仍未验收。
`PVISOR_VM_FS_HOST_WRITEBACK` 是默认关闭的实验性 host 写缓存:未设置或 `0` 关闭,`1` 启用,其他值拒绝。当前只支持 Linux staged virtio-fs、guest writeback 关闭和 DAX 关闭;每连接 64 MiB payload、1024 个在途项,相邻连续写按最多 1 MiB 或 10 ms 聚合。显式同步与退出仍观察后台错误;完整 Agent IOCP 和自动卸载尚未接通。范围与同步合同见 [EXP-003](../design/experimental/agent-io-completion/index.md#host-write-buffer)。
-`PVISOR_VM_FS_HOST_WRITEBACK_CONFIG` 是私有工程调参 JSON:`capacity_mib` 为 4–256、`jobs` 为 1–4096、`batch_kib` 为 4–4096 且不超过容量、`chunks` 为 1–64、`delay_us` 为 0–50000。未设置沿用上述默认参数;未知、重复字段、错误类型和越界值拒绝。`qualification_lock` 和 `synchronous` 用于保留旧资格锁或等待 owned worker 完成的消融;不属于稳定产品设置。曲线和适用范围见[文件系统 I/O 实验](../design/filesystem-io-performance-analysis.md)。
+`PVISOR_VM_FS_HOST_WRITEBACK_CONFIG` 是私有工程调参 JSON:`capacity_mib` 为 4–256、`jobs` 为 1–4096、`batch_kib` 为 4–4096 且不超过容量、`chunks` 为 1–64、`delay_us` 为 0–50000。未设置沿用上述默认参数;未知、重复字段、错误类型和越界值拒绝。`qualification_lock` 和 `synchronous` 用于保留旧资格锁或等待 owned worker 完成的消融;不属于稳定产品设置。曲线和适用范围见[文件系统 I/O 实验](../lab-notes/filesystem-io-performance-analysis.md)。
下面两个变量影响 Linux x86_64 musl **构建时**嵌入的 guest 内核:
diff --git a/docs/src/zh/reference/exit-codes.md b/docs/src/zh/reference/exit-codes.md
index d1c293dd..eb9be0d1 100644
--- a/docs/src/zh/reference/exit-codes.md
+++ b/docs/src/zh/reference/exit-codes.md
@@ -25,7 +25,7 @@
独立 `pvisor-daemon` 的 `protocol` 成功或服务正常停止返回 0;clap 参数错误返回 2;启动/运行错误在 stderr 报告并返回 1。这些是服务进程状态,不是沙箱工作负载退出码。安装 companion 后,伴随派发保留其退出码。
-生命周期客户端应检查 HTTP status、`{code, message}` 与 `X-Request-ID`。创建返回 202 JSON;pause/resume 返回 202 空响应体;确认删除返回 204。这些都不证明工作负载命令成功。命令结果来自 prepared image 的真实 execd 数据面,不是原生 Job Run Bundle 或已退役 Cluster 的聚合结果。不支持的创建选项会被拒绝,不会静默生效。见 [daemon 运维](../guides/daemon/operations.md)。
+生命周期客户端应检查 HTTP status、`{code, message}` 与 `X-Request-ID`。创建返回 202 JSON;pause/resume 返回 202 空响应体;确认删除返回 204。这些都不证明工作负载命令成功。命令结果来自 prepared image 的真实 execd 数据面,不是原生 Job Run Bundle 或已退役 Cluster 的聚合结果。不支持的创建选项会被拒绝,不会静默生效。见 [daemon 运维](../guides/daemon/index.md#operations)。
## 在自动化里判断
diff --git a/docs/src/zh/reference/platforms.md b/docs/src/zh/reference/platforms.md
index d485a7ca..5f29c216 100644
--- a/docs/src/zh/reference/platforms.md
+++ b/docs/src/zh/reference/platforms.md
@@ -19,7 +19,7 @@
## 单机 daemon {#daemon}
-独立 daemon 原生运行时要求 Linux x86_64/KVM 和委派 cgroup v2,不支持 macOS HVF 或 Linux arm64。VM-only supervisor 嵌入 pVisor,使用可信独立 rootfs manifest 和 guest CID 3 vsock bridge 连接真实 execd/egress。可执行入口接入已实现;bootstrap/镜像未提供或端到端验证,也没有 SDK/密度证据。见 [daemon 安装](../guides/daemon/index.md)与[运行时边界](../guides/daemon/boundaries.md);wheel/原生执行器支持不证明 daemon 就绪。
+独立 daemon 原生运行时要求 Linux x86_64/KVM 和委派 cgroup v2,不支持 macOS HVF 或 Linux arm64。VM-only supervisor 嵌入 pVisor,使用可信独立 rootfs manifest 和 guest CID 3 vsock bridge 连接真实 execd/egress。可执行入口接入已实现;bootstrap/镜像未提供或端到端验证,也没有 SDK/密度证据。见 [daemon 安装](../guides/daemon/index.md)与[运行时边界](../guides/daemon/index.md);wheel/原生执行器支持不证明 daemon 就绪。
## 能力证据怎么验证
diff --git a/docs/src/zh/reference/vocab/vm.sh b/docs/src/zh/reference/vocab/vm.sh
deleted file mode 120000
index b14aa75f..00000000
--- a/docs/src/zh/reference/vocab/vm.sh
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../tests/semantics/vocab/vm.sh
\ No newline at end of file
diff --git a/docs/src/zh/security/executor-boundaries.md b/docs/src/zh/security/executor-boundaries.md
index 7cd7aa65..5c1b98d4 100644
--- a/docs/src/zh/security/executor-boundaries.md
+++ b/docs/src/zh/security/executor-boundaries.md
@@ -22,7 +22,7 @@
上表描述原生 Job 请求的控制,不是 daemon API。VM-only NativeRuntime 在独立 supervisor 中嵌入 pVisor,使用独立不可变 guest rootfs 与私有写入;委派 cgroup v2 限制 supervisor/VM 树。Stage/apply 与 checkpoint/fork API 未实现,也不自动获取 node 共享。OpenSandbox 网络策略选项被拒绝;原生 OverlayNet 出口网络不构成 deny-all 声明。
-宿主账户、daemon/firmware 与预制镜像属于可信输入。私有状态与同 UID IPC 不防御敌对宿主 UID/root 代码。其他本机用户可能访问 loopback 发布:使用真实服务鉴权与宿主控制。不承诺敌对多用户隔离或安全审计。未提供/验证的 bootstrap 与真实服务检查见 [daemon 运行时边界](../guides/daemon/boundaries.md)。
+宿主账户、daemon/firmware 与预制镜像属于可信输入。私有状态与同 UID IPC 不防御敌对宿主 UID/root 代码。其他本机用户可能访问 loopback 发布:使用真实服务鉴权与宿主控制。不承诺敌对多用户隔离或安全审计。未提供/验证的 bootstrap 与真实服务检查见 [daemon 指南](../guides/daemon/index.md#prerequisites)。
## 读表时要注意
diff --git a/docs/src/zh/start/first-run.md b/docs/src/zh/start/first-run.md
index faa44388..37dd968f 100644
--- a/docs/src/zh/start/first-run.md
+++ b/docs/src/zh/start/first-run.md
@@ -21,9 +21,9 @@ git init -q && git add -A && git commit -qm init
cat > ../agent.sh <<'SH'
#!/usr/bin/env bash
set -u
-printf 'print("patched")\n' >> src/app.py # 修改源码
-rm -f src/legacy.txt # 删除文件
-printf 'scratch\n' > scratch.txt # 工作区根目录的额外改动
+printf 'print("patched")\n' >> src/app.py # edit source
+rm -f src/legacy.txt # delete a file
+printf 'scratch\n' > scratch.txt # extra change at the workspace root
cat .ssh/id_rsa >/dev/null 2>&1 || echo 'read .ssh/id_rsa: denied'
curl -sS --max-time 5 https://example.com >/dev/null 2>&1 || echo 'reach example.com: blocked'
SH
@@ -68,3 +68,25 @@ pvisor status --review ../agent-stage-001
```
已安装的 Agent CLI 使用同一个入口。用 `--stage PATH` 时,后续命令请把该路径或命令输出的 Job ID(`run-*`)显式传进去;`last` 只在默认存储中解析,跨项目并行时不要依赖它。
+
+## 7. 换成真实任务之后
+
+把演示替换成一个范围明确的真实任务:保留当前仓库基线,确认 Agent 已安装在所选执行环境中,并配置它需要的模型服务与凭据——pVisor 不替 Agent 选择 provider。以显式交付 OpenAI Key 的 Codex 为例,先在宿主环境设置 `OPENAI_API_KEY`:
+
+```bash
+pvisor run --safe --pass-env OPENAI_API_KEY --stage ../agent-task-001 -- codex
+pvisor status --review ../agent-task-001
+pvisor inspect ../agent-task-001 -- git --no-pager diff -- src
+```
+
+`--safe` 按直接可执行文件名匹配网络预设;增加 `--overlaynet-allow` 会替换预设列表,依赖下载或其他模型服务要连同模型 API 一起列出。HOME 状态写入在退出后丢弃,不要依赖这次运行保存登录状态。其他 Agent 的凭据与接入条件见[Agent 接入](../guides/agents/index.md)。
+
+Job 停止后检查退出码、实际控制、警告和改动;非零退出也可能留下候选。以下条件同时成立时,工作区 fork 才能从文件状态重新尝试:
+
+- 父 Job 是已停止、且启动策略可重建的 host Job;
+- 父子 stage 在同一文件系统上;
+- 在全部 apply/drop 清理暂存数据之前分叉。
+
+VM/container 或带 Gateway 路由的 Job 不支持此路径。冲突处理见[审查与应用](../guides/review-apply.md)。
+
+扩大任务范围前有两项约束。Linux host 的选择性代理仍是协作式,需要强制选择性出口时准备已安装 Agent 的 VM,凭据交付方式见[凭据与环境变量](../guides/policies/credentials.md)。增加并发时为每个任务准备独立 worktree 和 stage,用显式路径定位结果,逐份审查,不并发 apply 到同一目标树;[并行工作区流程](../guides/parallel-agents.md#batch)先用两个离线任务验证记录和合入,再替换成真实 Agent。
diff --git a/docs/src/zh/start/index.md b/docs/src/zh/start/index.md
deleted file mode 100644
index f1ea9d94..00000000
--- a/docs/src/zh/start/index.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# 从这里开始
-
-**PolicyVisor(pVisor)** 让 Agent 全自动执行,文件改动由你决定去留。它运行你现有的 Agent CLI、脚本和自动化命令,并把每次运行实际生效的限制记录下来。
-
-Python 包和 CLI 统一使用 `pvisor`。先按[安装指南](installation.md)安装并确认平台要求;暂存的 host Job 需要 FUSE/macFUSE,普通 host Job 默认直接写入工作区。
-
-## 完成第一个闭环
-
-在一个可丢弃且还没有 `result.txt` 的测试项目目录中,用离线命令验证暂存和审查,不需要 Agent 账号或 API Key:
-
-```bash
-pvisor run --safe --overlaynet-deny-all -- /bin/sh -c 'printf "candidate\n" > result.txt'
-pvisor status --review last
-pvisor inspect last -- cat result.txt
-```
-
-命令应返回零,原项目中还没有新增的 `result.txt`。Job 停止后,`inspect` 在内核只读的 OverlayFS 工作区视图中运行宿主的 `cat`,应读到 `candidate`。审查结束状态、实际控制和文件改动后,选择保留或丢弃。
-
-保留文件,执行:
-
-```bash
-pvisor apply last --path result.txt
-```
-
-或者丢弃候选,执行:
-
-```bash
-pvisor drop last
-```
-
-这个示例只有一个改动,apply 后即完成并清理一次性暂存数据,无需再 drop。有多个改动且分批 apply 时,未选中的候选才继续保留,可随后 apply 或 drop。完整的[第一次运行](first-run.md)还演示文件删除和访问拦截。
-
-## 换成实际任务
-
-把 `--` 后的命令换成已安装的脚本或 Agent CLI,并显式配置所需凭据和网络目标。
-
-需要指定存储位置时,用项目外的新目录 `--stage PATH`,后续命令用该路径或输出的 Job ID,不能依赖只查默认存储的 `last`。HOME、VM 根目录与工作区的写入去向见[暂存与存储](../reference/cli.md#暂存与存储)。远程 API、数据库写入和消息不在文件暂存范围内。
diff --git a/docs/src/zh/start/installation.md b/docs/src/zh/start/installation.md
index 106c49e9..a0fefa93 100644
--- a/docs/src/zh/start/installation.md
+++ b/docs/src/zh/start/installation.md
@@ -1,25 +1,18 @@
# 安装指南
-装好 `pvisor` 后,你可以在策略边界内运行 Agent CLI、脚本和自动化命令,并拿到可检查的执行记录。
-Python 包、CLI 和核心 Rust crate 统一使用 `pvisor`;其他 crate 使用 `pvisor-*`,
-环境变量使用 `PVISOR_*`。
-
-升级时同步更新部署中的 `PVISOR_*`;本地状态默认写入 `.pvisor`,用户缓存写入 `pvisor/`,
-已有数据不会自动搬迁。
-
## 1. 安装工具
```bash
pip install pvisor
```
-确认命令可用:
+确认安装:
```bash
pvisor --version
```
-wheel 将 Python 版本标记与原生 CLI 脚本直接安装到当前 Python 环境的 bin 目录,不经过 Python 启动器。项目有其他
+wheel 把原生 CLI 装进当前 Python 环境的 bin 目录,不经过 Python 启动器。项目有其他
Python 依赖时,建议使用虚拟环境:
```bash
@@ -31,9 +24,11 @@ pip install pvisor
发布的 wheel 面向 Linux x86_64 和 macOS arm64。其他架构应先检查发布产物或准备源码构建。
+升级时同步更新部署中的 `PVISOR_*`。本地状态(`.pvisor`)和用户缓存(`pvisor/`)不会自动搬迁。
+
## 2. 检查平台要求
-wheel 安装支持 macOS 和 Linux,要求 Python 3.10 或更新版本;安装后的原生 CLI 不使用 Python 启动器。普通 host Job 默认直接写入工作区;
+wheel 安装支持 macOS 和 Linux,要求 Python 3.10 或更新版本。普通 host Job 默认直接写入工作区;
`--safe` 或 `--stage` 才使用文件系统暂存。在 macOS 上运行暂存的 host Job 前,先安装 macFUSE:
```bash
@@ -70,7 +65,7 @@ just install-cli
```
测试特定原生构建时,直接调用其路径(例如 `target/debug/pvisor`),或把其目录放在 `PATH` 最前。
-安装后的原生脚本不使用旧启动器的 `PVISOR_BIN` 覆盖。Editable Python 安装不是原生 CLI 构建;
+安装后的原生脚本忽略 `PVISOR_BIN`。Editable Python 安装不是原生 CLI 构建;
使用 `just build` 或 `just install-cli`。
## 单独安装单机 daemon {#daemon}
diff --git a/docs/src/zh/start/next-steps.md b/docs/src/zh/start/next-steps.md
deleted file mode 100644
index e67ef02a..00000000
--- a/docs/src/zh/start/next-steps.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# 第一次运行之后
-
-先把演示替换成一个范围明确的真实任务,例如只修改 `src` 中的一处实现。保留当前仓库基线,确认 Agent 已安装在所选执行环境中,再配置它需要的模型服务与凭据;pVisor 不替 Agent 选择 provider。
-
-## 接入一个真实 Agent
-
-以已安装的 Codex 和显式交付 OpenAI Key 为例,在项目目录中运行;先在宿主环境设置 `OPENAI_API_KEY`,每次使用新的项目外 stage:
-
-```bash
-pvisor run --safe --pass-env OPENAI_API_KEY --stage ../agent-task-001 -- codex
-pvisor status --review ../agent-task-001
-pvisor inspect ../agent-task-001 -- git --no-pager diff -- src
-```
-
-`--safe` 按直接可执行文件名匹配网络预设。增加 `--overlaynet-allow` 会替换预设列表,依赖下载或其他模型服务需要连同模型 API 一起列出。HOME 状态写入在退出后丢弃,不要依赖这次运行保存登录状态。其他 Agent 的凭据与接入条件见[Agent 接入](../guides/agents/index.md)。
-
-## 决定保留、重试还是丢弃
-
-Job 停止后检查退出码、实际控制、警告和改动;非零退出也可能留下候选。`inspect` 要求有 OverlayFS 工作区,检查命令使用宿主工具,不在原 VM/容器内运行。
-
-满意时按路径 apply。想从文件状态重新尝试时,工作区 fork 要求已停止且有可重建启动策略的 host Job;VM/container 或带 Gateway 路由的 Job 不支持此路径。父子 stage 必须在同一文件系统,并在全部 apply/drop 清理暂存数据前分叉。冲突处理见[审查与应用](../guides/review-apply.md)。
-
-## 扩大任务范围前
-
-Linux host 的选择性代理仍是协作式;需要强制选择性出口时,准备已安装 Agent 的 VM。凭据交付方式见[凭据与环境变量](../guides/policies/credentials.md)。
-
-增加并发时,为每个任务准备独立 worktree 和 stage,用显式路径定位结果,逐份审查,不并发 apply 到同一目标树。[并行工作区流程](../guides/parallel-agents.md#batch)先用两个离线任务验证记录和合入,再替换成真实 Agent。
diff --git a/docs/src/zh/start/what-is-pvisor.md b/docs/src/zh/start/what-is-pvisor.md
deleted file mode 100644
index c09b61cc..00000000
--- a/docs/src/zh/start/what-is-pvisor.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# PolicyVisor 是什么
-
-**PolicyVisor(pVisor)让 Agent 全自动执行,文件改动由你决定去留。**
-
-它运行你现有的 Agent CLI、脚本或自动化命令:命令在策略边界内无人值守地跑完,文件改动先进入暂存区;结束后你像审 PR 一样查看改动和证据,只合入想留下的部分。
-
-pVisor 为不同 Agent 和执行器提供统一的文件审查、选择性合入与运行记录。自主执行的扩展路线见[为什么是 pVisor](../why/index.md);与 Docker、Agent 自带沙箱等方案的逐项对比见[对比](../why/comparisons.md)。
-
-## 你会得到什么
-
-- **放手**:不用守着批准弹窗。Agent 的文件改动先进暂存区,网络与敏感路径按策略约束。
-- **把关**:像审 PR 一样查看改动,选择合入哪些路径,其余一键丢弃。若你期间改了同一个文件,pVisor 拒绝覆盖你的修改。
-- **有据**:每次运行留下一份可核对的记录,包括实际生效的限制、被拦下的访问,以及可选的模型请求。
-
-## 三条命令
-
-```bash
-pvisor run --safe -- codex
-pvisor status --review last
-pvisor apply last --path src # 或:pvisor drop last
-```
-
-!!! tip "先跑一次不需要 API Key 的演示"
-
- [第一次运行](first-run.md)用一个"假 Agent"脚本演示完整闭环:它修改源码、删除文件、尝试读取敏感路径和访问外网,你在审查中看到改动与拦截记录,最后只合入 `src`。
-
-## 今天能做到哪一步
-
-当前工作流以本机 Job 为单位:运行 Agent,审查结果,再选择性合入文件改动。后续路线见[信任阶梯](../why/trust-ladder.md),各执行器的保护范围见[执行器边界](../security/executor-boundaries.md)。
-
-## 保证范围
-
-一次运行的边界以它的能力证据为准;`apply` 和 `drop` 只管理暂存文件,不撤销外部副作用。完整口径见[能力、证据与保证边界](../concepts/capabilities-and-evidence.md),威胁模型见[安全](../security/index.md)。
diff --git a/docs/src/zh/why/assets/agent-execution-path.svg b/docs/src/zh/why/assets/agent-execution-path.svg
deleted file mode 100644
index 3c6163c4..00000000
--- a/docs/src/zh/why/assets/agent-execution-path.svg
+++ /dev/null
@@ -1,48 +0,0 @@
-
-pVisor 如何连接 Linux 执行与宿主服务
-Agent 与工具在 guest Linux 内执行。大部分系统调用在 guest 内完成,导出文件树通过 virtio-fs 进入宿主文件服务,网络通过 virtio-net 进入受控出口。宿主另外管理有条件启用的内存共享和回收,以及原生 Job 的暂存与结果接纳。
-
-
-
-pVisor 如何连接 Linux 执行与宿主服务
-保留 Linux 程序兼容性,在文件、网络和生命周期边界组织控制与资源。
-
-
-Guest 执行环境
-宿主服务
-
-Agent CLI、shell 与开发工具
-独立用户态进程与各自的地址空间
-
-裁剪与定制的 Linux guest kernel
-系统调用、进程管理、缓存与 TCP/IP
-内部操作和缓存命中可以留在 guest
-
-系统调用
-
-OCI 用户空间与共享镜像缓存
-固定内容版本,按需提供文件
-
-
-文件服务与 OverlayCore
-权限、分层视图、私有修改与冲突基线
-
-受控网络出口
-宿主 smoltcp、访问策略与上游连接
-
-virtio-fs
-
-virtio-net
-
-虚拟化边界与 VMM
-KVM / HVF、虚拟设备和受保护的 guest RAM 访问
-
-内存生命周期
-共享相同内容,按条件压缩或显式卸载
-保留恢复来源,协调 CPU 与设备访问
-
-原生 Job 的结果接纳
-暂存文件与执行记录 → 审查
-选择性 apply 或丢弃未接纳修改
-机制依平台与配置启用;模型等待时的自动卸载与唤醒仍在研究中。
-
diff --git a/docs/src/zh/why/assets/agent-io-completion.svg b/docs/src/zh/why/assets/agent-io-completion.svg
deleted file mode 100644
index 33703e9f..00000000
--- a/docs/src/zh/why/assets/agent-io-completion.svg
+++ /dev/null
@@ -1,77 +0,0 @@
-
- 核心攻关:Agent 级 I/O completion
- pVisor 的核心架构与攻关路径,协议闭环尚未完成。时间从左向右。Guest 运行后提交请求并交接 payload;宿主接管独立 buffer 和请求。排空所有 guest RAM 与 descriptor 借用、提交恢复数据后,Guest 可安全卸载而不终止。下载、LLM 请求或批量写在宿主持有的状态上继续推进,不访问已卸载的 guest RAM。结果进入有界完成队列或暂存对象,触发唤醒;先恢复 guest RAM,再交付完成并继续同一个执行尝试。宿主缓冲和结果暂存消耗内存,必须计入净驻留收益。当前整 VM offload 仍要求先排空设备请求,此图不表示已有能力。
-
-
-
-
-
-
- 核心攻关:Agent 级 I/O completion
- 执行环境可以安全停驻;已交接给宿主的 I/O 继续推进,完成后再唤醒执行。
-
- 时间 →
-
-
-
- Guest 执行体
- 程序与 Linux 状态
- 宿主 I/O
- 独立对象与任务
-
- 运行程序
- 发起 I/O 请求
-
- 提交请求与 payload
- 交接数据所有权
-
- 恢复 guest RAM
- 交付完成,继续执行
-
- 安全卸载 · 同一 Attempt
- 执行体停驻,降低 RAM 驻留
-
-
-
- 卸载窗口:宿主 I/O 不访问 guest RAM
-
- 数据交接
-
- 接管 buffer / request
- 持有独立数据或对象
- 不保留 guest 内存借用
-
- 下载 / LLM / 批量写继续推进
- 宿主持有连接、请求与 payload
- I/O 进行时不需要 guest 执行
-
- 有界完成队列 / 结果暂存
- 保留结果或对象句柄
- 容量上限、背压和过期处理
-
-
-
- 完成 → 唤醒
-
- 安全停驻的前提
- 先停 vCPU,排空 guest RAM / descriptor 借用。
- 宿主自有 I/O 可继续;guest 完成交付等待恢复。
- 已接受 ≠ 已持久化 ≠ 已完成 ≠ guest 已接收。
- 超时或取消须核对结果;非幂等操作不能盲目重放。
-
- 内存取舍:用宿主缓冲,换整份 guest 的驻留时间
- 净收益(GiB·s) ≈ (G − H) × T
- G:实际释放的物理内存;H:新增 buffer、队列与页缓存
- T:卸载时长;实际收益按各项驻留量随时间积分。
- 同时计入复制、卸载与恢复成本,以及并发唤醒峰值。
- 核心架构示意;当前 whole-VM offload 仍先排空设备请求,尚未实现图中的宿主接管与自动唤醒闭环。
- 借鉴提交 / 完成队列的组织方式,不表示实现 Windows IOCP API,也不等于终止或重新执行 Guest。
-
diff --git a/docs/src/zh/why/assets/agent-isolation-boundaries.svg b/docs/src/zh/why/assets/agent-isolation-boundaries.svg
deleted file mode 100644
index 8bd8d0b1..00000000
--- a/docs/src/zh/why/assets/agent-isolation-boundaries.svg
+++ /dev/null
@@ -1,125 +0,0 @@
-
- 进程、容器与虚拟机:隔离发生在哪里
- 三栏示意。普通进程有各自的用户地址空间,但进入同一个宿主内核。容器额外使用 namespace 和 cgroup 隔离资源视图并限制资源,仍然共享宿主内核,不隔离内核地址空间。托管式虚拟机中的用户进程分别进入独立的 Guest kernel,再经虚拟 I/O、VMM 或 hypervisor 和宿主内核访问宿主平台。下方展示典型 I/O 边界;不表示线性性能关系或绝对安全保证。
-
-
-
-
-
-
-
- 进程、容器与虚拟机:隔离发生在哪里
- 独立的用户地址空间、共享或独立的内核实例,以及不同的数据进出路径。
-
- 用户地址空间
-
- 共享宿主内核
-
- 独立 Guest kernel
-
- 进程
- 用户空间分开,内核共享
-
- 容器
- 资源视图和配额分开,内核共享
-
- 虚拟机
- 用户空间和 Guest kernel 分别隔离
-
- 进程 A
- 独立用户地址空间
-
- 进程 B
- 独立用户地址空间
-
-
- 进程 A
- 独立用户地址空间
- namespace / cgroup
-
-
- 进程 B
- 独立用户地址空间
- namespace / cgroup
-
-
- 进程 A
- 独立用户地址空间
- 系统调用
-
-
- Guest kernel
- 独立内核地址空间
- 虚拟机 A
-
-
- 进程 B
- 独立用户地址空间
- 系统调用
-
-
- Guest kernel
- 独立内核地址空间
- 虚拟机 B
-
-
- 系统调用
-
- 共享宿主内核
- 同一个内核实例 / 内核地址空间
- 两个进程都在这里执行内核代码
-
-
- 文件 / 网络 / 设备 I/O
- 内核执行权限与资源检查
-
-
- 系统调用
-
- 共享宿主内核
- 同一个内核实例 / 内核地址空间
- namespace / cgroup 由这个内核实现
-
-
- 文件 / 网络 / 设备 I/O
- 内核执行权限、视图与配额检查
- 虚拟 I/O
-
-
-
- VMM / hypervisor 边界
-
-
- 宿主内核
-
-
- 宿主平台 · CPU / 内存 / 设备
- 内核内存没有按进程拆成独立内核
-
- 宿主平台 · CPU / 内存 / 设备
- 容器没有独立的内核地址空间
-
- 宿主平台 · CPU / 内存 / 设备
- 托管式 VM 示例;Guest kernel 各自独立
- 典型数据路径:跨越边界,需要权限检查或协议处理
-
- 进程 → 系统调用 → 宿主内核
- 权限检查、数据复制与内核工作
-
- 容器进程 → 系统调用 → 共享宿主内核
- 资源视图与资源限制仍由共享内核处理
-
- Guest → 虚拟 I/O → 宿主服务
- 设备、文件系统或网络协议处理
- 图中边界是结构示意,不是性能刻度。具体 I/O 成本取决于通路、批处理、共享内存和实现。
- 隔离效果还取决于权限、配置和漏洞;虚拟机不等于绝对安全。
-
diff --git a/docs/src/zh/why/comparisons.md b/docs/src/zh/why/comparisons.md
index 8bdb3eb1..170a7132 100644
--- a/docs/src/zh/why/comparisons.md
+++ b/docs/src/zh/why/comparisons.md
@@ -1,14 +1,48 @@
-# 与现成方案对比
+# 该不该用 pVisor?
+
+pVisor 适合一种情形:**Agent 独立运行,结束后由你审查结果。** 以下情况不需要它:
+
+- **就在眼前跑、全程盯着**:审批和纠错都发生在当下,后置审查没有意义。
+- **改动用 git 就能轻松回退**:diff 小、随时 `git checkout` 就干净,暂存和选择性合入省不了多少事。
+- **主要副作用在外部**:远程 API、数据库写入、已发出的消息,暂存管不了,回滚得靠别的手段。
+- **需要敌对的强隔离**:面对不可信多租户,要的是 VM 级隔离基座,pVisor 只是其中一种执行器。
+
+Agent 独立运行、结束后审查时,用 pVisor 暂存文件改动,核对执行记录,再选择合入的路径。
+
+## 与现成方案对比
| 方案 | 擅长 | 需另行配置或集成 | 什么时候选它 |
| --- | --- | --- | --- |
| Docker / devcontainer | 隔离环境、依赖可复现 | 改动审查、冲突拒绝覆盖、选择性合入、证据 | 只需要可复现环境 |
-| Agent 自带沙箱 | 系统沙箱、权限审批与该客户端的会话记录 | 跨客户端统一 stage/apply 与执行器能力记录需另行组织 | 优先采用客户端原生保护 |
+| Agent 自带沙箱 | 系统沙箱、权限审批与该客户端的会话记录 | 跨客户端的 stage/apply 与能力记录需要额外工具 | 优先采用客户端原生保护 |
| git worktree | 文件层并行 | 网络与凭据、执行证据 | 纯文件并行 |
| 云端沙箱(E2B、Daytona、Modal) | 远程隔离执行 | 本地工作区集成与本地审查链路 | 需要远程隔离 |
| Kubernetes / Ray | 调度与编排 | 任务执行边界、文件暂存与执行记录 | 已有编排层 |
| gVisor / Firecracker / Kata | 隔离基座 | 执行语义、审查与证据 | 需要更强隔离基座 |
-已有 worktree、patch 检查和合并流程时,可以继续使用 Docker 与 `git diff`。通过 bind mount 写入的内容需要自行恢复。pVisor 提供暂存、按路径提交、preimage 冲突检查和能力观察,运行成本见实测。
+worktree、patch 检查与合并流程可以继续和 Docker、`git diff` 一起用。通过 bind mount 写入的内容需要自行恢复。pVisor 增加暂存、按路径提交、preimage 冲突检查和能力观察,运行成本见实测。
+
+按整条任务流程比较额外成本:[端到端任务](../benchmarks/agent-tasks.md)用修复、文件工具、工作区审查和 CLI 兼容性的实测,比较 Agent 沙箱、Docker/devcontainer、VM 与云端沙箱;[强化学习训练](../benchmarks/compare-rl-infra.md)用活跃容量和回放数据,说明执行层如何影响 rollout 的环境预算。云端费用、默认双层 Agent 沙箱和端到端训练吞吐尚无同条件对照。
+
+## 常见问题
+
+**和 Agent 自带的沙箱有什么不同?**
+自带沙箱解决「能不能挡住」。pVisor 在此之上提供事后选择性合入、冲突保护和可核对的执行记录,并且跨 Agent、跨执行器保持一致语义(见上表)。
+
+**会不会拖慢 Agent?**
+pVisor 增加的是准入、文件拦截和记录的开销。启动与文件系统开销的实测见[启动延迟](../benchmarks/startup.md)与[文件系统任务](../benchmarks/filesystem.md)。
+
+**能在 CI 里跑吗?**
+可以。今天就能按 L1 方式放进流水线:让 Agent 跑完、审查、只合入想要的。策略与证据驱动的免审和集群化(L2/L3)是方向,见[在 CI 中运行 Agent](../guides/ci.md)。
+
+**支持哪些 Agent?**
+任何命令都能跑;对 Claude Code、Codex 等提供按可执行文件名匹配的预设。见[接入你的 Agent](../guides/agents/index.md)。
+
+**数据会离开本机吗?**
+pVisor 自己不收集、也不上传使用数据。Agent 调用模型 API 的流量本来就会出网:`--safe` 下只放行该 Agent 的模型 API 白名单,其余出口按策略处理。只有启用 Gateway 捕获或使用远程镜像缓存服务时,才会引入 pVisor 自己的网络行为。见[安全概览](../security/index.md)。
+
+**`last` 为什么找不到我刚跑的 Job?**
+用 `--stage PATH` 时 Job 存在暂存目录里,`last` 只在默认存储中按工作区查找。把路径或 Job ID 显式传进去即可。见[Job 与存储](../concepts/jobs.md)。
-按任务流程判断额外成本:[端到端任务](../benchmarks/agent-tasks.md)结合修复、文件工具、工作区审查和 CLI 兼容性的实测,分析 Agent 沙箱、Docker/devcontainer、VM 与云端的取舍;[强化学习训练](../benchmarks/compare-rl-infra.md)结合活跃容量和回放数据,说明执行层如何影响 rollout 的环境预算。云端费用、默认双层 Agent 沙箱及完整训练性能尚无同条件对照。
+**暂存能撤销外部副作用吗?**
+不能。暂存只覆盖文件;外部 API 调用、数据库写入、已发出的消息不会因此回滚。见[暂存与 apply 语义](../concepts/staging.md)。
diff --git a/docs/src/zh/why/faq.md b/docs/src/zh/why/faq.md
deleted file mode 100644
index f8eff38b..00000000
--- a/docs/src/zh/why/faq.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# 常见问题
-
-**和 Agent 自带的沙箱有什么不同?**
-自带沙箱解决「能不能挡住」。pVisor 在此之上提供事后选择性合入、冲突保护和可核对的执行记录,并且跨 Agent、跨执行器保持一致语义。见[对比](comparisons.md)。
-
-**会不会拖慢 Agent?**
-pVisor 增加的是准入、文件拦截和记录的开销。启动与文件系统开销的实测见[基准与对比](../benchmarks/index.md)(部分建设中)。
-
-**能在 CI 里跑吗?**
-可以。今天就能按 L1 方式在流水线里用:让 Agent 跑完、审查、只合入想要的。策略与证据驱动的免审和集群化(L2/L3)是方向,见[在 CI 中运行 Agent](../guides/ci.md)。
-
-**支持哪些 Agent?**
-任何命令都能跑;对 Claude Code、Codex 等提供按可执行文件名匹配的预设。见[接入你的 Agent](../guides/agents/index.md)。
-
-**数据会离开本机吗?**
-pVisor 自己不收集、也不上传使用数据。但 Agent 调用模型 API 的流量本来就会出网,pVisor 不会让它留在本机:`--safe` 下只放行该 Agent 的模型 API 白名单,其余出口按策略处理。只有你显式启用 Gateway 捕获或使用远程镜像缓存服务时,才会引入 pVisor 自己的网络行为。见[安全概览](../security/index.md)。
-
-**`last` 为什么找不到我刚跑的 Job?**
-用 `--stage PATH` 时 Job 存在暂存目录里,`last` 只在默认存储中按工作区查找。把路径或 Job ID 显式传进去即可。见[Job 与存储](../concepts/jobs.md)。
-
-**暂存能撤销外部副作用吗?**
-不能。暂存只覆盖文件;外部 API 调用、数据库写入、已发出的消息不会因此回滚。见[暂存与 apply 语义](../concepts/staging.md)。
diff --git a/docs/src/zh/why/index.md b/docs/src/zh/why/index.md
index 17bfd9fa..6fd118b8 100644
--- a/docs/src/zh/why/index.md
+++ b/docs/src/zh/why/index.md
@@ -1,16 +1,16 @@
# 为什么是 pVisor
-让 Agent 独立完成一个任务,需要限制它能访问的文件和网络,并在结束后核对改动与执行记录。
+想让 Agent 跑完一个任务而不用盯着每条命令,就用 pVisor。它限制 Agent 能碰什么,把文件改动留到你决定合入时再落地,并记录实际执行了什么。出错的影响有边界,失败的尝试可以直接丢弃,结果可以事后再核对。
## 减少执行过程中的人工介入
-Agent 能跑多久,取决于你愿意盯多久。逐条批准每个命令,人的注意力就是上限;开全自动,则要接受它可能改坏文件、读到不该读的东西、把请求发到不该发的地方。
+Agent 能跑多久,取决于你愿意盯多久。逐条批准命令,注意力就是上限;开全自动,就要接受它可能改坏文件、读到不该读的东西,或把请求发到不该发的主机。
-任务越多,逐条批准命令所需的注意力也越多。执行边界和事后审查可以减少运行过程中的人工介入。
+逐条批准的成本随步骤增长,审查的成本随结果增长。把审查后置,结果就能抽样、批量、交给机器比对;只要记录完整,就能在事后一次核对,而不必在执行当中拦截。
## 把监督和执行量解耦
-要放手,每次执行需要同时具备三件事:
+放手执行需要同时具备三个性质:
| 性质 | 含义 | 对你的意义 |
| --- | --- | --- |
@@ -18,9 +18,9 @@ Agent 能跑多久,取决于你愿意盯多久。逐条批准每个命令,
| 可逆 | 改动应用前可选择性合入、丢弃或分叉 | 失败成本低,敢放手 |
| 可查 | 执行留下可核对的记录 | 审查能抽样,甚至交给机器 |
-pVisor 就是让每次执行具备这三件事的执行层。
+三个性质各有对应的机制:运行时安装访问边界([文件与网络策略](../guides/policies/files.md)),文件改动暂存到独立 upper、由你决定合入([暂存与 apply](../concepts/staging.md)),每个 Job 写入身份、事件与结果记录([能力、证据与保证边界](../concepts/capabilities-and-evidence.md))。
-规模化还要控制环境准备、工具运行、模型等待和失败重做的成本。[Agent 任务的生命周期成本](agent-lifecycle-cost.md)从这些支出出发,解释 pVisor 的执行路径、隔离方案选择,以及让宿主接管 I/O、guest 在等待期间卸载的核心洞察与攻关点。
+规模化之后,环境准备、工具运行、模型等待和失败重做也会进入账单。[Agent 任务的生命周期成本](../design/research/agent-lifecycle-cost.md)按这些支出解释 pVisor 的执行路径与隔离选择,包括让宿主接管 I/O、guest 在等待期间卸载的那部分。
## 执行层的职责
@@ -28,11 +28,23 @@ pVisor 是**每次执行的语义层**:定义边界、落实控制、留下证
执行器通过宿主 namespace/Seatbelt、容器或 VM 提供隔离。pVisor 负责执行策略、生命周期与记录;Kubernetes、Ray 等外部系统负责跨节点编排。
-## 今天,以及之后
+## 今天,以及之后 {#trust-ladder}
-今天 pVisor 在本机逐个 Job 运行:放手跑完一个任务,事后像审 PR 一样只合入想要的改动。这是 L1,已经具备通往更高自主级别的三种性质。
+按人介入的时机和程度,自主执行分成四级:
-四级的分工、pVisor 的取舍,以及 L2/L3 的状态见[信任阶梯与规模轴](trust-ladder.md);不同规模下的用法见[用例](use-cases.md)。
+| 级别 | 人怎么介入(信任轴) | 承载(规模轴) | 现状 |
+| --- | --- | --- | --- |
+| L0 | 执行前逐条批准命令 | 单个交互会话 | Agent 普遍自带,并开始有模型辅助审批 |
+| L1 | 执行后逐个审查改动 | 本机逐个 Job | **pVisor 今天** |
+| L2 | 策略与证据决定免审,人只抽查 | 本机多个 Job/一条流水线 | 下一步 |
+| L3 | 事后审计,人只处理例外 | 集群化:跨节点调度、集中证据 | pVisor 的规模目标 |
+
+pVisor 今天做的是 L1:运行时落实访问边界,暂存文件改动,结束后核对记录与结果。个别操作需要人判断时,用 `--ask` 审批通道。[单机 daemon](../guides/daemon/index.md) 管理本机沙箱生命周期,使用独立于原生 Job 审查流程的 API;跨节点调度归 Kubernetes、Ray 等系统,pVisor 在其中提供执行语义与可查记录。
+
+- **一个人一个 Agent**:全自动重构,合入前审查改动,今天可用。
+- **一个人多个 Agent**:并行运行、批量审查,下一步([并行 Agent](../guides/parallel-agents.md))。
+- **团队与平台**:在 CI 里用 L1 方式,今天可用([在 CI 中运行](../guides/ci.md))。
+- **Agentic RL 与评测**:可记录、可分叉、可回放的批量基座,方向([RL rollout](../guides/rl-rollouts.md)、[研究方向](../design/research/index.md))。
!!! note "建设中"
- 「每单位 Agent 工作所需人工监督成本」还没有实测数据;需求与验收标准见[监督成本](../benchmarks/supervision-cost.md)。
+ 「每单位 Agent 工作的人工监督成本」还没有实测数据,需求与验收标准见[监督成本](../benchmarks/supervision-cost.md)。L2/L3 的进入条件尚未定稿:进度见[路线图](../community/roadmap.md),容量依据见[并发密度](../benchmarks/density.md)。
diff --git a/docs/src/zh/why/trust-ladder.md b/docs/src/zh/why/trust-ladder.md
deleted file mode 100644
index bc8690a9..00000000
--- a/docs/src/zh/why/trust-ladder.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# 信任阶梯与规模轴
-
-自主执行可以从两条轴观察:**人怎么介入**(信任轴)和**由什么承载**(规模轴)。
-
-## 事后审查
-
-**执行期间落实访问边界,结束后集中审查改动与记录。**
-
-执行期间,文件与网络策略限制任务的访问范围,暂存区保留待审查改动。执行结束后,把过程记录和结果放在一起审查,减少逐条批准命令的需要。
-
-## 批量审查的方式
-
-过程审查不随规模摊薄。每多一步就多一次判断,人得全程在场——Agent 能跑多快,取决于你盯得多紧,这就是当下的天花板。
-
-后置审查可以摊薄。结果能抽样、能批量、能交给机器比对;过程证据只要被完整记录,也可以事后一次性核对,不必在执行当中拦截。
-
-## 四级只是参照,取舍在最后一级
-
-四级描述人介入执行的时机和程度。L0 在执行前逐条批准;L1 到 L3 以后置审查为主,逐步引入策略与证据驱动的免审判定。下表列出各级对应的使用场景。
-
-| 级别 | 人怎么介入(信任轴) | 承载(规模轴) | 现状 |
-| --- | --- | --- | --- |
-| L0 | 执行前逐条批准命令 | 单个交互会话 | Agent 普遍自带,并开始有模型辅助审批 |
-| L1 | 执行后逐个审查改动 | 本机逐个 Job | **pVisor 今天** |
-| L2 | 策略与证据决定免审,人只抽查 | 本机多个 Job/一条流水线 | 下一步 |
-| L3 | 事后审计,人只处理例外 | 集群化:跨节点调度、集中证据 | pVisor 的规模目标 |
-
-pVisor 主要支持事后审查:运行时落实访问边界,文件改动暂存,结束后核对记录与结果。需要逐条批准操作时,可以使用 `--ask` 运行时审批通道。
-
-## 同时审查过程与结果
-
-执行记录保留已观察到的文件访问、拒绝事件与网络活动。任务结束后,可以结合记录与文件改动审查过程和结果。
-
-## 今天到哪一步
-
-今天交付的是这一级在单机上的形态:本机逐个 Job,放手跑完,事后审查改动和证据,只合入想要的。L2 的免审判定和 L3 的集群规模都还没到。
-
-[单机 daemon](../guides/daemon/index.md) 管理本机沙箱生命周期,使用独立于原生 Job 审查流程的 API。跨节点调度由 Kubernetes、Ray 等外部系统负责;pVisor 在这些系统中提供执行语义与可检查记录。
-
-!!! note "建设中"
- L2/L3 的进入条件和缺口清单还没定稿。进度见[路线图](../community/roadmap.md),容量依据见[并发密度](../benchmarks/density.md),集群方向见[集群化执行](../design/research/cluster-execution.md)。
diff --git a/docs/src/zh/why/use-cases.md b/docs/src/zh/why/use-cases.md
deleted file mode 100644
index 69030a29..00000000
--- a/docs/src/zh/why/use-cases.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# 用例
-
-同一个 pVisor,在不同规模下解决不同的问题。
-
-## 一个人,一个 Agent
-
-让 Claude Code 或 Codex 全自动完成一次重构:它改文件、跑测试,可能顺手删掉点东西。你不盯着,跑完像审 PR 一样看改动,只合入想要的路径。**今天可用。**
-
-```bash
-pvisor run --safe -- claude
-pvisor status --review last
-pvisor apply last --path src
-```
-
-## 一个人,多个 Agent
-
-同时开几个 Agent 做不同方案。每个 Job 各自隔离、各自留证据,可以批量审查,只合入需要的结果。**下一步(L2)**,见[并行 Agent](../guides/parallel-agents.md)。
-
-## 团队与平台
-
-把 pVisor 放进 CI:让 Agent 跑完、审查、只合入想要的。**今天可用(L1 方式)**;策略与证据驱动的免审和集群化(L2/L3)是方向,见[在 CI 中运行 Agent](../guides/ci.md)。
-
-## 研究与训练
-
-Agentic RL 和评测要的正是「大规模、不可信、可记录」的执行基座:轨迹可记录、可从检查点分叉、可按工具前缀回放。**方向**,见 [RL rollout](../guides/rl-rollouts.md) 与[研究方向](../design/research/index.md)。
diff --git a/docs/src/zh/why/when-not-to-use.md b/docs/src/zh/why/when-not-to-use.md
deleted file mode 100644
index e61fa083..00000000
--- a/docs/src/zh/why/when-not-to-use.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# 什么时候不需要 pVisor
-
-判断标准只有一条:**你本来就会全程盯着这次执行。**
-
-- **就在眼前跑、全程盯着**:审批和纠错都发生在当下,后置审查没有意义。
-- **改动用 git 就能轻松回退**:diff 小、随时 `git checkout` 就干净,暂存和选择性合入省不了多少事。
-- **主要副作用在外部**:远程 API、数据库写入、已发出的消息,暂存管不了,回滚得靠别的手段。
-- **需要敌对的强隔离**:面对不可信多租户,要的是 VM 级隔离基座,pVisor 只是其中一个执行器选项。
-
-需要 **Agent 独立运行、结束后审查** 时,可以使用 pVisor 暂存文件改动,核对执行记录,再选择合入的路径。
-
-与其他方案的取舍见[对比](comparisons.md)。
diff --git a/docs/translations.json b/docs/translations.json
index c40d1431..0d97e260 100644
--- a/docs/translations.json
+++ b/docs/translations.json
@@ -1,163 +1,125 @@
{
- "benchmarks/agent-tasks.md": "ff19052c27eb1280ac38f2cdf8705e0073d37ac46923559f2d3424bf7f9d30c1",
- "benchmarks/cluster-scalability.md": "cec76270ab76ee36d09d1a6bf043b75a10b22c0c9a1f481c69a8978f3b572c73",
- "benchmarks/compare-rl-infra.md": "4f0acccc66a2440f07e7d06f4eba79e851d5af635189c8fbdd053311508f4bc5",
- "benchmarks/density.md": "93ef2561b55a31eee713426a7810eec005d0c4e1ede580a1a93f8db476b6a7ae",
- "benchmarks/filesystem.md": "16587601a10e8c522ef66fc344b25d956f52bc62b474d839bbca0091062a7796",
- "benchmarks/index.md": "691235323f234eafda0a7a83201e838a412442d4f81e8a06aa590c71ab229930",
- "benchmarks/isolation-tests.md": "f52096b12096d8430010e95b88de31b43415105627a451f50f67039d37462b49",
- "benchmarks/lazy-image-startup.md": "c218894a0405dd42cfc7a275ed9ce19ca9e11ba469626b234cd7bca9449f1754",
- "benchmarks/methodology.md": "eb603007412dccb7f3e9d3901ae4c4dc7e3eeca69840786736e9c110a2fdf8a2",
- "benchmarks/network.md": "48699231f260416507876084fdb0601b1164771512be58db55f2ec4d35ead977",
- "benchmarks/replay-fidelity.md": "19cceea8c3d895bcf3fc49260e3928d190927ecbd6ca209345e511f2ebf61e76",
- "benchmarks/startup.md": "6ef5e212f1acac216286134de34a1c2d2250eb7a0d33b0988e1d69c94ab880c3",
- "benchmarks/supervision-cost.md": "5b783d1a5b6f299817ab5aae376f8d385d0f24ae8fd346ca6d01d15f21213a41",
- "benchmarks/vm-memory/index.md": "c8f315b0a09e79c144822d1b528cbd6104ecf6765cc3186abdfa11e89ea2cf5d",
+ "benchmarks/agent-tasks.md": "7c1e65dae9a3d3bf771a321625051164410718c31cfa451d28ae6af2f3240077",
+ "benchmarks/compare-rl-infra.md": "804f6ea2f139f9923d6402f867638b1175096b5879bab949792ff015e8eff616",
+ "benchmarks/density.md": "d95d40bed742ee9c50620eb2c85d3ca96f29b6d3a9cd73def60376a721aa441d",
+ "benchmarks/filesystem.md": "5948079def394a2b317107bf8ab8b281c7d8b714cde7a0443873ffeb6a92c1b8",
+ "benchmarks/index.md": "23552565b189d0b2cafb15c4247e1be72b74bc5fe0234a8432e848f85fc0c98e",
+ "benchmarks/isolation-tests.md": "71588699652a0574c3f5b55ccc1f342558b2fc9081eba50d14c46913532eefd9",
+ "benchmarks/lazy-image-startup.md": "7169a1e14031ba0e8ffd1c767d0182686cdbdb0de0e76319d133af809caead2e",
+ "benchmarks/network.md": "5d88f9c3c628179d70d077c9a3f1a4e96cadff770c6ef510f6741004e956b137",
+ "benchmarks/replay-fidelity.md": "40261abf55775352c3a7c75f9654dab22f3f078713b4531a83b1307e3406f216",
+ "benchmarks/startup.md": "fb52a364a9cc753f4fe55b32f1f4153c0668afc5fdfbae93b056a5a135c4b897",
+ "benchmarks/supervision-cost.md": "9e6871ab0dd2dc2b8c70be38f67a4751c3687441f9bc0e859361d885a918ff73",
+ "benchmarks/vm-memory/index.md": "c5d3bbddd25f551768ec92fb7647905cfebb352c1369b5a80c2e8662c236f817",
"cases/01-first-job.md": "706bb522c10a4bc17324a69b0ef025f53362b7450ad4dfc6be02865be3305c70",
"cases/02-review-and-decide.md": "4cac11c747cfb43841f28e8daa0a71d13653f823d4718d6501842580af94b204",
"cases/03-checkpoint-and-fork.md": "49281a3745d63381b47e0a9f9903536a1733b59df67bc58f9db53cf97d6a7b5a",
"cases/04-boundaries.md": "dd78bac75281332821d35c741a7485bba30b0d6bf58c46736ab4aa322d877603",
"cases/05-tools-and-restoration.md": "fb3e68d984b20e7cc04ca3f92af6ccb37a576a5efcc126285aca00fcc396eb52",
"cases/06-stage-apply.md": "ea6f1970d3a7efde8b4cdb2ceff7a6b01a432dc04f25a380129086d4125b43f3",
- "cases/index.md": "c197ab0480d8ee14cc98cb14796ad1ea693f4b21ef8cae1d735f140462bc1724",
- "community/adopters.md": "a973b56bc76569948e0c1a1df7dac655a4f850b199d5abaa99a5565f276b8e90",
+ "cases/index.md": "ef9f164be9c9ca6936e3978272a9af04e37ace11aa631be56fee2a4a1ef2ae74",
"community/changelog.md": "d4da478014ca06299b209b50ca4411cb0adbd7a37fe4f343d906046747dc42a1",
- "community/code-of-conduct.md": "b799b1f9220debb9b494d0816c8570be480bb467b538329b5d0f47ae34c684a5",
"community/contributing.md": "6c32548634db8f21a446c5b0d1e6ce55b9a46cc3b3152418cb0e0c74e42a7681",
"community/development.md": "936ca8dfb3a23742dda9bc6856d852c4ea599056306004ef2c9871e0610b0db5",
"community/examples.md": "bd568ca71f26a54952b5bbc8a1a54e8d7f28fdab4ebb84c1a577c0b2c5fed1a7",
- "community/governance.md": "a78a87ffbea85f08eda2ffe312b424110e82bfc28becf7ee30a711529f23bc4b",
- "community/index.md": "acf435ba206179073e251010aef65004ef62360fe54ae50e01d6d14e5911cf92",
+ "community/governance.md": "ccf42470c2ecacdafaa878114bb2d387a4f5b2fb300d3a26cce346e56b2f6f63",
+ "community/index.md": "e7bd392882cfb197fe143ce4890ef30f448c3a59f67a2477703fadf405ed6168",
"community/releasing.md": "6b8e6ae96a0fa3992996e7cca006f0a421075481238173288e4aa7d25a736d80",
- "community/roadmap.md": "b5de98f038cf0f249958705b5af278868c9a85141d9ff303a8df0d785e3b0572",
+ "community/roadmap.md": "7207feb3dc2f1b1a511b48148d4792c28c423dbaa4236e06222440e9af3fd373",
"community/testing.md": "d37f0d56c81044733d93bd677b58d9f9599c7c92bb6cf08ddf7985d698158f72",
- "concepts/capabilities-and-evidence.md": "a5c68cee433d7e85b3521a7498055db5320b2bf2bd589423d8737f9bc4c2da7e",
- "concepts/glossary.md": "2b7166983236b3a8f8dff32123bd4d2e1926a943185be4c6bc00e6fdfa4714d8",
- "concepts/index.md": "fb5e4e80a0aa76beb72e60b325f24a3ed1f2bdb0e16814e5808f044180d7022e",
- "concepts/jobs.md": "66c6b0c5569797ba48f598b15bea6bf06b67658de213973572c1dbfa219d3e52",
- "concepts/policy-model.md": "fe743afe6c37168c8e0121372ba87587fa0bcdaf7316bf8a1ab4f74ceb53c4ae",
- "concepts/staging.md": "3aedae3651abd9954e09177cbdf1324ef96c50160b1ed2129ee59f53c0708828",
- "design/agent-task-performance-analysis.md": "1a3ec8877aacdcc075930cbbad5fd3aaef57b7631c8227918c6b4ca642e487ba",
- "design/architecture.md": "4b623be3417f78d55bb859cb1b3cbd2939dd8971f83baa3e33ea1111f5239c43",
- "design/benchmark-methodology-evidence.md": "e49a897cd5b9ea182442b8a7fcbdd5a628b3684558ef84f68fcb8a7a7267c6fb",
- "design/cli.md": "5ab3a1512876c93992663169508c2b8e4747a3512fcc6c850ad6d0db92a75ea2",
- "design/cluster-benchmark-plan.md": "63598782df5bf4801d05e857154bb1cdf37c76a2c432a4d8065f7576d9a9c163",
- "design/cluster-performance-analysis.md": "7a0543692b828b80e0699c8dd4c885fd01f49dd3b2e5e75e386796bbc4200679",
- "design/daemon/admission.md": "b62bc68364a9b0ce22bcd030f0ea6e8ae8be43cdc33497099b2de5179e5c0576",
- "design/daemon/index.md": "984512075946632d842251698f6728dd30fb1fa20f7442ec10b53648a6a52e88",
- "design/daemon/lifecycle.md": "30e3199dd3a686a0dc41077c047129a5b649ff199215f785a0a7a9a30522335a",
- "design/daemon/operations.md": "c06530d636c1d764c14bc4d0251bd1503e0a8cb17df55897ba96e46b51012d3a",
- "design/daemon/responsibility-convergence.md": "75fe1b1729c8ba134132be612d97543af55e7c27a1e89b95491bfc93316b1fb6",
- "design/daemon/shared-working-set.md": "078b215a876a8f53a423882d632586f0255b69901eea4bcb9ea29ebda91a3a61",
- "design/daemon/state-and-recovery.md": "cabab71b36fa6ba975890a5b6532663613598fc5fc5a0c8c5cdf3d12744c5903",
- "design/daemon/storage.md": "1c59578ae024863f1a27152d7fe00788048a2c9cac6a70150ed3a54569190079",
- "design/decisions/0001-plan-and-evidence.md": "d81088963d50d8d7af69b6c9cbbaf0f5ea883d7fd2059d87f5269b60cd0b750a",
- "design/decisions/0002-capture-and-replay.md": "a5f62f69b30ecbca0618589d40b609df7c1a647f8a32a41dd4a6f27e81370986",
- "design/decisions/0003-explicit-safe-executor.md": "9df0c1c628b3902c19b520ece28b36f8b2579100015fb54279bc1d06af7ea069",
- "design/decisions/0004-human-semspec-approval.md": "5529e70819526a355fed9f974ad971f8529627ca8b92d1d4ca52eab99a5b6b2b",
- "design/decisions/0005-rust-vm-api.md": "e281a4528a8348f7b4501638a17cb79e131f9e8c6d07f4083d03c8b2b74793eb",
- "design/decisions/0006-stage-snapshot.md": "f57005125429c2060411d11efb29d2da1b631ab9cf3794797e7b1b8a588ab428",
- "design/decisions/0007-shared-filesystem-service.md": "4744640cf6547da7079c129b33c73aa696a3475667728a1f17be819d5880761a",
- "design/decisions/0008-host-guest-control-authority.md": "b6ea1f06ce0e75086a155bc35f87e90945c229e439c13de000a72abf62945d30",
- "design/decisions/index.md": "a5235ec70a55b84c37035a5cae4004bbffdd3b191fcda14cca7a7987050a112c",
- "design/environment-snapshot.md": "3172b7848f558b06fc2e35c097a41f7fea6dd4c2c14587b2bb7a3233024a9666",
+ "concepts/capabilities-and-evidence.md": "cc92c913753741bf0c05fc683538931d57b8856c686ba18303344bc4659add1b",
+ "concepts/jobs.md": "c26ae9df95389fecc084e280fad3e0a0da8863cf47687dcdff2f38e5bce06f30",
+ "concepts/staging.md": "612fd1d986e750f8f454907d7ae64c117c78b935333aad0cbb2b8212348dcb5d",
+ "design/architecture.md": "d49ab5aae18ff2d0fed68c97ee7eaf6ce2b99d696cb5cfca4f07fe458ef47606",
+ "design/cli.md": "c116a694955929243437be2eaa4087197a597de0d982b9386c9331fad08fcead",
+ "design/daemon/index.md": "d1b847b7c7a8d42ad33bee3f84c5ba2ed791c9d4d6ff89e924220ef1b726cd41",
+ "design/daemon/operations.md": "d8bc77fe6b2a86f59736bcf9fdf7734fa3bca3142d8de6a35a4d19f1caa4e7ab",
+ "design/daemon/shared-working-set.md": "f0558b3b9356fb32613e48ab85dd2dbb884a28f60caaf193309da404a41148b0",
+ "design/daemon/storage.md": "97d6aefb088a61a651ba3b3405351c0ad7602d5d7156858dde4c58a2f96d29cd",
+ "design/decisions/0006-stage-snapshot.md": "88c1e7300b4a9a7613a7f8a9cab8e77641318e4746744664e71fb1e25557a89a",
+ "design/decisions/index.md": "3607f935cccd973b444457dffd55dd8dfbc0821348ece186ecb6128fb42f3437",
+ "design/environment-snapshot.md": "71319cc2e84d988c1d4e9fb4234e518e71988c7d09466d723f930bac8de220d2",
"design/execution-model.md": "8182aecd82ab87fc16dadd02f1849fed9202f5bdf2dc6269d7c24e87a845b577",
- "design/experimental/agent-io-completion/index.md": "e4d58f985a1cc6fbfd514890c70b95a87ba7e53167b850f35ab0eb3133f2c950",
- "design/experimental/guest-stage-cache/index.md": "7bd617207e58e2f7bb8a140e3b4a1162db1a511b921defcd25538eee5867f69c",
- "design/experimental/index.md": "21d3b6c33527bde8f1ea0cb9c8056fc8a58d8aa4e3c3eedddb2623f6bfb55c5d",
- "design/experimental/vcpu-idle-offload/index.md": "30249391d0d37b438847f670bd9c6eb589b754d72b86b3a9f319d0ca0a79ac93",
+ "design/experimental/agent-io-completion/index.md": "79af2d5948c53ff5268bff9dfe6167dfed3c0e08104b6fe109b493109f8c97ab",
+ "design/experimental/guest-stage-cache/index.md": "12c2e01a3951f11f59de043ebb2014c70cd239592d700c80fb781a4e9ed23dbd",
+ "design/experimental/index.md": "3c96505cc780a058631a0a0330cf659445f269dffb56e1d877abdc729e02a25a",
+ "design/experimental/vcpu-idle-offload/index.md": "7d8672ae06dc1da256820efd5228e08717648ba77536aef74a1418ffbf847092",
"design/failure-semantics.md": "91bad87a97df5d87efc6c11e8cfda22ee3946fb12e09186f028c6bb1d1a26822",
- "design/filesystem-io-performance-analysis.md": "15bdbda924134b93e2019fc84197e16145b3817fd48bcb23ee3f6bba8ed04b15",
- "design/filesystem-performance-analysis.md": "d30ff6f4056a6f3b87836a469799436c9ddc898a67159750f7edd5591979e11e",
- "design/gateway.md": "bb0c97fd0e0fb14820a34db539ebb2875b0095bf189764d690b20d1898b5a889",
- "design/index.md": "719eb926a3993f0aa726bd99ddbba7b6dfe179c809b95354090fb41cb55adbae",
+ "design/gateway.md": "37b9100ced3043f6ebc20e0cb3b469404d207b4a0611fd700b990659918d526f",
+ "design/index.md": "7f0e7c56fb0f4c6719c5b22ca17cdcf05440646a6b783af6d54823fd5003a788",
"design/isolation.md": "8f47ebb7db484a5e8cc4d6bc2d99caac2ca039c437fc704bb7221f9c9321b957",
- "design/job-checkpoint-cli.md": "c304d251091c546c5f752b7279213ff2250c68b538e71d63cff387e386c7e04d",
- "design/journal.md": "7b3607cf18b9e5752bd5cd5e76eaa97718682bcca88129d423fa6bdaaa6c9a28",
- "design/lazy-image-v2.md": "09b5dc2fd455099cd2b03eaae03323b3a903a36ab5b2292e4ea6af9ce9cb9edd",
- "design/memory-optimization/compression-local.md": "cd0d06977887405ba4e28f7dc98f9f2c38eaac313468938aa838e7499fdaa872",
- "design/memory-optimization/compression-pool.md": "9c329856f51fa8f223349d2dbc479dc39555e2ccd92d95155ccec2628a3af336",
- "design/memory-optimization/compression.md": "11765e3d2d22bd99f605f6a626f4dd4452125453caf2de6c9f62fca29434fb00",
- "design/memory-optimization/deduplication.md": "1610cf2751f274cbfcd74a2ab93d79a40d28695459c00e0cd6f489f3b3aad256",
- "design/memory-optimization/index.md": "bec6e20fe9319eb17dfa4d399daea4956499984614ced09ddf5768c1d84b3696",
- "design/memory-optimization/offload-format.md": "0d38e542f366a0d0778374080debe48d7fb050c23919b254383111936fe32683",
- "design/memory-optimization/offload.md": "b14de518bee487177b4bf78af20ede630de76086274ef5f74d15df9a7f4b9487",
- "design/memory-optimization/proof-of-concept.md": "d1af800ec7f4f9962ec0817d50f281d9166abc75ee7e2bdc85590a8c499d29b6",
+ "design/job-checkpoint-cli.md": "fa3dd9f1337b059dceb109044556f5d464de3df669c7a0ad43f4c76fd249dd4b",
+ "design/journal.md": "65ff91aa5fada4e30248d5bf1ceba5fd42c1524ba3673c60e2811b754bcecd48",
+ "design/lazy-image-v2.md": "7e527a08ac32df05237a76ec357638f2557c8329f513d4ecb0dfbccf88683fc6",
+ "design/memory-optimization/compression-local.md": "603f84c5d1fed07c8b403988886b8906cda026427e42745a5cb0af46b3aeb2c4",
+ "design/memory-optimization/compression-pool.md": "a7c32b51fb4afc274ef229e0af45a86c358ff538ec96d69029726664fadff029",
+ "design/memory-optimization/deduplication.md": "6fb6074e672b966bff2a67be36e7539cf7bf2bc33e1fb77383577b4280e16398",
+ "design/memory-optimization/index.md": "18a1e0a5ce56765335e9d2e865e1d25bd3a3a795669ae0262c3314fbabf3580d",
+ "design/memory-optimization/offload.md": "ca3079b75915c1c4089ccb9c441901aa75cd2e16b4c75e2b04752525a9cde182",
+ "design/memory-optimization/proof-of-concept.md": "2b235140cd560f0967c75bbf4e813e1136eb7a5e4683bb0818e6dc7d68992e07",
"design/offload/disk-layout-and-schema.md": "70f669ea90869d36f9362b69535168062e3f8bcd5953cca132330c3b4c457b1b",
- "design/offload/index.md": "095c8fb7a0a0a6569ec5ac00c06498c21231cf1e552052c776054229a28112ee",
+ "design/offload/index.md": "8fa82f4423a2cfb7c59da7bdee8c0df1dfc35672f1bfcd3f60ba8fa5bc1b4ed0",
"design/operations-events.md": "d2c4a6acddb4b8875e56b2f14a0bf9a3b97d9026768104a74199fafdb88d015b",
- "design/overlayfs.md": "574e40bcd074233fdf9207c5fd410de27d0c8b3daee320f0814919d407987459",
- "design/overlaynet.md": "7afa82c9dc3dc890c02af3231f8babd49902b203ba6f4b651c9a5aca953af020",
+ "design/overlayfs.md": "5c4119092cf421deff8873da8ff65b08bb6974a93d5f21ada3117264ede11653",
+ "design/overlaynet.md": "c87bcd322d4cf99ff1ab882c94bc3a9746c563f258dc5d087317402454f8e5cd",
"design/principles.md": "af5bf7de57bdf26b41fad889037af0b21f4dbdc23a526b18c5f8408147bc977f",
- "design/records-and-versions.md": "ec32165148d1d45dd8187a8a3d1c04d8c5922e6a5b96f5f37109d5326b95945c",
- "design/replay.md": "a48ac8f141da257b009c006e3d0b062f1915d6dbd71e8d13bd6f9a8e7b4ae8e3",
- "design/research/cluster-execution.md": "7e5f9bdc3aa596f7c19748121020ff79eb9f23e5e4cfaece7e621f3e245f4c5f",
- "design/research/design-documents.md": "d94d72b0130bd65df1bee3413945d73f7c0c27571083cb537b5e2caa45831055",
- "design/research/index.md": "cde1295875c7e94483ea958d9dc095da5dcc9a018d83fe0f0f1a4ccc070cd423",
- "design/research/publications.md": "ad6abda0e1a37ec74af08c0b5a7817a7ac790eecb280c9438df2412da1a623b9",
- "design/research/rl-execution-substrate.md": "ac14f6bd053ccdb9c09d685f9aab5aae890bba1ccf341867cdc218c85aad5fcd",
+ "design/records-and-versions.md": "24fa6d70c9e1e9e54d3601cf92793139724bc7ccba1eedbf628f6db43df1fec9",
+ "design/replay.md": "18fb2332f8506bcda5fcf3d2fc5c32ba921e63c7b91e0d69cd343320919d2567",
+ "design/research/agent-lifecycle-cost.md": "5333b8515b5a00ca33d1e98a5d1f295711b23ad3f42855a4e31ac1695324ebef",
+ "design/research/index.md": "02039b7633d50c06f717bf92326e1cc72601fce998abe69282d2cd8f92e0902b",
"design/shared-image-cache-storage.md": "792957de74a27a61d5b37f5e3f845ef40573515187c45d79a168eee689424175",
- "design/vm-memory-performance-analysis.md": "09e7ecf2e8548d4beb2620725a70000fc7b0887c3728db02b6729e14f4061498",
"design/vm-runtime.md": "a1e921cbeef5062b84a0f5eb0f8a3774139425e15f438c8e8641253e5bd72e57",
- "design/vm-startup-performance-analysis.md": "ac7595fac1acfd19e0566404ec233cb991036692f13fe2117630712287fc61dc",
- "guides/agents/aider.md": "66d85777bbf9e54330d96e1654d9d4b111e6d3115a5e8910f9dc98144d1b9019",
"guides/agents/claude-code.md": "fef3dcb668ea039347418423eeb1cfe79b3ebf8c7e96e3db0a865b5e0b2934b7",
"guides/agents/codex.md": "3bf9e8c7fd6dba4b5cb216f5a8e5cbc394f6647f12d14e41aa13ecdfd52e57ac",
"guides/agents/custom-scripts.md": "51756b694c80d631bd630f7d0967b8aa039677f189568c50d59d776e909ca2fa",
- "guides/agents/gemini-cli.md": "8047a074252db02f3e2977e0d2d947d5d423fd8dc12c8507cd5cc8ac2fd78905",
- "guides/agents/index.md": "b185b7c7c073237662ea328ead1fdecc7880cbfb7bb839eca7ea971acdeb6063",
- "guides/agents/opencode.md": "220aa895a81149bc8bcf83ed45718595fdc5e703697304fb6dfaad5ab228f9b0",
+ "guides/agents/index.md": "1360fc0980ebc2471f768677440d2e575e132186d727b35e8fc71ecd2b5a226a",
"guides/capture.md": "92e601a6b2d60502691fbbb48603f93bf22ae78df9199065eccbd3b6c94ee34c",
"guides/ci.md": "26bd10f39aafb9a9f8eabd459ee84a0f7423d6f2fff2d13ab84ef554227fb952",
- "guides/daemon/boundaries.md": "c706060c5d9cd81bb0bf1e3680cff9288286874d8363238a3405425eb0edcf8c",
- "guides/daemon/index.md": "f46fd6d648f72716fea689fa3e10d4de41af511d92d5d1108d0b422c8d20e9b7",
- "guides/daemon/operations.md": "79cb589814784e29b442e6e79cf216785741d58423aee4b807c2f582a2c6845f",
- "guides/daemon/service.md": "c789bddeb474258491f7475da12abaf3ec2b0c9678d7da1bd6435c7d624e1743",
+ "guides/daemon/index.md": "e6850cf2ac86864b58c9d2cff734220795c15edccdc0672bfe5505537c1201c7",
"guides/executors/container.md": "9e2f07d31ba4300d2aa82931d7fba93818cde87b1dca3f09549ca1528b70f3a1",
"guides/executors/host.md": "39c79cd61451bf95971a581103dac22686cbce5aedb599056220e5c718a9593c",
"guides/executors/index.md": "6dccca6d0ebc4a000cfe8f0a65eac4f451df16552195fb56b9cf677e649f075c",
"guides/executors/vm.md": "09376c3b7754a6fc9de4d44519b53c964ad6be02802fc0c840b98cba4eaad2e3",
"guides/fork-checkpoint.md": "4098f19475e3a2bfaa192975fc6dcd4859d64dafa427d706df652479dfc42746",
- "guides/index.md": "f9b96831139d7fe8db988af78ecca9347ae2ec0c54d8e71ec74356ad1b2848ca",
- "guides/parallel-agents.md": "0d783b3587c9fea859159ebd9a8bec34d08754c8a4294de1ca36e6ce28cf3ff5",
+ "guides/index.md": "91fa8133ac6a9b103bd55793161fe785f5a22c2ca6961119b23a6bdda73ae6b4",
+ "guides/parallel-agents.md": "8b883e6e3046b990db33cbdab8d1acc4eea82fc1c24ded6ff6483ebdf792d5b2",
"guides/policies/credentials.md": "7ece2ae469736462672a58cb6b403c5a25a6ef0f1b0456754a36c7cbd5b7642f",
- "guides/policies/files.md": "cd7783ed8e0b9cfa658387979b9752db8bc8f9f4df776df641c202cb0e358c35",
- "guides/policies/network.md": "d6fbb41a9c5f4212ff022a153c93c10cd34e48192658b6c1228d582eec0cf9d8",
- "guides/replay.md": "99b6e0c562d58ab10c97344310fa4fbc12390427947d5c4df201e6e39fb74657",
- "guides/review-apply.md": "79c0a8e75225809aaa80fba3cc67776784c3aa1cb2a880825693de26fa2ccb25",
+ "guides/policies/files.md": "4f7fd73c9895797bd9d29883fa9626b12cff79861afa661ba3f1e80f8d237eb9",
+ "guides/policies/network.md": "9bf64a2ad21c221c93ce8b6f6bb48f9f88e8fc054da37c47dd01a6cb0e091f37",
+ "guides/replay.md": "271297eabacd8fdd2fd75cc1307391d379fbc449ceddcf358a5cf733a772c91f",
+ "guides/review-apply.md": "1e286283f74d3a0e02b6f3af4af07ff578cf019b38b6d24eb3d10771d2f77ca3",
"guides/rl-rollouts.md": "acdab96daab71a0e5345134f013a6ba2be68d9d943af18a4c934f56b880f0781",
"guides/troubleshooting.md": "c696452ff26c9e46b1a8ad0a4b93266efab22277c28d33ec70686f133a549c69",
"index.md": "95eb7d1529227e2a5bc1873c7771b2952debfbd08865e158acb060a90abf6dec",
- "reference/cases-vm.md": "9246dce58098de6ef075f9e0e10c4ae1b303ecc657618a58a96d016c834f1cc7",
+ "lab-notes/agent-task-performance-analysis.md": "e4a0e4b27a0436487a51975764179fa35c75dcb7509e5b60289138931b3c928a",
+ "lab-notes/benchmark-methodology-evidence.md": "a9a3b5f8a22a51b44cd902646dd1fce4536f153b00417ce52178af0b5a71da34",
+ "lab-notes/filesystem-io-performance-analysis.md": "68e6676f593699ab3b19e30521b764e207aa48827dd3dcfcdcac881264357d4b",
+ "lab-notes/filesystem-performance-analysis.md": "33e76ef1bc02fb5e95d8e4f02834be6cb447e3c10e8965cb3034fe7e37bce709",
+ "lab-notes/index.md": "a0a9ed258decda83c4ab31a26300c64ae3d7bf7c4326daa4d52055937754f851",
+ "lab-notes/vm-memory-performance-analysis.md": "a6ac2c5e4f5c18f4ed420d9bdf38993ec6b2aacdfa35df4c50a8bc16a9a64f22",
+ "lab-notes/vm-startup-performance-analysis.md": "531d7ae4c5b050e87f7c68417e98827710fcb32b7c8ac9f64d29afabb03988f4",
+ "reference/cases-vm.md": "736ca27747e2dd4fb188367271090f4b8cff8f01147c4517a6cc4f5519199749",
"reference/cases.md": "17af5c27978dd6fd5e66fef19bde496d13766b51b4b8f17efb640510e03c2e70",
- "reference/cli.md": "1961e803d49eba92578bae589146d4e6942866b9b7e0ad40b56c90c9906cd9ad",
- "reference/config.md": "02efa1d7f155eb8fbf08c7ba1f9706dfd7067dd17d411ad272076615267ca5de",
- "reference/env-vars.md": "a203cf3dd6c2064428cbf857ab980b7dab94aee480423277736a5dab3d2a58e5",
- "reference/exit-codes.md": "08b0f4ae40d594a1f8f77dbaf9f175e2da8d929f880df8bc231823878e57fd74",
+ "reference/cli.md": "efcd1fc52d6e8ceacb208ad3cd90c5fc1ebc510ae95c2cd6e3bd07f5387bbd0c",
+ "reference/config.md": "3556d3ca7788e9b58840eb5a3570c002767c7beb776cb7bd4c32c6e6b767251a",
+ "reference/env-vars.md": "d99782eeb9c28ebdbf54011e542e0aaf03e6a24605641290db92c81f3d37ad72",
+ "reference/exit-codes.md": "90065d468b405aa114dcd159b1e943dfb1d7a98647fdff48299651666f6b702a",
"reference/index.md": "38a6e68fc45f22d23d92ba9d68f12d2e7df58e59620a2ded1ea541eb6927fb7e",
"reference/json-output.md": "90ed69de6e8cbf1ac68cbbf2bb075ce8afb6709fb72b9caded0b17ff0bc216ad",
- "reference/platforms.md": "f0aed6bf3de1d75e21676319ca4712544624646ec5c1f674c5e749ca5e0bf234",
+ "reference/platforms.md": "354029238cb11e7ebc266bf22ce845a447899006bd1cb6ea43d776ce27001663",
"reference/policy.md": "33ce2fbc366743a1e1a722228f30d8043fcf1945e2041677e0a7b085988a856b",
"reference/run-bundle.md": "1a81b0251f3ed77f906c4581150fa3e7985d79883156575c8c2c295319f96d24",
"reference/shared-image-cache.md": "2928b9de43fcb5f7ea321a017d59ad6c12c9fd84219df6e22fa096d9cd3b9447",
"reference/stability.md": "ec51d423f3aa58589ab3be4f327d798819ca9dcee308ac39772973f26446298c",
"security/audits.md": "a64eab52ed8429be1c03f87f070bad279f4d886da26acd01eb96b203e74029aa",
"security/disclosure.md": "78ae2d145ac9a4df764025b5ccd019c60a6b85a9562c48daf53d6fb533d033ca",
- "security/executor-boundaries.md": "c65aee5b240d945ff0b86ec5ccb12de822988ae431af1b1e9f4857dbf3111551",
+ "security/executor-boundaries.md": "83f2614f1227d371e3c91b9344ef2cebcb7dde32ee641a669aed1545529ce0a2",
"security/hardening.md": "a71b931912c1a4a54a66558f4cdf048be7e5145f6b74e8f9635077c539c63ba2",
- "security/index.md": "1a2015c139782bf8248d8dfc73df729f27a7214b2099fcda3918808bde10eafd",
+ "security/index.md": "091e1f52a730e3503c03aa37b436bfbdb446942fb5fc7872365f5a80474a365e",
"security/known-limitations.md": "c59d8afb60f64d8f287a73fbf7a5512171fa70b326bf6e94b3cdaee9dd788013",
- "security/threat-model.md": "6574615cc0ad04949d557721f706ceb88a13927f028a57e0a072962a3fba41dc",
- "start/first-run.md": "f59da840de1bef3571ca5685117718d654f716986aabd2aae953859c7546e169",
- "start/index.md": "9a649347630416d267d35481ad1863f3923a60cb5b61894f21f78db25bf02fe1",
- "start/installation.md": "bf005485aeef95572e29402ad4d9d3213552c41aa6b6b0e48ca68618bc95c46e",
- "start/next-steps.md": "2e6c4a1c508ff8a4fd2cfd37e3e512dda96eafd7d93f91f3a1cc923bd38ea06b",
- "start/what-is-pvisor.md": "b424f97c0901f2b86f15f17f335629fcb7c88495495da8bd0db521ae0eaeecba",
- "why/agent-lifecycle-cost.md": "0b6b7a0da570a266b4f6990f8f967ea9d5494fa424fe1c5830b4618faef0cbf8",
- "why/comparisons.md": "fb8bd7488d1cb3025eaced1be93cd267a44c547dada3119bd80fe87babf674f3",
- "why/faq.md": "3930b55fa7a91468dffae58f6d6c4ae1aa88c6a0d0835d6e056066493d295bb1",
- "why/index.md": "40ca020b7198eb7cd5aa8bb9352f113f8a1e7276637f2ef41fb968a639cc5c99",
- "why/trust-ladder.md": "01218b52b101e49bb6f25e16d7022f423102d0fa1f223caf3d92cc9acbedb3f4",
- "why/use-cases.md": "b038e7bac2dd23a19a5b96b698290cc9d8ca7d101fd181cd202b7b18f3fa9e89",
- "why/when-not-to-use.md": "aa2b086128b0c2aa8e1020f9734aa6dc147c50f6290b9024c48b630a5efe3114"
+ "security/threat-model.md": "cb0d5f6a4bfd014e416f36c1dcf48462aee32ca1fb2dfc669aae7ead747c9fcc",
+ "start/first-run.md": "bb4cc250fa5e86139adf2ced0a8e0fe274d1bbf375c33ef6c85687a546bfe1ba",
+ "start/installation.md": "68b61474df8f178fd7d3bc5b5da452c9959104e1a543c97e75372f2db5adb923",
+ "why/comparisons.md": "31d7a4aa35aedfc5c9dde35de6f693d17f112a8985e2dd66fa0392990e6326a9",
+ "why/index.md": "7bd43a500051aebe5c77f3b6eae82c65d2f7469269951899c170a900ae334f8a"
}
diff --git a/docs/zensical.en.toml b/docs/zensical.en.toml
index 78d19fd3..624ce1fa 100644
--- a/docs/zensical.en.toml
+++ b/docs/zensical.en.toml
@@ -16,20 +16,12 @@ nav = [
{ "Home" = "index.md" },
{ "Quick start" = [
{ "Getting started" = [
- { "Start here" = "start/index.md" },
- { "What is PolicyVisor?" = "start/what-is-pvisor.md" },
{ "Installation" = "start/installation.md" },
{ "Your first run" = "start/first-run.md" },
- { "After your first run" = "start/next-steps.md" },
] },
{ "About pVisor" = [
{ "Why pVisor" = "why/index.md" },
- { "Agent task lifecycle cost" = "why/agent-lifecycle-cost.md" },
- { "Trust ladder and scale" = "why/trust-ladder.md" },
- { "Use cases" = "why/use-cases.md" },
- { "Comparing existing approaches" = "why/comparisons.md" },
- { "When you do not need pVisor" = "why/when-not-to-use.md" },
- { "FAQ" = "why/faq.md" },
+ { "Should you use pVisor?" = "why/comparisons.md" },
] },
] },
{ "User guide" = [
@@ -38,7 +30,7 @@ nav = [
{ "Review and apply changes" = "guides/review-apply.md" },
{ "Logical checkpoints and forks" = "guides/fork-checkpoint.md" },
{ "Capture agent trajectories" = "guides/capture.md" },
- { "SandboxReplay" = "guides/replay.md" },
+ { "Replay recorded trajectories" = "guides/replay.md" },
{ "Run in CI" = "guides/ci.md" },
{ "Parallel agents" = "guides/parallel-agents.md" },
{ "RL rollouts" = "guides/rl-rollouts.md" },
@@ -48,9 +40,6 @@ nav = [
{ "Connect your agent" = "guides/agents/index.md" },
{ "Claude Code" = "guides/agents/claude-code.md" },
{ "Codex CLI" = "guides/agents/codex.md" },
- { "Gemini CLI" = "guides/agents/gemini-cli.md" },
- { "aider" = "guides/agents/aider.md" },
- { "OpenCode" = "guides/agents/opencode.md" },
{ "Scripts and automation commands" = "guides/agents/custom-scripts.md" },
] },
{ "Policies" = [
@@ -66,9 +55,6 @@ nav = [
] },
{ "Daemon quickstart" = [
{ "Run the single-node daemon" = "guides/daemon/index.md" },
- { "Daemon and independent cache entry points" = "guides/daemon/service.md" },
- { "Operate the single-node daemon" = "guides/daemon/operations.md" },
- { "Daemon runtime and integration boundaries" = "guides/daemon/boundaries.md" },
] },
{ "Learning path" = [
{ "Learn pVisor through tasks" = "cases/index.md" },
@@ -96,12 +82,9 @@ nav = [
] },
{ "Core concepts" = [
{ "Execution concepts" = [
- { "Concepts and boundaries" = "concepts/index.md" },
{ "Jobs and storage" = "concepts/jobs.md" },
{ "Staging and apply semantics" = "concepts/staging.md" },
{ "Capabilities, evidence, and guarantees" = "concepts/capabilities-and-evidence.md" },
- { "Policy model" = "concepts/policy-model.md" },
- { "Glossary" = "concepts/glossary.md" },
] },
{ "Security" = [
{ "Security overview" = "security/index.md" },
@@ -116,7 +99,6 @@ nav = [
{ "Benchmarks" = [
{ "Performance tests" = [
{ "Overview" = "benchmarks/index.md" },
- { "Methodology" = "benchmarks/methodology.md" },
{ "Startup latency" = "benchmarks/startup.md" },
{ "Lazy image" = "benchmarks/lazy-image-startup.md" },
{ "Memory optimization" = "benchmarks/vm-memory/index.md" },
@@ -134,7 +116,7 @@ nav = [
] },
{ "Design and research" = [
{ "Architecture and execution" = [
- { "Design and underlying mechanisms" = "design/index.md" },
+ { "How pVisor works" = "design/index.md" },
{ "Core design principles" = "design/principles.md" },
{ "Core architecture" = "design/architecture.md" },
{ "Job, Operation, Attempt and Event" = "design/execution-model.md" },
@@ -147,16 +129,13 @@ nav = [
{ "Memory architecture and mechanisms" = "design/memory-optimization/index.md" },
{ "Memory deduplication" = "design/memory-optimization/deduplication.md" },
{ "Shared working sets and lazy loading" = "design/daemon/shared-working-set.md" },
- { "Memory compression" = "design/memory-optimization/compression.md" },
{ "Per-instance compression" = "design/memory-optimization/compression-local.md" },
{ "RAM offload" = "design/memory-optimization/offload.md" },
- { "Offload file format" = "design/memory-optimization/offload-format.md" },
{ "Pooled-server compression" = "design/memory-optimization/compression-pool.md" },
{ "Experimental proof of concept" = "design/memory-optimization/proof-of-concept.md" },
] },
{ "Filesystem subsystem" = [
{ "File architecture, requests and staging" = "design/overlayfs.md" },
- { "Cache and asynchronous-write performance curves" = "design/filesystem-io-performance-analysis.md" },
{ "Shared image cache v1: independent metadata and shared content" = "design/shared-image-cache-storage.md" },
{ "Lazy Image V2: Directory-Local Packing and On-Demand Indexes" = "design/lazy-image-v2.md" },
] },
@@ -169,11 +148,7 @@ nav = [
] },
{ "Single-node daemon" = [
{ "Single-node daemon architecture" = "design/daemon/index.md" },
- { "Local state and restart recovery" = "design/daemon/state-and-recovery.md" },
- { "Local sandbox admission" = "design/daemon/admission.md" },
- { "Sandbox lifecycle" = "design/daemon/lifecycle.md" },
- { "Daemon storage and reclamation" = "design/daemon/storage.md" },
- { "Service responsibility convergence" = "design/daemon/responsibility-convergence.md" },
+ { "Daemon storage, recovery and reclamation" = "design/daemon/storage.md" },
{ "Daemon operations" = "design/daemon/operations.md" },
] },
{ "Interfaces, extensions and decisions" = [
@@ -196,12 +171,18 @@ nav = [
] },
{ "Research directions" = [
{ "Research directions" = "design/research/index.md" },
- { "External orchestration and single-node execution" = "design/research/cluster-execution.md" },
- { "RL execution substrate" = "design/research/rl-execution-substrate.md" },
- { "Publications and reports" = "design/research/publications.md" },
- { "Open-source design references" = "design/research/design-documents.md" },
+ { "Agent task lifecycle cost" = "design/research/agent-lifecycle-cost.md" }
] },
] },
+ { "Lab notes" = [
+ { "Lab notes" = "lab-notes/index.md" },
+ { "VM startup performance analysis" = "lab-notes/vm-startup-performance-analysis.md" },
+ { "End-to-end task performance analysis" = "lab-notes/agent-task-performance-analysis.md" },
+ { "VM memory performance analysis" = "lab-notes/vm-memory-performance-analysis.md" },
+ { "Filesystem performance analysis" = "lab-notes/filesystem-performance-analysis.md" },
+ { "Cache and asynchronous-write performance curves" = "lab-notes/filesystem-io-performance-analysis.md" },
+ { "Benchmark methodology and evidence" = "lab-notes/benchmark-methodology-evidence.md" },
+ ] },
{ "Contributing" = [
{ "Development guide" = [
{ "Community" = "community/index.md" },
@@ -212,9 +193,7 @@ nav = [
{ "Release PolicyVisor" = "community/releasing.md" },
{ "Roadmap" = "community/roadmap.md" },
{ "Changelog" = "community/changelog.md" },
- { "Code of conduct" = "community/code-of-conduct.md" },
{ "Governance" = "community/governance.md" },
- { "Adopters" = "community/adopters.md" },
] },
] },
]
diff --git a/docs/zensical.zh.toml b/docs/zensical.zh.toml
index 5fdb15e6..67667dea 100644
--- a/docs/zensical.zh.toml
+++ b/docs/zensical.zh.toml
@@ -16,20 +16,12 @@ nav = [
{ "首页" = "index.md" },
{ "快速开始" = [
{ "快速上手" = [
- { "从这里开始" = "start/index.md" },
- { "PolicyVisor 是什么" = "start/what-is-pvisor.md" },
{ "安装指南" = "start/installation.md" },
{ "第一次运行" = "start/first-run.md" },
- { "第一次运行之后" = "start/next-steps.md" },
] },
{ "了解 pVisor" = [
{ "为什么是 pVisor" = "why/index.md" },
- { "Agent 任务的生命周期成本" = "why/agent-lifecycle-cost.md" },
- { "信任阶梯与规模轴" = "why/trust-ladder.md" },
- { "用例" = "why/use-cases.md" },
- { "与现成方案对比" = "why/comparisons.md" },
- { "什么时候不需要 pVisor" = "why/when-not-to-use.md" },
- { "常见问题" = "why/faq.md" },
+ { "该不该用 pVisor?" = "why/comparisons.md" },
] },
] },
{ "用户指南" = [
@@ -38,7 +30,7 @@ nav = [
{ "审查并应用改动" = "guides/review-apply.md" },
{ "逻辑检查点与分叉" = "guides/fork-checkpoint.md" },
{ "捕获 Agent 轨迹" = "guides/capture.md" },
- { "SandboxReplay" = "guides/replay.md" },
+ { "回放历史轨迹" = "guides/replay.md" },
{ "在 CI 中运行" = "guides/ci.md" },
{ "并行 Agent" = "guides/parallel-agents.md" },
{ "RL rollout" = "guides/rl-rollouts.md" },
@@ -48,9 +40,6 @@ nav = [
{ "接入你的 Agent" = "guides/agents/index.md" },
{ "Claude Code" = "guides/agents/claude-code.md" },
{ "Codex CLI" = "guides/agents/codex.md" },
- { "Gemini CLI" = "guides/agents/gemini-cli.md" },
- { "aider" = "guides/agents/aider.md" },
- { "OpenCode" = "guides/agents/opencode.md" },
{ "任意脚本与自动化命令" = "guides/agents/custom-scripts.md" },
] },
{ "策略" = [
@@ -66,9 +55,6 @@ nav = [
] },
{ "Daemon 上手" = [
{ "运行单机 daemon" = "guides/daemon/index.md" },
- { "Daemon 与独立缓存入口" = "guides/daemon/service.md" },
- { "单机 daemon 运维" = "guides/daemon/operations.md" },
- { "Daemon 运行时与集成边界" = "guides/daemon/boundaries.md" },
] },
{ "任务学习路线" = [
{ "按任务学习 pVisor" = "cases/index.md" },
@@ -96,12 +82,9 @@ nav = [
] },
{ "基础概念" = [
{ "执行概念" = [
- { "概念与边界" = "concepts/index.md" },
{ "Job 与存储" = "concepts/jobs.md" },
{ "暂存与 apply 语义" = "concepts/staging.md" },
{ "能力、证据与保证边界" = "concepts/capabilities-and-evidence.md" },
- { "策略模型" = "concepts/policy-model.md" },
- { "术语表" = "concepts/glossary.md" },
] },
{ "安全" = [
{ "安全概览" = "security/index.md" },
@@ -116,7 +99,6 @@ nav = [
{ "基准测试" = [
{ "性能测试" = [
{ "基准概览" = "benchmarks/index.md" },
- { "测试方法" = "benchmarks/methodology.md" },
{ "启动延迟" = "benchmarks/startup.md" },
{ "惰性镜像" = "benchmarks/lazy-image-startup.md" },
{ "内存优化" = "benchmarks/vm-memory/index.md" },
@@ -134,7 +116,7 @@ nav = [
] },
{ "设计与研究" = [
{ "整体架构与执行" = [
- { "设计与底层原理" = "design/index.md" },
+ { "pVisor 如何工作" = "design/index.md" },
{ "核心设计原则" = "design/principles.md" },
{ "核心架构" = "design/architecture.md" },
{ "Job、Operation、Attempt 与 Event" = "design/execution-model.md" },
@@ -147,16 +129,13 @@ nav = [
{ "内存架构与机制" = "design/memory-optimization/index.md" },
{ "内存去重" = "design/memory-optimization/deduplication.md" },
{ "共享工作集与按需加载" = "design/daemon/shared-working-set.md" },
- { "内存压缩" = "design/memory-optimization/compression.md" },
{ "实例内压缩" = "design/memory-optimization/compression-local.md" },
{ "内存卸载" = "design/memory-optimization/offload.md" },
- { "卸载文件格式" = "design/memory-optimization/offload-format.md" },
{ "池化服务器压缩" = "design/memory-optimization/compression-pool.md" },
{ "实验性概念验证" = "design/memory-optimization/proof-of-concept.md" },
] },
{ "文件系统子系统" = [
{ "文件架构、请求与暂存" = "design/overlayfs.md" },
- { "缓存与异步写入性能曲线" = "design/filesystem-io-performance-analysis.md" },
{ "共享镜像缓存 v1:独立元数据与共享内容" = "design/shared-image-cache-storage.md" },
{ "Lazy Image V2:目录局部化打包与按需索引" = "design/lazy-image-v2.md" },
] },
@@ -169,11 +148,7 @@ nav = [
] },
{ "单节点 Daemon" = [
{ "单节点 Daemon 架构" = "design/daemon/index.md" },
- { "本机状态与重启恢复" = "design/daemon/state-and-recovery.md" },
- { "本机 Sandbox 准入" = "design/daemon/admission.md" },
- { "Sandbox 生命周期" = "design/daemon/lifecycle.md" },
- { "Daemon 存储与回收" = "design/daemon/storage.md" },
- { "服务职责收敛" = "design/daemon/responsibility-convergence.md" },
+ { "Daemon 存储、恢复与回收" = "design/daemon/storage.md" },
{ "Daemon 运维" = "design/daemon/operations.md" },
] },
{ "接口、扩展与设计决策" = [
@@ -196,12 +171,18 @@ nav = [
] },
{ "研究方向" = [
{ "研究方向" = "design/research/index.md" },
- { "外部编排与单机执行" = "design/research/cluster-execution.md" },
- { "RL 执行基座" = "design/research/rl-execution-substrate.md" },
- { "论文与报告" = "design/research/publications.md" },
- { "开源设计文档参考" = "design/research/design-documents.md" },
+ { "Agent 任务的生命周期成本" = "design/research/agent-lifecycle-cost.md" }
] },
] },
+ { "实验记录" = [
+ { "实验记录" = "lab-notes/index.md" },
+ { "VM 启动性能分析" = "lab-notes/vm-startup-performance-analysis.md" },
+ { "端到端任务性能分析" = "lab-notes/agent-task-performance-analysis.md" },
+ { "VM 内存性能分析" = "lab-notes/vm-memory-performance-analysis.md" },
+ { "文件系统性能分析" = "lab-notes/filesystem-performance-analysis.md" },
+ { "缓存与异步写入性能曲线" = "lab-notes/filesystem-io-performance-analysis.md" },
+ { "Benchmark 方法与证据" = "lab-notes/benchmark-methodology-evidence.md" },
+ ] },
{ "参与开发" = [
{ "开发指南" = [
{ "社区" = "community/index.md" },
@@ -212,9 +193,7 @@ nav = [
{ "发布 PolicyVisor" = "community/releasing.md" },
{ "路线图" = "community/roadmap.md" },
{ "变更日志" = "community/changelog.md" },
- { "行为准则" = "community/code-of-conduct.md" },
{ "治理" = "community/governance.md" },
- { "使用者" = "community/adopters.md" },
] },
] },
]
diff --git a/scripts/check-docs.py b/scripts/check-docs.py
index 4f119ed7..f8340f3b 100644
--- a/scripts/check-docs.py
+++ b/scripts/check-docs.py
@@ -120,6 +120,72 @@ def handle_starttag(self, tag, attrs):
self.links.append((tag, attrs[key], attrs.get("class", "")))
+def check_duplicates(source):
+ """Fail on the same substantive prose paragraph appearing in multiple pages.
+
+ One fact, one home: the 2026-10 review found the same workflow copied onto
+ ten pages and the same paragraph three times verbatim. Shared boilerplate
+ that is intentional (the lab-notes provenance note) lives in blockquotes,
+ which are excluded; anything else worth repeating is worth an allowlist
+ entry with a reason.
+ """
+ issues = []
+ seen = {}
+ for locale in ("zh", "en"):
+ base = source / locale
+ if not base.is_dir():
+ continue
+ for page in sorted(base.rglob("*.md")):
+ if ".data" in page.parts:
+ continue
+ text = FENCES.sub("", page.read_text(encoding="utf-8"))
+ # measurement-status blocks are tool-managed per-page boilerplate
+ # (see benchmark.new/docs.py), intentionally identical across pages.
+ text = re.sub(
+ r"(?s).*?",
+ "",
+ text,
+ )
+ for block in re.split(r"\n\s*\n", text):
+ lines = [ln.strip() for ln in block.splitlines()]
+ lines = [ln for ln in lines if not re.match(r"^\[[^\]]+\]:\s*\S+$", ln)]
+ if not lines or any(
+ ln.startswith((">", "|", "#", "- ", "* ", "!", "<", "{"))
+ or re.match(r"^\d+[.)] ", ln)
+ for ln in lines
+ ):
+ continue
+ normalized = re.sub(r"\s+", " ", " ".join(lines))
+ if len(normalized) < 150:
+ continue
+ # Link definitions, inline-code paths and pure link/image
+ # pointer lines are navigation, not prose; identical targets
+ # across locales or sibling pages are expected.
+ prose = re.sub(r"!?\[[^\]]*\]\([^)]*\)", "", normalized)
+ prose = re.sub(r"`[^`]*`", "", prose)
+ # "Local raw record " is the site's provenance-pointer
+ # convention; the paths themselves carry the information.
+ prose = prose.replace("Local raw record", "").replace("本地原始记录", "")
+ if len(prose.strip(" ·:|-—")) < 60:
+ continue
+ key = hashlib.sha256(normalized.encode()).hexdigest()
+ if key in ALLOWED_DUPLICATES:
+ continue
+ owner = f"{locale}/{page.relative_to(base)}"
+ if key in seen and seen[key] != owner:
+ issues.append(
+ f"duplicate paragraph in {seen[key]} and {owner}: {normalized[:60]}..."
+ )
+ else:
+ seen.setdefault(key, owner)
+ return issues
+
+
+# SHA-256 of normalized paragraphs that are intentionally shared, with a reason
+# in a comment on the entry. Prefer linking over adding entries here.
+ALLOWED_DUPLICATES = set()
+
+
def check(strict=False):
pairs = check_translations(strict=strict)
paths = list(ROOT.rglob("*.html"))
@@ -276,9 +342,13 @@ def has_redirect_maps(node):
if "md-path__link" in classes and dest_locale != locale:
issues.append(f"{rel}: breadcrumb leaves current language: {href}")
for locale in ("en", "zh"):
- product = (ROOT / locale / "start/what-is-pvisor/index.html").read_text()
- if 'class="admonition tip"' not in product or "Broken'
)
elif mutation == "callout":
- replace(article, 'class="admonition tip"', 'class="admonition note"')
+ replace(
+ docs / "site/en/why/index.html",
+ 'class="admonition tip"',
+ 'class="plain"',
+ )
+ elif mutation == "code_block":
+ replace(
+ docs / "site/en/start/first-run/index.html",
+ "example ",
+ "example",
+ )
else:
raise AssertionError(mutation)
with self.assertRaisesRegex(SystemExit, message):