Skip to content

In-game patch notes cite open issues as delivered, and nothing guards that file #1310

Description

@PipFoweraker

The gap

scripts/check_release_notes.py refuses to publish a release body that cites an
open issue as delivered. That guard is real and it has teeth: on 2026-08-24 the
v0.14.3 release built all three platforms and then refused to publish, with
7 fatal RN003 findings against release_notes.txt. CHANGELOG.md was fixed in
#1303 by adopting the guard's documented escape, the literal phrase
#<N> is still OPEN.

godot/data/patch_notes.json is the SAME release notes, shipped INSIDE the game,
rendered by the What's New modal on the first launch after an update. It carried
the same bare citations, and no guard exists on that file at all.

Measured on main at 161240b, before the fix in the PR that opens this issue:

$ grep -o "#[0-9]\{2,5\}" godot/data/patch_notes.json | sort -u   # 20 issues cited
$ gh issue list --state open --limit 300 --json number   # intersect
1038 1223 1225

Seven bullets in the 0.14.3 entry cited #1225 (x4), #1038 (x2) and #1223
(x1) as (#1225 item 4) / (#1038) / (#1223) -- exactly the 7 findings the
release guard raised against the changelog, and exactly the same three issues.
All three are still open.

The wording has been fixed in that PR (the bullets now read the same way the
CHANGELOG's do). That fix is a one-off. Nothing stops the next release cut from
reintroducing it
, which is what this issue is for.

What is worth deciding

Two candidate mechanisms, and Pip's call on which:

  1. A guard on the JSON. A sibling of check_release_notes.py that walks
    every string in godot/data/patch_notes.json, extracts #<N>, asks gh for
    the state, and fails on an open issue cited without the escape phrase. Cheap
    to write BECAUSE the escape phrase now matches: _claims_open() in
    check_release_notes.py is literally
    "#{} is still OPEN".format(number) in flat, so the JSON fix already
    published in the PR makes the guard nearly a copy. Costs: it needs network
    (gh) like RN003 does, so it is a CI gate rather than a pre-commit one, or a
    pre-commit gate with an --offline skip the way check_release_notes.py
    already has.

  2. Stop citing issue numbers in the game at all. An issue number is
    developer jargon on a player-facing surface. A player cannot act on #1225.
    Under this option the in-game notes carry no numbers and the discipline
    problem disappears rather than being guarded. Cost: a player who does want
    to follow a thread loses the pointer, and the in-game notes drift further
    from the CHANGELOG they are derived from.

A third possibility worth naming and probably rejecting: generate
patch_notes.json from CHANGELOG.md so there is one source and the existing
RN003 guard covers both. That removes a whole class of drift (the two surfaces
already disagree in wording), but the in-game notes are deliberately written for
players and the CHANGELOG is not, so a generator would need a curation layer and
stops being cheap.

Why this is the same defect one layer out

The F3 ruling that produced the PR opening this issue was about the What's New
modal collapsing three different failures into one reassuring sentence. This is
the same shape: a citation that reads as "delivered" whether or not it was. The
release pipeline learned to refuse that. The copy that reaches players did not.

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