Decisions

  • Pending: What are the default stale thresholds per lifecycle status?
  • Pending: How many nudges before auto-escalation to review?
  • Pending: Should auto-advance/cancel rules require user confirmation or fire autonomously?
  • Pending: Nudge delivery channel — dashboard only, briefing, or push (Telegram)?

User Tasks


Summary

Track how long feature requests stay in the same status without progress, surface stale items through nudges, and optionally auto-advance or auto-cancel based on configurable rules.

Problem / Motivation

Feature requests can silently stall — sitting in “in-progress” for weeks or “new” indefinitely with no one noticing. Without active stale detection:

  • FRs accumulate in limbo, cluttering the backlog
  • Blocked items are never surfaced unless manually reviewed
  • There is no pressure to move work forward or close abandoned items
  • The feature lifecycle looks active on paper but is actually stagnant

Inspired by Sven’s Nexus system, which uses rules like “deliver + waiting > 2h = auto-advance” and “review + waiting > threshold = auto-cancel” to keep work flowing. A stale detection system turns the passive FR lifecycle into an actively managed pipeline.

Proposed Solution

Build a stale detection engine with three layers:

1. Detection Layer

  • Track time-in-status for every FR by comparing updated frontmatter date with current date
  • Configurable thresholds per status:
    • new > 14 days = stale
    • planned > 21 days = stale
    • in-progress > 7 days without commits = stale
    • Thresholds stored in a config file (e.g., src/opus/stale/config.yaml)
  • Detection runs as part of daily briefing or on-demand via skill

2. Nudge Layer

  • Surface stale items in dashboards with a “stale” badge/flag
  • Include stale items in daily briefing (FR-037) as a dedicated section
  • After N nudges without action, escalate: move to a “needs review” flag or notify via Telegram (FR-022)
  • Nudge counter tracked per FR (in frontmatter or separate state file)

3. Auto-Action Rules

  • Configurable rules engine for automatic status transitions:
    • deliver + waiting > 2h → auto-advance to done
    • review + waiting > threshold → auto-cancel or move back to planned
    • new + stale > 30 days → move to ideas (de-prioritize)
  • Rules defined in config, each with: trigger condition, action, requires-confirmation flag
  • All auto-actions logged in FR history

Open Questions

1. Default Stale Thresholds

Question: What should the default time-in-status thresholds be?

OptionDescription
A) Conservativenew: 14d, planned: 21d, in-progress: 7d. Forgiving, fewer false alarms
B) Aggressivenew: 7d, planned: 14d, in-progress: 3d. Forces fast movement
C) User-configurable from day oneNo defaults, user must set thresholds in config

Recommendation: Option A — start conservative to avoid alert fatigue. Tighten thresholds based on experience.

Decision:

2. Nudge Escalation Count

Question: How many nudges before escalating a stale FR?

OptionDescription
A) 1 nudge, then escalateAggressive — forces immediate action
B) 3 nudges over 3 daysBalanced — gives the user time to act
C) 5 nudges over a weekPatient — minimal pressure

Recommendation: Option B — three daily nudges strikes a balance between visibility and annoyance.

Decision:

3. Auto-Action Safety

Question: Should auto-advance/cancel rules require user confirmation?

OptionDescription
A) Always require confirmationSafe — no surprises. Auto-actions become suggestions
B) Configurable per ruleSome rules auto-fire (low-risk), others need confirmation
C) Fully autonomousAll rules auto-fire. Fast but risky

Recommendation: Option A for Phase 1. Move to Option B in Phase 3 once trust is established.

Decision:


Phase Overview

PhaseDescriptionStatus
Phase 1Detection logic + dashboard surfacing
Phase 2Push nudges via briefings and Telegram
Phase 3Auto-advance/cancel rules engine

Phase 1: Detection Logic + Dashboard Surfacing —

Goal: Detect stale FRs based on configurable thresholds and surface them in dashboards/briefings.

