Project

General

Profile

Actions

Feature #1541

closed
RA

Feature #1511: Replace ticket view with Kanban board for CTO and assigned developers

Aggregator: emit assignee and priority on ticket_list

Feature #1541: Aggregator: emit assignee and priority on ticket_list

Added by Redmine Admin 1 day ago. Updated 1 day ago.

Status:
Shipped
Priority:
Normal
Assignee:
-
Start date:
08/03/2026
Due date:
% Done:

0%

Estimated time:
spec_ref:

docs/superpowers/specs/2026-08-03-kanban-board-design.md

build_status:
build_number:
ci_run_url:
scan_status:
scan_report_url:
deploy_status:
preprod_url:
deployed_at:
branch:
feat/1541-ticket-list-assignee-priority
pr_url:
https://github.com/omdev-tech/aggregator/pull/24
security_key:
severity:
paused:

Description

**Surface:** aggregator (`../aggregator` — separate sibling repo)
**Depends on:** nothing
**Blocks (soft):** "API: assignee, priority and parent on the task list payload"

Extend the aggregator's `GET /api/projects/{project_key}` so each `ticket_list` entry carries the two fields the board's cards need and that the read-plane does not expose today: the **assignee** (stable id + display name) and the **priority** (stable id/key + display name + ordering position). Source them from the Redmine enrichment path that already populates `ticket_list`.

Both fields must be **nullable and purely additive**: Redmine issues can be unassigned, and priority may be absent. The dashboard is deployed on its own pipeline and will at some point run against either side of this change, in both directions.

The dashboard must keep getting all board data from here — no direct Redmine call is added downstream (dashboard gotcha #3: the aggregator is the only source of truth).

## Acceptance criteria
- [ ] Every `ticket_list` entry on `GET /api/projects/{project_key}` carries `assignee` (nullable object: id, display_name) and `priority` (nullable object: id/key, name, position).
- [ ] Both fields are declared optional/nullable in the response schema; a fixture with no assignee and no priority serialises to explicit `null` and returns 200.
- [ ] An issue whose Redmine assignee is a group or a deleted user serialises to `null` rather than raising.
- [ ] The change is purely additive: a consumer written against the previous schema still validates the new response (regression test on the pre-change response shape). No existing field is renamed, removed, or made non-nullable.
- [ ] Call-count assertion: rendering a project's ticket list issues the same number of upstream Redmine requests as before the change — no per-ticket detail call is introduced.
- [ ] A contract test pins the exact field names and types agreed with the dashboard's mapper, so a later rename fails here rather than in production.
- [ ] The enrichment doc under `../aggregator/docs/` documents both fields, their nullability, and their Redmine source.
- [ ] Gates green: `python -m pytest -q && ruff check .` in `../aggregator`.

Actions

Also available in: PDF Atom