# Stackline · Sprint board — Product Requirements (v3.4)

Stackline Board is a single-sprint kanban board for a product team. Cards move across To do, In progress, Review and Done under workflow rules (WIP limits, blocked flags, assignee and subtask gates), can be filtered and grouped, and every move keeps the sprint progress and burndown in step with the board.

**Problem.** A team board is only trustworthy if the workflow rules cannot be bypassed and the numbers on screen (column counts, points, sprint progress, burndown) always agree with the cards.

## Users
- **Team member** — Drag work forward, see what is blocked and keep tickets up to date without breaking the rules.
- **Scrum master** — See sprint progress and WIP at a glance and rely on limits being enforced.

## Goals
- Workflow rules are enforced identically in the UI and the API, with specific messages.
- A card lands exactly where it is dropped and the move is logged.
- Sprint totals, column headers and the burndown always reflect the current cards.

## Sprint header (HDR)

Sprint dates, goal, progress and burndown.

- **FR-HDR-01** (Must) The header shows the sprint name, date range, days left, goal, a progress line with bar and a burndown chart with ideal and actual lines.
  - "Sprint 24", chip "6 days left" (tooltip "Sprint ends 25 Oct"), line "12 Oct – 25 Oct 2026 · Today Mon 19 Oct"
  - Goal "Saved cards and promo fixes ready for the Checkout v2 beta"
  - Progress "11 of 57 pts done (19%)"; caption "Burndown · 46 pts left"
  - Burndown has 8 dots; first tooltip "12 Oct: 57 pts remaining", last (hollow) "19 Oct: 46 pts remaining"
- **FR-HDR-02** (Must) Sprint progress and the burndown follow the cards in Done immediately: done points are the sum of points of cards in Done, percentage is done / total rounded, and the last burndown point equals total minus done.
  - PCL-111 (2 pts) to Done: "13 of 57 pts done (23%)", "Burndown · 44 pts left", tooltip "19 Oct: 44 pts remaining", DONE "5" and "13 pts"
  - PCL-109 (3 pts) to Done: "14 of 57 pts done (25%)", "43 pts left"
- **FR-HDR-03** (Should) Total sprint points follow card estimates, and filters never change sprint totals.
  - Setting PCL-117 to 3 points gives "11 of 60 pts done (18%)"
  - With "Only my issues" on, progress stays "11 of 57 pts done (19%)"

## Board and cards (BRD)

Columns, card display, grouping and reset.

- **FR-BRD-01** (Must) Each column header shows its issue count, WIP limit (if any) and story points; a column at its limit is shown in amber. The toolbar and footer show the total number of issues.
  - TO DO 8 · 24 pts (tooltip "No WIP limit"); IN PROGRESS "4 / 4" amber · 19 pts (tooltip "WIP limit 4"); REVIEW "2 / 3" · 3 pts; DONE 4 · 11 pts
  - Order: TO DO PCL-101 to 105, 116, 117, 118; IN PROGRESS PCL-106 to 109; REVIEW PCL-110, 111
  - "18 issues"; footer "Stackline board · 18 issues · build 3.4.0"; TO DO ends with "+ Create issue"
- **FR-BRD-02** (Should) A card shows type glyph, key, title, epic chip, label dots, due chip, subtask meter, priority chevron, points badge and assignee avatar, each with a tooltip.
  - PCL-101: tooltips "Story", "Epic: Checkout v2", "frontend", "mobile", "Due 23 Oct", "1 of 2 subtasks done", "Priority: High", "5 story points", "Anh Nguyen"
- **FR-BRD-03** (Could) Overdue, due-today, unassigned and unestimated cards are visually distinct.
  - PCL-102: red chip "17 Oct", tooltip "Overdue · was due 17 Oct", "Priority: Urgent", dashed avatar "Unassigned"
  - PCL-108: yellow chip "Today", tooltip "Due today"
  - PCL-117: badge "–", tooltip "Not estimated", "Priority: Low"
