<?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>Data-Consistency on Tarragon</title><link>https://tarrragon.github.io/blog/tags/data-consistency/</link><description>Recent content in Data-Consistency on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 25 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/data-consistency/index.xml" rel="self" type="application/rss+xml"/><item><title>版本狀態殘留：為什麼已完成的版本在看板上顯示未完成</title><link>https://tarrragon.github.io/blog/work-log/%E7%89%88%E6%9C%AC%E7%8B%80%E6%85%8B%E6%AE%98%E7%95%99%E7%82%BA%E4%BB%80%E9%BA%BC%E5%B7%B2%E5%AE%8C%E6%88%90%E7%9A%84%E7%89%88%E6%9C%AC%E5%9C%A8%E7%9C%8B%E6%9D%BF%E4%B8%8A%E9%A1%AF%E7%A4%BA%E6%9C%AA%E5%AE%8C%E6%88%90/</link><pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/work-log/%E7%89%88%E6%9C%AC%E7%8B%80%E6%85%8B%E6%AE%98%E7%95%99%E7%82%BA%E4%BB%80%E9%BA%BC%E5%B7%B2%E5%AE%8C%E6%88%90%E7%9A%84%E7%89%88%E6%9C%AC%E5%9C%A8%E7%9C%8B%E6%9D%BF%E4%B8%8A%E9%A1%AF%E7%A4%BA%E6%9C%AA%E5%AE%8C%E6%88%90/</guid><description>&lt;h2 id="事件">事件&lt;/h2>
&lt;p>版本看板顯示 v0.2.0 有未完成任務。查證後發現 v0.2.0 的 38 張工作項目全部完成、v0.2.1 的 7 張全部完成、v0.2.2 的 1 張已結案——但三個版本在版本清單中仍標記為 &lt;code>active&lt;/code>。&lt;/p>
&lt;p>這些版本在數個月前就完成了所有工作，但從未被標記為 &lt;code>completed&lt;/code>。看板忠實地反映了版本清單的狀態，所以持續顯示「有未完成工作」。&lt;/p>
&lt;h2 id="根因工具的檢查範圍太窄">根因：工具的檢查範圍太窄&lt;/h2>
&lt;p>版本發布工具在發布 v0.3.0 時，只做一件事：「v0.3.0 的所有 ticket 都完成了嗎？」答案是「是」，就繼續發布。&lt;/p>
&lt;p>它從不問：「比 v0.3.0 更早的版本中，有沒有哪個版本的 ticket 早已全部完成，但 status 仍為 active？」&lt;/p>
&lt;p>這個檢查加起來不難（遍歷版本清單、對每個 active 版本計算 ticket 完成率、完成率 100% 但 status 不是 completed 就報 warning）。但沒有人想到要加——因為在設計工具時，焦點在「當前版本的發布流程」，不在「全局狀態一致性」。&lt;/p>
&lt;h2 id="教訓">教訓&lt;/h2>
&lt;p>資料庫設計中，如果只在寫入時驗證單筆資料的格式而不檢查跨表一致性，orphan record 就會累積。版本管理工具的 pre-flight check 是同一個 pattern——它是內部流程的「外鍵約束」。範圍太窄，殘留就會累積。&lt;/p>
&lt;p>工具只檢查當前版本，一致性就只在當前版本內維持。歷史版本的狀態漂移不會被發現——直到有人手動查看看板。&lt;/p>
&lt;h2 id="修正">修正&lt;/h2>
&lt;p>在版本發布的 pre-flight check 加入全局掃描：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">$ version-release check
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">[OK] v0.3.0：所有 ticket 完成，可發布
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">[WARN] v0.2.0：38 張 ticket 全部完成但 status 仍為 active
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">[WARN] v0.2.1：7 張 ticket 全部完成但 status 仍為 active&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>修正成本極低（一個迴圈 + 一個 warning），但能在問題累積前暴露。&lt;/p></description><content:encoded><![CDATA[<h2 id="事件">事件</h2>
<p>版本看板顯示 v0.2.0 有未完成任務。查證後發現 v0.2.0 的 38 張工作項目全部完成、v0.2.1 的 7 張全部完成、v0.2.2 的 1 張已結案——但三個版本在版本清單中仍標記為 <code>active</code>。</p>
<p>這些版本在數個月前就完成了所有工作，但從未被標記為 <code>completed</code>。看板忠實地反映了版本清單的狀態，所以持續顯示「有未完成工作」。</p>
<h2 id="根因工具的檢查範圍太窄">根因：工具的檢查範圍太窄</h2>
<p>版本發布工具在發布 v0.3.0 時，只做一件事：「v0.3.0 的所有 ticket 都完成了嗎？」答案是「是」，就繼續發布。</p>
<p>它從不問：「比 v0.3.0 更早的版本中，有沒有哪個版本的 ticket 早已全部完成，但 status 仍為 active？」</p>
<p>這個檢查加起來不難（遍歷版本清單、對每個 active 版本計算 ticket 完成率、完成率 100% 但 status 不是 completed 就報 warning）。但沒有人想到要加——因為在設計工具時，焦點在「當前版本的發布流程」，不在「全局狀態一致性」。</p>
<h2 id="教訓">教訓</h2>
<p>資料庫設計中，如果只在寫入時驗證單筆資料的格式而不檢查跨表一致性，orphan record 就會累積。版本管理工具的 pre-flight check 是同一個 pattern——它是內部流程的「外鍵約束」。範圍太窄，殘留就會累積。</p>
<p>工具只檢查當前版本，一致性就只在當前版本內維持。歷史版本的狀態漂移不會被發現——直到有人手動查看看板。</p>
<h2 id="修正">修正</h2>
<p>在版本發布的 pre-flight check 加入全局掃描：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">$ version-release check
</span></span><span class="line"><span class="ln">2</span><span class="cl">[OK] v0.3.0：所有 ticket 完成，可發布
</span></span><span class="line"><span class="ln">3</span><span class="cl">[WARN] v0.2.0：38 張 ticket 全部完成但 status 仍為 active
</span></span><span class="line"><span class="ln">4</span><span class="cl">[WARN] v0.2.1：7 張 ticket 全部完成但 status 仍為 active</span></span></code></pre></div><p>修正成本極低（一個迴圈 + 一個 warning），但能在問題累積前暴露。</p>
]]></content:encoded></item></channel></rss>