docs(shared): 沉淀——约束 prompt 正本只剩 harness 一处,别在 studio 重建 role→trigger 路由表(#587) - #596
Merged
Merged
Conversation
骨架固定、环节内自由(闸设在环节交接点)+ 分层评价(代码闸底线 / agent 评审质量线): - completion-gates:COMPLETE 加「产出实」双闸——代码类 diff 非空(base..HEAD 提交计数)、 非代码类契约产物存在(review/plan/spec/decision 验 metadata 协议行,analysis 验 .studio/research/ 落盘文件);缺失降级 progress + hint,3 次 blocked 转人工 - prompt-composer:五类契约段尾加「本环节标准打法」指引(implement→tdd-implement、 bug→diagnosing-bugs、plan→requirement-clarify+to-tickets、analysis→research、 review→code-review);skill 分发机制不动 - merge-on-review-pass:merge 冲突终态现场不再 abort,交 LLM 解(system-executor 一次性会话 + 新内建 skill resolving-merge-conflicts),冲突标记清零才认解完; 合并后落 mergedAt 前在合并目标目录重跑 verify,红则 merge-verify-failed 转人工; 失败回退原有 abort + markMergeConflict 兜底 - claim-fitness(决策 14):认领前适任判断——resolveTarget 选中 unassigned 后、 claim 前一次性 LLM 判断;不适任落 WU metadata.unfitRoles(挂 WU 不挂角色,合规 D2),observe 过滤第 7 道;全员不适任 → blockForAllUnfit 转人工;显式指名不判、 判断失败从宽
cache 命中是 loadSkill 常态路径(包级 loader 预热覆盖全部磁盘 skill),此前仅 文件回退路径发射 skill_used → 事件结构性为 0。发射点上移到工具边界,cache 路径补发射(channel=loadSkill),文件路径维持 skill-loader.ts 既有发射, 每调用恰好一次。
「使用」= 获取 skill 全文、渠道无关:agent Read/cat SKILL.md 会绕开 loadSkill, 但读取必在归档 transcript 的 rawOutput 留痕(provider 无关)。WU done 时纯 确定性扫描路径痕迹,每命中 skill 发射一条 knowledge:skill_used (channel=transcript,level=info);聚合侧 (skill, workUnitId) 去重吸收 重复触发,幂等无哨兵。index.ts 挂载同 completion-extraction 形态。
- 发射点(skill-loader/skill-tools/skill-usage-scan)显式 level=info,不改 knowledge:* 大类默认(其余维持 noise);轮转归 signal:热 30 天 → 月度 gz 归档 - 根修 writeStudioEvent:显式传 level(含 'info')必须落 envelope 字段——此前 「info 不落字段」优化会让提级语义在落盘时丢失,轮转分类回退 type 默认 debug,提级静默失效 - 同步 studio-events / studio-events-rotation 头注释与既有断言
- successRate 归因从 matchedSkills(注入名单/曝光侧)改为 skill_used 事件 (使用侧):注入了没被读的 skill 不再背 WU 成败;legacy 无 workUnitId 事件 无法归因 → successRate=null(未知不编造) - 新增 exposures 字段:matchedSkills 命中计数(含未终态 WU),仅人审参考, 不参与 demote 判定;降级阈值与「只产提案」原则不变
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…位桩 (#537) - types.ts 的 CreateWorkUnitInput/UpdateWorkUnitInput/WorkUnitData 漂移副本删除, 唯一正本收口到 workunit-crud.ts(经 workunit.service.js re-export 不变); 漂移差量(WorkUnitData.closedAt #327 / claimable #318)并入正本; 模块内两个消费方(mappers/wu-dependencies)type import 重指向 workunit-crud.js - workunit-api.test.ts 移除 isCI describe.skip——跳过根因(75e0ba8a,Prisma 时代 CI 文件系统不可写)已随 FileStore tmpDir 隔离消除,CI=1 下 50/50 全绿 - 删除两个 158 字节占位桩(workunit.routes.test.ts / workunit.service.test.ts), 真实覆盖由 workunit-api.test.ts 承担;manual-release 测试注释同步 - CONTEXT.md 同步 DTO 唯一定义点 零业务逻辑改动(纯删除 + 测试恢复 + type import 重指向)
…538) ADR 2026-09-15-workunit-write-single-mouth 决策 3/4/5: - delete(id, { reason }):reason 落墓碑事件行(closed + deleted:true 单点构造,调用方不自拼) - 删除后发 workunit:removed(负载 id + channelId)——只走事件流/SSE,不进频道出声
ADR 2026-09-15 决策 5:SSE 桥转发白名单加 workunit:removed(负载 id + channelId); channelWorkStore.applyWorkunitRemoved / workunitStore.removeWorkunit 删行分支 (WorkUnitListPage 与 useChannelWorkStoreSync 接线)——只走事件流,不进频道出声
ADR 2026-09-15 决策 3:筛选逻辑留调用方(90 天 TTL / 30 天 GC 口径照旧),
删除循环走 service.delete(id, { reason }) 单口——墓碑不再两处手抄,
删除经 workunit:removed 出声。system-health 测试补 WU 删除分支断言(现状未断言)
ADR 2026-09-15 决策 6:TriggerStore 注册校验拒 + executeUpdateAction 执行守卫 双保险;其余字段走 patchSnapshot 白名单(service.update),metadata 走 updateMetadata 增量合并。既有「可写 status」断言随语义变更反转(非删测试)
ADR 2026-09-15 决策 2: - abandon / stop → closeWorkUnitWithNotice 统一关闭(human-command,补 closedAt + workunit:closed 记录 + 频道出声),停发 legacy events:goal-execution - retry / retry-new → unclaim 回池(status_changed)+ updateMetadata 锁内合并 (旧实现 metadata 整写覆盖摧毁既有键、不写 closedAt、不发事件) - 按钮两路径测试从零补齐(真 Ed25519 签名 + 真 server fetch)
删除事件与 reason 口径(workunit)、discord service 单口、trigger UPDATE 禁 status、TTL/GC service.delete、桥白名单 workunit:removed、web 删行分支
90 天无状态过滤是 G31 GoalExecution TTL(执行记录无生命周期状态)迁到 WorkUnit 时机械沿用的产物,非有意设计;runGC 的 done/closed 口径才是 针对 WorkUnit 的有意筛选。进行中/阻塞单满 90 天改走探测告警/人审, 缺 status 的历史行按非终态保留不误删。
- agent-loop.ts 导出面收敛为 AgentLoop + StepResult(type re-export 保留, completion-gates 生产消费方经门面取类型);删除 parsers/events/guards 三处 re-export 块,主文件不再为门面承担子模块导出语义 - 14 个测试文件 import 迁真属主:agent-loop-parsers(resolveTarget/ parseAgentOutput/dynamicInterval 等)、agent-loop-events(tokens/tool:call 落盘)、agent-loop-guards(测试 WU 守卫);含 loop/__tests__/claim-fitness 与 agent-loop-v2 的动态 import - agents/CONTEXT.md loop/ 清单校正:补齐 agent-loop-registry/claim-fitness/ daily-token-budget/delegate-branch/prompt-composer/review-dispatcher/ session-resume/wu-lease,根目录段移除已删除文件(agent-output-parser/ agent-loop-workspace/agent-loop-utils/agent-loop-record-result/ agent-loop-step-guards/workunit-token-events 等) 机械票:纯 import 迁移 + 删 re-export + 文档清单校正,零逻辑改动。 验收:vitest run --changed origin/master 351 文件 3744 通过;tsc-gate 无新错。
…541) B2 测试 WU / C3 日 token 预算 / #162 WU 级 tokenBudget / #471 plan 步数额度 四段前置判定从 agentStep 头部内联抽出到 loop/step-guards.ts,复制 completion-gates 的 Ctx/Deps/Outcome 注入模式:B2 副作用(写盘/关闭/频道 通知)与事件流路径经 deps 注入,开关与数据源保留生产默认实现。行为一字 不改(短路顺序、文案、留痕字段、容错路径全保留);agentStep 净缩 89 行。 新增 loop/__tests__/step-guards.test.ts 19 例伪 deps 直测,不再整类构造 AgentLoop。
- 新增 completion-harvest.ts:type→收割器组注册表,新 type 收割=注册一行; 单收割器抛错仅 warn 跳过,不阻断收割链(开放问题 1/2 决议落码) - agentStep 成功路径 66 行 if 分支收敛为注册表调度调用,行为不变 - 表驱动直测 27 用例(__tests__/completion-harvest.test.ts),不依赖执行器 mock
ADR 2026-09-15-web-gate-write-module(架构评审候选 B1)落地: - utils/gateWriter.ts = 唯一写模块(纯函数):一次 API 调用 + 响应体快照 双写落点(channelWorkStore.applyWorkunitSnapshot + markSuggestionsDirty + workunitStore.applyWorkunitEvent insertIfMissing:false,冻结契约镜像 status_changed SSE 路由)+ 宿主可选 sink onUpdated - WuGateActions 直消费写模块,onReviewPassed/onReviewRejected/onConfirmPending 三注入 props 删除;宿主只经 onUpdated 登记本地落点(drawer/详情页 setWu) - 旧路径全删不留委托:workunitStore 闸门三动作(API+全量重拉)、 channelWorkStore.applyGateResult(applyWorkunitSnapshot 裸副本)、 ChannelWorkBar gate prop、ChannelDetailPage workBarGate 接线 - ListPage 闸门动作从全量重拉变存量行 upsert(收口本体行为变化) - 写路径模块级测一次(gateWriter.test.ts),五处宿主测试退化为渲染级断言
… Context/store 自取 (#547) - 新增 ChannelMessageEnv 单 Provider Context:onAction/onReply/findMessage/channelId/ 三个开 WU 抽屉回调/onOpenRequirement/onInlineReply/onQuoteClick 共 10 个横切值下发, 消息项 useContext 自取;fileVocabulary 由消息项 useChannelDataStore selector 自取 - 公开 Props 收窄为 message + 5 个 per-message 派生值 + 6 个结构 props(12 字段,原 24); ChannelStreamBody extra 从 Partial<Props> 收紧为 6 键封闭 StreamMessageExtra Pick - 页面 renderMessageItem 手喂 6 prop、useCallback 依赖 16→5;env value useMemo 组装 全稳定引用,#322 memo 契约维持(volatile id 集禁入 Context,翻牌走 per-message boolean) - 9 个消息项测试文件迁移到 Provider 包裹;新增 ChannelMessageEnv 单测、flags 类断言、 store 词表染 chip、focus 翻牌零扇出(ChannelDetailPage-focus-fanout)四个测试 - 计划:docs/plans/2026-09-channel-message-env.md;CONTEXT.md 增 ChannelMessageEnv 条目
…cData (#549) - 新增 useWorkUnitStoreSync(App 级单点,对标 useChannelWorkStoreSync): status_changed/created/workunit:removed 三路路由唯一一份, 与 B1 主动写(gateWriter)同一组 store action - workunitStore 增 detail slice(detailById + loadWorkUnitDetail), drawer 退回订阅者;fresh 集合驻 store(created 路由驱动) - fresh 高亮机制合一:utils/freshIds 共享纯件(per-id 2s 自清), WU 行与频道消息两侧共用,消息侧语义由单 timer 全清统一为 per-id - WorkUnitListPage 删内联 onEvent/重连扇出/fresh 手写实现,测试拆 emitSse 管道 - AuditLogsPage 取数状态机退位:logs/stats/options 三份 useAsyncData, filterKey prev-state hack 删除 - useGatedPoll 支持 intervalMs<=0 完全停用(本域维持无轮询现状)
- WorkUnitService.close(id, opts):系统侧关闭唯一入口——状态机校验 (decision/spec 裁剪机天然拒绝)+ 统一尾部 + workunit:closed 结构化事件 + 频道里程碑说明;已 closed 幂等直返不重复出声;系统关闭补发 workunit.status_changed(前端列表/REQ rollup/inspection-scan 事件闸接通) - persistSnapshot 扩为迁移类写唯一尾部:status/closedAt/completedAt 落锚 + patch 覆盖 + commitSnapshot 锁内成对 + status_changed + 父聚合 + reopen thaw; transitionStatus/markMergeConflict/blockForManualRelease/blockForAllUnfit 全部迁入,各自只留策略 - 调用方迁移:monitor-probes 两处、waiting-input 关闭指令(手写 resolveValidTransitions 守卫删除,拒绝说明行为保留)、discord abandon; wu-closure.ts 删除,词表(WORKUNIT_CLOSED_EVENT_TYPE/WorkUnitClosedBy/ CloseWorkUnitOptions)归置 workunit.types.ts - 不变式单点断言:__tests__/workunit-migration-tail.test.ts 覆盖全部迁移路径
- 错误映射收口 http-helpers.ts:一张映射表 WORKUNIT_ERROR_MAPS(全部端点)+ sendMappedError 唯一翻译出口 + route() 包装器,文案↔状态码单点承载 - 4 处 human-only 守卫收敛为 requireHuman 中间件(A2A §4.4 措辞不变) - POST /:id/verify 业务下沉 WorkUnitService.verifyManually(判别联合 kind, 脱 HTTP 可直测,进 workunit-api 主套件) - workunit.routes.ts 820 → 471 行 - 开放问题定夺(grilling 议题):取统一翻译层,service 错误形态零改动
#543 收编后 StepRetryCtx 不含 traceId,配额满/fallback 签发/重试再败 三处 warn/error 丢 traceId 字段。Ctx 加 traceId?: string 透传, agent-loop 调用点注入,三处日志恢复携带,与首败日志同字段串联。
…ackModels (#574) - providers.ts:ProviderDefinition 增 listModels(args+parser id)/ fallbackModels 增量字段;codex debug models(jsonModelSlugs)/ kimi provider list --json (jsonModelKeys)/ opencode models(lines)逐 CLI 实测声明(2026-09-16, 0.147.0/0.38.0/1.18.18);claude 实测无模型列表命令,仅 fallback(沿用 #565 无可靠手段不声明先例) - 新增 model-probe.ts(studio-shared /node 入口):parseModelList 纯函数 + getProviderModels;进程内缓存 key=binary@version,失败入缓存不重试; 探测失败/超时/解析为空回退 fallbackModels(source=fallback) - cli-scanner detectProvider 挂模型探测,DetectedRuntime 增 models/modelsSource; local-workspace 随 runtimes 记录持久;GET /workspaces/runtimes 条件透出 - WorkspacePage runtime 卡片展示模型清单 + 实测/静态来源徽标(票面写的模型 picker 仓内不存在,展示落点以现状为准,字段已透出供未来 picker 消费) - server.test 集成窗口 15s→30s:#574 起扫描链每 provider 多一次真实探测进程 (kimi ~4s / opencode ~7s 实测),沿用 #565 同类调整先例 - CONTEXT 沉淀:studio-shared / workspaces / web 三处
…CheckCache/createSettledTracker (#575) harness 1.8.0 随动后 goal.hooks.ts 模块级 new CheckCache()、workunit.service.ts 模块级 createSettledTracker(),该套件对 @dommaker/harness / @dommaker/studio-shared 的 wholesale mock 缺这两个导出,import 期 0 测试即崩。mock 补齐对应桩。 波及面排查(ticket 要求):89 个 wholesale-mock @dommaker/studio-shared 的套件 全量跑通——88 个在 vitest 范围内全绿(1055 tests),trigger-eval.test.ts 为 vitest.config.ts 配置排除项不跑。 #578 为同症重复单,同一修复覆盖。
全仓 pnpm update @dommaker/harness@1.8.1 -r Co-Authored-By: studio-harness-upgrade
- listByWorkUnitId 对齐「取最新 N 条」语义,limit(实取 limit+1 判更旧 余量)与 before 一并下推 queryMessages,带过滤查询走 B5 谓词倒扫 早停,扫描行数不随热文件全长增长(原无 limit 全扫) - QueryOpts 增 before(createdAt 严格 <,与 since 的 >= 互补), 快径谓词与全量路径 filter 逐句同口径 - 有意识的语义变更(票内 AC 许可):最旧 N 条 + 精确 total → 最新 N 条 + total 下界口径(匹配 ≤limit 时精确,超 limit 返回 limit+1;路由 hasMore=data.length<total 两种情形均正确; 前端 DiscussionPanel 只消费 data,不消费 total/before) - 扇出 fallback(无 channelId 的 legacy WU)每频道同下推 limit+1 再归并截断(全局最新 N ⊆ 各频道最新 N 之并)
…证环境涌现认领不再经 system-executor 空转(P7/P8 同款 !=='false' 风格,默认行为不变)(#579)
依据 docs/adr/2026-09-17-hooks-layer-shrink.md 的收缩裁决:
- studio-shared:删 src/harness/hooks/ 整层(声明表 / registerAllHooks / 4 个实现 /
barrel + 配套测试)与 bootstrap 的 getPipeline + 注册调用。原 hooks/audit.ts 是审计
事件发布器、不是 hook 且有活消费(skill-extraction 的 recordDecision),上移为
harness/audit.ts,导出面经 harness/index.ts 显式列名。
- 配套防漂移机制同批移除:hooks-closure-check(含 studio-shared build 挂载与测试)、
harness-coverage(整份脚本即 hook 清单)+ 根 harness:coverage 入口。
- studio-agent:删 runner-execution(executeSessionLoop)、runner-briefing 文件桥、
AgentRunner.execute、runner-params 的 loop 专属 prompt 构建;RunnerExecutionState
迁 types.ts 供 lightweight 路径继续用。
- 删 tests/integration/{hooks-pipeline,agent-hooks}.test.ts。
- CONTEXT.md 四处随动(shared harness 层、agent 包与 src 两级 runner-* 描述),
重跑 pnpm agents-md:sync 刷新 AGENTS.md 与 CAPABILITIES.md。
保留:propagateHarnessConfig + CLAUDE.md 复制(文件级约束通道)、buildAugmentedPrompt、
parseSessionMetrics、bootstrapHarness 初始化本体;harness 依赖版本不变。
验证:tsc-gate 无新错;eslint 改动文件 0 问题;
vitest run --changed origin/master → 767 files / 7871 passed, 0 failed, 11 skipped。
Standards 轴评审发现摘除后残留的过期描述,逐条修正: - runner-lightweight 头注释与函数 docblock:原「跳过 SDD 解析/REQUIREMENTS.md/ contract tests/Iron Laws/卡死检测」是「轻量 vs 完整」两路径对照,loop 删除后 对照物已不存在,改成本路径实际保有什么。 - runner-output 头注释:不再声称与已删执行路径共用;hasRecentActivity / queryResolutionHints 失去唯一调用方,就地申报「去留另裁」(与 runner-params 的 buildSessionFlag / buildAddDirArgs 同一口径)。 - worktree-resolver:「复制 CLAUDE.md 进 worktree 是为了 prompt 侧去重」这条已 不成立(#562 后无任何 prompt 侧读取者),改写为落 AGENTS.md + gitignore 薄身 两条真实目的,并修正 ensureDeps 的 pnpm install 位置说明(install 在主仓库跑, worktree 经 git 继承 lockfile 与 node_modules)。 - studio-agent CONTEXT.md「关键配置」表加 #562 注:maxSessions 随 session 循环 删除失去读取方,与既有三个只写不读字段同类,去留随上述孤儿一并裁。
7f8f11c 的 message 列了 5 处修正,实际只有 runner-lightweight / runner-output 两个文件入库(其余当时漏发 Edit)。本 commit 落真实改动: - worktree-resolver:头注释不再点名已删文件;FIX #3「复制 CLAUDE.md 是为了 prompt 侧去重」这条目的随 hooks 层消失,改写为 AGENTS.md 正本(已核实为 tracked)+ CLAUDE.md 薄身(.gitignore:95)两条真实理由。 - audit-subscriber 及其测试:发布方路径 harness/hooks/audit.ts → harness/audit.ts (#562 里该文件上移一级,引用侧注释漏改)。 - .gitignore:CACHE_PREFIX.md / .prompt.md 的说明不再指名已删执行路径;两条规则保留 (GIT_EXCLUDE_PATTERNS 不含它们,删规则才是行为变更)。 - studio-shared/harness/prompt-injection.ts:申报 formatConstraintsForPrompt 自 #562 起零生产消费方(唯一读方是已删的 hooks 层注入助手,核自 49ae7a1 的 git grep)。 - studio-agent/CONTEXT.md:maxSessions 标注随 session 循环删除失去读取方。 验证:tsc-gate 无新错;eslint 本轮改动文件 0 error(audit-subscriber 的 5 条 no-explicit-any warning 在未改动行、属存量);vitest run studio-agent + studio-shared/src/harness + apps/api/src/modules/audit → 25 files / 214 passed。
…ks 行 保留耐久结论(判据指针 + 要加运行时硬检查走 step-guards/completion-gates、不重建 hook 管线),去掉对已删符号清单的复述。harness sync-docs --check --agents 通过。
#562 删多 session 循环后剩下的死面整体摘除,公共 API 面与文档同步收窄: - runner-params:删 session flag / --add-dir 两个构建 helper 及其 cmd 入参, 会话续接只剩 spawnParams.sessionId + sessionResume 一条通道 - runner-lightweight:删 parameters 上无人设置的 flag 拼接读取分支(零生产者) 与因此失去理由的 provider 守卫 - runner-output:删 worktree mtime 停滞探测(活路径改静默看门狗)与 RKB 薄包装 (匹配核心在 studio-shared,活消费方是 apps/api resolution.service) - types:ExecutorConfig.maxSessions 与 Analyst 产出上下文三个类型移除 - studio-shared:删无人调用的约束 prompt 路由模块(渲染正本在 harness 侧) 裁定保留(见 docs/plans/2026-09-587-clear-562-orphans.md): - ExecutorConfig.taskTimeoutMinutes / sessionTimeoutMinutes 虽同属只写不读, 但删它连带改 apps/api 审计 Agent 引用该旋钮的建议文案,另票处理 - 新孤儿 formatRkbHint 申报不删(涉及两种 RKB 提示格式是否统一的设计判断) 测试:删主题函数被摘除的两个整文件,其余用例改断言活通道(非 skip、非删断言)。 验证:typecheck 无新错 + studio-shared build 通过 + vitest run --changed origin/master 765 files / 7837 passed / 0 failed;8 个代表形态的 spawn 命令 改动前后逐字相同。
- providers.ts addDirFlag 字段 JSDoc 登记:唯一读取方随本票摘除,注册表其余 flag 字段均有读取方只它没有;保留赋值待「工具访问限制是否重新接线」另票裁 - docs/plans/2026-09-587-clear-562-orphans.md 强制追踪(.gitignore docs/* 覆盖, 仓内 28 份计划同例):commit body 与 studio-agent/CONTEXT.md 都引它作裁定正本, 不入库即死链;同时补 AC#4 的改前/改后命令逐字对照与收尾记录
dommaker
enabled auto-merge
September 18, 2026 06:28
auto-merge was automatically disabled
September 18, 2026 06:32
Pull Request is not mergeable
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
116 commits from feat/ship-20260918-1401
Commits
1ecc0b3 docs(shared): 沉淀——约束 prompt 正本只剩 harness 一处,别在 studio 重建 role→trigger 路由表(#587)
7d7054e docs(shared): #587 评审随动——申报第二个新孤儿 spawn.addDirFlag + 计划文档入库补 AC#4 凭据
6cee8d0 docs(shared): CONTEXT.md 记 #587 后的 RKB 消费方收敛与新孤儿 formatRkbHint(申报待另票)
fc47d1c refactor(runner): 清 #562 遗留孤儿 helper 与 sessionFlags 死通道(#587)
d1e2b07 docs(adr): 决策审计归并——events:audit 链下线 + 审计数据补齐走 audit-logs 轨(#588)
d974c01 docs(shared): CONTEXT.md 墓碑收紧——按 exploration-sediment「不留已删符号残影」重写 hooks 行
c0b968e docs(hooks): #562 评审随动第二批——补齐上一条声称却未落地的修正
7f8f11c docs(hooks): #562 评审随动——清掉指向已删路径的注释与申报新孤儿
dc1ecae refactor(hooks): 删除 hooks 管线层与 session loop 死路径(#562 裁决落地)
49ae7a1 docs(adr): hooks 层收缩与约束分拣标准(#562 裁决)
ad80baa test(agents): review-gate.test 随动 harness 删除 GateContext.projectId (#535)
5324a29 test(e2e): pmo-full-chain boot env 补 PMO_GIT_REPO_ROOTS——三条腿仓库建在 tmpRoot 下,缺省根之外会被 POST /project 白名单 400 级联全挂(部分修复 #580,套件其余 7 例断言的派生链已被 #471 退役,修绿路线待人类决策)
379a592 feat(agents): STUDIO_CLAIM_FITNESS=false 豁免认领前适任判断的真实 CLI 调用——fake/无凭证环境涌现认领不再经 system-executor 空转(P7/P8 同款 !=='false' 风格,默认行为不变)(#579)
1739056 docs(cli): CONTEXT.md 沉淀 checkPrerequisites 测试 mock 口径 (#577)
8d8f03e test(cli): server.test.ts mock scanAllProviders 隔离真机全量扫描 (#577)
70d6e5a fix(agents): system-executor execSh 恒开 killProcessGroup(#581)
f0c0e60 perf(channels): WU 讨论串端点 limit 下推命中 file-store 倒扫快径 (#576)
3b00bc1 chore: upgrade @dommaker/harness 1.8.0 → 1.8.1
00ae3b2 docs(agents): CONTEXT.md 沉淀 wholesale mock import 期崩坑(#575 排查结论)
7cd3324 fix(agents): monitor-agent-resilience 套件 import 崩溃——wholesale mock 补 CheckCache/createSettledTracker (#575)
Test plan
🤖 Generated with studio-ship