技能与目标
skill(技能)按需加载可复用指令包;goal 让会话围绕一个长期目标跨多轮自动推进
本页讲两个互补的概念:**skill(技能)**是可复用、任务型的指令包,需要时才加载;目标是附着在会话上的持久完成目标,让 agent(智能体)围绕一件事跨多轮自动推进。
技能(skill)
skill 是一组特定任务的指令,通常是一个 SKILL.md(或平铺的 Markdown 文件)加上可选的脚本、资源与引用。它不属于系统提示词,而是按需加载:目录只把技能名和描述注入会话,正文在 agent 决定使用时才读入。
技能放在哪里
Harness 从多个本地根目录发现技能,按优先级从高到低:
| 来源 | 路径 |
|---|---|
项目 .dsh | <projectRoot>/.dsh/skills |
项目 .agents | <projectRoot>/.agents/skills |
| 自定义目录 | 配置的 customSkillDirs |
用户 .dsh | <dshHome>/skills |
用户 .agents | <agentsHome>/skills |
项目根目录是最近的含 .git 的祖先目录;没有 .git 时回退到当前工作目录。把技能放进 <dshHome>/skills(默认 ~/.dsh/skills)即可跨项目复用。
技能格式
技能可以是单层目录(<name>/SKILL.md)或平铺 Markdown 文件(<name>.md)。name 必须为 kebab-case。frontmatter 里的关键字段是 name、description,可选的 whenToUse、disable-model-invocation 与 user-invocable。例如:
---
name: code-review
description: 检查代码风格、lint 与最佳实践
whenToUse: 用户请求审查代码时
---模型如何加载技能
会话会收到一份 <available_skills> 目录,只包含技能名与截断后的描述。当用户点名某个技能、或任务明显匹配技能描述时,agent 会调用 skill 工具按准确名称加载,随后得到该技能的完整 <skill_content> 指令体。
用户也可以直接用 /name 调用技能:这会以用户手势的方式注入完整技能体,适用于被 disable-model-invocation 屏蔽、目录与 skill 工具都不暴露的技能。加载的技能体只影响当前会话,不会改变其他会话。
目标(goal)
目标是附着在现有会话上的单个持久完成目标,带有按修订号演进的阶段(active / paused / blocked / complete)和一个 Goal Round 上限。它是状态,不是调度器,也不是一段独立对话:会话日志始终是其真源。
一句话创建
当用户直接提出一个长期目标时,agent 可以用 create_goal 创建目标;任何语言的直接请求都可能触发它,但例行的单轮工作不应建目标。读取或修改前,agent 会先调用 get_goal 拿到准确的 goal_id 与 revision,再用 update_goal 执行 edit / pause / resume / complete / blocked。
由人控制:/goal 命令
面向人的 /goal 命令直接观察或修改当前目标,不经过模型轮次:
| 输入 | 结果 |
|---|---|
/goal | 显示当前目标、阶段、轮次计数/上限与可用命令 |
/goal <objective> | 创建并武装一个目标 |
/goal edit <objective> | 就地修改目标,不改变阶段 |
/goal pause | 暂停目标并解除续行 |
/goal resume | 恢复已停止的目标,或在会话恢复/fork 后重新武装 |
/goal clear | 清除当前指针,保留历史 |
恢复与 fork 之后的续行
目标的续行权限是进程本地的,不会持久化。会话 resume(恢复)或 fork 之后,即使目标阶段仍是 active,也会先解除武装——自动续行只有在随后通过 /goal resume 或 update_goal resume 做一次经人类授权的恢复后才会开始。这防止了未经确认的自动工作。
阻塞与轮次预算
blocked 阶段会记录一个策略代码和一段说明。模型只有在同一阻塞条件连续持续至少 blockedAfterConsecutiveRounds 个 Goal Round(默认 3)之后才能标记阻塞;难度、不确定性或"还有可做的事"不算阻塞。defaultMaxGoalRounds(默认 256)只约束目标轮次数量,不计量 token、费用或时长。
目标与会话日志
目标的每次变更都会向会话日志追加一条 goal/change 事件,记录变更后的完整快照;日志是唯一持久真源,目标状态不依赖任何界面状态。
下一步
- 把技能随 preset 一起分发,见 Agent Preset。
- 用子 agent 并行处理大目标,见 Subagent 与工作流。