<?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>教材結構 on Tarragon</title><link>https://tarrragon.github.io/blog/tags/%E6%95%99%E6%9D%90%E7%B5%90%E6%A7%8B/</link><description>Recent content in 教材結構 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 20 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/%E6%95%99%E6%9D%90%E7%B5%90%E6%A7%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>新增頂層 content 資料夾要同步首頁 _index.md 入口</title><link>https://tarrragon.github.io/blog/report/top-level-content-folder-needs-homepage-entry/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/top-level-content-folder-needs-homepage-entry/</guid><description>&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>新增頂層 content 資料夾的同個 commit、必須同步把該模組入口加進首頁 &lt;code>content/_index.md&lt;/code> 的對應分類段。Hugo 不會自動把 content/ 下的頂層目錄列在首頁、首頁完全靠 &lt;code>content/_index.md&lt;/code> 的 markdown 內容渲染。模組內部建得再完整、首頁沒入口 = 該模組對新讀者不可發現。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>動作&lt;/th>
 &lt;th>是否會在首頁顯示&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>建立 &lt;code>content/&amp;lt;module&amp;gt;/_index.md&lt;/code>&lt;/td>
 &lt;td>不會、Hugo 不 auto-list 頂層目錄&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>在 &lt;code>hugo.toml&lt;/code> 加 &lt;code>[[menu.main]]&lt;/code> entry&lt;/td>
 &lt;td>顯示在頂部選單、跟首頁清單無關&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>在 &lt;code>content/_index.md&lt;/code> 對應分類段加 markdown link&lt;/td>
 &lt;td>顯示在首頁&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>判別問題：「&lt;strong>新讀者從首頁進來、能不能 1-2 個 click 走到該模組？&lt;/strong>」答案是「不能」就是入口斷裂。&lt;/p>
