产品控制论画像

案例:deepseek-harness

Product Portrait · 控制论画像deepseek-harness
CASE

DeepSeek Harness (dsh v0.2.1-alpha.2) — 控制论画像

把用户原始意图拆解为「事件溯源的目标对象 + 里程碑 todo + 待批计划 + 定时触发」,并把「计划/执行」两个时标显式解耦;本轮新增权威校验与时间维度设定值。

SP

设定值(用户意图 → 可验证子目标)— 维持 ⭐强

用户意图 → 可验证子目标
承担角色:把用户原始意图拆解为「事件溯源的目标对象 + 里程碑 todo + 待批计划 + 定时触发」,并把「计划/执行」两个时标显式解耦;本轮新增权威校验与时间维度设定值。

关键机制

  • dsh-plan-mode(docs/subsystems/plan.md:11):plan/mode({active: boolean})改为 log-only、整值替换 的 session 事件——durable 且可回放、永不进入模型 transcript;plan 单元折叠已提交模式/命令结算/最近请求头记录的模式,resume/fork/compaction 三者均从日志恢复。计划与执行的硬分离从「提示词约定」升级为「持久化日志事实」。
  • dsh-tool-goal 权威与阈值硬校验(packages/goal/tool-goal/README.md:55):工具只在该活跃 driver 内、有 open turn 的精确调用 agent 上执行;create/edit/pause/resume 额外要求运行时根 agent 当前轮存在直人消息——subagent 或非人生产者无法创建/编辑目标;blocked 调用在配置的连续轮数(blockedAfterConsecutiveRounds,默认 3)未满前被机械拒绝,模型须在 blocked_reason 中描述持续条件。自主轮成功 complete/blocked 后同时终止物理轮。
  • dsh-tool-schedule 把「时间」变成一等设定值(docs/subsystems/schedule.md:265,docs/tool-catalog.md:35):四只工具 schedule_create/list/delete/update 支持 after_seconds、绝对 at、有界定频 every_seconds、显式 IANA 时区的 daily/weekly 本地时刻、以及五字段 cron;委派子会话(depth>0)被工具层拒绝,到期消息恢复原 Session——设定值从「空间维度(哪个 agent)」扩展到「时间维度(何时)」。
  • dsh-goal-round-driver:把 active 目标转为连续 Goal Round(<goal_round> 提示排队 + 计轮数),agent/pre-step 校验 reservation——持久目标自动续跑。
  • dsh-tool-todo(todo_write,整表替换语义):把大目标切成模型自报里程碑清单,allowParallelInProgress 无默认值、由部署显式声明(docs/tool-catalog.md:44)。
  • dsh-agent-presets + dsh-agent-instructions:per-session agent.cordis.yml 组合 + AGENTS.md 工作区指令链。
控制论映射:KT-ctrl-045(规划-执行解耦,plan/mode 的 log-only 化把解耦沉淀为持久事件);KT-ctrl-002(设定值 r = 用户意图,且本轮以「直人消息」为其权限来源);KT-ctrl-041(分层控制);KT-ctrl-046(options/SMDP,schedule 的触发器即时间域动作原语)。
⭐强——设定值闭环完整(计划确认门 + 持久目标状态机 + 可勾选里程碑 + 时间触发器),且本轮把「谁能改设定值」从软约定升级为硬校验(直人消息权威 + 连续轮数下限)。⚠️弱——计划的「成功判据」仍是模型自报文本,无自动校验;目标达标与否依赖模型自述,设定值缺乏独立测量支撑。
E

E 环 — 评估 / 传感器(最薄弱环;本轮判定:部分修正)

评估/传感器
承担角色:仍无「目标达成度」的独立测量。本轮出现了一个真实的独立 LLM 审查器(auto-review),但它评的是单个动作的可授权性,不是任务目标的达成度;其余传感器仍为工具输出契约、错误信号、资源/性能测量三类间接信号。