- **FR-BRD-04** (Could) A blocked card is marked with a red bar and flag; a done card has a struck-through key and a green tick.
  - PCL-108: tooltip "Flagged as blocked", comment count "2"
  - PCL-112: struck-through key, tick tooltip "Done"
- **FR-BRD-05** (Should) Grouping splits the columns into lanes by assignee (people in order, Unassigned last) or by epic (then "No epic"); None restores one board.
  - Assignee: first lane "Anh Nguyen · 4 issues"; last lane "Unassigned · 2 issues" with PCL-102 and PCL-116; empty cells read "No issues" or "Nothing done yet"
  - Epic: Checkout v2, Onboarding, Reliability, No epic; Reliability holds PCL-107, PCL-108, PCL-113
- **FR-BRD-06** (Could) The reset control restores the seeded sprint and clears all filters.
  - Tooltip "Reset sprint data"; toast "Sprint data restored"

## Filters (FLT)

Mine, assignee, label and search filters.

- **FR-FLT-01** (Must) Only my issues keeps the signed-in user’s cards, shows partial counts and can be cleared.
  - Signed in as Chi Tran (CT); "Showing 3 of 18 issues": PCL-103, PCL-109, PCL-112
  - Headers "1 of 8", "1 of 4 / 4", "0 of 2 / 3" (REVIEW "No issues"), "1 of 4"
  - "Clear filters" restores all 18 cards
- **FR-FLT-02** (Should) Avatar quick-filters combine as OR and include an Unassigned option.
  - AN + BL: "Showing 7 of 18 issues"
  - Unassigned only: PCL-102 and PCL-116, "Showing 2 of 18 issues"
- **FR-FLT-03** (Must) The Labels filter ("SHOW ISSUES WITH ALL OF") keeps only issues carrying every ticked label; the button shows the number ticked.
  - Labels: frontend, backend, payments, mobile, a11y, tech-debt
  - frontend + payments: badge "2", "Showing 2 of 18 issues": PCL-106 and PCL-111
  - frontend + mobile: PCL-101 and PCL-109
- **FR-FLT-04** (Should) Search matches key and summary, case-insensitively.
  - "card": only PCL-106
  - "pcl-11": PCL-110 to PCL-118 (9 issues)
  - "zzz": "Showing 0 of 18 issues"

## Moving cards (MOV)

Drag and menu moves with workflow rules.

- **FR-MOV-01** (Must) A column at its WIP limit refuses any further card and says so; the card stays where it was. While dragging over a full column it shows a red "WIP limit reached" hint.
  - Move PCL-101 to In progress: toast "WIP limit reached for In progress (4)"; header stays "4 / 4"
  - Review limit 3: "WIP limit reached for Review (3)"
- **FR-MOV-02** (Must) A dropped card takes the position it was dropped at, in the same or another column, and the move is logged in Activity and persists after reload.
  - PCL-103 dropped on the top half of PCL-110: toast "PCL-103 moved to Review"; REVIEW reads PCL-103, PCL-110, PCL-111; headers REVIEW "3 / 3" · 4 pts, TO DO 7 · 23 pts
  - Activity "2026-10-19 09:30 Chi Tran moved To do → Review"
  - Re-rank PCL-118 above PCL-101: no toast; Activity "Chi Tran re-ranked in To do to position 1"; still first after reload; TO DO stays 8 · 24 pts
- **FR-MOV-03** (Must) A flagged issue cannot move forward until the flag is removed; removing and re-adding the flag is logged.
  - Status to Review on PCL-108: "PCL-108 is flagged as blocked — remove the flag first"; status unchanged
  - Unflag: toast "Flag removed from PCL-108"; then move succeeds: "PCL-108 moved to Review"
  - Activity: "moved In progress → Review" and "flag removed"
- **FR-MOV-04** (Must) Review requires an assignee: an unassigned issue cannot enter Review and an issue in Review cannot be unassigned.
  - "Assign someone before moving to Review"
  - Unassigning in Review: error under Assignee "Issues in Review need an assignee"; assignee unchanged
  - Assigning shows toast "Assigned to Duc Pham"