&lt;hr>
&lt;h2 id="情境">情境&lt;/h2>
&lt;p>建立新教學模組（例：&lt;code>content/business/&lt;/code>）走 case-first 完整流程：寫 &lt;code>_index.md&lt;/code>、批次建 knowledge-cards、補 reading-frameworks、寫 case-analyses 文章、跑 mdtools 三項檢查、commit + push。模組內部 50 個檔案全綠、卡片網路雙向連結完整、case-first + agent team review 跑完。&lt;/p>
&lt;p>問題是首頁 &lt;code>content/_index.md&lt;/code> 的「教學系列」段沒同步更新、business 模組從首頁進入的入口完全缺席。讀者反饋「我在 blog 首頁沒看到商業這個分類」之前、新模組對 organic traffic 是隱形的。&lt;/p>
&lt;p>具體 case：c2c01bf 建立 &lt;code>content/business/&lt;/code> 50 個檔案、但 &lt;code>content/_index.md&lt;/code> 的 &lt;code>## 教學系列&lt;/code> 段沒加 &lt;code>[商業概念與策略分析](/business/)&lt;/code> 入口；f665e6d 才補上。這個 gap 在過去 backend / llm / ci 等模組可能也遇過、但當時由建立者順手補上、沒成為被紀錄的 retrospective、所以 pattern 沒浮現。&lt;/p>
&lt;hr>
&lt;h2 id="理想做法">理想做法&lt;/h2>
&lt;h3 id="第一步把新增頂層資料夾跟首頁入口綁成同一個-commit">第一步：把「新增頂層資料夾」跟「首頁入口」綁成同一個 commit&lt;/h3>
&lt;p>寫新模組的 PR / commit 時、把 &lt;code>content/_index.md&lt;/code> 的修改一起放進去。Commit message 明確點出兩件事：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">business: 新增商業教材模組 + 首頁入口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">- content/business/ 50 檔
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">- content/_index.md 教學系列段加入口&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>避免拆兩個 commit、避免「下個 PR 再補」。&lt;/p>
&lt;h3 id="第二步完稿檢查清單加一條">第二步：完稿檢查清單加一條&lt;/h3>
&lt;p>AGENTS.md 完稿檢查清單明列：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">- [ ] 新增頂層 content/&amp;lt;module&amp;gt;/ 資料夾時、已同步更新 content/_index.md 對應分類段&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>寫完模組準備 commit 前、過 checklist 時會被 catch。&lt;/p>
&lt;h3 id="第三步考慮工具化可選不強制">第三步：考慮工具化（可選、不強制）&lt;/h3>
&lt;p>長期可寫 mdtools check：列出 &lt;code>content/&lt;/code> 頂層資料夾、跟 &lt;code>content/_index.md&lt;/code> 的 markdown link 比對、缺的警告。但這個 check 有 false positive 風險（不是所有資料夾都該上首頁、例如 &lt;code>record&lt;/code> / &lt;code>report&lt;/code> / &lt;code>work-log&lt;/code> 是已存在但獨立的 surface、&lt;code>tags&lt;/code> 是 Hugo 自動產生），實作前先設計 whitelist 機制。建議優先靠 checklist、不急著工具化。&lt;/p>
&lt;hr>
&lt;h2 id="沒這樣做的麻煩">沒這樣做的麻煩&lt;/h2>
&lt;h3 id="新模組對首頁讀者完全不可發現">新模組對首頁讀者完全不可發現&lt;/h3>
&lt;p>讀者從 blog 首頁進來、看到的是 &lt;code>content/_index.md&lt;/code> 渲染的內容。新模組沒在那個 markdown 裡 = 該模組對 organic traffic 完全消失。內部結構建得再好、卡片再多、case 寫得再深、新讀者進不來 = 等於沒上線。Search 跟 sitemap 是備援、不是主要入口。&lt;/p>
&lt;h3 id="補救拆成第二個-commit歷史變零碎">補救拆成第二個 commit、歷史變零碎&lt;/h3>
&lt;p>漏掉的入口要事後補、commit 歷史會變成「建模組」+「補首頁入口」兩個 commit。如果在多個 PR 之間，補入口 commit 容易被誤判為瑣碎的 typo fix、reviewer 不會深究、變成 silent fix。&lt;/p></description><content:encoded><![CDATA[<h2 id="核心原則">核心原則</h2>
<p>新增頂層 content 資料夾的同個 commit、必須同步把該模組入口加進首頁 <code>content/_index.md</code> 的對應分類段。Hugo 不會自動把 content/ 下的頂層目錄列在首頁、首頁完全靠 <code>content/_index.md</code> 的 markdown 內容渲染。模組內部建得再完整、首頁沒入口 = 該模組對新讀者不可發現。</p>
<table>
  <thead>
      <tr>
          <th>動作</th>
          <th>是否會在首頁顯示</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>建立 <code>content/&lt;module&gt;/_index.md</code></td>
          <td>不會、Hugo 不 auto-list 頂層目錄</td>
      </tr>
      <tr>
          <td>在 <code>hugo.toml</code> 加 <code>[[menu.main]]</code> entry</td>
          <td>顯示在頂部選單、跟首頁清單無關</td>
      </tr>
      <tr>
          <td>在 <code>content/_index.md</code> 對應分類段加 markdown link</td>
          <td>顯示在首頁</td>
      </tr>
  </tbody>
</table>
<p>判別問題：「<strong>新讀者從首頁進來、能不能 1-2 個 click 走到該模組？</strong>」答案是「不能」就是入口斷裂。</p>
<hr>
<h2 id="情境">情境</h2>
<p>建立新教學模組（例：<code>content/business/</code>）走 case-first 完整流程：寫 <code>_index.md</code>、批次建 knowledge-cards、補 reading-frameworks、寫 case-analyses 文章、跑 mdtools 三項檢查、commit + push。模組內部 50 個檔案全綠、卡片網路雙向連結完整、case-first + agent team review 跑完。</p>
<p>問題是首頁 <code>content/_index.md</code> 的「教學系列」段沒同步更新、business 模組從首頁進入的入口完全缺席。讀者反饋「我在 blog 首頁沒看到商業這個分類」之前、新模組對 organic traffic 是隱形的。</p>
<p>具體 case：c2c01bf 建立 <code>content/business/</code> 50 個檔案、但 <code>content/_index.md</code> 的 <code>## 教學系列</code> 段沒加 <code>[商業概念與策略分析](/business/)</code> 入口；f665e6d 才補上。這個 gap 在過去 backend / llm / ci 等模組可能也遇過、但當時由建立者順手補上、沒成為被紀錄的 retrospective、所以 pattern 沒浮現。</p>
<hr>
<h2 id="理想做法">理想做法</h2>
<h3 id="第一步把新增頂層資料夾跟首頁入口綁成同一個-commit">第一步：把「新增頂層資料夾」跟「首頁入口」綁成同一個 commit</h3>
<p>寫新模組的 PR / commit 時、把 <code>content/_index.md</code> 的修改一起放進去。Commit message 明確點出兩件事：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">business: 新增商業教材模組 + 首頁入口
</span></span><span class="line"><span class="ln">2</span><span class="cl">
</span></span><span class="line"><span class="ln">3</span><span class="cl">- content/business/ 50 檔
</span></span><span class="line"><span class="ln">4</span><span class="cl">- content/_index.md 教學系列段加入口</span></span></code></pre></div><p>避免拆兩個 commit、避免「下個 PR 再補」。</p>
<h3 id="第二步完稿檢查清單加一條">第二步：完稿檢查清單加一條</h3>
<p>AGENTS.md 完稿檢查清單明列：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">- [ ] 新增頂層 content/&lt;module&gt;/ 資料夾時、已同步更新 content/_index.md 對應分類段</span></span></code></pre></div><p>寫完模組準備 commit 前、過 checklist 時會被 catch。</p>
<h3 id="第三步考慮工具化可選不強制">第三步：考慮工具化（可選、不強制）</h3>
<p>長期可寫 mdtools check：列出 <code>content/</code> 頂層資料夾、跟 <code>content/_index.md</code> 的 markdown link 比對、缺的警告。但這個 check 有 false positive 風險（不是所有資料夾都該上首頁、例如 <code>record</code> / <code>report</code> / <code>work-log</code> 是已存在但獨立的 surface、<code>tags</code> 是 Hugo 自動產生），實作前先設計 whitelist 機制。建議優先靠 checklist、不急著工具化。</p>
<hr>
<h2 id="沒這樣做的麻煩">沒這樣做的麻煩</h2>
<h3 id="新模組對首頁讀者完全不可發現">新模組對首頁讀者完全不可發現</h3>
<p>讀者從 blog 首頁進來、看到的是 <code>content/_index.md</code> 渲染的內容。新模組沒在那個 markdown 裡 = 該模組對 organic traffic 完全消失。內部結構建得再好、卡片再多、case 寫得再深、新讀者進不來 = 等於沒上線。Search 跟 sitemap 是備援、不是主要入口。</p>
<h3 id="補救拆成第二個-commit歷史變零碎">補救拆成第二個 commit、歷史變零碎</h3>
<p>漏掉的入口要事後補、commit 歷史會變成「建模組」+「補首頁入口」兩個 commit。如果在多個 PR 之間，補入口 commit 容易被誤判為瑣碎的 typo fix、reviewer 不會深究、變成 silent fix。</p>
<h3 id="pattern-不紀錄每個新模組都重蹈覆轍">Pattern 不紀錄、每個新模組都重蹈覆轍</h3>
<p>backend / llm / ci 等過去新模組可能也遇過相同 gap、但當時被建立者順手補了、沒成為被紀錄的 retrospective。Pattern 不浮現 = 下個建模組者重蹈覆轍。本卡的責任就是把這個 pattern 紀錄下來、進完稿檢查清單後變成結構性保證。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><strong><a href="../single-source-of-truth/">#44 Single Source of Truth</a></strong>：本卡是 #44 在「首頁清單」維度的具體案例。<code>content/_index.md</code> 的「教學系列」段是讀者入口的 SSoT、不是 auto-derived from filesystem。建立模組時這個 SSoT 沒同步 = SSoT 違反。</li>
<li><strong><a href="../metadata-surface-in-writing-review/">#97 Metadata surface 要納入寫作 review 範圍</a></strong>：本卡是 #97 在「上一層 surface」的具體形態。一個模組的 metadata surface 不只是它自己的 title / description / heading、還包括「上一層索引怎麼提它」— 首頁清單就是 module 的上層 metadata surface、跟模組內 metadata 一樣值得納入 review。</li>
<li><strong><a href="../teaching-completeness-by-learner-journey/">#131 教材完整性要用讀者旅程驗證</a></strong>：本卡是 #131 在「讀者旅程起點」的具體 gotcha。讀者旅程的入口是首頁、首頁沒 link 等於旅程斷在 step 0。模組內部教學完整性再高、入口斷裂就是 0-completion。</li>
<li><strong><a href="../multi-pass-scope-must-cover-risk-zone/">#95 Multi-pass scope 要蓋同類風險區</a></strong>：本卡跟 #95 的關係是「同類風險區包括上游引用點」。寫新模組時 scope 不只限模組內部、要涵蓋上游引用該模組的所有位置（首頁 / sibling 模組 _index.md cross-link / <code>AGENTS.md</code> / <code>CLAUDE.md</code>）。</li>
</ul>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>徵兆</th>
          <th>該做的事</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Commit 建了新頂層 <code>content/&lt;module&gt;/</code> 但沒動 <code>content/_index.md</code></td>
          <td>check 首頁入口、補同 commit 或下個 commit 立刻補 + 寫 retro 卡</td>
      </tr>
      <tr>
          <td>讀者反饋「我在首頁沒看到 X」</td>
          <td>too late、應在建模組同 commit 修；同步紀錄 retro 確認 pattern</td>
      </tr>
      <tr>
          <td>不確定首頁清單是否自動產生</td>
          <td>不是、<code>content/_index.md</code> 是手動 markdown、Hugo 不 auto-list</td>
      </tr>
      <tr>
          <td>完稿檢查清單沒列「同步首頁入口」</td>
          <td>補進 <code>AGENTS.md</code> 完稿檢查清單</td>
      </tr>
      <tr>
          <td>Sibling 模組 <code>_index.md</code> 提到新模組時沒 cross-link</td>
          <td>同類風險、scope 要蓋所有上游引用點、不只首頁</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="適用範圍與邊界">適用範圍與邊界</h2>
<ul>
<li><strong>適用範圍</strong>：
<ul>
<li>新增 <code>content/&lt;module&gt;/</code> 頂層教學資料夾（Backend / LLM / CI / Business / 未來新模組）</li>
<li>把既有頂層資料夾「升格」成正式教學系列（例如從草稿區抽出獨立 surface）</li>
</ul>
</li>
<li><strong>不適用</strong>：
<ul>
<li>新增現有模組的子章節（例如 <code>content/backend/01-database/</code> 下新檔）— 這由模組自己的 <code>_index.md</code> 路由、不涉及首頁</li>
<li>新增 <code>content/posts/</code> 下單篇文章 — posts 是 chronological feed、首頁分類段不負責列每篇文章</li>
<li>新增 <code>content/work-log/</code> 或 <code>content/report/</code> 下單張卡片 — 同上、這些是已建立的 surface、清單在各自 <code>_index.md</code></li>
</ul>
</li>
<li><strong>邊界</strong>：本卡只處理「首頁入口」一個 surface；其他上游引用點（例如 sibling 模組 <code>_index.md</code> 提及本模組、<code>AGENTS.md</code> 提及本模組、<code>CLAUDE.md</code> 提及本模組）是同 pattern 的延伸、但個別 cross-link 要靠該位置自己的 review 維護</li>
</ul>
]]></content:encoded></item></channel></rss>