<?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>Case-First on Tarragon</title><link>https://tarrragon.github.io/blog/tags/case-first/</link><description>Recent content in Case-First on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 18 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/case-first/index.xml" rel="self" type="application/rss+xml"/><item><title>Vendor 深度技術文章方法論的演化紀錄：同 vendor 系列的開場輪替驗證</title><link>https://tarrragon.github.io/blog/posts/vendor-%E6%B7%B1%E5%BA%A6%E6%8A%80%E8%A1%93%E6%96%87%E7%AB%A0%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84%E5%90%8C-vendor-%E7%B3%BB%E5%88%97%E7%9A%84%E9%96%8B%E5%A0%B4%E8%BC%AA%E6%9B%BF%E9%A9%97%E8%AD%89/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/posts/vendor-%E6%B7%B1%E5%BA%A6%E6%8A%80%E8%A1%93%E6%96%87%E7%AB%A0%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84%E5%90%8C-vendor-%E7%B3%BB%E5%88%97%E7%9A%84%E9%96%8B%E5%A0%B4%E8%BC%AA%E6%9B%BF%E9%A9%97%E8%AD%89/</guid><description>&lt;p>Vendor overview 寫完後、往下寫單一功能深度文章時，選題與結構需要不同的方法論。操作步驟維護在 &lt;code>.claude/skills/vendor-deep-article/&lt;/code>，本文記錄這套方法論從兩輪 batch 中演化出來的過程，重點是 cadence collapse（批量寫作時開場句型同質化重複）怎麼被寫前的 variant 規劃（每篇預先指定不同開場 framing）解決。&lt;/p>
&lt;h2 id="背景">背景&lt;/h2>
&lt;p>本 blog 的 backend 教學模組已完成多個 vendor overview。overview 層飽和後、自然的下一步是 overview 頁尾「預計實作話題」backlog 的深度文章。&lt;/p>
&lt;p>寫了 deep article + migration playbook 後、確認 deep article 跟 overview 是不同產品、需要自己的方法論。差異見 &lt;a href="https://tarrragon.github.io/blog/posts/migration-playbook-%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84stage-0-variant-%E8%A6%8F%E5%8A%83%E6%8A%8A-collapse-%E7%8E%87%E5%BE%9E-60-%E9%99%8D%E5%88%B0-0/" data-link-title="Migration Playbook 方法論的演化紀錄：Stage 0 variant 規劃把 collapse 率從 60% 降到 0%" data-link-desc="跨 vendor migration playbook 需要獨立寫作方法論的依據，以及這套方法論從三輪 batch dogfood 中演化出來的驗證證據。">migration playbook 方法論演化紀錄&lt;/a>。&lt;/p>
&lt;h2 id="第一輪-batch5-篇跨-vendor5-種-entry-framing">第一輪 batch（5 篇）：跨 vendor、5 種 entry framing&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>篇&lt;/th>
 &lt;th>Variant&lt;/th>
 &lt;th>章節 1 entry framing&lt;/th>
 &lt;th>行數&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/postgresql/pgbouncer-config/" data-link-title="PostgreSQL pgBouncer 配置 &amp;#43; 連線池治理" data-link-desc="pgBouncer transaction pooling 配置、跟 application connection pool 的分層、production 故障演練（pool exhaustion / stale connection / DNS failover）跟容量規劃">pgBouncer 配置&lt;/a>&lt;/td>
 &lt;td>A 標準&lt;/td>
 &lt;td>標準「問題情境」&lt;/td>
 &lt;td>263&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/hashicorp-vault/dynamic-credential/" data-link-title="HashiCorp Vault Dynamic Credential：lease 治理跟 application 整合的實作層" data-link-desc="Vault database secrets engine 怎麼配、application 怎麼 renew lease、production 五大踩雷（lease 過期 race、DB max_connections 撞牆、Vault sealed、token expire、scope 過寬）、容量規劃跟 vault-agent injector 整合">Vault dynamic credential&lt;/a>&lt;/td>
 &lt;td>A 標準&lt;/td>
 &lt;td>標準「問題情境」&lt;/td>
 &lt;td>222&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/backend/05-deployment-platform/vendors/kubernetes/graceful-shutdown/" data-link-title="Kubernetes Graceful Shutdown：termination 序列跟你以為的不一樣" data-link-desc="K8s pod termination 五步序列、preStop / SIGTERM / terminationGracePeriodSeconds 的真實時序、5 個 production 踩雷（500 期間 502、connection drain race、init container 重啟、StatefulSet 串行終止、Job 不 graceful）、跟 service mesh / readiness probe 整合">K8s graceful shutdown&lt;/a>&lt;/td>
 &lt;td>B 痛點&lt;/td>
 &lt;td>痛點宣告「沒做對、每次 deploy 都吃 502」&lt;/td>
 &lt;td>213&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/splunk/risk-based-alerting/" data-link-title="Splunk Risk-Based Alerting：從 alert per rule 到 score-aggregated notable" data-link-desc="Splunk Enterprise Security 的 RBA 方法論：risk score / modifier / notable 三層 model、ES 配置 step-by-step、tuning playbook（false positive / score inflation / threshold drift / decay）、capacity 成本、跟 SOAR &amp;#43; case management 整合">Splunk RBA&lt;/a>&lt;/td>
 &lt;td>C 反向&lt;/td>
 &lt;td>概念反向定義「alert fatigue 是 detection 天花板」&lt;/td>
 &lt;td>193&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudflare-waf/page-shield-csp-sri/" data-link-title="Cloudflare Page Shield：用 CSP &amp;#43; SRI &amp;#43; script monitoring 防 client-side supply chain" data-link-desc="Page Shield 三層防禦（CSP / SRI / script monitoring）對應 Magecart / formjacking / skimmer / 第三方 SDK 注入的不同 attack pattern、Cloudflare dashboard &amp;#43; API 配置、四個 production 踩雷（inline script 漏 / dynamic loader / CSP report 噪音 / SRI hash mismatch）、跟 dev workflow &amp;#43; WAF 整合">Cloudflare Page Shield&lt;/a>&lt;/td>
 &lt;td>D 對照表&lt;/td>
 &lt;td>對照表驅動「Attack pattern x Defense mechanism」&lt;/td>
 &lt;td>214&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>第一輪確認了結構 framework 成立、且章節名可隨主題調整。&lt;/p></description><content:encoded><![CDATA[<p>Vendor overview 寫完後、往下寫單一功能深度文章時，選題與結構需要不同的方法論。操作步驟維護在 <code>.claude/skills/vendor-deep-article/</code>，本文記錄這套方法論從兩輪 batch 中演化出來的過程，重點是 cadence collapse（批量寫作時開場句型同質化重複）怎麼被寫前的 variant 規劃（每篇預先指定不同開場 framing）解決。</p>
<h2 id="背景">背景</h2>
<p>本 blog 的 backend 教學模組已完成多個 vendor overview。overview 層飽和後、自然的下一步是 overview 頁尾「預計實作話題」backlog 的深度文章。</p>
<p>寫了 deep article + migration playbook 後、確認 deep article 跟 overview 是不同產品、需要自己的方法論。差異見 <a href="/blog/posts/migration-playbook-%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84stage-0-variant-%E8%A6%8F%E5%8A%83%E6%8A%8A-collapse-%E7%8E%87%E5%BE%9E-60-%E9%99%8D%E5%88%B0-0/" data-link-title="Migration Playbook 方法論的演化紀錄：Stage 0 variant 規劃把 collapse 率從 60% 降到 0%" data-link-desc="跨 vendor migration playbook 需要獨立寫作方法論的依據，以及這套方法論從三輪 batch dogfood 中演化出來的驗證證據。">migration playbook 方法論演化紀錄</a>。</p>
<h2 id="第一輪-batch5-篇跨-vendor5-種-entry-framing">第一輪 batch（5 篇）：跨 vendor、5 種 entry framing</h2>
<table>
  <thead>
      <tr>
          <th>篇</th>
          <th>Variant</th>
          <th>章節 1 entry framing</th>
          <th>行數</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/01-database/vendors/postgresql/pgbouncer-config/" data-link-title="PostgreSQL pgBouncer 配置 &#43; 連線池治理" data-link-desc="pgBouncer transaction pooling 配置、跟 application connection pool 的分層、production 故障演練（pool exhaustion / stale connection / DNS failover）跟容量規劃">pgBouncer 配置</a></td>
          <td>A 標準</td>
          <td>標準「問題情境」</td>
          <td>263</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/dynamic-credential/" data-link-title="HashiCorp Vault Dynamic Credential：lease 治理跟 application 整合的實作層" data-link-desc="Vault database secrets engine 怎麼配、application 怎麼 renew lease、production 五大踩雷（lease 過期 race、DB max_connections 撞牆、Vault sealed、token expire、scope 過寬）、容量規劃跟 vault-agent injector 整合">Vault dynamic credential</a></td>
          <td>A 標準</td>
          <td>標準「問題情境」</td>
          <td>222</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/05-deployment-platform/vendors/kubernetes/graceful-shutdown/" data-link-title="Kubernetes Graceful Shutdown：termination 序列跟你以為的不一樣" data-link-desc="K8s pod termination 五步序列、preStop / SIGTERM / terminationGracePeriodSeconds 的真實時序、5 個 production 踩雷（500 期間 502、connection drain race、init container 重啟、StatefulSet 串行終止、Job 不 graceful）、跟 service mesh / readiness probe 整合">K8s graceful shutdown</a></td>
          <td>B 痛點</td>
          <td>痛點宣告「沒做對、每次 deploy 都吃 502」</td>
          <td>213</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/vendors/splunk/risk-based-alerting/" data-link-title="Splunk Risk-Based Alerting：從 alert per rule 到 score-aggregated notable" data-link-desc="Splunk Enterprise Security 的 RBA 方法論：risk score / modifier / notable 三層 model、ES 配置 step-by-step、tuning playbook（false positive / score inflation / threshold drift / decay）、capacity 成本、跟 SOAR &#43; case management 整合">Splunk RBA</a></td>
          <td>C 反向</td>
          <td>概念反向定義「alert fatigue 是 detection 天花板」</td>
          <td>193</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/page-shield-csp-sri/" data-link-title="Cloudflare Page Shield：用 CSP &#43; SRI &#43; script monitoring 防 client-side supply chain" data-link-desc="Page Shield 三層防禦（CSP / SRI / script monitoring）對應 Magecart / formjacking / skimmer / 第三方 SDK 注入的不同 attack pattern、Cloudflare dashboard &#43; API 配置、四個 production 踩雷（inline script 漏 / dynamic loader / CSP report 噪音 / SRI hash mismatch）、跟 dev workflow &#43; WAF 整合">Cloudflare Page Shield</a></td>
          <td>D 對照表</td>
          <td>對照表驅動「Attack pattern x Defense mechanism」</td>
          <td>214</td>
      </tr>
  </tbody>
</table>
<p>第一輪確認了結構 framework 成立、且章節名可隨主題調整。</p>
<h3 id="6-段-framework-成立但章節名可變">6 段 framework 成立但章節名可變</h3>
<p>6 段內容指引（問題情境 → 概念 → 配置 → 演練 → 容量 → 整合）在 5 篇都成立。但章節 1 的 framing 因主題本質不同自然分化 — 5 種 entry framing 都成立、章節 1 不必死守「問題情境」標題。</p>
<p>據此小修方法論：6 段 framework 是內容指引、不是章節標題模板。</p>
<h3 id="cadence-collapse-0--主動-variant-有效">Cadence collapse 0% — 主動 variant 有效</h3>
<p>後 4 篇寫作前主動規劃 4 種 framing variant。跟 backend/07 的 51 vendor batch 對照：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>backend/07 51 vendor</th>
          <th>deep article 後 4 篇</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Cadence「任一缺失」族重複</td>
          <td>51/51 (100%)</td>
          <td>0/4 (0%)</td>
      </tr>
      <tr>
          <td>章節 1 entry framing 種類</td>
          <td>1 種</td>
          <td>4 種</td>
      </tr>
  </tbody>
</table>
<h3 id="reviewer-單人足夠">Reviewer 單人足夠</h3>
<p>deep article 焦點窄（單一 feature）、跨章 frame 重複風險低、case 引用密度低（1-2 個對照）。5 篇都採單一 reviewer 流程、未出現需要 multi-axis review 的盲點。</p>
<h2 id="第二輪-batch5-篇同-vendor-sub-tool-系列最高-collapse-風險">第二輪 batch（5 篇）：同 vendor sub-tool 系列、最高 collapse 風險</h2>
<p>第二輪刻意選 cadence collapse 最高風險場景：5 篇 PostgreSQL sub-tool deep article、同 vendor / 同 article type / 同 audience / 同 6-section framework。</p>
<table>
  <thead>
      <tr>
          <th>篇</th>
          <th>Variant</th>
          <th>章節 1 entry framing</th>
          <th>行數</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/01-database/vendors/postgresql/patroni-ha/" data-link-title="PostgreSQL Patroni HA：從 leader 失聯到 client 重連的 5 段 failover lifecycle" data-link-desc="Patroni 把 PostgreSQL HA 拆成 detection / election / promotion / reconfiguration / recovery 五段 lifecycle、每段都有獨立配置跟 failure mode；DCS quorum &#43; watchdog 防 split-brain、async/sync replication 取捨、5 個 production 踩雷、跟 PgBouncer / HAProxy / cert-manager 整合">Patroni HA</a></td>
          <td>E lifecycle-driven</td>
          <td>「Failover lifecycle 5 段不是一條曲線」</td>
          <td>243</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/01-database/vendors/postgresql/autovacuum-tuning/" data-link-title="PostgreSQL autovacuum tuning：為什麼你的 autovacuum 永遠追不上 bloat" data-link-desc="MVCC 怎麼產生 dead tuple、autovacuum cost-based throttle 為什麼預設保守、per-table tuning 怎麼設、5 個 production 踩雷（cost_limit 太低 / 長 transaction blocks vacuum / anti-wraparound 在 peak / partition vacuum 滿 worker / index bloat 沒處理）、跟 partitioning &#43; monitoring 整合">autovacuum tuning</a></td>
          <td>B pain-driven</td>
          <td>「你的 autovacuum 永遠追不上 bloat — 為什麼」</td>
          <td>202</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/01-database/vendors/postgresql/declarative-partitioning/" data-link-title="PostgreSQL declarative partitioning：partition 不是切表、是讓 planner pruning" data-link-desc="Declarative partitioning 的真實價值是 query planner pruning &#43; maintenance scope 縮小、不是「把大表切小」；RANGE / LIST / HASH 取捨、partition key 選法、5 個 production 踩雷（key 選錯不 prune / unique 不 enforce 跨 partition / ATTACH 鎖太久 / partition 數爆 / DETACH 不 reclaim 空間）、跟 autovacuum &#43; index 設計整合">declarative partitioning</a></td>
          <td>C concept-reversed</td>
          <td>「Partition 不是『把大表切小』、是『讓 planner pruning + 縮小 maintenance scope』」</td>
          <td>244</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/01-database/vendors/postgresql/logical-replication-debezium/" data-link-title="PostgreSQL Logical Replication &#43; Debezium CDC：replication slot × failure × recovery 對照" data-link-desc="PostgreSQL logical replication slot 跟 Debezium CDC 的失效模式對照表：slot lag 撐爆 primary disk / schema change 斷流 / 初始 COPY 鎖表 / zombie slot 不釋放 / replay storm 後 offset reset；publication / subscription / pgoutput 配置、跟 Kafka outbox pattern 整合">logical replication + Debezium</a></td>
          <td>D table-driven</td>
          <td>「Replication slot x Failure x Recovery 對照」</td>
          <td>227</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/01-database/vendors/postgresql/pitr-wal-archiving/" data-link-title="PostgreSQL PITR &#43; WAL archiving：從 base backup 到 point-in-time recovery 的完整鏈" data-link-desc="Base backup &#43; WAL archive 構成 PITR 的雙軌資料、archive_command &#43; restore_command 配置、用 pgBackRest / WAL-G 替代手寫腳本、5 個 production 踩雷（archive 靜默失敗 / archive lag / 錯誤 target time / base backup 過期未清 / timeline 分歧 recovery 模糊）、跟 Patroni &#43; monitoring 整合">PITR + WAL archiving</a></td>
          <td>A standard 6-section</td>
          <td>「問題情境」</td>
          <td>273</td>
      </tr>
  </tbody>
</table>
<p>第二輪在最高風險場景（同 vendor sub-tool）仍維持 collapse 0%，且新增第五種 variant（lifecycle-driven）。</p>
<h3 id="跨兩輪對照">跨兩輪對照</h3>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>第一輪 N=4（跨 vendor）</th>
          <th>第二輪 N=5（同 vendor sub-tool）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Variant 種類</td>
          <td>4（A / B / C / D）</td>
          <td>5（A / B / C / D / E）</td>
      </tr>
      <tr>
          <td>Cadence collapse</td>
          <td>0/4 (0%)</td>
          <td>0/5 (0%)</td>
      </tr>
      <tr>
          <td>章節 1 entry framing 種類</td>
          <td>4</td>
          <td>5</td>
      </tr>
      <tr>
          <td>共同 context</td>
          <td>6-section framework</td>
          <td>6-section + 同 vendor + 同讀者</td>
      </tr>
  </tbody>
</table>
<p>關鍵驗證：</p>
<ol>
<li><strong>N=5 仍 0% collapse</strong>：5 種 variant 在最高風險場景（同 vendor sub-tool）仍完全錯開</li>
<li><strong>5 variant 不耗盡</strong>：5 種變體（lifecycle / pain / reverse / table / standard）對應主題自然進入方式、不是強制配對</li>
<li><strong>cadence audit 最佳位置是進度 60-80%</strong>：進度 10-20% 只有 1 樣本訊號弱、60-80% 有 4 樣本對照訊號強</li>
</ol>
<h2 id="方法論演化小結">方法論演化小結</h2>
<table>
  <thead>
      <tr>
          <th>版本</th>
          <th>修改</th>
          <th>驅動來源</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>v0</td>
          <td>直覺套 overview 11 章節</td>
          <td>第一篇 deep article 不合用</td>
      </tr>
      <tr>
          <td>v1</td>
          <td>6 段結構 + 200-400 行 sweet spot</td>
          <td>第一輪 5 篇 dogfood</td>
      </tr>
      <tr>
          <td>v1.1</td>
          <td>6 段是內容指引、不是章節標題模板</td>
          <td>章節 1 framing 自然分化</td>
      </tr>
      <tr>
          <td>v1.2</td>
          <td>寫作時間預估 2-4hr → 1-2hr</td>
          <td>overview 已建立 context</td>
      </tr>
      <tr>
          <td>v1.3</td>
          <td>cadence audit 抽樣位置 10-20% → 60-80%</td>
          <td>第二輪 N=5 驗證</td>
      </tr>
  </tbody>
</table>
<h2 id="相關連結">相關連結</h2>
<ul>
<li>Vendor Deep Article skill（<code>.claude/skills/vendor-deep-article/</code>）— 操作步驟</li>
<li><a href="/blog/posts/migration-playbook-%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84stage-0-variant-%E8%A6%8F%E5%8A%83%E6%8A%8A-collapse-%E7%8E%87%E5%BE%9E-60-%E9%99%8D%E5%88%B0-0/" data-link-title="Migration Playbook 方法論的演化紀錄：Stage 0 variant 規劃把 collapse 率從 60% 降到 0%" data-link-desc="跨 vendor migration playbook 需要獨立寫作方法論的依據，以及這套方法論從三輪 batch dogfood 中演化出來的驗證證據。">Migration Playbook 方法論演化紀錄</a> — sibling、處理 cross-vendor process</li>
<li><a href="/blog/posts/case-first--agent-team-review%E6%95%99%E5%AD%B8%E5%85%A7%E5%AE%B9%E7%9A%84%E7%94%9F%E7%94%A2%E6%B5%81%E7%A8%8B/" data-link-title="Case-First &#43; Agent Team Review：教學內容的生產流程" data-link-desc="Case-first &#43; agent team review 的教學內容生產流程：讀案例庫抽 findings、專責 reviewer 平行審查、polish pass 收系統性殘留。防止通用 best practice 被誤包裝成案例揭露。">Case-First Agent Team Review Workflow</a> — 教學模組級批次寫作流程</li>
<li><a href="/blog/report/single-function-per-article-sop-vs-retrospective/" data-link-title="一篇文章只承擔一種功能：SOP 跟 retrospective 混寫兩邊都做不好" data-link-desc="文章同時塞操作步驟（SOP）和批次驗證紀錄（retrospective）時，機器讀者找不到可執行的步驟、人類讀者不知道哪段是給自己看的。">#199 一篇文章只承擔一種功能</a> — 本文精簡的依據</li>
</ul>
]]></content:encoded></item></channel></rss>