Skip to content

reactions: null, because nobody said any of them - #96

Merged
PipFoweraker merged 2 commits into
mainfrom
fix/suppress-unattributed-reactions
Aug 30, 2026
Merged

PipFoweraker merged 2 commits into
mainfrom
fix/suppress-unattributed-reactions

Conversation

@PipFoweraker

Copy link
Copy Markdown
Owner

DRAFT ON PURPOSE. Do not merge until pdoom1 and pdoom1-website are ready. This changes the public shape of all_events.json, the file both of them read. Pip asked for the change prepared and proven, not shipped -- EAGxSingapore, 2026-08-29.

What is live right now

safety_researcher_reaction and media_reaction carry invented text on all 1,194 served records.

source of the text records
bulk random.choice over five strings -- transform_to_timeline_events.py:270, transform_enriched.py:242 1,166
hand-authored the seed author's own prose, styled as quotation 28

"Notable work on AI safety" stands as what safety researchers think about 232 separate papers. "Valuable research for alignment" covers another 229.

The 28 are not better, only rarer. "Microsoft's AI chatbot goes full Nazi in under 24 hours" is written as a headline and credited to no newspaper. That is why the suppression covers all 1,194 and not just the bulk.

The schema was the mechanism, not a bystander

Both fields were required strings with minLength: 10 under additionalProperties: false. There was no legal way to say nobody had commented -- not null, not empty, not absent. event_v1 demanded a sentence for events where no sentence existed, and the generator supplied prose to satisfy it.

Two standing rules already covered this and neither was applied. RULED_2026-08-12: "No shipped sentence states a fact nobody has checked." ADR-001: no anonymous verdicts. A reaction attributed to an unnamed "safety researcher" fails both.

What this does

  • Both fields become ["string", "null"] and leave required.
  • The producer nulls them on every record, in one named and commented step.
  • Emitted as null, not dropped. null is this repo's standing spelling for absent-and-honest; the key stays for consumers that index on it; and the absence reads as deliberate rather than as a fetch that failed.
  • Suppression is unconditional. There is no attribution anywhere in the corpus to preserve, so a predicate keeping the "good" ones would invent the distinction it claimed to read. A non-null value returns only with a name attached.
  • LINEAGE.json records what was suppressed and why.

Verification

All 28 gating checks pass, including the four rebuild checks and the ASCII gate. The schema patch is 5 insertions / 7 deletions -- an earlier version of it reformatted every inline array in the file and was redone by hand.

What is NOT done here, and belongs to the consumers

Neither pdoom1 nor pdoom1-website has been checked for null-handling on these two fields. That is the gate on this PR, and it is why it is a draft. If either renders the field unconditionally, it needs a change first.

Refs pdoom-data#92, pdoom-data#76. ADR-001, and the #34 family.

DO NOT MERGE WITHOUT THE CONSUMERS. This changes the public shape of
all_events.json, which pdoom1 and pdoom1-website both read.

safety_researcher_reaction and media_reaction shipped invented text on all
1,194 served records. The 1,166 bulk records drew theirs from a five-element
list by random.choice -- transform_to_timeline_events.py:270 and
transform_enriched.py:242 -- so "Notable work on AI safety" stood as what
safety researchers thought about 232 separate papers. The 28 hand-authored
records are not better, only rarer: their reactions are the seed author's own
prose, and "Microsoft's AI chatbot goes full Nazi in under 24 hours" is styled
as a headline credited to no newspaper.

Two standing rules already covered this and neither was applied.
RULED_2026-08-12: "No shipped sentence states a fact nobody has checked."
ADR-001: no anonymous verdicts. A reaction attributed to an unnamed "safety
researcher" fails both.

The schema was the mechanism, not a bystander. Both fields were required
strings with minLength 10 under additionalProperties: false, so event_v1 made
it impossible to say that nobody had commented -- there was no legal spelling
of absence, and the generator supplied prose to satisfy the requirement. Both
are now ["string", "null"] and neither is required. A non-null value returns
only with a name attached, which is what ADR-001 asked for all along.

Emitted as null rather than dropped: null is this repo's standing spelling for
absent-and-honest, the key stays in place for consumers that index on it, and
the absence stays visible instead of reading as a field that merely failed to
fetch.

Suppression is unconditional by design. There is no attribution anywhere in
the corpus to preserve, so a predicate that tried to keep the good ones would
be inventing the distinction it claimed to read.

All 28 gating checks pass, including the four rebuild checks.

Refs pdoom-data#92, pdoom-data#76.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCAwQ2dTCtpR8rTrEfv5ee
@PipFoweraker

Copy link
Copy Markdown
Owner Author

Both consumers are handled. This is ready to come out of draft once they merge.

Rather than wait on the two seats, the guards are written and tested in their own repositories:

repo PR what it does
pdoom1-website #397 sanitize_event_urls stops handing None to a str-only helper; build_reaction_html returns the quote line so a null takes the literal quotation marks with it instead of publishing "None"; the badge reads Not recorded; stats count null as not_applicable. 12 checks, verified must-fire against the unfixed file, where it dies on the real AttributeError at line 937.
pdoom1 #1339 _reaction_text() treats null and absent as the same empty thing, because Dictionary.get(key, "") returns the stored null when the key is present. Copy sites now match the pdoom_impact idiom already in that file. 7 GUT tests, run not just parsed, 7/7 pass; 4 of 7 fail without the fix.

Both were measured in the consumers' own trees before a line was written, not predicted from the signatures.

Neither repo needed a new concept. pdoom1-website already had real_quote / human_summary / not_applicable and a "Found a Real Quote? Suggest it here" button; pdoom1 already used has(...) and ... != null for pdoom_impact three lines below the reaction copy. The correct patterns were both sitting there.

Merge order: pdoom1-website#397, then this. pdoom1#1339 is not blocking, because the game has no network fetch (pdoom1#1101) and re-syncing is a build-time act, but it should land before the next resync.

@PipFoweraker
PipFoweraker marked this pull request as ready for review August 30, 2026 07:40
@PipFoweraker
PipFoweraker merged commit 5b08e75 into main Aug 30, 2026
4 checks passed
@PipFoweraker
PipFoweraker deleted the fix/suppress-unattributed-reactions branch August 30, 2026 07:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant