From 3566a62f2d13538c59feebea33a2eec6e47f1801 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Thu, 6 Aug 2026 10:11:23 -0400 Subject: [PATCH] =?UTF-8?q?"remove=20=E2=80=94=20not=20a=20game"=20admits?= =?UTF-8?q?=20its=20second=20job?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eric's observation: the button also removes duplicate reads — the same physical box read differently from two photos, leaving two lines for one copy — and its label denied that use existed. Now "remove this line", with the hover title and the confirm dialog naming both legitimate reasons and pointing the opposite case (one line, several real boxes) at split. Help's remove entry documents the duplicate- read use and which line to remove (the worse read; the survivor keeps its own photos). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_016jXZFSTZQKzAC8fqpWSz9g --- src/bggpipe/templates/pages/help.html | 2 +- src/bggpipe/templates/pages/titles.html | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/bggpipe/templates/pages/help.html b/src/bggpipe/templates/pages/help.html index e78c7f9..2e36e43 100644 --- a/src/bggpipe/templates/pages/help.html +++ b/src/bggpipe/templates/pages/help.html @@ -41,7 +41,7 @@

pick edition — a matched game with no legible edition cues stays version-less by design (never guess) — but you know which printing your box is. This fetches the game's complete version list into a Review ballot; pick yours there.

wrong match (inside the edit panel) — an auto-match landed on the wrong game (same-name impostors happen). This clears the match, re-searches immediately, and returns the title to Review as a fresh ballot of candidates (including same-named sibling editions); manual-id entry is there too for games BGG's search can't find. Note BGG sometimes splits one game's lineage across entries — Wiz-War's early editions and its FFG remake are separate games — so a copy whose edition isn't on the ballot may belong to the sibling entry.

add a game (top of the Titles page) — a game no photo shows: an expansion stored inside a base box, a game away from the shelves. It joins the list like any read (BGG wants base game and expansion as separate collection entries, so boxes that hold both need this for the hidden half), and if a later photo shows it, the sighting merges instead of duplicating.

-

remove (inside the edit panel) — for lines that shouldn't exist at all: a book read as a game, box art misread as a title. The line and its matches are discarded and stay gone. This is different from reject on the Review page, which keeps the line visible as "no BGG match" — right for real games BGG doesn't know.

+

remove (inside the edit panel) — for lines that shouldn't exist at all: a book read as a game, box art misread as a title, or a duplicate read — the same physical copy read differently from two photos, leaving two lines for one box (remove the worse read; the survivor keeps its own photos). This is different from reject on the Review page, which keeps the line visible as "no BGG match" — right for real games BGG doesn't know. And the mirror case — ONE line that's really several physical copies — wants split, not remove.

Undo: each decision is one record in data/title_edits.json, data/title_splits.json, or data/title_removals.json — delete the record and the next rebuild restores the old state.

diff --git a/src/bggpipe/templates/pages/titles.html b/src/bggpipe/templates/pages/titles.html index da7ceef..578cab4 100644 --- a/src/bggpipe/templates/pages/titles.html +++ b/src/bggpipe/templates/pages/titles.html @@ -44,7 +44,9 @@ function editorRow(c) { ${c.bgg_id && ["auto", "approved"].includes(c.status) ? `` : ""} - + saving re-queues this title for resolve with the corrected data @@ -176,6 +178,9 @@ document.getElementById("catbody").addEventListener("click", async e => { if (rm) { const f = rm.closest("form.editform"); if (!confirm(`Remove "${f.dataset.title}" from the titles list? ` + + `Right for a line that shouldn't exist: not a game, or a duplicate ` + + `read of a copy that's already its own line. ` + + `(One line for several REAL boxes? Use split instead.) ` + `Re-running extract won't bring it back — the removal is saved ` + `in data/title_removals.json (delete its record there to undo).`)) return; const res = await apiPost("/api/remove-title", {