<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ticket追蹤 on Tarragon</title><link>https://tarrragon.github.io/blog/tags/ticket%E8%BF%BD%E8%B9%A4/</link><description>Recent content in Ticket追蹤 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 04 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/ticket%E8%BF%BD%E8%B9%A4/index.xml" rel="self" type="application/rss+xml"/><item><title>Frontmatter 式 Ticket 追蹤方法論 - 結構化任務狀態管理</title><link>https://tarrragon.github.io/blog/record/frontmatter-%E5%BC%8F-ticket-%E8%BF%BD%E8%B9%A4%E6%96%B9%E6%B3%95%E8%AB%96-%E7%B5%90%E6%A7%8B%E5%8C%96%E4%BB%BB%E5%8B%99%E7%8B%80%E6%85%8B%E7%AE%A1%E7%90%86/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/record/frontmatter-%E5%BC%8F-ticket-%E8%BF%BD%E8%B9%A4%E6%96%B9%E6%B3%95%E8%AB%96-%E7%B5%90%E6%A7%8B%E5%8C%96%E4%BB%BB%E5%8B%99%E7%8B%80%E6%85%8B%E7%AE%A1%E7%90%86/</guid><description>&lt;p>在多代理人協作開發流程中，我們長期被一個問題困擾：主線程怎麼知道各代理人的執行進度？&lt;/p>
&lt;p>起初讓代理人完成後回報，但每次回報都消耗 context 空間，狀態散落在對話歷史裡，根本無法可靠查詢。&lt;/p>
&lt;p>後來試過 CSV 追蹤表，但 Ticket 設計文件在一個地方、狀態在另一個地方，兩者很容易出現不一致。&lt;/p>
&lt;p>最終答案：把狀態放進 Ticket 文件本身的 YAML Frontmatter 裡。&lt;/p></description><content:encoded><![CDATA[<p>在多代理人協作開發流程中，我們長期被一個問題困擾：主線程怎麼知道各代理人的執行進度？</p>
<p>起初讓代理人完成後回報，但每次回報都消耗 context 空間，狀態散落在對話歷史裡，根本無法可靠查詢。</p>
<p>後來試過 CSV 追蹤表，但 Ticket 設計文件在一個地方、狀態在另一個地方，兩者很容易出現不一致。</p>
<p>最終答案：把狀態放進 Ticket 文件本身的 YAML Frontmatter 裡。</p>
<h2 id="狀態與內容為什麼要分離">狀態與內容為什麼要分離？</h2>
<p>一個 Ticket 天然包含兩種資訊：「要做什麼」和「做到哪裡了」。傳統做法把它們放在不同地方，製造了一個持續的維護負擔——查狀態要看兩個地方，兩個地方隨時可能不一致。</p>
<p>Markdown 的 YAML frontmatter 本來就是機器可解析的結構化資料，直接把狀態放進去，Ticket 就成了自給自足的單元：frontmatter 存設計決策和當前狀態，body 存執行日誌。</p>
<h2 id="核心設計原則">核心設計原則</h2>
<h3 id="frontmatter-是唯一的狀態來源">Frontmatter 是唯一的狀態來源</h3>
<p>主線程查進度時直接讀 frontmatter，不需要問代理人。代理人更新狀態時直接改 frontmatter，不需要回報主線程。兩端獨立操作，不需要等彼此。</p>
<h3 id="單一文件原則">單一文件原則</h3>
<p>每個 Ticket 只有一個文件：frontmatter 放識別資訊、5W1H 設計、驗收條件、依賴關係和當前狀態；body 放執行日誌。一個文件說清楚一切。</p>
<h3 id="查詢輸出最小化">查詢輸出最小化</h3>
<p><code>summary</code> 產出緊湊的一行式列表，<code>query</code> 只回傳單一 Ticket 的精簡資訊。查詢不應消耗 context，只應提供答案。</p>
<h2 id="frontmatter-的欄位設計">Frontmatter 的欄位設計</h2>
<p><strong>識別資訊</strong>：<code>ticket_id</code>、<code>version</code>、<code>wave</code>，確保每個 Ticket 有唯一且可解析的身份。</p>
<p><strong>單一職責定義</strong>：<code>action</code>（有限動詞：Implement、Fix、Add、Refactor、Remove、Update）加 <code>target</code>（操作對象）。強制「動詞 + 單一目標」的格式，防止一個 Ticket 偷渡多個責任。</p>
<p><strong>5W1H 設計</strong>：六個欄位確保 Ticket 在建立時就已經回答了誰來做、做什麼、什麼時機、在哪裡改、為什麼要做、怎麼做。</p>
<p><strong>驗收條件</strong>：<code>acceptance</code> 列表，每個條目完成後勾選。「完成」的定義在建立時就講清楚，不留到最後才爭。</p>
<p><strong>狀態追蹤</strong>：<code>status</code>（pending、in_progress、completed）、<code>assigned</code>（布林值）、<code>started_at</code>、<code>completed_at</code>。</p>
<h2 id="操作流程">操作流程</h2>
<ul>
<li><code>ticket create</code>：生成帶完整 frontmatter 的 Markdown 文件，初始狀態 <code>pending</code>、<code>assigned: false</code></li>
<li><code>ticket track claim</code>：<code>status</code> 改為 <code>in_progress</code>、<code>assigned: true</code>、記錄 <code>started_at</code></li>
<li><code>ticket track complete</code>：<code>status</code> 改為 <code>completed</code>、記錄 <code>completed_at</code></li>
<li><code>ticket track release</code>：Ticket 退回 <code>pending</code>，可由其他人接手</li>
<li><code>ticket track summary</code>：輸出所有 Ticket 的緊湊一覽，幾秒掌握版本進度</li>
</ul>
<h2 id="與文件系統的整合">與文件系統的整合</h2>
<p>Ticket 是整個文件系統的最底層：CHANGELOG 的素材從 Ticket 記錄提取，版本收尾時從 Ticket 狀態確認所有任務完成。上面還有 worklog（版本目標）和 todolist（版本索引），各層各司其職，形成可追蹤的鏈條。</p>
<h2 id="向後相容策略">向後相容策略</h2>
<p>遷移前已有一批 CSV 格式的舊 Ticket。策略是「新格式完整支援，舊格式唯讀查詢」：工具自動偵測，有 <code>tickets/</code> 目錄就用新格式，只有 <code>tickets.csv</code> 就唯讀讀取。舊版本的 <code>summary</code> 和 <code>list</code> 仍可運作，只是不能執行狀態變更。不需要一次性轉換所有歷史記錄。</p>
<h2 id="實踐中的行為規範">實踐中的行為規範</h2>
<p>主線程不應該問代理人「你做完了嗎」。執行查詢命令，讀 frontmatter。</p>
<p>代理人完成後，詳細說明寫進 Ticket body（問題分析、解決方案、測試結果），不要輸出給主線程。主線程只需要知道一件事：Ticket 是否已完成。</p>
<p>執行日誌要記完整——不只是最終結果，還有過程中遇到的問題、嘗試的方案、最終選擇的原因。這讓 Ticket 成為可供日後回顧的執行記錄，而不只是一個狀態標記。</p>
<h2 id="本質上解決的問題">本質上解決的問題</h2>
<p>主線程不需要「知道」進度，它只需要「查詢」。狀態是持久化的、機器可讀的、時刻最新的。</p>
<p>這把進度追蹤從「溝通問題」變成了「查詢問題」。溝通依賴時機、依賴雙方都在場；查詢只依賴資料存在和工具可靠。從 CSV 到 Frontmatter，本質是從「狀態需要溝通」到「狀態需要持久化」的思維轉換。</p>]]></content:encoded></item></channel></rss>