Skip to content

docs(channel): CONTEXT.md 沉淀合并目标 metadata parseWuMetadata 容错口径 (#495 尾随) - #500

Merged
github-actions[bot] merged 19 commits into
masterfrom
feat/ship-20260911-2022
Sep 11, 2026
Merged

github-actions[bot] merged 19 commits into
masterfrom
feat/ship-20260911-2022

Conversation

@dommaker

Copy link
Copy Markdown
Owner

Summary

19 commits from feat/ship-20260911-2022

Commits

8b199f5 docs(channel): CONTEXT.md 沉淀合并目标 metadata parseWuMetadata 容错口径 (#495 尾随)
7c8076a fix(channel): 合并窗口 metadata 解析归 parseWuMetadata 容错口径——畸形 JSON 不再抛错拖垮路由 (#495 尾随)
face4f0 fix(channel): routing/members 配置漂移收敛——删 profile 清 routing + 移出 warning + fallback 提醒冷却 (#497)
7437995 fix(channel): mention 手打中文连写兜底——成员名最长前缀匹配 (#496)
00261e2 feat(channel): 决策12 派单合并窗口——连发闲聊并入在途 WU 线程 (#495)
2164724 fix(channel): 派单锚点显式传递,认领播报不再竞态落独立根 (#494)
48a359c fix(channel): 人类回复唤醒加固(闩锁+同毫秒边界)+ 前端送达即时反馈 (#493)
6ac541f docs(channel): CONTEXT.md 沉淀 #492 冷层父回复归档提示 (#492)
ac7eb7e fix(channel): 回复冷层父消息不再静默失效,频道发归档提示 (#492)
c42ab76 feat(api): SSE 断线窗口事件 replay——消费 Last-Event-ID + 环形内存 buffer (#491)
a05399b feat(api,web): 建议端点加 degraded 标志——fail-closed 被吞与「真无建议」可区分 (#490)
92d7420 fix(web): 建议端点重拉触发面补齐——message_sent/requirement.* 纳入防抖重拉 (#489)
afe2e7c fix(web): ChannelWorkBar 占位区分加载/空闲/有工单三态 (#488)
e1cee35 fix(api): suggestions currentWu 拣选加粘性——多单并行交替簿写不再抖动 (#487)
b236511 feat(web): 频道发送乐观回显——pending 即插、成功原位替换、失败回滚 (#486)
c3ceea1 feat(web): composer 文件引用台账 chip 可视化,失效标灰不再静默丢弃 (#485)
1356f19 fix(web): 引导片 dismiss 收片粒度——每片独立 ✕ 只关本片,不再一键清全部 (#484)
067885c fix(web): 待回复 chip 定位复用 #439 翻页定位循环,提问掉出分页不再静默 (#483)
4374aa6 fix(web): 频道消息首拉失败呈错误态 + 重试入口,不再呈假空态 (#482)

Test plan

  • CI build-and-test passes
  • Manual smoke test

🤖 Generated with studio-ship

- useChannelMessages 暴露 error 态:首拉/兜底轮询共用 fetchMessages,
  失败置 error(已加载消息保留),成功/频道切换清零
- ChannelDetailPage 三态分流:加载中骨架 / 加载失败(错误态 + 重试钮
  走 refresh)/ 真空频道(空态文案 + 示例 chip);已有消息时轮询失败
  不整屏替换
- 测试:hook 层首拉失败→error、refresh 重试恢复、兜底轮询失败同口径、
  频道切换重置;页面层错误态渲染、重试按钮、有消息时不整屏替换
- 抽 pageBackToFind 共用翻页定位循环(found/cancelled 回调 + 三态返回),highlight 路径与 chip 路径共用
- chip 定位:提问在已加载页 → 直接高亮(行为不变);掉出分页 → 翻页定位(上限 10 页);翻不到 → toast 兜底
- 测试覆盖三态:已加载(既有用例)/ 未加载可翻到 / 翻页到底翻不到
- SuggestionChips:onDismiss 改上送被点片(item),每片(status/action/prompt 三形态)
  各自带 ✕;✕ 不嵌片按钮,片 + ✕ 由 .mc-suggest-item 容器并排承载
- ChannelDetailPage:按片 dismissKey 单片记账(原循环清全部可见片);台账会话级
  (刷新复活)语义不变——持久化需先改 #441 spec,另行提案
- 测试:组件侧锁每片独立 ✕ + 只上送本片;页面侧锁多片并存 dismiss 其一、
  其余保留、被关片重拉不复活
- 已挂 fileRefs 渲染为输入框上方 chip(路径+工程 basename),可单独移除
- 正文编辑导致引用失效时 chip 标灰 + 「已失效」标记(非静默)
- 发送仍只上送正文含路径的有效引用(行为不变,仅透明化)
- 新增 ChannelInput-file-ref-chips 测试 5 例(渲染/移除/失效/混合过滤)
- useChannelMessages.sendMessage 先插本地 pending 消息(id 前缀 pending-,
  ChannelMessage.pending 仅客户端字段),成功后服务端本体原位替换
  (SSE 回声先到按 id 去重不重复),失败回滚 pending + 上抛
  (ChannelInput 回灌草稿 + toast 既有路径不变)
- pending 不作 loadMore 分页游标(本地 id 服务端不存在)
- ChannelMessageItem 渲染 mc-msg-pending 灰态 + 气泡内「发送中…」,
  pending 不出回复/转任务动作
- ChannelInput 发送中 textarea 不再整段禁用(可接着打下一条),
  sending 仅保留发送钮/handleSend 防重复提交
拣选口径(非终态中 updatedAt 最新者)不变,叠加进程内 per-channel 现任记忆:
现任非终态时挑战者 updatedAt 须领先超 SUGGESTION_TIMING.currentWuStickyMs
(5min,对账扫描档)才切换;现任终态/消失立即让位。无状态阈值规则无法区分
「现任自己簿写 bump」与「挑战者超车」,故粘性须记忆现任;不落库,重启按事实
重选,保持纯推导语义。TDD:交替簿写/终态让位/静默超窗三用例先行(RED→GREEN)。
无 currentWu 且无 live 时原恒显「状态同步中…」,空闲频道永远挂同步中。
- ChannelWorkBar 新增可选 wuIdle prop:true → 空闲文案「频道暂无进行中的工作」,
  缺省 false → 保持加载态「状态同步中…」(失败/未返回/skew 不误显空闲)
- ChannelDetailPage 按 suggestionsResolvedFor === id 记录建议端点成功返回
  (catch 不落账,切频道自动回加载态),wuIdle = 已返回且 currentWuId=null
- 测试:组件三态 4 例 + 页面接线 3 例(null→空闲 / 端点失败→加载 / skew→加载)
- apps/web CONTEXT.md 同步
- SSE 触发面统一走 500ms trailing 防抖(scheduleSuggestionsReload):
  workunit.status_changed(含 NEED_INPUT 挂起/恢复)+ channel.message_sent
  (本频道里程碑/agent 消息)+ requirement.created/updated,连发事件合并为一次请求
- 挂载/重连/动作回扫仍即时重拉不经防抖;卸载清挂起定时器
- 他频道 message_sent fail-closed 跳过(与 useChannelEvents 同口径)
- 新增 4 用例覆盖触发面与防抖合并;CONTEXT.md 同步触发面描述
推导 fail-closed 语义不变(内部读取失败仍空 suggestions 不抛出),但响应新增
degraded 标志:失败路径 true、正常路径(含确实无建议)false,非粘性每次现算——
此前推导失败被吞后前端无法区分「无建议」与「推导静默失能」,零可观测信号。
前端消费仅 console.warn 记录不打扰用户,且 degraded 响应不落「已返回」台账:
ChannelWorkBar 占位保持加载态而非误显空闲(批次 2.2 三态语义协同)。

TDD:契约两态(正常 degraded=false / getIndex 抛错 degraded=true + 路由层
200 透传两态)与前端 degraded 不落空闲/不 warn 反向用例先行(RED→GREEN)。

验收:vitest run --changed origin/master 966 passed;tsc-gate 无新错;
eslint 改动文件 0 errors 无新警告。
- 新增 sse-replay-buffer.ts:环形 replay buffer(容量 500),id = 服务端单调 seq
- sse.routes.ts:事件广播先入 buffer 再发;id: 行改用 seq(信封 event_id 留 data 内)
- 重连带 Last-Event-ID:窗口内按 seq 升序补发(按订阅 topics 过滤),
  有洞/游标不可解析则不补发,由前端 onReconnect refetch 兜底(决策 9)
- 前端无需改动:useChannelEvents 已按消息 id 幂等去重
方案 a(票评论预授权):routeMessage 线程回复路径中,父消息不在热层
(#327 降级放行分支)时,帖子照常成立后补发 Studio 系统消息
「该话题已归档,回复不会触达任务」,挂在该回复线程,best-effort 不阻断。
热层回复路径行为不变;测试覆盖冷/热父消息两路径。
- agent-loop:channel.message_sent 唤醒加 pendingWake 闩锁——事件到达时不在
  idleSleep(执行中/步骤间)不再丢唤醒,下一次 idleSleep 入口消费并立即重跑
  observe;无事件时 15s 空闲调度不变(认领/执行行为不变)
- agent-loop:新回复检测 msg.createdAt > wu.updatedAt 改 >=,同毫秒落盘
  (含重启间隙首扫捞回)不再漏检
- web:线程回复送达且命中 WU 时 composer 上方出「已送达,等待 agent 响应…」
  轻量状态条,该 WU agent 新消息到达即隐,30s 兜底清除
- 测试:agent-loop-wakeup 增 #493 边界/闩锁 4 例(seam 直驱无竞态);
  ChannelDetailPage-agent-ack 增 5 例(出条/不出条/响应即隐/无关 WU 不隐)
mention/决策12 两派单路径先落派发消息再建 WU,metadata.anchorMessageId
显式携带派发消息 id(方案 c,票内预授权);wu-messenger 系统消息锚点
优先级改为 显式 replyToId > anchorMessageId > 首条根消息查找(既有语义
兜底不变);建单后 linkWorkUnit 回填消息 ↔ WU 关联(同 createFromMessage
路径,best-effort)。消除 workunit.created 同步触发 observe→claim→播报时
派发消息尚未落库导致 findAnchorMessage 扑空、播报落独立根的时序竞态。

测试:wu-messenger 显式 anchor 优先/回退/replyToId 优先三例 +
message-routing anchorMessageId 落档、created 处理器内抢跑认领的
竞态时序用例(线程单根断言)、决策12 路径同形用例。
窗口内(默认 5 分钟,STUDIO_CHANNEL_MERGE_WINDOW_MINUTES 覆盖)同频道
无 @ 消息合并进在途 WU 线程(继续对话 = 继续任务),不再每条建一张 WU;
窗口外/终态/@mention 照章新建。合并即刷新窗口(滑动窗口),
blocked 经 resumeWaitingWorkUnit 复活回灌,其余状态锁内追加 pendingReplies。
token 整体精确匹配失败时,对频道成员名做最长前缀匹配(@开发你好 → 成员「开发」);
互为前缀取最长,等长歧义(同名 profile 并列)回退现状转自动认领;studio 系统角色
不参与前缀兜底。命中后 scope 只剥 @成员名 保留连写剩余文本,metadata.mentionName
落解析后正名。
@dommaker
dommaker enabled auto-merge September 11, 2026 12:51
@github-actions
github-actions Bot merged commit 663ab7c into master Sep 11, 2026
1 check passed
@github-actions
github-actions Bot deleted the feat/ship-20260911-2022 branch September 11, 2026 12:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant