产品控制论画像
案例: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 atconfine()"(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-onlypermission/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-profilebundle 默认关闭(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