<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Better Harness Blog</title>
        <link>https://qoderai.github.io/better-harness/zh-Hans/blog</link>
        <description>Better Harness Blog</description>
        <lastBuildDate>Fri, 14 Aug 2026 02:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <item>
            <title><![CDATA[Harness Inspector：看清一次 Agent 交付，从需求到提交]]></title>
            <link>https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector</link>
            <guid>https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector</guid>
            <pubDate>Fri, 14 Aug 2026 02:00:00 GMT</pubDate>
            <description><![CDATA[Session 日志只能告诉你 Agent 做了什么，却无法解释任务为何开始、哪些行为真正进入了代码库。Harness Inspector 把需求、Session、文件活动和 Git Commit 重新连接成一条可以读懂的交付链路。]]></description>
            <content:encoded><![CDATA[<p>最近，我们一直在尝试优化 Better Harness 的 <strong>SKILL 自动沉淀</strong>能力：从 Agent 的真实会话中识别重复出现的工作路径，再判断其中哪些经验值得进一步沉淀成可复用的 SKILL。真正做起来以后，我们发现这件事远比“把一段 Session 分析一遍”复杂得多。</p>
<p>对于一次软件开发任务来说，Agent 的行为并不是孤立发生的。它从一个需求或者用户故事开始，经过对需求的理解、上下文探索、代码修改和验证，最终才形成一次可以被评审的代码贡献。只看中间的 Session，我们能看到 Agent 做了什么，却很难判断这些行为为什么发生，又有哪些行为真正进入了最后的交付。</p>
<p>因此，我们开始把一次 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">npx @qoder-ai/better-harness inspector</span><br></div></code></pre></div></div>
<p>就可以生成一个本地、只读的 Harness Inspector 页面，把当前项目中的 Agent Session、文件活动和 Git Commit 放到同一个交互界面里。</p>
<p>GitHub：<a href="https://github.com/QoderAI/better-harness" target="_blank" rel="noopener noreferrer" class="">https://github.com/QoderAI/better-harness</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="从-session-到一次完整的交付过程">从 Session 到一次完整的交付过程<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector#%E4%BB%8E-session-%E5%88%B0%E4%B8%80%E6%AC%A1%E5%AE%8C%E6%95%B4%E7%9A%84%E4%BA%A4%E4%BB%98%E8%BF%87%E7%A8%8B" class="hash-link" aria-label="从 Session 到一次完整的交付过程的直接链接" title="从 Session 到一次完整的交付过程的直接链接" translate="no">​</a></h2>
<p>Harness Inspector 最初只是一个会话调试工具：帮助我们查看 Agent 说了什么、调用了哪些工具，以及修改了哪些文件。但随着 Session、文件活动和 Git 历史逐渐被连接起来，我们发现，真正需要观察的并不是会话本身，而是：</p>
<blockquote>
<p>一次软件变更如何从一个意图出发，经过 Agent 的执行，最终形成可以进入工程系统的产出。</p>
</blockquote>
<p>Session 只是这条链路的中间部分。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="从意图到产出的交付链">从意图到产出的交付链<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector#%E4%BB%8E%E6%84%8F%E5%9B%BE%E5%88%B0%E4%BA%A7%E5%87%BA%E7%9A%84%E4%BA%A4%E4%BB%98%E9%93%BE" class="hash-link" aria-label="从意图到产出的交付链的直接链接" title="从意图到产出的交付链的直接链接" translate="no">​</a></h3>
<p>我们将一次 Coding Agent 的交付拆成三个连续、但边界不同的部分：</p>
<p><img decoding="async" loading="lazy" alt="意图、过程与产出构成一条从需求到提交的交付链" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxODAwIiBoZWlnaHQ9IjEwNDAiIHZpZXdCb3g9IjAgMCAxODAwIDEwNDAiIHJvbGU9ImltZyIgYXJpYS1sYWJlbGxlZGJ5PSJ0aXRsZSBkZXNjIj4KICA8dGl0bGUgaWQ9InRpdGxlIj5IYXJuZXNzIEluc3BlY3RvciBhcmNoaXRlY3R1cmU8L3RpdGxlPgogIDxkZXNjIGlkPSJkZXNjIj5BIGxvY2FsLCByZWFkLW9ubHkgZXZpZGVuY2UgcGlwZWxpbmUuIEZlYXR1cmUgVHJlZSwgY29kaW5nLWFnZW50IHNlc3Npb25zLCBHaXQgaGlzdG9yeSwgYW5kIEVudGlyZSBjaGVja3BvaW50cyBlbnRlciBhIGJvdW5kZWQgY29sbGVjdG9yLCBhcmUgcHJpdmFjeS1maWx0ZXJlZCBhbmQgbm9ybWFsaXplZCwgY29ycmVsYXRlZCB3aXRoIGV4cGxpY2l0IGV2aWRlbmNlIGxpbWl0cywgcHJvamVjdGVkIGludG8gSGFybmVzc0luc3BlY3RvclJlcG9ydFYxLCBhbmQgcmVuZGVyZWQgYXMgYSBzZWxmLWNvbnRhaW5lZCBIVE1MIHdvcmtiZW5jaC48L2Rlc2M+CgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICB0ZXh0IHsgZm9udC1mYW1pbHk6IEludGVyLCB1aS1zYW5zLXNlcmlmLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgc2Fucy1zZXJpZjsgfQogICAgICAuc2VjdGlvbiB7IGZpbGw6ICM4ZTlhOTQ7IGZvbnQtc2l6ZTogMThweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IDJweDsgfQogICAgICAubGFiZWwgeyBmaWxsOiAjZjRmN2Y1OyBmb250LXNpemU6IDI2cHg7IGZvbnQtd2VpZ2h0OiA3MDA7IH0KICAgICAgLmxhYmVsLXNtIHsgZmlsbDogI2Y0ZjdmNTsgZm9udC1zaXplOiAyMXB4OyBmb250LXdlaWdodDogNzAwOyB9CiAgICAgIC5oaW50IHsgZmlsbDogI2FlYjliMzsgZm9udC1zaXplOiAxN3B4OyBmb250LXdlaWdodDogNDAwOyB9CiAgICAgIC5zb3VyY2UgeyBmaWxsOiAjMTcxYjFkOyBzdHJva2U6ICM1OTY1NWY7IHN0cm9rZS13aWR0aDogMjsgfQogICAgICAucHJvY2VzcyB7IGZpbGw6ICMxNTFmMjc7IHN0cm9rZTogIzY2OWZkMDsgc3Ryb2tlLXdpZHRoOiAyLjQ7IH0KICAgICAgLmV2aWRlbmNlIHsgZmlsbDogIzE3MjMxYzsgc3Ryb2tlOiAjNzJjNzdjOyBzdHJva2Utd2lkdGg6IDIuNDsgfQogICAgICAub3V0cHV0IHsgZmlsbDogIzFhMWQxYzsgc3Ryb2tlOiAjOGU5YTk0OyBzdHJva2Utd2lkdGg6IDI7IH0KICAgICAgLmJsdWUgeyBmaWxsOiBub25lOyBzdHJva2U6ICM3N2I3ZjI7IHN0cm9rZS13aWR0aDogMzsgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOyBzdHJva2UtbGluZWpvaW46IHJvdW5kOyB9CiAgICAgIC5ncmVlbiB7IGZpbGw6IG5vbmU7IHN0cm9rZTogIzc5Y2Y4Mzsgc3Ryb2tlLXdpZHRoOiAzOyBzdHJva2UtbGluZWNhcDogcm91bmQ7IHN0cm9rZS1saW5lam9pbjogcm91bmQ7IH0KICAgICAgLmdyYXkgeyBmaWxsOiBub25lOyBzdHJva2U6ICM2ODc1NmU7IHN0cm9rZS13aWR0aDogMi42OyBzdHJva2UtbGluZWNhcDogcm91bmQ7IHN0cm9rZS1saW5lam9pbjogcm91bmQ7IH0KICAgIDwvc3R5bGU+CiAgICA8bWFya2VyIGlkPSJhcnJvdy1ibHVlIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlckhlaWdodD0iMTIiIHJlZlg9IjEwIiByZWZZPSI2IiBvcmllbnQ9ImF1dG8iIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxwYXRoIGQ9Ik0xIDFMMTAgNkwxIDExIiBmaWxsPSJub25lIiBzdHJva2U9IiM3N2I3ZjIiIHN0cm9rZS13aWR0aD0iMi4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KICAgIDwvbWFya2VyPgogICAgPG1hcmtlciBpZD0iYXJyb3ctZ3JlZW4iIG1hcmtlcldpZHRoPSIxMiIgbWFya2VySGVpZ2h0PSIxMiIgcmVmWD0iMTAiIHJlZlk9IjYiIG9yaWVudD0iYXV0byIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHBhdGggZD0iTTEgMUwxMCA2TDEgMTEiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzc5Y2Y4MyIgc3Ryb2tlLXdpZHRoPSIyLjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgogICAgPC9tYXJrZXI+CiAgICA8bWFya2VyIGlkPSJhcnJvdy1ncmF5IiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlckhlaWdodD0iMTIiIHJlZlg9IjEwIiByZWZZPSI2IiBvcmllbnQ9ImF1dG8iIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxwYXRoIGQ9Ik0xIDFMMTAgNkwxIDExIiBmaWxsPSJub25lIiBzdHJva2U9IiM2ODc1NmUiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiAgICA8L21hcmtlcj4KICA8L2RlZnM+CgogIDxyZWN0IHdpZHRoPSIxODAwIiBoZWlnaHQ9IjEwNDAiIGZpbGw9IiMxMDE0MTUiLz4KCiAgPHRleHQgeD0iODAiIHk9IjU4IiBjbGFzcz0ic2VjdGlvbiI+MSDCtyBMT0NBTCBFVklERU5DRSBTT1VSQ0VTPC90ZXh0PgogIDxyZWN0IHg9IjgwIiB5PSI4NiIgd2lkdGg9IjUwMCIgaGVpZ2h0PSIxMTIiIHJ4PSIxNiIgY2xhc3M9InNvdXJjZSIvPgogIDx0ZXh0IHg9IjMzMCIgeT0iMTMwIiBjbGFzcz0ibGFiZWwtc20iIHRleHQtYW5jaG9yPSJtaWRkbGUiPkZlYXR1cmUgVHJlZTwvdGV4dD4KICA8dGV4dCB4PSIzMzAiIHk9IjE2MyIgY2xhc3M9ImhpbnQiIHRleHQtYW5jaG9yPSJtaWRkbGUiPkZlYXR1cmUgwrcgU3RvcnkgwrcgcmV2aWV3ZWQgcmVmZXJlbmNlczwvdGV4dD4KICA8cmVjdCB4PSI2NTAiIHk9Ijg2IiB3aWR0aD0iNTAwIiBoZWlnaHQ9IjExMiIgcng9IjE2IiBjbGFzcz0ic291cmNlIi8+CiAgPHRleHQgeD0iOTAwIiB5PSIxMzAiIGNsYXNzPSJsYWJlbC1zbSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MTAgc2Vzc2lvbiBhZGFwdGVyczwvdGV4dD4KICA8dGV4dCB4PSI5MDAiIHk9IjE2MyIgY2xhc3M9ImhpbnQiIHRleHQtYW5jaG9yPSJtaWRkbGUiPnByb21wdHMgwrcgZGlhbG9ndWUgwrcgdG9vbCBjYWxsczwvdGV4dD4KICA8cmVjdCB4PSIxMjIwIiB5PSI4NiIgd2lkdGg9IjUwMCIgaGVpZ2h0PSIxMTIiIHJ4PSIxNiIgY2xhc3M9InNvdXJjZSIvPgogIDx0ZXh0IHg9IjE0NzAiIHk9IjEzMCIgY2xhc3M9ImxhYmVsLXNtIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5HaXQgKyBFbnRpcmU8L3RleHQ+CiAgPHRleHQgeD0iMTQ3MCIgeT0iMTYzIiBjbGFzcz0iaGludCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Y29tbWl0cyDCtyBmaWxlcyDCtyBjaGVja3BvaW50czwvdGV4dD4KCiAgPHBhdGggZD0iTTMzMCAxOThWMjQ2SDkwMCIgY2xhc3M9ImdyYXkiLz4KICA8cGF0aCBkPSJNOTAwIDE5OFYyNDYiIGNsYXNzPSJncmF5Ii8+CiAgPHBhdGggZD0iTTE0NzAgMTk4VjI0Nkg5MDAiIGNsYXNzPSJncmF5Ii8+CiAgPHBhdGggZD0iTTkwMCAyNDZWMjc2IiBjbGFzcz0iYmx1ZSIgbWFya2VyLWVuZD0idXJsKCNhcnJvdy1ibHVlKSIvPgoKICA8dGV4dCB4PSI4MCIgeT0iMjc4IiBjbGFzcz0ic2VjdGlvbiI+MiDCtyBCT1VOREVEIExPQ0FMIFBST0pFQ1RJT048L3RleHQ+CiAgPHJlY3QgeD0iMTcwIiB5PSIzMDAiIHdpZHRoPSI0MzAiIGhlaWdodD0iMTE4IiByeD0iMTYiIGNsYXNzPSJwcm9jZXNzIi8+CiAgPHRleHQgeD0iMzg1IiB5PSIzNDUiIGNsYXNzPSJsYWJlbC1zbSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Q29sbGVjdCBhIGJvdW5kZWQgd2luZG93PC90ZXh0PgogIDx0ZXh0IHg9IjM4NSIgeT0iMzc4IiBjbGFzcz0iaGludCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+dGltZSDCtyBzZXNzaW9ucyDCtyBjb21taXRzIMK3IHByb3ZpZGVyczwvdGV4dD4KICA8cGF0aCBkPSJNNjAwIDM1OUg3MDgiIGNsYXNzPSJibHVlIiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93LWJsdWUpIi8+CiAgPHJlY3QgeD0iNzMwIiB5PSIzMDAiIHdpZHRoPSI0MzAiIGhlaWdodD0iMTE4IiByeD0iMTYiIGNsYXNzPSJwcm9jZXNzIi8+CiAgPHRleHQgeD0iOTQ1IiB5PSIzNDUiIGNsYXNzPSJsYWJlbC1zbSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Tm9ybWFsaXplIHNhZmVseTwvdGV4dD4KICA8dGV4dCB4PSI5NDUiIHk9IjM3OCIgY2xhc3M9ImhpbnQiIHRleHQtYW5jaG9yPSJtaWRkbGUiPnJlZGFjdGlvbiDCtyByZWxhdGl2ZSBwYXRocyDCtyBhY3Rpb25zPC90ZXh0PgogIDxwYXRoIGQ9Ik0xMTYwIDM1OUgxMjY4IiBjbGFzcz0iYmx1ZSIgbWFya2VyLWVuZD0idXJsKCNhcnJvdy1ibHVlKSIvPgogIDxyZWN0IHg9IjEyOTAiIHk9IjMwMCIgd2lkdGg9IjM0MCIgaGVpZ2h0PSIxMTgiIHJ4PSIxNiIgY2xhc3M9InByb2Nlc3MiLz4KICA8dGV4dCB4PSIxNDYwIiB5PSIzNDUiIGNsYXNzPSJsYWJlbC1zbSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+UHJlc2VydmUgZ2FwczwvdGV4dD4KICA8dGV4dCB4PSIxNDYwIiB5PSIzNzgiIGNsYXNzPSJoaW50IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5taXNzaW5nIHN0YXlzIHVub2JzZXJ2ZWQ8L3RleHQ+CgogIDxwYXRoIGQ9Ik05MDAgNDE4VjQ4NiIgY2xhc3M9ImdyZWVuIiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93LWdyZWVuKSIvPgoKICA8dGV4dCB4PSI4MCIgeT0iNDc4IiBjbGFzcz0ic2VjdGlvbiI+MyDCtyBFVklERU5DRS1CT1VOREVEIENPUlJFTEFUSU9OPC90ZXh0PgogIDxyZWN0IHg9IjE4MCIgeT0iNTA2IiB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSIxMzIiIHJ4PSIxOCIgY2xhc3M9ImV2aWRlbmNlIi8+CiAgPHRleHQgeD0iOTAwIiB5PSI1NTEiIGNsYXNzPSJsYWJlbCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+UmVsYXRlIGludGVudCwgc2Vzc2lvbnMsIHRvb2wgY2FsbHMsIHBhdGhzLCBhbmQgY29tbWl0czwvdGV4dD4KICA8dGV4dCB4PSIzNjAiIHk9IjU5OSIgY2xhc3M9ImxhYmVsLXNtIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5FeHBsaWNpdCAvIGRpcmVjdDwvdGV4dD4KICA8dGV4dCB4PSI3MjAiIHk9IjU5OSIgY2xhc3M9ImxhYmVsLXNtIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5PYnNlcnZlZCBzYW1lLXBhdGg8L3RleHQ+CiAgPHRleHQgeD0iMTA4MCIgeT0iNTk5IiBjbGFzcz0ibGFiZWwtc20iIHRleHQtYW5jaG9yPSJtaWRkbGUiPkNhbmRpZGF0ZTwvdGV4dD4KICA8dGV4dCB4PSIxNDQwIiB5PSI1OTkiIGNsYXNzPSJsYWJlbC1zbSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Q29udGV4dHVhbDwvdGV4dD4KCiAgPHBhdGggZD0iTTkwMCA2MzhWNzAwIiBjbGFzcz0iZ3JlZW4iIG1hcmtlci1lbmQ9InVybCgjYXJyb3ctZ3JlZW4pIi8+CgogIDx0ZXh0IHg9IjgwIiB5PSI2OTAiIGNsYXNzPSJzZWN0aW9uIj40IMK3IFJFQUQtT05MWSBJTlNQRUNUT1I8L3RleHQ+CiAgPHJlY3QgeD0iNTYwIiB5PSI3MjAiIHdpZHRoPSI2ODAiIGhlaWdodD0iODYiIHJ4PSIxOCIgY2xhc3M9ImV2aWRlbmNlIi8+CiAgPHRleHQgeD0iOTAwIiB5PSI3NzMiIGNsYXNzPSJsYWJlbCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+SGFybmVzc0luc3BlY3RvclJlcG9ydFYxPC90ZXh0PgogIDxwYXRoIGQ9Ik05MDAgODA2Vjg0NiIgY2xhc3M9ImdyYXkiIG1hcmtlci1lbmQ9InVybCgjYXJyb3ctZ3JheSkiLz4KCiAgPHJlY3QgeD0iNzAiIHk9Ijg3MCIgd2lkdGg9IjM4MCIgaGVpZ2h0PSIxMDAiIHJ4PSIxNSIgY2xhc3M9Im91dHB1dCIvPgogIDx0ZXh0IHg9IjI2MCIgeT0iOTEzIiBjbGFzcz0ibGFiZWwtc20iIHRleHQtYW5jaG9yPSJtaWRkbGUiPkRlbGl2ZXJ5IFRyZWUgLyBEYXRlPC90ZXh0PgogIDx0ZXh0IHg9IjI2MCIgeT0iOTQ1IiBjbGFzcz0iaGludCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Y2hvb3NlIHRoZSByZXZpZXcgc2NvcGU8L3RleHQ+CiAgPHJlY3QgeD0iNDkwIiB5PSI4NzAiIHdpZHRoPSIzODAiIGhlaWdodD0iMTAwIiByeD0iMTUiIGNsYXNzPSJvdXRwdXQiLz4KICA8dGV4dCB4PSI2ODAiIHk9IjkxMyIgY2xhc3M9ImxhYmVsLXNtIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5UaHJlZSBldmlkZW5jZSBsYW5lczwvdGV4dD4KICA8dGV4dCB4PSI2ODAiIHk9Ijk0NSIgY2xhc3M9ImhpbnQiIHRleHQtYW5jaG9yPSJtaWRkbGUiPnByb21wdCDCtyBhY3Rpdml0eSDCtyBkZWxpdmVyeTwvdGV4dD4KICA8cmVjdCB4PSI5MTAiIHk9Ijg3MCIgd2lkdGg9IjM4MCIgaGVpZ2h0PSIxMDAiIHJ4PSIxNSIgY2xhc3M9Im91dHB1dCIvPgogIDx0ZXh0IHg9IjExMDAiIHk9IjkxMyIgY2xhc3M9ImxhYmVsLXNtIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5FdmlkZW5jZSBEcmF3ZXI8L3RleHQ+CiAgPHRleHQgeD0iMTEwMCIgeT0iOTQ1IiBjbGFzcz0iaGludCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+ZmFjdHMgwrcgc291cmNlIMK3IGxpbWl0YXRpb25zPC90ZXh0PgogIDxyZWN0IHg9IjEzMzAiIHk9Ijg3MCIgd2lkdGg9IjQwMCIgaGVpZ2h0PSIxMDAiIHJ4PSIxNSIgY2xhc3M9Im91dHB1dCIvPgogIDx0ZXh0IHg9IjE1MzAiIHk9IjkxMyIgY2xhc3M9ImxhYmVsLXNtIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5TZXNzaW9uIFRyYWNlIC8gUmVwbGF5PC90ZXh0PgogIDx0ZXh0IHg9IjE1MzAiIHk9Ijk0NSIgY2xhc3M9ImhpbnQiIHRleHQtYW5jaG9yPSJtaWRkbGUiPm9ic2VydmU7IG5ldmVyIHJlcnVuIG9yIHJlc3VtZTwvdGV4dD4KCiAgPHBhdGggZD0iTTkwMCA4NDZIMjYwVjg3MCIgY2xhc3M9ImdyYXkiLz4KICA8cGF0aCBkPSJNOTAwIDg0Nkg2ODBWODcwIiBjbGFzcz0iZ3JheSIvPgogIDxwYXRoIGQ9Ik05MDAgODQ2SDExMDBWODcwIiBjbGFzcz0iZ3JheSIvPgogIDxwYXRoIGQ9Ik05MDAgODQ2SDE1MzBWODcwIiBjbGFzcz0iZ3JheSIvPgo8L3N2Zz4K" width="1800" height="1040" class="img_ev3q"></p>
<ul>
<li class=""><strong>意图（Intent）</strong> 是一次变化的语义化起点，例如用户的需求、Issue、Spec 或者架构约束。</li>
<li class=""><strong>过程（Process）</strong> 体现的是这次变化真正发生的过程，对于 Agent 来说，主要体现为 Session 记录以及其中的搜索、读取、修改和验证。</li>
<li class=""><strong>产出（Output）</strong> 则是 Agent 交付到工程系统的最终结果，现阶段最清晰的锚点就是代码 Commit。</li>
</ul>
<p>所以，Story、Session 和 Commit 并不是三个并列的抽象概念，它们分别是 <strong>Intent、Process 和 Output 在当前软件开发工具链中的可观察对象</strong>（意图在不同场景下也可能表现为 Issue 或 Spec）。Harness Inspector 要做的，也不是把一段对话展示得更完整，而是重新建立这条从需求到提交、可以追溯的交付链路。</p>
<p>从叙述上看，它是一条连续的交付链；但在真实项目中，它更接近一张证据图。一个 Story 可能经历多个 Session，一段 Session 也可能涉及多个 Commit。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="一个简单的示例从-story-到-commit">一个简单的示例：从 Story 到 Commit<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector#%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E7%A4%BA%E4%BE%8B%E4%BB%8E-story-%E5%88%B0-commit" class="hash-link" aria-label="一个简单的示例：从 Story 到 Commit的直接链接" title="一个简单的示例：从 Story 到 Commit的直接链接" translate="no">​</a></h3>
<p>我们在 Better Harness 文档页创建了一个只读的公开样本（英文示例数据，不读取本地内容）：<a href="https://qoderai.github.io/better-harness/inspector" target="_blank" rel="noopener noreferrer" class="">https://qoderai.github.io/better-harness/inspector</a>。</p>
<p>只看 Session，我们只能看到它是一串搜索、读取、修改和测试活动，很难确定它是否一直围绕最初的需求展开，也不知道其中哪些修改真正进入了代码库。单独看 Commit，我们虽然可以看到最终修改了哪些文件，却无法知道 Agent 在提交之前如何理解问题、建立上下文和完成验证。</p>
<p>当 Story、Session 和 Commit 被放到同一个界面后，这次变化才成为一段相对完整的交付过程：Story 说明为什么要修改，Session 展示修改是怎样发生的，Commit 则记录最后留下了什么。</p>
<p>把需求、Agent 行为和代码提交连接起来，让我们第一次能够从整体上检查一次交付。但真正打开一些包含数百次 Tool Call 的真实 Session 后，另一个问题很快出现了：<strong>能够把一次交付连接起来，并不意味着我们已经能够读懂它。</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="harness-inspector-如何读懂一次-agent-交付">Harness Inspector 如何读懂一次 Agent 交付？<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector#harness-inspector-%E5%A6%82%E4%BD%95%E8%AF%BB%E6%87%82%E4%B8%80%E6%AC%A1-agent-%E4%BA%A4%E4%BB%98" class="hash-link" aria-label="Harness Inspector 如何读懂一次 Agent 交付？的直接链接" title="Harness Inspector 如何读懂一次 Agent 交付？的直接链接" translate="no">​</a></h2>
<p>围绕 Better Harness 的 Harness 模型，我们将 Harness Inspector 定义为：</p>
<blockquote>
<p><strong>Harness Inspector 是一个面向 Agent 交付过程的本地、只读工作台。它将需求、Agent Session、文件活动和 Git Commit 放在同一个交互界面中，用来检查一次软件变化为什么发生、怎样发生，以及最终留下了什么。</strong></p>
</blockquote>
<p>Harness Inspector 以一次完整交付为中心，围绕从需求到提交的链路，提供了三种观察方式：</p>
<ul>
<li class=""><strong>Workbench</strong>：查看需求、Session 与 Commit 之间的关系；</li>
<li class=""><strong>Trace</strong>：查看 Session 内部的工作结构；</li>
<li class=""><strong>Replay</strong>：按照事件顺序重新观察任务如何展开。</li>
</ul>
<p>简单来说，<strong>Workbench 看关系，Trace 看结构，Replay 看顺序</strong>。三者共同帮助我们还原一个需求如何经过 Agent 的理解、探索、修改和验证，最终形成一次可以被评审的代码提交。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="workbench连接需求过程与产出">Workbench：连接需求、过程与产出<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector#workbench%E8%BF%9E%E6%8E%A5%E9%9C%80%E6%B1%82%E8%BF%87%E7%A8%8B%E4%B8%8E%E4%BA%A7%E5%87%BA" class="hash-link" aria-label="Workbench：连接需求、过程与产出的直接链接" title="Workbench：连接需求、过程与产出的直接链接" translate="no">​</a></h3>
<p>Workbench 是一次交付的整体视图。在左侧，我们可以看到触发这段 Session 的用户需求，以及执行过程中对目标的补充和调整；中间展示 Agent 在 Session 中发生的搜索、读取、工具调用和 Git 操作；右侧则是当前范围内观察到的 Commit，以及它最终修改的文件。</p>
<p>它关注的不是简单地把数据放在一起，而是展示需求、过程和产出之间<strong>已经观察到</strong>的关系。关系证据不足时，Inspector 会继续把它保留为候选或未映射，而不是自动拼出一条看起来完整的交付路径。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="trace把-session-读成一条工作轨迹">Trace：把 Session 读成一条工作轨迹<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector#trace%E6%8A%8A-session-%E8%AF%BB%E6%88%90%E4%B8%80%E6%9D%A1%E5%B7%A5%E4%BD%9C%E8%BD%A8%E8%BF%B9" class="hash-link" aria-label="Trace：把 Session 读成一条工作轨迹的直接链接" title="Trace：把 Session 读成一条工作轨迹的直接链接" translate="no">​</a></h3>
<p>Workbench 帮助我们找到一次交付，Trace 则进一步展开其中的 Session。</p>
<p>进入 Session 后，Trace 会按照 Turn 组织用户输入、中间回复、Tool Call 和文件活动，并通过顶部的时间轴连接事件在时间上的位置。点击某个区段可以跳转到对应调用，连续重复的活动也会被折叠，避免大量相似操作淹没真正重要的变化。</p>
<p>Trace 并不试图还原模型没有暴露的思考过程，而是将已经记录下来的行为重新组织成一条可以阅读的工作轨迹，帮助我们检查 Agent 如何搜索上下文、修改代码和执行验证。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="replay沿事件顺序回看一次交付">Replay：沿事件顺序回看一次交付<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector#replay%E6%B2%BF%E4%BA%8B%E4%BB%B6%E9%A1%BA%E5%BA%8F%E5%9B%9E%E7%9C%8B%E4%B8%80%E6%AC%A1%E4%BA%A4%E4%BB%98" class="hash-link" aria-label="Replay：沿事件顺序回看一次交付的直接链接" title="Replay：沿事件顺序回看一次交付的直接链接" translate="no">​</a></h3>
<p>Replay 则沿着已经保留的事件逐步回看任务如何展开。Reviewer 可以依次查看用户输入、Agent 回复、Tool Call、文件和 Commit，观察 Agent 在什么上下文中形成方向，又在什么时候进行了修改和验证。</p>
<p>它只是一次只读的证据回放，不会重新运行工具、恢复工作区或者继续原来的 Session；没有精确时间的内容，也只保留顺序，不会补充没有被记录的过程。</p>
<p>Workbench 建立交付上下文，Trace 展开 Session 的工作轨迹，Replay 补充事件发生的顺序。三者共同把一次从需求到提交的 Agent 交付，变成可以逐层进入和检查的过程。当我们真正把一次交付读清楚之后，就可以回到最初的问题：这条轨迹里，哪些经验真正值得留下来。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="从交付证据到-skill-沉淀">从交付证据到 SKILL 沉淀<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector#%E4%BB%8E%E4%BA%A4%E4%BB%98%E8%AF%81%E6%8D%AE%E5%88%B0-skill-%E6%B2%89%E6%B7%80" class="hash-link" aria-label="从交付证据到 SKILL 沉淀的直接链接" title="从交付证据到 SKILL 沉淀的直接链接" translate="no">​</a></h2>
<p>当一次交付能够被看清之后，我们才能重新回到最初的问题：Session 中的哪些经验，真正值得沉淀成 SKILL？答案显然不是出现次数最多的 Tool Call。Agent 可能因为上下文不足而反复读取同一个文件，也可能因为命令失败不断重试；这些行为虽然频繁出现，却更可能是一次交付中的噪声，而不是值得复用的工程经验。</p>
<p>真正值得沉淀的，通常是一条能够在相似任务中重复出现，并且得到最终产出与验证结果支持的工作路径。例如，Agent 如何从需求中确定修改边界，如何建立必要的上下文，又如何完成修改、执行验证并检查最终结果。只有把这些行为放回对应的 Story、Session 和 Commit 中，我们才能判断它们是当前任务中的偶然选择，还是一套相对稳定、可以迁移到其他任务中的工作方式。</p>
<p>因此，SKILL 自动沉淀并不是将一段 Session 总结成新的 <code>SKILL.md</code>，而是从多次真实交付中识别稳定模式，再为它补充适用场景、上下文边界、执行步骤和验证方式。Inspector 当前解决的，正是这一过程最基础的一环：先让真实交付留下边界清晰、可以检查的证据。只有在此基础上，我们才可能进一步比较相似任务，形成 SKILL 候选，并在后续交付中验证它是否真的改善了 Agent 的工作方式。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语先看清交付再沉淀经验">结语：先看清交付，再沉淀经验<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/harness-inspector#%E7%BB%93%E8%AF%AD%E5%85%88%E7%9C%8B%E6%B8%85%E4%BA%A4%E4%BB%98%E5%86%8D%E6%B2%89%E6%B7%80%E7%BB%8F%E9%AA%8C" class="hash-link" aria-label="结语：先看清交付，再沉淀经验的直接链接" title="结语：先看清交付，再沉淀经验的直接链接" translate="no">​</a></h2>
<p>我们最初想解决的是，如何从 Agent Session 中识别可复用的工作路径。但真正分析之后会发现，Session 只能记录 Agent 做了什么，却无法单独解释任务为什么开始，也不能证明哪些行为最终形成了工程产出。</p>
<p>Harness Inspector 将需求、Session、文件活动和 Git Commit 重新连接起来，让一次 Agent 交付变得可以观察、检查和追溯。只有先看清一次交付，我们才可能判断哪些行为只是偶然选择，哪些路径值得进一步沉淀成 SKILL。</p>
<p>从 Session 到交付，再从交付中沉淀经验，这正是 SKILL 自动演进的起点。</p>]]></content:encoded>
            <category>better-harness</category>
            <category>harness-inspector</category>
            <category>coding-agent</category>
            <category>provenance</category>
            <category>agent-skills</category>
        </item>
        <item>
            <title><![CDATA[How Agent Plugins Become Engineered: Five Practices from Better Harness]]></title>
            <link>https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering</link>
            <guid>https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering</guid>
            <pubDate>Sun, 09 Aug 2026 06:10:00 GMT</pubDate>
            <description><![CDATA[Writing a capability into SKILL.md is easy. Keeping it discoverable, executable, and provably better across users, projects, and hosts is an engineering problem.]]></description>
            <content:encoded><![CDATA[<p>Writing a capability into a <code>SKILL.md</code> and packaging it as an Agent plugin is
not hard. The hard part comes later: once that capability is invoked over and
over by different users, in different projects, and on different Agent hosts,
how do you guarantee that it is still triggered, executed, and verified
correctly? And how do you prove that a change made it better rather than worse?</p>
<p>Drawing on how Better Harness is actually developed, this post walks through
five engineering practices - spec-driven behavior, context orchestration,
deterministic verification, behavioral evaluation, and the evidence loop - that
move a plugin capability from "it works when I run it" to a software asset that
is verifiable, maintainable, and safe to evolve.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prologue-starting-from-agent-plugins">Prologue: starting from Agent plugins<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering#prologue-starting-from-agent-plugins" class="hash-link" aria-label="Prologue: starting from Agent plugins的直接链接" title="Prologue: starting from Agent plugins的直接链接" translate="no">​</a></h2>
<p>Over the past three months, alongside designing the Canvas-based Agentic UI
system, our other ongoing investment at Qoder has been building the Agent plugin
ecosystem. From curating existing software-engineering workflow plugins in the
community to creating plugins such as Architecture Visualization and Design
Review, we have been trying to package capabilities that used to live scattered
across different roles and different tools into something an Agent can discover
and call.</p>
<p>In the Architecture Visualization plugin, for example, the Agent can render the
dependency relationships between architecture modules directly on Canvas and
share the result with teammates so they can understand the structure of the
system.</p>
<p>At the beginning, a plugin felt mostly like an extension of the Agent's
capability boundary: whatever was missing, we added a Skill, a tool, or a
workflow for it. But as the plugins grew in number and complexity, another
question surfaced:</p>
<p>How should these capabilities be maintained over the long run?</p>
<p>Building Better Harness made that question impossible to avoid. Better Harness
targets workflow analysis and continuous improvement for coding agents, and it
contains a core Skill, a large amount of JavaScript, reference material,
evaluation logic, and adapters for different Agent hosts.</p>
<p>Once those capabilities became part of a plugin that has to be maintained over
time, we realized the problem was no longer "how do I write a good <code>SKILL.md</code>".</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-exactly-is-an-agent-plugin">What exactly is an Agent Plugin?<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering#what-exactly-is-an-agent-plugin" class="hash-link" aria-label="What exactly is an Agent Plugin?的直接链接" title="What exactly is an Agent Plugin?的直接链接" translate="no">​</a></h3>
<blockquote>
<p>If you are already familiar with Agent Plugins and Agent Skills, skip to the
next section.</p>
</blockquote>
<p>Put simply, an Agent Plugin is the delivery and distribution boundary of a
capability, and a Skill is a unit inside it that an Agent can discover and
execute independently. A typical plugin can contain Skills, MCP servers, hooks,
and host-specific extensions at the same time:</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">my-plugin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── plugin.json</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">│   └── summarize/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── SKILL.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── scripts/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── references/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── mcp.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── com.example.client/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    └── hooks/</span><br></div></code></pre></div></div>
<p>A <code>SKILL.md</code> is not the plugin itself; it is closer to an entry point for one
capability inside it. It describes when the capability should be discovered, how
it should be executed, and which additional material and tools need to be read
next. If a Skill is just a prompt you occasionally use yourself, that
distinction hardly matters. The moment it enters a plugin and gets invoked
repeatedly by different users, projects, and hosts, it does.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-do-plugins-need-engineering">Why do plugins need engineering?<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering#why-do-plugins-need-engineering" class="hash-link" aria-label="Why do plugins need engineering?的直接链接" title="Why do plugins need engineering?的直接链接" translate="no">​</a></h3>
<p>For personal use, writing down the task and the steps is usually enough. Once a
plugin is called repeatedly across users, projects, and hosts, a set of problems
that look a lot like software engineering appear on their own:</p>
<ul>
<li class=""><strong>Behavioral contract: how is it supposed to work?</strong> Which situations should
trigger it and which should not; what context does it need, which tools may it
call, and which behaviors are forbidden?</li>
<li class=""><strong>Change verification: is it still correct after a change?</strong> When a Skill, a
script, or a reference document changes, how do you confirm that the existing
capability was not broken and that a fixed problem does not come back?</li>
<li class=""><strong>Environment compatibility: does it still work elsewhere?</strong> When the model,
the Agent, the host, or the runtime changes, can the capability still be
discovered, loaded, and executed correctly?</li>
<li class=""><strong>Outcome assessment: did it actually make the Agent better?</strong> Even if the
Skill is triggered correctly and executed fully, how do you show that it
improved the result of a real task compared with not using it?</li>
</ul>
<p>None of these are solved by "writing a more detailed prompt". They map onto very
familiar software-engineering problems: defining contracts, verifying changes,
managing compatibility, and assessing real effect. Take them further and you
land on specifications, knowledge and dependency organization, interface and
permission boundaries, automated tests, regression verification, and
cross-model, cross-host behavioral evaluation.</p>
<p>It was during the development of Better Harness that we gradually started to
understand Skills differently:</p>
<blockquote>
<p>Once a Skill leaves the personal-prompt stage and enters a plugin ecosystem,
the problems it faces look increasingly like software, not prompting.</p>
</blockquote>
<p>The five engineering practices below follow from that shift.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-spec-driven-write-agent-behavior-as-a-verifiable-contract">1. Spec-driven: write Agent behavior as a verifiable contract<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering#1-spec-driven-write-agent-behavior-as-a-verifiable-contract" class="hash-link" aria-label="1. Spec-driven: write Agent behavior as a verifiable contract的直接链接" title="1. Spec-driven: write Agent behavior as a verifiable contract的直接链接" translate="no">​</a></h2>
<p>Spec-driven development is the part we started practicing earliest in Better
Harness. The core idea is to write down "when to act, what to do, and how well
it must be done" as a verifiable contract before implementation.</p>
<p>Our <a href="https://github.com/QoderAI/better-harness/blob/main/AGENTS.md" target="_blank" rel="noopener noreferrer" class=""><code>AGENTS.md</code></a>
states it directly:</p>
<blockquote>
<p>For non-trivial behavior changes to Skills, scripts, templates, host adapters,
or review workflows, establish a spec and traceable acceptance criteria first.</p>
</blockquote>
<p>A spec has to answer at least a few questions: which requests should trigger the
capability and which similar-sounding requests should not; what information must
be read and which tools may be called; which behaviors are explicitly
forbidden; whether the Agent should stop, degrade, or hand back to a human when
evidence is insufficient; and finally, what evidence proves the implementation
matches the intent.</p>
<p>Every acceptance criterion should carry a stable id such as AC-01 or AC-02, each
mapped to implementation, test, and review evidence. One of our boundary-hardening
specs, for instance, decomposes reproduced problems into AC-01 through AC-09.</p>
<p>Concrete examples: when the Agent scans written content, it must not echo
secrets; when analyzing one workspace, it must not quietly count sessions from
other directories; when the Git baseline cannot be established, it must stop
explicitly instead of disguising failure as "no changes". AC-09 then closes the
loop with a full test and packaging verification.</p>
<p>Specs themselves need review. In the
<a href="https://github.com/QoderAI/better-harness/blob/main/.agents/skills/triangulate-spec-review/SKILL.md" target="_blank" rel="noopener noreferrer" class=""><code>triangulate-spec-review</code></a>
Skill, we have at least two - usually three - review Agents inspect the same
context from different angles: implementation complexity, ease of use, and
long-term evolution. A lead Agent merges duplicate findings, checks evidence, and
edits the document; the other reviewers only provide independent judgment and do
not touch files. The value of being spec-driven is exactly this: ambiguity moves
from run time to design time.</p>
<p>Spec-driven work has a boundary too. When acceptance criteria are written too
finely, AI tends to turn tests into word-by-word matching against the Skill text
instead of verifying real behavior, which makes the tests less stable. A spec
should constrain observable behavior, not freeze specific wording.</p>
<p>A spec defines how a capability should work. The next step is making sure the
Agent can actually find the knowledge that supports that behavior while it runs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-context-orchestration-make-skill-knowledge-arrive-when-it-is-needed">2. Context orchestration: make Skill knowledge arrive when it is needed<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering#2-context-orchestration-make-skill-knowledge-arrive-when-it-is-needed" class="hash-link" aria-label="2. Context orchestration: make Skill knowledge arrive when it is needed的直接链接" title="2. Context orchestration: make Skill knowledge arrive when it is needed的直接链接" translate="no">​</a></h2>
<p>Agent Skills generally rely on progressive disclosure: knowledge should not all
enter the context at once, but unfold as the task requires.</p>
<blockquote>
<p>The host first reads <code>name</code> and <code>description</code> to complete discovery, loads the
full <code>SKILL.md</code> only after deciding to use the Skill, and pulls finer material
into context as the task demands. This is essentially context engineering for
Agents: rather than pushing all knowledge into the model at once, you design
when knowledge appears, where it enters from, and how it stays traceable.</p>
</blockquote>
<p>Translated into directory structure, the entry point should stay short:</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">my-skill/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── SKILL.md          # trigger conditions, main flow, stop conditions</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── references/       # judgment rules loaded on demand</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── scripts/          # deterministic logic that can be re-run</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── assets/           # templates and delivery skeletons</span><br></div></code></pre></div></div>
<p><code>SKILL.md</code> owns triggering, routing, and stop conditions; detailed judgment goes
into <code>references/</code>; stable executable logic goes into <code>scripts/</code>; templates and
delivery skeletons go into <code>assets/</code>.</p>
<p>In practice, though, we found that splitting knowledge apart is not enough: a
file existing does not mean the Agent can find it, and having been referenced
once does not mean the path still resolves after a refactor.</p>
<p>So we protect knowledge routing along three axes:</p>
<ul>
<li class=""><strong>Discoverable:</strong> bring relevant material into the Agent's knowledge path
through explicit entry points and references in <code>SKILL.md</code>, rather than relying
on ad-hoc search.</li>
<li class=""><strong>Reachable:</strong> use
<a href="https://github.com/QoderAI/better-harness/blob/main/test/skills-docs/doc-link-graph.test.mjs" target="_blank" rel="noopener noreferrer" class="">automated tests</a>
to check that relative links resolve and that every document a Skill needs is
genuinely routed from its entry point.</li>
<li class=""><strong>Traceable:</strong> generate a Mermaid graph from the real Markdown references with
a <a href="https://github.com/QoderAI/better-harness/blob/main/scripts/doc-link-graph/cli.mjs" target="_blank" rel="noopener noreferrer" class="">doc-link-graph generator</a>,
and verify that the generated output still matches the current reference
relationships.</li>
</ul>
<p>That way the Markdown references themselves are the source of truth, and the
graph is only a verifiable projection of knowledge routing. When documents move,
links break, or routing changes, a machine notices in time instead of relying on
maintainers to sync manually.</p>
<p>The goal of context orchestration is not to make the Agent read more, but to
make the right knowledge enter the context at the right moment through a path
that still works. Once knowledge arrives reliably, the next question is which
boundaries should be decided by a program rather than guessed by a model.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-deterministic-verification-give-the-machine-what-it-can-decide">3. Deterministic verification: give the machine what it can decide<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering#3-deterministic-verification-give-the-machine-what-it-can-decide" class="hash-link" aria-label="3. Deterministic verification: give the machine what it can decide的直接链接" title="3. Deterministic verification: give the machine what it can decide的直接链接" translate="no">​</a></h2>
<p>Not every question inside a Skill or a plugin should be handed to the model.
Keywords, regular expressions, and program checks are well suited to problems
with clear boundaries and decidable outcomes - metadata, directory structure,
broken links, data formats, deprecated names, permission declarations. What they
cannot do is prove that the Agent understood the task, and they are no substitute
for semantic quality review.</p>
<p>In Better Harness we hold those boundaries with three deterministic layers:</p>
<ul>
<li class=""><strong>Lint:</strong> check file headers, directory structure, broken links, data formats,
and permission declarations, catching cheap and decidable problems early.</li>
<li class=""><strong>Unit tests:</strong> verify deterministic logic such as scripts, parsers, and
template transforms, so basic capabilities still hold after a change.</li>
<li class=""><strong>Contract tests:</strong> verify what a command or entry point is actually allowed to
do, including inputs and outputs, error states, artifact locations, and
side-effect boundaries.</li>
</ul>
<p>A representative example is how Better Harness tests the <code>--help</code> path.
<a href="https://github.com/QoderAI/better-harness/blob/main/test/cli/better-harness-cli.test.mjs" target="_blank" rel="noopener noreferrer" class=""><code>better-harness-cli.test.mjs</code></a>
does not merely check that the help text is correct; it further verifies that
running a help command must not read the workspace, write files, wait on standard
input, spawn a child process, or access the network. If any one of those side
effects occurs, the test fails.</p>
<p>What is really being verified here is not what the help text looks like, but what
this entry point is and is not permitted to do. That is the value of
deterministic verification: boundaries that model behavior can easily paper over
become engineering constraints that are checked automatically and regressed
continuously. In an Agent system, models are better at understanding, planning,
and trading off; deterministic programs are better at verifying, constraining,
and refusing.</p>
<blockquote>
<p>If a program can decide it, do not make the model guess. If it needs semantic
judgment, do not force it into a string assertion.</p>
</blockquote>
<p>Deterministic verification only guards decidable boundaries, though. It cannot
prove the Agent actually follows the Skill in a real task. That requires
behavioral evaluation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-behavioral-evaluation-verify-the-agent-really-does-it">4. Behavioral evaluation: verify the Agent really does it<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering#4-behavioral-evaluation-verify-the-agent-really-does-it" class="hash-link" aria-label="4. Behavioral evaluation: verify the Agent really does it的直接链接" title="4. Behavioral evaluation: verify the Agent really does it的直接链接" translate="no">​</a></h2>
<p>A Skill existing, being discovered, being loaded, being executed, and finally
producing an improvement are five different things. Passing static checks only
says that the files and scripts have no obvious defects. Whether the Agent
chooses the Skill at the right moment, performs the key steps, and stops when
evidence is insufficient still needs behavioral evaluation.</p>
<p>In Better Harness we usually prepare three kinds of scenarios: positive cases
that should trigger, negative cases that should not, and boundary cases worded
similarly but with a different intent. During execution we watch four things:</p>
<ul>
<li class=""><strong>Selection:</strong> was it used when it should be, and not misfired when it should
not be?</li>
<li class=""><strong>Context:</strong> did it read the material it genuinely needed?</li>
<li class=""><strong>Execution:</strong> did the key steps, tools, and permissions stay within the
constraints?</li>
<li class=""><strong>Outcome:</strong> can the final artifact pass independent verification?</li>
</ul>
<p>The same scenario also needs repeated runs, because one success only proves that
this particular run worked, not that the behavior is stable.</p>
<p>At the host boundary, Better Harness additionally runs end-to-end verification
through the real Qoder CLI and plugin loading chain, launched from a neutral
directory:</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">python3 &lt;skill-creator-root&gt;/scripts/quick_validate.py &lt;skill-dir&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">qodercli --cwd &lt;neutral-dir&gt; --plugin-dir &lt;plugin-root&gt; -p "&lt;forward-test-prompt&gt;"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">qodercli plugin validate &lt;plugin-root&gt;</span><br></div></code></pre></div></div>
<p>Starting from a neutral directory prevents the Agent from accidentally borrowing
configuration, context, or undeclared dependencies from the current repository,
which would make "it works" look more optimistic than reality. At the same time,
whatever <code>qodercli</code> answers counts only as model-behavior evidence; whether the
run passes is still decided by deterministic evidence such as the local
validator, artifact inspection, and Git status.</p>
<p>Simulated cases cover exceptional and boundary situations; real host tests verify
whether the chain from plugin loading to Skill discovery, material reading, tool
invocation, and final delivery is genuinely connected. What behavioral evaluation
sets out to prove is not that the Agent has <em>seen</em> the Skill, but that the key
behaviors the Skill requires actually happened.</p>
<p>Proving that the Agent executed the Skill, however, is still not proof that the
Skill produced a better result. That belongs to the evidence loop.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-evidence-loop-prove-the-skill-works-before-talking-about-self-evolution">5. Evidence loop: prove the Skill works before talking about self-evolution<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering#5-evidence-loop-prove-the-skill-works-before-talking-about-self-evolution" class="hash-link" aria-label="5. Evidence loop: prove the Skill works before talking about self-evolution的直接链接" title="5. Evidence loop: prove the Skill works before talking about self-evolution的直接链接" translate="no">​</a></h2>
<p>Behavioral evaluation answers "did the Agent follow the Skill". The evidence loop
goes one step further: given the same task, does the Agent actually do better
<em>with</em> this Skill?</p>
<p>In Better Harness this is designed as an
<a href="https://github.com/QoderAI/better-harness/blob/main/references/agent-customize/skill-eval.md" target="_blank" rel="noopener noreferrer" class="">evaluation execution protocol</a>.
Holding the task, model, tools, permissions, and test environment constant, we
run three arms: no Skill, current Skill version, candidate Skill version.</p>
<p>An evaluation looks at more than the final success rate. It also observes whether
the key steps were executed, whether verification was complete, the time and
token cost, and whether extra side effects appeared. Otherwise a Skill that looks
"better" may simply be using more permissions or more resources.</p>
<p>One failure mode deserves special attention: fake usage, where the Agent finds
the Skill and reads <code>SKILL.md</code> but never performs the steps it requires. Better
Harness calls this <strong>routed-but-not-applied</strong>.</p>
<p>So we keep judging along an evidence chain:</p>
<ul>
<li class=""><strong>Does it exist?</strong> Are the Skill and its supporting mechanisms present?</li>
<li class=""><strong>Can it be found?</strong> Can a real task discover and select it?</li>
<li class=""><strong>Was it executed?</strong> Did the required key steps actually happen?</li>
<li class=""><strong>Is it effective?</strong> Compared with not using the Skill, did the result improve?</li>
</ul>
<p>In the <a href="https://github.com/QoderAI/better-harness/blob/main/models/agent-work-loop.md" target="_blank" rel="noopener noreferrer" class="">Agent Work Loop</a>
this maps to <strong>Present → Wired → Exercised → Outcome-supported</strong>. There is a
single governing principle: a conclusion may only go as far as the evidence goes.</p>
<p>That also matches where recent Skill-evaluation research is heading. SkillsBench
focuses on the outcome difference between using and not using a Skill on the same
task; Skill Coverage further checks whether the behaviors a Skill requires really
appear in the execution trace. The former answers "did the result get better",
the latter "did the process actually happen".</p>
<p>Outcome improvement and process coverage are both required; neither alone is
enough. Only after that evidence chain is in place does self-evolution become
meaningful. Otherwise Trace2Skill, EvoSkill, CoEvoSkills, or SkillOpt may just
help an Agent produce more unverified Skills faster.</p>
<p>Skill evolution should not start from "generate more experience". It should start
from proving that this change really made the next run better.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/agent-plugin-engineering#conclusion" class="hash-link" aria-label="Conclusion的直接链接" title="Conclusion的直接链接" translate="no">​</a></h2>
<p>The core of Agent plugin engineering is not writing more elaborate Skills. It is
treating the capabilities inside a plugin as software assets: constrain behavior
with specs, organize knowledge with context orchestration, hold boundaries with
deterministic verification, confirm execution with behavioral evaluation, and
judge effect with controlled comparison.</p>
<p>When those mechanisms work together, a plugin finally moves from "it works when I
run it" to "verifiable, maintainable, and safe to evolve".</p>
<p>Developing Agent plugins as software also means that every change should leave
behind enough evidence to show that it got better.</p>]]></content:encoded>
            <category>better-harness</category>
            <category>agent-plugin</category>
            <category>agent-skills</category>
            <category>spec-driven</category>
            <category>evaluation</category>
        </item>
        <item>
            <title><![CDATA[/better-harness Goes Open Source]]></title>
            <link>https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source</link>
            <guid>https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source</guid>
            <pubDate>Thu, 30 Jul 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[We are open-sourcing the engineering practices, evidence model, and runnable workflow behind Better Harness for coding agents.]]></description>
            <content:encoded><![CDATA[<p>Last week, we built Better Harness into Qoder Desktop. After launch, many users
asked the same question: <strong>Will this be open source?</strong></p>
<p>In its first three days, 100,000 people tried Better Harness.</p>
<p>The answer is yes.</p>
<p>Today, Better Harness is officially open source. You can find the project at
<a href="https://github.com/QoderAI/better-harness" target="_blank" rel="noopener noreferrer" class="">github.com/QoderAI/better-harness</a>.</p>
<p>Better Harness is an open-source analysis and continuous-improvement tool for
coding-agent workflows. It connects the engineering practices, evaluation
model, and runtime capabilities of Harness Engineering and Loop Engineering.
The initial open-source release supported Claude Code, Codex, Qoder, and Cursor
with one shared judgment model, although session analysis, evidence coverage,
and output capabilities were not yet identical across the four hosts. Qoder,
which had already been exercised repeatedly in real development workflows, was
the most complete reference implementation at launch.</p>
<table><thead><tr><th>Launch host</th><th>Installation or loading path</th><th>Default output</th></tr></thead><tbody><tr><td><strong>Claude Code</strong></td><td>Add the repository marketplace, then install the plugin</td><td>HTML + Markdown</td></tr><tr><td><strong>Codex</strong></td><td>Install through a Git marketplace</td><td>HTML + Markdown</td></tr><tr><td><strong>Qoder Desktop</strong></td><td>Built in; no separate installation</td><td>Canvas</td></tr><tr><td><strong>Cursor Agent</strong></td><td>Load from source</td><td>HTML / Markdown</td></tr></tbody></table>
<blockquote>
<p><strong>Editor's note:</strong> This table records the launch state. Better Harness now
publishes additional host integrations, and entrypoints differ by host. See
the current <a href="https://qoderai.github.io/better-harness/docs/installation" target="_blank" rel="noopener noreferrer" class="">Installation guide</a>
before installing or running a review.</p>
</blockquote>
<p>At launch, the shared workflow was commonly invoked as:</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">/better-harness</span><br></div></code></pre></div></div>
<p>You could start the analysis, inspect the report as it ran, and continue
reading this article. When a category of evidence was unavailable, Better
Harness preserved that boundary in the result instead of substituting config
counts or data from another host.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="better-harness-cares-about-what-the-agent-did-in-the-task">Better Harness cares about what the agent did in the task<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source#better-harness-cares-about-what-the-agent-did-in-the-task" class="hash-link" aria-label="Better Harness cares about what the agent did in the task的直接链接" title="Better Harness cares about what the agent did in the task的直接链接" translate="no">​</a></h2>
<p>Imagine that an agent modifies a module, runs one test command, and declares
the task complete. The real question is not whether the repository <em>has</em> tests.
It is whether that test was relevant to the change, covered the main risks, and
produced enough evidence to support delivery.</p>
<p>Better Harness therefore does not treat the presence of AGENTS.md, Rules,
Skills, MCP servers, Hooks, memories, tests, or CI as proof that they influenced
the task. Every improvement item—a Finding—must include traceable evidence, a
specific user impact, the smallest repair boundary, and a way to verify the
result after the repair.</p>
<p>In one self-analysis snapshot produced from Codex, Better Harness did not turn
the absence of an executed Codex host test into the stronger claim that
“Codex has failed.” It kept the unexecuted host test as an explicit evidence
boundary. Scores can help locate a problem, but the conclusion, impact, repair
scope, and verification method are what matter.</p>
<p>That is the difference between Better Harness and a configuration checklist. A
checklist tells you what the project possesses. Better Harness asks whether
those capabilities actually helped the agent complete a trustworthy task.</p>
<p>And if the judgments in a report are meant to be inspected, changed, and
reverified, open source cannot stop at publishing an executable entrypoint.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-three-layer-open-source-system-behind-better-harness">The three-layer open-source system behind Better Harness<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source#the-three-layer-open-source-system-behind-better-harness" class="hash-link" aria-label="The three-layer open-source system behind Better Harness的直接链接" title="The three-layer open-source system behind Better Harness的直接链接" translate="no">​</a></h2>
<p>Publishing the <code>/better-harness</code> prompt on GitHub would technically qualify as
open source. But for a coding agent, no single prompt determines the result.
What matters is the full working method behind it: what is worth checking, what
counts as evidence, how judgments are formed, and how they can keep running and
changing in real projects.</p>
<p>That is why Better Harness opens three connected layers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="layer-1-harness-engineering-best-practices">Layer 1: Harness Engineering best practices<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source#layer-1-harness-engineering-best-practices" class="hash-link" aria-label="Layer 1: Harness Engineering best practices的直接链接" title="Layer 1: Harness Engineering best practices的直接链接" translate="no">​</a></h3>
<p>This layer answers a practical question: when we examine sessions, CLIs,
observability, Rules, Skills, MCP servers, memories, Hooks, and automation, what
should we check—and which conclusions cannot be drawn merely from the presence
of configuration?</p>
<p>The knowledge is organized by problem domain under <code>references/</code>:</p>
<table><thead><tr><th>Domain</th><th>Question it answers</th><th>Main evidence</th></tr></thead><tbody><tr><td><strong>Session Evidence</strong></td><td>How did the agent actually complete the task?</td><td>Sessions, task episodes, tool calls, retries, usage, and outcome evidence</td></tr><tr><td><strong>Project Harness</strong></td><td>Does the project provide reliable execution, verification, and delivery paths?</td><td>CLI, observability, design contracts, tests, Git Hooks, sensitive code, and recovery mechanisms</td></tr><tr><td><strong>Agent Customize</strong></td><td>Are agent assets discoverable, applicable, and actually useful?</td><td>Rules, Skills, MCP, memories, Hooks, Custom Agents, and host configuration</td></tr><tr><td><strong>Loop Engineering</strong></td><td>Which mechanism should own a confirmed repeated workflow?</td><td>Skills, Hooks, scripts, automation, Rules, Custom Agents, MCP, and related mechanisms</td></tr></tbody></table>
<p>Better Harness does not load one endlessly expanding master prompt on every
run. It reads the judgment criteria for the problem at hand. A diagnostic issue
routes to observability practices. A Skill issue routes to Skill Review. A
repeated workflow first triggers a decision about whether a Skill, Hook, script,
or automation should own it over time.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="layer-2-the-agent-work-loop-evaluation-model">Layer 2: the Agent Work Loop evaluation model<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source#layer-2-the-agent-work-loop-evaluation-model" class="hash-link" aria-label="Layer 2: the Agent Work Loop evaluation model的直接链接" title="Layer 2: the Agent Work Loop evaluation model的直接链接" translate="no">​</a></h3>
<p>This layer turns engineering practices into questions that can be checked one
by one, while constraining the relationship between evidence, scores, and
conclusions. The current model and evidence states are public in the
<a href="https://github.com/QoderAI/better-harness/blob/main/models/agent-work-loop.md" target="_blank" rel="noopener noreferrer" class="">Agent Work Loop model</a>.</p>
<p>Because the standard is still emerging, we did not want one model to define a
“good harness” subjectively. The first internal evaluation selected 30 real
GitHub projects. Four model families independently evaluated them using
OpenAI's Harness Engineering article as a starting point, producing 120
standardized reports. Cross-model comparison and human calibration then
clarified evidence requirements, judgment boundaries, and differences between
project types before every project was evaluated again under the updated
criteria.</p>
<p>This loop—automated evaluation, automated aggregation, human calibration, and
automated reruns—produced the first reproducible Harness Engineering evaluation
model that we could continue to adjust.</p>
<p>The first version still resembled a conventional software-engineering maturity
scan. It focused on whether a project had documentation, tests, CI, and safety
mechanisms. We soon learned that static assets cannot prove that an agent
actually completed a task.</p>
<p>Better Harness itself is developed through a spec-driven process so that
changes in the model and product capabilities remain traceable. As more than
200 specs accumulated, the model shifted from asking “What exists in the
repository?” to asking “What actually happened in the task?”</p>
<p>The evaluation target narrowed from a repository or a session to a concrete
task. A session stopped being the thing being evaluated and became a container
for evidence. The model then stabilized around five dimensions: task
understanding, controlled execution, change verification, reliable delivery,
and experience capture. File existence, config counts, temporal proximity, and
even a successful command can no longer be treated as direct proof that a
capability was effective.</p>
<p>The Agent Work Loop is therefore not a static scorecard. It is a judgment
system centered on real tasks, designed to be reproduced and continuously
calibrated.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="layer-3-a-runnable-engineering-implementation">Layer 3: a runnable engineering implementation<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source#layer-3-a-runnable-engineering-implementation" class="hash-link" aria-label="Layer 3: a runnable engineering implementation的直接链接" title="Layer 3: a runnable engineering implementation的直接链接" translate="no">​</a></h3>
<p>The third layer makes the practices and model repeatable in real projects.
Better Harness starts an analysis through a plugin or CLI—the JavaScript code
under the project's <code>scripts/</code> directory—freezes the task scope, and collects
three evidence lanes independently:</p>
<ul>
<li class=""><strong>Session Evidence</strong> reconstructs the agent's behavior in real tasks.</li>
<li class=""><strong>Project Harness</strong> checks whether the project can be started, diagnosed,
verified, and recovered.</li>
<li class=""><strong>Agent Customize</strong> checks the configuration, routing, and usage evidence for
Rules, Skills, MCP servers, memories, and Hooks.</li>
</ul>
<p>The lanes remain separate during collection and analysis. Only then does the
Lead reconcile them using the criteria in <code>references/</code> and the Agent Work Loop
model. “The project has this capability” and “the agent used this capability in
the task” remain two different facts.</p>
<p>The output is not just a score. It is a set of Findings with evidence
boundaries, user impact, repair scope, and verification methods. Once rendered
and validated, the report can enter a repair flow. If the analysis finds stable
repeated work, Loop Engineering determines whether a Skill, Hook, script,
automation, or another mechanism should own it over time.</p>
<p>Completing a repair still does not prove that the workflow improved. The loop
is closed only when a later task of the same kind produces a better observed
result.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="start-with-the-first-verifiable-problem">Start with the first verifiable problem<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source#start-with-the-first-verifiable-problem" class="hash-link" aria-label="Start with the first verifiable problem的直接链接" title="Start with the first verifiable problem的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-qoder-users">For Qoder users<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source#for-qoder-users" class="hash-link" aria-label="For Qoder users的直接链接" title="For Qoder users的直接链接" translate="no">​</a></h3>
<p>At the time of the announcement, Qoder Desktop included Better Harness in the
Quest view as <strong>Better Harness (Beta)</strong> and exposed <code>/better-harness</code> directly.
Qoder CLI and the JetBrains plugin could use the same capability on a machine
where Qoder Desktop had already been installed. Refer to the current
<a href="https://qoderai.github.io/better-harness/docs/installation#qoder" target="_blank" rel="noopener noreferrer" class="">Installation guide</a>
for today's supported Qoder entrypoints.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="from-the-open-source-repository">From the open-source repository<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source#from-the-open-source-repository" class="hash-link" aria-label="From the open-source repository的直接链接" title="From the open-source repository的直接链接" translate="no">​</a></h3>
<p>Visit the
<a href="https://github.com/QoderAI/better-harness" target="_blank" rel="noopener noreferrer" class="">Better Harness GitHub repository</a>
and follow the current README or Installation guide. For example, Claude Code
users can run:</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">/plugin marketplace add QoderAI/better-harness</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/plugin install better-harness@better-harness</span><br></div></code></pre></div></div>
<p>Then start a review with:</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">/better-harness Analyze my project's harness and generate an HTML report</span><br></div></code></pre></div></div>
<p>Your first Better Harness run does not need to build a complete agent
engineering system, and it does not need to chase a perfect score. A more
practical starting point is one problem with clear evidence, a concrete impact,
and a fast verification path.</p>
<p>It might be a check command the agent cannot find, an error log with no useful
next diagnostic step, or a Skill that exists but has never entered the task
routing path.</p>
<p>Fix one problem, run the review again, and observe whether a later task of the
same kind changes. Harness Engineering is not a one-time configuration project.
It is the continuous work of making a project easier for an agent to understand,
execute, and verify.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-know-it-is-not-complete">We know it is not complete<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-is-now-open-source#we-know-it-is-not-complete" class="hash-link" aria-label="We know it is not complete的直接链接" title="We know it is not complete的直接链接" translate="no">​</a></h2>
<p>Better Harness has been run and calibrated repeatedly in Qoder's real
development workflows, but the current model still reflects the project types
and task scenarios we know best.</p>
<p>Different technology stacks, project sizes, team constraints, and coding
agents may reveal blind spots. Better Harness needs more real evidence to keep
correcting them.</p>
<p>If you would like to contribute, there are several useful starting points:</p>
<ul>
<li class=""><strong>Add an engineering practice.</strong> Add a judgment guide for a language,
framework, or common workflow under <code>references/</code>. No code is required.</li>
<li class=""><strong>Add an evaluation perspective.</strong> Add an evidence-backed dimension or
detector under <code>models/</code> or <code>scripts/</code>, together with fixtures and tests.</li>
<li class=""><strong>Add host support.</strong> Complete evidence collection and verification for
another coding agent. The repository
<a href="https://github.com/QoderAI/better-harness/blob/main/roadmap.md" target="_blank" rel="noopener noreferrer" class="">Roadmap</a>
lists candidate work.</li>
<li class=""><strong>Add a real case study.</strong> Contribute a redacted team example under
<code>case-studies/</code>.</li>
</ul>
<p>If you disagree with a Finding, please open an issue. A counterexample from a
real project is more useful to us than a star—although we will happily accept
the star too. 😁</p>
<hr>
<p><strong>Born in Qoder, returned to the community. Give every coding agent a foundation
of verified engineering practice.</strong></p>]]></content:encoded>
            <category>better-harness</category>
            <category>open-source</category>
            <category>harness-engineering</category>
            <category>agent-work-loop</category>
        </item>
        <item>
            <title><![CDATA[Introducing Better Harness in Qoder]]></title>
            <link>https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-in-qoder</link>
            <guid>https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-in-qoder</guid>
            <pubDate>Thu, 30 Jul 2026 02:00:00 GMT</pubDate>
            <description><![CDATA[Learn how Better Harness diagnoses weak links in a coding-agent workflow, plans bounded improvements, and verifies whether the loop actually got better.]]></description>
            <content:encoded><![CDATA[<p>Today's coding agents can read requirements, modify code, run tests, and even
submit pull requests. But being able to do many things is not the same as being
able to do them well.</p>
<p>An agent usually cycles through <strong>understanding the task, taking action,
checking the result, and adjusting its next step</strong>. That is the Agent Loop. A
reliable loop does more than keep the agent moving: it gives the agent a clear
goal, defines what it must not touch, explains how to judge the result, and
provides a recovery path when something fails. Without those boundaries, an
agent may change a great deal of code and run many tests while still being
unable to prove that the task is actually complete.</p>
<p>This is the problem that Loop Engineering and Harness Engineering address.
They equip the agent with project context, relevant development tools,
effective verification methods, and explicit safety boundaries so that every
loop moves closer to a reliable delivery.</p>
<p>Building on Qoder's internal experience and the broader community's work on
coding agents, agent loops, and software engineering, we introduced <strong>Better
Harness (Beta)</strong>.</p>
<p>In current versions of Qoder, you can open Better Harness and start an analysis
and repair from the visual interface, or run the <code>/better-harness</code> Skill
directly. It examines how the agent worked through the current task, identifies
missing or weak elements in the loop, and helps you decide what to improve
next.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-better-harness-diagnoses-improves-and-rechecks-the-loop">How Better Harness diagnoses, improves, and rechecks the loop<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-in-qoder#how-better-harness-diagnoses-improves-and-rechecks-the-loop" class="hash-link" aria-label="How Better Harness diagnoses, improves, and rechecks the loop的直接链接" title="How Better Harness diagnoses, improves, and rechecks the loop的直接链接" translate="no">​</a></h2>
<p>Better Harness does not grade the quality of a single answer. It examines the
entire harness that supports a coding agent as it completes a task:</p>
<ul>
<li class="">Are the goal and context clear?</li>
<li class="">Is the project easy to run?</li>
<li class="">Are permissions under control?</li>
<li class="">Does verification provide meaningful evidence?</li>
<li class="">Is delivery safe?</li>
<li class="">Can the team and the agent learn from the task?</li>
</ul>
<p>Its main analysis flow is:</p>
<ol>
<li class=""><strong>Map the current harness.</strong> Identify the goal, context, execution
entrypoints, feedback paths, delivery mechanisms, and learning mechanisms.</li>
<li class=""><strong>Find the breaks.</strong> Explain which part of the loop lacks a mechanism,
integration, observed execution, or outcome evidence.</li>
<li class=""><strong>Choose the smallest improvement vehicle.</strong> Route the problem to the most
appropriate Rule, Skill, Hook, script, automation, or human gate.</li>
<li class=""><strong>Repair and recheck.</strong> Keep the fix bounded, run the relevant verification,
and run <code>/better-harness</code> again to see whether the loop actually improved.</li>
</ol>
<p>The main analysis flow first collects the underlying evidence. It then asks
three independent, read-only subagents to interpret three evidence lanes:</p>
<ul>
<li class=""><strong>Agent customization assets</strong>, such as Rules, Skills, and Hooks;</li>
<li class=""><strong>Real task-session records</strong>, which show what the agent actually did and how
the task ended; and</li>
<li class=""><strong>The project's software-engineering foundation</strong>.</li>
</ul>
<p>The three lanes are collected independently and reconciled only afterward, so
that one category of evidence does not contaminate the conclusions drawn from
another.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="agent-customization-from-capability-inventory-to-actual-use">Agent customization: from capability inventory to actual use<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-in-qoder#agent-customization-from-capability-inventory-to-actual-use" class="hash-link" aria-label="Agent customization: from capability inventory to actual use的直接链接" title="Agent customization: from capability inventory to actual use的直接链接" translate="no">​</a></h2>
<p>In coding agents such as Qoder, Rules, Skills, Custom Agents, MCP servers,
plugins, memories, and Hooks are the building blocks of an effective loop.
Better Harness inventories these custom capabilities and checks whether they
are complete, discoverable, and usable.</p>
<p>But having the building blocks does not make the loop reliable. A project can
have tests without running the relevant tests for a task. A Skill can exist
without the agent invoking it when it matters. Better Harness therefore also
examines evidence that Rules and Skills were actually used, helping users find
context-engineering gaps and reduce wasted credits.</p>
<p>Qoder Canvas presents this evidence in a detailed report, including patterns
such as Skill usage over a recent period. Better Harness also looks for
repeated work in task sessions that might justify a reusable Rule or Skill.
However, not every observation should become a Skill, and not every repeated
task should be automated. The report keeps those distinctions explicit and
offers bounded improvement suggestions.</p>
<p>For an identified opportunity, the user can select <strong>Plan a fix</strong> and let the
AI generate and execute a repair plan. More importantly, the result does not
have to remain a one-off fix. It can become a reusable Rule, Skill, memory, or
other asset that strengthens the user's own agent harness.</p>
<p>Each task analysis can therefore improve more than the current task. As the
asset base grows, the agent learns more about the user and the quality,
efficiency, and control of later loops can improve as well.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-task-sessions-reconstructing-how-the-agent-loop-actually-ran">Real task sessions: reconstructing how the Agent Loop actually ran<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-in-qoder#real-task-sessions-reconstructing-how-the-agent-loop-actually-ran" class="hash-link" aria-label="Real task sessions: reconstructing how the Agent Loop actually ran的直接链接" title="Real task sessions: reconstructing how the Agent Loop actually ran的直接链接" translate="no">​</a></h2>
<p>Capability inventory alone cannot prove that a loop worked. Better Harness
also analyzes real task-session records—by default, from the most recent 30
days—to understand what the agent actually did and what outcome it produced.</p>
<p>The basic unit of analysis is a task episode: one user goal plus an observable
acceptance boundary. Within each episode, Better Harness looks for four kinds
of signals:</p>
<ol>
<li class=""><strong>Repeated workflows.</strong> When the same task repeatedly requires the same
steps or corrections, the project may be missing a Skill, Rule, or script.</li>
<li class=""><strong>Closed-loop verification.</strong> Did the agent actually run the relevant tests,
lint checks, builds, or regressions in the right place? Repeating a check is
not enough; the subsequent result must also be accepted and used.</li>
<li class=""><strong>Attribution of friction.</strong> When a task stalls, did the problem come from
the harness, the project, the model, or the requirement itself? Not every
failure should be blamed on the agent.</li>
<li class=""><strong>High-impact one-off events.</strong> Did a permission block, missing diagnostic
entrypoint, or failed recovery materially change the direction of the task?</li>
</ol>
<p>This lane is analyzed by an independent, read-only subagent. It sees only
redacted factual summaries, not raw prompts, private paths, secrets, or other
sensitive material. These signals make it possible to assess the real use of
Skills and Rules, identify context-engineering problems that affect the loop,
and reduce unnecessary credit consumption.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="project-engineering-foundations-make-it-findable-runnable-and-verifiable">Project engineering foundations: make it findable, runnable, and verifiable<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-in-qoder#project-engineering-foundations-make-it-findable-runnable-and-verifiable" class="hash-link" aria-label="Project engineering foundations: make it findable, runnable, and verifiable的直接链接" title="Project engineering foundations: make it findable, runnable, and verifiable的直接链接" translate="no">​</a></h2>
<p>The project's existing software-engineering foundations also shape the quality
of every agent loop. A repository may contain extensive documentation, scripts,
and tests, but those capabilities cannot help if the agent cannot find the
correct entrypoint, run it successfully, or decide what to do after it fails.</p>
<p>Better Harness examines five aspects of a project's readiness for agent work:</p>
<ol>
<li class=""><strong>Findable.</strong> Can the agent quickly locate the relevant code, module
boundaries, project constraints, and required checks for a specific task?</li>
<li class=""><strong>Runnable.</strong> Are dependencies, configuration, build steps, and startup
instructions clear? When the environment breaks, can the agent diagnose it,
reset safely, and start again?</li>
<li class=""><strong>Fast feedback.</strong> After a code change, do the available checks and tests
quickly show what failed, where it may have failed, and what to try next?</li>
<li class=""><strong>Enforceable rules.</strong> Are architecture, security, API compatibility, and
database-migration requirements checked by tools rather than existing only
as documentation or convention?</li>
<li class=""><strong>Controlled changes.</strong> Are change boundaries explicit, do high-risk actions
require confirmation, and can a failed operation be rolled back, recovered,
or exited safely?</li>
</ol>
<p>For example, a test command in the README proves only that the project exposes
a test entrypoint. Inspecting the script reveals what the command actually
covers. Only running the relevant check in a real task and responding to its
result can show that the feedback path has truly entered the Agent Loop.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="turn-every-agent-loop-into-an-asset-for-the-next-one">Turn every Agent Loop into an asset for the next one<a href="https://qoderai.github.io/better-harness/zh-Hans/blog/better-harness-in-qoder#turn-every-agent-loop-into-an-asset-for-the-next-one" class="hash-link" aria-label="Turn every Agent Loop into an asset for the next one的直接链接" title="Turn every Agent Loop into an asset for the next one的直接链接" translate="no">​</a></h2>
<p>A <code>/better-harness</code> analysis is not the finish line. It helps you find breaks,
generate a repair plan, and verify whether a new Rule, Skill, Hook, or script
actually entered the agent's workflow.</p>
<p>The most reusable lessons can then become personal or team-owned agent assets,
making later loops more stable, efficient, and controllable. Open Better
Harness in Qoder—or run <code>/better-harness</code>—and find the next part of your loop
that is worth strengthening.</p>]]></content:encoded>
            <category>better-harness</category>
            <category>qoder</category>
            <category>harness-engineering</category>
            <category>loop-engineering</category>
        </item>
    </channel>
</rss>