- Security: restrict /compat and /set* comment workflows to maintainers (OWNER, MEMBER, COLLABORATOR)
- Sitemap: use siteGameKey for canonical URLs matching internal routes
- Sync: pass GITHUB_TOKEN to upstream fetchCandidates to prevent 60 req/hr rate limiting
- Intake: guard slug derivation against missing title in issue-to-compat.mjs and escape frontmatter strings
- Forms: whitelist known template group headings in parseIssueBody to preserve user markdown headings
- Accuracy: fetch true contributor total from GitHub API pagination headers in RepoStats
- Cleanup: delete unused ReportCard component and rename markdown.tsx to markdown-view.tsx
- Content: fix title and filename typos in The Thing and GTA Vice City reports
Replace majority-vote aggregation with the single verified report's status:
the intake pipeline now keeps exactly one report per (game, OS), keyed by
title ID so region variants and punctuation-differing titles dedup against
the same report. validate-compat.mjs fails the build on duplicates,
issue-to-compat.mjs retires stale same-(game, OS) reports, and the site and
export aggregations throw instead of silently voting. Retire the duplicate
Demon's Souls and GTA III: DE reports and rebuild compat-index.json.
Let a maintainer fix fields an issue can't express cleanly (OS that
doesn't normalize, missing/Unknown PPSA serial, wrong title) by
commenting /setos /setid /settitle on the mirror issue. The command
records the value in a ## Overrides section of the mirror body, which
the /compat conversion prefers over parsed fields and which survives
poller refreshes. Failure messages are also posted back on the issue
as comments so the reason is visible without reading the workflow log.
Reports are per (game, OS) and record ONE source issue, so converting a
newer upstream issue for the same game overwrote the older one's `> Source:`
marker — the older issue then looked unconverted and got re-mirrored. Compare
dates instead of issue numbers: only mirror an issue when no report for its
(game, OS) is already as new or newer, with an exception for same-run batches
(two or more issues for one game = fresh batch, mirror all).
Replace the standing report PR (which piled every converted game into
one branch) with an issue-driven flow: the poller mirrors each
unconverted KytyPS5 game-status issue here as a `compat`-labeled issue,
and commenting /compat converts one mirror into its own per-game report
PR (updated in place on re-runs, mirror closed on success).
Screenshots from the issue now travel with their report: the converter
copies the `<img>` URLs out of the mirrored issue into a `screenshots`
frontmatter array, the game page hotlinks the latest accepted report's
images (nothing is downloaded into the repo), and the validator
requires each to be an http(s) URL on a report with a linked source.
The /getss download flow is removed.
README and the contributing page document the /compat workflow.