Decisions

  • Pending: What weights should each scoring factor receive?
  • Pending: Should priority be stored in frontmatter or computed on-the-fly?
  • Pending: How to handle manual priority overrides vs computed scores?
  • Pending: Should the dashboard sort by priority by default?

User Tasks


Summary

Auto-prioritize the feature backlog using a scoring formula that considers lifecycle stage, age, staleness, and blocker relationships — producing a sorted dashboard and priority field per FR.

Problem / Motivation

With a growing backlog of 40+ feature requests, manual prioritization becomes impossible:

  • No objective way to decide which FR to work on next
  • FRs that block many others sit unnoticed at the same priority as isolated nice-to-haves
  • Older items that have been waiting get the same visibility as freshly created ones
  • The user must mentally juggle dependencies, urgency, and stage to pick the next task

Inspired by Nexie’s priority scoring, which assigns a numeric score based on lifecycle stage, wait time, stall status, and blocker weighting. The result: a clear, auto-sorted backlog where the most impactful work surfaces to the top.

Proposed Solution

Build a scoring engine with these factors:

Scoring Formula

Total Score = Base Priority + Time Bonus + Stall Boost + Blocker Weight + Manual Adjustment

FactorDescriptionRange
Base PriorityPoints per lifecycle stage. Done-adjacent (in-progress) scores highest, early-stage (ideas) lowest0-40
Time BonusLonger waiting = higher priority, capped to prevent runaway scores0-20
Stall BoostStale items (from FR-040) get a priority bump to force attention0-15
Blocker WeightFRs that are prerequisites for many others score higher (count of FRs blocked)0-20
Manual AdjustmentUser can set a manual +/- modifier in frontmatter to override computed score-10 to +10

Stage Base Scores

StageBase ScoreRationale
in-progress40Finish what you started
planned30Already approved, ready to build
new20Needs triage
ideas5Lowest urgency

Output

  • priority-score field added to FR frontmatter (computed value)
  • Feature dashboard sorted by priority score (highest first)
  • Daily briefing shows top-3 priority items
  • Priority breakdown available on demand (show factor contributions)

Open Questions

1. Scoring Weights

Question: What relative weights should each factor receive?

OptionDescription
A) Stage-heavyBase priority dominates (40 of 105 max). Rewards finishing in-progress work
B) BalancedAll factors roughly equal weight (~25 each)
C) Blocker-heavyBlocker weight dominates. Rewards unblocking other work

Recommendation: Option A — completing in-progress work should always be the top priority. Blocker weight serves as tiebreaker.

Decision:

2. Stored vs Computed

Question: Should the priority score be stored in frontmatter or computed on-the-fly?

OptionDescription
A) Stored in frontmatterScore visible in Obsidian, but can become stale if not recalculated
B) Computed on-the-flyAlways accurate, but not visible in Obsidian without running the script
C) Both — computed and cachedCompute on demand, write result to frontmatter. Best of both worlds

Recommendation: Option C — compute when generating dashboards/briefings, write the result to frontmatter so it is visible in Obsidian too.

Decision:

3. Manual Override Handling

Question: How should manual priority overrides interact with computed scores?

OptionDescription
A) Additive modifierManual adjustment adds/subtracts from computed score (e.g., +10 or -5)
B) Full overrideManual score replaces computed score entirely
C) Pin to top/bottomSimple toggle: “pinned-high” or “pinned-low” instead of numeric adjustment

Recommendation: Option A — additive modifier keeps the formula meaningful while allowing user nudges.

Decision:


Phase Overview

PhaseDescriptionStatus
Phase 1Define formula + add priority field to template + manual calculation
Phase 2Auto-calculate via script/skill, update dashboard
Phase 3Integration with briefings (show top-priority items first)

Phase 1: Formula Definition + Manual Calculation —

Goal: Define the scoring formula, add the priority-score field to the FR template, and enable manual calculation.

File / FeatureDetailsOwnerStatus
Scoring formula specDocument the exact formula with weights, ranges, and examplesopus
Template updateAdd priority-score and priority-adjustment fields to _templates/feature-request.mdopus
Manual calculation guideInstructions for manually computing priority (before automation exists)opus
Backfill existing FRsAdd priority fields to all existing FR frontmatter (default values)opus

Phase 2: Auto-Calculate via Script —

Goal: Build a Python script/skill that auto-computes priority scores for all FRs and updates frontmatter.

File / FeatureDetailsOwnerStatus
src/opus/priority/scorer.pyPriority scoring engine — parse all FRs, compute scores, return sorted listopus
src/opus/priority/factors.pyFactor calculations: base priority, time bonus, stall boost, blocker weightopus
Frontmatter writerUpdate priority-score in FR frontmatter after computationopus
Dashboard updateSort feature dashboard by priority scoreopus
/priority skillSkill to run scoring on demand and display resultsopus
Unit testsTest each factor calculation, total score, and edge casesopus

Phase 3: Briefing Integration —

Goal: Integrate priority scoring with daily briefings so top-priority items are surfaced first.

File / FeatureDetailsOwnerStatus
Briefing integrationShow top-3 priority FRs in daily briefing (FR-037)opus
Priority trendsTrack score changes over time — flag FRs whose priority is rising fastopus
Priority-based suggestions”You should work on FR-XXX next (score: 85, reason: blocks 4 other FRs)“opus

Prerequisites / Gap Analysis

Requirements

RequirementDescription
REQ-1Python project scaffold (FR-009) — scoring engine is Python code
REQ-2Stale detection (FR-040) — stall boost factor requires stale detection
REQ-3Daily briefings (FR-037) — Phase 3 integration

Current State

ComponentStatusDetails
Python scaffoldFR-009 not started
FR frontmatterdoneAll FRs have status, priority, updated fields
Feature dashboarddoneExists in vault/00_system/dashboards/
Stale detectionFR-040 not started
Daily briefingsFR-037 not started

Gap (What’s missing?)

GapEffortBlocker?
Python scaffold (FR-009)MedYes — scoring engine is Python code
Stale detection (FR-040)MedPartial — stall boost factor needs it, but other factors work without it
Blocker graphLowNo — can be parsed from FR frontmatter/related sections

Test

Manual tests

TestExpectedActualLast
In-progress FR scores higher than new FR (all else equal)in-progress > newpending-
FR waiting 30 days scores higher than FR waiting 1 day (same stage)Older FR scores higherpending-
Stale FR receives stall boostScore increases by stall boost amountpending-
FR blocking 3 others scores higher than FR blocking 0Blocker FR scores higherpending-
Manual adjustment of +10 increases final score by 10Score = computed + 10pending-
Time bonus caps at maximumScore does not exceed cap regardless of agepending-
Dashboard sorts FRs by priority score descendingHighest score firstpending-

AI-verified tests

ScenarioExpected behaviorVerification method

E2E tests

ScenarioAssertion

Integration tests

ComponentCoverage

Unit tests

ComponentTestsCoverage

History

DateEventDetails
2026-03-04CreatedInspired by Nexie’s priority scoring formula for auto-prioritizing the backlog

References

  • FR-009 (Python Project Scaffold) — code infrastructure prerequisite
  • FR-037 (Daily Briefings) — priority items surface in briefing output
  • FR-040 (Stale Detection) — stall boost factor depends on stale detection
  • FR-038 (Kanban Feature Overview) — dashboard displays priority-sorted items
  • FR-046 (Job Registry & Priority Queue) — priority scoring feeds into execution queue
  • Nexie (Sven Hennig) — original inspiration for priority scoring formula