Project

General

Profile

Actions

Feature #1545

closed
RA

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

Design: Kanban board section in the design system

Feature #1545: Design: Kanban board section in the design system

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:
pr_url:
security_key:
severity:
paused:

Description

**Surface:** design — documentation only, no application code
**Depends on:** nothing
**Blocks:** both frontend children

Decision **D4** and the epic's own AC #10: no frontend code before the board's UI/UX is specified and approved. `docs/design/design-system.md` is this repo's UI source of truth, so this is a real reviewable deliverable, not a placeholder. Run the **designer agent**; append a new sectioned entry following the existing section-code convention (PO/UH/SC/UR/SO/IR/…).

Note the two things that are genuinely new and have no precedent to copy: a **priority visual scale** (priority does not exist anywhere in this product today) and the **non-draggable card treatment** — a client's read-only board must read as deliberately non-interactive rather than broken.

## Acceptance criteria
- [ ] A new sectioned entry exists in `docs/design/design-system.md` with a stable section code and anchor; **the diff of this child touches only files under `docs/`**.
- [ ] Subsection checklist — each present and complete:
- [ ] (a) Board layout and column chrome: columns in `STAGE_ORDER` (all 10 statuses incl. Backlog 16 and Design 15), headers with counts, horizontal scroll, responsive/mobile behaviour.
- [ ] (b) Card anatomy: title, assignee name, priority, parent reference — with the unassigned, no-priority and no-parent states.
- [ ] (c) A priority visual scale — values, colours, ordering — enumerating every priority the aggregator can emit **plus the null case**.
- [ ] (d) Every drag state: idle, grab affordance, dragging, valid target, invalid target (Backlog and Blocked, for every role), dropping, rejected/rolled-back.
- [ ] (e) The client's read-only board: how a non-draggable card reads as intentional rather than broken.
- [ ] (f) Column show/hide filter; per-column and whole-board empty states; loading skeleton; error state; the over-cap "+N more" affordance.
- [ ] (g) Manual refresh control, its loading state, and any last-updated/stale indicator.
- [ ] (h) Card-move animation between polls, including the `prefers-reduced-motion` fallback.
- [ ] (i) Accessibility: a keyboard-only alternative to moving a card, focus order, ARIA roles, contrast ratios.
- [ ] (j) The full list of i18n keys to add, with ICU plural branches spelled out, for both `en.ts` and `fr.ts`.
- [ ] Every state is expressed in existing design-system tokens; any genuinely new token is listed explicitly as an addition with its justification.
- [ ] No complexity or price information appears in the section.
- [ ] **PO approval is recorded as a comment on this subtask, referencing the section anchor.** Without it the D4 gate is not passed and neither frontend child starts.

RA Updated by Redmine Admin 1 day ago Actions #1

  • Status changed from Spec to Design

## PO approval — D4 gate passed

Approved by the PO. The frontend children #1546 and #1547 are unblocked.

**Section:** `## Kanban board — ticketing (KB)`, `docs/design/design-system.md:6087`, anchor `#kanban-board--ticketing-kb`. Subsections KB.0–KB.11 cover all ten lettered acceptance criteria. Committed on `docs/1511-kanban-spec`, PR https://github.com/omdev-tech/PipeLiner-Client/pull/94. Diff is `docs/` only.

**Approved with two amendments already applied to the section**, both PO decisions taken after it was drafted:

1. **The assignee name renders for every viewer**, ordinary clients included. This reverses §IR for the *name* only — every capability stays internal-only and `StaffActionBar` still returns `null` for a client. #1543 lifts the `_detail_out` redaction so the card and the detail pane agree.
2. **`priorityToken` resolves on `priority_ref.position`**, not `key`. #1541 ships `key` as a slug of the display name, which is neither locale- nor rename-stable.

**Design decisions the implementers must not quietly undo:**
- Zero new colours — the priority scale reuses the §SO/§SM severity ladder. **Normal and null render no chip at all**; priority is always in the card's accessible name instead.
- The client's read-only board is absence + substitution, never padlocks or greying.
- Backlog and Blocked are locked for *different* reasons and the copy says which: Backlog because the server never offers it, Blocked because it is a decision rather than a gesture — reachable from the Move menu with a confirm, never by drag.
- KB.1a recomposes the `New request` CTA and `KnowledgeStrip` into the toolbar. Deleting the rail without them would remove the only intake path from this screen and the app's only reindex control.

The section's own review findings have been folded into #1542, #1543, #1546 and #1547 as ticket amendments.

RA Updated by Redmine Admin 1 day ago Actions #2

  • Status changed from Design to QA

## Delivered and shipped — moving to QA

Its last AC ("PO approval recorded as a comment") was satisfied on 2026-08-03; the ticket simply never advanced past `Design` afterwards, which left it as the epic's least-advanced child and held #1511's rollup at `Design`.

The deliverable is live: §KB.0–KB.11 is in `docs/design/design-system.md` on `master` (`c784f95`, deployed in build #109), and both frontend children were built against it — #1546's review checked the components section by section, and QA on #1546 confirmed the shipped board matches it.

It has also been amended twice since approval, by the tickets that changed the behaviour it describes:
- **§KB.3** — `priorityToken` resolves on `priority_ref.position`, not `key` (a slug of the localised display name, so neither locale- nor rename-stable).
- **§KB.2** — the assignee row renders for every viewer, reversing §IR for the *name* only.
- **§KB.1a / §KB.6e** — the three-number model, closing drift #1547 introduced: **header = what is shown, "+N more" = what was never fetched, pill = the whole project.**

Two self-contradictions inside §KB are known and unresolved, both harmless as shipped but worth settling before the next board change:
1. **Toolbar DOM order** — §KB.1a says tabs → knowledge → Columns → New request; §KB.9's tab-order sentence puts New request first. The code follows §KB.1a.
2. **The priority scale assumes the stock five-entry Redmine enumeration.** `position` is a rank *within whatever that instance configured*: four priorities shifts every rank down, six makes the top one unrecognised and fall to Normal. Both wrong-but-calm; commented in place, the real fix is upstream where the enumeration length is known.

Also unimplemented and named: **§KB.8.3's enter/exit fades** (a card new to the board, or gone from it). The exit half needs a mount-retention mechanism, and shipping enter-only would produce exactly the teleport-into-the-gap §KB.8.3 exists to prevent.

RA Updated by Redmine Admin 1 day ago Actions #3

  • Status changed from QA to Shipped

Shipped to production in master build #109 (`c784f95`). §KB.0–KB.11 is live in `docs/design/design-system.md` and both frontend children were built against it.

Actions

Also available in: PDF Atom