<?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>Knowledge-Card on Tarragon</title><link>https://tarrragon.github.io/blog/tags/knowledge-card/</link><description>Recent content in Knowledge-Card on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 24 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/knowledge-card/index.xml" rel="self" type="application/rss+xml"/><item><title>Funnel Analysis</title><link>https://tarrragon.github.io/blog/monitoring/knowledge-cards/funnel-analysis/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/knowledge-cards/funnel-analysis/</guid><description>&lt;p>Funnel analysis 的核心概念是「追蹤使用者在多步驟流程中每一步的轉換率和流失率」。每一步有多少使用者完成、多少使用者離開，構成漏斗形狀的轉換圖。可先對照 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/cohort-analysis/" data-link-title="Cohort Analysis" data-link-desc="說明把使用者按共同特徵分群、比較不同群組行為差異的分析方法">cohort analysis&lt;/a>（按群組比較留存）和 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/rfm/" data-link-title="RFM" data-link-desc="說明用 Recency / Frequency / Monetary 三個維度把使用者分成可操作群組的分群方法">RFM&lt;/a>（按行為分群）。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Funnel analysis 位在行為資料收集之後、產品決策之前。它的輸入是 event 類監控事件（使用者操作記錄），輸出是每步的轉換率。Funnel analysis 的前提是去識別化（&lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/redaction/" data-link-title="Redaction" data-link-desc="說明在事件資料離開 client 之前把敏感欄位的值替換成遮罩或移除的機制">redaction&lt;/a>）已完成 — 分析行為資料前必須確保資料不含可識別個人的敏感欄位。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>產品需要 funnel analysis 的訊號是「使用者在某個流程中的完成率低於預期，但不知道卡在哪一步」。註冊流程的轉換率從填寫 email 到完成驗證只有 30%，funnel analysis 揭露 60% 的使用者在「等待驗證信」步驟流失。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Funnel analysis 要定義步驟順序、步驟之間的時間窗口（使用者在多久內完成下一步才算轉換）、以及分群維度（按平台、來源、使用者類型拆分 funnel）。步驟定義需要和事件命名規範對齊 — funnel 的每一步對應一個具體的事件名稱。&lt;/p></description><content:encoded><![CDATA[<p>Funnel analysis 的核心概念是「追蹤使用者在多步驟流程中每一步的轉換率和流失率」。每一步有多少使用者完成、多少使用者離開，構成漏斗形狀的轉換圖。可先對照 <a href="/blog/monitoring/knowledge-cards/cohort-analysis/" data-link-title="Cohort Analysis" data-link-desc="說明把使用者按共同特徵分群、比較不同群組行為差異的分析方法">cohort analysis</a>（按群組比較留存）和 <a href="/blog/monitoring/knowledge-cards/rfm/" data-link-title="RFM" data-link-desc="說明用 Recency / Frequency / Monetary 三個維度把使用者分成可操作群組的分群方法">RFM</a>（按行為分群）。</p>
<h2 id="概念位置">概念位置</h2>
<p>Funnel analysis 位在行為資料收集之後、產品決策之前。它的輸入是 event 類監控事件（使用者操作記錄），輸出是每步的轉換率。Funnel analysis 的前提是去識別化（<a href="/blog/monitoring/knowledge-cards/redaction/" data-link-title="Redaction" data-link-desc="說明在事件資料離開 client 之前把敏感欄位的值替換成遮罩或移除的機制">redaction</a>）已完成 — 分析行為資料前必須確保資料不含可識別個人的敏感欄位。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>產品需要 funnel analysis 的訊號是「使用者在某個流程中的完成率低於預期，但不知道卡在哪一步」。註冊流程的轉換率從填寫 email 到完成驗證只有 30%，funnel analysis 揭露 60% 的使用者在「等待驗證信」步驟流失。</p>
<h2 id="設計責任">設計責任</h2>
<p>Funnel analysis 要定義步驟順序、步驟之間的時間窗口（使用者在多久內完成下一步才算轉換）、以及分群維度（按平台、來源、使用者類型拆分 funnel）。步驟定義需要和事件命名規範對齊 — funnel 的每一步對應一個具體的事件名稱。</p>
]]></content:encoded></item><item><title>畫面狀態矩陣</title><link>https://tarrragon.github.io/blog/ux-design/knowledge-cards/screen-state-matrix/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ux-design/knowledge-cards/screen-state-matrix/</guid><description>&lt;p>畫面狀態矩陣的核心概念是「用結構化表格讓每個畫面狀態的退出路徑可見」。每行代表一個畫面的一個狀態，四欄分別記錄該狀態的顯示內容、使用者可用操作、進入條件和退出路徑。退出路徑欄位為空代表 UX 死胡同 — 使用者進入後無法靠自己的操作離開。可先對照 &lt;a href="https://tarrragon.github.io/blog/ux-design/knowledge-cards/gate/" data-link-title="Gate（UX）" data-link-desc="說明使用者操作流程中「必須通過才能繼續」的關卡，以及成功/失敗/不確定三條路徑的設計責任">Gate&lt;/a>。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>畫面狀態矩陣位在 BDD 操作盤點和 UI 實作之間。操作盤點描述「使用者做什麼、看到什麼」，畫面狀態矩陣把這些描述展開成每個狀態的四個面向，補上操作盤點容易遺漏的「可用操作」和「退出路徑」。矩陣產出後可以直接轉成 widget test case，也可以加上「可觀測性」欄位連接 log 設計。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>需要畫面狀態矩陣的訊號是實機測試時發現使用者被困在某個畫面出不去。常見情境：error 畫面只有重連按鈕沒有返回按鈕、loading 畫面沒有取消操作、connected 畫面沒有斷線或返回的出口。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>畫面狀態矩陣的設計責任是在實作前暴露導航缺口。填寫時要確保每個狀態至少有一條退出路徑，即使是 connecting 這種過渡狀態也應該提供取消操作。矩陣和 &lt;a href="https://tarrragon.github.io/blog/ux-design/knowledge-cards/gate/" data-link-title="Gate（UX）" data-link-desc="說明使用者操作流程中「必須通過才能繼續」的關卡，以及成功/失敗/不確定三條路徑的設計責任">Gate&lt;/a> 設計互補 — gate 的失敗路徑和不確定路徑應該反映在矩陣的退出路徑欄中。&lt;/p></description><content:encoded><![CDATA[<p>畫面狀態矩陣的核心概念是「用結構化表格讓每個畫面狀態的退出路徑可見」。每行代表一個畫面的一個狀態，四欄分別記錄該狀態的顯示內容、使用者可用操作、進入條件和退出路徑。退出路徑欄位為空代表 UX 死胡同 — 使用者進入後無法靠自己的操作離開。可先對照 <a href="/blog/ux-design/knowledge-cards/gate/" data-link-title="Gate（UX）" data-link-desc="說明使用者操作流程中「必須通過才能繼續」的關卡，以及成功/失敗/不確定三條路徑的設計責任">Gate</a>。</p>
<h2 id="概念位置">概念位置</h2>
<p>畫面狀態矩陣位在 BDD 操作盤點和 UI 實作之間。操作盤點描述「使用者做什麼、看到什麼」，畫面狀態矩陣把這些描述展開成每個狀態的四個面向，補上操作盤點容易遺漏的「可用操作」和「退出路徑」。矩陣產出後可以直接轉成 widget test case，也可以加上「可觀測性」欄位連接 log 設計。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>需要畫面狀態矩陣的訊號是實機測試時發現使用者被困在某個畫面出不去。常見情境：error 畫面只有重連按鈕沒有返回按鈕、loading 畫面沒有取消操作、connected 畫面沒有斷線或返回的出口。</p>
<h2 id="設計責任">設計責任</h2>
<p>畫面狀態矩陣的設計責任是在實作前暴露導航缺口。填寫時要確保每個狀態至少有一條退出路徑，即使是 connecting 這種過渡狀態也應該提供取消操作。矩陣和 <a href="/blog/ux-design/knowledge-cards/gate/" data-link-title="Gate（UX）" data-link-desc="說明使用者操作流程中「必須通過才能繼續」的關卡，以及成功/失敗/不確定三條路徑的設計責任">Gate</a> 設計互補 — gate 的失敗路徑和不確定路徑應該反映在矩陣的退出路徑欄中。</p>
]]></content:encoded></item><item><title>CI Pipeline</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/ci-pipeline/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/ci-pipeline/</guid><description>&lt;p>CI Pipeline 的核心概念是「在合併前自動驗證變更」。它把品質門檻前移，讓問題在進主線前被發現。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>CI Pipeline 位在開發提交、pull request 與主線保護之間，常由 lint、test、build、security check 組成。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>PR 需要依賴檢查結果決定能否合併。&lt;/li>
&lt;li>團隊需要一致的失敗判讀入口。&lt;/li>
&lt;li>本機通過但共享流程失敗時，需要明確定位差異。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>前端專案會把 markdown lint、browser test 與 production build 放在同一套 CI 驗證入口。後端專案則可能加入 contract test、migration check 或 image scan。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>CI Pipeline 要定義必跑檢查、失敗回饋路由與執行時間上限，讓綠燈具備可發布前提。&lt;/p></description><content:encoded><![CDATA[<p>CI Pipeline 的核心概念是「在合併前自動驗證變更」。它把品質門檻前移，讓問題在進主線前被發現。</p>
<h2 id="概念位置">概念位置</h2>
<p>CI Pipeline 位在開發提交、pull request 與主線保護之間，常由 lint、test、build、security check 組成。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>PR 需要依賴檢查結果決定能否合併。</li>
<li>團隊需要一致的失敗判讀入口。</li>
<li>本機通過但共享流程失敗時，需要明確定位差異。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>前端專案會把 markdown lint、browser test 與 production build 放在同一套 CI 驗證入口。後端專案則可能加入 contract test、migration check 或 image scan。</p>
<h2 id="設計責任">設計責任</h2>
<p>CI Pipeline 要定義必跑檢查、失敗回饋路由與執行時間上限，讓綠燈具備可發布前提。</p>
]]></content:encoded></item><item><title>Gate（UX）</title><link>https://tarrragon.github.io/blog/ux-design/knowledge-cards/gate/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ux-design/knowledge-cards/gate/</guid><description>&lt;p>Gate 的核心概念是「使用者操作流程中必須通過才能繼續的關卡」。認證、網路連線、權限請求、環境檢查、付費牆都是 gate。每個 gate 需要設計三條路徑：成功時做什麼、失敗時做什麼、使用者不知道發生什麼時做什麼。可先對照 &lt;a href="https://tarrragon.github.io/blog/ux-design/knowledge-cards/ux-fallback/" data-link-title="Fallback（UX）" data-link-desc="說明 gate 未通過時使用者的替代路徑，和 backend fallback（server-side 降級）的語意區別">Fallback（UX）&lt;/a> 和 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">Fallback（Backend）&lt;/a>。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>UX 語境的 gate 聚焦在使用者體驗層 — 關注的是「使用者被擋住時看到什麼、能做什麼」。和 backend 語境的 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/gate-decision/" data-link-title="Gate Decision" data-link-desc="說明 release gate 如何把證據轉成放行、暫停、回退或補證據的決策">gate decision&lt;/a> 不同，後者關注的是部署流程中的品質關卡。Gate 的失敗路徑和不確定路徑應該反映在&lt;a href="https://tarrragon.github.io/blog/ux-design/knowledge-cards/screen-state-matrix/" data-link-title="畫面狀態矩陣" data-link-desc="說明用四欄表格（顯示/可用操作/進入條件/退出路徑）系統性地暴露畫面導航缺口的設計工具">畫面狀態矩陣&lt;/a>的退出路徑欄中。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>需要 gate 設計的訊號是使用者在某個功能前被阻擋且沒有替代路徑。常見情境：biometric 認證失敗後使用者無法進入 app、網路斷線後使用者被困在 loading 畫面、權限被拒後功能靜默消失但使用者不知道為什麼。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Gate 的設計責任是確保每條路徑都有明確的使用者體驗。成功路徑通常最先被設計；失敗路徑需要提供 &lt;a href="https://tarrragon.github.io/blog/ux-design/knowledge-cards/ux-fallback/" data-link-title="Fallback（UX）" data-link-desc="說明 gate 未通過時使用者的替代路徑，和 backend fallback（server-side 降級）的語意區別">UX fallback&lt;/a>（替代驗證、降級功能、返回上一頁）；不確定路徑需要 loading 指示和取消操作。開發環境可能遮蔽 gate 問題 — 模擬器跳過認證、debug build 自動授權 — 差異表讓開發者在上機前知道哪些 gate 還沒被真實驗證。&lt;/p></description><content:encoded><![CDATA[<p>Gate 的核心概念是「使用者操作流程中必須通過才能繼續的關卡」。認證、網路連線、權限請求、環境檢查、付費牆都是 gate。每個 gate 需要設計三條路徑：成功時做什麼、失敗時做什麼、使用者不知道發生什麼時做什麼。可先對照 <a href="/blog/ux-design/knowledge-cards/ux-fallback/" data-link-title="Fallback（UX）" data-link-desc="說明 gate 未通過時使用者的替代路徑，和 backend fallback（server-side 降級）的語意區別">Fallback（UX）</a> 和 <a href="/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">Fallback（Backend）</a>。</p>
<h2 id="概念位置">概念位置</h2>
<p>UX 語境的 gate 聚焦在使用者體驗層 — 關注的是「使用者被擋住時看到什麼、能做什麼」。和 backend 語境的 <a href="/blog/backend/knowledge-cards/gate-decision/" data-link-title="Gate Decision" data-link-desc="說明 release gate 如何把證據轉成放行、暫停、回退或補證據的決策">gate decision</a> 不同，後者關注的是部署流程中的品質關卡。Gate 的失敗路徑和不確定路徑應該反映在<a href="/blog/ux-design/knowledge-cards/screen-state-matrix/" data-link-title="畫面狀態矩陣" data-link-desc="說明用四欄表格（顯示/可用操作/進入條件/退出路徑）系統性地暴露畫面導航缺口的設計工具">畫面狀態矩陣</a>的退出路徑欄中。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>需要 gate 設計的訊號是使用者在某個功能前被阻擋且沒有替代路徑。常見情境：biometric 認證失敗後使用者無法進入 app、網路斷線後使用者被困在 loading 畫面、權限被拒後功能靜默消失但使用者不知道為什麼。</p>
<h2 id="設計責任">設計責任</h2>
<p>Gate 的設計責任是確保每條路徑都有明確的使用者體驗。成功路徑通常最先被設計；失敗路徑需要提供 <a href="/blog/ux-design/knowledge-cards/ux-fallback/" data-link-title="Fallback（UX）" data-link-desc="說明 gate 未通過時使用者的替代路徑，和 backend fallback（server-side 降級）的語意區別">UX fallback</a>（替代驗證、降級功能、返回上一頁）；不確定路徑需要 loading 指示和取消操作。開發環境可能遮蔽 gate 問題 — 模擬器跳過認證、debug build 自動授權 — 差異表讓開發者在上機前知道哪些 gate 還沒被真實驗證。</p>
]]></content:encoded></item><item><title>Redaction</title><link>https://tarrragon.github.io/blog/monitoring/knowledge-cards/redaction/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/knowledge-cards/redaction/</guid><description>&lt;p>Redaction 的核心概念是「在事件資料離開 client 之前，把敏感欄位的值替換成遮罩或移除」。密碼、API key、個人識別資訊在送到 collector 之前就被處理，確保敏感資料不進入傳輸和儲存層。可先對照 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis&lt;/a>（去識別化是行為分析的入場條件）。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Redaction 位在 SDK 端的事件產生和 collector 端的事件接收之間。它是監控資料安全的第一道防線 — 在資料離開使用者裝置之前處理，比 collector 端的 access control 更早介入。Redaction 和 transport 加密（HTTPS）互補：redaction 保護欄位內容，transport 加密保護傳輸過程。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>系統需要 redaction 的訊號是監控事件的 data 欄位可能包含使用者輸入。CLI 輸入可能含密碼（&lt;code>mysql -p'secret'&lt;/code>）、API key（&lt;code>Authorization: Bearer sk-...&lt;/code>）、連線字串（含帳密的 URL）。IME 個人化學習也是洩漏面 — 輸入框的內容被 IME 學習後跨 app 可見。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Redaction 要定義預設規則（哪些欄位名稱自動 redact）、自訂 pattern（正則表達式比對敏感值）、執行時機（event 進入 buffer 前還是 flush 時）、以及 redaction 失敗的處理（丟棄整筆事件 vs 只移除敏感欄位）。&lt;/p></description><content:encoded><![CDATA[<p>Redaction 的核心概念是「在事件資料離開 client 之前，把敏感欄位的值替換成遮罩或移除」。密碼、API key、個人識別資訊在送到 collector 之前就被處理，確保敏感資料不進入傳輸和儲存層。可先對照 <a href="/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis</a>（去識別化是行為分析的入場條件）。</p>
<h2 id="概念位置">概念位置</h2>
<p>Redaction 位在 SDK 端的事件產生和 collector 端的事件接收之間。它是監控資料安全的第一道防線 — 在資料離開使用者裝置之前處理，比 collector 端的 access control 更早介入。Redaction 和 transport 加密（HTTPS）互補：redaction 保護欄位內容，transport 加密保護傳輸過程。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>系統需要 redaction 的訊號是監控事件的 data 欄位可能包含使用者輸入。CLI 輸入可能含密碼（<code>mysql -p'secret'</code>）、API key（<code>Authorization: Bearer sk-...</code>）、連線字串（含帳密的 URL）。IME 個人化學習也是洩漏面 — 輸入框的內容被 IME 學習後跨 app 可見。</p>
<h2 id="設計責任">設計責任</h2>
<p>Redaction 要定義預設規則（哪些欄位名稱自動 redact）、自訂 pattern（正則表達式比對敏感值）、執行時機（event 進入 buffer 前還是 flush 時）、以及 redaction 失敗的處理（丟棄整筆事件 vs 只移除敏感欄位）。</p>
]]></content:encoded></item><item><title>CD Pipeline</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/cd-pipeline/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/cd-pipeline/</guid><description>&lt;p>CD Pipeline 的核心概念是「把已驗證產物安全交付到目標環境」。它把 build、artifact、deploy 與 release gate 串成可重播流程。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>CD Pipeline 位在 CI 驗證之後，負責 artifact promotion、部署執行、環境保護與回復路徑。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>同一份 artifact 需要在多個環境推進。&lt;/li>
&lt;li>發布步驟需要審核、權限或時間窗控制。&lt;/li>
&lt;li>發布失敗時需要可回退或可修復路徑。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>靜態站會在 CI 成功後上傳 artifact 到 hosting。後端服務會推進同一個 image tag 到 staging 與 production，並以 rollout strategy 控制風險。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>CD Pipeline 要明確定義放行條件、部署順序、例外流程與回復策略，確保發布節奏與風險控制一致。&lt;/p></description><content:encoded><![CDATA[<p>CD Pipeline 的核心概念是「把已驗證產物安全交付到目標環境」。它把 build、artifact、deploy 與 release gate 串成可重播流程。</p>
<h2 id="概念位置">概念位置</h2>
<p>CD Pipeline 位在 CI 驗證之後，負責 artifact promotion、部署執行、環境保護與回復路徑。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>同一份 artifact 需要在多個環境推進。</li>
<li>發布步驟需要審核、權限或時間窗控制。</li>
<li>發布失敗時需要可回退或可修復路徑。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>靜態站會在 CI 成功後上傳 artifact 到 hosting。後端服務會推進同一個 image tag 到 staging 與 production，並以 rollout strategy 控制風險。</p>
<h2 id="設計責任">設計責任</h2>
<p>CD Pipeline 要明確定義放行條件、部署順序、例外流程與回復策略，確保發布節奏與風險控制一致。</p>
]]></content:encoded></item><item><title>Cohort Analysis</title><link>https://tarrragon.github.io/blog/monitoring/knowledge-cards/cohort-analysis/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/knowledge-cards/cohort-analysis/</guid><description>&lt;p>Cohort analysis 的核心概念是「把使用者按共同特徵分群，比較不同群組的行為差異」。Cohort 通常按時間（註冊月份）、行為（首次使用的功能）、或屬性（付費方案）分群。可先對照 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis&lt;/a>（追蹤單一流程的每步轉換）和 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/rfm/" data-link-title="RFM" data-link-desc="說明用 Recency / Frequency / Monetary 三個維度把使用者分成可操作群組的分群方法">RFM&lt;/a>（按行為指標分群）。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Cohort analysis 位在 funnel analysis 之後、策略制定之前。Funnel analysis 回答「使用者在哪一步流失」，cohort analysis 回答「哪種使用者流失率高」。兩者搭配使用：funnel 找到流失步驟，cohort 找到流失群組，策略針對特定群組的流失步驟設計。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>產品需要 cohort analysis 的訊號是「整體留存率或轉換率的平均值遮蔽了群組差異」。整體 30 天留存率 40%，但按註冊來源拆分後發現自然搜尋來的使用者留存 60%、廣告來的使用者留存 20% — 平均值沒有揭露這個差異。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Cohort analysis 要定義分群維度（按什麼特徵分）、觀察指標（留存率、活躍度、付費率）、觀察時間窗口（7 天、30 天、90 天）、以及最小群組大小（群組太小時統計不顯著）。分群維度的選擇決定了分析能揭露什麼 — 按「註冊來源」分群能看到獲客通路的品質差異，按「使用的功能」分群能看到功能黏著度差異。&lt;/p></description><content:encoded><![CDATA[<p>Cohort analysis 的核心概念是「把使用者按共同特徵分群，比較不同群組的行為差異」。Cohort 通常按時間（註冊月份）、行為（首次使用的功能）、或屬性（付費方案）分群。可先對照 <a href="/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis</a>（追蹤單一流程的每步轉換）和 <a href="/blog/monitoring/knowledge-cards/rfm/" data-link-title="RFM" data-link-desc="說明用 Recency / Frequency / Monetary 三個維度把使用者分成可操作群組的分群方法">RFM</a>（按行為指標分群）。</p>
<h2 id="概念位置">概念位置</h2>
<p>Cohort analysis 位在 funnel analysis 之後、策略制定之前。Funnel analysis 回答「使用者在哪一步流失」，cohort analysis 回答「哪種使用者流失率高」。兩者搭配使用：funnel 找到流失步驟，cohort 找到流失群組，策略針對特定群組的流失步驟設計。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>產品需要 cohort analysis 的訊號是「整體留存率或轉換率的平均值遮蔽了群組差異」。整體 30 天留存率 40%，但按註冊來源拆分後發現自然搜尋來的使用者留存 60%、廣告來的使用者留存 20% — 平均值沒有揭露這個差異。</p>
<h2 id="設計責任">設計責任</h2>
<p>Cohort analysis 要定義分群維度（按什麼特徵分）、觀察指標（留存率、活躍度、付費率）、觀察時間窗口（7 天、30 天、90 天）、以及最小群組大小（群組太小時統計不顯著）。分群維度的選擇決定了分析能揭露什麼 — 按「註冊來源」分群能看到獲客通路的品質差異，按「使用的功能」分群能看到功能黏著度差異。</p>
]]></content:encoded></item><item><title>Fallback（UX）</title><link>https://tarrragon.github.io/blog/ux-design/knowledge-cards/ux-fallback/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ux-design/knowledge-cards/ux-fallback/</guid><description>&lt;p>UX fallback 的核心概念是「gate 未通過時使用者的替代路徑」。替代路徑可以是替代驗證方式（密碼代替 Face ID）、降級功能（部分功能可用）、手動重試、或放棄操作返回上一頁。和 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">Fallback（Backend）&lt;/a> 不同，UX fallback 關注的是使用者體驗層的路徑設計，而非 server-side 的服務降級策略。可先對照 &lt;a href="https://tarrragon.github.io/blog/ux-design/knowledge-cards/gate/" data-link-title="Gate（UX）" data-link-desc="說明使用者操作流程中「必須通過才能繼續」的關卡，以及成功/失敗/不確定三條路徑的設計責任">Gate&lt;/a>。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>UX fallback 位在 &lt;a href="https://tarrragon.github.io/blog/ux-design/knowledge-cards/gate/" data-link-title="Gate（UX）" data-link-desc="說明使用者操作流程中「必須通過才能繼續」的關卡，以及成功/失敗/不確定三條路徑的設計責任">Gate&lt;/a> 設計的失敗路徑中。Gate 的三問（成功/失敗/不確定）中，失敗路徑的具體內容就是 UX fallback。Backend 的 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">fallback&lt;/a> 是系統在依賴失敗時用替代結果維持服務，UX fallback 是使用者在 gate 失敗時的操作替代方案。兩者可能並存 — server-side fallback 提供降級資料，UX fallback 決定如何呈現這些降級資料給使用者。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>需要 UX fallback 的訊號是 gate 失敗時使用者完全無法繼續。常見情境：biometric 設定 &lt;code>biometricOnly: true&lt;/code> 導致 Face ID 失敗時沒有密碼 fallback、error 畫面只有重試按鈕沒有返回按鈕、網路斷線後所有功能不可用但部分功能不依賴網路。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>UX fallback 的設計責任是確保 gate 失敗時使用者有路可走。Fallback 的選擇取決於安全需求和使用場景 — 銀行 app 可能不提供低安全等級的 fallback，自用工具可以接受密碼 fallback 因為使用者就是 owner。安全 vs 可用性的取捨應在功能規格中顯式記錄。UX fallback 的存在應反映在&lt;a href="https://tarrragon.github.io/blog/ux-design/knowledge-cards/screen-state-matrix/" data-link-title="畫面狀態矩陣" data-link-desc="說明用四欄表格（顯示/可用操作/進入條件/退出路徑）系統性地暴露畫面導航缺口的設計工具">畫面狀態矩陣&lt;/a>的退出路徑欄中。&lt;/p></description><content:encoded><![CDATA[<p>UX fallback 的核心概念是「gate 未通過時使用者的替代路徑」。替代路徑可以是替代驗證方式（密碼代替 Face ID）、降級功能（部分功能可用）、手動重試、或放棄操作返回上一頁。和 <a href="/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">Fallback（Backend）</a> 不同，UX fallback 關注的是使用者體驗層的路徑設計，而非 server-side 的服務降級策略。可先對照 <a href="/blog/ux-design/knowledge-cards/gate/" data-link-title="Gate（UX）" data-link-desc="說明使用者操作流程中「必須通過才能繼續」的關卡，以及成功/失敗/不確定三條路徑的設計責任">Gate</a>。</p>
<h2 id="概念位置">概念位置</h2>
<p>UX fallback 位在 <a href="/blog/ux-design/knowledge-cards/gate/" data-link-title="Gate（UX）" data-link-desc="說明使用者操作流程中「必須通過才能繼續」的關卡，以及成功/失敗/不確定三條路徑的設計責任">Gate</a> 設計的失敗路徑中。Gate 的三問（成功/失敗/不確定）中，失敗路徑的具體內容就是 UX fallback。Backend 的 <a href="/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">fallback</a> 是系統在依賴失敗時用替代結果維持服務，UX fallback 是使用者在 gate 失敗時的操作替代方案。兩者可能並存 — server-side fallback 提供降級資料，UX fallback 決定如何呈現這些降級資料給使用者。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>需要 UX fallback 的訊號是 gate 失敗時使用者完全無法繼續。常見情境：biometric 設定 <code>biometricOnly: true</code> 導致 Face ID 失敗時沒有密碼 fallback、error 畫面只有重試按鈕沒有返回按鈕、網路斷線後所有功能不可用但部分功能不依賴網路。</p>
<h2 id="設計責任">設計責任</h2>
<p>UX fallback 的設計責任是確保 gate 失敗時使用者有路可走。Fallback 的選擇取決於安全需求和使用場景 — 銀行 app 可能不提供低安全等級的 fallback，自用工具可以接受密碼 fallback 因為使用者就是 owner。安全 vs 可用性的取捨應在功能規格中顯式記錄。UX fallback 的存在應反映在<a href="/blog/ux-design/knowledge-cards/screen-state-matrix/" data-link-title="畫面狀態矩陣" data-link-desc="說明用四欄表格（顯示/可用操作/進入條件/退出路徑）系統性地暴露畫面導航缺口的設計工具">畫面狀態矩陣</a>的退出路徑欄中。</p>
]]></content:encoded></item><item><title>Required Checks</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/required-checks/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/required-checks/</guid><description>&lt;p>Required Checks 的核心概念是「把合併條件綁定到檢查結果」。它讓主線保護不依賴人工記憶，而依賴可觀測狀態。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Required Checks 位在 repository branch protection，連接 pull request 與 CI workflow 結果。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>PR 是否可合併取決於特定 checks 狀態。&lt;/li>
&lt;li>團隊需要確保高風險變更不繞過驗證。&lt;/li>
&lt;li>CI workflow 增刪後需要同步調整合併條件。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>專案可要求 &lt;code>md-check&lt;/code> 與 &lt;code>Playwright tests&lt;/code> 都通過才能合併 &lt;code>main&lt;/code>。若只跑 workflow 但未設為 required，主線仍可能進入紅燈變更。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Required Checks 要定義必要檢查集合、擁有者與變更流程，並和 workflow 命名保持一致。&lt;/p></description><content:encoded><![CDATA[<p>Required Checks 的核心概念是「把合併條件綁定到檢查結果」。它讓主線保護不依賴人工記憶，而依賴可觀測狀態。</p>
<h2 id="概念位置">概念位置</h2>
<p>Required Checks 位在 repository branch protection，連接 pull request 與 CI workflow 結果。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>PR 是否可合併取決於特定 checks 狀態。</li>
<li>團隊需要確保高風險變更不繞過驗證。</li>
<li>CI workflow 增刪後需要同步調整合併條件。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>專案可要求 <code>md-check</code> 與 <code>Playwright tests</code> 都通過才能合併 <code>main</code>。若只跑 workflow 但未設為 required，主線仍可能進入紅燈變更。</p>
<h2 id="設計責任">設計責任</h2>
<p>Required Checks 要定義必要檢查集合、擁有者與變更流程，並和 workflow 命名保持一致。</p>
]]></content:encoded></item><item><title>RFM</title><link>https://tarrragon.github.io/blog/monitoring/knowledge-cards/rfm/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/knowledge-cards/rfm/</guid><description>&lt;p>RFM 的核心概念是「用 Recency（最近活躍度）、Frequency（使用頻率）、Monetary（貢獻價值）三個維度把使用者分成可操作的群組」。每個維度獨立評分後組合，識別出忠實客戶、潛在流失、新使用者、休眠使用者等群組。可先對照 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/cohort-analysis/" data-link-title="Cohort Analysis" data-link-desc="說明把使用者按共同特徵分群、比較不同群組行為差異的分析方法">cohort analysis&lt;/a>（按共同特徵分群）和 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis&lt;/a>（追蹤流程轉換率）。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>RFM 位在行為資料累積到一定量之後。它需要每個使用者的 session 歷史（計算 Recency 和 Frequency）和交易歷史（計算 Monetary）。免費產品可以用替代指標取代 Monetary — 產生的內容數量、邀請的使用者數、完成的關鍵操作數。RFM 的前提和 cohort analysis 相同：去識別化（&lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/redaction/" data-link-title="Redaction" data-link-desc="說明在事件資料離開 client 之前把敏感欄位的值替換成遮罩或移除的機制">redaction&lt;/a>）已完成。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>產品需要 RFM 的訊號是「需要對不同行為模式的使用者採取不同策略」。高 R 高 F 高 M 的忠實客戶需要維護關係，低 R 高 F 高 M 的潛在流失客戶需要挽留，高 R 低 F 低 M 的新使用者需要引導降低入門門檻。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>RFM 要定義每個維度的計算方式（Recency 用天數還是週數、Frequency 的時間窗口多長、Monetary 用什麼指標）、分位數（五等分還是三等分）、群組歸納（125 種 profile 歸納成幾個可操作群組）、以及重新計算的頻率（每週還是每月）。分群結果是動態的 — 使用者行為改變時群組會變。&lt;/p></description><content:encoded><![CDATA[<p>RFM 的核心概念是「用 Recency（最近活躍度）、Frequency（使用頻率）、Monetary（貢獻價值）三個維度把使用者分成可操作的群組」。每個維度獨立評分後組合，識別出忠實客戶、潛在流失、新使用者、休眠使用者等群組。可先對照 <a href="/blog/monitoring/knowledge-cards/cohort-analysis/" data-link-title="Cohort Analysis" data-link-desc="說明把使用者按共同特徵分群、比較不同群組行為差異的分析方法">cohort analysis</a>（按共同特徵分群）和 <a href="/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis</a>（追蹤流程轉換率）。</p>
<h2 id="概念位置">概念位置</h2>
<p>RFM 位在行為資料累積到一定量之後。它需要每個使用者的 session 歷史（計算 Recency 和 Frequency）和交易歷史（計算 Monetary）。免費產品可以用替代指標取代 Monetary — 產生的內容數量、邀請的使用者數、完成的關鍵操作數。RFM 的前提和 cohort analysis 相同：去識別化（<a href="/blog/monitoring/knowledge-cards/redaction/" data-link-title="Redaction" data-link-desc="說明在事件資料離開 client 之前把敏感欄位的值替換成遮罩或移除的機制">redaction</a>）已完成。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>產品需要 RFM 的訊號是「需要對不同行為模式的使用者採取不同策略」。高 R 高 F 高 M 的忠實客戶需要維護關係，低 R 高 F 高 M 的潛在流失客戶需要挽留，高 R 低 F 低 M 的新使用者需要引導降低入門門檻。</p>
<h2 id="設計責任">設計責任</h2>
<p>RFM 要定義每個維度的計算方式（Recency 用天數還是週數、Frequency 的時間窗口多長、Monetary 用什麼指標）、分位數（五等分還是三等分）、群組歸納（125 種 profile 歸納成幾個可操作群組）、以及重新計算的頻率（每週還是每月）。分群結果是動態的 — 使用者行為改變時群組會變。</p>
]]></content:encoded></item><item><title>Artifact</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/artifact/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/artifact/</guid><description>&lt;p>Artifact 的核心概念是「可被追溯的交付產物」。它是 build 的輸出單位，也是 test 與 deploy 的共同依據。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Artifact 位在 build、test、package、deploy 之間，常見形式包含靜態網站檔案、container image、app bundle、安裝包與報告檔案。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>測試與部署的輸入來源需要一致。&lt;/li>
&lt;li>發布事故需要從線上版本反查 build run。&lt;/li>
&lt;li>團隊需要管理產物保留時間與完整性驗證。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>前端靜態站會把 &lt;code>public/&lt;/code> 作為 artifact，上傳後再部署。後端則用 image digest 作為 artifact 識別，推進到不同環境。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Artifact 要定義命名、版本追溯、保留策略與完整性檢查，讓發布結果可重播、可比對、可審計。&lt;/p></description><content:encoded><![CDATA[<p>Artifact 的核心概念是「可被追溯的交付產物」。它是 build 的輸出單位，也是 test 與 deploy 的共同依據。</p>
<h2 id="概念位置">概念位置</h2>
<p>Artifact 位在 build、test、package、deploy 之間，常見形式包含靜態網站檔案、container image、app bundle、安裝包與報告檔案。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>測試與部署的輸入來源需要一致。</li>
<li>發布事故需要從線上版本反查 build run。</li>
<li>團隊需要管理產物保留時間與完整性驗證。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>前端靜態站會把 <code>public/</code> 作為 artifact，上傳後再部署。後端則用 image digest 作為 artifact 識別，推進到不同環境。</p>
<h2 id="設計責任">設計責任</h2>
<p>Artifact 要定義命名、版本追溯、保留策略與完整性檢查，讓發布結果可重播、可比對、可審計。</p>
]]></content:encoded></item><item><title>Artifact Handoff</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/artifact-handoff/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/artifact-handoff/</guid><description>&lt;p>Artifact Handoff 的核心概念是「測試與發布共用同一份產物」。它把可重現性從口頭約定變成流程保證。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Artifact Handoff 位在 build、test、deploy 之間，透過 upload / download artifact 串接驗證與發布。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>測試通過但部署後行為與測試結果不一致。&lt;/li>
&lt;li>多環境重新 build 造成版本漂移。&lt;/li>
&lt;li>事故追查時缺少從部署版本反查 build run 的路徑。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>CI build 產生靜態網站 artifact，browser test 驗證該 artifact，deploy job 再發布同一份產物。容器場域則可把 image digest 當成 handoff 物件。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Artifact Handoff 要定義產物格式、保留策略、完整性驗證與追溯欄位，讓測試結果可直接映射到發布結果。&lt;/p></description><content:encoded><![CDATA[<p>Artifact Handoff 的核心概念是「測試與發布共用同一份產物」。它把可重現性從口頭約定變成流程保證。</p>
<h2 id="概念位置">概念位置</h2>
<p>Artifact Handoff 位在 build、test、deploy 之間，透過 upload / download artifact 串接驗證與發布。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>測試通過但部署後行為與測試結果不一致。</li>
<li>多環境重新 build 造成版本漂移。</li>
<li>事故追查時缺少從部署版本反查 build run 的路徑。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>CI build 產生靜態網站 artifact，browser test 驗證該 artifact，deploy job 再發布同一份產物。容器場域則可把 image digest 當成 handoff 物件。</p>
<h2 id="設計責任">設計責任</h2>
<p>Artifact Handoff 要定義產物格式、保留策略、完整性驗證與追溯欄位，讓測試結果可直接映射到發布結果。</p>
]]></content:encoded></item><item><title>Error Fingerprint</title><link>https://tarrragon.github.io/blog/monitoring/knowledge-cards/error-fingerprint/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/knowledge-cards/error-fingerprint/</guid><description>&lt;p>Error fingerprint 的核心概念是「從 error 事件中提取關鍵欄位計算 hash，相同 hash 的事件歸為同一 error group」。沒有 fingerprint 時，1000 筆同因 error 在 dashboard 上是 1000 行；有 fingerprint 後歸為 1 組，顯示 count / first_seen / last_seen / affected_sessions。可先對照 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/redaction/" data-link-title="Redaction" data-link-desc="說明在事件資料離開 client 之前把敏感欄位的值替換成遮罩或移除的機制">redaction&lt;/a>（事件送出前的資料脫敏）和 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis&lt;/a>（行為事件的轉換率分析）。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Error fingerprint 位在 collector 收到 error 事件之後、寫入 storage 之前。它的輸入是通過 schema validation 的 error 事件，輸出是附加了 &lt;code>_fingerprint&lt;/code> 欄位的事件和更新後的 error_groups 摘要表。Fingerprint 只作用於 &lt;code>type: &amp;quot;error&amp;quot;&lt;/code> 的事件 — 其他三類事件（event / metric / lifecycle）不需要去重分群。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>需要 fingerprint 的訊號是「dashboard 的 error 列表中，同一個 bug 因為 error message 包含動態值（user ID、timestamp、IP）而分裂成多個不同的行」。例如 &lt;code>&amp;quot;User 12345 not found&amp;quot;&lt;/code> 和 &lt;code>&amp;quot;User 67890 not found&amp;quot;&lt;/code> 是同一個 bug，但 name-based grouping（&lt;code>GROUP BY name&lt;/code>）把它們歸為同一行時，丟失了 message 中的動態值資訊；而沒有 normalization 的 message-based grouping 會把它們分裂成兩行。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Fingerprint 承擔的設計責任是「在 error 的精確識別和分群粒度之間找到平衡」。過粗的 fingerprint（只用 error type）把不同 bug 混在同一組；過細的 fingerprint（用完整 message 含動態值）把同因 error 分裂成多組。&lt;/p>
&lt;h2 id="自架-vs-商業方案">自架 vs 商業方案&lt;/h2>
&lt;p>自架方案用規則做 fingerprint — regex normalize message（替換數字 / UUID / email / IP 等動態值）+ stack trace top N frames 做 hash。Sentry 在規則之上加了 in-app frame 過濾（忽略 framework / library frame）、source map 反解（minified JS → 原始碼位置）、和 ML-based grouping（語意相同但結構不同的 error 歸組）。差距主要在 minified / obfuscated 環境和 ML — 明文 stack trace 的場景下兩者效果相當。&lt;/p>
&lt;h2 id="完整章節">完整章節&lt;/h2>
&lt;p>Fingerprint 演算法（基礎 / 進階 / Sentry / 自定義）、message normalization 的替換規則和風險、error_groups 表的 DDL 和 UPSERT 流程、dashboard 整合、自架方案的務實邊界 → &lt;a href="https://tarrragon.github.io/blog/monitoring/04-collector/error-fingerprint/" data-link-title="Error Fingerprint 與去重分群" data-link-desc="把大量 error 事件歸組成可管理的 issue 列表 — fingerprint 演算法、message normalization、error_groups 表設計、自架方案的務實邊界">Error Fingerprint 與去重分群&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>Error fingerprint 的核心概念是「從 error 事件中提取關鍵欄位計算 hash，相同 hash 的事件歸為同一 error group」。沒有 fingerprint 時，1000 筆同因 error 在 dashboard 上是 1000 行；有 fingerprint 後歸為 1 組，顯示 count / first_seen / last_seen / affected_sessions。可先對照 <a href="/blog/monitoring/knowledge-cards/redaction/" data-link-title="Redaction" data-link-desc="說明在事件資料離開 client 之前把敏感欄位的值替換成遮罩或移除的機制">redaction</a>（事件送出前的資料脫敏）和 <a href="/blog/monitoring/knowledge-cards/funnel-analysis/" data-link-title="Funnel Analysis" data-link-desc="說明追蹤使用者在多步驟流程中每一步的轉換率和流失率的分析方法">funnel analysis</a>（行為事件的轉換率分析）。</p>
<h2 id="概念位置">概念位置</h2>
<p>Error fingerprint 位在 collector 收到 error 事件之後、寫入 storage 之前。它的輸入是通過 schema validation 的 error 事件，輸出是附加了 <code>_fingerprint</code> 欄位的事件和更新後的 error_groups 摘要表。Fingerprint 只作用於 <code>type: &quot;error&quot;</code> 的事件 — 其他三類事件（event / metric / lifecycle）不需要去重分群。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>需要 fingerprint 的訊號是「dashboard 的 error 列表中，同一個 bug 因為 error message 包含動態值（user ID、timestamp、IP）而分裂成多個不同的行」。例如 <code>&quot;User 12345 not found&quot;</code> 和 <code>&quot;User 67890 not found&quot;</code> 是同一個 bug，但 name-based grouping（<code>GROUP BY name</code>）把它們歸為同一行時，丟失了 message 中的動態值資訊；而沒有 normalization 的 message-based grouping 會把它們分裂成兩行。</p>
<h2 id="設計責任">設計責任</h2>
<p>Fingerprint 承擔的設計責任是「在 error 的精確識別和分群粒度之間找到平衡」。過粗的 fingerprint（只用 error type）把不同 bug 混在同一組；過細的 fingerprint（用完整 message 含動態值）把同因 error 分裂成多組。</p>
<h2 id="自架-vs-商業方案">自架 vs 商業方案</h2>
<p>自架方案用規則做 fingerprint — regex normalize message（替換數字 / UUID / email / IP 等動態值）+ stack trace top N frames 做 hash。Sentry 在規則之上加了 in-app frame 過濾（忽略 framework / library frame）、source map 反解（minified JS → 原始碼位置）、和 ML-based grouping（語意相同但結構不同的 error 歸組）。差距主要在 minified / obfuscated 環境和 ML — 明文 stack trace 的場景下兩者效果相當。</p>
<h2 id="完整章節">完整章節</h2>
<p>Fingerprint 演算法（基礎 / 進階 / Sentry / 自定義）、message normalization 的替換規則和風險、error_groups 表的 DDL 和 UPSERT 流程、dashboard 整合、自架方案的務實邊界 → <a href="/blog/monitoring/04-collector/error-fingerprint/" data-link-title="Error Fingerprint 與去重分群" data-link-desc="把大量 error 事件歸組成可管理的 issue 列表 — fingerprint 演算法、message normalization、error_groups 表設計、自架方案的務實邊界">Error Fingerprint 與去重分群</a>。</p>
]]></content:encoded></item><item><title>Environment Protection</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/environment-protection/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/environment-protection/</guid><description>&lt;p>Environment Protection 的核心概念是「用環境層 gate 控制正式發布」。它把環境風險從 workflow 腳本外顯成可檢查規則。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Environment Protection 位在部署 job 與目標環境之間，包含 reviewer、wait timer、branch policy 與 secret scope。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>測試綠燈後仍需要人工批准才能進 production。&lt;/li>
&lt;li>不同環境需要不同發布權限與審核規則。&lt;/li>
&lt;li>發布失誤常來自權限配置或保護規則缺失。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>GitHub Actions deploy job 指向 &lt;code>production&lt;/code> environment，需指定 reviewer 批准後才可部署。staging 則採自動放行。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Environment Protection 要定義環境分層、審核責任、發布時窗與例外流程，讓高風險發布有明確控制面。&lt;/p></description><content:encoded><![CDATA[<p>Environment Protection 的核心概念是「用環境層 gate 控制正式發布」。它把環境風險從 workflow 腳本外顯成可檢查規則。</p>
<h2 id="概念位置">概念位置</h2>
<p>Environment Protection 位在部署 job 與目標環境之間，包含 reviewer、wait timer、branch policy 與 secret scope。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>測試綠燈後仍需要人工批准才能進 production。</li>
<li>不同環境需要不同發布權限與審核規則。</li>
<li>發布失誤常來自權限配置或保護規則缺失。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>GitHub Actions deploy job 指向 <code>production</code> environment，需指定 reviewer 批准後才可部署。staging 則採自動放行。</p>
<h2 id="設計責任">設計責任</h2>
<p>Environment Protection 要定義環境分層、審核責任、發布時窗與例外流程，讓高風險發布有明確控制面。</p>
]]></content:encoded></item><item><title>Backpressure</title><link>https://tarrragon.github.io/blog/monitoring/knowledge-cards/backpressure/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/knowledge-cards/backpressure/</guid><description>&lt;p>背壓（backpressure）的通用概念見 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/backpressure/" data-link-title="Backpressure" data-link-desc="說明下游處理速度不足時系統如何讓上游依下游能力送出工作">Backend 知識卡：Backpressure&lt;/a> — 下游處理能力不足時向上游回傳「慢下來」訊號。本卡聚焦監控系統中的具體實作：collector 是下游、SDK 是上游，collector 的寫入 channel 滿時回 HTTP 429（Too Many Requests），SDK 收到 429 後自動降低&lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/sampling/" data-link-title="Sampling" data-link-desc="在事件產生階段按比例丟棄部分事件降低管線負載 — 分靜態取樣（config 固定比例）和動態取樣（背壓觸發自動降低）">取樣&lt;/a>率。可先對照 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/rate-limiting/" data-link-title="Rate Limiting" data-link-desc="限制每個 client 在單位時間內可送出的事件數量 — 防止單一 SDK bug 或偽造流量消耗整個 collector 的處理能力">rate limiting&lt;/a>（per-client 的配額限制）。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>背壓位在 SDK 和 collector 之間的 HTTP 通訊層。觸發順序：collector 的寫入 channel 容量耗盡 → HTTP handler 無法送入事件 → 回 429 → SDK 收到 429 → SDK 降低取樣率（從 1.0 → 0.5 → 0.1）。背壓是全域的容量訊號 — 所有 SDK 同時收到，所有 SDK 同時降速。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>需要關注背壓的訊號是 collector 端的 &lt;code>collector.events.backpressure&lt;/code> 計數器持續上升、或 SDK 端的 &lt;code>sdk.sampling.rate&lt;/code> 低於 1.0。典型場景：行銷活動導致同時在線使用者暴增 → 所有 SDK 同時 flush → collector channel 瞬間填滿 → 全域 429 → 所有 SDK 動態降採樣。&lt;/p>
&lt;h2 id="和-devops-背壓的關係">和 DevOps 背壓的關係&lt;/h2>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/devops/03-traffic-management/" data-link-title="模組三：流量管控" data-link-desc="收到的流量超過處理能力時怎麼辦 — 背壓、rate limit、熔斷、bulkhead 四種防護機制">DevOps 流量管控&lt;/a>討論通用的背壓概念（TCP flow control、message queue consumer lag、circuit breaker）。本系列聚焦 SDK ↔ collector 之間的具體實作 — HTTP 429 是訊號、動態取樣是回應、Go channel 容量是觸發條件。通用概念在 DevOps 模組，監控場景的具體機制在本系列。&lt;/p>
&lt;h2 id="完整章節">完整章節&lt;/h2>
&lt;p>背壓在四層防線中的位置（第二層 collector 單機防護）→ &lt;a href="https://tarrragon.github.io/blog/monitoring/04-collector/ingestion-scaling/" data-link-title="Ingestion Scaling" data-link-desc="四層防線應對 ingestion 端的流量擴展 — SDK 取樣、Collector 背壓、水平擴展、Queue 解耦">Ingestion Scaling&lt;/a>。背壓造成的資料損失和控制策略 → &lt;a href="https://tarrragon.github.io/blog/monitoring/04-collector/data-integrity/" data-link-title="端到端資料完整性" data-link-desc="從 SDK 到 storage 的資料損失地圖 — 每個環節的損失類型、控制策略、完整性指標、被自己 SDK DDoS 的防護">端到端資料完整性&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>背壓（backpressure）的通用概念見 <a href="/blog/backend/knowledge-cards/backpressure/" data-link-title="Backpressure" data-link-desc="說明下游處理速度不足時系統如何讓上游依下游能力送出工作">Backend 知識卡：Backpressure</a> — 下游處理能力不足時向上游回傳「慢下來」訊號。本卡聚焦監控系統中的具體實作：collector 是下游、SDK 是上游，collector 的寫入 channel 滿時回 HTTP 429（Too Many Requests），SDK 收到 429 後自動降低<a href="/blog/monitoring/knowledge-cards/sampling/" data-link-title="Sampling" data-link-desc="在事件產生階段按比例丟棄部分事件降低管線負載 — 分靜態取樣（config 固定比例）和動態取樣（背壓觸發自動降低）">取樣</a>率。可先對照 <a href="/blog/monitoring/knowledge-cards/rate-limiting/" data-link-title="Rate Limiting" data-link-desc="限制每個 client 在單位時間內可送出的事件數量 — 防止單一 SDK bug 或偽造流量消耗整個 collector 的處理能力">rate limiting</a>（per-client 的配額限制）。</p>
<h2 id="概念位置">概念位置</h2>
<p>背壓位在 SDK 和 collector 之間的 HTTP 通訊層。觸發順序：collector 的寫入 channel 容量耗盡 → HTTP handler 無法送入事件 → 回 429 → SDK 收到 429 → SDK 降低取樣率（從 1.0 → 0.5 → 0.1）。背壓是全域的容量訊號 — 所有 SDK 同時收到，所有 SDK 同時降速。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>需要關注背壓的訊號是 collector 端的 <code>collector.events.backpressure</code> 計數器持續上升、或 SDK 端的 <code>sdk.sampling.rate</code> 低於 1.0。典型場景：行銷活動導致同時在線使用者暴增 → 所有 SDK 同時 flush → collector channel 瞬間填滿 → 全域 429 → 所有 SDK 動態降採樣。</p>
<h2 id="和-devops-背壓的關係">和 DevOps 背壓的關係</h2>
<p><a href="/blog/devops/03-traffic-management/" data-link-title="模組三：流量管控" data-link-desc="收到的流量超過處理能力時怎麼辦 — 背壓、rate limit、熔斷、bulkhead 四種防護機制">DevOps 流量管控</a>討論通用的背壓概念（TCP flow control、message queue consumer lag、circuit breaker）。本系列聚焦 SDK ↔ collector 之間的具體實作 — HTTP 429 是訊號、動態取樣是回應、Go channel 容量是觸發條件。通用概念在 DevOps 模組，監控場景的具體機制在本系列。</p>
<h2 id="完整章節">完整章節</h2>
<p>背壓在四層防線中的位置（第二層 collector 單機防護）→ <a href="/blog/monitoring/04-collector/ingestion-scaling/" data-link-title="Ingestion Scaling" data-link-desc="四層防線應對 ingestion 端的流量擴展 — SDK 取樣、Collector 背壓、水平擴展、Queue 解耦">Ingestion Scaling</a>。背壓造成的資料損失和控制策略 → <a href="/blog/monitoring/04-collector/data-integrity/" data-link-title="端到端資料完整性" data-link-desc="從 SDK 到 storage 的資料損失地圖 — 每個環節的損失類型、控制策略、完整性指標、被自己 SDK DDoS 的防護">端到端資料完整性</a>。</p>
]]></content:encoded></item><item><title>Preview Environment</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/preview-environment/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/preview-environment/</guid><description>&lt;p>Preview Environment 的核心概念是「在合併前提供接近正式環境的可驗證入口」。它把 code review 從靜態 diff 延伸到真實互動行為。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Preview Environment 位在 pull request workflow 與正式部署流程之間，常由臨時 URL、隔離資源與到期清理組成。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>團隊需要在合併前驗證 UI、路由或互動行為。&lt;/li>
&lt;li>單靠測試報告不足以判斷體驗差異。&lt;/li>
&lt;li>變更常包含環境變數、CDN 設定或靜態資產路徑。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>前端 PR 自動建 preview URL 給 reviewer 驗證。後端則可能建立 review app 供 API 與整合測試使用。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Preview Environment 要定義建立條件、資源上限、可見範圍與清理策略，避免成本與風險失控。&lt;/p></description><content:encoded><![CDATA[<p>Preview Environment 的核心概念是「在合併前提供接近正式環境的可驗證入口」。它把 code review 從靜態 diff 延伸到真實互動行為。</p>
<h2 id="概念位置">概念位置</h2>
<p>Preview Environment 位在 pull request workflow 與正式部署流程之間，常由臨時 URL、隔離資源與到期清理組成。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>團隊需要在合併前驗證 UI、路由或互動行為。</li>
<li>單靠測試報告不足以判斷體驗差異。</li>
<li>變更常包含環境變數、CDN 設定或靜態資產路徑。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>前端 PR 自動建 preview URL 給 reviewer 驗證。後端則可能建立 review app 供 API 與整合測試使用。</p>
<h2 id="設計責任">設計責任</h2>
<p>Preview Environment 要定義建立條件、資源上限、可見範圍與清理策略，避免成本與風險失控。</p>
]]></content:encoded></item><item><title>Sampling</title><link>https://tarrragon.github.io/blog/monitoring/knowledge-cards/sampling/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/knowledge-cards/sampling/</guid><description>&lt;p>取樣（sampling）的通用概念見 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/sampling/" data-link-title="Sampling" data-link-desc="說明觀測資料如何抽樣以控制成本並保留診斷能力">Backend 知識卡：Sampling&lt;/a> — 只保留部分觀測資料以控制成本。本卡聚焦監控 SDK 中的具體實作：在事件產生階段按比例丟棄部分事件，降低後續管線（buffer → transport → collector → storage）的負載。取樣是設計內的損失 — 取樣率是明確的 config 參數，損失量可預測。可先對照 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/backpressure/" data-link-title="Backpressure" data-link-desc="下游處理能力不足時向上游回傳「慢下來」訊號的流量控制機制 — 監控系統中 collector 用 HTTP 429 向 SDK 傳遞背壓">backpressure&lt;/a>（觸發動態取樣的訊號來源）和 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/rate-limiting/" data-link-title="Rate Limiting" data-link-desc="限制每個 client 在單位時間內可送出的事件數量 — 防止單一 SDK bug 或偽造流量消耗整個 collector 的處理能力">rate limiting&lt;/a>（collector 端的 per-client 限制）。&lt;/p>
&lt;h2 id="兩種取樣">兩種取樣&lt;/h2>
&lt;p>&lt;strong>靜態取樣&lt;/strong>：SDK config 中設定固定比例（例如 metric 類 0.1 = 每 10 筆只收 1 筆），在 SDK 整個生命週期保持不變。適合已知高頻但單筆 debug 價值低的事件（render.frame_time、scroll.position）。&lt;/p>
&lt;p>&lt;strong>動態取樣&lt;/strong>：SDK 在收到 collector 的 HTTP 429 後自動降低取樣率，collector 恢復正常後逐步回升。動態取樣在正常情況下不生效（取樣率 = 1.0），只在 collector 過載時啟用。和靜態取樣互補 — 靜態控制基線負載，動態應對突發。&lt;/p>
&lt;h2 id="取樣校正">取樣校正&lt;/h2>
&lt;p>分析時用取樣率還原原始量級。取樣率 0.1 時收到 100 筆事件，推估原始量為 100 / 0.1 = 1000 筆。SDK 端的 &lt;code>sdk.sampling.rate&lt;/code> 指標記錄當前取樣率，讓下游分析知道如何校正。取樣校正對 funnel 和 cohort 分析有效（趨勢和比例不變），對個別事件追蹤無效（被丟棄的事件無法回復）。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>取樣承擔的設計責任是「在可觀測性覆蓋率和系統負載之間找到平衡」。Error 類事件不做取樣（每筆都可能是需要修的 bug），metric 類事件適合高比例取樣（丟幾筆不影響趨勢），event 類和 lifecycle 類取決於分析需求。&lt;/p>
&lt;h2 id="完整章節">完整章節&lt;/h2>
&lt;p>靜態取樣率的設定 → &lt;a href="https://tarrragon.github.io/blog/monitoring/03-sdk-design/sensor-lifecycle-management/" data-link-title="感測器生命週期管理" data-link-desc="產品生命週期的五個階段各啟用什麼感測器 — feature flag 整合、取樣率動態調整、感測器開關的可觀察性">感測器生命週期管理&lt;/a>。動態取樣在四層防線中的位置 → &lt;a href="https://tarrragon.github.io/blog/monitoring/04-collector/ingestion-scaling/" data-link-title="Ingestion Scaling" data-link-desc="四層防線應對 ingestion 端的流量擴展 — SDK 取樣、Collector 背壓、水平擴展、Queue 解耦">Ingestion Scaling&lt;/a>。取樣造成的損失量化和控制 → &lt;a href="https://tarrragon.github.io/blog/monitoring/04-collector/data-integrity/" data-link-title="端到端資料完整性" data-link-desc="從 SDK 到 storage 的資料損失地圖 — 每個環節的損失類型、控制策略、完整性指標、被自己 SDK DDoS 的防護">端到端資料完整性&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>取樣（sampling）的通用概念見 <a href="/blog/backend/knowledge-cards/sampling/" data-link-title="Sampling" data-link-desc="說明觀測資料如何抽樣以控制成本並保留診斷能力">Backend 知識卡：Sampling</a> — 只保留部分觀測資料以控制成本。本卡聚焦監控 SDK 中的具體實作：在事件產生階段按比例丟棄部分事件，降低後續管線（buffer → transport → collector → storage）的負載。取樣是設計內的損失 — 取樣率是明確的 config 參數，損失量可預測。可先對照 <a href="/blog/monitoring/knowledge-cards/backpressure/" data-link-title="Backpressure" data-link-desc="下游處理能力不足時向上游回傳「慢下來」訊號的流量控制機制 — 監控系統中 collector 用 HTTP 429 向 SDK 傳遞背壓">backpressure</a>（觸發動態取樣的訊號來源）和 <a href="/blog/monitoring/knowledge-cards/rate-limiting/" data-link-title="Rate Limiting" data-link-desc="限制每個 client 在單位時間內可送出的事件數量 — 防止單一 SDK bug 或偽造流量消耗整個 collector 的處理能力">rate limiting</a>（collector 端的 per-client 限制）。</p>
<h2 id="兩種取樣">兩種取樣</h2>
<p><strong>靜態取樣</strong>：SDK config 中設定固定比例（例如 metric 類 0.1 = 每 10 筆只收 1 筆），在 SDK 整個生命週期保持不變。適合已知高頻但單筆 debug 價值低的事件（render.frame_time、scroll.position）。</p>
<p><strong>動態取樣</strong>：SDK 在收到 collector 的 HTTP 429 後自動降低取樣率，collector 恢復正常後逐步回升。動態取樣在正常情況下不生效（取樣率 = 1.0），只在 collector 過載時啟用。和靜態取樣互補 — 靜態控制基線負載，動態應對突發。</p>
<h2 id="取樣校正">取樣校正</h2>
<p>分析時用取樣率還原原始量級。取樣率 0.1 時收到 100 筆事件，推估原始量為 100 / 0.1 = 1000 筆。SDK 端的 <code>sdk.sampling.rate</code> 指標記錄當前取樣率，讓下游分析知道如何校正。取樣校正對 funnel 和 cohort 分析有效（趨勢和比例不變），對個別事件追蹤無效（被丟棄的事件無法回復）。</p>
<h2 id="設計責任">設計責任</h2>
<p>取樣承擔的設計責任是「在可觀測性覆蓋率和系統負載之間找到平衡」。Error 類事件不做取樣（每筆都可能是需要修的 bug），metric 類事件適合高比例取樣（丟幾筆不影響趨勢），event 類和 lifecycle 類取決於分析需求。</p>
<h2 id="完整章節">完整章節</h2>
<p>靜態取樣率的設定 → <a href="/blog/monitoring/03-sdk-design/sensor-lifecycle-management/" data-link-title="感測器生命週期管理" data-link-desc="產品生命週期的五個階段各啟用什麼感測器 — feature flag 整合、取樣率動態調整、感測器開關的可觀察性">感測器生命週期管理</a>。動態取樣在四層防線中的位置 → <a href="/blog/monitoring/04-collector/ingestion-scaling/" data-link-title="Ingestion Scaling" data-link-desc="四層防線應對 ingestion 端的流量擴展 — SDK 取樣、Collector 背壓、水平擴展、Queue 解耦">Ingestion Scaling</a>。取樣造成的損失量化和控制 → <a href="/blog/monitoring/04-collector/data-integrity/" data-link-title="端到端資料完整性" data-link-desc="從 SDK 到 storage 的資料損失地圖 — 每個環節的損失類型、控制策略、完整性指標、被自己 SDK DDoS 的防護">端到端資料完整性</a>。</p>
]]></content:encoded></item><item><title>Rollout Strategy</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/rollout-strategy/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/rollout-strategy/</guid><description>&lt;p>Rollout Strategy 的核心概念是「用分批推進控制發布風險」。它讓變更從小範圍驗證逐步擴大到全量。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Rollout Strategy 位在部署執行與正式流量切換之間，常見型態包含 rolling、canary、blue-green 與 phased rollout。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>發布後需要觀察一段時間再擴大流量。&lt;/li>
&lt;li>高風險變更不適合一次全量切換。&lt;/li>
&lt;li>團隊需要把監控訊號綁定到擴大量決策。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>後端 API 先以 10% canary 流量觀察錯誤率與延遲，再逐步推進。App 發布以 phased rollout 控制商店推送比例。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Rollout Strategy 要定義推進節點、觀察指標、阻擋條件與升降級節奏，讓部署風險可被量化管理。&lt;/p></description><content:encoded><![CDATA[<p>Rollout Strategy 的核心概念是「用分批推進控制發布風險」。它讓變更從小範圍驗證逐步擴大到全量。</p>
<h2 id="概念位置">概念位置</h2>
<p>Rollout Strategy 位在部署執行與正式流量切換之間，常見型態包含 rolling、canary、blue-green 與 phased rollout。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>發布後需要觀察一段時間再擴大流量。</li>
<li>高風險變更不適合一次全量切換。</li>
<li>團隊需要把監控訊號綁定到擴大量決策。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>後端 API 先以 10% canary 流量觀察錯誤率與延遲，再逐步推進。App 發布以 phased rollout 控制商店推送比例。</p>
<h2 id="設計責任">設計責任</h2>
<p>Rollout Strategy 要定義推進節點、觀察指標、阻擋條件與升降級節奏，讓部署風險可被量化管理。</p>
]]></content:encoded></item><item><title>Rate Limiting</title><link>https://tarrragon.github.io/blog/monitoring/knowledge-cards/rate-limiting/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/knowledge-cards/rate-limiting/</guid><description>&lt;p>速率限制（rate limiting）的通用概念見 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rate-limit/" data-link-title="Rate Limit" data-link-desc="說明限流如何保護服務入口、下游依賴與租戶公平性">Backend 知識卡：Rate Limit&lt;/a> — 限制某個主體在一段時間內可使用的資源量。本卡聚焦監控系統中的具體實作：限制每個 client（API key / source.app）在單位時間內可送出的事件數量，保護 collector 不被單一 SDK 的 bug（事件風暴）或偽造流量消耗處理能力。可先對照 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/backpressure/" data-link-title="Backpressure" data-link-desc="下游處理能力不足時向上游回傳「慢下來」訊號的流量控制機制 — 監控系統中 collector 用 HTTP 429 向 SDK 傳遞背壓">backpressure&lt;/a>（全域的容量訊號）和 &lt;a href="https://tarrragon.github.io/blog/monitoring/knowledge-cards/sampling/" data-link-title="Sampling" data-link-desc="在事件產生階段按比例丟棄部分事件降低管線負載 — 分靜態取樣（config 固定比例）和動態取樣（背壓觸發自動降低）">sampling&lt;/a>（SDK 端的主動降載）。&lt;/p>
&lt;h2 id="和-backpressure-的差異">和 backpressure 的差異&lt;/h2>
&lt;p>Rate limiting 和 backpressure 都限制流量，但保護的維度不同。Rate limiting 是 per-client 的配額機制 — 每個 API key 有獨立的速率上限，一個 client 超限不影響其他 client。Backpressure 是全域的容量訊號 — collector 的寫入 channel 滿時對所有 client 回 429，不區分來源。一個 client 的失控用 rate limiting 處理（隔離問題源），全域流量過大用 backpressure 處理（全體降速）。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>Rate limiting 觸發的訊號是 collector 端對特定 API key 回 429 的次數上升、而其他 key 正常。典型場景：某個 SDK 版本有 bug 導致每秒產生 1000 筆事件 → per-key rate limiter 超過閾值 → 該 key 的後續 request 被回 429 → 其他 SDK 不受影響。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Rate limiting 承擔的設計責任是「在公平性和可用性之間取得平衡」。閾值設太低，正常的 burst flush（攢批後一次送出）會被誤觸；閾值設太高，失控的 SDK 要送很多筆才被擋。合理的閾值需高於正常 burst 的事件速率。&lt;/p>
&lt;h2 id="完整章節">完整章節&lt;/h2>
&lt;p>Per-SDK rate limiting 的實作 → &lt;a href="https://tarrragon.github.io/blog/monitoring/04-collector/ingestion-scaling/" data-link-title="Ingestion Scaling" data-link-desc="四層防線應對 ingestion 端的流量擴展 — SDK 取樣、Collector 背壓、水平擴展、Queue 解耦">Ingestion Scaling&lt;/a>。Rate limiting 在 collector access control 中的角色 → &lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/collector-access-control/" data-link-title="Collector Access Control 實作" data-link-desc="認證（誰在送資料）/ 授權（允許送什麼）/ access log（誰在什麼時候送了什麼）— collector 端的三層存取控制">Collector Access Control 實作&lt;/a>。偽造流量場景下 rate limiting 和其他防護層的配合 → &lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/client-sdk-authentication/" data-link-title="Client-side SDK 認證的根本限制" data-link-desc="嵌在 client 端的 credential 必然可被提取 — 認清 architecture 天花板後的多層緩解策略，從 origin 驗證到 device attestation">Client-side SDK 認證&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>速率限制（rate limiting）的通用概念見 <a href="/blog/backend/knowledge-cards/rate-limit/" data-link-title="Rate Limit" data-link-desc="說明限流如何保護服務入口、下游依賴與租戶公平性">Backend 知識卡：Rate Limit</a> — 限制某個主體在一段時間內可使用的資源量。本卡聚焦監控系統中的具體實作：限制每個 client（API key / source.app）在單位時間內可送出的事件數量，保護 collector 不被單一 SDK 的 bug（事件風暴）或偽造流量消耗處理能力。可先對照 <a href="/blog/monitoring/knowledge-cards/backpressure/" data-link-title="Backpressure" data-link-desc="下游處理能力不足時向上游回傳「慢下來」訊號的流量控制機制 — 監控系統中 collector 用 HTTP 429 向 SDK 傳遞背壓">backpressure</a>（全域的容量訊號）和 <a href="/blog/monitoring/knowledge-cards/sampling/" data-link-title="Sampling" data-link-desc="在事件產生階段按比例丟棄部分事件降低管線負載 — 分靜態取樣（config 固定比例）和動態取樣（背壓觸發自動降低）">sampling</a>（SDK 端的主動降載）。</p>
<h2 id="和-backpressure-的差異">和 backpressure 的差異</h2>
<p>Rate limiting 和 backpressure 都限制流量，但保護的維度不同。Rate limiting 是 per-client 的配額機制 — 每個 API key 有獨立的速率上限，一個 client 超限不影響其他 client。Backpressure 是全域的容量訊號 — collector 的寫入 channel 滿時對所有 client 回 429，不區分來源。一個 client 的失控用 rate limiting 處理（隔離問題源），全域流量過大用 backpressure 處理（全體降速）。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>Rate limiting 觸發的訊號是 collector 端對特定 API key 回 429 的次數上升、而其他 key 正常。典型場景：某個 SDK 版本有 bug 導致每秒產生 1000 筆事件 → per-key rate limiter 超過閾值 → 該 key 的後續 request 被回 429 → 其他 SDK 不受影響。</p>
<h2 id="設計責任">設計責任</h2>
<p>Rate limiting 承擔的設計責任是「在公平性和可用性之間取得平衡」。閾值設太低，正常的 burst flush（攢批後一次送出）會被誤觸；閾值設太高，失控的 SDK 要送很多筆才被擋。合理的閾值需高於正常 burst 的事件速率。</p>
<h2 id="完整章節">完整章節</h2>
<p>Per-SDK rate limiting 的實作 → <a href="/blog/monitoring/04-collector/ingestion-scaling/" data-link-title="Ingestion Scaling" data-link-desc="四層防線應對 ingestion 端的流量擴展 — SDK 取樣、Collector 背壓、水平擴展、Queue 解耦">Ingestion Scaling</a>。Rate limiting 在 collector access control 中的角色 → <a href="/blog/monitoring/07-security-privacy/collector-access-control/" data-link-title="Collector Access Control 實作" data-link-desc="認證（誰在送資料）/ 授權（允許送什麼）/ access log（誰在什麼時候送了什麼）— collector 端的三層存取控制">Collector Access Control 實作</a>。偽造流量場景下 rate limiting 和其他防護層的配合 → <a href="/blog/monitoring/07-security-privacy/client-sdk-authentication/" data-link-title="Client-side SDK 認證的根本限制" data-link-desc="嵌在 client 端的 credential 必然可被提取 — 認清 architecture 天花板後的多層緩解策略，從 origin 驗證到 device attestation">Client-side SDK 認證</a>。</p>
]]></content:encoded></item><item><title>Rollback Strategy</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/rollback-strategy/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/rollback-strategy/</guid><description>&lt;p>Rollback Strategy 的核心概念是「在異常發布後縮小影響範圍並回到可用狀態」。它屬於部署設計的一部分，需要在事故前完成。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Rollback Strategy 位在 deploy、rollout 與 incident handling 之間，通常要和資料遷移、feature flag 與流量切換一起設計。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>發布後錯誤率或延遲快速升高。&lt;/li>
&lt;li>新舊版本存在相容性風險。&lt;/li>
&lt;li>團隊需要在分鐘級別恢復核心功能。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>靜態站可回退前一版 artifact。後端服務可回退 image tag 並暫停新 migration。App 場域可先用 remote config 關閉新功能，再走 hotfix 發版。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Rollback Strategy 要定義觸發條件、責任人、回退動作與回復後驗證，並定期演練。&lt;/p></description><content:encoded><![CDATA[<p>Rollback Strategy 的核心概念是「在異常發布後縮小影響範圍並回到可用狀態」。它屬於部署設計的一部分，需要在事故前完成。</p>
<h2 id="概念位置">概念位置</h2>
<p>Rollback Strategy 位在 deploy、rollout 與 incident handling 之間，通常要和資料遷移、feature flag 與流量切換一起設計。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>發布後錯誤率或延遲快速升高。</li>
<li>新舊版本存在相容性風險。</li>
<li>團隊需要在分鐘級別恢復核心功能。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>靜態站可回退前一版 artifact。後端服務可回退 image tag 並暫停新 migration。App 場域可先用 remote config 關閉新功能，再走 hotfix 發版。</p>
<h2 id="設計責任">設計責任</h2>
<p>Rollback Strategy 要定義觸發條件、責任人、回退動作與回復後驗證，並定期演練。</p>
]]></content:encoded></item><item><title>Deployment Dry Run</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/deployment-dry-run/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/deployment-dry-run/</guid><description>&lt;p>Deployment Dry Run 的核心概念是「在正式部署前預演關鍵步驟」。它讓流程在低風險條件下先驗證 artifact、權限與目標環境配置。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Deployment Dry Run 位在 build / test 完成後、production deploy 之前，通常以 preflight check、模擬發布或目標環境校驗實作。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>正式部署常失敗於權限、路徑或配置差異。&lt;/li>
&lt;li>團隊需要在不影響使用者前提下驗證部署條件。&lt;/li>
&lt;li>發布流程包含高成本動作或不可逆步驟。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>部署腳本先驗證 artifact 存在、環境密鑰可讀、目標 bucket 或 registry 可寫，再進入正式 deploy。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Deployment Dry Run 要定義檢查範圍、成功條件、失敗回饋與執行時機，並和正式部署命令保持一致語意。&lt;/p></description><content:encoded><![CDATA[<p>Deployment Dry Run 的核心概念是「在正式部署前預演關鍵步驟」。它讓流程在低風險條件下先驗證 artifact、權限與目標環境配置。</p>
<h2 id="概念位置">概念位置</h2>
<p>Deployment Dry Run 位在 build / test 完成後、production deploy 之前，通常以 preflight check、模擬發布或目標環境校驗實作。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>正式部署常失敗於權限、路徑或配置差異。</li>
<li>團隊需要在不影響使用者前提下驗證部署條件。</li>
<li>發布流程包含高成本動作或不可逆步驟。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>部署腳本先驗證 artifact 存在、環境密鑰可讀、目標 bucket 或 registry 可寫，再進入正式 deploy。</p>
<h2 id="設計責任">設計責任</h2>
<p>Deployment Dry Run 要定義檢查範圍、成功條件、失敗回饋與執行時機，並和正式部署命令保持一致語意。</p>
]]></content:encoded></item><item><title>Migration</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/migration/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/migration/</guid><description>&lt;p>Migration 的核心概念是「把舊狀態受控推進到新狀態」。它不只涉及資料庫 schema，也包含資料回填、相容窗口與發布順序。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Migration 位在 build 之後、deploy 與 rollout 之前後的關鍵路徑，常與 release gate、rollback strategy 一起設計。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>新舊版本需要共存一段時間。&lt;/li>
&lt;li>發布步驟包含 schema 或資料形狀變更。&lt;/li>
&lt;li>部署失敗時要判斷是否可回退或需要 forward fix。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>後端服務先擴充 schema，再讓新版本寫入新欄位，最後收斂舊欄位讀取；整個過程需要 migration gate 與回退方案。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Migration 要定義相容策略、執行順序、觀測指標與異常回復路由，避免部署成功但資料邏輯失效。&lt;/p></description><content:encoded><![CDATA[<p>Migration 的核心概念是「把舊狀態受控推進到新狀態」。它不只涉及資料庫 schema，也包含資料回填、相容窗口與發布順序。</p>
<h2 id="概念位置">概念位置</h2>
<p>Migration 位在 build 之後、deploy 與 rollout 之前後的關鍵路徑，常與 release gate、rollback strategy 一起設計。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>新舊版本需要共存一段時間。</li>
<li>發布步驟包含 schema 或資料形狀變更。</li>
<li>部署失敗時要判斷是否可回退或需要 forward fix。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>後端服務先擴充 schema，再讓新版本寫入新欄位，最後收斂舊欄位讀取；整個過程需要 migration gate 與回退方案。</p>
<h2 id="設計責任">設計責任</h2>
<p>Migration 要定義相容策略、執行順序、觀測指標與異常回復路由，避免部署成功但資料邏輯失效。</p>
]]></content:encoded></item><item><title>Branch Protection</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/branch-protection/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/branch-protection/</guid><description>&lt;p>Branch Protection 的核心概念是「把主線寫入條件制度化」。它把 required checks、review policy 與合併限制集中成 repository gate。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Branch Protection 位在 pull request 與主線分支之間，屬於 CI workflow 之外的治理層。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>主線偶爾進入未驗證變更。&lt;/li>
&lt;li>workflow 已存在但合併條件未綁定。&lt;/li>
&lt;li>團隊需要統一 reviewer 與狀態檢查門檻。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>專案要求 &lt;code>md-check&lt;/code> 與 &lt;code>Playwright tests&lt;/code> 必須綠燈，且至少一位 reviewer 批准才可合併 &lt;code>main&lt;/code>。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Branch Protection 要定義必要 checks、審查規則與例外流程，並和 workflow 命名同步維護。&lt;/p></description><content:encoded><![CDATA[<p>Branch Protection 的核心概念是「把主線寫入條件制度化」。它把 required checks、review policy 與合併限制集中成 repository gate。</p>
<h2 id="概念位置">概念位置</h2>
<p>Branch Protection 位在 pull request 與主線分支之間，屬於 CI workflow 之外的治理層。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>主線偶爾進入未驗證變更。</li>
<li>workflow 已存在但合併條件未綁定。</li>
<li>團隊需要統一 reviewer 與狀態檢查門檻。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>專案要求 <code>md-check</code> 與 <code>Playwright tests</code> 必須綠燈，且至少一位 reviewer 批准才可合併 <code>main</code>。</p>
<h2 id="設計責任">設計責任</h2>
<p>Branch Protection 要定義必要 checks、審查規則與例外流程，並和 workflow 命名同步維護。</p>
]]></content:encoded></item><item><title>Readiness / Health Check</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/readiness-health-check/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/readiness-health-check/</guid><description>&lt;p>Readiness / Health Check 的核心概念是「服務活著」與「服務可接流量」是兩個不同訊號。部署放行通常依賴 readiness，而非僅看 process alive。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Readiness / Health Check 位在 rollout、load balancer 與 runtime platform 之間，是流量切換前的核心 gate。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>部署後健康檢查綠燈但請求仍大量失敗。&lt;/li>
&lt;li>新版啟動中就提早接到流量。&lt;/li>
&lt;li>rollout 失敗時缺少可觀測放行條件。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>Kubernetes liveness 通過只代表 process 存活；readiness 通過才代表連線池、依賴服務與必要資料都已準備完成。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Readiness / Health Check 要定義檢查內容、容錯窗口與失敗處理，讓 rollout decision 有可信訊號。&lt;/p></description><content:encoded><![CDATA[<p>Readiness / Health Check 的核心概念是「服務活著」與「服務可接流量」是兩個不同訊號。部署放行通常依賴 readiness，而非僅看 process alive。</p>
<h2 id="概念位置">概念位置</h2>
<p>Readiness / Health Check 位在 rollout、load balancer 與 runtime platform 之間，是流量切換前的核心 gate。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>部署後健康檢查綠燈但請求仍大量失敗。</li>
<li>新版啟動中就提早接到流量。</li>
<li>rollout 失敗時缺少可觀測放行條件。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>Kubernetes liveness 通過只代表 process 存活；readiness 通過才代表連線池、依賴服務與必要資料都已準備完成。</p>
<h2 id="設計責任">設計責任</h2>
<p>Readiness / Health Check 要定義檢查內容、容錯窗口與失敗處理，讓 rollout decision 有可信訊號。</p>
]]></content:encoded></item><item><title>Container Registry</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/container-registry/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/container-registry/</guid><description>&lt;p>Container Registry 的核心概念是「管理可部署 image 的供應鏈節點」。它負責保存、授權、保留與推進已驗證影像。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Container Registry 位在 image build、scan、promotion 與 runtime deploy 之間，連接 CI 產物與環境發布。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>同一 tag 在不同環境對應內容不一致。&lt;/li>
&lt;li>部署因拉取權限或鏡像不存在失敗。&lt;/li>
&lt;li>線上 image 缺少來源與掃描紀錄的反查路徑。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>團隊以 immutable digest 推進 staging 與 production，並透過 registry policy 控制 retention、pull 權限與 promotion 路徑。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Container Registry 要定義命名策略、權限模型、保留策略與來源追溯，讓 image 發布具備可審計性。&lt;/p></description><content:encoded><![CDATA[<p>Container Registry 的核心概念是「管理可部署 image 的供應鏈節點」。它負責保存、授權、保留與推進已驗證影像。</p>
<h2 id="概念位置">概念位置</h2>
<p>Container Registry 位在 image build、scan、promotion 與 runtime deploy 之間，連接 CI 產物與環境發布。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>同一 tag 在不同環境對應內容不一致。</li>
<li>部署因拉取權限或鏡像不存在失敗。</li>
<li>線上 image 缺少來源與掃描紀錄的反查路徑。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>團隊以 immutable digest 推進 staging 與 production，並透過 registry policy 控制 retention、pull 權限與 promotion 路徑。</p>
<h2 id="設計責任">設計責任</h2>
<p>Container Registry 要定義命名策略、權限模型、保留策略與來源追溯，讓 image 發布具備可審計性。</p>
]]></content:encoded></item><item><title>App Signing</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/app-signing/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/app-signing/</guid><description>&lt;p>App Signing 的核心概念是「簽章憑證即發布能力」。它決定 artifact 是否被平台接受與使用者裝置信任。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>App Signing 位在 app build 與 release channel 之間，涉及 certificate、provisioning profile、keystore 與 secret 管理。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>發布因簽章失敗中斷。&lt;/li>
&lt;li>憑證過期導致發版中斷。&lt;/li>
&lt;li>金鑰輪替缺乏演練造成交付風險。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>iOS 發版需匹配正確 certificate 與 provisioning profile，Android 發版需維護 keystore 一致性與安全儲存。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>App Signing 要定義密鑰保存、輪替節奏、權限分離與緊急回復流程，確保發布能力可持續。&lt;/p></description><content:encoded><![CDATA[<p>App Signing 的核心概念是「簽章憑證即發布能力」。它決定 artifact 是否被平台接受與使用者裝置信任。</p>
<h2 id="概念位置">概念位置</h2>
<p>App Signing 位在 app build 與 release channel 之間，涉及 certificate、provisioning profile、keystore 與 secret 管理。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>發布因簽章失敗中斷。</li>
<li>憑證過期導致發版中斷。</li>
<li>金鑰輪替缺乏演練造成交付風險。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>iOS 發版需匹配正確 certificate 與 provisioning profile，Android 發版需維護 keystore 一致性與安全儲存。</p>
<h2 id="設計責任">設計責任</h2>
<p>App Signing 要定義密鑰保存、輪替節奏、權限分離與緊急回復流程，確保發布能力可持續。</p>
]]></content:encoded></item><item><title>Flaky Test</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/flaky-test/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/flaky-test/</guid><description>&lt;p>Flaky Test 的核心概念是「同一版本在相同條件下測試結果不穩定」。它會把紅燈從有效訊號降級成噪音，直接影響 CI gate 信任度。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Flaky Test 位在 test stage 與 release gate 之間，會放大重跑成本與判讀延遲。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>同一 commit 重跑結果時好時壞。&lt;/li>
&lt;li>失敗集中在等待條件、時間假設或外部依賴。&lt;/li>
&lt;li>團隊習慣以重跑代替根因修復。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>UI 測試在動畫未完成時抓取元素，或整合測試依賴不穩定第三方 API，都容易出現 flaky pattern。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Flaky Test 治理要建立 owner、隔離策略、修復 SLA 與觀測指標，讓測試結果恢復可判讀性。&lt;/p></description><content:encoded><![CDATA[<p>Flaky Test 的核心概念是「同一版本在相同條件下測試結果不穩定」。它會把紅燈從有效訊號降級成噪音，直接影響 CI gate 信任度。</p>
<h2 id="概念位置">概念位置</h2>
<p>Flaky Test 位在 test stage 與 release gate 之間，會放大重跑成本與判讀延遲。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>同一 commit 重跑結果時好時壞。</li>
<li>失敗集中在等待條件、時間假設或外部依賴。</li>
<li>團隊習慣以重跑代替根因修復。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>UI 測試在動畫未完成時抓取元素，或整合測試依賴不穩定第三方 API，都容易出現 flaky pattern。</p>
<h2 id="設計責任">設計責任</h2>
<p>Flaky Test 治理要建立 owner、隔離策略、修復 SLA 與觀測指標，讓測試結果恢復可判讀性。</p>
]]></content:encoded></item><item><title>Backfill</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/</guid><description>&lt;p>Backfill 的核心概念是「用新邏輯受控補算既有資料」。它通常和 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/migration/" data-link-title="Migration" data-link-desc="說明資料或結構變更如何在服務不中斷前提下受控推進">Migration&lt;/a> 共享相容窗口，並依賴 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint&lt;/a> 保存進度。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Backfill 位在資料 schema、transform logic 或歷史資料修補之後，常出現在 data pipeline、database migration、search index rebuild 與 feature store 更新。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>新欄位需要從既有資料補值。&lt;/li>
&lt;li>歷史 partition 需要用新版邏輯重新計算。&lt;/li>
&lt;li>補算任務需要節流、停損與對帳。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>訂單報表新增 &lt;code>net_revenue&lt;/code> 欄位時，pipeline 先讓新資料寫入新欄位，再分批 backfill 過去 12 個月的 partition，並用 row count 與金額總和比對結果。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Backfill 要定義補算範圍、批次大小、checkpoint、停損條件與對帳方式，讓歷史資料修補成為可停止、可接續、可驗證的流程。&lt;/p></description><content:encoded><![CDATA[<p>Backfill 的核心概念是「用新邏輯受控補算既有資料」。它通常和 <a href="/blog/ci/knowledge-cards/migration/" data-link-title="Migration" data-link-desc="說明資料或結構變更如何在服務不中斷前提下受控推進">Migration</a> 共享相容窗口，並依賴 <a href="/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint</a> 保存進度。</p>
<h2 id="概念位置">概念位置</h2>
<p>Backfill 位在資料 schema、transform logic 或歷史資料修補之後，常出現在 data pipeline、database migration、search index rebuild 與 feature store 更新。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>新欄位需要從既有資料補值。</li>
<li>歷史 partition 需要用新版邏輯重新計算。</li>
<li>補算任務需要節流、停損與對帳。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>訂單報表新增 <code>net_revenue</code> 欄位時，pipeline 先讓新資料寫入新欄位，再分批 backfill 過去 12 個月的 partition，並用 row count 與金額總和比對結果。</p>
<h2 id="設計責任">設計責任</h2>
<p>Backfill 要定義補算範圍、批次大小、checkpoint、停損條件與對帳方式，讓歷史資料修補成為可停止、可接續、可驗證的流程。</p>
]]></content:encoded></item><item><title>Checkpoint</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/</guid><description>&lt;p>Checkpoint 的核心概念是「保存可接續的處理進度」。它讓 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun&lt;/a> 可以從明確位置恢復，避免每次都從頭開始。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Checkpoint 位在長時間 job、stream processor、batch pipeline 與 migration 任務之間，常以 partition、offset、run id、cursor 或 processed marker 呈現。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>任務執行時間長，失敗後需要接續。&lt;/li>
&lt;li>重跑同一區間可能造成重複寫入。&lt;/li>
&lt;li>streaming consumer 需要保存 offset 或 event position。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>資料回填每次處理一個日期 partition，完成後寫入 &lt;code>backfill_runs&lt;/code> 表。任務中斷時，下一次從最後成功 partition 的下一段開始。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Checkpoint 要定義進度格式、提交時機、失敗恢復、重跑覆寫與觀測欄位，讓長時間任務具備可恢復性。&lt;/p></description><content:encoded><![CDATA[<p>Checkpoint 的核心概念是「保存可接續的處理進度」。它讓 <a href="/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill</a> 與 <a href="/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun</a> 可以從明確位置恢復，避免每次都從頭開始。</p>
<h2 id="概念位置">概念位置</h2>
<p>Checkpoint 位在長時間 job、stream processor、batch pipeline 與 migration 任務之間，常以 partition、offset、run id、cursor 或 processed marker 呈現。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>任務執行時間長，失敗後需要接續。</li>
<li>重跑同一區間可能造成重複寫入。</li>
<li>streaming consumer 需要保存 offset 或 event position。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>資料回填每次處理一個日期 partition，完成後寫入 <code>backfill_runs</code> 表。任務中斷時，下一次從最後成功 partition 的下一段開始。</p>
<h2 id="設計責任">設計責任</h2>
<p>Checkpoint 要定義進度格式、提交時機、失敗恢復、重跑覆寫與觀測欄位，讓長時間任務具備可恢復性。</p>
]]></content:encoded></item><item><title>Rerun</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/rerun/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/rerun/</guid><description>&lt;p>Rerun 的核心概念是「用明確條件重新執行同一段流程」。它和 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/flaky-test/" data-link-title="Flaky Test" data-link-desc="說明非決定性測試如何降低 CI gate 信任度與治理方式">Flaky Test&lt;/a> 的治理有關，也常依賴 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint&lt;/a> 判斷接續位置。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Rerun 位在測試失敗、部署預演失敗、資料任務失敗或 pipeline repair 之後，負責判斷重新執行是否會改變輸出或擴大副作用。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>同一 commit 的測試結果前後不一致。&lt;/li>
&lt;li>資料任務部分成功、部分失敗。&lt;/li>
&lt;li>部署 dry run 失敗後需要確認是否可安全再跑。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>每日營收 pipeline 第三個 partition 寫入失敗。團隊先確認前兩個 partition 已完成且輸出可覆寫，再指定 run id 與 partition 範圍 rerun，避免重複計算全部歷史資料。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Rerun 要定義可重跑條件、輸出覆寫規則、idempotency、觀測結果與人工審核門檻，讓「再跑一次」成為受控恢復策略。&lt;/p></description><content:encoded><![CDATA[<p>Rerun 的核心概念是「用明確條件重新執行同一段流程」。它和 <a href="/blog/ci/knowledge-cards/flaky-test/" data-link-title="Flaky Test" data-link-desc="說明非決定性測試如何降低 CI gate 信任度與治理方式">Flaky Test</a> 的治理有關，也常依賴 <a href="/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint</a> 判斷接續位置。</p>
<h2 id="概念位置">概念位置</h2>
<p>Rerun 位在測試失敗、部署預演失敗、資料任務失敗或 pipeline repair 之後，負責判斷重新執行是否會改變輸出或擴大副作用。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>同一 commit 的測試結果前後不一致。</li>
<li>資料任務部分成功、部分失敗。</li>
<li>部署 dry run 失敗後需要確認是否可安全再跑。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>每日營收 pipeline 第三個 partition 寫入失敗。團隊先確認前兩個 partition 已完成且輸出可覆寫，再指定 run id 與 partition 範圍 rerun，避免重複計算全部歷史資料。</p>
<h2 id="設計責任">設計責任</h2>
<p>Rerun 要定義可重跑條件、輸出覆寫規則、idempotency、觀測結果與人工審核門檻，讓「再跑一次」成為受控恢復策略。</p>
]]></content:encoded></item><item><title>Image Digest</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/image-digest/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/image-digest/</guid><description>&lt;p>Image Digest 的核心概念是「用內容雜湊識別不可變 image」。它補足 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/container-registry/" data-link-title="Container Registry" data-link-desc="說明容器產物儲存、權限與推進流程在 CD 中的責任">Container Registry&lt;/a> 的命名治理，讓 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/artifact-handoff/" data-link-title="Artifact Handoff" data-link-desc="說明測試與部署如何共用同一份可追溯產物">Artifact Handoff&lt;/a> 可以鎖定精準產物。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Image Digest 位在 image build、scan、registry promotion 與 runtime deploy 之間，通常以 &lt;code>sha256:...&lt;/code> 形式標識 image manifest 或 image index。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>&lt;code>latest&lt;/code> 或 mutable tag 造成 staging 與 production 內容分叉。&lt;/li>
&lt;li>production runtime 需要反查實際跑的 image。&lt;/li>
&lt;li>掃描結果需要和部署內容精準對齊。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>CI build image 後推到 registry，scan 報告綁定 digest。Kubernetes manifest 在 production 使用同一個 digest，事故時可從 running pod 反查 workflow run 與 source commit。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Image Digest 要納入 deployment manifest、scan report、release note 與 rollback 記錄，讓 image 發布具備可追溯與可審計能力。&lt;/p></description><content:encoded><![CDATA[<p>Image Digest 的核心概念是「用內容雜湊識別不可變 image」。它補足 <a href="/blog/ci/knowledge-cards/container-registry/" data-link-title="Container Registry" data-link-desc="說明容器產物儲存、權限與推進流程在 CD 中的責任">Container Registry</a> 的命名治理，讓 <a href="/blog/ci/knowledge-cards/artifact-handoff/" data-link-title="Artifact Handoff" data-link-desc="說明測試與部署如何共用同一份可追溯產物">Artifact Handoff</a> 可以鎖定精準產物。</p>
<h2 id="概念位置">概念位置</h2>
<p>Image Digest 位在 image build、scan、registry promotion 與 runtime deploy 之間，通常以 <code>sha256:...</code> 形式標識 image manifest 或 image index。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li><code>latest</code> 或 mutable tag 造成 staging 與 production 內容分叉。</li>
<li>production runtime 需要反查實際跑的 image。</li>
<li>掃描結果需要和部署內容精準對齊。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>CI build image 後推到 registry，scan 報告綁定 digest。Kubernetes manifest 在 production 使用同一個 digest，事故時可從 running pod 反查 workflow run 與 source commit。</p>
<h2 id="設計責任">設計責任</h2>
<p>Image Digest 要納入 deployment manifest、scan report、release note 與 rollback 記錄，讓 image 發布具備可追溯與可審計能力。</p>
]]></content:encoded></item><item><title>SBOM</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/sbom/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/sbom/</guid><description>&lt;p>SBOM 的核心概念是「列出 artifact 內含軟體元件」。它把 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/artifact/" data-link-title="Artifact" data-link-desc="說明 CI/CD 中可被驗證、保存與發布的交付產物">Artifact&lt;/a> 的依賴組成顯性化，並支援 image scan、license review 與 vulnerability exception。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>SBOM 位在 build、scan、release 與 compliance review 之間，常見格式包含 SPDX、CycloneDX 或工具自訂輸出。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>團隊需要知道 image 或 package 包含哪些 dependency。&lt;/li>
&lt;li>漏洞公告需要快速判斷受影響 artifact。&lt;/li>
&lt;li>高治理環境要求 release 產物附帶供應鏈證據。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>Container image 發布時同時產生 SBOM，scan gate 依 SBOM 對照 CVE 與 license policy。若 base image 發現 critical vulnerability，團隊可查哪些 release digest 受影響。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>SBOM 要定義產出時機、格式、保存位置、artifact 對應關係與例外審核流程，讓供應鏈風險可以被查詢與治理。&lt;/p></description><content:encoded><![CDATA[<p>SBOM 的核心概念是「列出 artifact 內含軟體元件」。它把 <a href="/blog/ci/knowledge-cards/artifact/" data-link-title="Artifact" data-link-desc="說明 CI/CD 中可被驗證、保存與發布的交付產物">Artifact</a> 的依賴組成顯性化，並支援 image scan、license review 與 vulnerability exception。</p>
<h2 id="概念位置">概念位置</h2>
<p>SBOM 位在 build、scan、release 與 compliance review 之間，常見格式包含 SPDX、CycloneDX 或工具自訂輸出。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>團隊需要知道 image 或 package 包含哪些 dependency。</li>
<li>漏洞公告需要快速判斷受影響 artifact。</li>
<li>高治理環境要求 release 產物附帶供應鏈證據。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>Container image 發布時同時產生 SBOM，scan gate 依 SBOM 對照 CVE 與 license policy。若 base image 發現 critical vulnerability，團隊可查哪些 release digest 受影響。</p>
<h2 id="設計責任">設計責任</h2>
<p>SBOM 要定義產出時機、格式、保存位置、artifact 對應關係與例外審核流程，讓供應鏈風險可以被查詢與治理。</p>
]]></content:encoded></item><item><title>Release Channel</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/release-channel/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/release-channel/</guid><description>&lt;p>Release Channel 的核心概念是「用通道控制版本接觸範圍」。它是 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">Rollout Strategy&lt;/a> 的分發面，常和 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App Signing&lt;/a> 與 update feed 一起設計。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Release Channel 位在 artifact 發布與使用者取得之間，常見通道包含 internal、alpha、beta、stable、enterprise、nightly 與 rollback channel。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>同一產品需要內測、公開測試與正式版本分流。&lt;/li>
&lt;li>錯誤版本需要停止擴散或切回回復通道。&lt;/li>
&lt;li>客戶端更新需要依風險分批推進。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>桌面 app 先把 signed installer 推到 internal channel，驗證更新成功率後再推 beta channel，最後推 stable channel。若 stable 版本出現 crash，feed 可切回 rollback channel 或暫停更新。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Release Channel 要定義通道用途、進入條件、artifact 命名、可見範圍、停損條件與回復路徑，讓版本擴散具備控制面。&lt;/p></description><content:encoded><![CDATA[<p>Release Channel 的核心概念是「用通道控制版本接觸範圍」。它是 <a href="/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">Rollout Strategy</a> 的分發面，常和 <a href="/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App Signing</a> 與 update feed 一起設計。</p>
<h2 id="概念位置">概念位置</h2>
<p>Release Channel 位在 artifact 發布與使用者取得之間，常見通道包含 internal、alpha、beta、stable、enterprise、nightly 與 rollback channel。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>同一產品需要內測、公開測試與正式版本分流。</li>
<li>錯誤版本需要停止擴散或切回回復通道。</li>
<li>客戶端更新需要依風險分批推進。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>桌面 app 先把 signed installer 推到 internal channel，驗證更新成功率後再推 beta channel，最後推 stable channel。若 stable 版本出現 crash，feed 可切回 rollback channel 或暫停更新。</p>
<h2 id="設計責任">設計責任</h2>
<p>Release Channel 要定義通道用途、進入條件、artifact 命名、可見範圍、停損條件與回復路徑，讓版本擴散具備控制面。</p>
]]></content:encoded></item><item><title>Update Feed</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/update-feed/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/update-feed/</guid><description>&lt;p>Update Feed 的核心概念是「告訴已安裝客戶端該取得哪個版本」。它連接 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/release-channel/" data-link-title="Release Channel" data-link-desc="說明 stable、beta、internal 等發行通道如何控制 artifact 接觸到的使用者範圍">Release Channel&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App Signing&lt;/a>，讓自動更新具備信任與回復能力。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Update Feed 位在 signed artifact、release channel 與已安裝 app 之間，常包含版本號、下載 URL、signature、checksum、release notes 與最低支援版本。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>客戶端需要自動偵測新版本。&lt;/li>
&lt;li>beta 與 stable 使用者需要看到不同版本。&lt;/li>
&lt;li>錯誤版本需要從更新來源撤下。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>Electron app 啟動時讀取 stable feed，取得最新 signed installer 與 signature。若新版本 crash rate 升高，團隊先撤下 feed 指向，讓未更新使用者停止取得錯誤版本。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Update Feed 要定義簽章驗證、channel 分流、版本比較、fallback installer、撤版策略與 telemetry，讓已安裝客戶端安全升級。&lt;/p></description><content:encoded><![CDATA[<p>Update Feed 的核心概念是「告訴已安裝客戶端該取得哪個版本」。它連接 <a href="/blog/ci/knowledge-cards/release-channel/" data-link-title="Release Channel" data-link-desc="說明 stable、beta、internal 等發行通道如何控制 artifact 接觸到的使用者範圍">Release Channel</a> 與 <a href="/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App Signing</a>，讓自動更新具備信任與回復能力。</p>
<h2 id="概念位置">概念位置</h2>
<p>Update Feed 位在 signed artifact、release channel 與已安裝 app 之間，常包含版本號、下載 URL、signature、checksum、release notes 與最低支援版本。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>客戶端需要自動偵測新版本。</li>
<li>beta 與 stable 使用者需要看到不同版本。</li>
<li>錯誤版本需要從更新來源撤下。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>Electron app 啟動時讀取 stable feed，取得最新 signed installer 與 signature。若新版本 crash rate 升高，團隊先撤下 feed 指向，讓未更新使用者停止取得錯誤版本。</p>
<h2 id="設計責任">設計責任</h2>
<p>Update Feed 要定義簽章驗證、channel 分流、版本比較、fallback installer、撤版策略與 telemetry，讓已安裝客戶端安全升級。</p>
]]></content:encoded></item><item><title>Infrastructure Drift</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/infrastructure-drift/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/infrastructure-drift/</guid><description>&lt;p>Infrastructure Drift 的核心概念是「真實環境狀態與宣告檔分叉」。它會削弱 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/environment-protection/" data-link-title="Environment Protection" data-link-desc="說明目標環境的審核、權限與放行條件如何保護發布">Environment Protection&lt;/a> 與 deployment review 的可信度，並影響下一次 plan / apply 的安全性。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Infrastructure Drift 位在 IaC state、cloud resource、手動 hotfix 與外部 controller 之間，常由 console edit、事故修復、provider 預設值或自動調整造成。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>plan 顯示大量非預期變更。&lt;/li>
&lt;li>production 資源和 repository 宣告不一致。&lt;/li>
&lt;li>下次 apply 可能覆蓋事故 hotfix。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>事故中工程師在雲端 console 手動放寬 security group。服務恢復後，IaC plan 顯示 security group 與宣告檔不同；團隊需要判斷這個變更是短期 hotfix 還是應回寫成正式規則。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Infrastructure Drift 要定義偵測頻率、owner、修復路由、state repair 與回寫規則，讓平台狀態重新回到可審查流程。&lt;/p></description><content:encoded><![CDATA[<p>Infrastructure Drift 的核心概念是「真實環境狀態與宣告檔分叉」。它會削弱 <a href="/blog/ci/knowledge-cards/environment-protection/" data-link-title="Environment Protection" data-link-desc="說明目標環境的審核、權限與放行條件如何保護發布">Environment Protection</a> 與 deployment review 的可信度，並影響下一次 plan / apply 的安全性。</p>
<h2 id="概念位置">概念位置</h2>
<p>Infrastructure Drift 位在 IaC state、cloud resource、手動 hotfix 與外部 controller 之間，常由 console edit、事故修復、provider 預設值或自動調整造成。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>plan 顯示大量非預期變更。</li>
<li>production 資源和 repository 宣告不一致。</li>
<li>下次 apply 可能覆蓋事故 hotfix。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>事故中工程師在雲端 console 手動放寬 security group。服務恢復後，IaC plan 顯示 security group 與宣告檔不同；團隊需要判斷這個變更是短期 hotfix 還是應回寫成正式規則。</p>
<h2 id="設計責任">設計責任</h2>
<p>Infrastructure Drift 要定義偵測頻率、owner、修復路由、state repair 與回寫規則，讓平台狀態重新回到可審查流程。</p>
]]></content:encoded></item><item><title>State Lock</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/state-lock/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/state-lock/</guid><description>&lt;p>State Lock 的核心概念是「讓同一份基礎設施狀態一次只被一個 apply 修改」。它支撐 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/infrastructure-drift/" data-link-title="Infrastructure Drift" data-link-desc="說明真實基礎設施狀態與 IaC 宣告分叉時的偵測、判讀與修復責任">Infrastructure Drift&lt;/a> 的治理，避免 CI job 或人工操作併發覆寫 state。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>State Lock 位在 IaC state backend、plan / apply workflow 與平台資源之間，常由 Terraform backend、Pulumi state 或平台鎖定機制提供。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>多個 pipeline 同時 apply 同一個 workspace。&lt;/li>
&lt;li>state file 出現併發覆寫或 partial apply 後不一致。&lt;/li>
&lt;li>apply 長時間卡住需要判斷 lock 是否仍有效。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>兩個 PR 同時修改 production network。第一個 workflow 取得 state lock 後進入 apply，第二個 workflow 等待或失敗，避免兩次變更同時寫入 state。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>State Lock 要定義 lock backend、timeout、人工解鎖條件、環境隔離與失敗處理，讓 IaC apply 保持序列化。&lt;/p></description><content:encoded><![CDATA[<p>State Lock 的核心概念是「讓同一份基礎設施狀態一次只被一個 apply 修改」。它支撐 <a href="/blog/ci/knowledge-cards/infrastructure-drift/" data-link-title="Infrastructure Drift" data-link-desc="說明真實基礎設施狀態與 IaC 宣告分叉時的偵測、判讀與修復責任">Infrastructure Drift</a> 的治理，避免 CI job 或人工操作併發覆寫 state。</p>
<h2 id="概念位置">概念位置</h2>
<p>State Lock 位在 IaC state backend、plan / apply workflow 與平台資源之間，常由 Terraform backend、Pulumi state 或平台鎖定機制提供。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>多個 pipeline 同時 apply 同一個 workspace。</li>
<li>state file 出現併發覆寫或 partial apply 後不一致。</li>
<li>apply 長時間卡住需要判斷 lock 是否仍有效。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>兩個 PR 同時修改 production network。第一個 workflow 取得 state lock 後進入 apply，第二個 workflow 等待或失敗，避免兩次變更同時寫入 state。</p>
<h2 id="設計責任">設計責任</h2>
<p>State Lock 要定義 lock backend、timeout、人工解鎖條件、環境隔離與失敗處理，讓 IaC apply 保持序列化。</p>
]]></content:encoded></item><item><title>Function Alias</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/function-alias/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/function-alias/</guid><description>&lt;p>Function Alias 的核心概念是「用穩定名稱指向不可變函式版本」。它讓 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">Rollout Strategy&lt;/a> 可以套用在 serverless function 上，並讓 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明發布異常時如何快速回到已知可用狀態">Rollback Strategy&lt;/a> 具備快速切換入口。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Function Alias 位在 function version、traffic weight、event source 與 invocation entrypoint 之間，常見於 Lambda alias 或其他 serverless 平台的版本別名。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>新舊 function version 需要短暫共存。&lt;/li>
&lt;li>部分流量需要導向新版本做 canary。&lt;/li>
&lt;li>事故時需要把入口切回上一個版本。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>HTTP function 的 &lt;code>prod&lt;/code> alias 先把 5% 流量導向 version 42。若錯誤率穩定，逐步提高權重；若錯誤率升高，alias 切回 version 41。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Function Alias 要定義版本命名、流量權重、觀測指標、事件來源綁定與回復條件，讓函式發布具備可控入口。&lt;/p></description><content:encoded><![CDATA[<p>Function Alias 的核心概念是「用穩定名稱指向不可變函式版本」。它讓 <a href="/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">Rollout Strategy</a> 可以套用在 serverless function 上，並讓 <a href="/blog/ci/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明發布異常時如何快速回到已知可用狀態">Rollback Strategy</a> 具備快速切換入口。</p>
<h2 id="概念位置">概念位置</h2>
<p>Function Alias 位在 function version、traffic weight、event source 與 invocation entrypoint 之間，常見於 Lambda alias 或其他 serverless 平台的版本別名。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>新舊 function version 需要短暫共存。</li>
<li>部分流量需要導向新版本做 canary。</li>
<li>事故時需要把入口切回上一個版本。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>HTTP function 的 <code>prod</code> alias 先把 5% 流量導向 version 42。若錯誤率穩定，逐步提高權重；若錯誤率升高，alias 切回 version 41。</p>
<h2 id="設計責任">設計責任</h2>
<p>Function Alias 要定義版本命名、流量權重、觀測指標、事件來源綁定與回復條件，讓函式發布具備可控入口。</p>
]]></content:encoded></item><item><title>Event Source</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/event-source/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/event-source/</guid><description>&lt;p>Event Source 的核心概念是「觸發執行的事件入口」。它決定 serverless function 或 worker 何時執行、如何重試、如何進入 dead-letter，並影響 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/function-alias/" data-link-title="Function Alias" data-link-desc="說明 serverless function alias 如何把穩定入口指向特定版本並支援流量切換與回復">Function Alias&lt;/a> 的 rollout 與回復策略。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Event Source 位在 queue、topic、HTTP gateway、object storage、scheduler 與 function / worker 之間，負責把外部事件轉成執行請求。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>函式部署成功，但 invocation 因 trigger 設定失敗。&lt;/li>
&lt;li>Queue event 重試造成同一筆資料被重複處理。&lt;/li>
&lt;li>事件 schema 漂移導致 subscriber 解析失敗。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>Queue 觸發的 function 以 batch 方式處理訊息。新版本解析失敗時，訊息進入 dead-letter queue；團隊先停用 trigger，再修復 function 或重放事件。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Event Source 要定義 trigger 條件、batch size、retry、dead-letter、replay、權限與 schema 契約，讓事件驅動發布具備可觀測回復路徑。&lt;/p></description><content:encoded><![CDATA[<p>Event Source 的核心概念是「觸發執行的事件入口」。它決定 serverless function 或 worker 何時執行、如何重試、如何進入 dead-letter，並影響 <a href="/blog/ci/knowledge-cards/function-alias/" data-link-title="Function Alias" data-link-desc="說明 serverless function alias 如何把穩定入口指向特定版本並支援流量切換與回復">Function Alias</a> 的 rollout 與回復策略。</p>
<h2 id="概念位置">概念位置</h2>
<p>Event Source 位在 queue、topic、HTTP gateway、object storage、scheduler 與 function / worker 之間，負責把外部事件轉成執行請求。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>函式部署成功，但 invocation 因 trigger 設定失敗。</li>
<li>Queue event 重試造成同一筆資料被重複處理。</li>
<li>事件 schema 漂移導致 subscriber 解析失敗。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>Queue 觸發的 function 以 batch 方式處理訊息。新版本解析失敗時，訊息進入 dead-letter queue；團隊先停用 trigger，再修復 function 或重放事件。</p>
<h2 id="設計責任">設計責任</h2>
<p>Event Source 要定義 trigger 條件、batch size、retry、dead-letter、replay、權限與 schema 契約，讓事件驅動發布具備可觀測回復路徑。</p>
]]></content:encoded></item><item><title>Validation Query</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/validation-query/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/validation-query/</guid><description>&lt;p>Validation query 的核心概念是「用可重跑查詢證明資料語意是否符合遷移規則」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/correctness-check/" data-link-title="Correctness Check" data-link-desc="說明遷移或重構期間如何驗證新舊結果是否符合規則">correctness check&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明如何為既有資料補上新欄位、新索引或新衍生狀態">backfill&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate&lt;/a>，讓資料變更不只靠 job log 或人工抽樣判斷。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Validation query 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/schema-migration/" data-link-title="Schema Migration" data-link-desc="說明資料庫結構如何隨應用程式版本安全演進">schema migration&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/data-reconciliation/" data-link-title="Data Reconciliation" data-link-desc="說明多個資料來源不一致時如何比對、修復與留下證據">data reconciliation&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a> 之間。Correctness check 定義要驗什麼，validation query 則把規則落成可查、可保存、可交接的證據。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 validation query 的訊號是：&lt;/p>
&lt;ul>
&lt;li>新舊欄位或新舊資料模型會並存一段時間&lt;/li>
&lt;li>backfill job 顯示完成，但仍需要證明資料語意正確&lt;/li>
&lt;li>cutover 前要知道 mismatch 集中在哪些資料範圍&lt;/li>
&lt;li>事故修復後要留下可回放的資料證據&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>訂單服務把 &lt;code>status&lt;/code> 裡的付款語意拆到 &lt;code>payment_state&lt;/code> 時，validation query 可以比對每批訂單的新舊語意、缺值筆數、mismatch sample 與 replication lag 對位。這些結果會進入 release gate，而不是只停在 migration job 的成功訊息。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Validation query 要保留 query version、time range、資料範圍、mismatch 分類與 owner。它的目標是支援 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a> 判讀，讓團隊能知道下一步是繼續、暫停、回退讀取，還是做資料修補。&lt;/p></description><content:encoded><![CDATA[<p>Validation query 的核心概念是「用可重跑查詢證明資料語意是否符合遷移規則」。它連接 <a href="/blog/backend/knowledge-cards/correctness-check/" data-link-title="Correctness Check" data-link-desc="說明遷移或重構期間如何驗證新舊結果是否符合規則">correctness check</a>、<a href="/blog/backend/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明如何為既有資料補上新欄位、新索引或新衍生狀態">backfill</a> 與 <a href="/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate</a>，讓資料變更不只靠 job log 或人工抽樣判斷。</p>
<h2 id="概念位置">概念位置</h2>
<p>Validation query 位在 <a href="/blog/backend/knowledge-cards/schema-migration/" data-link-title="Schema Migration" data-link-desc="說明資料庫結構如何隨應用程式版本安全演進">schema migration</a>、<a href="/blog/backend/knowledge-cards/data-reconciliation/" data-link-title="Data Reconciliation" data-link-desc="說明多個資料來源不一致時如何比對、修復與留下證據">data reconciliation</a> 與 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a> 之間。Correctness check 定義要驗什麼，validation query 則把規則落成可查、可保存、可交接的證據。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 validation query 的訊號是：</p>
<ul>
<li>新舊欄位或新舊資料模型會並存一段時間</li>
<li>backfill job 顯示完成，但仍需要證明資料語意正確</li>
<li>cutover 前要知道 mismatch 集中在哪些資料範圍</li>
<li>事故修復後要留下可回放的資料證據</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>訂單服務把 <code>status</code> 裡的付款語意拆到 <code>payment_state</code> 時，validation query 可以比對每批訂單的新舊語意、缺值筆數、mismatch sample 與 replication lag 對位。這些結果會進入 release gate，而不是只停在 migration job 的成功訊息。</p>
<h2 id="設計責任">設計責任</h2>
<p>Validation query 要保留 query version、time range、資料範圍、mismatch 分類與 owner。它的目標是支援 <a href="/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a> 判讀，讓團隊能知道下一步是繼續、暫停、回退讀取，還是做資料修補。</p>
]]></content:encoded></item><item><title>Read Compatibility</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/read-compatibility/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/read-compatibility/</guid><description>&lt;p>Read compatibility 的核心概念是「讀取路徑在過渡期同時理解新舊資料語意」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/expand-contract/" data-link-title="Expand / Contract" data-link-desc="說明先擴充相容面、再收斂舊路徑的遷移做法">Expand / Contract&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/schema-migration/" data-link-title="Schema Migration" data-link-desc="說明資料庫結構如何隨應用程式版本安全演進">schema migration&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">fallback&lt;/a>，讓新欄位或新資料模型可以先進入 production，再逐步切換讀取權。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Read compatibility 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/dual-write/" data-link-title="Dual Write" data-link-desc="說明同一變更同時寫入兩個系統時的一致性風險">dual write&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/cutover-switchover/" data-link-title="Cutover / Switchover" data-link-desc="說明遷移期間如何把正式流量切到新路徑">cutover / switchover&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate&lt;/a> 之間。雙寫處理寫入一致性，read compatibility 處理讀取方如何在缺值、延遲回填或版本混跑時仍能給出一致判讀。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 read compatibility 的訊號是：&lt;/p>
&lt;ul>
&lt;li>新欄位已新增，但歷史資料尚未全部 backfill&lt;/li>
&lt;li>新舊程式版本會同時服務流量&lt;/li>
&lt;li>rollback 後舊版本仍需要讀懂 production 資料&lt;/li>
&lt;li>內部後台、對帳或報表的切換節奏不同於使用者可見路徑&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>訂單服務新增 &lt;code>payment_state&lt;/code> 後，讀取時可先看新欄位，缺值時回到舊 &lt;code>status&lt;/code> 的付款語意。客服後台可以先用這條相容讀取路徑驗證資料，再逐步讓使用者可見查詢改用新欄位。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Read compatibility 要定義讀取優先順序、fallback read 條件、資料新鮮度限制與停止條件。它要搭配 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/validation-query/" data-link-title="Validation Query" data-link-desc="說明遷移、回填與修復期間如何用查詢證明資料語意是否一致">validation query&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy&lt;/a>，避免 cutover 後才發現舊版本或長尾讀取路徑無法判讀資料。&lt;/p></description><content:encoded><![CDATA[<p>Read compatibility 的核心概念是「讀取路徑在過渡期同時理解新舊資料語意」。它連接 <a href="/blog/backend/knowledge-cards/expand-contract/" data-link-title="Expand / Contract" data-link-desc="說明先擴充相容面、再收斂舊路徑的遷移做法">Expand / Contract</a>、<a href="/blog/backend/knowledge-cards/schema-migration/" data-link-title="Schema Migration" data-link-desc="說明資料庫結構如何隨應用程式版本安全演進">schema migration</a> 與 <a href="/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">fallback</a>，讓新欄位或新資料模型可以先進入 production，再逐步切換讀取權。</p>
<h2 id="概念位置">概念位置</h2>
<p>Read compatibility 位在 <a href="/blog/backend/knowledge-cards/dual-write/" data-link-title="Dual Write" data-link-desc="說明同一變更同時寫入兩個系統時的一致性風險">dual write</a>、<a href="/blog/backend/knowledge-cards/cutover-switchover/" data-link-title="Cutover / Switchover" data-link-desc="說明遷移期間如何把正式流量切到新路徑">cutover / switchover</a> 與 <a href="/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate</a> 之間。雙寫處理寫入一致性，read compatibility 處理讀取方如何在缺值、延遲回填或版本混跑時仍能給出一致判讀。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 read compatibility 的訊號是：</p>
<ul>
<li>新欄位已新增，但歷史資料尚未全部 backfill</li>
<li>新舊程式版本會同時服務流量</li>
<li>rollback 後舊版本仍需要讀懂 production 資料</li>
<li>內部後台、對帳或報表的切換節奏不同於使用者可見路徑</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>訂單服務新增 <code>payment_state</code> 後，讀取時可先看新欄位，缺值時回到舊 <code>status</code> 的付款語意。客服後台可以先用這條相容讀取路徑驗證資料，再逐步讓使用者可見查詢改用新欄位。</p>
<h2 id="設計責任">設計責任</h2>
<p>Read compatibility 要定義讀取優先順序、fallback read 條件、資料新鮮度限制與停止條件。它要搭配 <a href="/blog/backend/knowledge-cards/validation-query/" data-link-title="Validation Query" data-link-desc="說明遷移、回填與修復期間如何用查詢證明資料語意是否一致">validation query</a> 與 <a href="/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy</a>，避免 cutover 後才發現舊版本或長尾讀取路徑無法判讀資料。</p>
]]></content:encoded></item><item><title>Fallback Read</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/fallback-read/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/fallback-read/</guid><description>&lt;p>Fallback read 的核心概念是「新讀取路徑尚未穩定時，暫時回到舊資料語意或舊讀取來源」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/read-compatibility/" data-link-title="Read Compatibility" data-link-desc="說明資料或服務演進期間讀取路徑如何同時支援新舊語意">read compatibility&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">fallback&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback-window&lt;/a>，讓 cutover 失敗時可以先限制在讀取判讀層。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Fallback read 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/cutover-switchover/" data-link-title="Cutover / Switchover" data-link-desc="說明遷移期間如何把正式流量切到新路徑">cutover / switchover&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/schema-migration/" data-link-title="Schema Migration" data-link-desc="說明資料庫結構如何隨應用程式版本安全演進">schema migration&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy&lt;/a> 之間。它保留新資料結構、暫時把讀取判斷交回舊語意或舊來源，比完整 rollback 成本低且破壞性小。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 fallback read 的訊號是：&lt;/p>
&lt;ul>
&lt;li>新欄位讀取後 mismatch 升高&lt;/li>
&lt;li>客服後台、報表或使用者可見查詢結果漂移&lt;/li>
&lt;li>寫入路徑已經收斂，但讀取模型或索引尚未穩定&lt;/li>
&lt;li>release gate 允許暫停 cutover，但尚未需要資料修補&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>訂單服務把付款狀態拆到 &lt;code>payment_state&lt;/code> 後，客服後台若發現新欄位判讀 mismatch 升高，可以先回到舊 &lt;code>status&lt;/code> 的付款語意讀取，讓客服分類回到基線，同時保留 backfill 與 validation query 繼續查證。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Fallback read 要定義觸發條件、讀取優先順序、可維持多久、哪些入口適用，以及何時重新嘗試 cutover。它要與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/validation-query/" data-link-title="Validation Query" data-link-desc="說明遷移、回填與修復期間如何用查詢證明資料語意是否一致">validation query&lt;/a> 和 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a> 對齊，避免讀取回退變成沒有證據的永久分岔。&lt;/p></description><content:encoded><![CDATA[<p>Fallback read 的核心概念是「新讀取路徑尚未穩定時，暫時回到舊資料語意或舊讀取來源」。它連接 <a href="/blog/backend/knowledge-cards/read-compatibility/" data-link-title="Read Compatibility" data-link-desc="說明資料或服務演進期間讀取路徑如何同時支援新舊語意">read compatibility</a>、<a href="/blog/backend/knowledge-cards/fallback/" data-link-title="Fallback" data-link-desc="說明主要路徑失敗時使用替代結果或替代流程的設計責任">fallback</a> 與 <a href="/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback-window</a>，讓 cutover 失敗時可以先限制在讀取判讀層。</p>
<h2 id="概念位置">概念位置</h2>
<p>Fallback read 位在 <a href="/blog/backend/knowledge-cards/cutover-switchover/" data-link-title="Cutover / Switchover" data-link-desc="說明遷移期間如何把正式流量切到新路徑">cutover / switchover</a>、<a href="/blog/backend/knowledge-cards/schema-migration/" data-link-title="Schema Migration" data-link-desc="說明資料庫結構如何隨應用程式版本安全演進">schema migration</a> 與 <a href="/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy</a> 之間。它保留新資料結構、暫時把讀取判斷交回舊語意或舊來源，比完整 rollback 成本低且破壞性小。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 fallback read 的訊號是：</p>
<ul>
<li>新欄位讀取後 mismatch 升高</li>
<li>客服後台、報表或使用者可見查詢結果漂移</li>
<li>寫入路徑已經收斂，但讀取模型或索引尚未穩定</li>
<li>release gate 允許暫停 cutover，但尚未需要資料修補</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>訂單服務把付款狀態拆到 <code>payment_state</code> 後，客服後台若發現新欄位判讀 mismatch 升高，可以先回到舊 <code>status</code> 的付款語意讀取，讓客服分類回到基線，同時保留 backfill 與 validation query 繼續查證。</p>
<h2 id="設計責任">設計責任</h2>
<p>Fallback read 要定義觸發條件、讀取優先順序、可維持多久、哪些入口適用，以及何時重新嘗試 cutover。它要與 <a href="/blog/backend/knowledge-cards/validation-query/" data-link-title="Validation Query" data-link-desc="說明遷移、回填與修復期間如何用查詢證明資料語意是否一致">validation query</a> 和 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a> 對齊，避免讀取回退變成沒有證據的永久分岔。</p>
]]></content:encoded></item><item><title>Cutover Window</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/cutover-window/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/cutover-window/</guid><description>&lt;p>Cutover window 的核心概念是「正式切換發生並被密集觀察的時間與條件範圍」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/cutover-switchover/" data-link-title="Cutover / Switchover" data-link-desc="說明遷移期間如何把正式流量切到新路徑">cutover / switchover&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback-window&lt;/a>，讓切換成為一段可停止、可判讀的窗口，脫離瞬間按鈕的思維。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Cutover window 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/steady-state/" data-link-title="Steady State" data-link-desc="說明可靠性實驗與事故恢復如何定義系統應維持的可接受狀態">steady state&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a> 之間。Release gate 決定能否開始切換，cutover window 定義切換後多久內要看哪些訊號、達到什麼條件才算穩定。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 cutover window 的訊號是：&lt;/p>
&lt;ul>
&lt;li>新路徑開始承接正式讀取或寫入&lt;/li>
&lt;li>切換後需要觀察 mismatch、latency、error rate 或 lag&lt;/li>
&lt;li>回退條件只在切換初期仍然低成本&lt;/li>
&lt;li>多個入口會分批切換，需要分別記錄時間窗&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>客服後台先切到新 &lt;code>payment_state&lt;/code> 讀取後，前 30 分鐘是 cutover window。這段期間要看 mismatch sample、客服查詢慢查詢、對帳補償量與 rollback window；穩定後才放行使用者可見讀取。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Cutover window 要定義開始時間、觀察長度、通過條件、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/stop-condition/" data-link-title="Stop Condition" data-link-desc="說明變更、實驗或事故處理何時必須暫停、回退或改路線">stop condition&lt;/a> 與 owner。它應進入 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a>，讓事後能回放切換當時的訊號。&lt;/p></description><content:encoded><![CDATA[<p>Cutover window 的核心概念是「正式切換發生並被密集觀察的時間與條件範圍」。它連接 <a href="/blog/backend/knowledge-cards/cutover-switchover/" data-link-title="Cutover / Switchover" data-link-desc="說明遷移期間如何把正式流量切到新路徑">cutover / switchover</a>、<a href="/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate</a> 與 <a href="/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback-window</a>，讓切換成為一段可停止、可判讀的窗口，脫離瞬間按鈕的思維。</p>
<h2 id="概念位置">概念位置</h2>
<p>Cutover window 位在 <a href="/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate</a>、<a href="/blog/backend/knowledge-cards/steady-state/" data-link-title="Steady State" data-link-desc="說明可靠性實驗與事故恢復如何定義系統應維持的可接受狀態">steady state</a> 與 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a> 之間。Release gate 決定能否開始切換，cutover window 定義切換後多久內要看哪些訊號、達到什麼條件才算穩定。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 cutover window 的訊號是：</p>
<ul>
<li>新路徑開始承接正式讀取或寫入</li>
<li>切換後需要觀察 mismatch、latency、error rate 或 lag</li>
<li>回退條件只在切換初期仍然低成本</li>
<li>多個入口會分批切換，需要分別記錄時間窗</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>客服後台先切到新 <code>payment_state</code> 讀取後，前 30 分鐘是 cutover window。這段期間要看 mismatch sample、客服查詢慢查詢、對帳補償量與 rollback window；穩定後才放行使用者可見讀取。</p>
<h2 id="設計責任">設計責任</h2>
<p>Cutover window 要定義開始時間、觀察長度、通過條件、<a href="/blog/backend/knowledge-cards/stop-condition/" data-link-title="Stop Condition" data-link-desc="說明變更、實驗或事故處理何時必須暫停、回退或改路線">stop condition</a> 與 owner。它應進入 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a>，讓事後能回放切換當時的訊號。</p>
]]></content:encoded></item><item><title>Mapping Table</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/mapping-table/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/mapping-table/</guid><description>&lt;p>Mapping table 的核心概念是「把舊資料語意明確對應到新資料語意」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/schema-migration/" data-link-title="Schema Migration" data-link-desc="說明資料庫結構如何隨應用程式版本安全演進">schema migration&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/correctness-check/" data-link-title="Correctness Check" data-link-desc="說明遷移或重構期間如何驗證新舊結果是否符合規則">correctness check&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/validation-query/" data-link-title="Validation Query" data-link-desc="說明遷移、回填與修復期間如何用查詢證明資料語意是否一致">validation-query&lt;/a>，讓轉換規則成為可查證 artifact，而不是工程師腦中的口頭規則。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Mapping table 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明如何為既有資料補上新欄位、新索引或新衍生狀態">backfill&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/data-reconciliation/" data-link-title="Data Reconciliation" data-link-desc="說明多個資料來源不一致時如何比對、修復與留下證據">data reconciliation&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate&lt;/a> 之間。Backfill 依它轉換資料，validation query 依它判斷 mismatch，incident decision log 則依它追溯當時的判讀依據。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 mapping table 的訊號是：&lt;/p>
&lt;ul>
&lt;li>舊欄位混合多種業務語意，需要拆到新欄位&lt;/li>
&lt;li>多個舊狀態會對應到同一個新狀態&lt;/li>
&lt;li>某些舊狀態需要人工確認或例外處理&lt;/li>
&lt;li>事後要能解釋 mismatch 是資料錯誤還是轉換規則錯誤&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>訂單服務把 &lt;code>pending_payment&lt;/code>、&lt;code>paid&lt;/code>、&lt;code>payment_failed&lt;/code>、&lt;code>refunded&lt;/code> 對應到 &lt;code>payment_state&lt;/code> 的 &lt;code>pending&lt;/code>、&lt;code>captured&lt;/code>、&lt;code>failed&lt;/code>、&lt;code>refunded&lt;/code>。這張 mapping table 同時支撐 backfill job、validation query 與 cutover gate。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Mapping table 要保留來源欄位、新欄位、對應理由、例外狀態與 owner。高風險 mapping 要版本化，並進入 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a>；否則資料漂移時，團隊很難判斷問題出在資料、程式還是規則本身。&lt;/p></description><content:encoded><![CDATA[<p>Mapping table 的核心概念是「把舊資料語意明確對應到新資料語意」。它連接 <a href="/blog/backend/knowledge-cards/schema-migration/" data-link-title="Schema Migration" data-link-desc="說明資料庫結構如何隨應用程式版本安全演進">schema migration</a>、<a href="/blog/backend/knowledge-cards/correctness-check/" data-link-title="Correctness Check" data-link-desc="說明遷移或重構期間如何驗證新舊結果是否符合規則">correctness check</a> 與 <a href="/blog/backend/knowledge-cards/validation-query/" data-link-title="Validation Query" data-link-desc="說明遷移、回填與修復期間如何用查詢證明資料語意是否一致">validation-query</a>，讓轉換規則成為可查證 artifact，而不是工程師腦中的口頭規則。</p>
<h2 id="概念位置">概念位置</h2>
<p>Mapping table 位在 <a href="/blog/backend/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明如何為既有資料補上新欄位、新索引或新衍生狀態">backfill</a>、<a href="/blog/backend/knowledge-cards/data-reconciliation/" data-link-title="Data Reconciliation" data-link-desc="說明多個資料來源不一致時如何比對、修復與留下證據">data reconciliation</a> 與 <a href="/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate</a> 之間。Backfill 依它轉換資料，validation query 依它判斷 mismatch，incident decision log 則依它追溯當時的判讀依據。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 mapping table 的訊號是：</p>
<ul>
<li>舊欄位混合多種業務語意，需要拆到新欄位</li>
<li>多個舊狀態會對應到同一個新狀態</li>
<li>某些舊狀態需要人工確認或例外處理</li>
<li>事後要能解釋 mismatch 是資料錯誤還是轉換規則錯誤</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>訂單服務把 <code>pending_payment</code>、<code>paid</code>、<code>payment_failed</code>、<code>refunded</code> 對應到 <code>payment_state</code> 的 <code>pending</code>、<code>captured</code>、<code>failed</code>、<code>refunded</code>。這張 mapping table 同時支撐 backfill job、validation query 與 cutover gate。</p>
<h2 id="設計責任">設計責任</h2>
<p>Mapping table 要保留來源欄位、新欄位、對應理由、例外狀態與 owner。高風險 mapping 要版本化，並進入 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a>；否則資料漂移時，團隊很難判斷問題出在資料、程式還是規則本身。</p>
]]></content:encoded></item><item><title>Rollback Window</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-window/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-window/</guid><description>&lt;p>Rollback window 的核心概念是「變更進入 production 後，仍能用特定方式回退或改路線的有效窗口」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate&lt;/a>，讓 gate 能判斷目前還剩哪種退路。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Rollback window 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/cutover-switchover/" data-link-title="Cutover / Switchover" data-link-desc="說明遷移期間如何把正式流量切到新路徑">cutover / switchover&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/fallback-plan/" data-link-title="Fallback Plan" data-link-desc="說明變更失敗時如何回到可接受狀態">fallback plan&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a> 之間。Rollback strategy 說明回退決策，rollback window 說明這個決策在目前階段是否仍可執行。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 rollback window 的訊號是：&lt;/p>
&lt;ul>
&lt;li>expand、backfill、cutover、contract 每一階段的回退方式不同&lt;/li>
&lt;li>舊版本或舊資料語意只能支撐一段時間&lt;/li>
&lt;li>cutover 後仍可 fallback read，但 contract 後只能資料修復或 fail-forward&lt;/li>
&lt;li>release gate 要判斷是否還能安全暫停或回退&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>資料庫 migration 在 expand 階段通常能回到舊讀取；backfill 階段可以暫停與重跑；cutover 後可回到 fallback read；contract 移除舊欄位後，回退會轉成資料修補或 fail-forward。這些差異都屬於 rollback window。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Rollback window 要寫清楚目前階段、可用回退方式、最後可回退時間、資料相容性限制與 owner。它要進入 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a>，避免事故期間把已經關閉的退路當成可用選項。&lt;/p></description><content:encoded><![CDATA[<p>Rollback window 的核心概念是「變更進入 production 後，仍能用特定方式回退或改路線的有效窗口」。它連接 <a href="/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy</a>、<a href="/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate</a> 與 <a href="/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate</a>，讓 gate 能判斷目前還剩哪種退路。</p>
<h2 id="概念位置">概念位置</h2>
<p>Rollback window 位在 <a href="/blog/backend/knowledge-cards/cutover-switchover/" data-link-title="Cutover / Switchover" data-link-desc="說明遷移期間如何把正式流量切到新路徑">cutover / switchover</a>、<a href="/blog/backend/knowledge-cards/fallback-plan/" data-link-title="Fallback Plan" data-link-desc="說明變更失敗時如何回到可接受狀態">fallback plan</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a> 之間。Rollback strategy 說明回退決策，rollback window 說明這個決策在目前階段是否仍可執行。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 rollback window 的訊號是：</p>
<ul>
<li>expand、backfill、cutover、contract 每一階段的回退方式不同</li>
<li>舊版本或舊資料語意只能支撐一段時間</li>
<li>cutover 後仍可 fallback read，但 contract 後只能資料修復或 fail-forward</li>
<li>release gate 要判斷是否還能安全暫停或回退</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>資料庫 migration 在 expand 階段通常能回到舊讀取；backfill 階段可以暫停與重跑；cutover 後可回到 fallback read；contract 移除舊欄位後，回退會轉成資料修補或 fail-forward。這些差異都屬於 rollback window。</p>
<h2 id="設計責任">設計責任</h2>
<p>Rollback window 要寫清楚目前階段、可用回退方式、最後可回退時間、資料相容性限制與 owner。它要進入 <a href="/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a>，避免事故期間把已經關閉的退路當成可用選項。</p>
]]></content:encoded></item><item><title>Fail-forward</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/fail-forward/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/fail-forward/</guid><description>&lt;p>Fail-forward 的核心概念是「當回退代價高於前進修復時，用受控方式往新狀態完成修復」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/fallback-plan/" data-link-title="Fallback Plan" data-link-desc="說明變更失敗時如何回到可接受狀態">fallback plan&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a>，不是忽略失敗繼續推進。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Fail-forward 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/containment/" data-link-title="Containment" data-link-desc="說明事故處理中如何限制擴散面，為回復與驗證爭取時間">containment&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/post-incident-review/" data-link-title="Post-Incident Review" data-link-desc="說明事故後如何完成復盤、學習與改進閉環">post-incident review&lt;/a> 之間。Rollback window 關閉後，團隊仍需要一條能限制影響、補資料、完成相容收斂的前進路線。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 fail-forward 的訊號是：&lt;/p>
&lt;ul>
&lt;li>舊資料語意已被 contract 或不可逆寫入移除&lt;/li>
&lt;li>回退會造成更大的資料不一致或客戶影響&lt;/li>
&lt;li>新路徑有明確修補方案、停損條件與 owner&lt;/li>
&lt;li>事故 decision log 需要記錄為何不回滾&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>資料庫 migration 已完成 contract 後，舊欄位被移除，回到舊版本會讓讀取路徑失效。此時比較可控的做法可能是暫停部分寫入、修補 mismatch、補 validation query，再讓新路徑收斂到可用狀態。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Fail-forward 要定義 containment、修補步驟、預期效果、停止條件與回寫項目。它要搭配 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/action-item-closure/" data-link-title="Action Item Closure" data-link-desc="說明事故行動項如何被驗證完成，而不是只停留在待辦清單">action item closure&lt;/a>，避免「不能回滾」被誤用成沒有證據的硬推。&lt;/p></description><content:encoded><![CDATA[<p>Fail-forward 的核心概念是「當回退代價高於前進修復時，用受控方式往新狀態完成修復」。它連接 <a href="/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy</a>、<a href="/blog/backend/knowledge-cards/fallback-plan/" data-link-title="Fallback Plan" data-link-desc="說明變更失敗時如何回到可接受狀態">fallback plan</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a>，不是忽略失敗繼續推進。</p>
<h2 id="概念位置">概念位置</h2>
<p>Fail-forward 位在 <a href="/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window</a>、<a href="/blog/backend/knowledge-cards/containment/" data-link-title="Containment" data-link-desc="說明事故處理中如何限制擴散面，為回復與驗證爭取時間">containment</a> 與 <a href="/blog/backend/knowledge-cards/post-incident-review/" data-link-title="Post-Incident Review" data-link-desc="說明事故後如何完成復盤、學習與改進閉環">post-incident review</a> 之間。Rollback window 關閉後，團隊仍需要一條能限制影響、補資料、完成相容收斂的前進路線。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 fail-forward 的訊號是：</p>
<ul>
<li>舊資料語意已被 contract 或不可逆寫入移除</li>
<li>回退會造成更大的資料不一致或客戶影響</li>
<li>新路徑有明確修補方案、停損條件與 owner</li>
<li>事故 decision log 需要記錄為何不回滾</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>資料庫 migration 已完成 contract 後，舊欄位被移除，回到舊版本會讓讀取路徑失效。此時比較可控的做法可能是暫停部分寫入、修補 mismatch、補 validation query，再讓新路徑收斂到可用狀態。</p>
<h2 id="設計責任">設計責任</h2>
<p>Fail-forward 要定義 containment、修補步驟、預期效果、停止條件與回寫項目。它要搭配 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a> 與 <a href="/blog/backend/knowledge-cards/action-item-closure/" data-link-title="Action Item Closure" data-link-desc="說明事故行動項如何被驗證完成，而不是只停留在待辦清單">action item closure</a>，避免「不能回滾」被誤用成沒有證據的硬推。</p>
]]></content:encoded></item><item><title>Stop Condition</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/stop-condition/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/stop-condition/</guid><description>&lt;p>Stop condition 的核心概念是「事前定義何時必須暫停、回退或改路線」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a>，避免團隊在壓力下用感覺決定是否繼續。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Stop condition 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/cutover-window/" data-link-title="Cutover Window" data-link-desc="說明正式切換發生的觀察窗口、停止條件與回退判讀範圍">cutover-window&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/steady-state/" data-link-title="Steady State" data-link-desc="說明可靠性實驗與事故恢復如何定義系統應維持的可接受狀態">steady state&lt;/a> 之間。Gate 說明能否開始，stop condition 說明開始後看到哪些訊號必須停。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 stop condition 的訊號是：&lt;/p>
&lt;ul>
&lt;li>rollout、backfill、replay 或 experiment 會逐批擴大影響&lt;/li>
&lt;li>指標短暫變壞時需要知道是觀察、暫停還是回退&lt;/li>
&lt;li>owner 需要在事故現場快速做一致決策&lt;/li>
&lt;li>post-incident review 要檢查當時是否該更早停下來&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>資料庫 migration 可以定義 &lt;code>mismatch_rate &amp;gt;= 0.1% for two consecutive batches&lt;/code> 或 &lt;code>replication_lag &amp;gt;= 30s for 10 minutes&lt;/code> 作為 stop condition。達到條件時，團隊先暫停下一批 backfill 或回到 fallback read，而不是等使用者回報。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Stop condition 要包含訊號、門檻、觀察窗口、對應動作與 owner。它要進入 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate&lt;/a> 和 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a>，並且要能被 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a> 支撐。&lt;/p></description><content:encoded><![CDATA[<p>Stop condition 的核心概念是「事前定義何時必須暫停、回退或改路線」。它連接 <a href="/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate</a>、<a href="/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a>，避免團隊在壓力下用感覺決定是否繼續。</p>
<h2 id="概念位置">概念位置</h2>
<p>Stop condition 位在 <a href="/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate</a>、<a href="/blog/backend/knowledge-cards/cutover-window/" data-link-title="Cutover Window" data-link-desc="說明正式切換發生的觀察窗口、停止條件與回退判讀範圍">cutover-window</a> 與 <a href="/blog/backend/knowledge-cards/steady-state/" data-link-title="Steady State" data-link-desc="說明可靠性實驗與事故恢復如何定義系統應維持的可接受狀態">steady state</a> 之間。Gate 說明能否開始，stop condition 說明開始後看到哪些訊號必須停。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 stop condition 的訊號是：</p>
<ul>
<li>rollout、backfill、replay 或 experiment 會逐批擴大影響</li>
<li>指標短暫變壞時需要知道是觀察、暫停還是回退</li>
<li>owner 需要在事故現場快速做一致決策</li>
<li>post-incident review 要檢查當時是否該更早停下來</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>資料庫 migration 可以定義 <code>mismatch_rate &gt;= 0.1% for two consecutive batches</code> 或 <code>replication_lag &gt;= 30s for 10 minutes</code> 作為 stop condition。達到條件時，團隊先暫停下一批 backfill 或回到 fallback read，而不是等使用者回報。</p>
<h2 id="設計責任">設計責任</h2>
<p>Stop condition 要包含訊號、門檻、觀察窗口、對應動作與 owner。它要進入 <a href="/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate</a> 和 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a>，並且要能被 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a> 支撐。</p>
]]></content:encoded></item><item><title>Gate Decision</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/gate-decision/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/gate-decision/</guid><description>&lt;p>Gate decision 的核心概念是「release gate 根據證據做出的明確下一步」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/stop-condition/" data-link-title="Stop Condition" data-link-desc="說明變更、實驗或事故處理何時必須暫停、回退或改路線">stop condition&lt;/a>，讓 gate 不只寫檢查結果，也寫出能不能前進。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Gate decision 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/confidence/" data-link-title="Confidence" data-link-desc="說明證據包如何標示 confirmed、suspected 或 needs follow-up 的判讀信心">confidence&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a> 之間。Checks 描述檢查結果，gate decision 把結果轉成放行、暫停、回退、fail-forward 或補證據。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 gate decision 的訊號是：&lt;/p>
&lt;ul>
&lt;li>CI、SLO、validation query 都有結果，但沒人知道下一步&lt;/li>
&lt;li>evidence 足以支持部分放行，但不足以支持完整 cutover&lt;/li>
&lt;li>變更需要逐批 rollout、backfill、warmup 或 replay&lt;/li>
&lt;li>gate 要保留 owner 與 rollback window&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>資料庫 migration 的 gate decision 可以寫成 &lt;code>allow next 10% backfill; block customer-visible read cutover&lt;/code>。這句話比 &lt;code>migration pass&lt;/code> 更可操作，因為它同時說明允許前進的範圍與被擋住的風險面。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Gate decision 要包含決策內容、支撐 checks、stop condition、rollback window 與 owner。它要能被 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a> 承接，讓放行後出現異常時能回放當時依據。&lt;/p></description><content:encoded><![CDATA[<p>Gate decision 的核心概念是「release gate 根據證據做出的明確下一步」。它連接 <a href="/blog/backend/knowledge-cards/release-gate/" data-link-title="Release Gate" data-link-desc="說明變更在正式釋出前如何通過或阻擋">release gate</a>、<a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a> 與 <a href="/blog/backend/knowledge-cards/stop-condition/" data-link-title="Stop Condition" data-link-desc="說明變更、實驗或事故處理何時必須暫停、回退或改路線">stop condition</a>，讓 gate 不只寫檢查結果，也寫出能不能前進。</p>
<h2 id="概念位置">概念位置</h2>
<p>Gate decision 位在 <a href="/blog/backend/knowledge-cards/confidence/" data-link-title="Confidence" data-link-desc="說明證據包如何標示 confirmed、suspected 或 needs follow-up 的判讀信心">confidence</a>、<a href="/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a> 之間。Checks 描述檢查結果，gate decision 把結果轉成放行、暫停、回退、fail-forward 或補證據。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 gate decision 的訊號是：</p>
<ul>
<li>CI、SLO、validation query 都有結果，但沒人知道下一步</li>
<li>evidence 足以支持部分放行，但不足以支持完整 cutover</li>
<li>變更需要逐批 rollout、backfill、warmup 或 replay</li>
<li>gate 要保留 owner 與 rollback window</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>資料庫 migration 的 gate decision 可以寫成 <code>allow next 10% backfill; block customer-visible read cutover</code>。這句話比 <code>migration pass</code> 更可操作，因為它同時說明允許前進的範圍與被擋住的風險面。</p>
<h2 id="設計責任">設計責任</h2>
<p>Gate decision 要包含決策內容、支撐 checks、stop condition、rollback window 與 owner。它要能被 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a> 承接，讓放行後出現異常時能回放當時依據。</p>
]]></content:encoded></item><item><title>Rollback Condition</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-condition/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-condition/</guid><description>&lt;p>Rollback condition 的核心概念是「某個決策執行後，看到哪些訊號時要撤回、回退或改路線」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/stop-condition/" data-link-title="Stop Condition" data-link-desc="說明變更、實驗或事故處理何時必須暫停、回退或改路線">stop condition&lt;/a>，讓事故現場能控制次生風險。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Rollback condition 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/gate-decision/" data-link-title="Gate Decision" data-link-desc="說明 release gate 如何把證據轉成放行、暫停、回退或補證據的決策">gate decision&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/time-range/" data-link-title="Time Range" data-link-desc="說明證據、查詢與事故判讀如何用時間窗保留可回放上下文">time range&lt;/a> 之間。Stop condition 常用於流程何時停，rollback condition 則跟某筆已做出的 decision 綁在一起。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 rollback condition 的訊號是：&lt;/p>
&lt;ul>
&lt;li>rollback、fallback、degradation 或 fail-forward 本身也可能造成風險&lt;/li>
&lt;li>IC handoff 後，新 IC 需要知道什麼條件下要改路線&lt;/li>
&lt;li>stakeholder update 需要說明目前決策如何被監控&lt;/li>
&lt;li>PIR 需要檢查當時是否有明確撤回條件&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>客服後台切回 legacy status fallback 後，rollback condition 可以寫成 &lt;code>mismatch remains above threshold after 15 minutes&lt;/code>。這表示 fallback 沒有降低錯誤時，團隊要改成資料修補或暫停相關入口，而不是繼續等待。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Rollback condition 要包含訊號、門檻、觀察窗口、對應動作與 owner。它要連到 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/query-link/" data-link-title="Query Link" data-link-desc="說明證據包如何保存可重跑查詢入口，而不是只保留截圖或口頭結論">query link&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/time-range/" data-link-title="Time Range" data-link-desc="說明證據、查詢與事故判讀如何用時間窗保留可回放上下文">time range&lt;/a>，讓決策撤回成為可回放的證據判讀，口頭判斷的準確度和可追溯性都不足。&lt;/p></description><content:encoded><![CDATA[<p>Rollback condition 的核心概念是「某個決策執行後，看到哪些訊號時要撤回、回退或改路線」。它連接 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a>、<a href="/blog/backend/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明事故期間如何判斷回滾、回切與暫停變更">rollback strategy</a> 與 <a href="/blog/backend/knowledge-cards/stop-condition/" data-link-title="Stop Condition" data-link-desc="說明變更、實驗或事故處理何時必須暫停、回退或改路線">stop condition</a>，讓事故現場能控制次生風險。</p>
<h2 id="概念位置">概念位置</h2>
<p>Rollback condition 位在 <a href="/blog/backend/knowledge-cards/gate-decision/" data-link-title="Gate Decision" data-link-desc="說明 release gate 如何把證據轉成放行、暫停、回退或補證據的決策">gate decision</a>、<a href="/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window</a> 與 <a href="/blog/backend/knowledge-cards/time-range/" data-link-title="Time Range" data-link-desc="說明證據、查詢與事故判讀如何用時間窗保留可回放上下文">time range</a> 之間。Stop condition 常用於流程何時停，rollback condition 則跟某筆已做出的 decision 綁在一起。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 rollback condition 的訊號是：</p>
<ul>
<li>rollback、fallback、degradation 或 fail-forward 本身也可能造成風險</li>
<li>IC handoff 後，新 IC 需要知道什麼條件下要改路線</li>
<li>stakeholder update 需要說明目前決策如何被監控</li>
<li>PIR 需要檢查當時是否有明確撤回條件</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>客服後台切回 legacy status fallback 後，rollback condition 可以寫成 <code>mismatch remains above threshold after 15 minutes</code>。這表示 fallback 沒有降低錯誤時，團隊要改成資料修補或暫停相關入口，而不是繼續等待。</p>
<h2 id="設計責任">設計責任</h2>
<p>Rollback condition 要包含訊號、門檻、觀察窗口、對應動作與 owner。它要連到 <a href="/blog/backend/knowledge-cards/query-link/" data-link-title="Query Link" data-link-desc="說明證據包如何保存可重跑查詢入口，而不是只保留截圖或口頭結論">query link</a> 與 <a href="/blog/backend/knowledge-cards/time-range/" data-link-title="Time Range" data-link-desc="說明證據、查詢與事故判讀如何用時間窗保留可回放上下文">time range</a>，讓決策撤回成為可回放的證據判讀，口頭判斷的準確度和可追溯性都不足。</p>
]]></content:encoded></item><item><title>Time Range</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/time-range/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/time-range/</guid><description>&lt;p>Time range 的核心概念是「證據或查詢對應的明確時間窗」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-timeline/" data-link-title="Incident Timeline" data-link-desc="說明事故時間線如何支援判斷、溝通與復盤">incident timeline&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/steady-state/" data-link-title="Steady State" data-link-desc="說明可靠性實驗與事故恢復如何定義系統應維持的可接受狀態">steady state&lt;/a>，讓同一組資料能被事中交班、release gate 與事後復盤一致解讀。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Time range 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/dashboard/" data-link-title="Dashboard" data-link-desc="說明 dashboard 如何把關鍵訊號組成可判讀的服務狀態畫面">dashboard&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/query-link/" data-link-title="Query Link" data-link-desc="說明證據包如何保存可重跑查詢入口，而不是只保留截圖或口頭結論">query link&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a> 之間。Dashboard 顯示狀態，query link 保留查詢入口，time range 則定義這次判讀看的時間範圍。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 time range 的訊號是：&lt;/p>
&lt;ul>
&lt;li>同一張圖在不同時間重跑會得到不同結果&lt;/li>
&lt;li>release gate 要判斷某批 rollout 是否已穩定&lt;/li>
&lt;li>事故交班需要知道某個 evidence 觀察的是哪段時間&lt;/li>
&lt;li>復盤要對齊 deploy、alert、customer report 與 rollback 的先後&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>資料庫 migration 的 validation query 若標示 &lt;code>2026-05-11T02:10:00Z/2026-05-11T02:20:00Z&lt;/code>，下一班 on-call 就能把 mismatch、replication lag 與 slow query 放回同一個 backfill batch 判讀。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Time range 要定義開始時間、結束時間、時區、資料延遲限制與關聯事件。它應進入 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-condition/" data-link-title="Rollback Condition" data-link-desc="說明決策執行後出現哪些訊號時要撤回、回退或改路線">rollback condition&lt;/a>，避免團隊用不同時間窗比較同一個決策。&lt;/p></description><content:encoded><![CDATA[<p>Time range 的核心概念是「證據或查詢對應的明確時間窗」。它連接 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a>、<a href="/blog/backend/knowledge-cards/incident-timeline/" data-link-title="Incident Timeline" data-link-desc="說明事故時間線如何支援判斷、溝通與復盤">incident timeline</a> 與 <a href="/blog/backend/knowledge-cards/steady-state/" data-link-title="Steady State" data-link-desc="說明可靠性實驗與事故恢復如何定義系統應維持的可接受狀態">steady state</a>，讓同一組資料能被事中交班、release gate 與事後復盤一致解讀。</p>
<h2 id="概念位置">概念位置</h2>
<p>Time range 位在 <a href="/blog/backend/knowledge-cards/dashboard/" data-link-title="Dashboard" data-link-desc="說明 dashboard 如何把關鍵訊號組成可判讀的服務狀態畫面">dashboard</a>、<a href="/blog/backend/knowledge-cards/query-link/" data-link-title="Query Link" data-link-desc="說明證據包如何保存可重跑查詢入口，而不是只保留截圖或口頭結論">query link</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a> 之間。Dashboard 顯示狀態，query link 保留查詢入口，time range 則定義這次判讀看的時間範圍。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 time range 的訊號是：</p>
<ul>
<li>同一張圖在不同時間重跑會得到不同結果</li>
<li>release gate 要判斷某批 rollout 是否已穩定</li>
<li>事故交班需要知道某個 evidence 觀察的是哪段時間</li>
<li>復盤要對齊 deploy、alert、customer report 與 rollback 的先後</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>資料庫 migration 的 validation query 若標示 <code>2026-05-11T02:10:00Z/2026-05-11T02:20:00Z</code>，下一班 on-call 就能把 mismatch、replication lag 與 slow query 放回同一個 backfill batch 判讀。</p>
<h2 id="設計責任">設計責任</h2>
<p>Time range 要定義開始時間、結束時間、時區、資料延遲限制與關聯事件。它應進入 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a> 與 <a href="/blog/backend/knowledge-cards/rollback-condition/" data-link-title="Rollback Condition" data-link-desc="說明決策執行後出現哪些訊號時要撤回、回退或改路線">rollback condition</a>，避免團隊用不同時間窗比較同一個決策。</p>
]]></content:encoded></item><item><title>Query Link</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/query-link/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/query-link/</guid><description>&lt;p>Query link 的核心概念是「保存可重跑的查詢入口」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/time-range/" data-link-title="Time Range" data-link-desc="說明證據、查詢與事故判讀如何用時間窗保留可回放上下文">time range&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/data-quality/" data-link-title="Data Quality" data-link-desc="說明證據欄位如何標示 completeness、freshness、sampling 與資料限制">data quality&lt;/a>，讓後續接手者能重新驗證同一個判讀。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Query link 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/dashboard/" data-link-title="Dashboard" data-link-desc="說明 dashboard 如何把關鍵訊號組成可判讀的服務狀態畫面">dashboard&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/validation-query/" data-link-title="Validation Query" data-link-desc="說明遷移、回填與修復期間如何用查詢證明資料語意是否一致">validation query&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a> 之間。截圖適合溝通當下狀態，query link 則保留可回放、可調整、可驗證的入口。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 query link 的訊號是：&lt;/p>
&lt;ul>
&lt;li>事故交班時下一班需要重跑同一個判讀&lt;/li>
&lt;li>release gate 要引用具體查詢結果，而不是貼圖表摘要&lt;/li>
&lt;li>PIR reviewer 需要查證當時資料限制&lt;/li>
&lt;li>dashboard panel 版本變動可能改變圖表語意&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>Checkout API evidence package 可以保存錯誤率 query、p95 latency query 與 provider timeout query 的連結。資料庫 migration evidence package 則可以保存 row count、mismatch sample 與 replication lag query link。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Query link 要保留查詢版本、參數、time range、資料來源與 owner。它要搭配 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/known-gap/" data-link-title="Known Gap" data-link-desc="說明證據包如何明確保存已知缺口，避免下游高估證據完整性">known gap&lt;/a> 記錄查詢未覆蓋的資料範圍，避免截圖或 dashboard 名稱被誤當成完整證據。&lt;/p></description><content:encoded><![CDATA[<p>Query link 的核心概念是「保存可重跑的查詢入口」。它連接 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a>、<a href="/blog/backend/knowledge-cards/time-range/" data-link-title="Time Range" data-link-desc="說明證據、查詢與事故判讀如何用時間窗保留可回放上下文">time range</a> 與 <a href="/blog/backend/knowledge-cards/data-quality/" data-link-title="Data Quality" data-link-desc="說明證據欄位如何標示 completeness、freshness、sampling 與資料限制">data quality</a>，讓後續接手者能重新驗證同一個判讀。</p>
<h2 id="概念位置">概念位置</h2>
<p>Query link 位在 <a href="/blog/backend/knowledge-cards/dashboard/" data-link-title="Dashboard" data-link-desc="說明 dashboard 如何把關鍵訊號組成可判讀的服務狀態畫面">dashboard</a>、<a href="/blog/backend/knowledge-cards/validation-query/" data-link-title="Validation Query" data-link-desc="說明遷移、回填與修復期間如何用查詢證明資料語意是否一致">validation query</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a> 之間。截圖適合溝通當下狀態，query link 則保留可回放、可調整、可驗證的入口。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 query link 的訊號是：</p>
<ul>
<li>事故交班時下一班需要重跑同一個判讀</li>
<li>release gate 要引用具體查詢結果，而不是貼圖表摘要</li>
<li>PIR reviewer 需要查證當時資料限制</li>
<li>dashboard panel 版本變動可能改變圖表語意</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>Checkout API evidence package 可以保存錯誤率 query、p95 latency query 與 provider timeout query 的連結。資料庫 migration evidence package 則可以保存 row count、mismatch sample 與 replication lag query link。</p>
<h2 id="設計責任">設計責任</h2>
<p>Query link 要保留查詢版本、參數、time range、資料來源與 owner。它要搭配 <a href="/blog/backend/knowledge-cards/known-gap/" data-link-title="Known Gap" data-link-desc="說明證據包如何明確保存已知缺口，避免下游高估證據完整性">known gap</a> 記錄查詢未覆蓋的資料範圍，避免截圖或 dashboard 名稱被誤當成完整證據。</p>
]]></content:encoded></item><item><title>Data Quality</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/data-quality/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/data-quality/</guid><description>&lt;p>Data quality 的核心概念是「證據資料本身的完整度、新鮮度與限制」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/sampling/" data-link-title="Sampling" data-link-desc="說明觀測資料如何抽樣以控制成本並保留診斷能力">sampling&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/known-gap/" data-link-title="Known Gap" data-link-desc="說明證據包如何明確保存已知缺口，避免下游高估證據完整性">known gap&lt;/a>，讓下游知道這份 evidence 能支持到哪個判斷範圍。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Data quality 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/metrics/" data-link-title="Metrics" data-link-desc="說明指標如何描述服務趨勢、容量與健康狀態">metrics&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/trace/" data-link-title="Trace" data-link-desc="說明 trace 如何重建跨服務請求的路徑、耗時與依賴關係">trace&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a> 之間。Metric、log、trace、audit log 都可能有延遲、抽樣、drop、masking 或 schema drift，這些限制要跟證據一起交接。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 data quality 的訊號是：&lt;/p>
&lt;ul>
&lt;li>trace sampling 讓某些 request path 無法完整重建&lt;/li>
&lt;li>log pipeline 有 ingest delay 或 drop&lt;/li>
&lt;li>query 只跑 primary、replica 或部分 tenant&lt;/li>
&lt;li>dashboard 結論需要標示 freshness 或 completeness 限制&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>資料庫 migration 的 evidence package 可以標示 &lt;code>primary only; replica lag still recovering&lt;/code>，表示 validation query 可信，但 replica 讀取路徑還不能用同一份 evidence 直接放行。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Data quality 要標示 completeness、freshness、sampling、masking、retention 與 owner。它要支援 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/confidence/" data-link-title="Confidence" data-link-desc="說明證據包如何標示 confirmed、suspected 或 needs follow-up 的判讀信心">confidence&lt;/a> 判讀，避免 release gate 或 incident decision log 把有限資料誤當成完整事實。&lt;/p></description><content:encoded><![CDATA[<p>Data quality 的核心概念是「證據資料本身的完整度、新鮮度與限制」。它連接 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a>、<a href="/blog/backend/knowledge-cards/sampling/" data-link-title="Sampling" data-link-desc="說明觀測資料如何抽樣以控制成本並保留診斷能力">sampling</a> 與 <a href="/blog/backend/knowledge-cards/known-gap/" data-link-title="Known Gap" data-link-desc="說明證據包如何明確保存已知缺口，避免下游高估證據完整性">known gap</a>，讓下游知道這份 evidence 能支持到哪個判斷範圍。</p>
<h2 id="概念位置">概念位置</h2>
<p>Data quality 位在 <a href="/blog/backend/knowledge-cards/metrics/" data-link-title="Metrics" data-link-desc="說明指標如何描述服務趨勢、容量與健康狀態">metrics</a>、<a href="/blog/backend/knowledge-cards/trace/" data-link-title="Trace" data-link-desc="說明 trace 如何重建跨服務請求的路徑、耗時與依賴關係">trace</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a> 之間。Metric、log、trace、audit log 都可能有延遲、抽樣、drop、masking 或 schema drift，這些限制要跟證據一起交接。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 data quality 的訊號是：</p>
<ul>
<li>trace sampling 讓某些 request path 無法完整重建</li>
<li>log pipeline 有 ingest delay 或 drop</li>
<li>query 只跑 primary、replica 或部分 tenant</li>
<li>dashboard 結論需要標示 freshness 或 completeness 限制</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>資料庫 migration 的 evidence package 可以標示 <code>primary only; replica lag still recovering</code>，表示 validation query 可信，但 replica 讀取路徑還不能用同一份 evidence 直接放行。</p>
<h2 id="設計責任">設計責任</h2>
<p>Data quality 要標示 completeness、freshness、sampling、masking、retention 與 owner。它要支援 <a href="/blog/backend/knowledge-cards/confidence/" data-link-title="Confidence" data-link-desc="說明證據包如何標示 confirmed、suspected 或 needs follow-up 的判讀信心">confidence</a> 判讀，避免 release gate 或 incident decision log 把有限資料誤當成完整事實。</p>
]]></content:encoded></item><item><title>Confidence</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/confidence/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/confidence/</guid><description>&lt;p>Confidence 的核心概念是「標示目前證據能支持決策的信心等級」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/data-quality/" data-link-title="Data Quality" data-link-desc="說明證據欄位如何標示 completeness、freshness、sampling 與資料限制">data quality&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/gate-decision/" data-link-title="Gate Decision" data-link-desc="說明 release gate 如何把證據轉成放行、暫停、回退或補證據的決策">gate decision&lt;/a>，讓團隊能區分 confirmed、suspected 與 needs follow-up。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Confidence 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/query-link/" data-link-title="Query Link" data-link-desc="說明證據包如何保存可重跑查詢入口，而不是只保留截圖或口頭結論">query link&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/known-gap/" data-link-title="Known Gap" data-link-desc="說明證據包如何明確保存已知缺口，避免下游高估證據完整性">known gap&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log&lt;/a> 之間。它不是情緒性的「我覺得」，而是基於證據完整度、資料限制與反向驗證狀態的判讀欄位。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 confidence 的訊號是：&lt;/p>
&lt;ul>
&lt;li>evidence 足以支持繼續 backfill，但不足以支持使用者可見 cutover&lt;/li>
&lt;li>事故中某個根因還在 suspected 狀態&lt;/li>
&lt;li>release gate 需要分辨可以放行、暫停或補證據&lt;/li>
&lt;li>stakeholder update 需要避免把未確認資訊說成事實&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>資料庫 migration 的 evidence package 可以把 &lt;code>confidence&lt;/code> 標成 &lt;code>suspected&lt;/code>：validation query 顯示 mismatch 低於門檻，但 manual refund repair path 尚未被抽樣，因此只放行下一批 backfill，不放行使用者可見讀取 cutover。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Confidence 要定義等級、證據依據、限制與下一步。它要與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/known-gap/" data-link-title="Known Gap" data-link-desc="說明證據包如何明確保存已知缺口，避免下游高估證據完整性">known gap&lt;/a> 和 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-condition/" data-link-title="Rollback Condition" data-link-desc="說明決策執行後出現哪些訊號時要撤回、回退或改路線">rollback condition&lt;/a> 一起保存，避免團隊把暫時結論當成穩定事實。&lt;/p></description><content:encoded><![CDATA[<p>Confidence 的核心概念是「標示目前證據能支持決策的信心等級」。它連接 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a>、<a href="/blog/backend/knowledge-cards/data-quality/" data-link-title="Data Quality" data-link-desc="說明證據欄位如何標示 completeness、freshness、sampling 與資料限制">data quality</a> 與 <a href="/blog/backend/knowledge-cards/gate-decision/" data-link-title="Gate Decision" data-link-desc="說明 release gate 如何把證據轉成放行、暫停、回退或補證據的決策">gate decision</a>，讓團隊能區分 confirmed、suspected 與 needs follow-up。</p>
<h2 id="概念位置">概念位置</h2>
<p>Confidence 位在 <a href="/blog/backend/knowledge-cards/query-link/" data-link-title="Query Link" data-link-desc="說明證據包如何保存可重跑查詢入口，而不是只保留截圖或口頭結論">query link</a>、<a href="/blog/backend/knowledge-cards/known-gap/" data-link-title="Known Gap" data-link-desc="說明證據包如何明確保存已知缺口，避免下游高估證據完整性">known gap</a> 與 <a href="/blog/backend/knowledge-cards/incident-decision-log/" data-link-title="Incident Decision Log" data-link-desc="說明事故期間如何保留決策、證據、owner 與回退條件">incident decision log</a> 之間。它不是情緒性的「我覺得」，而是基於證據完整度、資料限制與反向驗證狀態的判讀欄位。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 confidence 的訊號是：</p>
<ul>
<li>evidence 足以支持繼續 backfill，但不足以支持使用者可見 cutover</li>
<li>事故中某個根因還在 suspected 狀態</li>
<li>release gate 需要分辨可以放行、暫停或補證據</li>
<li>stakeholder update 需要避免把未確認資訊說成事實</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>資料庫 migration 的 evidence package 可以把 <code>confidence</code> 標成 <code>suspected</code>：validation query 顯示 mismatch 低於門檻，但 manual refund repair path 尚未被抽樣，因此只放行下一批 backfill，不放行使用者可見讀取 cutover。</p>
<h2 id="設計責任">設計責任</h2>
<p>Confidence 要定義等級、證據依據、限制與下一步。它要與 <a href="/blog/backend/knowledge-cards/known-gap/" data-link-title="Known Gap" data-link-desc="說明證據包如何明確保存已知缺口，避免下游高估證據完整性">known gap</a> 和 <a href="/blog/backend/knowledge-cards/rollback-condition/" data-link-title="Rollback Condition" data-link-desc="說明決策執行後出現哪些訊號時要撤回、回退或改路線">rollback condition</a> 一起保存，避免團隊把暫時結論當成穩定事實。</p>
]]></content:encoded></item><item><title>Known Gap</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/known-gap/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/known-gap/</guid><description>&lt;p>Known gap 的核心概念是「把已知但尚未覆蓋的證據缺口寫進 artifact」。它連接 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/data-quality/" data-link-title="Data Quality" data-link-desc="說明證據欄位如何標示 completeness、freshness、sampling 與資料限制">data quality&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/action-item-closure/" data-link-title="Action Item Closure" data-link-desc="說明事故行動項如何被驗證完成，而不是只停留在待辦清單">action item closure&lt;/a>，讓缺口能被追蹤、交班與回寫。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Known gap 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/confidence/" data-link-title="Confidence" data-link-desc="說明證據包如何標示 confirmed、suspected 或 needs follow-up 的判讀信心">confidence&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/query-link/" data-link-title="Query Link" data-link-desc="說明證據包如何保存可重跑查詢入口，而不是只保留截圖或口頭結論">query link&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/post-incident-review/" data-link-title="Post-Incident Review" data-link-desc="說明事故後如何完成復盤、學習與改進閉環">post-incident review&lt;/a> 之間。Data quality 說明資料限制，known gap 則列出目前尚未被證據覆蓋的具體範圍。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;p>系統需要 known gap 的訊號是：&lt;/p>
&lt;ul>
&lt;li>某些 tenant、region、callback path 或 manual repair path 未被抽樣&lt;/li>
&lt;li>trace 或 log 缺少關鍵 span / field&lt;/li>
&lt;li>release gate 放行時仍有需要 follow-up 的證據缺口&lt;/li>
&lt;li>PIR 需要把缺口回寫成 readiness 或 observability 改善項&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實網路服務的例子">接近真實網路服務的例子&lt;/h2>
&lt;p>資料庫 migration evidence package 可以記錄 &lt;code>manual refund repair path not yet sampled&lt;/code>。這個 known gap 會限制 cutover decision，並回寫成後續 validation query 或 audit log coverage 的改善項。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Known gap 要描述缺口內容、影響範圍、目前風險、owner 與 follow-up。它要支援 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/confidence/" data-link-title="Confidence" data-link-desc="說明證據包如何標示 confirmed、suspected 或 needs follow-up 的判讀信心">confidence&lt;/a> 分級，避免 evidence package 看起來完整，但實際漏掉高風險路徑。&lt;/p></description><content:encoded><![CDATA[<p>Known gap 的核心概念是「把已知但尚未覆蓋的證據缺口寫進 artifact」。它連接 <a href="/blog/backend/knowledge-cards/evidence-package/" data-link-title="Evidence Package" data-link-desc="說明觀測、驗證與事故流程如何把證據包成可交接、可回放的 artifact">evidence package</a>、<a href="/blog/backend/knowledge-cards/data-quality/" data-link-title="Data Quality" data-link-desc="說明證據欄位如何標示 completeness、freshness、sampling 與資料限制">data quality</a> 與 <a href="/blog/backend/knowledge-cards/action-item-closure/" data-link-title="Action Item Closure" data-link-desc="說明事故行動項如何被驗證完成，而不是只停留在待辦清單">action item closure</a>，讓缺口能被追蹤、交班與回寫。</p>
<h2 id="概念位置">概念位置</h2>
<p>Known gap 位在 <a href="/blog/backend/knowledge-cards/confidence/" data-link-title="Confidence" data-link-desc="說明證據包如何標示 confirmed、suspected 或 needs follow-up 的判讀信心">confidence</a>、<a href="/blog/backend/knowledge-cards/query-link/" data-link-title="Query Link" data-link-desc="說明證據包如何保存可重跑查詢入口，而不是只保留截圖或口頭結論">query link</a> 與 <a href="/blog/backend/knowledge-cards/post-incident-review/" data-link-title="Post-Incident Review" data-link-desc="說明事故後如何完成復盤、學習與改進閉環">post-incident review</a> 之間。Data quality 說明資料限制，known gap 則列出目前尚未被證據覆蓋的具體範圍。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<p>系統需要 known gap 的訊號是：</p>
<ul>
<li>某些 tenant、region、callback path 或 manual repair path 未被抽樣</li>
<li>trace 或 log 缺少關鍵 span / field</li>
<li>release gate 放行時仍有需要 follow-up 的證據缺口</li>
<li>PIR 需要把缺口回寫成 readiness 或 observability 改善項</li>
</ul>
<h2 id="接近真實網路服務的例子">接近真實網路服務的例子</h2>
<p>資料庫 migration evidence package 可以記錄 <code>manual refund repair path not yet sampled</code>。這個 known gap 會限制 cutover decision，並回寫成後續 validation query 或 audit log coverage 的改善項。</p>
<h2 id="設計責任">設計責任</h2>
<p>Known gap 要描述缺口內容、影響範圍、目前風險、owner 與 follow-up。它要支援 <a href="/blog/backend/knowledge-cards/confidence/" data-link-title="Confidence" data-link-desc="說明證據包如何標示 confirmed、suspected 或 needs follow-up 的判讀信心">confidence</a> 分級，避免 evidence package 看起來完整，但實際漏掉高風險路徑。</p>
]]></content:encoded></item><item><title>Outbound Tunnel</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/outbound-tunnel/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/outbound-tunnel/</guid><description>&lt;p>Outbound tunnel 是一種入口形態：本機進程主動對外連到邊緣節點，把流量沿反向隧道帶回來，路由器零開 port、對公網零入站面。跟傳統 port-forward（從外往內開 port）的責任方向相反 — 連線由內部發起、外部只能沿已建立的隧道回來。與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/load-balancer/" data-link-title="Load Balancer" data-link-desc="說明流量如何分散、排空與導向健康節點">load balancer&lt;/a> 的責任方向不同：LB 假設 instance 有公開可達位址，tunnel 由內部主動外連。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Outbound tunnel 位在本機進程與公網之間，取代傳統的 port-forward 或 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/load-balancer/" data-link-title="Load Balancer" data-link-desc="說明流量如何分散、排空與導向健康節點">load balancer&lt;/a> 入口。常與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/tls-mtls/" data-link-title="TLS / mTLS" data-link-desc="說明傳輸加密與雙向憑證驗證如何保護跨邊界資料流">TLS / mTLS&lt;/a> 搭配保護隧道內的傳輸安全，認證則疊在 tunnel 之後由 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/authentication-middleware/" data-link-title="Authentication Middleware" data-link-desc="說明請求進入 handler 前如何完成身份驗證">authentication middleware&lt;/a> 處理。&lt;/p>
&lt;p>常見實作包括 cloudflared（綁 Cloudflare 邊緣）和 Tailscale（WireGuard mesh VPN）。隧道網址是位址、不是密碼 — 認證必須疊在 tunnel 之後。&lt;/p>
&lt;p>深入：&lt;a href="https://tarrragon.github.io/blog/backend/05-deployment-platform/outbound-tunnel-entry/" data-link-title="5.10 Outbound Tunnel 入口與生命週期" data-link-desc="整理 cloudflared / Tailscale 等反向隧道的入口形態、生命週期合約與故障模式">5.10 Outbound Tunnel 入口與生命週期&lt;/a>。選型案例：&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/cases/remote-shell-access-tailscale-vs-cloudflare-tunnel/" data-link-title="7.C11 選型：單人遠端 Shell — Tailscale vs Cloudflare Tunnel" data-link-desc="以「手機遠端操作本機 shell」為情境，比較 Tailscale mesh VPN 與 Cloudflare Tunnel &amp;#43; Access 兩種存取模型的選型判讀。">7.C11 Tailscale vs Cloudflare Tunnel&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>Outbound tunnel 是一種入口形態：本機進程主動對外連到邊緣節點，把流量沿反向隧道帶回來，路由器零開 port、對公網零入站面。跟傳統 port-forward（從外往內開 port）的責任方向相反 — 連線由內部發起、外部只能沿已建立的隧道回來。與 <a href="/blog/backend/knowledge-cards/load-balancer/" data-link-title="Load Balancer" data-link-desc="說明流量如何分散、排空與導向健康節點">load balancer</a> 的責任方向不同：LB 假設 instance 有公開可達位址，tunnel 由內部主動外連。</p>
<h2 id="概念位置">概念位置</h2>
<p>Outbound tunnel 位在本機進程與公網之間，取代傳統的 port-forward 或 <a href="/blog/backend/knowledge-cards/load-balancer/" data-link-title="Load Balancer" data-link-desc="說明流量如何分散、排空與導向健康節點">load balancer</a> 入口。常與 <a href="/blog/backend/knowledge-cards/tls-mtls/" data-link-title="TLS / mTLS" data-link-desc="說明傳輸加密與雙向憑證驗證如何保護跨邊界資料流">TLS / mTLS</a> 搭配保護隧道內的傳輸安全，認證則疊在 tunnel 之後由 <a href="/blog/backend/knowledge-cards/authentication-middleware/" data-link-title="Authentication Middleware" data-link-desc="說明請求進入 handler 前如何完成身份驗證">authentication middleware</a> 處理。</p>
<p>常見實作包括 cloudflared（綁 Cloudflare 邊緣）和 Tailscale（WireGuard mesh VPN）。隧道網址是位址、不是密碼 — 認證必須疊在 tunnel 之後。</p>
<p>深入：<a href="/blog/backend/05-deployment-platform/outbound-tunnel-entry/" data-link-title="5.10 Outbound Tunnel 入口與生命週期" data-link-desc="整理 cloudflared / Tailscale 等反向隧道的入口形態、生命週期合約與故障模式">5.10 Outbound Tunnel 入口與生命週期</a>。選型案例：<a href="/blog/backend/07-security-data-protection/cases/remote-shell-access-tailscale-vs-cloudflare-tunnel/" data-link-title="7.C11 選型：單人遠端 Shell — Tailscale vs Cloudflare Tunnel" data-link-desc="以「手機遠端操作本機 shell」為情境，比較 Tailscale mesh VPN 與 Cloudflare Tunnel &#43; Access 兩種存取模型的選型判讀。">7.C11 Tailscale vs Cloudflare Tunnel</a>。</p>
]]></content:encoded></item></channel></rss>