Skip to content

任务名应该显示什么:Session Name 的 task 半边的来源规则 #273

Closed
3 of 3 issues completed

Description

@Simon-AI-coding

Destination

一条锁定的规则,说明 Session Name 的 task 半边(用户听到、看到的「任务名」)从哪里来、是否允许变化、在语音和 Telegram 里怎么和地址分工。写成能直接交给 build 票的 spec:取值逻辑只落在 adapters/agent/_naming.py 这一个纯函数及其输入事实;寻址侧删掉按名寻址;CONTEXT.md 的 Session Name 词条改写。这一次从根上解决,不再局部修补。

已到达(2026-09-07):spec 见 The task half of a Session Name describes the Session: read from the agent's own records, climbing to a better source, never an address,标签 ready-for-agent。

Notes

  • 本地图全程用中文沟通。
  • 决策票一律走 /grilling + /domain-modeling;研究票走 /research 子代理(sonnet),结论写进 docs/research/(本地文件,gitignored),并把摘要贴回票里。
  • ADR 0010:任何行为改动必须引用 legacy 同一行为(legacy@1d32845:...)并注明 ported / adapted / dropped。legacy 仓在 ~/Documents/coding/GPT-VoiceCoding-legacy。
  • 立场:新方案不能要求用户或 session 在每次启动时多做任何动作,也不能有会超时、会阻断用户流程的同步步骤。legacy 的「启动即注册 + 自报名字」正是要摆脱的东西。
  • 设计立场(2026-09-07 Simon):简洁、用户无感。启动不多一步,没有注册、自报、同步等待;名字变化不播报。
  • 官方能力已查清,见下方「原始背景与事实」;不再重复调研 Claude Code / Codex 官方文档,除非某张票明确指出缺口。

Decisions so far

  • Legacy 是怎么给 session 起任务名的:SessionStart 自报注册的机制、耗时与超时故障 — legacy 在未命名的 SessionStart 上用 additionalContext 要 session 先跑 bridgectl session-label 自报标题:同步、前置在模型自己的回合里,整步没有任何超时上限(只有 hook 3s / socket 1.5s 的局部预算),「经常超时」是设计使然而非参数没调好。值得留:不可变且幂等的名字语义、名字不是消息目标、校验不做静默回退、撞名实时检测。要丢:要求 session 配合的阻断式启动动作。ai-title「30% 从不写 / 中位数晚 440s」只有文字引用,无脚本无数据,不可复核。详见本地 docs/research/2026-09-07-legacy-session-naming-self-report.md。
  • 描述性任务名最终用哪套来源规则 — 替换,不加新概念:task 半边就是描述性名字,寻址只靠 id。Claude 四级(自定义名 > AI 标题 > 清洗后的第一条提示 > 派生名),Codex 三级(非临时的 Thread.name > 清洗后的 preview > 短 id),兜底级保证永远有名。只升不降、同级跟最新值、不播报。删掉 Telegram @名字片段: 写法;撞名沿用 (地址) 后缀。落地:CONTEXT.md 词条改写、ADR 0024。

Not yet specified

(空。三处雾区都在「描述性任务名最终用哪套来源规则」里定了:语音/Telegram 分工无需改变,撞名沿用地址后缀;CONTEXT.md 不新增词条而是改写 Session Name;原型被划出范围。路已清,spec 票见下。)

Out of scope

  • 地址半边(Claude 派生名 <dir>-<2hex>、Codex 线程 id 前 8 位)的规则不动,它已经稳定,本地图只管描述性的 task 半边。
  • Claude Code 自身 AI 标题的生成时机不受我们控制,不做任何绕过其官方行为的 hack。
  • 原型:选定的来源规则在真机上是否拿得到名字、多快、多稳 — 已关闭。Simon 决定跳过原型直接开发;来源都是已在读的文件,有效性由 spec 的测试和真机验收覆盖。

原始背景与事实(2026-09-07,地图建立前的原文)

背景

Session Brief 的模板要求「项目名 + 任务名 + agent + 状态 + 一句话 + 决策」。今天「任务名」这一栏两条 lane 取到的是性质不同的东西:

  • Claude:claude agents --json 的 name,是 Claude Code 派生的地址(目录 slug + 2 位 hex,如 gpt-voicecoding-4c),不描述 session 在干嘛。
  • Codex:daemon 的 Thread.name(Codex 自动生成的标题,如「审查共享应用服务器」),没有时退到线程 id 前 8 位(如 01a078f6)。

CONTEXT.md 的 Session Name 定义只覆盖「可回喊的地址」(<project> · <task>,task 是 agent 自己的名字,稳定不变),对「描述性的名字」没有定义。

事实(2026-09-07 调查)

Claude Code 官方的 session 名优先级(/resume 列表显示的就是这个,见 code.claude.com/docs/en/sessions.md、statusline.md):

  1. /rename 或 claude --name 设的自定义名(登记表 name,nameSource 不再是 derived)
  2. AI 生成的标题(转录里的 ai-title 记录;statusline 的 session_name 字段;接受一个 plan 时按 plan 重新生成)
  3. 第一条提示的节选
  4. 派生名 <dir>-<2hex>

派生名不会被 AI 标题覆盖,所以地址是稳的。hook 读不到也设不了名字。AI 标题的触发时机文档没写。

今天 5 个 Claude session 的 ai-title 实测:5/5 有标题,全程不变;2/5 在第 1 条提示后生成且准确;3/5 在第 3 或第 4 条提示后生成,抓的是中途某句而不是主题(如本 session 主题是「停机播报只有提示音」,标题却是「Sonnet agent investigation」)。被跳过的第 1 条都是斜杠命令或以图片开头。第一条提示节选本身也有 /model;、[Image #1]… 这类难看的情况。

Codex 同构:Thread.name > Thread.preview(第一条用户消息)。adapter 已会剔除临时标题。

待定

  1. 描述性名字的来源优先级:照搬 Claude Code 自己的优先级(自定义名 > 生成标题 > 第一条提示节选),还是只用第一条提示节选。
  2. 是否允许它变化(节选 → 标题 → 用户改名),还是像地址一样冻结。
  3. 语音里描述性名字与地址的分工:默认报描述,只在同项目下撞名时补地址?Telegram 第二行保留地址,是否加一行描述。
  4. 是否要在 CONTEXT.md 增加一个词条把它和 Session Name 区分开。

依赖

「任务名统一成一个字段」的 spec 完成后,「任务是什么」的选择收在 adapters/agent/_naming.py 的一个纯函数里,两条 lane 只喂事实。本票的改动应只落在那个函数及其输入的事实上。

Activity

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

    @Simon-AI-coding
    OwnerAuthor

    Closing:本地图的目的地已到达。

    没有遗留未跟踪的部分。

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions