Tasks board tag-counts honour the persona filter
Task 11757 (PR #7469) taught the Tasks board, `/api/tasks` and `/api/tasks/counts` the `persona` param. The command center's AI employees rows link to `/tasks?persona=<slug>`. The deferred gap: `GET /api/tasks/tag-counts` (`apps/api/app/routes/tasks/listing.py:766`, statements built by `_tag_count_queries` at :674) ignores `persona`. On a grouped board, filtered to a persona from the command center, the section header counts cover every persona while the rows show one. Router docstring at :500 says list, tag-counts and counts must share one filter contract.
Reproduction: a project with tasks of two personas sharing a tag; open `/tasks?persona=coder` grouped by tag → section header count includes the non-coder tasks.
Fix: accept `persona` in `task_tag_counts` and apply it through the same helper `list_tasks`/`get_task_counts` use; send it from the web board's tag-counts call (`apps/web/src/components/tasks/shared.tsx` `boardFilterParams`, if not already).
Acceptance:
- AC1: pytest — tag-counts with `persona=coder` counts only coder tasks; without it, unchanged (`apps/api/tests/test_task_tag_counts.py`).
- AC2: vitest — the grouped board passes `persona` to tag-counts.
Out of scope: other board filters, the command center UI, persona registry.
Done means: AC1 and AC2 tests green; `./dc check quick` green; merge lane `./dc check full` green.
Outcome
tag-counts now honours persona via board_row_clauses; web board sends it. AC1 pytest + AC2 vitest green, quick gate green, visual check on local stack shows headers match persona rows. PR #7484 queued in merge lane. Memory: none applied.
Artifacts
Activity
- Ready
- Runner started
- Runner ended (done)