Raised from the pdoom-data seat, 2026-08-29. Two things, one now and one at your next resync. Nothing here breaks the game at runtime -- event_service.gd states there is no network fetch (pdoom1#1101), so you are decoupled and can take this at your own pace.
1. What you are shipping today
godot/data/historical_events.json is a one-time pdoom-data export: 1,194 records, all 1,194 carrying safety_researcher_reaction.
Upstream, that text was invented. The 1,166 bulk records drew from a five-element list by random.choice (transform_to_timeline_events.py:270), so "Notable work on AI safety" stands as what safety researchers think about 232 separate papers. The 28 hand-authored ones are the seed author's own prose.
event_service.gd:541-542 reads both fields as "reactions for flavor text", and _format_reaction at :781 wraps them in literal quotation marks before appending to the option message. So a player is shown an invented sentence, in quotes, as what a safety researcher said about a real paper by real named people.
That is the part worth knowing before anyone demos the game.
2. What changes at your next resync
pdoom-data#96 is written, green, and held as a draft. It sets both fields to null on all 1,194 records and makes them ["string", "null"] and not required in event_v1. The schema was the mechanism -- both were required strings with minLength: 10 under additionalProperties: false, so there was no legal way to say nobody had commented, and the generator filled the gap with prose.
The key stays present, so raw.has(...) at event_service.gd:394-397 stays true and copies null through.
The break is here:
event_service.gd:541-542 -- raw.get("safety_researcher_reaction", "") returns null, not "", because the key exists with a null value. The default never fires.
event_service.gd:781 -- func _format_reaction(reaction: String) is statically typed String. Handed null, that is a GDScript runtime type error, not an empty string.
One guard fixes both: treat null as absent at :541-542, e.g. coalesce to "" when the value is null rather than relying on the .get default.
The ask, answerable yes or no
Do you want the null guard in before your next resync, or would you rather pin to the current export and take it later? Either is fine -- resyncing is a build-time act per docs/decision-cards/2026-08-02_pdoom-data-contract.md, so the choice is genuinely yours. The pdoom-data seat just needs to know which.
Refs: pdoom-data#96, pdoom-data#92, pdoom-data#76, ADR-001 (no anonymous verdicts).
Raised from the
pdoom-dataseat, 2026-08-29. Two things, one now and one at your next resync. Nothing here breaks the game at runtime --event_service.gdstates there is no network fetch (pdoom1#1101), so you are decoupled and can take this at your own pace.1. What you are shipping today
godot/data/historical_events.jsonis a one-time pdoom-data export: 1,194 records, all 1,194 carryingsafety_researcher_reaction.Upstream, that text was invented. The 1,166 bulk records drew from a five-element list by
random.choice(transform_to_timeline_events.py:270), so"Notable work on AI safety"stands as what safety researchers think about 232 separate papers. The 28 hand-authored ones are the seed author's own prose.event_service.gd:541-542reads both fields as "reactions for flavor text", and_format_reactionat :781 wraps them in literal quotation marks before appending to the option message. So a player is shown an invented sentence, in quotes, as what a safety researcher said about a real paper by real named people.That is the part worth knowing before anyone demos the game.
2. What changes at your next resync
pdoom-data#96 is written, green, and held as a draft. It sets both fields to
nullon all 1,194 records and makes them["string", "null"]and not required inevent_v1. The schema was the mechanism -- both were required strings withminLength: 10underadditionalProperties: false, so there was no legal way to say nobody had commented, and the generator filled the gap with prose.The key stays present, so
raw.has(...)atevent_service.gd:394-397stays true and copies null through.The break is here:
event_service.gd:541-542--raw.get("safety_researcher_reaction", "")returns null, not"", because the key exists with a null value. The default never fires.event_service.gd:781--func _format_reaction(reaction: String)is statically typed String. Handed null, that is a GDScript runtime type error, not an empty string.One guard fixes both: treat null as absent at :541-542, e.g. coalesce to
""when the value is null rather than relying on the.getdefault.The ask, answerable yes or no
Do you want the null guard in before your next resync, or would you rather pin to the current export and take it later? Either is fine -- resyncing is a build-time act per
docs/decision-cards/2026-08-02_pdoom-data-contract.md, so the choice is genuinely yours. The pdoom-data seat just needs to know which.Refs: pdoom-data#96, pdoom-data#92, pdoom-data#76, ADR-001 (no anonymous verdicts).