<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://kogorou0105-bit.github.io/kogorou-blog/blog</id>
    <title>Kogorou Blog Blog</title>
    <updated>2026-05-12T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://kogorou0105-bit.github.io/kogorou-blog/blog"/>
    <subtitle>Kogorou Blog Blog</subtitle>
    <icon>https://kogorou0105-bit.github.io/kogorou-blog/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[我在等 Agent 的 Workflow 层]]></title>
        <id>https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer</id>
        <link href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer"/>
        <updated>2026-05-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[当 agent 生态有了 skills、subagents、hooks 和 plugins 以后，workflow 应该成为更明确的组织、启动和产物边界。]]></summary>
        <content type="html"><![CDATA[<p>最近我同时接触了几套 agent workflow。</p>
<p>一套是我自己在做的 Zenith 组件迁移 workflow。这个 workflow 里面有很多 subagent，每个 agent 通常会调用一两个 skill 去完成自己的局部工作。另一套是比较出名的 Trellis。它的 coding workflow 明显更完整，除了 agent 和 skill，还有很多专业的脚本、插件、hooks、任务状态、上下文注入、检查和沉淀机制。</p>
<p>Trellis 很有启发，但我不敢直接把它那套 workflow 放进当前做 Zenith 组件迁移的项目里。不是因为它不好，而是因为它太完整了。一旦放进去，两套 workflow 的 agents、skills、hooks、commands、plugins 和运行产物很容易挤在一起，项目会变得非常乱。</p>
<!-- -->
<p>这让我开始意识到一个问题：现在很多 agent 生态已经有了 skills、agents、commands、hooks、plugins、knowledge，但这些仍然更像一堆能力零件。真正复杂的工作不是调用某个 skill，而是执行一条 workflow。</p>
<p>所以我现在更倾向于一个判断：<strong>agent 平台不应该只提供 skills，也应该把 workflow 作为一等抽象。</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="两套-workflow-都有价值但直接混放会乱">两套 workflow 都有价值，但直接混放会乱<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#%E4%B8%A4%E5%A5%97-workflow-%E9%83%BD%E6%9C%89%E4%BB%B7%E5%80%BC%E4%BD%86%E7%9B%B4%E6%8E%A5%E6%B7%B7%E6%94%BE%E4%BC%9A%E4%B9%B1" class="hash-link" aria-label="两套 workflow 都有价值，但直接混放会乱的直接链接" title="两套 workflow 都有价值，但直接混放会乱的直接链接" translate="no">​</a></h2>
<p>Zenith 组件迁移 workflow 和 Trellis coding workflow 解决的是不同问题。</p>
<p>组件迁移更关心：</p>
<ul>
<li class="">旧组件能力怎么识别；</li>
<li class="">新组件能力怎么对齐；</li>
<li class="">参数和事件怎么映射；</li>
<li class="">样式、交互、业务语义怎么校验；</li>
<li class="">迁移过程中的截图、对比、失败原因怎么留证据。</li>
</ul>
<p>Trellis coding workflow 更关心：</p>
<ul>
<li class="">需求怎么写成 PRD；</li>
<li class="">任务状态怎么从 planning 进入 in progress；</li>
<li class="">implement / check / update spec 怎么形成闭环；</li>
<li class="">上下文怎么注入给 agent；</li>
<li class="">代码修改后如何验证、提交和归档。</li>
</ul>
<p>它们都很有价值，但它们不应该被简单倒进同一个 <code>.opencode/agents</code>、<code>.opencode/skills</code>、<code>.opencode/hooks</code> 或 <code>.opencode/commands</code> 里。</p>
<p>因为当一个 workflow 同时包含 agents、skills、hooks、commands、plugins、knowledge 和运行产物时，它就不再是几个配置文件，而是一套工作系统。如果不同工作系统的零件都散放在同一个目录层级里，用户很快就会失去边界感：这个 agent 属于哪个 workflow？这个 skill 是通用的，还是只服务某个迁移流程？这个 hook 会不会影响别的任务？这个运行产物能不能删？</p>
<p>这不是洁癖问题，而是可维护性问题。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="skills-解决不了-workflow-的组织问题">skills 解决不了 workflow 的组织问题<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#skills-%E8%A7%A3%E5%86%B3%E4%B8%8D%E4%BA%86-workflow-%E7%9A%84%E7%BB%84%E7%BB%87%E9%97%AE%E9%A2%98" class="hash-link" aria-label="skills 解决不了 workflow 的组织问题的直接链接" title="skills 解决不了 workflow 的组织问题的直接链接" translate="no">​</a></h2>
<p>现在很多 agent 平台已经支持 skills。skill 很适合表达“某个能力怎么做”，比如读文档、查表格、处理 Figma、发消息、搜索代码、生成图片。</p>
<p>但 workflow 不是 skill 的集合那么简单。</p>
<p>一个组件迁移 workflow 不是“调用组件迁移 skill”就结束了。它至少需要经历这样的过程：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">识别迁移对象</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; 调研旧组件</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; 调研新组件</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; 建立参数映射</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; 拆分实现任务</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; 调用不同 subagent</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; 记录中间结论</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; 做结构、行为、视觉、语义校验</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; 保存证据</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; 把失败经验沉淀回流程</span><br></div></code></pre></div></div>
<p>这条链路里确实会用到 skills，但 skill 只是能力单元。真正需要被表达的是：这些能力应该按什么顺序使用、每一步需要什么输入、产出放在哪里、失败时怎么处理、最后如何检查和沉淀。</p>
<p>也就是说，skill 解决的是“我会什么”，workflow 解决的是“我如何稳定完成一类任务”。</p>
<p>如果只有 skills，没有 workflow，系统会越来越像一个能力抽屉：里面东西很多，但用户每次都要重新组织一次流程。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflow-应该是聚合层而不是能力层">workflow 应该是聚合层，而不是能力层<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#workflow-%E5%BA%94%E8%AF%A5%E6%98%AF%E8%81%9A%E5%90%88%E5%B1%82%E8%80%8C%E4%B8%8D%E6%98%AF%E8%83%BD%E5%8A%9B%E5%B1%82" class="hash-link" aria-label="workflow 应该是聚合层，而不是能力层的直接链接" title="workflow 应该是聚合层，而不是能力层的直接链接" translate="no">​</a></h2>
<p>我现在更倾向于把这些概念拆开看：</p>
<ul>
<li class=""><strong>skill</strong>：一个可复用能力，例如查资料、读设计稿、发消息、跑检查。</li>
<li class=""><strong>agent</strong>：一个执行角色，例如迁移分析 agent、实现 agent、review agent。</li>
<li class=""><strong>command</strong>：一个明确入口，例如启动迁移、启动检查、生成报告。</li>
<li class=""><strong>hook</strong>：生命周期中的自动动作，例如会话开始时注入上下文，任务结束时归档产物。</li>
<li class=""><strong>plugin</strong>：平台扩展机制，例如接入浏览器、文件系统、远端服务。</li>
<li class=""><strong>knowledge</strong>：背景知识、项目规范、组件约定、历史经验。</li>
<li class=""><strong>workflow</strong>：把上面这些组织起来的一条可执行流程。</li>
<li class=""><strong>run / state</strong>：一次执行过程中产生的中间产物和运行状态。</li>
</ul>
<p>这样看，workflow 的职责不是替代 skill，而是编排 skill。它应该描述一类任务的完整工作方式，而不是某个局部能力的调用说明。</p>
<p>一个比较理想的 workflow package 里，至少应该能回答这些问题：</p>
<ul>
<li class="">这个 workflow 解决什么问题；</li>
<li class="">它有哪些阶段；</li>
<li class="">每个阶段需要什么输入；</li>
<li class="">每个阶段会产生什么输出；</li>
<li class="">哪些 agents 会参与；</li>
<li class="">依赖哪些 shared skills；</li>
<li class="">有哪些 workflow-local skills；</li>
<li class="">哪些 plugins / hooks / commands 可用；</li>
<li class="">需要读取哪些 knowledge；</li>
<li class="">中间产物放在哪里；</li>
<li class="">如何判断这次运行完成；</li>
<li class="">如何把经验沉淀回可复用知识。</li>
</ul>
<p>这才是 workflow 作为一等抽象的意义。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="公共-skill-应该被引用而不是复制">公共 skill 应该被引用，而不是复制<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#%E5%85%AC%E5%85%B1-skill-%E5%BA%94%E8%AF%A5%E8%A2%AB%E5%BC%95%E7%94%A8%E8%80%8C%E4%B8%8D%E6%98%AF%E5%A4%8D%E5%88%B6" class="hash-link" aria-label="公共 skill 应该被引用，而不是复制的直接链接" title="公共 skill 应该被引用，而不是复制的直接链接" translate="no">​</a></h2>
<p>这里还有一个容易混淆的点：如果 workflow 有自己的边界，那公共 skill 怎么办？</p>
<p>我不觉得每个 workflow 都应该复制一份 skill。像读文档、查代码、处理 Figma、生成截图、发消息这类能力，本来就应该是公共的。如果每个 workflow 都内置一份，很快会变成重复维护，也会让 skill 的版本和行为变得不可控。</p>
<p>更合理的方式是：workflow 拥有自己的边界，但公共 skill 通过依赖声明被引用进来。</p>
<p>也就是说，一个 workflow package 里可以有自己的 local skills，用来表达这个流程特有的能力；同时它也可以声明自己依赖哪些 shared skills：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> zenith</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">component</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">migration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">skills</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">shared</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> code</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">search</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> figma</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">reader</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> screenshot</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">compare</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">local</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> component</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prop</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">mapper</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> migration</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">report</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">writer</span><br></div></code></pre></div></div>
<p>这样 workflow 不需要复制公共能力，但也不会默认看到所有能力。它能用什么，应该是显式声明出来的。</p>
<p>这点很重要。因为如果所有 workflow 都能隐式访问所有 skills，系统还是会退回到“能力抽屉”的状态：东西很多，但边界不清楚。用户不知道某个 skill 是这个 workflow 真正需要的，还是刚好在全局目录里被匹配到了。</p>
<p>所以我更倾向于让 workflow 像 package 一样声明依赖。公共 skill 可以放在项目级、用户级，甚至远端 registry 里；workflow 启动时只解析自己声明过的那一组能力。</p>
<p>一个比较清楚的解析顺序可能是：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">workflow local skill</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; project shared skill</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; user/global shared skill</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; remote registry skill</span><br></div></code></pre></div></div>
<p>这样既能共享，也能隔离。workflow-local skill 可以覆盖公共 skill，但这个覆盖只影响当前 workflow，不会污染其他流程。</p>
<p>这也说明 workflow 自己同样需要配置。</p>
<p>skill 的配置回答的是：这个能力怎么调用、需要什么输入、有什么权限、产物放在哪里。workflow 的配置回答的是：这条流程怎么启动、能用哪些能力、分几个阶段、运行产物放在哪里、失败后怎么恢复。</p>
<p>换句话说：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">skill config = 能力配置</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">workflow config = 流程配置</span><br></div></code></pre></div></div>
<p>如果 workflow 没有 manifest，它就很容易退化成一段 prompt 或一组松散目录。只有当 workflow 能明确声明自己的入口、依赖、阶段、产物和权限时，它才真的像一个可以复用、可以 review、可以迁移的 package。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="目录不应该只是统一而应该分层">目录不应该只是统一，而应该分层<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#%E7%9B%AE%E5%BD%95%E4%B8%8D%E5%BA%94%E8%AF%A5%E5%8F%AA%E6%98%AF%E7%BB%9F%E4%B8%80%E8%80%8C%E5%BA%94%E8%AF%A5%E5%88%86%E5%B1%82" class="hash-link" aria-label="目录不应该只是统一，而应该分层的直接链接" title="目录不应该只是统一，而应该分层的直接链接" translate="no">​</a></h2>
<p>一开始我会很自然地想：既然 OpenCode 负责 agent，那是不是所有东西都应该塞进 <code>.opencode</code>？</p>
<p>但后来我觉得这个目标应该稍微改一下。</p>
<p>更合理的目标不是“全部塞进一个目录”，而是：<strong>一个入口目录，配置与产物分层。</strong></p>
<p>比如可以想象成这样：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  skills/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    code-search/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    figma-reader/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    screenshot-compare/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  workflows/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    zenith-component-migration/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      manifest.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      agents/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      skills/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        component-prop-mapper/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        migration-report-writer/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      commands/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      hooks/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      plugins/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      knowledge/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      lib/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    trellis-coding/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      manifest.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      agents/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      skills/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        spec-writer/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        task-state-updater/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      commands/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      hooks/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      plugins/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      knowledge/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      lib/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  state/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;run_id&gt;/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      logs/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      artifacts/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      evidence/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      cache/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      results/</span><br></div></code></pre></div></div>
<p>这里的关键不是一定要叫 <code>.opencode/workflows</code> 或 <code>.opencode/state</code>，而是要区分两类东西。</p>
<p><code>.opencode/skills</code> 可以放项目级共享能力，<code>workflows/&lt;name&gt;/skills</code> 则放当前 workflow 的私有能力。前者可以被多个 workflow 显式引用，后者只服务当前 workflow。</p>
<p>第一类是可复用的工作包，也就是 workflow package。它应该适合版本化，适合 review，适合被复制到另一个项目里。agents、skills、commands、hooks、plugins、knowledge、manifest、lib 都属于这一类。</p>
<p>第二类是一次执行产生的运行产物，也就是 workflow run。它可能很大，会频繁变化，还可能包含敏感内容。日志、缓存、下载的依赖、截图、评测结果、临时文件、失败记录都属于这一类。</p>
<p>这也是为什么 <code>.trellis</code> 这类并列产物目录会存在。它不是没有道理。运行产物如果和配置混在一起，git 状态会很吵，清理也麻烦，多人协作时更容易误提交。</p>
<p>所以问题不是“为什么有 <code>.trellis</code>”，而是用户需要一个更清晰的心智模型：哪些是可复用 workflow package，哪些是一次性 workflow run。</p>
<p>配置应该可版本化，产物应该可清理。这两个边界如果不清楚，workflow 越强，项目越乱。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflow-不应该靠模糊匹配启动">workflow 不应该靠模糊匹配启动<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#workflow-%E4%B8%8D%E5%BA%94%E8%AF%A5%E9%9D%A0%E6%A8%A1%E7%B3%8A%E5%8C%B9%E9%85%8D%E5%90%AF%E5%8A%A8" class="hash-link" aria-label="workflow 不应该靠模糊匹配启动的直接链接" title="workflow 不应该靠模糊匹配启动的直接链接" translate="no">​</a></h2>
<p>还有一个问题是启动方式。</p>
<p>skill 可以靠模糊匹配触发。用户说“帮我查一下会议纪要”，系统判断需要调用某个 skill，这可以接受。因为 skill 是局部能力，即使匹配错了，影响范围通常也比较小。</p>
<p>但 workflow 不一样。</p>
<p>workflow 一旦启动，意味着 agent 要进入一套比较长的状态机：创建任务、读取规范、调用 subagent、生成中间产物、执行检查、更新沉淀。如果它像 skill 一样靠模糊匹配启动，用户很难知道自己到底进入了哪条流程，也很难判断什么时候应该退出、暂停、恢复或清理。</p>
<p>所以 workflow 更适合用硬命令启动，例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/workflow zenith-component-migration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/workflow trellis-coding</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/workflow blog-writing</span><br></div></code></pre></div></div>
<p>或者更短一些：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+run zenith-component-migration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+run trellis-coding</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+run blog-writing</span><br></div></code></pre></div></div>
<p>命令形式不重要，重要的是 workflow 应该有明确入口。用户真正需要记住的，不应该是哪些 agent、skill、hook 分别放在哪里，而是：我要运行哪个 workflow。</p>
<p>一旦 workflow 被显式启动，系统就可以明确告诉用户：</p>
<ul>
<li class="">当前使用的是哪个 workflow；</li>
<li class="">当前处在哪个 phase；</li>
<li class="">本次 run 的产物目录在哪里；</li>
<li class="">哪些 agents / skills / hooks / plugins 会参与；</li>
<li class="">当前缺哪些输入；</li>
<li class="">下一步会做什么；</li>
<li class="">如何暂停、恢复或结束。</li>
</ul>
<p>这比“AI 猜测用户想调用哪个 skill”稳定得多。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="中间产物也需要自己的位置">中间产物也需要自己的位置<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#%E4%B8%AD%E9%97%B4%E4%BA%A7%E7%89%A9%E4%B9%9F%E9%9C%80%E8%A6%81%E8%87%AA%E5%B7%B1%E7%9A%84%E4%BD%8D%E7%BD%AE" class="hash-link" aria-label="中间产物也需要自己的位置的直接链接" title="中间产物也需要自己的位置的直接链接" translate="no">​</a></h2>
<p>很多 agent 系统最大的问题是：过程发生在聊天里，结果也留在聊天里。</p>
<p>这对简单问题没关系，但对 workflow 来说很危险。</p>
<p>一次组件迁移过程中会产生很多东西：</p>
<ul>
<li class="">迁移对象列表；</li>
<li class="">旧组件能力分析；</li>
<li class="">新组件能力分析；</li>
<li class="">参数映射表；</li>
<li class="">不兼容点；</li>
<li class="">截图证据；</li>
<li class="">校验结果；</li>
<li class="">失败原因；</li>
<li class="">后续修正建议。</li>
</ul>
<p>一次 coding workflow 也会产生很多东西：</p>
<ul>
<li class="">PRD；</li>
<li class="">技术设计；</li>
<li class="">research；</li>
<li class="">任务状态；</li>
<li class="">check result；</li>
<li class="">spec 更新建议；</li>
<li class="">commit 前验证记录。</li>
</ul>
<p>就连写博客这种看起来很轻的任务，也会产生内容类型、来源模式、写作风格、追问答案、文章骨架、草稿、构建结果。</p>
<p>这些内容不能只散在聊天记录里。它们应该有明确的 artifact location。</p>
<p>否则下一次继续任务时，agent 只能重新从聊天历史里猜；换一个 agent 时，上下文更容易丢；多人协作时，别人也不知道哪些结论是过程产物，哪些结论已经沉淀成规范。</p>
<p>workflow 如果要可靠，就必须认真对待中间产物。它们不是噪音，而是流程能被恢复、检查、复盘和改进的证据。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="几个-workflow-的共同结构">几个 workflow 的共同结构<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#%E5%87%A0%E4%B8%AA-workflow-%E7%9A%84%E5%85%B1%E5%90%8C%E7%BB%93%E6%9E%84" class="hash-link" aria-label="几个 workflow 的共同结构的直接链接" title="几个 workflow 的共同结构的直接链接" translate="no">​</a></h2>
<p>Zenith 组件迁移、Trellis coding workflow、博客写作 workflow 看起来是完全不同的事情，但它们有很相似的结构。</p>
<p>Zenith 组件迁移需要多个 subagent 协作。有人负责读旧组件，有人负责找新组件能力，有人负责参数映射，有人负责视觉和行为校验。这里的重点不是某一个 skill，而是迁移流程本身。</p>
<p>Trellis coding workflow 更接近一个成熟 harness。它有任务状态，有脚本，有 hooks，有上下文注入，有检查和沉淀。它证明了 workflow 可以比简单 agent prompt 更稳定。</p>
<p>博客写作 workflow 看起来轻量，但也有流程：确认内容类型、确认来源模式、确认风格、追问关键问题、生成结构、写正文、构建验证。它说明 workflow 不只属于 coding，也适合知识工作。</p>
<p>这些例子共同说明一件事：复杂任务需要的不是更多零散能力，而是一套能组织能力、状态和产物的 workflow 层。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="如果推动到上游应该最小化迁移">如果推动到上游，应该最小化迁移<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#%E5%A6%82%E6%9E%9C%E6%8E%A8%E5%8A%A8%E5%88%B0%E4%B8%8A%E6%B8%B8%E5%BA%94%E8%AF%A5%E6%9C%80%E5%B0%8F%E5%8C%96%E8%BF%81%E7%A7%BB" class="hash-link" aria-label="如果推动到上游，应该最小化迁移的直接链接" title="如果推动到上游，应该最小化迁移的直接链接" translate="no">​</a></h2>
<p>如果要把这个想法推动到 OpenCode 或 Trellis 上游，我不觉得应该一上来就要求重构所有目录。</p>
<p>更现实的路径可能是三步。</p>
<p>第一步，只做路径解析和兼容。</p>
<p>支持从 <code>.opencode/workflows/&lt;name&gt;/</code> 读取一个 workflow package，但保留现有目录结构。旧的 <code>.trellis</code> 仍然能用，已有项目不需要迁移，也不会被破坏。</p>
<p>第二步，提供可配置的产物根目录。</p>
<p>默认仍然可以使用 <code>.trellis</code> 或原来的目录，但允许用户切换到 <code>.opencode/state/</code>。这样不会破坏已有用户的清理脚本、ignore 规则和协作习惯。</p>
<p>第三步，补一个最小示例 workflow 和文档。</p>
<p>让用户能看到：只要一个目录名或一个 command，就能启动完整 workflow。维护者也更容易理解这个抽象的价值，因为它不再只是目录规范，而是一个可运行的用户体验。</p>
<p>这个迁移路径的重点是“最小可合并”。先让 workflow package 这个概念出现，再逐步让配置、产物、命令入口和文档形成闭环。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="agent-需要-workflow-层">Agent 需要 workflow 层<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/agent-workflow-layer#agent-%E9%9C%80%E8%A6%81-workflow-%E5%B1%82" class="hash-link" aria-label="Agent 需要 workflow 层的直接链接" title="Agent 需要 workflow 层的直接链接" translate="no">​</a></h2>
<p>我现在越来越觉得，agent 平台下一步要补的不是更多零散 skills，而是 workflow 这一层。</p>
<p>skills 解决的是“我会什么”。workflow 解决的是“我如何稳定完成一类任务”。</p>
<p>如果 workflow 没有自己的命名空间、启动入口和产物边界，那么能力越多，项目越乱。反过来，如果 workflow 可以被打包、显式启动、隔离运行、沉淀产物，那么 agent 才真正从“能调用工具”走向“能执行流程”。</p>
<p>这也是我为什么不敢直接把 Trellis workflow 放进 Zenith 项目的原因。</p>
<p>我不是不想复用它，而是希望复用的是一个清晰的 workflow package，而不是把另一套工作流的 agents、skills、hooks、commands 和运行产物一起倒进当前项目。</p>]]></content>
        <category label="Agent" term="Agent"/>
        <category label="Workflow" term="Workflow"/>
        <category label="AI Engineering" term="AI Engineering"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[别让优绩主义把同路人变成对手]]></title>
        <id>https://kogorou0105-bit.github.io/kogorou-blog/blog/meritocracy-and-ranking</id>
        <link href="https://kogorou0105-bit.github.io/kogorou-blog/blog/meritocracy-and-ranking"/>
        <updated>2026-05-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[聊聊优绩主义如何把同路人变成对手。]]></summary>
        <content type="html"><![CDATA[<p>最近和朋友聊天时，又想起一个词：<strong>优绩主义</strong>。</p>
<p>它听起来像是在讨论社会制度、教育筛选和精英叙事，但落到日常里，常常只是一些很小的瞬间：一句阴阳怪气的话，一个听说别人没拿奖学金后的眼神，或者看到同学多做成一点事后，心里冒出来的酸意。</p>
<p>比较本身不一定有问题。真正麻烦的是，比较会慢慢变成价值判断：别人做得好，就像更配；自己暂时没做到，就像低人一等。于是人与人之间很容易从互相参照，滑向互相审判。</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="我以前也会这样想">我以前也会这样想<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/meritocracy-and-ranking#%E6%88%91%E4%BB%A5%E5%89%8D%E4%B9%9F%E4%BC%9A%E8%BF%99%E6%A0%B7%E6%83%B3" class="hash-link" aria-label="我以前也会这样想的直接链接" title="我以前也会这样想的直接链接" translate="no">​</a></h2>
<p>我之前也有过类似的心态。</p>
<p>本科的时候，我也会不自觉地陷进那种优绩主义思维里。看到别人比自己强，心里会酸，会给自己找一些解释：他是不是更会投机取巧，他是不是刚好运气好，他是不是只是更会包装。</p>
<p>等到自己某些方面比别人好一点，又会很容易产生一种隐秘的优越感，好像自己终于站到了一个可以评价别人的位置上。</p>
<p>现在回头看，这种心态其实挺累的。</p>
<p>它表面上是在追求进步，实际上是在不断把自己和别人绑在同一张排名表上。别人前进一步，自己就像被挤下去一点；自己好不容易前进一步，又忍不住回头看有没有人落在后面。</p>
<p>久而久之，努力不再是为了把事情做好，而是为了证明“我比谁更值得”。</p>
<p>我后来也遇到过一些很具体的场景。比如之前我没有拿到奖学金，跟我一起健身的朋友听到以后，态度里似乎闪过了一点不屑。当然这也可能只是我的猜测，不一定真是他这样想。但那一瞬间我确实能感觉到，某个外部结果很容易被拿来判断一个人。</p>
<p>这也是优绩主义最隐蔽的地方。它不一定非要有人直接说“你不行”。有时候一个眼神、一句玩笑、一个语气，就足够让人感受到那张看不见的排名表。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="排名别人之前也要准备好被别人排名">排名别人之前，也要准备好被别人排名<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/meritocracy-and-ranking#%E6%8E%92%E5%90%8D%E5%88%AB%E4%BA%BA%E4%B9%8B%E5%89%8D%E4%B9%9F%E8%A6%81%E5%87%86%E5%A4%87%E5%A5%BD%E8%A2%AB%E5%88%AB%E4%BA%BA%E6%8E%92%E5%90%8D" class="hash-link" aria-label="排名别人之前，也要准备好被别人排名的直接链接" title="排名别人之前，也要准备好被别人排名的直接链接" translate="no">​</a></h2>
<p>最近网上还流行一种玩法，叫“从夯到拉”排名。</p>
<p>这种东西当然可以说只是玩梗。人喜欢分类，喜欢排序，喜欢给事物打标签，这本身也很正常。问题是，当这种排名习惯从娱乐蔓延到人身上，它就会变得很微妙。</p>
<p>你今天把别人放进一个排名里，明天也要接受别人把你放进另一个排名里。</p>
<p>所以我会觉得，给别人排名这件事，本质上要做好被别人排名的准备。你用某个标准衡量别人，别人也可以用另一个标准衡量你。你觉得别人“拉”，别人也可能觉得你在别的地方不行。</p>
<p>这算不算优绩主义的一种？我觉得不一定完全等同，但它们背后有相似的冲动：先假设人可以被放进一套等级里，再用某个指标决定谁更高级，谁更低级。</p>
<p>优绩主义更强调“成绩”“能力”“努力之后的结果”；网络排名可能更轻浮，也更随意。但它们最后都很容易走向同一个方向：把复杂的人压扁成一个位置。</p>
<p>一个人不再是一个具体的人，而是榜单上的一个名次，是某个圈层里的一个等级，是可以被比较、被嘲笑、被归类的对象。</p>
<p>这种思维一旦变成习惯，人和人的关系就会越来越紧绷。因为你永远不知道自己什么时候会被放到别人的尺子下面。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="鄙视链也是一种日常化的排名">鄙视链也是一种日常化的排名<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/meritocracy-and-ranking#%E9%84%99%E8%A7%86%E9%93%BE%E4%B9%9F%E6%98%AF%E4%B8%80%E7%A7%8D%E6%97%A5%E5%B8%B8%E5%8C%96%E7%9A%84%E6%8E%92%E5%90%8D" class="hash-link" aria-label="鄙视链也是一种日常化的排名的直接链接" title="鄙视链也是一种日常化的排名的直接链接" translate="no">​</a></h2>
<p>工作以后，这种东西也没有消失，只是换了形式。</p>
<p>比如我现在做前端。前端在很多研发鄙视链里，经常被放在比较靠下的位置。有人会觉得前端只是切图、调样式，不够“底层”，也不够“硬核”。</p>
<p>这个和优绩主义有没有关系？我觉得有关系，但不是简单的一一对应。</p>
<p>岗位鄙视链不只是优绩主义，它还混着技术崇拜、行业偏见、话语权分配，以及很多人对“难度”的想象。可是它确实借用了优绩主义的那套逻辑：谁更难，谁更核心，谁更接近系统底层，谁就更值得被尊重。</p>
<p>问题是，真实的软件工作没有这么简单。</p>
<p>前端当然有简单的部分，后端、算法、基础架构也都有重复、琐碎、工程化的一面。一个岗位是不是有价值，不应该只看它在鄙视链上的位置，而要看它解决了什么问题、承担了什么复杂度、服务了什么人。</p>
<p>但鄙视链很方便。它不需要理解别人的工作，只需要给对方贴一个位置。</p>
<p>学历鄙视圈也是一样。</p>
<p>最经典的一句话就是：“自我以上众生平等，自我以下等级森严。”这句话好笑，是因为它太真实了。很多人不是反对等级，只是反对自己被放在等级下面。只要自己刚好站在一个还不错的位置，就很容易开始维护那套等级。</p>
<p>学校、学历、岗位、收入、城市、公司、title，这些东西都可以变成新的尺子。尺子越多，人就越容易在某一把尺子上找到一点优越感，也越容易在另一把尺子上感到羞耻。</p>
<p>这可能就是我现在越来越警惕的地方。</p>
<p>如果一个人总要靠把别人排低一点来确认自己，那他其实也很难真正自由。因为他相信这套排名，所以他也必须永远活在这套排名里。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="同路人没有必要互相拖下水">同路人没有必要互相拖下水<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/meritocracy-and-ranking#%E5%90%8C%E8%B7%AF%E4%BA%BA%E6%B2%A1%E6%9C%89%E5%BF%85%E8%A6%81%E4%BA%92%E7%9B%B8%E6%8B%96%E4%B8%8B%E6%B0%B4" class="hash-link" aria-label="同路人没有必要互相拖下水的直接链接" title="同路人没有必要互相拖下水的直接链接" translate="no">​</a></h2>
<p>很多时候，大家本来就是同学一场，或者朋友一场。说得直接一点，很多人本来就是同一个阶层、同一种处境里的人。</p>
<p>大家面对的压力其实很相似：学业、就业、家庭期待、未来的不确定性，还有那种“不知道自己够不够好”的焦虑。</p>
<p>在这种情况下，如果还要互相讥讽，互相踩一脚，其实很不划算。</p>
<p>你拿了奖学金，当然值得高兴。别人没拿，也不代表他这个人就低一等。你找到一个好机会，当然可以分享。别人暂时没有，也不需要立刻被放到某个失败者的位置上。</p>
<p>一个人做成了一件事，不管大小，对他自己来说都可能是一次进步。我们当然可以比较，但比较最好是为了互相激励，而不是为了互相拖下水。</p>
<p>我现在越来越觉得，人和人之间最珍贵的东西，不是永远在同一个水平线上，也不是假装大家没有差距。</p>
<p>差距当然存在。能力有差距，资源有差距，选择有差距，运气也有差距。真正重要的是，我们怎么看待这些差距。</p>
<p>如果看到别人往前走，第一反应是贬低他，那我们其实是在用别人的进步惩罚自己。如果看到别人暂时失意，第一反应是轻视他，那我们也只是在提前训练自己接受一个更冷酷的世界：只要你不够成功，你就不值得被好好对待。</p>
<p>但人不应该只在成功的时候才被尊重。</p>
<p>有些时候，帮不上忙也没关系。互相安慰一下，聊聊天，帮对方消化一点情绪，也是一种很具体的支持。不是每段关系都要提供资源，不是每次交流都要产生收益。</p>
<p>很多时候，能让一个人觉得“我不是一个人在扛”，就已经很重要了。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="放低姿态不是认输">放低姿态不是认输<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/meritocracy-and-ranking#%E6%94%BE%E4%BD%8E%E5%A7%BF%E6%80%81%E4%B8%8D%E6%98%AF%E8%AE%A4%E8%BE%93" class="hash-link" aria-label="放低姿态不是认输的直接链接" title="放低姿态不是认输的直接链接" translate="no">​</a></h2>
<p>现在和别人相处时，我更倾向于放低一点姿态。</p>
<p>这不是说真的觉得自己低人一等，也不是故意装傻、讨好别人。更准确地说，是我不太想在日常关系里持续释放竞争信号。</p>
<p>因为我发现，很多关系一旦进入“谁更强”的语境，就很难再轻松聊天了。你说自己做成了什么，别人可能听成炫耀；别人说自己做成了什么，你也可能不自觉地开始比较。最后大家都很累。</p>
<p>放低姿态有时候是一种降噪。</p>
<p>它不是否认自己的努力，也不是放弃争取更好的结果，而是尽量不把每一次交流都变成隐形的面试、答辩和排名。</p>
<p>我可以承认自己有不会的地方，可以承认自己没拿到某些东西，可以承认自己也会羡慕、会焦虑、会不确定。这样反而更容易和别人建立真实一点的关系。</p>
<p>当然，这不意味着要纵容别人轻视自己。放低姿态不是给别人踩自己的许可。如果对方真的只想通过贬低别人获得优越感，那保持距离也很正常。</p>
<p>只是对我来说，我不想再那么积极地参与那套排名游戏了。</p>
<p>优绩主义的问题，不是它让人想变好。</p>
<p>想变好没有错，努力也没有错，争取更好的结果更没有错。问题在于，当“成绩”“奖项”“机会”“排名”变成衡量人的唯一尺度时，我们就会忘记：一个人除了这些外部结果之外，还有很多东西值得被看见。</p>
<p>他的挣扎值得被看见，他的迟疑值得被看见，他的小进步值得被看见，他没有说出口的压力也值得被看见。</p>
<p>所以我现在更愿意提醒自己：不要急着把别人放进高低排序里。</p>
<p>别人做成了一点事，可以祝贺。自己暂时没做到，可以承认失落，但不必立刻把失落转化成酸意。别人遇到困难，如果能帮就帮一下，帮不了就陪他说说话。</p>
<p>人与人之间不一定总要互相成就什么宏大的东西，至少不要轻易互相消耗。</p>
<p>说到底，我们很多人其实都在同一条路上。</p>
<p>路已经够难走了，没必要一边走，一边还要把身边的人推下去。</p>]]></content>
        <category label="Meritocracy" term="Meritocracy"/>
        <category label="Reflection" term="Reflection"/>
        <category label="Personal" term="Personal"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[我是怎么读懂 Trellis Harness 的]]></title>
        <id>https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide</id>
        <link href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide"/>
        <updated>2026-05-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[一条从工作流到适配器的阅读路线，理解 Trellis harness 如何串联需求、实现、检查和沉淀。]]></summary>
        <content type="html"><![CDATA[<p>如果你第一次打开这个仓库里的 <code>.trellis/</code> 目录，很容易被里面的 workflow、tasks、spec、workspace、scripts 以及 <code>.opencode/</code> 适配层弄晕。它们看起来像一组零散的脚本和文档，但真正理解以后你会发现：Trellis harness 是一套把“需求澄清、实现、检查、沉淀、收尾”串起来的轻量工作流系统。</p>
<p>这篇文章面向想研究本项目 Trellis harness 的开发者。目标不是列一份冷冰冰的文件清单，而是给你一条可执行的学习路线：先读什么、再看什么、哪些命令值得亲手跑一遍，以及如何建立一套稳定的心智模型。</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="先建立心智模型trellis-到底在协调什么">先建立心智模型：Trellis 到底在协调什么？<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E5%85%88%E5%BB%BA%E7%AB%8B%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8Btrellis-%E5%88%B0%E5%BA%95%E5%9C%A8%E5%8D%8F%E8%B0%83%E4%BB%80%E4%B9%88" class="hash-link" aria-label="先建立心智模型：Trellis 到底在协调什么？的直接链接" title="先建立心智模型：Trellis 到底在协调什么？的直接链接" translate="no">​</a></h2>
<p>理解 Trellis harness 的关键，是先把它看成一条上下文驱动的工作流链路：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user input</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; SessionStart / workflow-state injection</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; AI reads current status</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; no_task / planning / in_progress / completed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; .trellis/workflow.md determines next step</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; task.py manages task lifecycle</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; JSONL controls sub-agent preloaded context</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -&gt; implement / check / update-spec / finish-work completes the loop</span><br></div></code></pre></div></div>
<p>换句话说，Trellis 并不是只靠 AI “记住流程”。它把流程写进文件，把状态落到任务目录，把上下文通过 hook 或 adapter 注入给 AI，再用脚本维护生命周期。</p>
<p>你可以把它想象成几层：</p>
<ol>
<li class=""><strong>用户输入</strong>触发一次会话轮次。</li>
<li class=""><strong>SessionStart / workflow-state 注入</strong>告诉 AI 当前任务状态和下一步该做什么。</li>
<li class=""><strong><code>.trellis/workflow.md</code></strong> 是总流程说明书。</li>
<li class=""><strong><code>.trellis/tasks/</code></strong> 保存每个任务的 PRD、状态、上下文 JSONL。</li>
<li class=""><strong><code>.trellis/scripts/task.py</code></strong> 负责创建、激活、校验、查询任务。</li>
<li class=""><strong><code>.trellis/scripts/get_context.py</code></strong> 负责按 phase、package、spec 等维度取上下文。</li>
<li class=""><strong><code>implement.jsonl</code> / <code>check.jsonl</code></strong> 决定 implement/check sub-agent 预加载哪些 spec 和 research。</li>
<li class=""><strong><code>.trellis/spec/</code></strong> 保存项目约定，避免 AI 凭空发挥。</li>
<li class=""><strong><code>.trellis/workspace/</code></strong> 保存开发者工作记忆和 journal。</li>
<li class=""><strong><code>.opencode/</code></strong> 把这一套接到 OpenCode 平台。</li>
<li class=""><strong><code>trellis-meta</code></strong> 用来研究和修改 Trellis harness 自身。</li>
</ol>
<p>先记住这条链路，后面看文件时就不会迷路。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="推荐学习顺序">推荐学习顺序<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E6%8E%A8%E8%8D%90%E5%AD%A6%E4%B9%A0%E9%A1%BA%E5%BA%8F" class="hash-link" aria-label="推荐学习顺序的直接链接" title="推荐学习顺序的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-从-trellisworkflowmd-开始先看流程宪法">1. 从 <code>.trellis/workflow.md</code> 开始：先看“流程宪法”<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#1-%E4%BB%8E-trellisworkflowmd-%E5%BC%80%E5%A7%8B%E5%85%88%E7%9C%8B%E6%B5%81%E7%A8%8B%E5%AE%AA%E6%B3%95" class="hash-link" aria-label="1-从-trellisworkflowmd-开始先看流程宪法的直接链接" title="1-从-trellisworkflowmd-开始先看流程宪法的直接链接" translate="no">​</a></h3>
<p>第一站一定是：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/workflow.md</span><br></div></code></pre></div></div>
<p>这个文件定义了 Trellis 的三大阶段：</p>
<ul>
<li class=""><strong>Phase 1: Plan</strong>：创建任务、澄清需求、研究、整理上下文、启动任务。</li>
<li class=""><strong>Phase 2: Execute</strong>：实现和质量检查。</li>
<li class=""><strong>Phase 3: Finish</strong>：最终验证、更新 spec、提交、归档收尾。</li>
</ul>
<p>阅读时重点关注这些内容：</p>
<ul>
<li class=""><code>no_task</code>、<code>planning</code>、<code>in_progress</code>、<code>completed</code> 这些 status 分别意味着什么。</li>
<li class="">每个 phase 里哪些步骤是 <code>[required]</code>，哪些是 <code>[once]</code>。</li>
<li class="">workflow-state block 如何把“当前状态下 AI 应该做什么”写成可注入提示词。</li>
<li class="">为什么在 <code>in_progress</code> 状态下默认要走 <code>trellis-implement</code>、<code>trellis-check</code>、<code>trellis-update-spec</code>。</li>
</ul>
<p>如果只读一个文件来理解 Trellis 的行为，那就是它。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-看-trellistasks理解任务如何落地">2. 看 <code>.trellis/tasks/</code>：理解任务如何落地<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#2-%E7%9C%8B-trellistasks%E7%90%86%E8%A7%A3%E4%BB%BB%E5%8A%A1%E5%A6%82%E4%BD%95%E8%90%BD%E5%9C%B0" class="hash-link" aria-label="2-看-trellistasks理解任务如何落地的直接链接" title="2-看-trellistasks理解任务如何落地的直接链接" translate="no">​</a></h3>
<p>第二站是任务目录：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/tasks/</span><br></div></code></pre></div></div>
<p>每个任务通常是一个独立目录，里面会出现这些文件：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">prd.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">info.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">implement.jsonl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">check.jsonl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">task.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">research/</span><br></div></code></pre></div></div>
<p>它们的分工大致如下：</p>
<ul>
<li class=""><code>prd.md</code>：需求文档，告诉 agent 要做什么。</li>
<li class=""><code>info.md</code>：技术设计，可选；复杂任务会更有用。</li>
<li class=""><code>implement.jsonl</code>：implement sub-agent 需要预加载的 spec / research。</li>
<li class=""><code>check.jsonl</code>：check sub-agent 需要预加载的 spec / research。</li>
<li class=""><code>task.json</code>：任务元信息和状态。</li>
<li class=""><code>research/</code>：研究产物，尤其适合第三方 API、架构方案、技术比较。</li>
</ul>
<p>这里最重要的认识是：<strong>Trellis 不把需求只留在聊天里，而是要求写进任务文件。</strong> 聊天会被压缩、遗忘或跨会话丢失，但任务目录会保留下来。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-研究-taskpy任务生命周期的控制台">3. 研究 <code>task.py</code>：任务生命周期的控制台<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#3-%E7%A0%94%E7%A9%B6-taskpy%E4%BB%BB%E5%8A%A1%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%9A%84%E6%8E%A7%E5%88%B6%E5%8F%B0" class="hash-link" aria-label="3-研究-taskpy任务生命周期的控制台的直接链接" title="3-研究-taskpy任务生命周期的控制台的直接链接" translate="no">​</a></h3>
<p>接下来可以看脚本：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/task.py</span><br></div></code></pre></div></div>
<p>它是任务生命周期的主要入口。你不需要一开始读完全部实现，可以先从命令行为反推它的职责。</p>
<p>创建一个探索任务：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py create "Explore Trellis harness" --slug explore-trellis-harness</span><br></div></code></pre></div></div>
<p>查看当前任务和来源：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py current --source</span><br></div></code></pre></div></div>
<p>给 implement agent 增加上下文：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py add-context &lt;task&gt; implement ".trellis/spec/backend/index.md" "Backend conventions"</span><br></div></code></pre></div></div>
<p>校验任务目录：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py validate &lt;task&gt;</span><br></div></code></pre></div></div>
<p>启动任务，进入 <code>in_progress</code>：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py start &lt;task&gt;</span><br></div></code></pre></div></div>
<p>这些命令对应的是 Trellis 的基本生命周期：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">create -&gt; planning -&gt; add context / validate -&gt; start -&gt; in_progress -&gt; finish/archive</span><br></div></code></pre></div></div>
<p>学习时建议你边看 <code>.trellis/workflow.md</code>，边对照 <code>task.py</code> 里的 command handler。这样你会更清楚：workflow 里的规则不是抽象说明，而是由脚本和 hook 共同执行的。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-理解-active-task--session-stateai-为什么知道现在该做什么">4. 理解 active task / session state：AI 为什么知道“现在该做什么”<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#4-%E7%90%86%E8%A7%A3-active-task--session-stateai-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%9F%A5%E9%81%93%E7%8E%B0%E5%9C%A8%E8%AF%A5%E5%81%9A%E4%BB%80%E4%B9%88" class="hash-link" aria-label="4. 理解 active task / session state：AI 为什么知道“现在该做什么”的直接链接" title="4. 理解 active task / session state：AI 为什么知道“现在该做什么”的直接链接" translate="no">​</a></h3>
<p>Trellis 的一个关键能力是：新开会话或继续会话时，AI 会收到当前任务状态、开发者身份、git 状态、active tasks、spec 索引等信息。</p>
<p>这类信息通常来自 SessionStart 注入和运行时状态解析。你可以通过命令观察当前任务来源：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py current --source</span><br></div></code></pre></div></div>
<p>这里值得关注两个问题：</p>
<ol>
<li class="">当前 session 指向哪个 active task？</li>
<li class="">如果没有 active task，workflow-state 为什么会变成 <code>no_task</code>？</li>
</ol>
<p>当状态是 <code>no_task</code> 时，AI 应该直接回答简单问题；一旦用户请求实现、重构、构建或修改代码，就应该创建任务并进入 Plan。状态是 <code>planning</code> 时，AI 应该写 PRD、整理 JSONL、再 <code>start</code>。状态是 <code>in_progress</code> 时，AI 应该走 implement/check/update-spec/commit/finish 的闭环。</p>
<p>这就是 workflow-state 的意义：<strong>它把“下一步该做什么”从主观判断变成状态机驱动。</strong></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-看-get_contextpy上下文是如何按需取出的">5. 看 <code>get_context.py</code>：上下文是如何按需取出的<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#5-%E7%9C%8B-get_contextpy%E4%B8%8A%E4%B8%8B%E6%96%87%E6%98%AF%E5%A6%82%E4%BD%95%E6%8C%89%E9%9C%80%E5%8F%96%E5%87%BA%E7%9A%84" class="hash-link" aria-label="5-看-get_contextpy上下文是如何按需取出的的直接链接" title="5-看-get_contextpy上下文是如何按需取出的的直接链接" translate="no">​</a></h3>
<p>然后阅读：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/get_context.py</span><br></div></code></pre></div></div>
<p>这个脚本负责把 workflow、phase、package、spec 等信息按不同模式取出来。</p>
<p>常用命令包括：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/get_context.py</span><br></div></code></pre></div></div>
<p>列出 package 和 spec layer：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/get_context.py --mode packages</span><br></div></code></pre></div></div>
<p>查看某个 phase step 的详细说明：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/get_context.py --mode phase --step 1.3</span><br></div></code></pre></div></div>
<p>如果说 <code>task.py</code> 管的是“任务状态”，那么 <code>get_context.py</code> 管的就是“该给 AI 哪些说明”。这也是 Trellis 能跨会话保持一致行为的重要原因。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-研究-workflow-state-injection提示词不是凭空出现的">6. 研究 workflow-state injection：提示词不是凭空出现的<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#6-%E7%A0%94%E7%A9%B6-workflow-state-injection%E6%8F%90%E7%A4%BA%E8%AF%8D%E4%B8%8D%E6%98%AF%E5%87%AD%E7%A9%BA%E5%87%BA%E7%8E%B0%E7%9A%84" class="hash-link" aria-label="6. 研究 workflow-state injection：提示词不是凭空出现的的直接链接" title="6. 研究 workflow-state injection：提示词不是凭空出现的的直接链接" translate="no">​</a></h3>
<p>当你看到会话开头出现类似当前状态、任务路径、workflow-state 的内容时，不要把它当成普通日志。它是 Trellis harness 的核心机制之一。</p>
<p>重点阅读路径：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/workflow.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/get_context.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/plugins/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/commands/trellis/</span><br></div></code></pre></div></div>
<p>其中：</p>
<ul>
<li class=""><code>.trellis/workflow.md</code> 写了每个 <code>[workflow-state:...]</code> block 的正文。</li>
<li class=""><code>.trellis/scripts/get_context.py</code> 可以按 phase、package 等模式取出 workflow 和 spec 上下文。</li>
<li class=""><code>.opencode/plugins/</code> 与 <code>.opencode/commands/trellis/</code> 是 OpenCode 侧把这些上下文接入会话、命令和 agent 行为的适配入口。</li>
<li class="">如果你的 fork 里新增了专门的 workflow-state 注入脚本或契约文档，也应把它和 <code>.trellis/workflow.md</code> 一起阅读，确认 status writer、hook 可达性和测试不变量一致。</li>
</ul>
<p>建议你重点看 <code>no_task</code>、<code>planning</code>、<code>in_progress</code> 的差异。因为绝大多数日常开发都会在这三个状态之间流转。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-理解-sub-agent-context-injection为什么有-implementjsonl-和-checkjsonl">7. 理解 sub-agent context injection：为什么有 <code>implement.jsonl</code> 和 <code>check.jsonl</code><a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#7-%E7%90%86%E8%A7%A3-sub-agent-context-injection%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%89-implementjsonl-%E5%92%8C-checkjsonl" class="hash-link" aria-label="7-理解-sub-agent-context-injection为什么有-implementjsonl-和-checkjsonl的直接链接" title="7-理解-sub-agent-context-injection为什么有-implementjsonl-和-checkjsonl的直接链接" translate="no">​</a></h3>
<p>在 agent-capable 平台上，Trellis 通常不希望主会话直接写代码，而是派发：</p>
<ul>
<li class=""><code>trellis-implement</code></li>
<li class=""><code>trellis-check</code></li>
<li class=""><code>trellis-update-spec</code></li>
</ul>
<p>这时，sub-agent 需要知道哪些 spec、research、任务文档必须提前阅读。答案就在任务目录下的 JSONL 文件：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">implement.jsonl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">check.jsonl</span><br></div></code></pre></div></div>
<p>每行是一个 JSON object，例如：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"file"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">".trellis/spec/backend/index.md"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"reason"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Backend conventions"</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>也可以用命令追加：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py add-context &lt;task&gt; implement ".trellis/spec/backend/index.md" "Backend conventions"</span><br></div></code></pre></div></div>
<p>这个设计解决了一个很实际的问题：主会话知道的上下文，sub-agent 未必知道。JSONL 就像交接清单，保证 implement/check agent 启动时能获得正确资料。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-看-trellisspec项目约定的长期记忆">8. 看 <code>.trellis/spec/</code>：项目约定的长期记忆<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#8-%E7%9C%8B-trellisspec%E9%A1%B9%E7%9B%AE%E7%BA%A6%E5%AE%9A%E7%9A%84%E9%95%BF%E6%9C%9F%E8%AE%B0%E5%BF%86" class="hash-link" aria-label="8-看-trellisspec项目约定的长期记忆的直接链接" title="8-看-trellisspec项目约定的长期记忆的直接链接" translate="no">​</a></h3>
<p>接下来阅读：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/spec/</span><br></div></code></pre></div></div>
<p>它保存项目级开发规范。典型结构可能包括：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/spec/backend/index.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/spec/frontend/index.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/spec/guides/</span><br></div></code></pre></div></div>
<p>学习时先看 index，再按 index 的 Pre-Development Checklist 继续读具体指南。</p>
<p>你要特别关注这些问题：</p>
<ul>
<li class="">哪些目录结构是约定好的？</li>
<li class="">错误处理、日志、质量规则有什么禁用模式？</li>
<li class="">是否有跨层思考指南，例如数据从 backend 到 frontend 如何流动？</li>
<li class="">是否有代码复用指南，提醒改常量或新增 helper 前先搜索？</li>
</ul>
<p>Trellis 的重要习惯是：<strong>一次任务中学到的可复用经验，应通过 <code>trellis-update-spec</code> 沉淀回 <code>.trellis/spec/</code>。</strong> 这样下一次 agent 才能继承经验，而不是每轮重新踩坑。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-看-trellisworkspace开发者自己的工作记忆">9. 看 <code>.trellis/workspace/</code>：开发者自己的工作记忆<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#9-%E7%9C%8B-trellisworkspace%E5%BC%80%E5%8F%91%E8%80%85%E8%87%AA%E5%B7%B1%E7%9A%84%E5%B7%A5%E4%BD%9C%E8%AE%B0%E5%BF%86" class="hash-link" aria-label="9-看-trellisworkspace开发者自己的工作记忆的直接链接" title="9-看-trellisworkspace开发者自己的工作记忆的直接链接" translate="no">​</a></h3>
<p>然后看：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/workspace/</span><br></div></code></pre></div></div>
<p>这里通常按开发者保存 journal、session trace 或其他工作记忆。例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/workspace/&lt;developer&gt;/journal-1.md</span><br></div></code></pre></div></div>
<p>如果 <code>.trellis/tasks/</code> 是“任务记忆”，那么 <code>.trellis/workspace/</code> 更像“开发者记忆”。它能记录会话、收尾、归档等过程中的信息。</p>
<p>这部分不一定是你理解执行链路的第一优先级，但当你研究 <code>/finish-work</code>、归档、journal 更新时，它会变得很重要。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-研究-opencodeopencode-平台适配层">10. 研究 <code>.opencode/</code>：OpenCode 平台适配层<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#10-%E7%A0%94%E7%A9%B6-opencodeopencode-%E5%B9%B3%E5%8F%B0%E9%80%82%E9%85%8D%E5%B1%82" class="hash-link" aria-label="10-研究-opencodeopencode-平台适配层的直接链接" title="10-研究-opencodeopencode-平台适配层的直接链接" translate="no">​</a></h3>
<p>如果你在 OpenCode 环境里使用 Trellis，就需要看：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/</span><br></div></code></pre></div></div>
<p>推荐阅读路径：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/agents/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/commands/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/skills/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/skills/trellis-meta/</span><br></div></code></pre></div></div>
<p>不同项目结构可能略有差异，但学习目标是一致的：搞清楚 Trellis workflow 如何被接入平台能力。</p>
<p>重点关注：</p>
<ul>
<li class=""><code>trellis-implement</code> agent 如何被定义。</li>
<li class=""><code>trellis-check</code> agent 如何被定义。</li>
<li class=""><code>/trellis:finish-work</code> 这类命令如何映射到脚本。</li>
<li class="">skills 如何把 workflow、spec、task context 注入到 agent 行为中。</li>
</ul>
<p>你可以把 <code>.opencode/</code> 理解成“平台适配器”：Trellis 的核心状态和规则在 <code>.trellis/</code>，而 OpenCode 需要通过 adapter 把这些规则接入具体的 agent、command、hook、skill。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-最后用-trellis-meta-研究和定制-trellis-本身">11. 最后用 <code>trellis-meta</code> 研究和定制 Trellis 本身<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#11-%E6%9C%80%E5%90%8E%E7%94%A8-trellis-meta-%E7%A0%94%E7%A9%B6%E5%92%8C%E5%AE%9A%E5%88%B6-trellis-%E6%9C%AC%E8%BA%AB" class="hash-link" aria-label="11-最后用-trellis-meta-研究和定制-trellis-本身的直接链接" title="11-最后用-trellis-meta-研究和定制-trellis-本身的直接链接" translate="no">​</a></h3>
<p>当你不只是使用 Trellis，而是想修改 Trellis harness 本身时，再进入 <code>trellis-meta</code>。</p>
<p>相关入口通常在：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/skills/trellis-meta/</span><br></div></code></pre></div></div>
<p><code>trellis-meta</code> 的定位是帮助你理解和定制本地 Trellis 架构，包括：</p>
<ul>
<li class=""><code>.trellis/</code> 工作流文件。</li>
<li class="">platform hooks。</li>
<li class="">settings。</li>
<li class="">agents。</li>
<li class="">skills。</li>
<li class="">commands。</li>
<li class="">prompts。</li>
<li class="">workflow 自定义。</li>
</ul>
<p>一个实用建议是：在你还没理解 <code>.trellis/workflow.md</code>、<code>task.py</code>、<code>get_context.py</code>、workflow-state injection 之前，不要急着改 <code>trellis-meta</code> 相关内容。否则很容易只改了提示词，却没同步状态机契约或脚本行为。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一条实用的文件阅读路线">一条实用的文件阅读路线<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E4%B8%80%E6%9D%A1%E5%AE%9E%E7%94%A8%E7%9A%84%E6%96%87%E4%BB%B6%E9%98%85%E8%AF%BB%E8%B7%AF%E7%BA%BF" class="hash-link" aria-label="一条实用的文件阅读路线的直接链接" title="一条实用的文件阅读路线的直接链接" translate="no">​</a></h2>
<p>如果你想系统阅读，可以按下面这条路线走。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="总体工作流">总体工作流<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E6%80%BB%E4%BD%93%E5%B7%A5%E4%BD%9C%E6%B5%81" class="hash-link" aria-label="总体工作流的直接链接" title="总体工作流的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/workflow.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/task.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/get_context.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/plugins/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/commands/trellis/</span><br></div></code></pre></div></div>
<p>这条线帮你理解：状态如何流转、上下文如何生成、AI 为什么收到那些指令。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="任务实现细节">任务实现细节<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E4%BB%BB%E5%8A%A1%E5%AE%9E%E7%8E%B0%E7%BB%86%E8%8A%82" class="hash-link" aria-label="任务实现细节的直接链接" title="任务实现细节的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/tasks/&lt;task&gt;/prd.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/tasks/&lt;task&gt;/info.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/tasks/&lt;task&gt;/implement.jsonl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/tasks/&lt;task&gt;/check.jsonl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/tasks/&lt;task&gt;/task.json</span><br></div></code></pre></div></div>
<p>这条线帮你理解：一个具体任务如何从需求变成实现上下文。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="opencode-适配">OpenCode 适配<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#opencode-%E9%80%82%E9%85%8D" class="hash-link" aria-label="OpenCode 适配的直接链接" title="OpenCode 适配的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/agents/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/commands/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/skills/</span><br></div></code></pre></div></div>
<p>这条线帮你理解：Trellis 如何接入 OpenCode 的 agent、command、skill 体系。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="项目规范和长期记忆">项目规范和长期记忆<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E9%A1%B9%E7%9B%AE%E8%A7%84%E8%8C%83%E5%92%8C%E9%95%BF%E6%9C%9F%E8%AE%B0%E5%BF%86" class="hash-link" aria-label="项目规范和长期记忆的直接链接" title="项目规范和长期记忆的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/spec/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/workspace/</span><br></div></code></pre></div></div>
<p>这条线帮你理解：项目约定和开发者记忆如何沉淀下来。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="自定义-trellis">自定义 Trellis<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E8%87%AA%E5%AE%9A%E4%B9%89-trellis" class="hash-link" aria-label="自定义 Trellis的直接链接" title="自定义 Trellis的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/skills/trellis-meta/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/workflow.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/task.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/get_context.py</span><br></div></code></pre></div></div>
<p>这条线帮你理解：如果要改 harness，应遵循哪些契约。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一条-hands-on-探索路线">一条 hands-on 探索路线<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E4%B8%80%E6%9D%A1-hands-on-%E6%8E%A2%E7%B4%A2%E8%B7%AF%E7%BA%BF" class="hash-link" aria-label="一条 hands-on 探索路线的直接链接" title="一条 hands-on 探索路线的直接链接" translate="no">​</a></h2>
<p>只读文件不如亲手跑一遍。你可以在一个安全分支上尝试下面的探索路径。</p>
<p>第一步，创建一个实验任务：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py create "Explore Trellis harness" --slug explore-trellis-harness</span><br></div></code></pre></div></div>
<p>第二步，查看当前任务来源：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py current --source</span><br></div></code></pre></div></div>
<p>第三步，查看 package/spec 信息：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/get_context.py --mode packages</span><br></div></code></pre></div></div>
<p>第四步，研究 Phase 1.3 为什么要求整理 JSONL：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/get_context.py --mode phase --step 1.3</span><br></div></code></pre></div></div>
<p>第五步，给 implement 上下文追加一个 spec：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py add-context &lt;task&gt; implement ".trellis/spec/backend/index.md" "Backend conventions"</span><br></div></code></pre></div></div>
<p>第六步，校验任务：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py validate &lt;task&gt;</span><br></div></code></pre></div></div>
<p>第七步，启动任务：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/task.py start &lt;task&gt;</span><br></div></code></pre></div></div>
<p>第八步，再查看一次当前上下文：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">python3 ./.trellis/scripts/get_context.py</span><br></div></code></pre></div></div>
<p>跑完这条路径，你会对 <code>planning</code> 到 <code>in_progress</code> 的切换、JSONL 的作用、spec 注入的意义有直观感受。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="常见误区">常见误区<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E5%B8%B8%E8%A7%81%E8%AF%AF%E5%8C%BA" class="hash-link" aria-label="常见误区的直接链接" title="常见误区的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="误区一把-trellis-当成普通文档目录">误区一：把 Trellis 当成普通文档目录<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E8%AF%AF%E5%8C%BA%E4%B8%80%E6%8A%8A-trellis-%E5%BD%93%E6%88%90%E6%99%AE%E9%80%9A%E6%96%87%E6%A1%A3%E7%9B%AE%E5%BD%95" class="hash-link" aria-label="误区一：把 Trellis 当成普通文档目录的直接链接" title="误区一：把 Trellis 当成普通文档目录的直接链接" translate="no">​</a></h3>
<p><code>.trellis/</code> 不是只有文档。它包含 workflow、状态、脚本、spec、workspace memory。文档和脚本共同构成 harness。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="误区二认为-ai-会自动记住所有上下文">误区二：认为 AI 会自动记住所有上下文<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E8%AF%AF%E5%8C%BA%E4%BA%8C%E8%AE%A4%E4%B8%BA-ai-%E4%BC%9A%E8%87%AA%E5%8A%A8%E8%AE%B0%E4%BD%8F%E6%89%80%E6%9C%89%E4%B8%8A%E4%B8%8B%E6%96%87" class="hash-link" aria-label="误区二：认为 AI 会自动记住所有上下文的直接链接" title="误区二：认为 AI 会自动记住所有上下文的直接链接" translate="no">​</a></h3>
<p>不会。Trellis 之所以要求 <code>prd.md</code>、<code>implement.jsonl</code>、<code>check.jsonl</code>，就是因为不同 session 和 sub-agent 之间不能依赖隐式记忆。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="误区三只改-workflow-文本不考虑状态契约">误区三：只改 workflow 文本，不考虑状态契约<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E8%AF%AF%E5%8C%BA%E4%B8%89%E5%8F%AA%E6%94%B9-workflow-%E6%96%87%E6%9C%AC%E4%B8%8D%E8%80%83%E8%99%91%E7%8A%B6%E6%80%81%E5%A5%91%E7%BA%A6" class="hash-link" aria-label="误区三：只改 workflow 文本，不考虑状态契约的直接链接" title="误区三：只改 workflow 文本，不考虑状态契约的直接链接" translate="no">​</a></h3>
<p>如果你修改了 <code>.trellis/workflow.md</code> 中的 required step 或 workflow-state block，需要确认脚本、hook 和 spec 契约是否仍一致。尤其要参考：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/task.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/get_context.py</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/plugins/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/commands/trellis/</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="误区四跳过-trellis-update-spec">误区四：跳过 <code>trellis-update-spec</code><a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E8%AF%AF%E5%8C%BA%E5%9B%9B%E8%B7%B3%E8%BF%87-trellis-update-spec" class="hash-link" aria-label="误区四跳过-trellis-update-spec的直接链接" title="误区四跳过-trellis-update-spec的直接链接" translate="no">​</a></h3>
<p>如果一次任务产生了可复用经验，却没有沉淀到 <code>.trellis/spec/</code>，下一次 agent 很可能还会重复犯错。<code>trellis-update-spec</code> 是 Trellis 闭环的一部分，不只是文档洁癖。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结用状态机理解-trellis用文件系统验证-trellis">总结：用状态机理解 Trellis，用文件系统验证 Trellis<a href="https://kogorou0105-bit.github.io/kogorou-blog/blog/trellis-harness-learning-guide#%E6%80%BB%E7%BB%93%E7%94%A8%E7%8A%B6%E6%80%81%E6%9C%BA%E7%90%86%E8%A7%A3-trellis%E7%94%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E9%AA%8C%E8%AF%81-trellis" class="hash-link" aria-label="总结：用状态机理解 Trellis，用文件系统验证 Trellis的直接链接" title="总结：用状态机理解 Trellis，用文件系统验证 Trellis的直接链接" translate="no">​</a></h2>
<p>学习 Trellis harness 最有效的方法，是同时抓住两件事：</p>
<p>第一，用状态机理解它：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">no_task -&gt; planning -&gt; in_progress -&gt; completed</span><br></div></code></pre></div></div>
<p>第二，用文件系统验证它：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/workflow.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/tasks/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/scripts/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/spec/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.trellis/workspace/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.opencode/</span><br></div></code></pre></div></div>
<p>当你能解释这条链路时，就说明你已经掌握了 Trellis 的核心：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user input -&gt; injected context -&gt; workflow-state -&gt; task lifecycle -&gt; agents -&gt; check/update/finish</span><br></div></code></pre></div></div>
<p>之后再去看 <code>trellis-meta</code>，你就不会只是“改几个 prompt”，而是在理解整个 harness 契约的基础上做定制。</p>
<p>这也是 Trellis 最值得学习的地方：它不是让 AI 更自由地发挥，而是用可读、可查、可验证的文件和脚本，把 AI 协作变成一条稳定的工程流程。</p>]]></content>
        <category label="Trellis" term="Trellis"/>
        <category label="Workflow" term="Workflow"/>
        <category label="AI Engineering" term="AI Engineering"/>
    </entry>
</feed>