关键机制

  • ⭐ dsh-experimental-auto-review(本轮新增,须明确记为「部分修正」):packages/experimental/auto-review/。REVIEW_POLICY 自我定位为「final authorization reviewer for exactly one pending tool call」(src/index.ts:41-62):对单个待执行工具调用做 low/medium/high 风险分级并给出 allow/deny,allow 即替代人工审批、调用立即以完整主机权限执行。挂载点为 tools/pre-execute 瀑布(src/index.ts:684-714),仅当 session 的 permission preset 为 AUTO_PRESET 时介入(:689),high 恒 deny 且不可被人类指令降级。⇒ 这是一个真正的独立 LLM 评估器,但评估对象是「动作可授权性」而非「目标达成度」;且 base bundle 未装配(packages/bundle/base/cordis.patch.yml 无 auto-review 条目)——默认关闭,opt-in。
  • telemetry 族(session-telemetry / product-telemetry / otel):资源与性能镜像(turn/step 计数、墙钟、token、耗时分布),不含目标符合度字段。
  • verify-* 脚本族:开发期门控(仓库自检/构建校验),不是运行时评估器——不计入运行时 E 环。
  • dsh-workspace-changes:只记录「世界变了什么」(文件/工作区差异),不判「变得对不对」。
  • dsh-tools canonical tool output 契约:pre-execute→execute→post-execute 三瀑布 + tools/result 观察事件;工具结果冻结、快照参数——保证格式可信,不判好坏。
  • dsh-llm-retry:把 request-error 当作错误信号源,按 retryableCodes/maxRetries/指数退避重试——用于触发重试而非修正方向;且对模型不可见(packages/llm/llm-retry/README.md:50-58)。
  • dsh-message-feedback / command-feedback:Like/Dislike + 备注,feedback/record 仍是 log-only 事件——用户反馈被采集但不进入控制闭环。
控制论映射:KT-ctrl-001(开环 vs 闭环)——在「效果评估」维度上 dsh 仍接近开环(无 y 的独立测量源);auto-review 是局部闭环的审批传感器(KT-ctrl-031 鲁棒稳定 / KT-ctrl-033 仲裁),而非 KT-ctrl-035(DOB)式的目标偏移观测器。对照 KT-ctrl-012(观测噪声 R):仍缺「测输出 y 与目标差」的 Critic 传感器,也缺低通滤波/信噪比加权。
❌最弱(判定由「最弱」部分修正为「最弱,但已存在一个非同质的独立评估器」)——本轮必须写清 auto-review,以免读者以为漏检:它证明了 dsh 具备构造独立 LLM 评估器的架构能力,但它(a)评授权而非评达标,(b)默认关闭,(c)粒度是单次工具调用而非任务。执行达标仍靠三样间接物:工具契约保证格式、token-meter 保证资源不爆、llm-retry 保证请求不抛——三者都不回答「这一步是否达成了目标子目标」。这仍直接掐断 R 环的输入,使纠偏带明显变窄。
T

T 环 — 执行器 / 工具(最突出环)— 维持 ⭐⭐

工具调用/执行器
承担角色:工程化最成熟的执行器——一套带硬限幅、看门狗、审批仲裁、冗余取消、并发分类的工具调用管线;本轮新增跨语言执行(PTC)与多后端 fail-closed 沙箱。

