Skip to main content

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: GEHR on ghasitech.atlassian.net


1. Goal

Distribute stories into the correct sprint using only:

No story labels are required.


2. Rule Precedence

Apply rules in this order:

  1. Keep existing sprint if already set manually.
  2. If story has a parent epic with sprint set, inherit epic sprint.
  3. If story has parent epic but epic sprint is empty, resolve epic to slice and assign default sprint wave.
  4. If epic cannot be resolved, route story to triage sprint.

3. Sprint Naming Convention

GEHR-S{slice}-Sprint-{N}

Examples:

  • GEHR-S0-Sprint-1
  • GEHR-S1-Sprint-3
  • GEHR-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.

SliceMilestoneWave AWave BWave C
S0M0 Platform FoundationGEHR-S0-Sprint-1GEHR-S0-Sprint-3GEHR-S0-Sprint-5
S1M1 Core ClinicalGEHR-S1-Sprint-1GEHR-S1-Sprint-3GEHR-S1-Sprint-5
S2M2 Orders and BillingGEHR-S2-Sprint-1GEHR-S2-Sprint-3GEHR-S2-Sprint-5
S3M3 Integrated CareGEHR-S3-Sprint-1GEHR-S3-Sprint-3GEHR-S3-Sprint-5
S4M4 Full PlatformGEHR-S4-Sprint-1GEHR-S4-Sprint-3GEHR-S4-Sprint-5
S5M5 National ScaleGEHR-S5-Sprint-1GEHR-S5-Sprint-3GEHR-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-Sprint and 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.

  1. Ensure each story has a parent epic.
  2. Bulk assign sprint to epics using epic code mapping (Section 5).
  3. Run Rule C once to cascade sprint to children.
  4. 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-Sprint exceeds 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 Type
  • Parent (for stories/tasks/bugs)
  • Epic Summary following epic code convention
  • Sprint field

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:

  • SprintSetBy select custom field (Manual, Auto-Epic, Auto-Rule, Bulk-Import)
  • LockedForRelease checkbox custom field
  • WaveOverride select custom field (A, B, C)
  • Milestone custom field (M0 to M5)