interim · hook 超时热修记录
轮次报告全文 · 逐字真源投影
本页是轮次报告的逐字投影(仅隐私清洗,零改写)。渲染不了的元素退化为代码块原文。
时点提示:本页是仓内文件 adhoc_jobs/context_infra_migration_20260709/runs/interim_20260716_hook_timeout_fix/RECORD.md 的逐字投影(仅做隐私清洗:仓库根绝对路径→相对路径、家目录→~/;除此零改写)。若源文件后续有修订,以仓内真源为准。
报告元数据(frontmatter)
doc_type: interim_maintenance_record
program: context_infra_migration_20260709
date: 2026-07-16(r012 收口后同日晚)
session_id: 2c406f57-d22f-4910-aa31-5920a7805eff
kind: 旧根维护修复(run 间隙,非 rNNN run,不承担 RUN_TEMPLATE 收口义务)
append_only: trueInterim 记录:旧根 UserPromptSubmit hook 超时修复(P-011 冻结的用户当次授权例外)
1. 授权与例外边界
用户 2026-07-16 报告「UserPromptSubmit hook timed out after 10s — output discarded」反复出现,并指示:在 context-infra 内部处理该问题以确保内部准确性;不接受仅靠延时解决,优先保证实现效率,必要时可以延时,但必须让预期的 hook 工作正常进行;同时要求评估此修改对重构现状说明与后续迁移过程的影响。
P-011 冻结约束(迁移期旧仓功能面零修改,program 记录区 append 除外)对本次修复构成例外场景:本次修改由用户当次指示授权,例外仅覆盖本记录列出的变更清单,不构成对冻结约束的一般性放松。r012 FINAL_REPORT 及其 claim 覆盖矩阵中「旧根功能面零修改(三维独立复核)」诸声明的有效边界 = r012 收口时刻;其后的变更以本记录为准。
2. 根因判定(证据锚)
- hook 自身效率已在地板:
contexts/runtime/hook_latency/latency.jsonl643 样本(07-06→07-16)cpu 面恒定 ~90-200ms,wall p50=195ms / p95=1.9s / p99=5.2s / max=7.2s。07-07 两轮 SLO postmortem(tools/test_health/hook_latency.py模块 docstring)已把判决面锚到 cpu,结论一致:wall 拉长=机器负载争用,非代码路径回归。 - 修复当时实测:load average 峰值 583/598/619(8 核,
sysctl vm.loadavg),同刻 5 次 hook 实测 cpu 恒 0.19s、wall 0.95-2.71s。负载风暴窗(Codex/编排 fleet + ChatGPT.app git 子进程 + 系统索引同窗)把 0.2s CPU 的进程拉过 10s deadline。 - 超时的隐性代价(比可见报错更重):route_on_prompt 原实现把消费型状态写(dedup 标记 / correction 清除 / arm 标记 / receipts)放在打印 stdout 之前;超时被杀时输出被 Claude Code 丢弃但状态已消费,该 session 的 dao 注入永久丢失(dedup 判已注入不再重发)、pending correction 被吞。
3. 变更清单(例外的全部范围)
tools/skill_router_hook/route_on_prompt.py:新增 deliver-then-persist——main()收集 deferred closures,stdout flush 后才执行全部消费型状态写;route_prompt(deferred=None)保持旧行为(bridgetools/hook_bridge/governance.pysubprocess 路径自动获得新语义且兼容)。新增_run_or_defer;_pending_correction_directive/_auto_arm_directive增加 deferred 参数。phase cursor 推进(_phase_directives内部)保持 inline:超时丢一轮指令但下轮自愈,其内 correction 清除属过时边注,不做 defer(判定记录于代码注释)。tools/skill_router_hook/test_route_on_prompt.py:修复 2 个存量失败测试(test_reassessment_adds_missing_skill_before_phase_directive/test_reassessment_prompt_epoch_allows_repeated_prompt_next_epoch,补RUNTIME_REASSESS_SHADOW=0隔离——它们自仓库runtime_config.json翻转 shadow=true 起就在挂,属测试隔离缺陷非本次引入);新增 2 个 deliver-then-persist 契约测试。49/49 全绿(修复前基线 45 passed / 2 failed)。~/.claude/settings.json(全局,不在任何 git 仓库):17 处 hook timeout 10→30s(UserPromptSubmit route_on_prompt、SessionStart 全部含 _MANDATORY 注入器、PreToolUse git_guard、PostToolUse usage_hook、SessionEnd reap)。Stop hooks 维持 30/60 不变。context-infra/.claude/settings.json:2 处 PostToolUse(fa11_capture、bash_test_record)timeout 10→30s。
未改动:注入内容与 v3 形态、dao 路由逻辑、新根 ~/infra 全部文件(route_hint.py 未动)、Stop hook 链路。
4. 对重构现状说明与迁移过程的影响评估
- #ISO-FENCE(波次 1 新增单元,r012 FINAL_REPORT §波次增补):其对象文件
route_on_prompt.py形态已变。实施前义务:以修改后的文件重新锚定(行号/结构引用不得沿用 r012 前快照)。fence 的设计方向(旧根写入运行时拒绝 + 独立 HOME 测试底座)与本次修复正交:deliver-then-persist 不改变跨根注入行为,F-1 悬空指针污染坐实结论与 r012-R2(反向波及六边未消除)均维持有效。timeout 10→30 的一个副作用:负载风暴窗内旧根 hook 对新根 session 的最长阻塞从 10s 变 30s——这加重而非减轻 #ISO-FENCE 的必要性,波次 1 优先级建议维持。 - r012 FINAL_REPORT「旧根功能面零修改」:声明在 r012 窗口内仍真;有效边界见 §1。已在该报告尾部 append post-close addendum 指向本记录。
- route_hint.py(新根 Layer A)评估结论(只评估未修改):已有 0.8s SIGALRM 自我超时 + fail-open,CC 层 10s 超时打不穿它;但存在两个同族残差——①claim-before-emit(
_claim_once在_emit之前,被杀窗口内 skill 被标记已建议但从未送达,窗口极小);②负载风暴下 0.8s wall 预算内含全 skill 文件 digest 校验(O(全部 skill 文件读取)),会静默零候选。二者建议挂 #ISO-FENCE / 波次 1 附加件一并处理(与 r012-R3 triggers 空值警示同批顺路)。 - latency SLO 面:
hook_latency.py的 SLO_MS(route_on_prompt 2000ms wall 口径)与 cpu 面判决不受影响;本次未改探针。 - 版本判定(workflow_version_evolution):hook 实现改动不在 SOP 范围(§0 范围明示排除 hook 实现)→ 不打版;settings hooks 段属「配置即承诺」类 → 判 Y 级(调度参数变化、无下游改造负担),tag 建议
hook_hardening/timeout-30s-20260716,阻塞原因=变更经 session-ref 流转、尚未落 main;载体到位后由后续 agent 补 tag。
5. 负载源观察(未处置,留用户决断)
修复只解决「风暴窗内 hook 送达」,不消除风暴本身。当日观察(ps 快照,处置均属跨 session/跨系统动作,按 DECISION_BOUNDARIES 留用户):
- ChatGPT.app 持续对本仓跑 git 子进程(
ls-files/add -u/diff 类,快照见 11 个子进程)——BUG-016 同签名,断路器建成后该 app 仍在扫描。候选处置:在 ChatGPT/Codex app 侧把本仓移出工作区,或系统级限制其文件访问。 - 孤儿
commit_wrapper.sh --session-ref-only:单实例跑 1h43m 仍未退出且新实例持续产生——Stop hook 60s 超时杀 hook 进程但不杀其子进程链,wrapper 成 ppid=1 孤儿继续空转 git(泄漏类,与 04-19 修过的 pathspec 死亡 bug 不同源)。候选处置:wrapper 加自杀式 watchdog(超过阈值自清)或 Stop hook 改 process-group kill;属旧根 git 功能面,未经授权本次不动。 - 22 个常驻 codebase-explorer MCP python + 22+16 uv + 12 codex:多为各活跃 session 的 MCP 服务进程,随 session 生命周期累积;0% CPU 但加剧内存/调度压力。候选处置:清理策略进 event-cleanup cron 或 MCP 配置改按需启动。
6. Claim(A-1 四态词表)
- deliver-then-persist + timeout 30s:built(代码+配置落盘)、wired(settings 指向已生效,stdin/CLI 双模式 live 验证输出正常、deferred 落盘顺序经契约测试)、effective=部分证据(49/49 测试 + live 快路径验证;「风暴窗内不再丢注入」的真实场景样本要等下一次负载风暴自然发生,无法合成)、steady=未主张。
- 测试隔离修复:built + wired(suite 绿)。
7. 独立扫描对账(refactor-doc-scan agent,本节为收口补充)
独立 sub-agent 全程序扫描与主线自查交叉后的增量结论:
- V5 验证结论时效边界:r012
evidence/VERIFIER_VERDICT_r012_landing.mdV5(旧根功能面零修改三维 PASS)的机械枚举法(find -newermt "2026-07-16 00:00")重跑将命中本次修改的 3 个文件。已在该证据文件尾部追加时效注记(PASS 仅锚定其验证窗口;命中映射到本记录)。 - r010-R4 残差复核(本次触碰过 settings.json,必须核):idx 7/8/9 三个注入器槽位本次仅 timeout 值 10→30,槽位仍在、仍为死槽(
rules/_MANDATORY.md实测 7 条,idx 7/8/9 越界静默无输出)。r010-R4 残差原状维持有效,无需更新状态,仍随「旧根也换」一并清。 - P-011 冻结表述的实际落点(供后续 run 引用):分散于 r012
units/U-INJECT-V3/INJECT_V3_SPEC.md:76/78(「旧根零修改」「不动 SessionStart 之外的旧根任何 hook」,均为该单元自身范围声明,本次修复不使其失真但并读时有歧义风险)与 GLOSSARY #ISO-FENCE 词条(已补实证案例指针)。design/REFACTOR_PLAN.md正文无此措辞。 - MIGRATION_LOG(
~/infra/MIGRATION_LOG.md)确认不收本次记录:其角色为新根进物账,旧根侧小修按 r010 RUN_LOG「配套小修(旧根,档 A 可逆)」惯例记录;因 r012 已收口且无活跃 run,本 interim 记录即该惯例的 run 间隙形态,r012 FINAL_REPORT addendum 为指针(单一真源,不再第三处复制)。
8. 第二批(2026-07-17,P-014 授权,hook×负载族 HL 立项)
P-014(ORIGINAL_PROMPT.md#P-014,逐字已录)给出五项持续优化指示+元原则(hook 修改必须锚定其产生需求)。问题域真源=design/OPEN_PROBLEMS.md(HL-1..HL-5,本节只记当日旧根变更清单,方案与证据不复制)。
当日变更(本批例外范围):
tools/git/stop_hook.sh(旧根 git 功能面,P-014 ②):孤儿守卫落地——wrapper 调用包timeout -k 5 $((45-已耗秒))s(GIT_STOP_HOOK_WRAPPER_BUDGET可调,无 timeout(1) 退化为原调用),rc=124 走既有失败引导。原始需求(turn 改动最终被捕获、绝不失败 session)不破:超时改动留工作区,下一 turn/cron 重试。验证=bash -n + 隔离语义 smoke(rc=124/env 透传/空守卫退化)+ 后续每个 session Stop 的真实运行(日志锚orphan guard armed)。相邻存量:tests/e2e/invariant_stop_hook.sh4 组合 FAIL 为四月存量(复测确认非本次引入),登记 HL-2。- BUG-016 断路器退役(P-014 ① 条件式指示,条件评估成立;非 repo 功能面):daemon pid 14837 停止、live crontab keepalive 行摘除(备份
~/.cache/context-infra/crontab_backup_before_breaker_removal_20260717_003714.txt)、config/CRONTAB.md同步(含恢复路径)。判据=锚定 Codex.app 已不在系统、末杀 07-09、8 天零击杀、风暴期自盲。ChatGPT.app 残差=HL-1 OPEN(量化先行)。 - 现存孤儿 wrapper 清理:07-17 复查 ppid=1 孤儿已全部自行退出,零陈锁(lock_watchdog 亲核)。
- 程序记录面:
ORIGINAL_PROMPT.mdappend P-014;新建design/OPEN_PROBLEMS.md(问题域登记簿,README 已加指针行并修 P 范围)。 - HL-3 已执行(P-014 ③,非 repo 功能面):双注册点全摘——
~/.claude.jsonuser-global mcpServers 键(备份 claude_json_backup_before_mcp_removal_.json,其余 22 server 完好)+[codex-path][mcp_servers.codebase-explorer]段(备份 codex_config_backup_before_mcp_removal_.toml;第二注册点系独立调研 agent 交叉验证发现,主线初查漏此点)+ 常驻实例 TERM 清零(21-22 对 uv/python)。判据=tool_use 调用 0(30 天窗口,末次真实调用=06-17 E2E 验证跑)+ receipts 0 + 零运行依赖。实现目录保留。细节见 OPEN_PROBLEMS #HL-3。 - HL-4 已执行(现状说明更新,旧根文档面):
tools/INDEX.mdskill_router_hook/stop_hook 两条目(补 30s+deliver-then-persist+孤儿守卫、删过时 revert detection 声明)、tools/git/AGENT_GUIDE.mdFlags 节(修失效行号锚+新增GIT_STOP_HOOK_WRAPPER_BUDGET文档)、tools/phase_state/README.md:31-33(10s→历史口径;主线初判不动被独立盘点 agent 复核推翻后采纳)。判定不动清单见 OPEN_PROBLEMS #HL-4。