Skip to content

fix(scripts): e2e-live-smoke 改绑 defaultPath 适配 #481 机器指针退役 (#502) - #503

Merged
github-actions[bot] merged 11 commits into
masterfrom
feat/ship-20260912-1303
Sep 12, 2026
Merged

github-actions[bot] merged 11 commits into
masterfrom
feat/ship-20260912-1303

Conversation

@dommaker

Copy link
Copy Markdown
Owner

Summary

11 commits from feat/ship-20260912-1303

Commits

c463920 fix(scripts): e2e-live-smoke 改绑 defaultPath 适配 #481 机器指针退役 (#502)
6c09ba1 ux(web): 频道内 PMO 三呈现统一标识 PmoChip——顶栏/右栏/footer 同一视觉语言 (#476)
1d821b3 perf(web,api): 监控行动面计数 overview 扩段单源化 + company/project 链收口 pmoDataStore (#456)
771a0a5 perf(web): channelApi.list 四处裸调收口 rosterStore channels 切片 (#455)
2da8854 refactor(workspaces): workspace 记录退出执行面,机器指针全链退役 (#481)
5c5e613 refactor(channels): 路由解析+fallback 出声骨架收口 resolveOrNotice (#477)
93fe464 perf(workunit): status_changed 消费侧收尾——REQ 汇总 memo+去抖,decision-resolution 零重读 (#457)
cb6f735 perf(triage): 健康探测去同步 execSync,异步化 + df/free 收口 proc-probes (#454)
1e5db59 refactor(agents): agentStep 成功路径 stream-json 全量解析 3→1 (#453)
d7cfa90 fix(workunit): active WU 线程人类回复入 pendingReplies 缓冲,不再低于 newReplies 水位线被吞 (#499)
76a734c fix(web): 角色页页头统计 chip 对齐任务页——数字归 --fs-title 档,激活态补 accent 底线

Test plan

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

🤖 Generated with studio-ship

…线被吞 (#499)

#493 残留盲区:WU active 且 pendingReplies 为空时 resumeWaitingWorkUnit 不收回复,
当前步簿记推进 updatedAt 后回复低于 observe newReplies 水位线,永不注入 prompt。

- resumeWaitingWorkUnit:active 一律锁内追加 pendingReplies(不再要求缓冲非空),
  recordResult 三段合成保留步期间新到回复,下轮 prompt-composer 必注入;
  in_review/done/closed 等无下一步状态仍不缓冲
- resumeBlockedWorkUnitFromWeb:补 blocked-only 前置守卫,Web 通道契约不变
  (路由层同口径 409),不注占位文案、不发里程碑
- 测试:waiting-input + message-routing 各补 active 回复缓冲场景;in_review 边界锁定
CLI 一步执行的 stdout 此前被 resolveRealUsage / writeToolCallEvents /
buildExecutionStepEvent 各自全量 split + JSON.parse。本改动把接口从
「传原始字符串」深化为「传解析产物」:

- agent-loop 成功路径统一 parseStreamEvents 一次,tool:call 落盘与
  execution_step 提炼共享同一份 StreamEvent[]
- writeToolCallEvents 签名改为收 StreamEvent[],删除内部浅解析
- buildExecutionStepEvent/emitExecutionStepEvent 入参 rawOutput → events
- 失败路径(emitFailedStep)保持按原文解析(票内 triage 决议)
- usage 记账(resolveRealUsage)保持吃原文:claude 主路径走末行
  parseSessionMetrics 已便宜;opencode/codex 事件形态不同,改 shared
  公开 API 外溢不划算(票内 triage 决议)

验收:新增计数断言测试(成功路径 parseStreamEvents 恰好 1 次),
token 记账 / tool:call 落盘 / execution_step 事件语义不变,测试全绿。
triage.service 的 shell 探测原在 API server 事件循环上同步执行,
单条 critical 告警最坏串行阻塞约 14s(#374「monitor 轮禁止同步 exec」
规则缺口,triage 为遗漏同胞)。

- diagnose 的 curl /health、tmux ls 与 act() 的修复命令、service_down
  验证 curl 全部改走 monitor/exec-async 异步出口(timeout 与 shell
  兜底语义不变)
- df/free 探测删除,改调 proc-probes readDiskUsage/readMemoryUsage
  同源数据(statfs / MemAvailable 口径);findings 前缀 Disk:/Memory:/
  Tmux: 不变,文案钉死在 triage-agent.test.ts 新增口径断言
- ops/system-health.ts collectDisk 死代码里的同步 df 一并清理(statfs
  口径,该模块仅测试引用)
- CONTEXT.md 记录 #454 收口
…ion 零重读 (#457)

- (b) requirements/rollup.ts 改 per-req 聚合 memo + 50ms 去抖(照 #410
  progress-rollup 先例):事件负载喂 memo 稳态零存储读,created 只记账
  不触发,冷启动首个评估回源一次;maybeRollUpToDone 增 knownSnapshots
  直供参,新增 listWorkUnitSnapshots 冷启动回源口;Requirement 状态判定
  恒新鲜 get,行为口径不变
- (c) pmo/decision-resolution.ts 删两处防御性 getById 重读:payload 即
  真相(reviewPassed 台账 l3 与 done 迁移同一快照原子落盘后发布,
  pmoId/fogId 建单落档不可变;map 写围栏在 projectId 串行链上)
- 其余 8 个订阅方逐家论证判保留/无重读,论证记录见工单 #457
「resolveStageRouting → 未命中/配错时 routingFallbackText 出声」骨架原重复于
workunit-crud(implement)/analysis-handoff(implement)/review-dispatcher(review)/
project.service(plan) 四处;收口为 channels/routing.ts 的 resolveOrNotice——
解析 + fallback 判定 + #497 冷却闸 + 文案一次完成,返回 { resolution, notice }。

点级差异按票体决议留调用侧:出声通道(WU 系统消息/频道 agent 消息/自身 post)、
出声时机(建单前即时/建单完成后)、review-dispatcher「路由=实现者」专属文案、
workunit-crud #464 未配置提示(notConfiguredText 入参,不过冷却闸)。
analysis-handoff respawnScopes 对账补建频道不出声(决议 5),仍用裸 resolveStageRouting。

行为等价:出声里程碑语义与文案不变,四消费点既有测试断言未改全绿;
新 helper 自带命中/未命中/配错/冷却四分支单测。
- worktree-resolver:删 VPS workspace 记录兜底;执行目录三级链 = 归属直接路径
  → hasWorktree 专属 worktree → 显式配置的共享工作目录(REPO_DIR 执行时现场读,
  单一来源),未配置/不存在落隔离 scratch;ensureDeps 前置:无 lockfile 且无
  package.json 判定非项目检出直接返回(参考已撤销的 70cd0bf,落点按票体改写)
- agent-loop:resolveExecutionWorkspaceRoot 只认 metadata.workspaceRoot;删
  resolveBoundWorkspaceRoot 与 workspace-store 导入——wu.workspaceId 不再参与
  cwd 决策(F6 旧路径退役,记录 root 是启动时一次性抄件)
- ownership-resolver/message-routing:显式 workspaceId 与频道 defaultWorkspaceId
  (默认执行机器)两级不再产出机器指针;OwnershipResolution 无 workspaceId 字段,
  新建 WU 不再落机器指针(字段仅历史展示/候选集语义)
- web:退役「默认执行机器」设置面(DefaultExecutionMachineSection),
  channel.defaultPath(默认工程)为频道级唯一配置点;删零引用的 workspaceTokenApi
- 删 workspace token 纯残骸(零行为变化):token.routes.ts + route-registry 挂载
  + workspaceAuth() + WorkspaceTokenData/WORKSPACE_TOKENS_DIR + 两处自证测试
- 消假绿:workspace.test.ts(自建内存 store 自证)删除,只读/删除端点重写为
  真打 HTTP 的 workspace-routes.test.ts(样板 runtimes-local-only)
- e2e:mvp-loop 频道默认工程改绑 defaultPath;(d) 断言 metadata.workspaceRoot,
  (h) cwd 证据改为专属 worktree(决策 D1)
- CONTEXT 同步:workspaces/agents/requirements/channels/web/studio-agent/
  studio-shared + 根词汇表;agents-md:sync 重跑
PMOPage / WorkUnitDetailPage 频道名解析 / PublishProjectDialog 选项 /
CommandPalette 频道域搜索改读切片 + ensureFresh()——30s TTL +
single-flight 复用 fetchDiscipline 零新机制,新建频道经 appendChannel
写穿;PublishProjectDialog 切片为空回退 props(对齐原失败回退口径)。
joinChannel.ts(#465 一次性首用流程)按 triage 决议维持现状。
DefaultExecutionMachineSection 已随 #481 删除,不在本票范围。
…ore (#456)

- overview 新增 stuck/failure24h 两段(NeedsAttentionSection 服务端单源,
  消拉全量客户端统计的先截后滤漏单);事件读取窗口下限 2d 保 48h 趋势口径
- GET /workunits 新增 projectId 服务端过滤(归属口径与 PMO 台账同源
  selectProjectSnapshots),ProjectDetailPage next-action 消全池客户端过滤
- 新建 pmoDataStore(companies 单份 + projects per-companyId,limit 统一 100)
  + usePmoDataStoreSync(App 级单点,无 SSE 事件 → TTL+重连强刷+兜底轮询),
  PMOPage/LibraryPage/FileRefChip 三处复制链删除
- 新增 components/pmo/PmoChip.tsx:IconChart 图标 + 文本同一 chip,中性配色 .pmo-chip
  (#472:PMO 身份不占 success/warning 状态色语义;#474 图标策略:零 emoji)
- 顶栏 ChannelCurrentPmoChip / 右栏 ChannelActivityRail badge / 消息 footer chip 三处复用同一组件,
  站点钩子类(mc-pmo-chip / mc-act-pmo-badge)仅留测试钩子与字号微调
- footer 的 PMO=success 差异化(#474 临时措施)随统一标识退场:.mc-wu-link--pmo 变体删除,
  wu=accent / req=warning 修饰类不变
- 测试:PmoChip 组件契约 5 例 + 三处渲染点各有统一标识断言
#481 后 defaultWorkspaceId 不再是归属 rung,脚本建的 WU 必落 source=none
挂起超时。改为 PATCH defaultPath=repoDir(channel-default-path rung),
与 mvp-loop e2e 的适配对齐。

验证(--temp 实跑):WU metadata ownershipSource=channel-default-path、
workspaceRoot 落档、parked=false,不再 source=none 挂起。
@dommaker
dommaker enabled auto-merge September 12, 2026 05:29
@github-actions
github-actions Bot merged commit 9241740 into master Sep 12, 2026
1 check passed
@github-actions
github-actions Bot deleted the feat/ship-20260912-1303 branch September 12, 2026 05:33
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