docs(i18n): proofread bilingual README corpus

This commit is contained in:
j-xiang
2026-09-10 00:21:32 +08:00
parent 08f646da36
commit 8e8fb2fc62
744 changed files with 2592 additions and 2631 deletions
@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write packages/experimental/code-runtime-python/README.md
README.md: 23595845e41d77b3a204e786c0d878b044ef6d4b
README.zh.md: 1aa93546428d1bd0a66ce0600f124565a798cb70
README.zh.md: a9b758089a10954abb8c4f3861eaa6816cb9ee45
@@ -33,7 +33,7 @@ kind: "package-reference"
### wire
帧在子进程 fd 3 上以 JSON-lines 传输——每行一个对象——因此 stdout/stderr 留给程序自己的输出。子进程 → 宿主:`boot-ack``call``log``done`。宿主 → 子进程:`boot`(首帧,携带全部上限与命名空间声明)、`run``boot-ack` 之后,只携带程序体)与每个 `call` 一个 `reply`。伪造帧可在 `done` 上同时携带 `value``error`,因此消费方必须先检查 `error`,在它存在时忽略 `value``log` 帧的 `open` 标志标记由显式 flush 提交的未结束行:宿主把下一个 log 帧追加到同一条目,因此 `print('a', end='', flush=True); print('b')` 读回为一条 `'ab'` 条目而不是假换行。合并的唯一例外是截断:当后续超预算帧触发账本时,已计费的前缀作为独立条目先提交,截断 marker 跟在后面(marker 保持末位,无重复计费)。
帧在子进程 fd 3 上以 JSON-lines 传输——每行一个对象——因此 stdout/stderr 留给程序自己的输出。子进程 → 宿主:`boot-ack``call``log``done`。宿主 → 子进程:`boot`(首帧,携带全部上限与命名空间声明)、`run``boot-ack` 之后,只携带程序体)与每个 `call` 一个 `reply`。伪造帧可在 `done` 上同时携带 `value``error`,因此消费方必须先检查 `error`,在它存在时忽略 `value``log` 帧的 `open` 标志标记由显式 flush 提交的未结束行:宿主把下一个 log 帧追加到同一条目,因此 `print('a', end='', flush=True); print('b')` 读回为一条 `'ab'` 条目而不是假换行(拆分计费算术见 fd-3 协议 Agent Note 的 wire-contract 一节)。合并的唯一例外是截断:当后续超预算帧触发账本时,已计费的前缀作为独立条目先提交,截断 marker 跟在后面(marker 保持末位,无重复计费)。
### 可能出错的地方
@@ -55,7 +55,7 @@ kind: "package-reference"
### wire 契约
帧为 `boot``run`(宿主 → 子进程)与 `boot-ack``call``log``done` 每个 call 一个 `reply`(子进程 → 宿主)。`log` 帧的 `truncated` 标志标记的就是子进程账本自己的截断标记帧,因此宿主在与子进程相同的点停止捕获,而不是从自己的预算推断。`log` 帧的 `open` 标志标记由显式 flush 提交的未结束行:宿主把下一个 log 帧合并进同一条目,因此 `print('a', end='', flush=True); print('b')` 读回为一条 `'ab'` 条目而不是假换行(拆分计费算术在 fd-3 协议 Agent Note 的 wire-contract 段)。合并的唯一例外是截断:当后续超预算帧触发账本时,已计费的前缀作为独立条目先提交,截断 marker 跟在后面(marker 保持末位,无重复计费)。`done.error.kind``exception``invalid-output``output-limit` 之一;墙钟/CPU 预算、中止与基底死亡在宿主侧观察,不以帧形式携带。
帧为 `boot``run`(宿主 → 子进程)与 `boot-ack``call``log``done` (子进程 → 宿主),以及每个 `call` 对应一个 `reply`宿主 → 子进程)。`log` 帧的 `truncated` 标志标记的就是子进程账本自己的截断标记帧,因此宿主在与子进程相同的点停止捕获,而不是从自己的预算推断。`log` 帧的 `open` 标志标记由显式 flush 提交的未结束行:宿主把下一个 log 帧合并进同一条目,因此 `print('a', end='', flush=True); print('b')` 读回为一条 `'ab'` 条目而不是假换行(拆分计费算术在 fd-3 协议 Agent Note 的 wire-contract 段)。合并的唯一例外是截断:当后续超预算帧触发账本时,已计费的前缀作为独立条目先提交,截断 marker 跟在后面(marker 保持末位,无重复计费)。`done.error.kind``exception``invalid-output``output-limit` 之一;墙钟/CPU 预算、中止与基底死亡在宿主侧观察,不以帧形式携带。
### 无损 JSON 跨越
@@ -70,12 +70,12 @@ kind: "package-reference"
| 文件 | 职责 |
|---|---|
| [`src/index.ts`](src/index.ts) | 插件入口:`PythonCodeRuntime`——spawn、帧 pump、预算、隔离、拆卸;重新导出协议词汇 |
| [`src/protocol.ts`](src/protocol.ts) | 宿主侧:帧 codec、敌意帧校验器、无损 JSON 计量器、共享标记文本 |
| [`src/protocol.ts`](src/protocol.ts) | 宿主侧:帧 codec、不可信帧校验器、无损 JSON 计量器、共享标记文本 |
| [`py/bootstrap.py`](py/bootstrap.py) | 子进程侧:fd-3 通道、程序执行、binding 分发、账本与结算 |
| [`py/protocol.py`](py/protocol.py) | Python 侧:`PROTOCOL_FD``TypedDict` 帧镜像、`log_truncation_marker` |
| [`tests/runtime.spec.ts`](tests/runtime.spec.ts) | 真实子进程套件:预算、隔离、敌意帧、名称重绑 |
| [`tests/protocol-mirror.e2e.ts`](tests/protocol-mirror.e2e.ts) | 对照真实 `python3` 的跨语言镜像测试 |
| — | 不发布运行时不变式伴生入口:帧顺序、预算计量与拆卸发生在 CPython 子进程或 fd 3 上,因此本包没有可供 Cordis listener 比较的同进程事件序列或独立维护的可变关系;协议镜像与真实子进程测试覆盖这些进程边界行为。 |
| — | 不发布运行时不变式配套项:帧顺序、预算计量与拆卸发生在 CPython 子进程或 fd 3 上,因此本包没有可供 Cordis listener 比较的同进程事件序列或独立维护的可变关系;协议镜像与真实子进程测试覆盖这些进程边界行为。 |
</details>
@@ -117,7 +117,9 @@ kind: "package-reference"
- **已发布 profile 均不挂载本提供方**——keyless `ptc-python-turn` 快照通过真实 Loader 替换 headless PTC 运行时;已发布 profile 继续使用 Worker 线程后端。
- **跨通道日志交错由后端决定**——Python stdout、stderr 与 fd-3 日志帧彼此独立传输;每个通道保留自身顺序,但它们在 `result.logs` 中的总顺序可能不同。
- **需要 CPython 3.10 或更高版本**——配置的可执行文件会在加载期完成解析与版本探测;不受支持的解释器会在 `ctx.codeRuntime` 注册前失败。
- **截断标记文本与临时目录前缀保留改名前的短名**——标记 `[dsh-code-runtime-python] log capture truncated at <N> bytes``dsh-code-runtime-python-` 临时目录前缀被测试逐字节锚定,且独立于 npm 包名;promotion(去掉 `experimental-` 前缀)不会重命名它们。
- **`run()` 是一次性的**——`logs` 只有在 `CodeRunResult` resolve 后才能获得;没有为运行中程序产生的输出提供流式日志或进度接口。
- **运行之间不保留状态**——每次请求都在全新子进程中执行;持久 REPL 风格内核在某个后端带来自己的日志方案之前保持延期。
- **原始长度超过有效帧解析上限的 fd-3 帧会让本次运行以 worker-exit 结算**——上限为 64 MiB,或当宿主的配置堆无法安全解析接近上限的帧时更低(`hostFrameParseCeiling`);`maxLogBytes`/`maxValueBytes` 在加载期被限制到同一上限,因此诚实子进程的帧总能放得下;模型构造的超过该上限的 binding 实参(一个在 seam 层没有预算的值)会触发同一上限——这是该 OOM 防护的已接受残余。
- **停止读取回复的子进程会在回复积压超过 1024 帧时以 worker-exit 结算运行**——宿主每次写一条回复,管道满时等待 `drain`;只持续发送调用而不消费回复的子进程会让保留的积压(及其钉住的 binding 结果)一直增长到墙钟,因此积压上限让运行提前失败。binding 结果在 seam 层没有字节上限,所以这是计数上限而非字节上限。
@@ -125,7 +127,6 @@ kind: "package-reference"
- **组合日志与值的峰值不被加载门建模**——持续写入的模型 daemon 线程与完成值计量、分帧相加的峰值没有任何门会放行或拒绝;运行以 `worker-exit` 告终,隔离成立,只有失败分类降级。
- **1 秒双限 `ulimit -t 1` CPU 超限被报告为 `worker-exit` 而非 timeout**——当宿主在一个与软限相等的硬 CPU 限下启动且该限为 1 时,`_clamped` 无法下调软限,内核在同一 tick SIGKILL 忙循环,SIGXCPU 永远不会送达;隔离成立,只有分类降级。
- **中间 binding 值没有字节上限**——实现仍受无损 JSON 序列化成本与进程内存约束,提供方或执行器可能应用自己的获取上限。
- **截断标记文本与临时目录前缀保留改名前的短名**——标记 `[dsh-code-runtime-python] log capture truncated at <N> bytes``dsh-code-runtime-python-` 临时目录前缀被测试逐字节锚定,且独立于 npm 包名;promotion(去掉 `experimental-` 前缀)不会重命名它们。
<a id="dev-note"></a>
### 开发备注