Measured this build against a documentation brief for public repos. The five original checks covered roughly one of its ten sections, so this adds what a single repo can answer on its own. New: required README headings per class (Non-goals is the cheapest trust-builder there is), in-repo version consistency across manifest / badge / CHANGELOG / tag, badge honesty, boilerplate, licence-claim, and relative links. Findings now carry a BUCKET beside the level - broken / missing / weakening - and output is grouped by it, because that is the order the work gets done in. Traits are a second axis beside class: class is structural and readable off the catalog, a trait says what the code does. `security` attaches SECURITY.md and a Known limitations section. The two names carrying it are proposed, not measured - that list is the operator's. Solo-maintained settles a category: CONTRIBUTING, CODE_OF_CONDUCT and MAINTAINERS are required by no class. Consumer-facing documents are untouched by that; SECURITY.md exists for the stranger who finds a hole. Three bugs found by running against llm-security, not by reading: - ~30 link findings, all noise. Regexes inside code spans are `[...](...)` to a naive scanner. Strip code first. - `file:` and other schemes were treated as repo-relative paths. - Relative links were resolved against the repo root instead of the file they sit in, calling two files missing that sat next to the README linking them. Same fix applied to the boilerplate check: a document ABOUT placeholder detection was tripping the placeholder detector. Also removed this repo's own static tests badge. There is no CI - the forge has zero Actions runners registered - so it could never become real, and it is the exact anti-pattern the gate now flags. 67 tests. Against llm-security every remaining finding is real and matches the census's independent hand-measurement. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WYJ3FHLtVgzFXMZ6UF598h
4.5 KiB
4.5 KiB
Changelog
All notable changes to this project are documented here. Format follows Keep a Changelog; versioning is Semantic Versioning.
0.1.0 — 2026-07-27
First release. Covers the checks that a single repository can answer on its own.
Added
- The gate (
scripts/repo-standard-check.mjs) — pure classifiers with all I/O resolved into their input, findings taggedERROR/WARN/SKIP/OK, exit 1 onERROR. Five checks: README first screen, install block, files required by the repo's class,open/<name>references, description length. - Taxonomy register (
register/repos.json) — one central file mapping each repository to its class, plus the per-class file and install requirements.--refreshcompares it against the live org listing. - Three-outcome reference check — "matches no repository" (
ERROR) is a separate finding from "matches something that is deliberately not a repository" (WARN). Sharing an outcome would let real dead links hide among correct text. Only names in URL position are treated as references; the.gitsuffix is normalised first. - Two-axis findings — every
ERROR/WARNcarries a bucket alongside its level:broken(a stranger is blocked or misled),missing(an expected artefact is absent),weakening(present, but it reads as amateur). Output is grouped by bucket, because that is the order findings get acted on. - Traits, a second axis beside class — class is structural and readable off
the catalog; a trait is about what the code does.
securityattaches aSECURITY.mdrequirement and a## Known limitationssection. - Required README headings per class —
## Install,## Non-goals,## Changelog. A heading present at the wrong depth is its own finding, not "missing". - In-repo version consistency — manifest, README version badge, newest
CHANGELOG entry and the git tag must agree. An untagged repo
SKIPs the tag comparison rather than failing it. - Badge honesty — a static badge asserting a test, build or coverage run is a claim dressed as evidence. Version, licence and platform badges assert no run and are fine.
- Boilerplate, licence-claim and relative-link checks.
- The skill (
skills/repo-standard/) — the judgement the script cannot encode: what a description should say, why the summary card must never be used to verify one, what not to retrofit, and where the per-repo boundary is. - 67 tests over the pure classifiers, using measured false positives as reference fixtures.
Notes
- Descriptions are measured in codepoints — not bytes, and not UTF-16 units. The same string measures 248 / 249 / 253 across those three yardsticks when it contains an astral character.
enabledPluginsinsettings.jsonis treated as a legitimate second install form. The gate requires a CLI command as well, and never reports the JSON form as the defect.- The org listing is read in one call, anonymously. Per-repo fetching trips the forge's rate limiter.
CONTRIBUTING.md,CODE_OF_CONDUCT.mdandMAINTAINERS.mdare required by no class: the project is solo-maintained and publishes that stance. This is not a rule against having them — files already present are a cleanup decision, not a gate finding.SECURITY.mdis unaffected; it exists for the outsider who finds a hole.- There is no CI badge because there is no CI: the forge has no Actions runner registered. The substitute is one command from a clean clone, stated honestly. A badge asserting the test count would be the very anti-pattern the gate flags, and an earlier draft of this README carried exactly that.
- The link and boilerplate checks ignore fenced blocks and inline code spans. Documentation about regexes and placeholders is full of text that is a markdown link to a naive scanner — the first version produced about thirty findings against a real repository and every one was noise.
- Relative links resolve against the file they appear in, not the repo root.
- A README H1 that differs from the repo name is a
WARN, not anERROR. The thread that has to hold is description == catalog == opening line, and the H1 is none of those three; a human title is a naming choice the operator owns. A missing H1 is still anERROR. - No hook ships in this release. A blocking gate has to be precise enough not to fail a correct repository first.