- **FR-MOV-05** (Must) Done requires every subtask closed; subtasks of a Done issue cannot be reopened until the issue is reopened.
  - PCL-109 (1/3) to Done: "2 subtasks still open"; stays in IN PROGRESS
  - After ticking all: toast "PCL-109 moved to Done"; DONE "5" and "14 pts"
  - Unticking a subtask of a Done issue: "Reopen the issue before reopening its subtasks"

## Issues (ISS)

Create, edit and discuss issues.

- **FR-ISS-01** (Should) An issue is created inline with a type (Task, Bug…) and a summary of 3–120 characters; it gets the next key and is added at the bottom of To do.
  - "ab": "Summary must be 3–120 characters"
  - "Fix footer links": toast "Created PCL-119"; red Bug glyph, dashed avatar, points "–"; TO DO "9", toolbar "19 issues", progress unchanged
- **FR-ISS-02** (Should) Title, story points (1, 2, 3, 5, 8, 13 or none), priority and labels save on change, update the card and totals, and each change is listed in Activity, newest first.
  - PCL-117: renamed, points – → 3, priority low → high, labels frontend → a11y; TO DO "27 pts"
  - Activity lines such as "priority low → high", "story points — → 3", "labels: a11y"
- **FR-ISS-03** (Should) A due date must fall inside the sprint.
  - 30 Oct 2026: "Due date must be within the sprint (ends 2026-10-25)"
  - 24 Oct 2026 accepted: chip "24 Oct", tooltip "Due 24 Oct"
- **FR-ISS-04** (Should) Subtasks of 2–80 characters can be added and ticked; the card meter follows.
  - "x": "Subtask must be 2–80 characters"; Add is disabled while the input is empty
  - PCL-106 "2 of 3 done" → add "Empty state" → "2 of 4 done" → tick one → card meter "3/4", tooltip "3 of 4 subtasks done"
- **FR-ISS-05** (Could) Comments (up to 1000 characters) are listed newest first; @mentions of unknown people are refused and known ones are highlighted with the person’s name in a tooltip.
  - "Ping @ZZ please": "Unknown mention @ZZ"; text kept
  - "@AN contrast now 4.6:1" with Ctrl+Enter: toast "Comment added"; badge and card icon "1"
- **FR-ISS-06** (Could) An issue has a deep link that opens its dialog; an unknown key reports it.
  - /kanban/issue/PCL-105 opens "Welcome email shows wrong first name"; closing returns to /kanban/ and Back reopens it
  - /kanban/issue/PCL-999: "Issue PCL-999 not found"

## Board API (API)

REST access to the board and moves.

- **FR-API-01** (Should) The move endpoint enforces the rules in order — WIP limit, flag, assignee, subtasks — and honours the target index.
  - Board: 18 issues; doing 4/4, review 2/3; totalPoints 57, donePoints 11, burndown ending 46
  - PCL-101 to doing: 409 "WIP limit reached for In progress (4)"
  - PCL-108 to review: 422 "PCL-108 is flagged as blocked — remove the flag first"
  - PCL-116 to review: 422 "Assign someone before moving to Review"
  - PCL-109 to done: 422 "2 subtasks still open"
  - PCL-103 to review at index 0: 200, order PCL-103, PCL-110, PCL-111
- **FR-API-02** (Could) Field validation and unknown keys are reported with specific statuses.
  - Points 4: 400 "Story points must be one of 1, 2, 3, 5, 8, 13"
  - GET unknown issue: 404 "Issue PCL-999 not found"

## Non-functional requirements

- **NFR-01** (Must) Data integrity: a refused move or edit leaves the board, counts and sprint totals exactly as they were.
- **NFR-02** (Should) Consistency: the UI and the API show the same rule messages.

## Glossary and rules

- **WIP limit** — Maximum number of cards a column may hold.
- **Flagged** — Marked as blocked; the issue may not move forward.
- **Burndown** — Points remaining (total minus done) at each sprint day against an ideal line.

## Out of scope

- Multiple sprints or backlog
- Real-time collaboration