File / FeatureDetailsOwnerStatus
src/opus/stale/detector.pyStale detection engine — parse FR frontmatter, compare updated date vs thresholdsopus
src/opus/stale/config.yamlThreshold configuration per status (new, planned, in-progress)opus
Dashboard integrationAdd “Stale” column/badge to feature dashboardopus
Briefing integrationAdd stale items section to daily briefing output (FR-037)opus
Unit testsTest detection with various FR ages and statusesopus

Phase 2: Push Nudges via Telegram —

Goal: Deliver nudge notifications for stale FRs via Telegram and track nudge count.

File / FeatureDetailsOwnerStatus
src/opus/stale/nudger.pyNudge manager — track nudge count per FR, send notificationsopus
Nudge counterTrack how many times each FR has been nudged (frontmatter field or state file)opus
Telegram integrationSend nudge messages via Telegram bot (depends on FR-022)opus
Escalation logicAfter N nudges, flag FR for review with higher visibilitymv

Phase 3: Auto-Advance/Cancel Rules Engine —

Goal: Implement configurable rules that auto-advance or auto-cancel FRs based on conditions.

File / FeatureDetailsOwnerStatus
src/opus/stale/rules.pyRules engine — evaluate conditions, trigger actionsopus
Rule definitionsConfig format for rules: condition, action, requires-confirmationmv
Auto-advanceMove FR forward in lifecycle when deliver+waiting exceeds thresholdopus
Auto-cancelMove FR back to ideas or mark rejected when review+waiting exceeds thresholdmv
History loggingLog all auto-actions in FR history table with timestamp and rule that triggeredopus
Safety guardsConfirmation prompts for destructive actions, dry-run modemv

Prerequisites / Gap Analysis

Requirements

RequirementDescription
REQ-1Python project scaffold (FR-009) — detection and rules are Python code
REQ-2Daily briefings (FR-037) — nudges surface in briefing output
REQ-3Phone/Telegram access (FR-022) — push nudges via messaging

Current State

ComponentStatusDetails
Python scaffoldFR-009 not started
Daily briefingsFR-037 not started
Telegram accessFR-022 not started
FR frontmatterdoneAll FRs have status, updated fields
Feature dashboarddonevault/00_system/dashboards/ exists

Gap (What’s missing?)

GapEffortBlocker?
Python scaffold (FR-009)MedYes — detection logic is Python code
Briefing system (FR-037)MedPartial — Phase 1 can work with dashboard only
Telegram bot (FR-022)HighNo — only needed for Phase 2 push nudges

Test

Manual tests

TestExpectedActualLast
FR in-progress for 8 days detected as stale (7d threshold)Marked stalepending-
FR in-progress for 5 days NOT detected as staleNot markedpending-
Stale FR appears in dashboard with badgeBadge visiblepending-
Nudge counter increments after each detection cycleCount increases by 1pending-
After 3 nudges, FR is escalatedEscalation flag setpending-
Auto-advance rule fires for deliver+waiting > thresholdFR advanced to next statuspending-
Auto-cancel with confirmation shows prompt before actingPrompt displayed, action pausedpending-

AI-verified tests

ScenarioExpected behaviorVerification method

E2E tests

ScenarioAssertion

Integration tests

ComponentCoverage

Unit tests

ComponentTestsCoverage

History

DateEventDetails
2026-03-04CreatedInspired by Nexie’s stale detection and auto-advance/cancel rules

References

  • FR-037 (Daily Briefings) — stale items surface in briefing output
  • FR-022 (Phone Access) — push nudges via Telegram
  • FR-031 (Workflow State Machine) — auto-advance/cancel rules interact with state transitions
  • FR-050 (Proactive Monitoring) — stale detection is a subset of vault consistency monitoring
  • FR-039 (Priority Scoring) — stale items receive priority boosts
  • Nexie (Sven Hennig) — original inspiration for stale detection and auto-action rules