关键机制

  • 呈现模式收敛为 native | ptc:export type ToolPresentationMode = 'native' | 'ptc'(packages/core/tools/src/index.ts:672),配置 union 仅接受二者(:812);ptc 模式下原生工具 schema 从请求中消失,模型只拿到 run_code 与 SDK 说明——both 已被拒绝(旧 native/code/both 三态不复存在)。
  • PTC 真运行时(本轮最大 T 环增量):ctx.ptcRuntime 是正式 seam(docs/capability-seams.md:672),实现有两家——
  • ptc-runtime-node(packages/ptc-runtime/ptc-runtime-node/README.md:12):执行模型编写的 TypeScript,每次调用起一个受管 Node 进程,宿主函数以 async binding 注入;受同一套平台沙箱策略约束(与 Bash 同源),带 elapsed deadline、输出上限、V8 heap limit;取消与完成终止整个托管进程组;请求受限模式而后端不可用时直接失败。
  • experimental-ptc-runtime-python:实验性 Python 路径,走 fd-3 协议,需 sandbox + sandboxPolicy,受限运行无法建立约束时以 sandbox-unavailable 失败(docs/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.md:12)。
  • 沙箱后端族 + fail-closed:sandbox-local 按平台选 runner 链——linux: bwrap → Landlock;darwin: Seatbelt;win32: ACL restricted-token;另有 sandbox-ssh。"A platform with no chain, or a chain where every probe fails, is unavailable and fails closed at confine()"(packages/sandbox/sandbox-local/README.md:71),enforcement 分 full/partial,不可用即 SANDBOX_UNAVAILABLE。⚠️ 本机事实(v1.5 更正):本机 bwrap 已安装且 runner 链选中 bwrap,enforcement=full——read-only / workspace-write 档在 shell + fs 双侧真强制。v1.4 所记「本机 bubblewrap 与 Landlock 均不可用 → 实际走 fail-closed 分支」已证伪(属环境事实更正,非内核设计变化,⛔ 不计入分值变动)。
  • permission preset 打包 sandbox + approval:set(session, name) 解析 preset(未知名抛错),跑 Auto admission,追加 log-only permission/preset 事件,再分别经 setSandboxMode(dsh-sandbox-policy)与 setApprovalPolicy(dsh-user-approval)写入两个 knob,且仅在有效值变化时写(docs/subsystems/permission-presets.md:73);可从内置档派生 custom/Auto。
  • dsh-tool-call-timeout-policy:读每个工具声明的 timeoutMs 派生 per-tool deadline,超时替换为 TOOL_TIMEOUT——看门狗硬超时。
  • dsh-spill-policy:超 maxInlineBytes 的纯文本结果 spill 到 Store,替换为有界首尾预览——输出 token 限幅(anti-windup 的 token 侧);PTC 子派发经 tools/ptc-dispatch-log 瀑布复用同一预览策略。
  • dsh-llm-retry:指数退避+抖动+providerRetryAfterMs——冗余重试(时间域冗余)。
  • dsh-repeat-tool-reminder:连续同参调用同一工具达阈值(3/5/8)注入提醒,只 enrich 不 veto——死循环预警但不硬停(packages/guard/repeat-tool-reminder/README.md:91)。
  • dsh-session-checkpoint-policy:tools/execute 顶层分发前强制 sessions.flush()——执行器副作用前的持久化屏障。
控制论映射:KT-ctrl-034(饱和/看门狗/anti-windup)、KT-ctrl-033(冗余与仲裁)、KT-ctrl-031(鲁棒稳定性,read-only fail-safe 默认 + 沙箱 fail-closed)、KT-ctrl-030(模型不确定性,ptc 让执行器在语言维度获得鲁棒性)。
⭐⭐最突出——三瀑布解耦(策略/执行/改写)给了安全阀与限幅的清晰落点;超时+沙箱+审批+溢出+重试+取消形成完整「硬限幅+降级+冗余」链条;本轮再叠加两项结构性升级:执行器跨语言化(PTC 把可执行面从「工具调用」扩展到「程序」)与沙箱多后端 fail-closed(不可用即拒绝,而非静默降级为无约束)。⚠️小弱点:repeat-tool-reminder 只提醒不否决;无跨工具的统一预算表(token/并发/成本一次性汇总看门狗)。
M

M 环 — 记忆 / 状态估计(次强,本轮增量最大之一)— 维持 ⭐

记忆/状态估计
承担角色:以「事件溯源(append-only 日志)」为唯一真源,经投影(纯函数 fold)派生可读状态;本轮新增派生检索索引与持久格式代际——记忆从「可回放」升级为「可回放 + 可检索 + 有代际」。

