Repository navigation
perf(chat): reuse runtime revision across HTTP POST dispatch - #7187
Conversation
Signed-off-by: aihop <4408344+hhyykk@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent | gpt-6.1-sol | OpenAI | runtime_reported | reasoning_effort=max
APPROVE — reviewed 4b63ba10995db5e7cebe8614bbfe77daf9c5d126 against immutable 0d55a3d8a22f3dece6a135aa817ed5ec04a26a0a. 当前结论只覆盖这个请求成本改进;CQR 与完整候选资格继续保留。
动机
在已授权工作区中重复打开或恢复项目会话的 Chat 用户,以及维护这个 HTTP 入口的开发者。 同一工作区连续恢复会话时,基线每个 POST 扫描源码8次;当前提交每请求1次,HTTP 状态和完整业务响应保持一致,授权撤销后仍拒绝,恢复有效授权后可继续。 隔离本地 HTTP 实验两次复核了8到1次扫描及约83到14毫秒的中位耗时变化;真实 TS 运行时与本地 Session 存储参与执行,未调用真实模型。
每次会话请求都重复扫描同一份源码,消耗本地时间并延迟会话返回;进程级永久缓存又会掩盖后续源码变化。 不缓存工作区授权、业务数据或 provider 结果,不改变界面、协议、调度、扣额或持久化规则;不宣称安装版、真实模型首答和长程收益已验收。 安装版采用、真实模型首答、完整必需套件与当前范围 CQR 仍需独立资格验证。
改动思路
把已有的可执行版本请求作用域放到 POST 外层:进入请求后第一次需要时读取源码版本,后续 typed 调用复用这个版本,退出时释放。原始路由、来源检查、工作区授权、provider 读取和 Session 存储仍由原 owner 执行。GET 已有同类边界;每个新 POST 仍会独立读取,不把一次成功授权缓存给下次请求。
复用既有请求作用域,只减少可执行版本重复读取;业务授权与 provider I/O 仍由原 owner 每次执行,没有新增状态权威。本 PR 只交付现有 HTTP POST 的请求成本改进及对应回归覆盖;真实模型、安装版与完整合并资格由现有 Chat/RFC 和维护者入口继续验证。逐路由另建缓存、长期缓存进程版本或缓存业务结果都更复杂,也会扩大失效与权限风险;这里直接使用现有 owner 与问题规模相称。
| 同一已授权会话请求 | 基线 | 当前提交 |
|---|---|---|
| 每请求源码遍历 | 8 次 | 1 次 |
| 重复恢复会话 | 200,原 Session | 200,同一 Session |
| 授权撤销或 symlink 改指 | 400,不写 Session | 400,不写 Session |
| 恢复有效授权 | 200,可继续 | 200,可继续 |
表中行为来自本次真实 loopback HTTP/TS runtime/本地 store 执行;模型协议为合成夹具,不是实际模型首答。
具体改动
关键代码讲解
ChatRequestHandler.do_POST新增现有 ContextDecorator。分派方法体的 AST 与不可变基线完全相同;来源拒绝、已有 POST 路由和异常出口都继续使用原分支。没有新 API、状态字段或配置。effect_runtime_request_scope本身未改动。它复用当前仍开放的上下文,锁保护首次解析,嵌套/复制上下文按引用计数离开,最终退出关闭并重置;已关闭上下文和新的独立请求会重新解析。它保存的是可执行源码指纹,不是工作区授权或业务查询结果。_runtime_fingerprint_for_request仍从这个 owner 取得版本;typed runtime 和 provider 的真实调用没有被替换。新增 HTTP 测试使用既有 ordinary project 夹具,验证两个独立 GET/POST 请求、会话复用、授权撤销后拒绝及无额外模型 turn。
完整 diff 是4个文件 +79/-0:2行生产接入、61行真实 HTTP 测试,以及英文9行/中文7行 RFC 记录。两份说明边界一致,双语检查通过。
独立验收依据是修改前的 TypeScript migration RFC,spec_revision 0d55a3d8a22f3dece6a135aa817ed5ec04a26a0a,尤其 Product conversations 与既有 public-read executable-revision scope。逐项映射:http-post-request-revision implemented,真实 POST 只做一次版本读取;fresh-authority-next-request implemented,授权与下次请求仍新鲜;chat-full-journey-qualification deferred,安装版、真实模型和完整候选验收仍归现有 RFC/维护者资格流程。新增 checkpoint 不反过来充当自己的规范来源。
对主干的风险
最值得担心的是“只通过 helper 测试,实际 HTTP 仍重复扫描”,以及“作用域过宽,撤销授权后仍沿用旧成功结果”。本次独立验证覆盖了这两个相反方向:
- 原 HTTP、ordinary Chat、项目上下文、CORS、图片与 request-scope 六组测试 108 passed。把唯一的 POST decorator 在私有反事实中移除,同一个新增测试得到 POST 1 failed(8≠1)/GET 1 passed,确认它能抓住原缺陷。原 owner 的11项测试继续覆盖嵌套、并发、解析失败重试、复制后关闭与下次源码变化。
- 固定同一真实 HTTP 入口、TS runtime 和本地 store,以基线/当前/当前/基线顺序做两次未插桩复核,每轮每侧20个测量请求,丢弃每块首个预热请求。第一轮中位数 82.97→13.68ms、p95 90.58→14.78ms;profile 后复核为 83.49→14.16ms、p95 91.21→15.83ms。每次源码扫描均 8→1。完整响应只排除5种具名观察时钟,其余状态、Session、授权、错误与 readback 都相同。
- unknown project、错误 body、未知路由、撤销与恢复均做完整响应对照;额外7组真实 HTTP 授权对照包含已覆盖工作区、同目录未授权项、激活后新建项、symlink 改指、恢复进展和新项显式授权。未授权新项不会自动纳入,拒绝不改 Session,恢复正确授权后确实返回200。
- Pyinstrument 5.1.3 在实际 HTTP handler 线程捕获非空 profile,并由原生诊断器读取;基线热点落在源码遍历/快照路径。外层 CLI profile 不覆盖服务线程,handler profile 也不覆盖 Node CPU、其他线程或真实模型等待。插桩权重没有充当上面的延迟数据或长程收益。初版私有实验把内部 root 配对误写成 Path 导致恢复步骤失败;记录保留,修正的是实验夹具,未把失败运行计入性能结论。
另外,同一 tests/test_chat_project_coordination.py 命令在基线与当前均为 2 failed /4 passed,失败身份与完整细节在只排除临时根、观察时钟、生成身份及其派生指纹后相同。它们直接调用 manager/runtime,不经过 HTTP;相关测试、reader 与生产路径 blob 未变,因此属于已复现的旧 canonical fixture 缺口,未称为本 PR 修好或通过。#7189 单独修这个夹具。
标准 premerge 的 6个 direct 检查、15个选中执行均通过,0 direct/run failure,包括双语、compile、架构、语义、预算与公开边界;工作流规定范围的 Ruff 和配置内17项 mypy 通过。额外全仓 Ruff 的98项错误,完整结果与不可变基线及 #7189 相同(临时路径也没有归一化);它们未被修复或称为全仓通过。原生汇总仍是 exit1 / quality_stale_receipt:旧 cqr_f5814cd6c32810f50267 未覆盖当前基线和 diff,需要当前范围重做。完整必需 suite、安装版与真实模型仍未资格验证,没有查询、等待或调度 CI,也没有放宽门。
我的整体评价
这是 justified_increment:现有生产 HTTP 路径上的可逆、可独立验收改进,已证明当前工作负载下的重复开销减少。long_horizon preserved:没有新增持久化义务、重试循环、调度或重复模型效果,不能据此宣称长程收益;user_experience improved:会话恢复固定开销降低,仍使用原入口与授权,额外配置/确认轮次为零。
检查完整 diff、do_POST 全部分派与现有 Chat 前端消费者后,确认没有布局、可见文案或交互流程变化,因此截图不适用;真实模型首答、安装版服务和未触及的完整 UI 旅程仍未资格验证。 不需要为这个2行接入再引入 helper 或配置层。当前没有发现本提交新增的代码级阻塞;旧夹具失败与 CQR/完整候选资格继续如实保留,批准评审不授予合并或安装权限。
English verdict: APPROVE at 4b63ba1. The existing request-scope owner is reused at the real HTTP POST boundary, reducing8source traversals to1. Independent108test passes, a failing baseline POST counterfactual, two uninstrumented20-per-arm ABBA runs and real grant/refusal/recovery comparisons support this bounded improvement. Two unchanged direct coordination-fixture failures are reproduced on immutable base and head. Stale exact-scope CQR and full/installed/model qualification remain separate holds; no CI observation or merge is implied.
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max
未发现本次改动引入的阻断项。源码评审结论为 APPROVE;已有全量测试与质量验收失败继续保留,不把这份代码意见当作合并许可。
动机
在本地 Chat 中反复打开已有项目会话的用户。过去一次恢复会话的 POST 会重复遍历同一份 TypeScript 源码树 8 次;现在同一请求复用一次代码修订解析,下一请求重新解析。在真实 HTTP、原生 TypeScript runtime 和本地 Chat 存储的合成工作负载中,重复恢复仍返回原会话,并把每请求源码遍历从 8 次降到 1 次。本 PR 不改变授权、会话数据读取或后台工作者规则,也不声称完成已安装服务、真实模型首答或长期收益验收。已安装服务、真实模型首答和完整 App/inbox 生命周期仍由原有产品与迁移验收继续验证。
改动思路
保留现有代码修订作用域 owner,HTTP 层只声明一次请求的生命周期;授权、存储和副作用继续由原 owner 决定。本次边界是完整 HTTP POST 分发的源码调用方接入,以及对应回归和双语 checkpoint;不新增缓存、桥接、状态或配置。这里复用的只是“本次请求使用哪一版可执行代码”,不会保存本次请求读到的授权或会话数据。比逐条 route 添加包装更完整,也比新增全局缓存更容易回滚。既有 CLI、portfolio 和后台 Turn 已使用同一个 owner,本次接入没有新业务规则或 TypeScript 桥接操作。
实际路径是 HTTP POST → 现有会话解析与授权检查 → 原生 runtime/本地存储 → 原 JSON 响应。源码作用域按需解析,异常和正常退出都走 finally 清理。独立恢复对照继续到了下一条有用结果:源码读取失败后重新打开会话,完成一个 native Turn,再重放原 client 请求,只启动一次。这样检验了恢复后的工作,而非只检查错误回执。此项吸收了既有恢复评审建议,但不把历史结论或记忆送达当作本次证明。
具体改动
判断依据是接受状态的 docs/architecture/rfcs/typescript-control-plane-migration-v0.md,修订 0d55a3d8a22f3dece6a135aa817ed5ec04a26a0a 的 Product conversations and asynchronous inbox、正确性与完整调用成本条款;没有用本 PR 新增的 checkpoint 自证实现。对应关系如下:code-owner-reuse 已实现既有 owner 复用;next-request-freshness 已验证每请求与并发隔离;live-authority-recovery 已验证实时拒绝、恢复和原请求去重;complete-caller-cost 已用相同真实调用负载比较,并保留安装/模型/长程边界。
完整差异为四个文件 +79/-0:生产代码仅导入和 decorator 两行;新测试 61 行;英中 RFC checkpoint 共 16 行。双语含义一致,没有新 schema、enum、参数或权限,沿用既有 executable-revision 词汇。相邻 #5248 的完整文件列表和共享文件补丁也已读:其 room-work 路由及 runtime handler 不提供另一套请求作用域,未发现此处重复建设。
关键代码讲解
ChatRequestHandler.do_POST(1653–1654):把完整 POST 分发纳入既有作用域;原 route 表、Host/Origin 检查和输入解析不动。非法 JSON、未知路径、外部 Origin 的真实请求仍为 400/404/403,完整错误相同,源码解析和会话写入均为零。effect_runtime_request_scope(381):这个未修改的 owner 以 ContextVar 加嵌套计数共享代码修订,在 finally 中 leave/reset;已有的源码变更、复制上下文、首次并发解析和下一请求测试一并执行。后台 worker 仍在_run_turn内建立自己的作用域。test_http_reuses_code_scan_but_rereads_revoked_grants(14):复用已有真实 HTTP fixture,保留 GET 对照,检查重复 POST 的原会话和撤销授权后的无副作用拒绝。把同一测试原样放到不可变基线运行,GET 通过而 POST 以 8 次扫描失败;当前两种方法均通过。
独立热请求对照采用不可变 base/head 的 A/B/B/A 顺序;每块先预热 3 次,再测 20 次,计时期间没有扫描计数插桩。扫描数由另一次并发请求单独观测。两版使用相同合成 fixture、真实 HTTP、原生 TypeScript runtime 和本地 Chat 存储,仅 Codex 协议端为替身。
| 观察 | 基线 | 当前 head |
|---|---|---|
| 测量请求数 | 40 | 40 |
| HTTP 中位延迟 | 82.10 ms | 16.44 ms |
| HTTP p95(nearest rank) | 91.70 ms | 18.77 ms |
| 每个并发 POST 的源码遍历 | 8 | 1 |
该负载中中位延迟约降 80%;这是暖态会话恢复的完整 HTTP 源码观测,不推算真实模型首答、冷启动、已安装服务或整体净成本。
对主干的风险
主要反例是代码缓存意外变成授权缓存,或故障退出污染后继请求。独立真实 HTTP 对照在同一请求第一次读取后撤销工作区授权:两版都返回相同 400,独立存储读回不变;恢复授权后都继续原会话。另一个对照注入一次源码解析失败,保留原错误,后继请求成功创建会话、完成 native Turn,并以相同 client id 重放得到原 Turn,协议端只收到一次启动。两个并发恢复请求各自解析自己的代码修订。上述完整负例结果在 base/head 相同。
本次独立执行 112 项 HTTP/普通项目/CORS/图片/请求作用域测试全部通过;标准 premerge 的 6 项直接检查和 15 项选中检查通过,含编译、双语、语义词汇与公开边界检查。仓库声明的 CI Ruff 范围、两份改动 Python 文件及配置的 mypy(17 文件)通过。没有查询或等待远端 CI。
以下失败没有删除或改成通过:test_project_evidence_scopes_before_reads_and_rejects_remote_and_other_goal 与 test_external_input_cannot_reuse_the_project_turns_private_read_handler,两版完整模块均为 2 失败/4 通过。前者得到 unavailable 的 canonical Todo source、缺少预期条目,后者首个 web Turn 因同类证据缺失而 failed。这些测试直接调用 manager/runtime,不经过 do_POST;六个相关源码/测试 blob 完全未改。完整失败身份和结果细节经仅去除时钟、生成 ID 与地址的规范化后相同。额外扩大 Ruff 至 loopx/tests/examples/scripts 得到的 44 条诊断也在两版逐条一致、对应源码未变;该范围超出仓库 CI lint,CI 指定范围通过。
严格质量验收仍按这些失败保留 fail,整体 premerge/质量资格未通过;未降低门槛、修改预算或把必需检查改成可选。源码意见依当前“独立归因旧失败、单独覆盖改动不变量”的评审政策给出。完整仓库资格仍需对应 owner 修复并重验。公开可复现入口是 tests/test_chat_http_runtime_scope.py、tests/control_plane/test_effect_runtime_request_scope.py 和上述 coordination 模块;补充故障/并发测量 fixture 为独立本地探针,未作为公共复现文件提交。
语义与 CI 对齐
本次是 reuse_existing:源码身份的请求生命周期改变已在双语 checkpoint 披露,存储、授权和通用工作/额度语义不变。必需验证与合并资格继续独立执行;已有失败不会因计数下降或审阅批准消失。
我的整体评价
交付判断为 justified_increment:完成一个能独立回滚和验收的真实调用方接入。long_horizon 为 preserved:重复、并发、故障后的继续工作及原请求去重在这条路径保持;没有证明整体长程收益。user_experience 为 preserved:原入口、错误、恢复路径与授权边界保持,没有新增设置或确认轮次,合成暖态准入成本改善。do_POST changes executable-identity lifetime only; no rendered presentation changes in Chat or the inspected companion routes. Installed-service behavior and real-model first-answer latency were not tested.
保留现有代码修订作用域 owner,HTTP 层只声明一次请求的生命周期;授权、存储和副作用继续由原 owner 决定。本次边界是完整 HTTP POST 分发的源码调用方接入,以及对应回归和双语 checkpoint;不新增缓存、桥接、状态或配置。代码体积与已复现问题相称,直接复用既有 owner 已是本次采用的有界简化,继续增加 wrapper 或配置没有依据。APPROVE 只针对精确 head 4b63ba10995db5e7cebe8614bbfe77daf9c5d126 的源码改动;全量测试、严格质量验收及安装/真实模型/完整 App 生命周期仍保持各自未通过或未验证的状态,合并需要单独满足当前资格与授权。
English verdict: APPROVE — exact head 4b63ba1. The existing runtime scope reduces real warm Session POST traversals from eight to one; independent matched HTTP/native-runtime/local-store checks preserve live grants, concurrent requests and useful once-only recovery. The focused 112 tests and 6 direct/15 selected checks pass. Two unchanged coordination failures and 44 identical out-of-CI-scope lint diagnostics remain failed; strict quality/full-suite qualification stays held. Installed service, real-model latency and long-horizon net benefit are unverified.
Goal And Delivered Outcome
Repeatedly opening an existing Chat Session rescanned the TypeScript source tree eight times in one HTTP POST. Join the existing
effect_runtime_request_scopeatChatRequestHandler.do_POST, so typed calls share one executable revision. The next request resolves it again. Session, grant, provider and authority reads remain live; background Turn workers keep their own scope.Basis: the TypeScript migration RFC's caller-adoption direction and the overall roadmap's S1/S2/S10 admission-cost work, at main
0d55a3d8a22f3dece6a135aa817ed5ec04a26a0a. Intended base:main. This completes a bounded caller adoption, not the full App/inbox journey.Author Declaration
docs/architecture/rfcs/typescript-control-plane-migration-v0.md, “Product conversations and asynchronous inbox,” at the base above.Scope And Continuation
Two production lines; regression coverage and synchronized RFC checkpoint. No new interface, dependency, bridge operation, state cache or provider route. GET remains unchanged. No UI presentation change.
Reviewed all 31 open PRs and their paginated changed-file lists; refreshed heads before submission. #5248 touches the same file only to add room-work route entries, not request scoping. #5958 changes a separate contract hot path and RFC section. Existing peer-delivery (#7182) and recovery (#3412) work is not duplicated.
Validation
4b63ba10995db5e7cebe8614bbfe77daf9c5d126(tests ran against identical source before the commit).Warm same-host A/B: 20 measured requests per arm, alternating base/scoped/scoped/base blocks; discard each block's first request. Base uses the unchanged POST implementation without the decorator. Same Session and workload, real HTTP/runtime/storage, synthetic Codex protocol.
This is about 81% lower median admission latency for this warm workload, not installed-service, real-model first-answer or long-horizon benefit qualification.
tests/test_chat_project_coordination.pyBaseline failures:
test_project_evidence_scopes_before_reads_and_rejects_remote_and_other_goalandtest_external_input_cannot_reuse_the_project_turns_private_read_handler. They remain unresolved here; full CI and merge readiness are not claimed.Shared-authority RFC fixture impact
No schema, authority semantics, provider routing or compatibility projection changes. The test exercises real local Chat storage and runtime transport. File/SQLite/PostgreSQL authority promotion and installed adoption are out of scope.
Boundary Checklist