Repository navigation
fix(runtime): preserve full UTF-8 context with measured 8 MiB RPC bounds - #7818
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent | model=gpt-6.1-sol | provider=OpenAI | runtime_reported | effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
结论:完整审查支持 APPROVE,目标 #781888a1b61。独立复现了旧编码和旧 capture 边界的拒绝,在当前真实 RPC、CLI 与 native App fixture 验证完整恢复;并发成本增加保留为明确取舍。CI 未查询、轮询或等待。
动机
读取完整中文、emoji 上下文的 native Codex/CLI 用户,以及通过共享 Effect runtime 传递完整来源的既有消费者。
同一份完整参数实际为 2,000,420 UTF-8 bytes,旧 ASCII JSON 却为 4,800,420 bytes,普通 RPC 在 dispatch 前拒绝;当前编码保留全部值并成功返回。另一个 3,900,285-byte capture 在旧文件边界拒绝,当前真实 CLI 可读完全部 62 页,内容和摘要完全一致。
独立 base/head 对照验证了普通 Unicode 请求恢复、完整来源与尾部约束、原私有快照、raw/off 输出和拒绝理由;当前 actual native 的大 Unicode progressive case 能收到选择的要求,并在错误摘要后通过原引用继续,原 Turn/receipt 不重放。
本次是既有共享 IO 的 UTF-8 保真和有界容量切片,不交付 C1/C2 整体、安装升级或真实模型采用,不提高分页、64 MiB 私有文件、宿主展示预算或冻结实验标准,也不授予 merge 权限。
先读取变更前 docs/reference/canonical-snapshot-pagination.md,spec_revision 为完整不可变 base d430c0396017bc9d53350e22126407f30b8bd653,以及同版本 docs/development/testing-and-quality.md 的预算与 real-path 条款。验收映射为 Observable contract / complete source、Observable contract / bounded pagination、Consistency and recovery / identity and refusal、Cost boundary / intentional ordinary-wire increase、Budget decisions / preserve meaning and frozen results、Real-path gate / affected consumer and sensitivity。这些是原章节条款的定位标签。完整来源、分页/私有容量、身份、拒绝与恢复由下述实际测试覆盖;原 2 MiB 普通上限是本次明确提出的变更,不称为行为完全相同。
改动思路
保留一个现有 Effect IO owner:Python 仅编码实际 UTF-8 字节与传输,TypeScript 校验请求、执行既有 handler 并控制响应。四处编码共用一个私有 helper,socket 只扫描新块,完整 frame 仍只解析一次;没有第二个状态、权限或 codec owner。
当前完整边界是 UTF-8 envelope/私有参数编码、普通请求和响应 2→8 MiB、对应 delimiter 扫描、所有共享常量消费者的容量/保真回归与协议说明;不引入新 capability、设置、provider、持久化 schema 或 UI。
不发布的最强理由是:仅修复 ASCII 转义已足以让一类原本低于 2 MiB 的 Unicode 参数通过,不能因此自动把所有共享限制放宽。独立验证另一个现有 native consumer:3.9 MiB capture 在旧 reader 的 2 MiB 文件边界仍不可读;当前实际 App server 的大 Unicode case 执行了 reader、错误摘要拒绝和原引用恢复。这里有第二条真实调用链,且普通/私有通道、所有继承常量的调用方和并发成本一起审查,没有靠删正文或增加一个测试预算造绿。
可保留原 2 MiB 加更多专用通道/常量,但这会在已有共同 IO owner 外增加策略分支。当前方案沿现有共享边界给出有限 8 MiB,保留完整分页与 64 MiB 私有 fallback。实际成本并非全面下降:大调用的顺序往返改善,小 ping 在并发下变慢,详见风险表。没有既有 SLO 被改写;这批准的是有明确成本的容量修复。
具体改动
关键代码讲解
完整 diff 为 25 文件 +338/-59:两个 production 文件、十个协议/能力说明和十三个测试文件。actual merge base 为 d430c0396017bc9d53350e22126407f30b8bd653,另取最新 target main@73cf83edd6d80275d0c8f44c5289837eebe8ab0d 做 exact-scope CQR/premerge;未把后来 main 的提交冒充此 head 的祖先。
_encode_rpc_json统一四个实际编码点:compact JSON、ensure_ascii=False、UTF-8 与 lone-surrogate 的 backslash replacement。引号、反斜线、控制字符、孤立/成对代理项与 ASCII parity 有直接断言;它不替代 canonical numeric/source codec。_request_with_info仍在发送前按包含 LF 的实际 bytes 拒绝超限。只有原 allowlist 上显式 private snapshot 才可使用 64 MiB;权限、物理文件、byte count、SHA 和清理不改。发送后失联/超限仍是 ambiguous,不能假定未执行而盲重试。createServerdata callback 保留累计 UTF-8 byte count,只在新 chunk 找 LF;之前每块都已证明没有 LF。收到第一帧后 pause,仍对完整第一帧执行一次 parse/auth/dispatch。实际 socket 测试拆在 UTF-8 code point 中间,没收到 LF 时不响应,第二帧不触发 shutdown;正好 8 MiB(含 LF)可接收,超限保持 typed refusal。writeResponse的 inline 上限改为 8 MiB,64 MiB sink 规则不变。没有合法 sink 的大响应仍断开,让客户端保留“可能已经 commit”的不确定性。read_context_capture_file是未改代码但实际受共享常量影响的 reader。捕获文件/native input/event、Todo summary/handoff、task graph/replan-history 的使用点均逐一搜索;新容量不跳过原 hash、owner、physical path 或 Goal/Agent/Turn 校验。
原大集合、monitor、inbox、history、Goal 来源和 quoted journal 没有缩小。新增更大 fixture 继续覆盖私有路径;原 4,500-Turn 和 research/journal 的 2 MiB refusal 显式固定旧 guard,避免把历史资格追认为新预算通过。原生 large case 选择的要求进入实际收到的输入,支撑材料保留在 complete capture;selected EOF 不构成完整 retained baseline,下一次仍 full。
对主干的风险
| 独立执行 | 结果与边界 |
|---|---|
| 12 个 owning Python 模块 | 262 passed, 1 skipped;唯一 skip 为 Linux thread-group leader exit,未冒充本机通过 |
| saved context / actual native | 42 passed, 4 deselected;其中 3 个实际 App native case(full、小 progressive、大 Unicode progressive),其余 39 为标准用例,未重复计数;静态本地 Responses,无真实模型推理,原单 case 30 秒 deadline 不变 |
| TypeScript Effect IO/snapshot/error/fairness | 20 passed, 0 skip |
| 全 control-plane TypeScript | 5801 passed, 77 skipped;PG/平台等环境限定项保持未验证 |
| original journal / output budget | 16 passed,含原 1.55M 字符 quoted source 与 unsafe integer;CLI output-budget smoke 通过,未放宽其原 guard |
| actual base/head functional probe | 同 fixture 15c8c6a798f0b86588ebead5f3803c5a8868c9dff5ca1eab23ab40a0a3d021ca;旧普通 Unicode RPC 拒绝、head 完整;私有通道两边都完整;3,900,285 bytes 全 62 页等于原 SHA;原来源不变、不创建 authority/registry |
| actual base/head negative/off | 同一小 source 的 valid/digest/symlink/foreign identity 四项,两边相同结果和完整拒绝理由;新增大 source 的非法引用仍拒绝 |
| static / boundary | control-plane typecheck、完整 CI Ruff 范围、mypy 17 sources、diff semantic advisory 后 full smoke、bilingual/diff;25 changed files scan 0 errors/0 warnings |
预算复核还对两个不可变版本使用同一完整 1/3/6 MiB 来源及四个并发 6 MiB 调用,独立 Python 进程做二十个小 ping,两轮各自运行;所有返回都检查完整文本和 SHA。fixture 指纹为 d353ed03bd708315eeddaf2381a742de850f54d7628c0f085019dfa95f42d3f6。
| 本次短时观测 | actual base | reviewed head |
|---|---|---|
| 6 MiB 顺序往返,含编码/回退/完整验证 | 91–154 ms | 约 68.6 ms |
| 并发时小 ping observed p95 | 41–43 ms | 约 52.9 ms |
| 并发后 RSS snapshot | 178–242 MiB | 229–248 MiB |
RSS 是调用后的观测,不是峰值;短样本不是稳定 p95/SLO,也没有把全 patch 对照冒充单一 scan 改动的 causal profiling。并发小请求成本作为 CQR warning 保留,不能宣称全面提速。初始独立 cost fixture 缺少必需 state_file 被正常拒绝,补齐同一合法 fixture 后两边重跑;那次失败保留,不是产品故障或通过证据。作者的 profiler、旧 full suite/PG、安装数据均没有计作本次独立执行。
语义与 CI 对齐
普通请求/响应与继承 reader 的默认 2→8 MiB 是显式全局容量变更,包括 presentation off 路径;隔离结论指值、身份、权限、原状态和恢复保持,不声称旧字节门限完全等价。控制字符仍逃逸,source 没有裁剪,旧 request_too_large code 和 possible-commit ambiguity 保留,诊断文字明确 8 MiB。64 MiB 私有权限/allowlist、4,096/1,792 KiB 分页、宿主加载/展示、原冻结实验和 native deadline 不变。
当前 exact-scope CQR 为 cqr_863f622237d8dbc55a16,保留一个资源取舍 warning。显式 --goal-id 的 standard premerge 6 direct +19 selected/executed 全过、0 failure、0 manual hold,并原生读回当前 exact CQR valid;首次不带 Goal 的标准运行也通过,但没有被冒充为 Goal policy 资格。scope 由当前完整 diff 决定,不继承作者旧 receipt。CI 依 wait_for_ci=false 没有查询或等待,未知 CI 不单独阻止结论;当前 regression、缺失必要覆盖和合并授权仍各自保留。
我的整体评价
保留一个现有 Effect IO owner:Python 仅编码实际 UTF-8 字节与传输,TypeScript 校验请求、执行既有 handler 并控制响应。四处编码共用一个私有 helper,socket 只扫描新块,完整 frame 仍只解析一次;没有第二个状态、权限或 codec owner。
当前完整边界是 UTF-8 envelope/私有参数编码、普通请求和响应 2→8 MiB、对应 delimiter 扫描、所有共享常量消费者的容量/保真回归与协议说明;不引入新 capability、设置、provider、持久化 schema 或 UI。
当前 repository experience 对恢复 RFC 的阶段/用户旅程建议,仅按适用边界采用:本次已有 native/CLI 消费者,以完整来源与错误后实际恢复作为有用结果;不继承历史 verdict,也不要求内部 IO 另建设置页。
这是已有 native/CLI 真实消费者的完整 IO 修复,有独立 actual-base 失败、当前完整来源读回、负例和实测成本,既没有另建通道/配置框架,也没有把一个 encoder 单测当作完整采用。邻近 bounded refactoring 结论为 unnecessary:四个 encode site 已合到一个 helper;socket 删除重复扫描,进一步抽象没有新增不变量或当前消费者。
已检查完整 25-file diff 和实际调用链:没有 JSX、CSS、viewport、布局或渲染规则变化;这是现有 CLI/native reader 的内部传输与容量改动。既有 native App 入口实际执行,截图不能额外证明这些字节、权限和恢复不变量。
unverified_scope:未独立重跑安装包/native WebView、真实模型推理或语义采用、PG 真服务、长期资源 soak 与匹配净收益;当前 native 使用本地静态 Responses。全量 TS 的 77 个环境/平台 slots 和 Python 的 1 个 Linux-only case 保持未验证,不把作者历史 PG/安装结果计入本次通过。
本结论保留完整原要求、反例、失败和不确定结果。新容量使完整工作材料可用,不说明模型已采用它或长程净成本更低。与作者共用 GitHub 账号,按规则以 COMMENTED 发布 approval conclusion;发布后逐字读回并执行 exact-head closeout,不执行 merge、dismiss、安装或发布。
English verdict: APPROVE for #781888a1b61. Complete Unicode and larger native sources survive real RPC/CLI/native paths with original privacy, identity and recovery. The deliberate concurrency cost and unrun platform/provider, installed/model and long-horizon qualification remain explicit.
Goal And Delivered Outcome
完整中文/emoji 上下文会被 Python 的 ASCII JSON 转义放大:同一份参数原本占 1,000,387 UTF-8 bytes,旧编码占 2,400,387 bytes,普通调用在发送前拒绝。此 PR 保留完整正文、尾部约束和原有 JSON 值,统一 UTF-8 编码,并把普通 Effect 请求/响应上限从 2 MiB 调整到 8 MiB。
服务端只在新 socket 块中找换行,避免每次展开并扫描已收正文。8 MiB 的实际边界包含 envelope 和 LF;64 MiB 私有快照、方法 allowlist、权限、摘要、超时及不确定结果恢复保持原契约。既有依赖共享常量的 capture/native-input 读取和 Todo/graph/history 批次同步采用新边界;宿主加载与展示预算独立。
直接依据是维护请求和已复现的完整上下文传输缺陷。关联
controller-executor-unified-contract-v0的共享 IO 路径;不声明 C1/C2 整体验收或真实模型收益完成。目标分支:main。Author Declaration
docs/development/testing-and-quality.md的 budget decision/real-path 契约,源版本6b2d56089ad52abdc103328437609bc749b9b49d;当前 wire 契约同步写入docs/reference/canonical-snapshot-pagination.md#shared-rpc-byte-budget。_encode_rpc_json;真实 context RPC、孤立代理项/控制字符/ASCII parity、独立 SHA 与尾部内容校验Scope And Continuation
这是完整、可回退的共享 RPC 切片。沿用 typed Effect owner 和现有 frontend/Lark/CLI 数据通路,没有新能力、配置页或执行权限。真实模型效果、安装后读回、长程净成本和独立采用仍由现有程序继续验收;本次原生资格仅覆盖下述静态推理的源码组合路径。本 PR 不安装、不发布、不合并。
容量对照固定 UTF-8 编码,以完整 hash-bound 1/3/6 MiB 合成来源读取后并发四个 6 MiB 请求;小 ping 来自独立 Python 进程。每种方案三次非 profiler 运行:
单独扩容的结果保留为不采用的对照。4 MiB 仍需对 6 MiB 来源走快照。选定方案仍有并发取舍:另外四个 3 MiB 请求并发时,8 MiB 下小 ping 最大值 72–101 ms,2 MiB 快照方案为 17–19 ms。以上为 Node 24.21.0 隔离实例的短时观测,不是稳定 p95/SLO。往返含编码、必要的安全拒绝/回退和结果验证,排除 fixture 构造及启动;峰值 RSS 包含整轮启动。四个大调用共享一个 Python 进程。原 2 MiB、90s/30s 等冻结资格不被本次生产容量调整追认为通过。
Validation
Current integrated head:
88a1b6196460dacb7e2c52a043b5726328612ec1, based on targetmain@d430c0396017bc9d53350e22126407f30b8bd653. Main's merged short reader references (#7812) are now exercised together with the 8 MiB proposal. Published history was preserved with a signed merge.The new native
app_progressive_largecase uses the real Codex 0.166.0-alpha.5.1 App server and loopback static inference, isolated SQLite authority and native home. It preserves the existing 30-second native deadline and original Turn:Current-head checks:
Current exact-scope receipt
cqr_7324bbd5de443d5b920c, fingerprint7324bbd5de443d5b920c67808dee56da3074eba028f434af6bb52d011776e00a, is valid:0 blockers and the original concurrent-IO warning retained. Initial metadata-format rejections wrote no receipt. Premerge initially completed6 direct +19 selected checks but rejected the stale prior receipt; that failure remains recorded. The new receipt resolves that policy mismatch; final exact-head standard premerge passes:6 direct +19 selected/executed checks,0 failures and0 manual holds. This grants no merge authority.Earlier qualification at
84d1cd606362a39ba1c911690287ebfd6edce4bffollows. All original production/doc blobs are unchanged after integration; the Goal transport test and new native case are covered by current checks. Prior full-suite, real PostgreSQL and cost results are retained evidence for those source blobs, not newly rerun full matrices or installed adoption.finished.synthetic,public_fixture.6b2d56089上因request_too_large失败,候选成功返回完整正文;原失败保留。cqr_dff5b95eff05fd78941c,exact scopedff5b95eff05fd78941c96b8a007504df98d4afd7503b7332eb71b07f6351ef0,24 files;safe-fix allowed/applied,1 bounded refinement pass,0 blockers;并发 IO 取舍作为 1 个 warning 保留。verifyvalid,standard premerge passed。789694fa42972db17acd47aa2604b1907060028dand source parent6b2d56089. The current integration and exact-head checks above supersede its former integration gap; independent review, current CI and maintainer merge authority remain separate.Frontend / Visual Evidence
UI impact:
none。既有入口和配置不变;没有 viewport、文档 chrome 或新操作界面变更,截图不适用。Type of Change / Area
Shared-authority fixture impact:没有 provider 选择、晋升、持久化 schema、score/task semantics 或 writer-fence 变更;真实 File/SQLite caller 与独立 PG conformance 已如上披露,不是新的 provider qualification。
Boundary Checklist
Bounded contention follow-through at
88a1b619保留上述原始容量结果。另以相同 Node 24.21.0、完整 Unicode 来源和四个并发 3 MiB 调用完成三组 2/8 MiB 对照;小 ping 使用独立 Python 进程。新一轮每次运行的小 ping 最大值:2 MiB 快照为 19.5–26.4 ms,当前 8 MiB inline 为 46.3–91.6 ms,原并发取舍再次出现。
一个自有 Node V8 CPU profile 的并发窗口中,增量 UTF-8
StringDecoder.write记录约 38.75 ms self,GC 为 1.25 ms self;哈希与响应编码也有开销。它只观察该 Node 进程,不能将 Python caller、系统等待或完整延迟都归因为这些栈。仅在隔离源码副本测试了一个反事实:保留 8 MiB 和既有语义 owner,累计原始 Buffer 后一次解码。三次运行的小 ping 最大值为 50.4–63.7 ms;其运行最大值的中位数约 63.0 ms,当前 inline 对照约 57.8 ms。虽观测到 Node 峰值 RSS 从 186.7–187.9 MiB 降至 163.2–173.7 MiB、大调用往返改善,当前证据没有建立可重复的小调用公平性收益,因此没有采用该反事实或修改最终生产源码。其完整协议负例资格也未宣称通过。
以上均为短时合成负载,完整来源内容读回断言通过;RSS 包含启动,CPU profile 与未剖析计时分开。保留共享宿主负载、caller 竞争及未观测成本的不确定性,不建立稳定 p95/SLO、实际模型采用或长程净收益结论。最终代码 head、8 MiB 上限、私有快照保护和原失败/未测记录保持。