关键机制

  • ⭐ dsh-session-query-sqlite FTS5 派生索引(packages/session-query/session-query-sqlite/README.md:61):确定性排序(先比实际 FTS5 高亮匹配跨度数,再比文档长度,event time/session id/seq 破平),结果携带受 snippetChars 约束的有界 snippet(Unicode code point 计),无 provider 私有数值分;分页走 generation-bound opaque cursor——SessionSearchCursor 绑定精确归一化请求,语料变化即 SESSION_QUERY_STALE_CURSOR(跨会话 cursor 不跨语料变化存活,会话内 cursor 可存活于无关会话变化)。FTS5 语法(引号/OR/NEAR/*)一律当数据而非可执行查询。
  • 五只只读检索工具(docs/tool-catalog.md:39):session_event_read / session_event_search / session_event_trace / session_search / session_trace;每个结果都以不可变的调用 agent session 授权,隐藏 provider cursor;opt-in(需显式装配,需要强制 deadline 或有界内联输出时另挂 timeout/spill 策略)。
  • ⭐ SESSION_FORMAT_VERSION = 4(packages/core/session/src/types.ts:89):v3→v4 把 user 角色的工具结果提升为 tool 角色消息;相邻代际迁移不可变,且只读 open 不发布后继格式——持久层首次获得显式代际契约。
  • skill 注册表 host + per-scope 分层(docs/subsystems/skills.md:13):注册按调用上下文的 scope 归档,host 行与仓库插件落全局层、agent preset 的 standing composition 所挂插件落该 preset 层;provider 名按层唯一而非进程唯一;读取时合并全局层与查看 scope 链(最近层同名直接胜出),发现缓存按解析后的 scope 链作键——先验知识库的分层注入。
  • 压缩恢复改「generation 前进才重试」(docs/subsystems/compaction.md:101):失败请求恢复走 agent/request-error,仅当 surface replacement generation 前进时才返回 retry 动作(即使后续摘要工作抛错亦然),取消仍优先——重试条件从「时间/次数」改为「状态确实前进了」。
  • dsh-token-meter + compaction-basic + tool-result-pruner:回放感知 measure() + 压力触发压缩,先裁工具结果再 LLM 摘要(复用 KV 前缀缓存),CONTEXT_WINDOW_EXCEEDED 溢出恢复——信息滤波/降维。
  • dsh-session-projection:SessionProjectionRegistry,每个投影单元 init/apply/view 三纯函数,框架订阅一次 session/event 驱动所有单元。
控制论映射:KT-ctrl-010(状态估计,事件溯源折叠);KT-ctrl-011(Kalman 预测-更新,投影=update、token-meter 压力=可观测性门);KT-ctrl-014(信息滤波/降维);本轮新增 KT-ctrl-024(状态可观测性/可观测性判据)——FTS5 索引 + cursor generation 把「我能否可靠地回看过去」变成可判定的工程属性(STALE_CURSOR 即观测失效信号)。缺失:KT-ctrl-012(观测噪声 R vs 过程噪声 Q,仍无置信度/协方差)与 KT-ctrl-013(分离性)。
⭐次强——事件溯源+投影提供极高状态保真度与可回放性;本轮把记忆推进到「可检索(FTS5 确定性排序 + 有界 snippet + generation-bound cursor)」与「有代际(v4 不可变迁移 + 只读 open)」,并以 scope 分层注册表承载先验。⚠️弱点——仍缺置信度(P 协方差):记忆只记事实不记「我有多确定」,P/R 环无法区分「确信」与「猜测」。
P

P 环 — 规划 / 分层控制(本轮增量最大之一)— 维持 ⭐强

规划/分层控制
承担角色:慢规划器(计划模式+目标)+ 快执行器(工具调用)+ 多级委派(subagent)+ 滚动重规划(goal-round-driver + ralph);本轮委派统一为托管式 activations,并新增全局控制面与实验性 Agent Teams 协调回路。

关键机制

  • ⭐ 委派统一为托管式 activations(docs/upgrade-guide/v0.2.1-alpha.1/subagent-activations/guide.md:12):dsh-tool-subagent 删除 backgroundMode/enableRunInBackground/模型参数 run_in_background;每次委派接受子代理后立即返回 {kind: 'activation', subagentId},最终答案经父级完成通知投递;foreground 结果与 {kind:'background', jobId} 结果一并移除,子代理不再经 job_output/job_kill 收集或停止——委派生命周期从「任务收集模型」改为「运行时托管模型」。
  • provider 契约明确 6 个(docs/subsystems/subagent.md:326):spawn / fork / acp / codex / claude-code / dsh-sdk。本地 provider(spawn/fork)经 prepareContinuable() 提供 creation inputs,可续(含结算后、持久化与 session query 可用时)可冷恢复;外部 provider(acp/codex/claude-code/dsh-sdk)只贡献一个执行句柄、不接受后续消息、不获得多轮。
  • ⭐ 新增全局控制面(packages/subagent/tool-subagent-control/README.md:12):send_message(直系父↔子之间的 steer)、interrupt_agent(停止子代理当前轮,保留其 inbox 与后代)、list_agents(来自可单独加载的 list-agents 插件,按 durable id + label 列出可续子代理)。父与可续子继承同一 send_message 定义与排序,模型通信不引入子专属 schema;仅直系父子可通信。
  • ⭐ Agent Teams(实验)(docs/subsystems/agent-team.md:58,docs/tool-catalog.md:43):持久 roster + 共享任务 DAG——每个任务事件存完整快照,revision 为 compare-and-set 值且每次变更 +1,blockedBy 边必须指向未删除任务且保持图无环,writeScopes 是归一化的咨询性路径前缀而非锁;配 直投 inbox(agent/inbox/spliced)。九只工具(spawn_teammate/team_task_*/wait_agent 等)全部限定于隐式 Team Lead 与 durable teammate。⚠️ agent-team-profile bundle 默认关闭(shipped base bundle 保持该包 disabled,文档化的 profile patch 才启用它并同时禁用旧的 continuable-child 控制名)。
  • dsh-plan-mode(慢 Planner)+ dsh-goal + goal-round-driver(滚动重规划,MPC 滚动时域)。
  • dsh-tool-ralph + workflow:ralph 为 fresh-agent 多轮迭代(每轮 fresh structured-output 子代理,maxRounds=64);workflow 为 JS 编排脚本驱动子代理序列——options/MDP 时序抽象。
