Skip to content

refactor(web): 「WU 当前提问消息」派生收口后端 action-center——messageId 随 waitingWus 投影下发,前端反推退休(#533) - #536

Merged
dommaker merged 15 commits into
masterfrom
feat/ship-20260915-1043
Sep 15, 2026
Merged

dommaker merged 15 commits into
masterfrom
feat/ship-20260915-1043

Conversation

@dommaker

Copy link
Copy Markdown
Owner

Summary

14 commits from feat/ship-20260915-1043

Commits

fda4371 refactor(web): 「WU 当前提问消息」派生收口后端 action-center——messageId 随 waitingWus 投影下发,前端反推退休(#533
abc54ba refactor(channels): #532 频道记录读写收口 channel.service——写路径内部失效缓存、404 判定单点
96afb72 refactor(web): 频道消息流组合层 useChannelStream——六线接线顺序不变量自页面收编模块结构(#531
92a081e refactor(web): 消息定位收编 useMessageLocate——mid→可见完整语义单入口(#530
7f20353 refactor(agents): remove user-model consumers in monitor/auditor (#501)
b9f46ec refactor(cli)!: remove session-mining CLI domain (update-user-model / analyze-sessions) (#501)
5bde38b refactor(channels): #534 routeMessage options 袋收敛为 DispatchContext——fs+options 并为单一 ctx,WorkUnitService 三处实例化收口为路由主体单一来源下传
91e3ba0 docs(web): CONTEXT.md channelWorkStore 条目补测试隔离样板(#528 沉淀)
7e685cb refactor(web): 频道工作面收编 channelWorkStore,ChannelDetailPage 退回纯订阅者(#528
1dc51ec fix(channels): #529 listByWorkUnitId 频道直查收口——#524 P1-1 漏网的线性读口
feb5ede docs: CONTEXT.md 数据面 store 条目追加 channelWorkStore 实例(#528
0d3786a docs(channels): CONTEXT.md 鉴权分层同步——读端点 2026-09-14 起读写对称
0805c8c fix(security): 频道读端点与写侧对称补 requireAuth
3616ac5 fix(web): 审计日志详情由弹框改为行内展开

Test plan

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

🤖 Generated with studio-ship

dommaker and others added 14 commits September 14, 2026 15:00
点击行在下方展开/收起详情区(aria-expanded 标注,查看/收起随行态切换),
不再遮罩列表、可对照上下文;测试改为展开/收起断言,CONTEXT.md 补记录。
- channel.routes.ts 六个 GET 路由(列表/详情/消息/建议/当前PMO/文件词表)挂 requireAuth
- app.ts 生产白名单移除 /channels(前缀放行会覆盖全部子路径)
- 新增 channel.routes.test.ts 匿名 401 回归(STUDIO_AUTH=on 强制模式)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-09-14 架构评审 channel 性能方向候选 1 grilling 定稿:
频道工作上下文(wus/reqs/引导片/当前工单/WU 文件集)收进
新建 channelWorkStore,事件驱动型,与 TTL 型 channelDataStore 并列。
讨论空间读口 GET /workunits/:id/messages 原实现无 channelId 上下文,被迫
listChannels + 逐频道 queryMessages(ch.id, { workUnitId }) 全热层读再拼接,
耗时随频道数 × 各频道热层行数线性变差(#524 修掉的四个读口同病灶)。

- listByWorkUnitId 签名加 channelId(type 可选、语义必填):指定即按频道
  直查,扇出循环删除
- 路由从 WU 一等列 channelId 解析归属传入(与写侧 POST /:id/messages
  同字段,读写对称;字段选型经人工确认:metadata.context.sourceChannelId
  是 Goal 管线遗留死字段,现行归属链路锚定一等列)
- wu.channelId==null 的 legacy/手工单保留扇出 fallback(根因注释:写侧
  对无归属 WU 落 #研发,讨论消息可能散在任一频道)
- 复现测试先行:spy queryMessages 断言单次直查、不触 listChannels;
  路由契约测试锁 channelId 传递与 fallback 分支

Closes #529

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ADR 2026-08-31 数据面模式第四个实例:新建 stores/channelWorkStore.ts
(并列 channelDataStore——TTL 型慢变数据与事件驱动数据不同质),收编
ChannelDetailPage 的 4 份 per-channel 服务端状态与手写纪律:

- per-channelId 三 slice(wus / reqs / suggestions+currentWuId 同响应同
  slice 含 resolved 旗标 = #488 台账等价替代)+ per-wuId wuChangedFiles
  (失败记 [] 不重试语义保留)
- wus/reqs 30s TTL 走 fetchDiscipline;suggestions 无 TTL 纯事件驱动,
  500ms trailing 防抖内化 store 私有(degraded 留旧数据不置 resolved)
- SSE 模块级 handleEvent 只路由活跃频道:status_changed 17 字段全量快照
  直替(删除客户端时钟编造 createdAt/updatedAt)/ requirement.*
  envelope 解包就地 upsert(parseRequirementPayload 迁入 store)/
  message_sent 标脏防抖重拉
- useChannelWorkStoreSync(channelId) 页面级单点接线(useRosterStoreSync
  先例,ref-count=1;useDataPlaneSync 复用),重连强刷当前频道全 slice
- 页面退化:4 份 state / 3 条手写订阅 / 防抖 / 重连对齐 / fanOut 缓存 /
  suggestionsResolvedFor 台账全删(净 -174 行);applyGateResult 改 store
  write-through;wuIdle 由 store 派生(wuIdleOf);invalidateCurrentPmo
  白捡接线按边界 1 留页面

测试:channelWorkStore 19 条 + useChannelWorkStoreSync 9 条(TDD
RED→GREEN);ChannelDetailPage*.test.tsx 适配后全绿(页面套件 39 文件
416 条;vitest run --changed origin/master 22 文件 195 条);tsc 0 错。

边界遵守:useChannelLiveExecutions 不收编;切频道旧数据保留无 FIFO cap;
currentWu 投影 memo 留页面。
…s+options 并为单一 ctx,WorkUnitService 三处实例化收口为路由主体单一来源下传
… analyze-sessions) (#501)

studio#501 决策:退役 harness 时代迁入的字面挖掘命令。字面 n-gram
提取达不到「懂用户」目的——无语义归一、一次性纠正被阈值漏掉、
无质量环。该目的已由更好机制覆盖:交互会话 auto memory +
studio role-memory 飞轮(WU 收尾 LLM 提取 → 人审 → spawn 注入,
provider 无关)。

删除:update-user-model.ts、analyze-sessions.ts、mining.ts、
session-mining/、command-contract.ts、colors.ts(随迁 util,
无其他消费者)及对应测试;studio-cli.ts case/help 清理。
随 CLI 命令退役清理全部消费链:
- monitor-system-probes: 删 24h update-user-model 调用块与
  KnowledgeCycleState.lastUserModelRun 字段
- auditor-rules: 删 analyzeUserModel/userModelStateFile 及
  model_weight_tune/derived_rule_promote 建议类型(读冻结 state
  出建议的僵尸逻辑)
- auditor-execution: 删 model_weight_tune 分支(回写冻结 state)
- auditor.service: 删调用点与「用户模型质量」日审摘要段
- CONTEXT.md 记录退役决策与理由;studio-shared read-metrics
  注释/fixture 的过时命令例子同步更新
架构评审 2026-09-14 候选 2。翻页定位循环(#439)/ 根锚展开 / unpin 时机 /
高亮生命周期 / 防重入台账自 ChannelDetailPage 整块收编 hooks/useMessageLocate;
quote / chip / ?highlight 三调用链退化为 locate/locateBy 调用。
刻意收严(计划边界 3):防重入双台账并发并为单飞,任何新定位意图取消在途循环。
- hooks/useChannelStream.ts:内化 deriveStreamView memo → buildMessageToItemIndex
  → streamHead ResizeObserver → useStreamFollow → firstVisibleMid 三 kind 反解
  → syncPruning(仅虚拟路径)+ usePersistentStreamUI 与三 toggle 收编;
  返回契约 = 结构/滚动跟随/特性消费产物 + ChannelStreamBody 结构渲染产物
- components/channel/ChannelStreamBody.tsx:items→DOM 全部结构分支
  (virtual/non-virtual + spacer/translateY + measureElement + renderStreamItem
  三 kind 分派 + skeleton 占位含骨架高亮),props = stream + renderMessage + highlightId
- ChannelDetailPage 回纯装配:渲染段 = streamHead 头块 + ChannelStreamBody + 回底浮钮;
  locate/键盘导航/fresh 高亮经契约即插即用
- PURE_MOVE:底座六件与取数零改动,既有页面测试 154 例原样通过;
  新 hook renderHook 单测 7 例(产出物齐全/接线顺序/syncPruning 三 kind 驱动/非虚拟不触发)
…s 投影下发,前端反推退休(#533)

- NeedInputTodo 加 messageId;waitingWus 投影透传 stateItems.messageId
- 删 latestQuestionIdByWu/latestQuestionMessageOf 反推;回复区/提升/chip 定位
  全消费下发锚点,缺省 fail-closed(不挂回复区/不提升/定位 toast 反馈)
- chip 定位改走 locate(mid);useMessageLocate 的 locateBy 收回模块内私有
  (对外只暴露 locate,业务口径 find 退休)
- 测试先行 RED→GREEN:#533 缺省 fail-closed / 口径单点(有更新消息仍认下发锚点)
  / chip 缺锚点 toast 不翻页 三用例;locate id 精确匹配防回归
- CONTEXT.md 同步(web 行动中心段 + useMessageLocate 条目 / api action-center D-2 口径声明)

验证:apps/web vitest run --changed origin/master 297 passed;
apps/api vitest run --changed origin/master 3666 passed;tsc-gate 无新增错误
@dommaker
dommaker enabled auto-merge September 15, 2026 02:51
@dommaker
dommaker merged commit d8897a7 into master Sep 15, 2026
1 check passed
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