Jira Epic-Based Sprint Ruleset (No Story Labels)
Use this ruleset when stories in Jira do not have labels. Sprint placement is derived from the parent epic and milestone slice mapping.
Jira project:
GEHRonghasitech.atlassian.net
1. Goal
Distribute stories into the correct sprint using only:
- Parent epic
- Epic code or epic summary convention (for example
REG-EPIC-03) - Existing slice roadmap in slice-epic-story-mapping.md
No story labels are required.
2. Rule Precedence
Apply rules in this order:
- Keep existing sprint if already set manually.
- If story has a parent epic with sprint set, inherit epic sprint.
- If story has parent epic but epic sprint is empty, resolve epic to slice and assign default sprint wave.
- If epic cannot be resolved, route story to triage sprint.
3. Sprint Naming Convention
GEHR-S{slice}-Sprint-{N}
Examples:
GEHR-S0-Sprint-1GEHR-S1-Sprint-3GEHR-S4-Sprint-5
4. Slice and Default Sprint Wave
Each slice uses default sprint waves:
- Wave A (foundation/blockers): Sprint 1
- Wave B (core implementation): Sprint 3
- Wave C (hardening/integration): Sprint 5
This produces deterministic defaults when no additional story metadata exists.
| Slice | Milestone | Wave A | Wave B | Wave C |
|---|---|---|---|---|
| S0 | M0 Platform Foundation | GEHR-S0-Sprint-1 | GEHR-S0-Sprint-3 | GEHR-S0-Sprint-5 |
| S1 | M1 Core Clinical | GEHR-S1-Sprint-1 | GEHR-S1-Sprint-3 | GEHR-S1-Sprint-5 |
| S2 | M2 Orders and Billing | GEHR-S2-Sprint-1 | GEHR-S2-Sprint-3 | GEHR-S2-Sprint-5 |
| S3 | M3 Integrated Care | GEHR-S3-Sprint-1 | GEHR-S3-Sprint-3 | GEHR-S3-Sprint-5 |
| S4 | M4 Full Platform | GEHR-S4-Sprint-1 | GEHR-S4-Sprint-3 | GEHR-S4-Sprint-5 |
| S5 | M5 National Scale | GEHR-S5-Sprint-1 | GEHR-S5-Sprint-3 | GEHR-S5-Sprint-5 |
5. Epic Prefix to Slice Rules
Resolve epic to slice using epic code in epic summary/name.
S0 prefixes
IAM-EPIC-01 to IAM-EPIC-05, TEN-EPIC-01 to TEN-EPIC-08, HIER-EPIC-01 to HIER-EPIC-05, LICN-EPIC-01 to LICN-EPIC-04, ACPOL-EPIC-01 to ACPOL-EPIC-04, AUD-EPIC-01 to AUD-EPIC-05, CFG-EPIC-01 to CFG-EPIC-06, FHIR-EPIC-01, TERM-EPIC-01, AIO-EPIC-01, PADM-EPIC-01 to PADM-EPIC-03, DESK-EPIC-01, DESK-EPIC-02
S1 prefixes
REG-EPIC-01 to REG-EPIC-06, SCHED-EPIC-01 to SCHED-EPIC-08, PROV-EPIC-01 to PROV-EPIC-05, FAC-EPIC-01 to FAC-EPIC-06, PCHART-EPIC-01 to PCHART-EPIC-07, CNOTE-EPIC-01 to CNOTE-EPIC-04, VIT-EPIC-01 to VIT-EPIC-04, PROB-EPIC-01 to PROB-EPIC-05, ALG-EPIC-01 to ALG-EPIC-04, MED-EPIC-01 to MED-EPIC-05, DESK-EPIC-03, AIO-EPIC-02
S2 prefixes
ORD-EPIC-01 to ORD-EPIC-06, RES-EPIC-01 to RES-EPIC-05, TERM-EPIC-02 to TERM-EPIC-06, BILL-EPIC-01 to BILL-EPIC-02, DOC-EPIC-01 to DOC-EPIC-08
S3 prefixes
LAB-EPIC-01 to LAB-EPIC-06, PHARM-EPIC-01 to PHARM-EPIC-05, EPRESC-EPIC-01 to EPRESC-EPIC-05, PPORT-EPIC-01 to PPORT-EPIC-05, DCOM-EPIC-01 to DCOM-EPIC-11, INS-EPIC-01 to INS-EPIC-04, DESK-EPIC-04, DESK-EPIC-05
S4 prefixes
RAD-EPIC-01 to RAD-EPIC-05, BILL-EPIC-03 to BILL-EPIC-05, CLM-EPIC-01 to CLM-EPIC-04, INS-EPIC-05 to INS-EPIC-08, HPOP-EPIC-01 to HPOP-EPIC-10, IMMZ-EPIC-01 to IMMZ-EPIC-05, CP-EPIC-01 to CP-EPIC-04, HL7-EPIC-01 to HL7-EPIC-03, AIO-EPIC-03, ACPOL-EPIC-05 to ACPOL-EPIC-07, DESK-EPIC-06, DESK-EPIC-08, DESK-EPIC-09, DESK-EPIC-10
S5 prefixes
PADM-EPIC-04 to PADM-EPIC-07, TERM-EPIC-07, TERM-EPIC-08, DOC-EPIC-09 to DOC-EPIC-12, REG-EPIC-07 to REG-EPIC-11, DESK-EPIC-11, hardening epics
5.1 Wave Assignment Override Rules
Default wave is Wave B (Sprint 3).
Wave A (Sprint 1): platform blockers and foundation epics.
FHIR-EPIC-01,AIO-EPIC-01,DESK-EPIC-01,DESK-EPIC-02,IAM-EPIC-01,TEN-EPIC-01
Wave C (Sprint 5): hardening and late-slice integration.
- All S5 epics
- Any epic summary containing
hardening,optimization,accessibility,perf,L4 gate
When wave cannot be inferred confidently, keep default Wave B.
Reference source: slice-epic-story-mapping.md
6. Jira Automation Rules (No Labels)
Rule A: Story inherits sprint from parent epic
- Trigger: Issue created or Parent changed
- Condition: Issue type in
Story,Task,Bug; Parent is Epic; Sprint is empty or previously auto-set - Action: Set story sprint = parent epic sprint
Pseudo logic:
IF (issue.sprint is empty OR issue.SprintSetBy in ["Auto-Epic", "Auto-Rule", "Bulk-Import"])
AND issue.parent is Epic
AND issue.parent.sprint is not empty
THEN issue.sprint = issue.parent.sprint
AND issue.SprintSetBy = "Auto-Epic"
Rule B: Auto-assign epic sprint from epic code
- Trigger: Epic created or Epic updated
- Condition: Epic sprint is empty
- Action: Parse epic code from epic summary/name; map to slice using Section 5; assign default wave sprint (Wave B unless overridden)
Default wave policy:
- New epics default to Wave B (Sprint 3)
- Use Wave A only for platform blockers
- Use Wave C for hardening/integration epics
Pseudo logic:
IF epic.sprint is empty
AND epic.code resolves to slice Sx
AND epic.code is within defined range for Sx
THEN epic.sprint = GEHR-Sx-Sprint-3
ELSE epic.sprint = GEHR-TRIAGE-Sprint
Rule C: Rebalance child stories when epic sprint changes
- Trigger: Epic sprint changed
- Condition: Child story sprint differs from epic sprint
- Action: Update child story sprint to epic sprint unless story is explicitly locked
Pseudo logic:
FOR each child in epic.children
IF child.LockedForRelease != true
AND child.SprintSetBy != "Manual"
THEN child.sprint = epic.sprint
AND child.SprintSetBy = "Auto-Epic"
Rule D: Send unresolved items to triage
- Trigger: Story created with parent epic but mapping fails
- Condition: Epic code does not match known ranges, or summary format invalid
- Action: Assign story to
GEHR-TRIAGE-Sprintand add comment with failure reason
7. Manual Bulk Distribution (One-Time Backlog Cleanup)
Use this when current stories have no labels and no sprint assignment.
- Ensure each story has a parent epic.
- Bulk assign sprint to epics using epic code mapping (Section 5).
- Run Rule C once to cascade sprint to children.
- Review triage sprint for unresolved epics.
Recommended JQL checks:
project = GEHR AND issuetype in (Story, Task, Bug) AND sprint is EMPTY AND "Epic Link" is not EMPTY
project = GEHR AND issuetype = Epic AND sprint is EMPTY
project = GEHR AND sprint = "GEHR-TRIAGE-Sprint"
8. Governance Guardrails
- Do not override sprint when
SprintSetBy = Manual. - Do not assign stories without parent epics; route them to triage.
- Keep epic summary naming consistent (
XXX-EPIC-NN: short title). - Re-run unresolved triage weekly.
- Alert Jira admins if
GEHR-TRIAGE-Sprintexceeds 10 items. - Escalate items that remain in triage for more than 2 weeks.
9. Minimal Data Contract for Jira
For this ruleset to work, every backlog item must have:
Issue TypeParent(for stories/tasks/bugs)Epic Summaryfollowing epic code conventionSprintfield
Epic Summary naming convention:
- Format:
PREFIX-EPIC-NN: Short Title - Valid example:
REG-EPIC-01: Patient CRUD + FHIR - Invalid:
Patient Registration(missing code) - Invalid:
REG-01: Patient CRUD(wrong code format)
Optional but recommended:
SprintSetByselect custom field (Manual,Auto-Epic,Auto-Rule,Bulk-Import)LockedForReleasecheckbox custom fieldWaveOverrideselect custom field (A,B,C)Milestonecustom field (M0 to M5)