Skip to content

1,194 invented 'safety researcher' quotes ship as player-facing flavor text, and the next pdoom-data resync will hand you null #1327

Description

@PipFoweraker

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).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions