History & errata
Cards change after printing. The registry records every change, and says where each record came from.
The publisher updates cards (a cost, a line of rules text) and the official API serves only the current values. The registry keeps every gameplay face a card has had, with the dates it was in force, so you can show what an older printing actually says. Three fields carry this: errata on the card, printed_as_current on each printing, and the card_history rows.
Does this printing show the current values?
printed_as_current answers that for each printing. It is true, false or null, and null has two meanings that depend on whether the printing has a release date. Show all four states; do not collapse them into yes or no.
| Value | Release date | Display |
|---|---|---|
true | Any | Current: printed values match the current face. |
false | Any | Older values: the printing carries an earlier face. |
null | Present | No card text: a textless printing, so comparison does not apply. |
null | Absent | Unknown: the undated printing cannot be placed in history. |
Unknown stays a valid state even when a release happens to contain no undated printing.
Where a history row comes from
Each card_history row holds a full gameplay face, a back face if the card has one, valid_from, valid_to (null while the row is still current) and source. The source decides how to label the date:
source: "api": label its starting date “Recorded on”. This is the sync that observed the values, not necessarily the publisher’s change date.source: "card": label it “Read from the printed card”. A maintainer transcribed an earlier face the official API never served. The range begins at the first release displaying it.
source arrived in schema 11; a row without it is an API observation. The first API row of a card stands for everything before the registry began recording. Every card has exactly one open row, and it equals the card record.
Compare a printing with the current card
- Resolve its card using
codex_id. - Read the printing’s status before attempting a comparison. A textless or undated printing needs an explanation, not a fabricated diff.
- For an older dated printing, sort the card history by
valid_fromand select the last row starting on or beforereleased_at. If the date predates every row, use the earliest record, following the archive’s initial-record convention. - Compare all gameplay fields, including the back face where present. Consult name history separately when names differ.
Show the difference honestly
Keep the original values and line breaks. Label the earlier and current blocks in words, so the meaning does not depend on red and green. A diff between two history rows is not the same as a diff against today's face.
errata on the card is true once any gameplay field has changed since the card was printed. It is a flag, not a count, and it can be true for a card whose earlier face was never captured.
Reference: registry API contract and published object definitions. Report a data or documentation issue.