Repository navigation
任务名应该显示什么:Session Name 的 task 半边的来源规则 #273
Description
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):
/rename或claude --name设的自定义名(登记表name,nameSource不再是derived)- AI 生成的标题(转录里的
ai-title记录;statusline 的session_name字段;接受一个 plan 时按 plan 重新生成) - 第一条提示的节选
- 派生名
<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 已会剔除临时标题。
待定
- 描述性名字的来源优先级:照搬 Claude Code 自己的优先级(自定义名 > 生成标题 > 第一条提示节选),还是只用第一条提示节选。
- 是否允许它变化(节选 → 标题 → 用户改名),还是像地址一样冻结。
- 语音里描述性名字与地址的分工:默认报描述,只在同项目下撞名时补地址?Telegram 第二行保留地址,是否加一行描述。
- 是否要在
CONTEXT.md增加一个词条把它和 Session Name 区分开。
依赖
「任务名统一成一个字段」的 spec 完成后,「任务是什么」的选择收在 adapters/agent/_naming.py 的一个纯函数里,两条 lane 只喂事实。本票的改动应只落在那个函数及其输入的事实上。
Activity
The task half of a Session Name describes the Session and climbs (#273,
Simon-AI-coding commentedon Sep 8, 2026
Closing:本地图的目的地已到达。
c8bf1ed、9acf326、3ef5ee0、05c845d。docs/adr/0024-the-task-half-of-a-session-name-is-descriptive-and-climbs.md)已写入。没有遗留未跟踪的部分。
Name a Session from the first words it heard through the phone