lukedj78/dev-flow · MIT
scrum
Run a dev-flow project with agile scrum on the tracker chosen at design time — Linear, Jira or GitHub Issues: records the choice, creates or links the project, pushes `.workflow/tasks.md` into estimated, labelled, prioritised issues, sets up 2-week sprints (Linear cycles, Jira sprints, GitHub milestones), then keeps **the tracker as the source of truth** — new tasks up, status and velocity down, each sprint planned to the velocity target — and triages bugs by severity (S1–S4) without a PRD round-trip. Triggers: "porta il progetto in Linear / Jira / GitHub", "crea le issue", "setup scrum", "pianifica lo sprint", "report di velocity", "adotta questo progetto", "ho trovato un bug", "triage", or dev-flow routing from `tasks_split`. Modes: Choose, Setup, Adopt, Sync, Triage. Not for: writing or estimating the tasks (prd-to-tasks), fixing the bug or building the app (the owning skill), the headless server loop (docs/loop-engineering.md).
Contents
scrum — agile scrum on Linear, Jira or GitHub
This skill owns the tracker side of a dev-flow project. It writes to the chosen tracker and to the tracker /
scrum blocks of .workflow/meta.json. It never touches app code, and it never changes phase: it records
state and appends history, and is never a phase gate.
The method is the same on every tracker (references/scrum-model.md); only the adapter changes:
| Reference | How it talks | |
|---|---|---|
| Linear | references/linear.md | the Linear MCP |
| Jira | references/jira.md | the Atlassian Rovo MCP; story points with scripts/jira_estimate.py |
| GitHub | references/github.md | gh; issues with scripts/github_sync.py; a sprint is a milestone |
Issue bodies follow references/issue-standard.md on every tracker. Bugs follow references/triage.md.
The .workflow/ contract is references/contracts.md.
Preconditions
.workflow/meta.jsonexists (a dev-flow project). If not, say so and stop.- The tracker's connection works, checked with a read before any write:
list_teams(Linear),listJiraProjects
(Jira), gh auth status (GitHub). No account is created by this skill, and no token goes through the chat:
Jira REST reads JIRA_EMAIL / JIRA_API_TOKEN from the environment, GitHub uses gh auth, the MCPs the user's
OAuth.
- Setup needs
.workflow/tasks.md(prd-to-tasksfirst). Coupled format:scripts/task_key.pyderives the
dedup key from the - [ ] <Title> — <body> line, splitting on the em-dash; a hand-edited separator breaks
dedup.
Read state, then pick a mode
Run python3 scripts/meta_tracker.py <root>/.workflow/meta.json migrate first when meta.json has an older shape (a
linear block, tracker.kind, a map keyed by title — show_state.py names it): it moves everything into
tracker without dropping a key, and keeps titles it cannot find in tracker.unmatched.
- No
tracker.provider→ Choose. - A provider, no
tracker.project,tasks.mdpresent → Setup. - The project already exists on the tracker but
tracker.projectorissue_mapis missing → Adopt. tracker.projectpresent → Sync.- A bug reported (by the user, a test, an alert) → Triage, whatever the state.
Do one logical operation per invocation, then stop. Every mode is idempotent.
Choose (normally done by prd-from-idea)
Ask once where the work is managed. Default: the tracker the project or the client already uses; otherwise Linear.
Record it: meta_tracker.py <meta> choose --provider linear|jira|github.
Setup (new project)
Ask the user's yes before the first write — it creates a project and issues on an outside service.
- Resolve the container in the tracker's reference: Linear Project under the team; Jira project + scrum board
(listJiraBoards); GitHub repository.
- Ensure the scrum configuration: estimates, the sprint (Linear: the user creates the cycle in the app; Jira:
manageJiraSprint; GitHub: the milestone named by the sprint goal), the states.
- Labels: discover, don't assume. Map the buckets (web / agent / scaffold) and the severity labels onto what the
tracker already has; create only what is missing (scrum-model.md).
- Push
tasks.md→ issues, one per open task: estimate from theEstimated:hint (Fibonacci), priority from the
Priority: hint, labels. GitHub: scripts/github_sync.py <root> --repo O/N (it migrates an older map first and
names the tasks with no priority). Linear and Jira: the reference's tools, then `meta_tracker.py <meta>
record-issues --mapping '{"<task_key>": "<KEY>"}'. Then pack the sprints (scrum-model.md`: by priority band
and capacity, spare capacity kept at the end of a release) and assign each issue to its sprint — on GitHub
gh issue edit <n> --milestone "<Sprint N — goal>", with the plan in .workflow/sprints.md. Never every task into
Sprint 1.
- Write the bodies to
references/issue-standard.md— one sample first, approved by the user. - Persist:
meta_tracker.py <meta> upsert --provider P --project '<json ids>' --url <url>(it also ensures the
scrum defaults), then a history entry through dev-flow/scripts/update_meta.py append-history --skill scrum
(action: setup). No phase bump.
Adopt (existing project, partly on the tracker)
- Discover the existing project and issues (reads only).
- Match issues to
tasks.mdby title →task_key, and backfillissue_mapwithrecord-issues; create
nothing.
ensure-scrum, thenupsertwith the discovered ids. Historyaction: adopt.
Sync (ongoing)
- Push new tasks: each
tasks.mdline whosetask_keyis not inissue_map(GitHub:github_sync.pydoes
exactly this; --milestone puts that run's new issues straight into the current sprint). Never edit or re-push existing issues — the tracker owns status, ordering, estimates.
- Pull status and velocity from the tracker (the reference says how).
- Plan the sprint up to
scrum.velocity_target(scrum-model.md). - Report to chat: committed vs done, carry-over, blocked, open bugs by severity. No report file.
- An issue created mid-sprint that matches no PRD story is a scope change: it passes
prd-from-idea/references/scope-check.md before it enters the sprint. A descoped story's issues go back to the
backlog with the reason in a comment — never deleted.
- History
action: sync.
Triage (a bug)
references/triage.md: reproduce on the real app (verify-<app>), give the severity (S1–S4) with a one-line
reason, create the issue (bug + severity, steps, expected, observed, evidence — **never an end user's personal
data**), put S1/S2 in the current sprint, S3 up for the next sprint planning and S4 in the backlog, history
action: triage. Triage stops there:
the fix is the normal path — a test that reproduces it (red → green), the skill that owns the code, a PR that cites
the issue, verification on the app, then the issue closed with the commit.
Definition of Done (per run)
- Setup: the tracker lists the pushed issues;
meta.json#trackerpopulated; a re-run creates no duplicates. - Sync: the sprint holds planned issues up to the velocity target, and a report was given.
- Triage: the issue exists with severity and evidence, in the right sprint or the backlog.
- Scripts green:
cd scrum/scripts && python3 -m unittest discover -p 'test_*.py'.
What this skill does NOT do
- Write or estimate the tasks (
prd-to-tasks), fix a bug or build the app (the owning skill). - Run human ceremonies (standup, retro).
- Move a project from one tracker to another, or support other trackers.
- Bump
phase.
Provenance
Authored by lukedj78 in lukedj78/dev-flow. The content is mirrored here under its upstream license.