The suggestion pills return: the client learns the object shape

Eric: "Everything says no matching openings yet. How would I get
started?" — because the client still mapped suggestion STRINGS while
the server sent {id, reunites} objects. The edit teaching the pills
the new shape (and the ♥ reunification marker) died in a script abort
during the ranking batch, and the retry re-applied everything except
it; the arrangement screenshot that "verified" the batch predated the
ranking change, so no check ever looked at pills until now. Verified
against the real library this time: 296 pills, zero false
no-matching rows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jXZFSTZQKzAC8fqpWSz9g
This commit is contained in:
Eric Wagoner
2026-08-09 14:24:25 -04:00
co-authored by Claude Fable 5
parent f4f3877651
commit 75162c3e2e
+9 -4
View File
@@ -143,10 +143,15 @@ function unitRows(openings) {
function unshelvedRow(g) {
const dims = g.measured ? "" : ` <span class="chip open" title="no trusted size — fit can't be verified">unmeasured</span>`;
const gos = g.suggestions.map(id => {
const o = openingById(id);
return o ? `<button class="suggest" data-key="${esc(g.key)}" data-id="${esc(id)}"
title="fits, with room to spare">→ ${esc(o.unit)} · ${esc(o.label)}</button>` : "";
const gos = g.suggestions.map(s => {
const o = openingById(s.id);
if (!o) return "";
const why = s.reunites
? "its series-mates live here — fits, with room"
: "fits, with room to spare";
return `<button class="suggest ${s.reunites ? "reunites" : ""}"
data-key="${esc(g.key)}" data-id="${esc(s.id)}" title="${esc(why)}">
${s.reunites ? "♥ " : "→ "}${esc(o.unit)} · ${esc(o.label)}</button>`;
}).join("");
const gosOut = gos
|| (g.measured ? `<span class="meta">no matching openings yet</span>` : "");