<?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>Cross-Link on Tarragon</title><link>https://tarrragon.github.io/blog/tags/cross-link/</link><description>Recent content in Cross-Link on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 19 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/cross-link/index.xml" rel="self" type="application/rss+xml"/><item><title>Sibling Vendor Cross-Link 雙向性 Audit：寫 Vendor Batch 結束必跑</title><link>https://tarrragon.github.io/blog/report/sibling-vendor-cross-link-bidirectionality-audit/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/sibling-vendor-cross-link-bidirectionality-audit/</guid><description>&lt;h2 id="核心sibling-vendor-batch-容易單向-cross-link">核心：Sibling vendor batch 容易單向 cross-link&lt;/h2>
&lt;p>當寫 sibling vendor batch（A 跟 B 是同類角色的 vendor）、cross-link 容易單向：&lt;/p>
&lt;ul>
&lt;li>A 是後寫 batch、提 B 多次（「跟 PG sibling 對比」「PG 的 X 行為跟 MySQL 不同」）&lt;/li>
&lt;li>B 是先寫 batch、預設沒提 A（寫的時候 A 還不存在）&lt;/li>
&lt;li>結果：A → B 有 9 條 link、B → A 有 0 條 link&lt;/li>
&lt;/ul>
&lt;p>讀者從 B 進入、看不到 A 的存在；只有從 A 進入才知道兩者並列。&lt;/p>
&lt;p>問題不在 &lt;em>單向 link 本身錯&lt;/em>、在 &lt;em>vendor batch 結束沒跑 bidirectional audit&lt;/em>、就以為「cross-link 已建立」。&lt;/p>
&lt;h2 id="casemysql--postgresql-cross-link-asymmetry">Case：MySQL ↔ PostgreSQL cross-link asymmetry&lt;/h2>
&lt;p>4-reviewer audit（Reviewer B）finding：&lt;/p>
&lt;ul>
&lt;li>MySQL 18 篇對 PG sibling 的 cross-link：9 條（vs PostgreSQL 對比段 / 連到 PG vendor page / 連到 PG sibling article）&lt;/li>
&lt;li>PG 11 篇對 MySQL 的 cross-link：0 條&lt;/li>
&lt;/ul>
&lt;p>讀者站 PG &lt;code>pgbouncer-config&lt;/code> 不會跳到 MySQL &lt;code>proxysql-config&lt;/code>；站 MySQL &lt;code>proxysql-config&lt;/code> 直接看到「跟 PG pgBouncer 對比」段。Navigation asymmetric。&lt;/p>
&lt;h2 id="機制為什麼會單向">機制：為什麼會單向&lt;/h2>
&lt;h3 id="1-寫第二個-batch-時-reference-第一個-batch-是自然行為">1. 寫第二個 batch 時 reference 第一個 batch 是自然行為&lt;/h3>
&lt;p>寫 MySQL &lt;code>replication-topology&lt;/code> 時、PG &lt;code>patroni-ha&lt;/code> 已存在、自然連去做對比。寫 PG &lt;code>patroni-ha&lt;/code> 時、MySQL &lt;code>replication-topology&lt;/code> 還不存在、不可能 link。&lt;/p>
&lt;p>這是 &lt;em>sequential 寫作的時間性結構性&lt;/em>、不是疏忽。&lt;/p>
&lt;h3 id="2-bidirectional-link-audit-不在預設寫作流程">2. Bidirectional link audit 不在預設寫作流程&lt;/h3>
&lt;p>寫完 batch B 後、預設 audit：&lt;/p>
&lt;ul>
&lt;li>lint / cards&lt;/li>
&lt;li>emoji / 裸 URL&lt;/li>
&lt;li>跨檔一致性&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>沒有&lt;/strong> &lt;em>向上回補 sibling A 的 cross-link&lt;/em> 這一步。&lt;/p>
&lt;h3 id="3-sibling-a-寫好後不會自動-trigger-a-的更新">3. Sibling A 寫好後、不會自動 trigger A 的更新&lt;/h3>
&lt;p>寫 vendor batch B 完成時、A 的內容不變、沒人 trigger「現在 sibling B 存在了、A 應該加 cross-link 回 B」。&lt;/p>
&lt;h2 id="修法bidirectional-cross-link-audit">修法：Bidirectional cross-link audit&lt;/h2>
&lt;h3 id="audit-步驟">Audit 步驟&lt;/h3>
&lt;p>寫完 vendor batch B（B 跟 sibling A 存在對應）後、跑：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="c1"># 1. Count A → B link&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">rg -c &lt;span class="s2">&amp;#34;\]\(/path/to/B/&amp;#34;&lt;/span> content/path/to/A/*.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="c1"># 2. Count B → A link&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">rg -c &lt;span class="s2">&amp;#34;\]\(/path/to/A/&amp;#34;&lt;/span> content/path/to/B/*.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">&lt;span class="c1"># 3. 對比&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">&lt;span class="c1"># 若 A→B 顯著少於 B→A、補 A 端 cross-link&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="補-a-端-cross-link-的位置">補 A 端 cross-link 的位置&lt;/h3>
&lt;p>每個 A article 應該在：&lt;/p></description><content:encoded><![CDATA[<h2 id="核心sibling-vendor-batch-容易單向-cross-link">核心：Sibling vendor batch 容易單向 cross-link</h2>
<p>當寫 sibling vendor batch（A 跟 B 是同類角色的 vendor）、cross-link 容易單向：</p>
<ul>
<li>A 是後寫 batch、提 B 多次（「跟 PG sibling 對比」「PG 的 X 行為跟 MySQL 不同」）</li>
<li>B 是先寫 batch、預設沒提 A（寫的時候 A 還不存在）</li>
<li>結果：A → B 有 9 條 link、B → A 有 0 條 link</li>
</ul>
<p>讀者從 B 進入、看不到 A 的存在；只有從 A 進入才知道兩者並列。</p>
<p>問題不在 <em>單向 link 本身錯</em>、在 <em>vendor batch 結束沒跑 bidirectional audit</em>、就以為「cross-link 已建立」。</p>
<h2 id="casemysql--postgresql-cross-link-asymmetry">Case：MySQL ↔ PostgreSQL cross-link asymmetry</h2>
<p>4-reviewer audit（Reviewer B）finding：</p>
<ul>
<li>MySQL 18 篇對 PG sibling 的 cross-link：9 條（vs PostgreSQL 對比段 / 連到 PG vendor page / 連到 PG sibling article）</li>
<li>PG 11 篇對 MySQL 的 cross-link：0 條</li>
</ul>
<p>讀者站 PG <code>pgbouncer-config</code> 不會跳到 MySQL <code>proxysql-config</code>；站 MySQL <code>proxysql-config</code> 直接看到「跟 PG pgBouncer 對比」段。Navigation asymmetric。</p>
<h2 id="機制為什麼會單向">機制：為什麼會單向</h2>
<h3 id="1-寫第二個-batch-時-reference-第一個-batch-是自然行為">1. 寫第二個 batch 時 reference 第一個 batch 是自然行為</h3>
<p>寫 MySQL <code>replication-topology</code> 時、PG <code>patroni-ha</code> 已存在、自然連去做對比。寫 PG <code>patroni-ha</code> 時、MySQL <code>replication-topology</code> 還不存在、不可能 link。</p>
<p>這是 <em>sequential 寫作的時間性結構性</em>、不是疏忽。</p>
<h3 id="2-bidirectional-link-audit-不在預設寫作流程">2. Bidirectional link audit 不在預設寫作流程</h3>
<p>寫完 batch B 後、預設 audit：</p>
<ul>
<li>lint / cards</li>
<li>emoji / 裸 URL</li>
<li>跨檔一致性</li>
</ul>
<p><strong>沒有</strong> <em>向上回補 sibling A 的 cross-link</em> 這一步。</p>
<h3 id="3-sibling-a-寫好後不會自動-trigger-a-的更新">3. Sibling A 寫好後、不會自動 trigger A 的更新</h3>
<p>寫 vendor batch B 完成時、A 的內容不變、沒人 trigger「現在 sibling B 存在了、A 應該加 cross-link 回 B」。</p>
<h2 id="修法bidirectional-cross-link-audit">修法：Bidirectional cross-link audit</h2>
<h3 id="audit-步驟">Audit 步驟</h3>
<p>寫完 vendor batch B（B 跟 sibling A 存在對應）後、跑：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># 1. Count A → B link</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">rg -c <span class="s2">&#34;\]\(/path/to/B/&#34;</span> content/path/to/A/*.md
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># 2. Count B → A link</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">rg -c <span class="s2">&#34;\]\(/path/to/A/&#34;</span> content/path/to/B/*.md
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"># 3. 對比</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="c1"># 若 A→B 顯著少於 B→A、補 A 端 cross-link</span></span></span></code></pre></div><h3 id="補-a-端-cross-link-的位置">補 A 端 cross-link 的位置</h3>
<p>每個 A article 應該在：</p>
<ol>
<li><strong>「相關連結」段</strong> — 列對應 sibling B article</li>
<li><strong>「跟其他 vendor 的取捨」段</strong>（若有） — 提到 sibling B 的對應</li>
<li><strong>「下一步路由」 / 「替代路徑」段</strong> — 列 B 作為 alternative</li>
</ol>
<h3 id="audit-cadence">Audit cadence</h3>
<ul>
<li>每個 sibling vendor batch 寫完、跑一次 bidirectional audit</li>
<li>不只寫完 <em>第二個</em> batch、寫完 <em>第三 / 第四個</em> 也跑（A↔B↔C 三方對稱）</li>
<li>vendors/_index 內容覆蓋進度表加 <code>link_density</code> 欄、揭露 asymmetry</li>
</ul>
<h2 id="跟既有原則的關係">跟既有原則的關係</h2>
<ul>
<li><a href="../sibling-coverage-asymmetry-blindspot-in-priority/">Sibling Coverage Asymmetry Blindspot in Priority</a>：本卡是 cross-link asymmetry、那卡是 coverage asymmetry、同型但不同 axis</li>
<li><a href="../cards-as-living-system-iteration/">Cards as Living System Iteration</a>：cross-link 維護是 living system 部分、不是 one-shot</li>
</ul>
<h2 id="反向驗證">反向驗證</h2>
<p>不該誤用：</p>
<ul>
<li><em>Sibling vendor</em> 限同類角色（PG / MySQL 都 SQL baseline）、不是任意兩個 vendor。MySQL 沒必要 link Spanner（不同類）</li>
<li>雙向不等於 <em>對稱數量</em> — A 18 篇可能有 9 條 link、B 11 篇有 6 條 link 是合理（不是 9 對 9）</li>
<li>Migration playbook 結構性單向（A → B 是遷移、不是 B → A）— 對 migration playbook 是 <em>單向結構</em>、不適用本 audit</li>
</ul>
]]></content:encoded></item></channel></rss>