Purpose
Evaluate a batch of backlog items in parallel using multiple value frameworks, surface disagreements between frameworks, and let the user make the prioritization decision and record the rationale.
Core Objective
Primary objective: Perform amandatory full re-evaluationon a batch of backlog items (ignoring current priority status), produce the user-confirmed new priority and priority_decision, and write them back to their respective backlog forms (multi-file directory or single file).
Success criteria(all must be met):
- ✅ Each item has scores from 4 frameworks (RICE / WSJF / MoSCoW / ICE)
- ✅ Disagreements between frameworks are explicitly surfaced (≥ 2 level difference triggers human decision)
- ✅ Each item's final
priorityis confirmed by the user, not an algorithm output - ✅ Each item is written back to the
priority_decisionfield (including aprevioussnapshot of the old value, for reviewing what was overwritten this time) - ✅ Output a batch results table so the user can compare across items
- ✅ The report header declares the detected backlog form (
multi-file/yaml-list/h2-yaml/table), and write-back is performed according to that form
Acceptance test: Can the reader directly see the new priority + decision rationale + overwritten old value from the backlog item's frontmatter / yaml block / table row, without cross-referencing the conversation?
Scope Boundaries
This skill is responsible for:
- Automatically detecting the backlog form (multi-file directory / single-file yaml-list / h2-yaml / table) and readingallitems
- Forcibly re-running RICE / WSJF / MoSCoW / ICE scoring for each item (ignoring the original priority and priority_decision)
- Surfacing disagreements between frameworks
- Capturing user decisions and writing them back according to the detected form (multi-file: modify frontmatter; single file: modify the corresponding yaml block / table cell)
This skill is not responsible for:
- Creating new backlog items (use
capture-work-items) - Promoting items into the roadmap (use
promote-roadmap-items) - Scoring a single item (this skill is abatchworkflow; scoring a single item would lose comparability)
- Archiving old evaluation history (only the
previoussingle field is retained; if history is needed, the caller is responsible)
Handoff point: After scoring is complete, hand off to promote-roadmap-items for backlog → roadmap promotion.
Use Cases
capture-work-itemsRecommended to trigger after batch capture- Do a clean full re-evaluation of the backlog before a planning ceremony
- After a strategy refresh, re-run directly at any point (no extra switch needed — the default is overwrite-style re-evaluation)
plan-nextLarge gaps output by capture enter scoring- Single-file backlogs (e.g., a lightweight project maintaining a
backlog.md) can also be handled directly
Behavior
Phase 0: Read input and detect form
-
Form detection (try in priority order, stop on first hit)
Priority Form Detection condition 1 multi-filedocs/process-management/backlog/ordocs/backlog/exists, and at least one*.mdfile containsartifact_type: backlog-itemorpriority:frontmatter field2 yaml-listSingle-file docs/process-management/backlog.mdordocs/backlog.mdexists, frontmatter or top-level YAML containsitems:array3 h2-yamlSame as single-file above, the body contains ## <title>heading immediately followed byyaml …code block4 tableSame as single-file above, the body contains a Markdown table with TitleandPriority(or equivalent columns)Prefer the project's custom path (if
.ai-cortex/artifact-norms.yamlordocs/ARTIFACT_NORMS.mdinbacklog-item.path_pattern)。None matched → halt and report "no recognizable backlog form found", and suggest running
capture-work-items。Mixed forms detected(both a directory and a single file) → by default use multi-file and inform the user in the report that the single file was ignored; do not dual-write, to avoid inconsistency.
-
Read
docs/project-overview/strategic-goals.md(used for WSJF's Cost of Delay judgment and MoSCoW's Must judgment). -
Enumerate all items(no longer filter
priority: unset): the existingpriority/priority_decisionis shown only as an audit log,does not participate in new scoring, to avoid anchor bias. -
If total item count = 1 → halt and warn: "Scoring a single item loses comparability. It is recommended to score at least 2 items together. Continue?"
Stage 1: Multi-framework parallel scoring
For each item, compute simultaneously:
RICE
RICE = (Reach × Impact × Confidence) / Effort
- Reach: number of people or instances affected (quantitative)
- Impact: 1 (low) / 2 (medium) / 3 (high)
- Confidence: 0-100% (confidence in the Reach × Impact estimate)
- Effort: person-weeks
Map to priority levels:
| RICE score | Level |
|---|---|
| ≥ 1000 | P0 |
| 200-1000 | P1 |
| 50-200 | P2 |
| < 50 | P3 |
(The thresholds are default examples; projects may customize them)
WSJF
WSJF = Cost of Delay / Job Size
- Cost of Delay = Business Value + Time Criticality + Risk Reduction / Opportunity Enablement
- Job Size = relative effort (Fibonacci sequence: 1, 2, 3, 5, 8, 13, 20)
Map to priority levels (by the current backlog's WSJF quantiles):
| WSJF quantile | Level |
|---|---|
| Top 10% | P0 |
| 10-30% | P1 |
| 30-70% | P2 |
| Bottom 30% | P3 |
MoSCoW
Classify by commitment level:
- Must: not doing it this cycle would severely block or violate compliance → P0
- Should: doing it this cycle would significantly increase value → P1
- Could: do it if there is time → P2
- Won't: explicitly not doing it this cycle → P3
ICE
ICE = Impact × Confidence × Ease
- Qualitative score of 1-10 per dimension
- Impact: impact on strategic goals
- Confidence: confidence in the estimate
- Ease: ease of implementation (higher is easier)
Mapping:
| ICE score | Level |
|---|---|
| ≥ 500 | P0 |
| 200-500 | P1 |
| 50-200 | P2 |
| < 50 | P3 |
Stage 2: Surface disagreements
For each item, computemaximum disagreement across frameworks:
| Disagreement level gap | Handling |
|---|---|
| ≤ 1 level (e.g., P1 vs P2) | By default use the RICE result, no human decision needed |
| ≥ 2 levels (e.g., P0 vs P3) | Explicitly surface it; human decision is required |
The disagreement threshold can be customized per project (default 2 levels).
Stage 3: Present batch results
Output format:
## Batch Scoring Summary
| # | Title | RICE | WSJF | MoSCoW | ICE | 分歧 | 建议 |
|---|---|---|---|---|---|---|---|
| 1 | ... | P1 | P1 | Should | P2 | 1 级 | 自动采 P1 |
| 2 | ... | P3 | P1 | Could | P3 | 2 级 | **需人工** |
| ... |
## 需人工决策的条目(分歧 ≥ 2 级)
### Item #2: <title>
- RICE=P3 理由:Reach 仅 10 人、Effort 8 周
- WSJF=P1 理由:Q3 里程碑依赖本项,Cost of Delay 高
- MoSCoW=Could
- ICE=P3
**分歧焦点**:时间敏感性(WSJF)vs 规模(RICE)
**请决策**:P? 理由?
Phase 4: Capture decisions and write back (dispatch by form)
For each entry:
-
Determine the final
priority(auto-adopt or user input). -
Construct the
priority_decisionfield content,must includeprevious:priority_decision: final: P<N> previous: P<N> | unset frameworks: rice: P<N> wsjf: P<N> moscow: Must | Should | Could | Won't ice: P<N> rationale: <one-sentence reason if disagreement was ≥ 2 levels> decided_by: auto | user decided_at: <ISO date> -
Write back by form:
Form Write-back method multi-fileUpdate the *.mdfrontmatter of each file'spriority+priority_decisionyaml-listModify the items[i].priority+items[i].priority_decisionin a single file, preserving YAML indentation and key orderh2-yamlReplace the yamlwithin the code block corresponding to that entry'spriority+priority_decision, preserving the code block positiontableUpdate the table Prioritycell;priority_decisionwrite to the## Priority Decisionssubsection below the table, listed by entry anchorBefore writing back, confirm: the old value has been recorded in
priority_decision.previous, to avoid being silently swallowed.
Phase 5: Output the final report
The report header must include:
Backlog mode: multi-file | yaml-list | h2-yaml | tableRe-scored items: N (含 X 条覆盖了原 priority;Y 条原为 unset)
Report body:
- Total processed, auto-decision count, manual decision count
- Distribution statistics for each priority
- Suggested next steps (e.g.,
promote-roadmap-itemsbatch promotion)
Input & Output
Input: see frontmatter input_schema — backlog directory, strategic-goals.md, optional threshold overrides.
Output: conversation batch scoring table + each backlog file's frontmatter updated (priority and priority_decision fields).
Restrictions
Hard Boundaries
- Force full re-evaluation: by default, overwrite all entries'
priorityandpriority_decision, with old values retained only as theprevioussingle field, without historical archiving (maintain the skill's single responsibility; archiving is the caller's responsibility) - Do not mix forms: once multi-file is detected, do not scan single files, and vice versa, to avoid double-write inconsistency
- Do not automatically aggregate multiple frameworks into a single score (preserving divergence signals is the core value)
- When divergence ≥ threshold, a manual decision is required; do not fall back to a default
- Do not create new backlog entries (that is the responsibility of
capture-work-items)
Skill Boundaries
Not done (handled by other skills):
| Action | Owner |
|---|---|
| Create new backlog entries | capture-work-items |
| Promote backlog entries into the roadmap | promote-roadmap-items |
| Task breakdown | AgentFabric runtime (outside AI Cortex scope) |
| Detailed requirement records | capture-work-items |
Anti-Patterns
- ❌ Do not take a weighted average of the four framework scores — aggregation equals losing divergence signals and undermines the core value of this skill
- ❌ Do not score a single entry independently — without a comparison group, the relativity of RICE / WSJF fails
- ❌ Do not hide divergence — even if RICE is auto-adopted by default, still show each framework's score in the report table
- ❌ Do not ignore strategic_goal_id — strategic goals determine the Must judgment in MoSCoW
- ❌ Do not use vague wording("probably", "maybe") write
priority_decision.rationale— must specifically cite the framework or data - ❌ Do not, during re-evaluation, "compare whether the old priority is reasonable before deciding whether to overwrite" — this amounts to adding anchoring bias to framework scoring, violating this skill's design intent of "mandatory clean re-evaluation"
- ❌ Do not discard the old value ——
priority_decision.previousmust be written; let the user see in one place what was changed this time - ❌ Do not attempt to dual-write between the two forms — choose one of multi-file or single-file to avoid data drift
Self-Check
- has declared the backlog form (
multi-file/yaml-list/h2-yaml/table) and written back according to the form - halted when form detection failed, and guided
capture-work-items - scanned all entries, old priority is only for display and does not participate in scoring (no anchoring bias)
- ran all 4 frameworks for each entry
- entries with divergence ≥ threshold were surfaced, and manual decision was required
- entries with divergence ≤ threshold automatically adopted RICE, but scores from each framework are still visible
- each entry
priority_decisionwritten back, including frameworks results, rationale (if divergent),previousold value snapshot - batch summary report includes
Backlog mode, coverage statistics, priority distribution, next-step recommendations - did not automatically call
promote-roadmap-items
Examples
Example 1: Full re-evaluation of a multi-file backlog (mainstream scenario)
Input:docs/process-management/backlog/ 5 entries under , mixed states — 3 priority: unset, 1 priority: P2(old), 1 priority: P3(old).
Form detection: hit multi-file。
Output summary:
Backlog mode: multi-file
Re-scored items: 5 (含 2 条覆盖了原 priority;3 条原为 unset)
## Batch Scoring Summary
| # | Title | 旧 | RICE | WSJF | MoSCoW | ICE | 分歧 | 建议 |
|---|---|---|---|---|---|---|---|---|
| 1 | 支付 API 响应时间优化 | unset | P1 | P1 | Should | P1 | 0 级 | **自动 P1** |
| 2 | ARTIFACT_NORMS 格式升级 | P3 | P3 | P3 | Could | P3 | 0 级 | **自动 P3(与旧值一致)** |
| 3 | Q3 支持多币种 | unset | P2 | P0 | Must | P2 | 2 级 | **需人工** |
| 4 | 登录错误 500 修复 | P2 | P1 | P2 | Should | P1 | 1 级 | **自动 P1(覆盖旧 P2)** |
| 5 | 新增技术债:重构 auth 模块 | unset | P3 | P2 | Could | P2 | 1 级 | 自动 P3 |
## 需人工决策:Item #3
(同前略)
Write-back result snippet(Item #4, the overwritten entry):
priority: P1
priority_decision:
final: P1
previous: P2
frameworks:
rice: P1
wsjf: P2
moscow: Should
ice: P1
decided_by: auto
decided_at: 2026-04-17
Example 2: Single-file backlog (h2-yaml form)
Input:docs/backlog.md maintains a "lightweight backlog", where each entry is an H2 heading + inline yaml block:
## 支付 API 响应时间优化
```yaml
strategic_goal_id: goal-1
priority: P2
Reason: …
Login error 500 fix
strategic_goal_id: goal-1
priority: unset
…
**形态探测**:multi-file 路径不存在 → yaml-list 不命中 → **命中 `h2-yaml`**。
**写回方式**:替换每条对应的 yaml 代码块内的 `priority` + `priority_decision`,保留代码块外的描述正文不变;`priority_decision.previous` 写入旧值(一条原为 P2,一条为 unset)。
报告头:`Backlog mode: h2-yaml`、`Re-scored items: 2 (含 1 条覆盖了原 priority;1 条原为 unset)`。
---