控制论映射:KT-ctrl-044(MPC 滚动时域)、KT-ctrl-043(时标分离 ε)、KT-ctrl-042(多层递阶控制,本轮由「父委派子」扩展为「父—子双向控制面 + Team roster」)、KT-ctrl-046(options/SMDP)、KT-ctrl-041(分层控制,Team Lead 层显性化)。
⭐强——dsh 同时具备「计划确认门(plan-mode)」「持久目标滚动(goal-round-driver)」「多级频率分离(subagent/workflow)」三层 P 能力;本轮把委派从「一次性后台任务」升级为有身份、可续、可中断、可通信的托管 activation,并以 Agent Teams 把协调回路显性化(roster + revision-CAS 任务 DAG + 直投 inbox)。⚠️弱——规划时域仍由配置固定(maxGoalRounds / ralph maxRounds / subagent 无前瞻度);父层仍无 λ 更新循环(无持续约束注入与协调变量更新),Agent Teams 的 DAG 无环性由写入时校验保证,但无自动重规划器。
R

R 环 — 反思 / 反馈闭环(中弱)— 维持 ⚠️

反思/反馈闭环
承担角色:以「事件/错误触发的重试 + 提醒 + hook 强制 steer + 目标续跑 + 输出塌缩停机」为主的反馈,集中体现为偏 P 项(即时纠偏);仍缺独立「误差计算」机构与 I/D 项。

