Every audit uses the same rubric, the same 10 axes, and the same judging prompt — published here in full, per rubric_version 1.0.0. There is no hidden instrument.
A repository is one of exactly two states in the data. Nothing else.
repos.latest_audit_id IS NULL.repos.latest_audit_id points at that audit.Grouped into three families — the idea, the trajectory, the practicals. Full descriptions are in the judging prompt below.
| Axis | Key |
|---|---|
| The idea | |
| Concept | concept |
| Usefulness | usefulness |
| Ergonomics | ergonomics |
| The trajectory | |
| Maturity | maturity |
| Longevity | longevity |
| Openness | openness |
| The practicals | |
| Setup friction | setup_friction |
| Issue health | issue_health |
| Supply-chain hygiene | supply_chain |
| Hype vs. substance | hype_substance |
Four reader-facing composites, each a fixed weighted blend of specific axes.
| Roll-up | Weighted from |
|---|---|
| dependability | Maturity × 0.30 + Longevity × 0.25 + Issue health × 0.25 + Supply-chain hygiene × 0.20 |
| craftsmanship | Concept × 0.25 + Ergonomics × 0.35 + Maturity × 0.25 + Hype vs. substance × 0.15 |
| docs | Ergonomics × 0.45 + Setup friction × 0.40 + Openness × 0.15 |
| trust | Openness × 0.30 + Supply-chain hygiene × 0.30 + Hype vs. substance × 0.40 |
The 10 axes don't all matter equally for every kind of repository — a docs-or-list gets weighted differently from a CLI tool. Weights sum to 100 per archetype and set each axis's share of the composite.
| Axis | library | framework | cli-tool | app | dev-tool | plugin | docs-or-list | learning-resource | template | research-code | creative-asset |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Concept | 12 | 14 | 10 | 12 | 10 | 10 | 20 | 18 | 10 | 16 | 12 |
| Usefulness | 12 | 12 | 14 | 14 | 14 | 12 | 25 | 20 | 12 | 12 | 14 |
| Ergonomics | 14 | 14 | 14 | 10 | 12 | 12 | 10 | 12 | 16 | 8 | 20 |
| Maturity | 10 | 12 | 8 | 10 | 10 | 10 | 5 | 5 | 12 | 8 | 8 |
| Longevity | 10 | 10 | 8 | 8 | 8 | 10 | 10 | 5 | 8 | 4 | 10 |
| Openness | 8 | 8 | 8 | 8 | 8 | 8 | 10 | 10 | 6 | 4 | 8 |
| Setup friction | 8 | 8 | 12 | 12 | 12 | 12 | n/a | 8 | 16 | 16 | 12 |
| Issue health | 8 | 8 | 8 | 8 | 8 | 8 | 5 | 5 | 6 | 4 | 6 |
| Supply-chain hygiene | 10 | 8 | 8 | 8 | 8 | 8 | n/a | n/a | 8 | 8 | 2 |
| Hype vs. substance | 8 | 6 | 10 | 10 | 10 | 10 | 15 | 17 | 6 | 20 | 8 |
Per-archetype axis weights (out of 100 total, "n/a" = axis excluded from the composite for that archetype — e.g. a docs-or-list repo isn't scored on setup friction or supply-chain hygiene). archetype_version 1.1.0.
The composite (0–10) maps onto an 8-band scale, borrowed from credit-rating notation on purpose — it is meant to read as a rating, not a school grade.
| Grade | Composite range |
|---|---|
| AAA | 9.0 – 10.0 |
| AA | 8.0 – 9.0 |
| A | 7.0 – 8.0 |
| BBB | 6.0 – 7.0 |
| BB | 5.0 – 6.0 |
| B | 4.0 – 5.0 |
| CCC | 3.0 – 4.0 |
| CC | 0.0 – 3.0 |
The default composite → recommendation mapping (ADOPT / TRIAL / HOLD / AVOID). Individual audits can diverge from the mechanical mapping when the judge's prose says why.
| Recommendation | Composite range |
|---|---|
| ADOPT | 8.0 – 10.0 |
| TRIAL | 6.5 – 8.0 |
| HOLD | 5.0 – 6.5 |
| AVOID | 0.0 – 5.0 |
Trust bootstrapping: the instrument is public, and so is how it's checked.
Every rubric_version/archetype_version bump — or a change of judge model or effort — is re-run against a fixed calibration set (archetype-stratified, roughly 20 repositories, cloned at pinned commits) before it is allowed to file public audits. Promotion gates check schema validity, citation coverage, inter-run score variance, and drift against reference judgments; thresholds are set empirically and are not currently exposed on this page. The calibration set itself is public.
Audit depth is tiered by star count, so evidence spend tracks how many people a verdict serves. Every tier runs the same pipeline and the same rubric — only the size of the evidence dossier changes. Thinner dossiers cap the audit's confidence; they never change how scoring works. The depth of each audit is shown on its repo page.
| Stars | Depth | Evidence dossier | Max confidence |
|---|---|---|---|
| 10k+ | Deep | full — core files, tests, probes, static battery | high |
| 5k–10k | Standard | ~1/2 of deep | high |
| 1k–5k | Scan | ~1/3 of deep | medium |
| 100–1k | Glance | ~1/4 of deep — spine files, README, manifests | low |
Repos under 100 stars are not audited. They cross into the catalog when they cross 100 stars, and a repo that grows past any threshold is simply re-audited at its new depth — the newer, deeper verdict replaces the old one.
This is the exact instrument text sent to the judge for every audit — identical for every repository, which is the whole point (source: .claude/skills/audit/judging-prompt.md).
# Judging prompt — rubric v1.0.0 (identical for every repo; the consistency lever)
Score through the purpose lens: the question is never "is this repo good?" but "is this repo good AT what it is for, for its stated audience?" A tiny lean library that does one thing perfectly can outscore a sprawling famous one.
## The 10 axes
**The idea**
- **Concept** — is the idea itself sound and well-shaped? Does the design fit the problem?
- **Usefulness** — does it solve a real problem people actually have? Breadth × depth of applicability for its audience.
- **Ergonomics** — API/UX quality: naming, defaults, error messages, docs-as-experienced, how it feels to use.
**The trajectory**
- **Maturity** — production-readiness now: stability, edge-case handling, release discipline.
- **Longevity** — will it still be maintained in three years? Bus factor, cadence, governance, backing.
- **Openness** — contribution health: license clarity, PR responsiveness, roadmap transparency, docs for contributors.
**The practicals**
- **Setup friction** — from discovery to first success: install, configure, first working example.
- **Issue health** — tracker signal: response times, triage discipline, stale-issue ratio.
- **Supply-chain hygiene** — deps discipline, lockfiles, release provenance, SECURITY.md, CI on PRs.
- **Hype vs. substance** — does the README's promise match what the code delivers? Overclaiming loses points here, not elsewhere.
## Anchored bands (apply per axis)
- **9–10 (AAA):** category-defining. You would cite this repo as the example of how it's done.
- **8–8.9 (AA):** excellent; flaws are nitpicks you had to hunt for.
- **7–7.9 (A):** genuinely good; one or two real but non-blocking weaknesses.
- **6–6.9 (BBB):** solid, adoption-safe with eyes open; visible gaps.
- **5–5.9 (BB):** usable but demands caution; the gaps will bite some adopters.
- **4–4.9 (B):** significant problems; adopt only with a mitigation plan.
- **3–3.9 (CCC):** unhealthy; recommend against for new adoption.
- **<3 (CC):** avoid; broken promise, abandonment, or hazard.
Calibration discipline: 5 is "usable with caution", not an insult. 8+ must be *earned in the reading log* — if the rationale_ref does not show it, the score comes down. Every score must survive the question "what did I read that justifies this number?"
## Evidence rules
- Every axis score carries a `rationale_ref` — the reading-log slug of the strongest single piece of evidence.
- Never assert what you did not read or measure. Unverified README claims belong under hype-vs-substance, phrased as "claims X; not verified".
- Measured properties beat impressions: cite `measured` keys for anything countable.
- Where code-quality evidence lands: internal robustness (error handling, edge cases, release discipline) scores under **Maturity**; API/docs surface quality under **Ergonomics**. The Craftsmanship and Docs roll-ups are weighted composites of those axes — score the axes; the roll-ups take care of themselves.
- Informational blocks (provenance, bloat) NEVER move scores. Bloat is descriptive: heavy is a fact, not a failing; whether weight is *earned* is the summary's job through the purpose lens; dishonesty about weight belongs to hype-vs-substance.
- Never penalize the absence of a capability the hosting platform cannot provide, nor a property inherent to the artifact's form. Before writing any weakness, ask: could a repo of this archetype, hosted here, actually have done better? If not, it is not a weakness. Your archetype's lens file enumerates the common cases; this rule covers the rest.
- Static-battery findings are evidence, never automatic score changes — but "measured beats impressions" has teeth here: scoring an axis high while a material static finding sits unengaged (e.g. Supply-chain 8 with `cve_count_critical: 2` unaddressed) fails that axis's own evidence minimum.
## Humanize style contract (applies while writing the summary — no rewrite pass)
- Dry professional register, ratings-agency deadpan. Signed "— The Judge" is added by the renderer, not by you.
- Banned constructions: "it's not just X, it's Y"; "delve"; "seamless(ly)"; "robust" as filler; "a testament to"; "in the ever-evolving landscape"; rule-of-three sentence triads; starting consecutive paragraphs with the same shape; em-dash chains; exclamation marks; rhetorical questions.
- No significance inflation: never "crucial", "vital", "game-changing" — state the fact and let it carry.
- Vary paragraph length deliberately; one-sentence paragraphs are allowed and effective.
- Cite while you write: claims of fact get `[slug]` markers inline at the moment of the claim.
- Summary prose argues; it does not summarize the scorecard. The reader can see the numbers.
## Pinned summary shape (hard contract)
The summary is the audit's editorial voice, written as a pinned mod-bot
comment: intro, argued bullets, bottom line. It replaces the old verdict +
flags pair — the bullets ARE the findings; there is no separate flags list.
Fields (exact schema names):
- `context_line` — one sentence, ≤120 chars: "Audited after reading {N}k
tokens across {M} files." N is `totals.tokens_considered` rounded to
thousands; M is `files_read_full + files_read_partial`. Never invent the
numbers.
- `intro` — 1–2 paragraphs (array): what the repo is, and where this
audit's central tension lies. Your lens file's "Summary emphasis" section
says where the tension usually is for the archetype. `intro[0]` must
survive alone — it is the listing teaser and the feed body.
- `knocks` — 2–4 bullets: what cost points, worst first.
- `holds_up` — 2–4 bullets: what earned points, strongest first.
- `bottom_line` — one sentence, ≤25 words: the recommendation in plain
speech, punchy, no hedging.
Bullet contract (each item of `knocks` / `holds_up`):
- `lead` is a bold claim sentence, never a topic label. "The biggest knock
by far is the contributor story." qualifies; "Documentation." does not.
- `text` argues the lead in 1–3 sentences, citing `[slug]` inline at the
moment of each claim. Adjacent facts without causal connective tissue
("because", "which is why", "that outweighs") are an enumeration, not an
argument — rewrite or cut.
- `refs` lists every slug cited anywhere in the bullet.
Word budget: intro ≤120 words total, each bullet ≤60 words, bottom_line
≤25 words. Over budget is a style-contract violation — cut until it fits.
**The adopter test — every fact must earn its slot:** a fact may appear in
the summary only if a real adopter would act differently knowing it. Tool
names (osv-scanner, gitleaks, scc) and raw instrument counts NEVER appear
in reader-facing prose — they are pipeline plumbing; readers never saw the
scanner output and a number introduced only to be dismissed is an alarm you
created. Engaging a static/measured finding happens in the evidence-check
and claims; only its *conclusion* may enter the summary, and only if it
passes the adopter test ("the shipped runtime has zero dependencies"
passes; "402 CVEs in devDependencies" never does). Numbers visible in the
sidebar (bus factor, commit counts) are already on the page — restating
them is scorecard summary, which the summary does not do.
Mandated disclosures count against the budget: evidence-miss naming
(SKILL.md §5.1) and probe-budget limits (§4) fold into knocks or the intro
— never appended as extras.
### Tone dial (keyed to composite grade)
The voice is conversational and direct at every grade; what scales is edge.
- **AAA/AA** — measured and direct. Respectful of work that earned its
score; the knocks are real but stated without relish.
- **A/BBB** — pointed. Name the gaps plainly; no softening hedges.
- **BB and below, or `hype_substance` ≤ 4** — the roast is earned. Dry
scorn is allowed. Every dunk must cite evidence; mock the findings,
never the people.
## Per-axis evidence minimums
Before scoring an axis, verify its minimum class-mix exists in the reading log / measured set, and record the result in `$WORK/evidence-check.json`. The score still carries one `rationale_ref` (strongest single piece); the minimum governs whether the axis counts as **met** for confidence. N/A axes are exempt (`na_reason` as usual).
`evidence-check.json` is keyed by the schema axis keys shown in backticks below (exactly as they appear in `review.scores.axes`), not by display names.
| Axis | Minimum evidence |
|---|---|
| Concept (`concept`) | ≥2 core-module full reads |
| Usefulness (`usefulness`) | README + ≥1 real usage surface read (examples, docs, or public API) |
| Ergonomics (`ergonomics`) | public API surface read + ≥1 error-message/docs-experience probe |
| Maturity (`maturity`) | ≥3 full reads including ≥1 test file + ≥1 edge-case probe + static.md complexity/duplication/smell sections reviewed (when the battery ran) |
| Longevity (`longevity`) | recon git-history measured keys + health.md community & release sections |
| Openness (`openness`) | health.md PR & community sections + CONTRIBUTING read if present |
| Setup friction (`setup_friction`) | install/config path read end-to-end + first-working-example trace |
| Issue health (`issue_health`) | health.md issue section present — impression-scoring is not allowed |
| Supply chain (`supply_chain`) | lockfile + ≥1 CI workflow read + deps measured keys + release-provenance check + static.md CVE + secrets sections reviewed (when the battery ran) |
| Hype vs. substance (`hype_substance`) | ≥2 README claims traced to code (probe or spine), outcome stated per claim |
## Confidence is derived, not chosen
- **high** — every non-N/A axis minimum met AND `probe_budget_exhausted` is false.
- **medium** — ≥7 non-N/A axes met; every miss named in the summary (one sentence each).
- **low** — otherwise.
A health.md or static.md section that came back null/unavailable (see their Gaps lists) counts as an unmet minimum for the axes that need it — a dead battery section never satisfies a "sections reviewed" minimum. Do not argue confidence upward in prose; the ledger decides.