dsh-ptc-discipline: Hard Goals and Pending Gates in PTC Mode
dsh-ptc-discipline:PTC 模式下的硬目标与待办闸门\n\n# 前言\n\nDSH 的 PTC 模式已经把模型直接调用挡到
欢迎使用《羽毛球分组比赛记分》微信小程序
Xiaoye
run_code 后面,其余工具通过生成的 SDK 访问。这个方向减少了模型直接乱调工具的空间,但没有解决另一个常见问题:模型可能在没有目标、没有任务拆解的情况下就开始执行。\n\n下面介绍 yuan-source-666 维护的 dsh-ptc-discipline。它是一个 DSH agent preset,在 PTC 模式之上再加一道硬闸门:会话里没有 active goal、没有非空 todo、也没有 in_progress todo 时,工具调用会被直接拒绝。它和“写进系统提示词请先做计划”的区别是,这里的拒绝由 ctx.tools.guard() 执行,不是靠模型自觉。\n\n# 这是什么\n\n- 插件名:dsh-ptc-discipline\n- 维护者:yuan-source-666\n- 目录分类:工作流\n- 形式:DSH agent preset\n- 版本:package.json 中为 1.1.0\n- 许可证:MIT\n\n它解决的问题不是 PTC 本身,而是在 PTC 下补一个前置纪律:先建立可验收目标,再建立完整待办,然后才允许写文件、执行 bash 等操作。\n\n# 核心机制\n\nPTC 的呈现方式沿用 @deepseek-ai/dsh-agent-tool-presentation 的 mode: ptc:模型只能直接调用 run_code,其余工具通过生成的 SDK 访问。\n\n闸门挂在 ctx.tools.guard() 上,覆盖所有工具调用,包括 run_code 内部的 await tools.xxx() 子调用。放行条件是:\n\n1. 存在 active 的 goal。\n2. todo 列表非空。\n3. 至少一条 todo 的状态是 in_progress。\n\n固定顺序为 create_goal → todo_write → 其余一切。被拒时返回原因,例如:\n\n\nDiscipline gate: no goal (call create_goal with the verifiable end condition); no todo list\n(call todo_write with the complete task list). Seed it from inside run_code first — create_goal,\nthen todo_write, then call \"write\".\n\n\n闸门规则对应如下:\n\n| 条件 | 不满足时 |\n| — | — |\n| 存在 active goal | no goal (call create_goal …) 或 goal is \"paused\" (…) |\n| todo 列表非空 | no todo list (call todo_write …) |\n| 至少一条 in_progress | no todo is in_progress … 或 every todo is completed … |\n\n# 实现位置\n\nctx.tools.guard() 挂在本 preset 的 preset scope 上。preset scope 是每个加入该 preset 的 agent scope 的祖先,guardReason 沿 scope chain 由远及近求值,所以它精确覆盖该 preset 的所有 agent,不外溢到其他 preset,也不需要全局状态。\n\n守卫在 tools/pre-execute waterfall 之后执行。任何守卫都不能强制放行另一个守卫的拒绝。PTC 的 SDK 子调用走 scheduler.prepare → prepareExecution → preExecute → guardReason,和原生调用同一条管道,因此 await tools.write(...) 同样过闸。\n\n# 豁免与 fail-open\n\n三类调用不在闸门内:\n\n- run_code 本身:它是 PTC 的唯一直接入口,拦住它会直接死锁。\n- 引导工具:create_goal、get_goal、update_goal、todo_write、ask_user_question、skill、present。不建纪律的工具不应被纪律拦住。\n- 非 root agent:create_goal 要求 root agent 当前 turn 有真人消息,子 agent 满足不了;不豁免会让所有 subagent 立刻死锁。\n\ngoal / sessionProjections 服务不可用时,闸门 fail-open,即不拦截。这样在没装 goal、todo 相关插件的组合里,不会把 agent 彻底锁死。\n\n# 兼容性\n\n插件面向 DSH 0.2.2+,并跟随官方 ptc preset 做对齐。README 列出三处变化:dsh-tool-subagent-control/list-agents 子路径已从 exports 移除,modelSelectionSettings 更名为 modelSelection 并新增 modelDiscovery,官方新增的 dsh-tool-executor-ptc 一并加入。闸门逻辑未改动。\n\n注意:如果删掉 dsh-tool-subagent-control 整行(而不只是 list-agents 子路径),子 agent 的 send_message / interrupt_agent 控制工具会一并消失,子 agent 只能一次性返回结果、无法再追问或中断。\n\n# 安装与启用\n\n安装命令来自 README:\n\nsh\nnpx dsh plugin add yuan-source-666/dsh-ptc-discipline\n\n\n在支持 bundle 的应用里也可以用 plugin_manager:\n\njsonc\n{ \"action\": \"install_bundle\", \"target\": \"yuan-source-666/dsh-ptc-discipline\" }\n\n\n卸载:\n\njsonc\n{ \"action\": \"remove_bundle\", \"target\": \"dsh-ptc-discipline\" }\n\n\n装好后,在新建会话里选择 PTC 纪律 preset 即可生效。\n\n# 配置\n\nREADME 给出如下配置骨架:\n\nyaml\n- id: ptc-discipline\n name: 'dsh-ptc-discipline'\n config:\n requireGoal: true # 默认 true\n requireTodo: true # 默认 true\n requireActiveTodo: true # 默认 true;关掉只要求列表非空\n bootstrapTools: [ ... ] # 默认见上表\n sectionText: ... # 替换写进系统提示词的那段纪律说明\n\n\nrequireActiveTodo 关闭后,闸门只要求 todo 列表非空,不再要求存在 in_progress。\n\n# 典型用法\n\n1、按上面命令安装插件。\n2、新建 DSH 会话,选择 PTC 纪律 preset。\n3、发起一个任务。如果会话里还没有 goal / todo,第一个工具调用会被拒,报错会提示先执行 create_goal 和 todo_write。\n4、在 run_code 里补上纪律。顺序是:先 create_goal,再 todo_write,最后才调用真正要执行的工具。\n5、后续工具调用通过闸门后继续执行。\n\nREADME 的已知边界提到,todo 每个新 turn 会清空(todos projection 在 turn/start 重置),goal 跨 turn 存活。所以第二个请求开始时,闸门会再次要求 todo_write。\n\n验证可以运行:\n\nsh\nnpm test\n\n\ntest/gate.test.mjs 用假 Cordis 上下文覆盖 10 个场景,包括空会话拒绝、goal active 但无 todo 拒绝、有一条 in_progress 放行、goal paused 拒绝、subagent 豁免、服务缺失 fail-open 等。\n\n# 适用场景与注意\n\n适合已经在 PTC 模式下工作、希望每次执行都强制先有目标和任务拆解的场景。也适合想验证 ctx.tools.guard() 这类 scope 级硬约束如何不外溢到其他 preset 的人。\n\n使用前注意几点:\n\n- 插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。本项目 package.json 标注 MIT。\n- 只有 run_code 一个直接入口,被拒后模型必须再写一个 run_code 程序把纪律补上。\n- plan 模式会和 requireTodo 打架:plan-mode 的 guidance 建议规划阶段别用 todo_write,但闸门此时仍要求 todo。在 plan 下应给这个 preset 关掉 requireTodo,或先建一个写计划的 todo。\n- 单测只覆盖闸门逻辑,不覆盖真实会话里的完整链路。\n- 社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系;本插件也不是官方应用商店中的预置项。\n\n# 结尾\n\ndsh-ptc-discipline 的价值在于把目标与 todo 检查从提示词建议升级为工具调用前的硬约束,并用 fail-open 和三类豁免避免死锁。目录页与源码如下:\n\n- 目录页:https://www.skillhub.cn/plugins/yuan-source-666/dsh-ptc-discipline\n- GitHub:https://github.com/yuan-source-666/dsh-ptc-discipline\n¶
欢迎使用《羽毛球分组比赛记分》微信小程序