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):
applyFilters(): status === 'not-implemented' filters with
!c.implemented && c.type !== 'identity', hiding the 17 unimplemented
identities (14 elev, 3 vp) from the "Not implemented" filter.
buildSummary(): the nonId filter drops identities from the numerator anddenominator 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).
c.type — as a behavioral mutation check(a synthetic non-identity and identity with identical flags land in the same buckets), not a source grep.
tests/test_static_pages.py for any scanner guard that pins the oldexclusions and update it, so pytest and the node suite do not disagree.