← all tickets

67 — Identities join the cards-page filter and coverage counters

Status: done (commit a2e7547, 2026-08-04)

Blocked by: 68

Where this came from: ticket 49 noted these two survivors of the original cards page (314dc7b) as deliberately out of scope — "a product call about what the filter and the coverage counters should mean now that identities are implementable". The product call was made in the 2026-08-04 grilling session; this ticket is now fully specified.

The two exclusions, both in static/cards.js (or, after ticket 68, in the extracted logic module — this ticket edits wherever that code lives by then):

!c.implemented && c.type !== 'identity', hiding the 17 unimplemented identities (14 elev, 3 vp) from the "Not implemented" filter.

denominator of the total and per-pack coverage chips.

Decisions — made, not open:

1. Identities are first-class in both places. Delete both c.type !== 'identity' clauses (and buildSummary's nonId layer); nothing replaces them. No new branching on c.type anywhere — the same "never implicit" rule ticket 49 enforced for the columns. 2. The vanilla two (30076, 30077) count as implemented, full stop. They ship implemented: true, vanilla: true, so keying on implemented alone already places them correctly — under the "Implemented" filter and in the numerator. N/A remains a *test-column* concept (evidence), not a status/coverage concept. No vanilla filter option, no vanilla chip. 3. The logic stays client-side. The earlier note here preferring server/routers/cards.py is superseded: ticket 68's node harness makes the client logic testable, which was the entire motivation for moving decisions server-side. The /api/cards payload already carries everything needed (implemented, vanilla, type, pack), all pinned by tests/test_api.py.

Expected visible change: the headline numbers shift truthfully — 17 unimplemented identities join the denominators, 10 implemented ones (8 hooked + 2 vanilla) join the numerators, total and per-pack alike. The "Not implemented" filter gains 17 rows the table already reported honestly.

Tests (node, on the extracted module):

one; "Implemented" includes both a hooked identity and a vanilla one.

numerator. Build expectations from synthetic card lists in the test, not from live manifest counts — the suite must not go red when an identity gets implemented (the lesson of ticket 49 round 2 and ticket 66 finding 4).

(a synthetic non-identity and identity with identical flags land in the same buckets), not a source grep.

exclusions and update it, so pytest and the node suite do not disagree.