v1.5.6 — abilities review queue: bulk-mark + kind/label filters
- **API**: `PATCH /api/abilities/labels/bulk` — applies the same label to many abilities in one transaction. Body: `{ability_ids: [...], label: "<label>", notes?: "..."}`. Returns…
Added — bulk apply + filter controls for the T-108 review queue
- API:
PATCH /api/abilities/labels/bulk— applies the same label to many abilities in one transaction. Body:{ability_ids: [...], label: "<label>", notes?: "..."}. Returns{updated: N, skipped_unknown_ids: [...]}. Rejects invalid labels with 422. Same locking semantics as the single-PATCH endpoint (source='user',confidence=1.0). - API:
GET /api/abilities/review-queuenow accepts?kind=action|status|unknownand?current_label=<label>filter params.current_label=(empty string) restricts to rows that have no label row at all yet. - UI (web/src/Abilities.jsx) — review queue now has:
- kind / current label dropdowns above the list
- Per-row checkbox + "Select all" / "Deselect all"
- Bulk apply bar appears when any row is selected: pick a label from the dropdown, click "Apply to selected", all selected rows land with
source=user - "Mark all kind=unknown as ignore" shortcut button (top-right of filter bar) — fetches up to 500 unknown-kind rows and one-shots them to
ignore. Targets the ~196 boss/environmental rows the v0.12.0 live AC noted. - Selected rows render with a blue highlight; bulk-apply result reported inline with refresh.
- 6 new tests in tests/test_ability_labels_api.py: kind filter restricts results, current_label filter incl. empty-string for no-label rows, bulk writes user-source, bulk skips unknown IDs without failing, bulk rejects invalid label, bulk empty-list is no-op. 366 tests passing (360 → 366).