关键机制

  • dsh-llm-retry:retryPolicy 驱动重跑,且 "Nothing here is model-visible: no retry event, delay, provider error, or failed partial output reaches the model or derived messages"(packages/llm/llm-retry/README.md:50-58)——重试对模型完全不可见,因此不构成学习信号。
  • dsh-hooks-claude-code / hooks-codex:用户 hooks.json 映射到 harness 拦截点;agent/turn-stopping 的 deny 经 agent.steer() 强制再走一步,tools/pre-execute / PostToolUse 的 deny 阻断工具(packages/experimental/hooks-claude-code/README.md:89)——外力硬中断 + 方向改道。
  • dsh-repeat-tool-reminder:同工具同参连续达阈值(3/5/8)注入提醒,只 enrich 不 veto(packages/guard/repeat-tool-reminder/README.md:91)——趋势预警(软 D 项)。
  • ⭐ dsh-repeat-output-guard(本轮新增,base bundle 默认启用):packages/guard/repeat-output-guard/。监视实时输出流,当一段短行序列在滑动窗口内重复足够次数即 agent.cancel({kind:'hook'}),让运行在塌缩早期停止而非烧完输出预算(默认 mode: cancel、windowLines: 400、ngram: 5、minCount: 8、minChars: 2000,见 packages/bundle/base/cordis.patch.yml:454-461)。但 README 明写:"it never rewrites a message, and a trip is stopped, not repaired"(README.md:136,"Stops, never repairs")——塌缩前已持久化的退化文本仍在历史中并会被重放进后续请求,清除它需要适配侧重放策略或压缩触发,本包都不实现。⇒ 属「检测—停机」而非「算误差—修正」。
  • dsh-tool-subagent-report(reportDelivery: next-step):子代理在最近步骤边界唤醒父任务并注入上下文——反馈回灌(下级→上级)。
  • dsh-goal-round-driver + dsh-agent-instructions:状态变化驱动的迭代反馈。
  • packages/core/agent-loop/README.md:220:"No built-in turn budget"——工具调用或 steer 都会延续当前轮,限制失控轮次的策略必须从既有生命周期扩展点(如 agent/turn-stopping)自行取消。
控制论映射:KT-ctrl-002(负反馈闭环,hooks deny→steer = 实际 y 超限时强制校正)、KT-ctrl-020~023(PID,主要为 P + 弱 D;repeat-output-guard 是最锐利的 D 项但只有停机没有修正量)。缺失:KT-ctrl-021/I(积分项,无「反复犯同一错误」的累积补偿)、KT-ctrl-004(误差收敛校正律,无独立「算误差 e=r−y」环节)、KT-ctrl-025(稳态误差/超调验收)。
⚠️中弱——以事件/外力触发为主(request-error、hook deny、repeat-reminder、repeat-output-guard、goal 变更),仍无 self-critique、无 e=r−y。本轮新增的 repeat-output-guard 让「检测」更锐利(默认开启、可中止),但它只停机不修复,属保护性停机而非反馈校正。其最强点(hooks deny→steer、子代理 reportDelivery、guard cancel)仍是「外力硬中断 + 方向改道」而非「算误差再修正」。由于 E 环无独立 critic,dsh 反馈放大器输入信号质量上限不高——只能对感知到的失败纠偏,难对未感知的偏航闭环。
★

控制论画像总结

整体范式:整体范式(保留并更新):
  • 装配(三层):packages/bundle/base/cordis.patch.yml(95 条 - id: 装配行)、packages/bundle/web-app/cordis.patch.yml + packages/bundle/web-app/presets/{standard,minimal,ptc,cordis}.patch.yml、profile patch 层
  • 设定值:docs/subsystems/plan.md:11、packages/goal/tool-goal/README.md:55、docs/subsystems/schedule.md:265
  • T 环:packages/core/tools/src/index.ts:672(native|ptc)、packages/ptc-runtime/ptc-runtime-node/README.md:12、packages/sandbox/sandbox-local/README.md:71、docs/subsystems/permission-presets.md:73、packages/guard/timeout-policy/src/index.ts
  • M 环:packages/session-query/session-query-sqlite/README.md:61、docs/tool-catalog.md:39、packages/core/session/src/types.ts:89、docs/subsystems/skills.md:13、docs/subsystems/compaction.md:101
  • P 环:docs/upgrade-guide/v0.2.1-alpha.1/subagent-activations/guide.md:12、docs/subsystems/subagent.md:326、packages/subagent/tool-subagent-control/README.md:12、docs/subsystems/agent-team.md:58
  • E 环:packages/experimental/auto-review/src/index.ts:41-62(REVIEW_POLICY)、:684-714(tools/pre-execute 挂载);packages/feedback/message-feedback/src/index.ts(log-only)
  • R 环:packages/llm/llm-retry/README.md:50-58、packages/experimental/hooks-claude-code/README.md:89、packages/guard/repeat-tool-reminder/README.md:91、packages/guard/repeat-output-guard/README.md:136、packages/core/agent-loop/README.md:220