How we grade
Safety Score v1.0 · documented from the shipped grader (score.mjs) · weights verified against the live system with 16/16 probes, 27 July 2026
Every A–F on this site comes from one deterministic function. The same code grades the directory, the /grade page, the MCP loops_grade tool, and the ingest pipeline. No model judgment is part of the grade — the AI take on /grade is advisory and clearly labeled. This page is the whole rubric, including the parts that are weak. If a grade surprises you, the explanation is below, not hidden.
Two verdicts, two authorities
A graded loop gets two independent verdicts. The gate (pass/reject) comes from the default-fail evaluator that guards the directory: dangerous commands, spam, and structurally unbounded loops are rejected, and unclear cases reject by default. The score (A–F) is a separate weighted checklist of harness signals. The gate is the authority on publication; the score is the authority on nothing except itself — it is a harness-quality summary, not a permission slip.
Weights
| Signal | Points | What fires it |
|---|---|---|
| Passes the danger + spam screen | +40 | No destructive command (rm -rf, force-push to main, pipe-to-shell, permanent mail deletion) and no spam markers. This is the largest single award in v1 — see limits below. |
| Exit condition | +20 | A framing word (until / stop when / exit when / stop after N) plus a target. Soft targets count in v1: "until done" and --completion-promise both fire this signal. |
| Iteration cap | +15 | A numeric budget: "stop after 10 turns", "max 15 iterations", --max-iterations 50, MAX_ITER=20. |
| Verification | +10 | A named check: tests, lint, build, typecheck, CI, "exits 0". The bare noun "tests" is enough in v1 — it does not require the check to be executed. |
| Scoped | +10 | Anti-reward-hacking language: "only", "never touch/modify/delete", read-only, report-only, minimal diffs. |
| Human gate | +5 | Ships through review: PR, propose, draft, approval. |
A danger-pattern hit caps the total at 10 regardless of other signals. A spam hit removes the +40. Maximum 100.
Grade bands
| Grade | Score | What it takes in practice |
|---|---|---|
| A | 90–100 | Clean screen, an exit condition, and a cap are mandatory — missing any of the three caps you at 85. Those reach 75; an A needs 15 of the remaining 25 points (verification, scope, human gate). |
| B | 75–89 | Clean screen plus most of the harness signals. |
| C | 55–74 | Clean screen plus roughly two signals. |
| D | 35–54 | The floor for any prompt that passes the danger/spam screen. A bare unbounded loop lands here, not lower. |
| F | 0–34 | In practice: a danger-pattern hit (score capped at 10) or spam. Weakness alone cannot produce an F in v1 — see limits. |
Known limits of v1.0
These are not hypotheticals — each was verified against the live grader during the 27 July 2026 calibration. We publish them because a rubric you can't audit is just a vibe with a letter attached.
What's next — v2 (spec, not live)
A v2 spec exists (27 July 2026) and is calibrated against every published row. Nothing in it is live; v1.0 still grades this directory. The design directly targets the limits above:
- One canonical input everywhere — description + prompt — closing the two-doors gap.
- Passing the danger screen drops from +40 to +15; machine-checkable exits (+25) split from soft promises (+5).
- New signals: recurrence/wall-clock bounds (+15), executed verification (+15) vs merely named (+8), recovery behavior (+10).
- A structural F: unbounded + self-attested completion + no executed verification fails without needing a danger string.
- Projected effect on the corpus at spec time: A count drops 40 → 16, F rises 0 → 31. Grades will get harder, and that is the point.
When v2 ships, grades will carry a rubric version stamp so a v1 A is never silently compared to a v2 A.