The build · what it refuses

Rules

Every ranking on this site is a file the build validates before it will publish it. These are the rules it enforces beyond the shape of the fields — and rather than describe them, this page runs the validator against a franchise written to be wrong, and prints what comes back.

What this is

The schema carries 21 refinements beyond the field types. The fixtures below demonstrate 21 of them. Those two numbers are counted separately on purpose: one is read out of the schema source, the other out of what the validator actually returned, and a gap between them means a rule exists that nothing tests.

Passing all of them is not the bar. Every defect this project has shipped passed every rule here — they stop a page being malformed, and nothing in this repository can see a claim that is simply wrong. That is what the citations are for.

tests/fixtures/invalid-franchise.mdx

A franchise built to be wrong in every way the schema knows about.

  1. field typeentries.3.featToo small: expected string to have >=40 characters
  2. forms must name a peak stateentries.0.forms"dupe" lists forms but marks none of them peak — the rank has to name the state it comes from
  3. kill cross-references must resolveentries.0.kills"dupe" is credited with killing "not-an-entry", which is not an entry in this franchise
  4. nobody kills themselvesentries.0.kills"dupe" is credited with killing itself
  5. a matchup reading needs a ranked victimentries.0.kills"dupe" carries a matchup reading for "Unranked Victim", who is not a ranked entry here. A matchup page asks whether the death moves the ranking; there is no ranking to move. Set `of`, or drop the reading.
  6. brief entries are barred from the top of the ladderentries.0.feat"dupe" is rank 1 with no feat — the top 20 carry the argument. Write one, or move it below 20.
  7. scaled-only citations in a top-two tier (§2.2)entries.0.citations"dupe" sits in a top-two tier on scaled citations alone. Cite something shown or stated, or move it down.
  8. tier id must resolveentries.1.tier"dupe" is in tier "nonexistent-tier", which is not one of: top, two
  9. entry continuity must be declaredentries.1.continuity"dupe" claims continuity "not-declared", which this franchise doesn't declare. Known: top-continuity, unused-continuity
  10. entry ids are unique (vote keys)entries.1.idduplicate id "dupe" (also entries[0]) — ids are vote keys and must be unique
  11. ranks are uniqueentries.1.rankduplicate rank 1 — "dupe" collides with "dupe"
  12. off-scale entries cannot be votableentries.2.eligible"offscale-but-votable" is off-scale (rank: null) so it cannot be votable — set eligible: false
  13. off-scale entries must still be arguedentries.2.feat"offscale-but-votable" is off-scale and has no feat. Off-scale entries are deliberate editorial asides — being unranked is itself the claim, so it needs arguing.
  14. declared continuity must be usedcontinuitiescontinuity "unused-continuity" is declared but no entry uses it — it would render a filter that matches nothing
  15. a work string names exactly one workentriesthe work "W" is cited as film and novel — one string naming two works tells a reader to check a source without saying which. Qualify both, e.g. "W (novel)".
  16. armament wielderId must resolvearmoury.items.0.wielderId"arm-a" names wielder "no-such-entry", who is not an entry on this page
  17. armament ids are unique (vote keys)armoury.items.1.idduplicate armament id "arm-a" — these are vote keys of their own and must be unique
  18. armament ids cannot reuse an entry idarmoury.items.2.idarmament "dupe" reuses an entry id. The two ladders keep separate id spaces so a weapon can be rated without touching its wielder's rating.
  19. armament ranks are contiguous from 1armoury.itemsarmament ranks must run 1..3 with no gaps — found 9 where 3 was expected
  20. entry armament must exist in the armouryentries.3.armament"gap" carries armament "no-such-armament", which this franchise's armoury does not list
  21. ranks are contiguous from 1entriesranks must run 1..2 with no gaps — found 9 where 2 was expected

tests/fixtures/orphan-armament-franchise.mdx

A second file, for the one rule the first cannot reach: an armament reference on a page that declares no armoury.

  1. an armament reference needs an armouryentries"orphan" references an armament but this franchise declares no armoury

Not rules

1 of the messages above come from the field types rather than from a house rule — a string too short, a value outside an enum. They are shown because a reader of a failing build sees them, and counted separately because calling them rules is how the advertised count drifted in the first place.