Skip to content

Legacy 是怎么给 session 起任务名的:SessionStart 自报注册的机制、耗时与超时故障 #280

Closed

Description

@Simon-AI-coding

Part of #273

Question

第一代(GPT-VoiceCoding-legacy,基准 commit 1d32845)是怎样在每个 session 启动时完成注册并让 session 自报一个任务名的?要查清并写成事实:

  1. 机制:SessionStart hook 到 daemon 的注册链路,自报名字的提示词、校验(labels.py)、落库(store.py)、不可变规则,以及 Claude / Codex 两条 lane 各自的路径。入口线索:bridge/hook.py:215-253、bridge/labels.py:20-70,73-106、bridge/daemon.py:1504-1544、bridge/store.py:1875-1902、bridge/hook.py:68-75,96-109,119-207,281-301、bridge/daemon.py:1192-1257、preflight.sh:65-107。
  2. 时序与耗时:注册 + 起名在用户流程里处于什么位置,同步还是异步,等待多久,超时值是多少,超时后发生什么(用户反馈:经常超时,导致流程中断)。
  3. 故障模式:legacy issue tracker(gh issue list -R okqixiaobao727-design/GPT-VoiceCoding-legacy --state all)和 docs/ 里关于起名 / 注册超时、名字缺失、重复起名的记录。
  4. legacy 自己对 ai-title 的测量(labels.py:73-84 附近提到 30% 从不写、中位数晚 440 秒):测量方法、样本、结论。
  5. 值得保留的部分:哪些校验规则 / 不可变语义 / 产品判断值得带到新方案,哪些是要摆脱的(启动时同步动作、需要 session 配合、超时)。

结论写到 docs/research/2026-09-07-legacy-session-naming-self-report.md(本地文件),每条事实带 legacy@1d32845:<file>:<lines> 引用;摘要贴回本票作为 resolution comment 后关闭。不做方案设计,只给事实。

Activity

  1. Simon-AI-coding commented on Sep 7, 2026

    @Simon-AI-coding
    OwnerAuthor

    研究已完成,事实写入 docs/research/2026-09-07-legacy-session-naming-self-report.md(本地文件)。以下是摘要。

    机制

    • SessionStart hook 注册时若 session_label 仍为空,daemon 回传的 additionalContext 会指示 session「在做其他任务动作之前」先执行 bridgectl session-label --title '<标题>' 自报一个简短、可读的任务标题(legacy@1d32845:bridge/hook.py:215-233)。这条指令对 Claude/Codex 两条 lane 文案完全相同——这本身就是修复「issue The unit suite fails at collection when the [acceptance] extra is installed: bare from conftest import is captured by tests/acceptance/conftest.py #93」(Codex 原本独享自报,Claude 靠读自己的 ai-title)的产物(hook.py:217-220)。
    • 校验在 labels.py:标题去空白后不能为空、不能多行;项目名不是配置项,而是对 cwd 跑 git rev-parse --git-common-dir 验证得到,任何异常都直接报错、绝不猜测(legacy@1d32845:bridge/labels.py:20-70,95-106)。
    • 落库 set_session_label(store.py:1875-1902)是唯一写入口:未命名→写入;重复写相同值→幂等 no-op;写不同值→拒绝(StoreConflict),不可变。register_session 的 ON CONFLICT DO UPDATE 明确不包含 session_label 列,所以重连/resume 不会清空或触发重新命名(store.py:1644-1666)。
    • 重名不是写入时拦截,而是每次读花名册时按字符串精确匹配活跃 session 统计冲突,标记 session_label_duplicate: true,语音端被要求强制追问一个新的口头区分词,在拿到干净结果前不得继续 progress/relay/message/close(daemon.py:1049-1063;host.py:45-59)。
    • Codex 比 Claude 多一道门槛:必须先有绑定好的 runtime lease + terminal endpoint 才能注册成功,否则直接 unmanaged_session 报错,根本走不到起名分支(daemon.py:1229-1234);Claude 无此前提。

    时序与超时

    • 自报动作是同步的:hook 只是发出指令,真正的 bridgectl session-label 调用是 session 自己回合里「在处理用户真实请求之前」执行的一步工具/命令调用。
    • 全链路里能查到的超时常量:hookTimeoutSeconds=3s(Claude Code/Codex 自己对 hook 子进程的超时);clientTimeoutSeconds=1.5s(session-label 命令与 daemon 之间那一次本地 socket 往返的超时);launchRegistrationTimeoutSeconds=60s(这是另一件事——项目启动到 hook 注册的整个进程起壳预算,与逐 session 自报起名无关)(均见 legacy@1d32845:config.plist:397-467)。
    • 关键结论:仓库里没有专门为「自报起名」这一步设的超时常量。 唯一有编号的那 1.5s 只覆盖 daemon 的 socket 往返,模型自己生成标题、发起工具调用所花的时间完全不设上限、不受度量。用户反馈的「经常超时」更像是这个无界同步步骤本身的症状,而不是某个具体超时数值调得太短——对照之下,launchRegistrationTimeoutSeconds 是真被实测过并调大过的(观测到 5.7s/9.7s/22.7s 对 1.5s 预算,issue Step 0: put the written record in order — supersede the charter, point the repo at legacy #59),起名这一步没有类似的调优记录。
    • 失败时的官方约定:指令原文写明「exit 0 才能继续;失败了如实报告,不要猜测」(hook.py:232)。一个还没起名就 Stop 的 session 是被架构预期并接受的正常状态,不会阻塞 Stop/progress(test_bridge.py:26312-26340)。

    故障模式

    legacy 对 ai-title 的测量

    值得保留 vs 应当摆脱

    保留(legacy 自己给出的理由):

    • 不可变、幂等重复、冲突拒绝的单一写入口语义(store.py:1878-1888)。
    • 名字明确禁止充当消息目标,协议层直接拒绝而非约定(daemon.py:1536-1543)——这正是 任务名应该显示什么:Session Name 的 task 半边的来源规则 #273 想要的「地址 vs 名字」区分,legacy 已经在协议层做过一次。
    • 项目名解析、标题校验都是「查不清就报错,绝不猜测」,没有静默兜底(labels.py:27-70,100-104)。
    • 花名册时点的实时查重 + 强制口头追问,而不是写入时的唯一性约束(daemon.py:1049-1063;host.py:45-59)。
    • 注册与起名架构上彻底分离:注册永不携带名字,「这样起名故障就不会变成一个没人看见的注册结果」(store.py:1657-1663;daemon.py:1244-1247)。

    应当摆脱(legacy 自己的动机 + #273 已定的立场):

    • 要求 session 自己配合、在启动早期做一个阻塞性动作——这正是 legacy 把「读 ai-title」换成「自报」时所做的取舍:用「同步但需要模型配合」替换了「异步但不可靠」,而 任务名应该显示什么:Session Name 的 task 半边的来源规则 #273 要摆脱的正是前者。
    • 没有专门超时、没有实测过worst-case 的同步启动步骤——「经常超时导致流程中断」的用户反馈与仓库里查不到的、专门为这一步调过的超时常量吻合:不是某个数值太小,而是这一步天生无界。
    • port-table 的 P10 行已经独立得出同样结论,2026-08-25 已修正为 Codex 一侧彻底放弃自报入口(daemon route 没有 hook ingress),未命名的 Codex 线程改用本地拼出的 <project> · <短 thread id> 展示名,不再要求 session 配合。

    详见 docs/research/2026-09-07-legacy-session-naming-self-report.md。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions