SfSkills Domains Docs GitHub

Home / admin / moscow-prioritization-for-sf-backlog

moscow-prioritization-for-sf-backlog

Use this skill when prioritizing a Salesforce backlog with the MoSCoW method (Must / Should / Could / Won't) plus an effort + value lens, deciding what fits in the next sprint or release, and using WSJF as a tie-break when MoSCoW alone produces ties.

Open the skill folder on GitHub


MoSCoW Prioritization for Salesforce Backlog

This skill activates when a Salesforce delivery team needs to prioritize a backlog of user stories or change requests for a sprint, release, or roadmap horizon. It produces a fixed-shape prioritized backlog: each row carries a MoSCoW tag, an effort tier, a value tier, an optional WSJF tie-break score, a release target, and a one-line rationale. The output is the canonical handoff into the release-train-planner, the orchestrator, and the deployment-risk-scorer agents.


Before Starting

Gather this context before running a prioritization session:


Core Concepts

The MoSCoW Rubric

MoSCoW comes from DSDM/Agile Project Framework and forces every backlog item into one of four named buckets. The discipline is in the definitions, not in the act of labelling.

BucketMeaningEffort capWhat happens if it slips
Must have (M)Release fails its objective if not delivered: regulator requires it, contractual deadline depends on it, org won't function without itDSDM canon: ≤ ~60% of total release effort. Above 60% → overcommitted, at riskRelease fails — escalate, re-tag, or extend horizon
Should have (S)Important and high-value, but not release-breakingNone, but commit cap: Must + Should ≤ ~80% of capacityRelease ships; stakeholders unhappy. Natural overflow when capacity is tight
Could have (C)Nice to have. Polish, reporting refinements, minor UX upgradesStretch goals only — fill slack, never commitBuffer that absorbs estimate misses on Musts/Shoulds
Won't have — this release (W)Agreed-out for current horizon; candidate for a future releasen/aGoes back to backlog tagged for re-grooming
Won't have — ever (W)Permanently out of scope (regulatory, architectural, strategic)n/aArchive with documented rationale — do not let it ferment

The most common MoSCoW failure mode is everything-is-Must. If the backlog has more than ~60% Must by effort, the rubric has degraded into a wishlist and the prioritization session has not actually happened.

The Effort + Value Lens

MoSCoW alone is a coarse signal. Pair every item with two orthogonal scales so the team can sort within a bucket and detect cheap wins:

Effort tier (S/M/L/XL):

TierIndicative scope
SHalf a day or less (a field, a list view, a permission set tweak)
MOne to three days (a record-triggered flow, a small report bundle, a validation rule pack)
LThree to ten days (a multi-object flow, a Lightning page redesign, an Apex trigger refactor)
XLMore than ten days (a new object model, an integration, a Lightning component suite). XL items in a sprint are a smell — split.

Value tier (1–5): business value as judged by the sponsor.

TierIndicative business value
5Strategic; tied to a board-level OKR or a regulatory deadline
4High; closes a meaningful pain point or unlocks revenue
3Solid; clear ROI but not strategic
2Incremental; small productivity gain
1Cosmetic; gold-plating

The (effort, value) pair is the crucial second signal. A "Must, XL, value 2" row is almost certainly miscategorized and should be challenged.

WSJF as the Tie-Break

When MoSCoW + effort + value still produce ties — typically a cluster of "Must, M, value 4" items competing for the same sprint slot — escalate to WSJF (Weighted Shortest Job First) from SAFe:

WSJF = Cost of Delay / Job Size
Cost of Delay = User-Business Value + Time Criticality + Risk Reduction / Opportunity Enablement

Each component is scored on the modified Fibonacci 1, 2, 3, 5, 8, 13. Job Size uses the same scale (or the team's existing effort points). Sort descending: highest WSJF wins the slot.

WSJF is a tie-break, not a replacement for MoSCoW. Do not rank the entire backlog by WSJF — the cognitive cost is high and the comparative scoring degrades quickly past 15–20 items.

The Release Commit Rule

Once items are tagged, commit them to a release or sprint with this rule:

If Must alone exceeds capacity, the prioritization is invalid: either capacity must be raised (more people, longer horizon) or items must be re-tagged. The stalemate is the signal — do not paper over it by promising and missing.


Common Patterns

Pattern: Capacity-Bounded Sprint Commit

When to use: Two-week sprints with a stable team.

How it works:

  1. Compute capacity: (team size × sprint days) − (leave + support rotation + ceremonies). Express in the team's effort unit.
  2. Tag every backlog candidate M/S/C/W with rationale.
  3. Attach effort tier and value tier to every M and S item (W and C items can be effort-tagged later).
  4. Sum Must effort. If > capacity, escalate to the sponsor: cut, defer, or raise capacity.
  5. Sum Must + Should effort. Cap at ~80% of capacity. The remainder is the Could stretch zone.
  6. Record release_target for every committed row; set Won't-this-release rows to the next horizon and Won't-ever rows to archived.

Why not just the top-N stories: Top-N ignores effort. Six "value 5, XL" items overcommit a sprint that easily holds twelve "value 4, S" items.

Pattern: WSJF Tie-Break Workshop

When to use: When MoSCoW labelling produces a cluster of indistinguishable Musts that exceed sprint capacity.

How it works:

  1. Pull only the tied cluster into a worksheet (typically 5–15 rows).
  2. For each row, score: User-Business Value (1–13), Time Criticality (1–13), Risk Reduction / Opportunity Enablement (1–13), Job Size (1–13).
  3. Compute WSJF = (UBV + TC + RR/OE) / JS.
  4. Sort descending. The top items take the available slots; the rest become Should-have for the next horizon.
  5. Persist the score in the row's wsjf_score column so the rationale is auditable.

Why not skip WSJF and just argue: Argument scales badly past three people. WSJF gives the team a shared rubric; the score is the artefact, not the verdict.


Decision Guidance

SituationRecommended ApproachReason
Backlog has >60% Must by effortStop and re-tag — the rubric has collapsedEverything-is-Must means nothing is prioritized
Item is regulatory or contractually due this releaseMust, value 5, with effort tierRegulatory deadlines are non-negotiable but still need sizing
Sponsor cannot decide between two Musts of equal effortRun WSJF on just the tied pairTie-break with a shared rubric beats arguing
Item has been Won't for three releases runningReclassify Won't-ever and archiveStale Won't items pollute backlog grooming sessions
Effort estimate is XLSplit the story before prioritizingXL items hide complexity; they distort capacity math
Item is "nice UX polish"Could, value 1–2Polish is the buffer, not the commitment
Stakeholder wants Should re-tagged as Must mid-sprintReject — process churn is the larger costRe-prioritizing every sprint destroys throughput

Step-by-step instructions for an AI agent or practitioner activating this skill:

  1. Ingest the backlog — load every candidate as a row; verify each row has a story_id and a description sufficient to judge value and effort. Reject rows that are not real user stories.
  2. Tag MoSCoW — assign M / S / C / W to every row with a one-line rationale. Won't rows must be sub-tagged Won't-this-release vs Won't-ever.
  3. Attach effort tier — assign S / M / L / XL to every M and S row. Flag XL items for splitting before they are committed.
  4. Attach value tier — assign 1–5 to every M and S row, validated with the sponsor.
  5. WSJF tie-break — for any cluster of Musts that exceeds sprint capacity, score Cost of Delay / Job Size and persist wsjf_score.
  6. Commit Must to the current sprint or release — verify Sum(Must effort) ≤ capacity and Sum(Must+Should) ≤ ~80% of capacity. Set release_target for every committed row.
  7. Re-prioritize at backlog grooming — refresh tags only at the agreed grooming cadence (typically every two sprints). Avoid mid-sprint churn.

Handoff Schema

Every prioritized backlog row produced by this skill MUST conform to this JSON shape so downstream agents (release-train-planner, orchestrator, deployment-risk-scorer) can consume it:

{
  "story_id": "STORY-1234",
  "moscow": "M",
  "moscow_subtag": null,
  "effort": "M",
  "value": 4,
  "wsjf_score": null,
  "release_target": "2026-Spring",
  "rationale": "Regulator requires audit trail by end of FY26 Q3."
}

The canonical table form lives in templates/moscow-prioritization-for-sf-backlog-template.md.


Review Checklist

Run through these before handing the prioritized backlog to delivery:


Salesforce-Specific Gotchas

Non-obvious behaviours that cause real prioritization failures on Salesforce projects:

  1. Regulatory Musts that aren't actually Must — "Compliance wants it" is not the same as "the regulator will fine us if we don't ship by date X". Force a citation: which regulation, which clause, which deadline. Otherwise it goes Should.
  2. Won't-this-release ferments into Won't-ever silently — A row tagged Won't-this-release for four consecutive grooming cycles is no longer being deferred; it is being declined. Surface it for a real archive decision.
  3. Capacity inflated by counting full FTEs — A two-week sprint with five admins ≠ 50 admin-days. Subtract leave, support rotation, ceremonies, code review, and UAT participation. Real capacity is typically 50–60% of nominal.
  4. MoSCoW without effort hides infeasibility — A backlog of 80 Musts feels confident until the team realizes Must alone is 200 days of work for a 40-day sprint. Always pair MoSCoW with effort.
  5. Mid-sprint re-prioritization — Stakeholders frequently ask to swap a Must in once a sprint starts. The cost of churn (context switching, partial work abandoned, retests) is almost always higher than the cost of waiting one sprint.

Output Artifacts

ArtifactDescription
Prioritized backlog tableOne row per story with story_id, moscow, effort, value, wsjf_score, release_target, rationale
Sprint or release commit listThe Must subset whose effort sum is within team capacity
Won't list (split)Won't-this-release rows (return to backlog) vs Won't-ever rows (archived) with rationale
WSJF tie-break worksheetFor tied Must clusters: UBV, Time Criticality, RR/OE, Job Size, computed WSJF

Package files