Validation Glossary
When you load a file, the game shows a report. Errors block the import (fix and re-export). Warnings proceed — they tell you what the game filled in or adjusted. Info summarizes the league. The report lists all errors at once, so you can fix a whole batch per attempt.
Errors (must fix)
| code | means | fix |
|---|---|---|
invalid-json |
The file isn't valid JSON. | Check for a trailing comma, unquoted key, or a broken merge. |
not-an-object |
The top level isn't a JSON object. | Wrap everything in { ... }. |
missing-format-version |
No formatVersion. |
Add "formatVersion": 1. |
unsupported-format-version |
A formatVersion this build doesn't read. |
Use 1. |
missing-required-field |
A player/staff is missing name, team, position, ovr, or a staff role. |
Add the named field (the path points at it). |
bad-field-type |
A field has the wrong type (e.g. ovr as a string). |
Use the type in the format guide. |
unknown-team |
A team / championTeamId isn't one of the 32 ids. |
Use a lowercase team id. |
unknown-position |
A position isn't one of the 17. |
Use a valid position code. |
unknown-role |
A staff role isn't one of the 15. |
Use a valid role code. |
impossible-value |
A value is out of range — ovr > 100, pot < ovr, guaranteedM > totalM, draft round > 7, a team both champion and runner-up. |
Correct the number. |
duplicate-player |
Two players share a name on the same team. | Rename one (or fix a merge that doubled a team). |
duplicate-team |
A team is overridden twice. | Keep one TeamFact per team. |
duplicate-staff-role |
Two staff hold the same role on one team (e.g. two HCs). | One of each role per team. |
forbidden-roster-shape |
A team has more than 90 players. | Trim to ≤ 90. |
cap-breaking |
A team's stated contracts exceed the $280M cap. | The report lists the top deals driving it — trim totalM, drop a contract, or spread it over more years. |
career-stat-future-season |
A careerStats line's season is at or after meta.season. |
A career line is a past season — use a calendar year before meta.season. |
career-record-future-season |
A careerRecord line's season is at or after meta.season. |
A coach's record is a past season — use a year before meta.season. |
record-contradicts-claim |
A WON_SB careerRecord names a champion the file already gave to a different team that season. |
Fix the year, the team, or the conflicting champion claim. |
unknown-award |
An award claim isn't COTY or EOTY. |
Use COTY (Coach of the Year) or EOTY (Executive of the Year). |
legacy-still-active |
A legacy entry's career ends at or after your file's season. | A legacy record is a RETIRED figure — seat a working coach with a staff entry instead. |
legacy-unknown-role |
A legacy roles value isn't HC or GM. |
Those are the only two the legacy boards track. |
duplicate-legacy |
The same legacy name appears twice. | Keep one entry per legend. |
Warnings (import still proceeds)
| code | means |
|---|---|
filler-generation |
The game generated depth/camp players to complete thin rosters. The count is shown; every filler is flagged generated: true. |
feasibility-adjusted |
Your stated attributes made the stated ovr unreachable; the attributes were honored and OVR landed where they put it (delta shown). |
pot-clamped |
A stated pot below the materialized ovr was raised to ovr (potential can't sit under current ability). |
cap-approx-high |
A rough parse-time estimate flags a team as possibly over-cap. The exact check runs at import; trust the blocking cap-breaking error over this heads-up. |
chronology-conflict |
Two claims name different champions for one season; the first (in file order) wins. |
history-out-of-range |
A history/accomplishment season is outside the fillable 30-year window; the claim is ignored. |
history-blast-radius |
You included history/accomplishments — the whole league's fabricated past is reshaped, so teams you didn't author get different coaching histories than a default game. |
empty-history-fact |
A history fact names neither champion nor runner-up; it does nothing. |
fa-with-contract |
A free agent carried a contract; it's ignored (FAs are contract-less). |
fa-with-team |
A freeAgents entry named a team; it's treated as unsigned. |
draft-and-udfa |
A player is both drafted and UDFA; the draft origin is used. |
unknown-attribute |
An attribute key isn't recognized (likely a typo); it's ignored. |
unknown-personality / unknown-backstory / unknown-trait |
A staff value isn't in the catalog; it's sampled instead. |
unknown-market-size / unknown-conference / unknown-division |
A team override value isn't recognized; the default is kept. |
bad-color |
A team color isn't a #RRGGBB hex; the default is kept. |
bad-jersey |
A jersey isn't an integer 0–99. |
implausible-age / implausible-birthYear |
An unusual (but not impossible) age; double-check it. |
unknown-field |
An unrecognized field name (likely a typo — e.g. positon); it's ignored. |
career-stat-out-of-range |
A careerStats season is more than 30 years before meta.season; the line still displays. |
career-stat-unknown-team |
A careerStats line's team isn't one of the 32 ids; it's shown as the raw id. |
stats-vs-position |
A careerStats stat doesn't fit the player's position (a QB with tackles); the line is kept as authored. |
unknown-stat |
A careerStats stat name isn't recognized (likely a typo); it's ignored. |
career-record-out-of-range |
A careerRecord season is more than 30 years before meta.season; the line still displays. |
career-record-unknown-team / career-record-unknown-role |
A careerRecord team/role isn't recognized; shown as-is / his current role is used. |
record-length-mismatch |
A careerRecord W+L+T is far from a 17-game season; double-check it. |
unknown-playoff-result |
A careerRecord playoffResult isn't one of MISSED WILDCARD DIVISIONAL CONF LOST_SB WON_SB; treated as MISSED. |
award-on-history |
An award was put on top-level history; awards belong on a coach's accomplishments, so it's ignored there. |
contract-expired-at-import |
A rostered player's contract already ran out before your file's season. He loads anyway, with zero years left, and hits free agency at the next roll. Almost always the extension trap — add throughSeason. |
contract-starts-before-signing |
throughSeason minus years puts the deal's start earlier than yearSigned. One of the three numbers is off. |
legacy-unknown-team |
A legacy entry names a team that doesn't exist; it's shown as the id. |
legacy-accomplishment-outside-career |
A title/award season falls outside the stated careerYears, so it can't be stamped on his record. |
legacy-hof-before-retirement |
hofYear precedes the end of his career. |
legacy-claim-conflict |
A legend claims a title or award season that an ACTIVE imported coach already claimed. The active coach takes precedence; the legend's claim is dropped. |
unknown-tendency |
A tendencies id the game does not know. |
tendency-wrong-group |
A tendencies id that belongs to another position group (a pressBias on a QB). |
bad-tendency-level |
A tendencies value that is not an integer from 1 to 5. |
Info (just so you know)
Teams covered, players authored, free agents, staff imported, history facts applied, the
per-team fidelity-tier profile, your league's OVR distribution vs. the default — so you
know at a glance whether your league runs hot, cold, or on par — and a contract summary
(how many deals you authored, how many state throughSeason, and how many expire in the
file's own season). That last number is the expiry-cliff detector: if most of your league is
walking into free agency at once, you have hit the extension trap.