Surface the most valuable next action by combining task stack, queue state, inbox pressure, health, and goals. Recommends one specific action with rationale. Triggers on "/next", "what should I do", "what's next".
name next description Surface the most valuable next action by combining task stack, queue state, inbox pressure, health, and goals. Recommends one specific action with rationale. Triggers on "/next", "what should I do", "what's next". version 1.0 generated_from arscontexta-v1.6 user-invocable true context fork model sonnet allowed-tools Read, Grep, Glob, Bash Runtime Configuration (Step 0 — before any processing) Read these files to configure domain-specific behavior: ops/derivation-manifest.md — vocabulary mapping, domain context Use vocabulary.notes for the notes folder name Use vocabulary.inbox for the inbox folder name Use vocabulary.note for the note type name in output Use vocabulary.topic_map for MOC references Use vocabulary.cmd_reduce for process/extract command Use vocabulary.cmd_reflect for connection-finding command Use vocabulary.cmd_reweave for backward-pass command Use vocabulary.rethink for rethink command name ops/config.yaml — thresholds, processing preferences self_evolution.observation_threshold (default: 10) self_evolution.tension_threshold (default: 5) If these files don't exist, use universal defaults and generic command names. EXECUTE NOW INVARIANT: /next recommends, it does not execute. Present one recommendation with rationale. The user decides what to do. This prevents cognitive outsourcing where the system makes all work decisions and the user becomes a rubber stamp. Execute these steps IN ORDER: Step 1: Read Vocabulary Read ops/derivation-manifest.md (or fall back to ops/derivation.md ) for domain vocabulary mapping. All output must use domain-native terms. If neither file exists, use universal terms (notes, inbox, topic map, etc). Step 2: Reconcile Maintenance Queue Before collecting state, evaluate all maintenance conditions and reconcile the queue. This ensures maintenance tasks are current before the recommendation engine runs. Read queue file ( ops/queue/queue.json or ops/queue.yaml ). If schema_version < 3, migrate: Add maintenance_conditions section with default thresholds Add priority field to existing tasks (default: "pipeline") Set schema_version: 3 For each condition in maintenance_conditions: Evaluate the condition: Condition Evaluation Method orphan_notes For each note in {vocabulary.notes}/, count incoming [[links]]. Zero = orphan. dangling_links Extract all [[links]], verify targets exist as files. Missing = dangling. inbox_pressure Count *.md in {vocabulary.inbox}/. observation_accumulation Count status: pending in ops/observations/. tension_accumulation Count status: pending or open in ops/tensions/. pipeline_stalled Queue tasks with status: pending unchanged across sessions. unprocessed_sessions Count files in ops/sessions/ without mined: true. moc_oversize For each topic map, count linked notes. stale_notes Notes not modified in 30+ days with < 2 links. low_link_density Average link count across all notes. methodology_drift Compare config.yaml modification time vs newest ops/methodology/ note modification time. If config is newer, methodology may be stale. If condition exceeds threshold AND no pending task with this condition_key exists: Create maintenance task: TIMESTAMP=$( date -u + "%Y-%m-%dT%H:%M:%SZ" ) MAINT_MAX=$(jq '[.tasks[] | select(.id | startswith("maint-")) | .id | ltrimstr("maint-") | tonumber] | max // 0' ops/queue/queue.json) NEXT_MAINT=$((MAINT_MAX + 1 ))
jq --arg
id
"maint-
$(printf '%03d' $NEXT_MAINT)
"
--arg priority
"{priority}"
--arg key
"{condition_key}"
--arg target
"{description}"
--arg action
"{recommended command}"
--arg ts
"
$TIMESTAMP
"
'.tasks += [{"id": $id, "type": "maintenance", "priority": $priority, "status": "pending", "condition_key": $key, "target": $target, "action": $action, "auto_generated": true, "created": $ts}]'
ops/queue/queue.json > tmp.json &&
mv
tmp.json ops/queue/queue.json
If condition is satisfied AND a pending task with this condition_key exists:
Auto-close it:
TIMESTAMP=$(
date
-u +
"%Y-%m-%dT%H:%M:%SZ"
)
jq --arg key
"{condition_key}"
--arg ts
"
$TIMESTAMP
"
'(.tasks[] | select(.condition_key == $key and .status == "pending")).status = "done" |
(.tasks[] | select(.condition_key == $key and .status == "pending")).completed = $ts'
ops/queue/queue.json > tmp.json &&
mv
tmp.json ops/queue/queue.json
If condition fires AND a pending task already exists:
Update the target description (specifics may have changed):
jq --arg key
"{condition_key}"
--arg target
"{new description}"
'(.tasks[] | select(.condition_key == $key and .status == "pending")).target = $target'
ops/queue/queue.json > tmp.json &&
mv
tmp.json ops/queue/queue.json
Step 3: Collect Vault State
Gather all signals. Run independent checks in parallel where possible. Record each signal even if the check returns zero — absence of signal is itself informative.
Signal
How to Check
What to Record
Task stack
Read
ops/tasks.md
— current priorities and open items
Top items, open count, any deadlines
Queue state
Read
ops/queue.yaml
or
ops/queue/queue.json
— pending pipeline tasks
Total pending, by phase (create, reflect, reweave, verify), blocked phases
Inbox pressure
Count
*.md
files in {vocabulary.inbox}/, find oldest by mtime
Count per subdirectory, age of oldest item in days
Note count
Count
*.md
in {vocabulary.notes}/
Total notes for context
Orphan notes
For each note, grep for
[[filename]]
across all files — zero hits = orphan
Count, first 5 names
Dangling links
Extract all
[[links]]
from notes/, verify each target file exists
Count, first 5 targets
Stale notes
Notes not modified recently AND with low link density (< 2 links)
Count
Goals
Read
self/goals.md
or
ops/goals.md
— current priorities, active threads
Priority list, active research directions
Observations
Count files with
status: pending
in
ops/observations/
Count
Tensions
Count files with
status: pending
or
status: open
in
ops/tensions/
Count
Methodology
Check
ops/methodology/
for recent captures (files modified in last 7 days)
Count of recent, total count
Health
Read most recent report in
ops/health/
— note timestamp and issues
Last run date, issue count, any critical issues
Sessions
Check
ops/sessions/
for files without
mined: true
in frontmatter
Count of unmined sessions
Recent /next
Read
ops/next-log.md
(if exists) — last 3 recommendations
Previous suggestions to avoid repetition
Adaptation rules:
Directory names adapt to domain vocabulary (e.g., {vocabulary.inbox} instead of hardcoded "inbox")
Skip checks silently for directories that do not exist — do not report "ops/sessions/ not found"
A missing directory means that feature is not active, which is valid state
Signal collection commands:
INBOX_COUNT=$(find {vocabulary.inbox}/ -name ".md" -maxdepth 2 2>/dev/null | wc -l | tr -d ' ' ) OLDEST_INBOX=$(find {vocabulary.inbox}/ -name ".md" -maxdepth 2 - exec stat -f "%m %N" {} ; 2>/dev/null | sort -n | head -1)
NOTE_COUNT=$( ls -1 {vocabulary.notes}/*.md 2>/dev/null | wc -l | tr -d ' ' )
OBS_COUNT=$(grep -rl '^status: pending' ops/observations/ 2>/dev/null | wc -l | tr -d ' ' )
TENSION_COUNT=$(grep -rl '^status: pending|^status: open' ops/tensions/ 2>/dev/null | wc -l | tr -d ' ' )
SESSION_COUNT=$(grep -rL '^mined: true' ops/sessions/*.md 2>/dev/null | wc -l | tr -d ' ' ) Step 4: Classify by Consequence Speed Evaluate every signal against consequence speed — how fast does inaction degrade the system? Speed Signals Threshold Why This Priority Session Inbox > 5 items, orphan notes (any), dangling links (any), 10+ pending observations, 5+ pending tensions, unprocessed sessions > 3 Immediate — these degrade work quality right now Orphans are invisible to traversal. Dangling links confuse navigation. Inbox pressure means lost ideas. Observation/tension thresholds mean the system is accumulating unprocessed friction. Multi-session Pipeline queue backlog > 10, research gaps identified in goals, stale notes > 10, inbox items aging > 7 days, methodology captures > 5 in same category Soon — these compound over days Unfinished pipeline batches block downstream connections. Stale notes represent decaying knowledge. Aging inbox means capture is outpacing processing. Slow Health check not run in 14+ days, {DOMAIN:topic map} oversized (>40 notes), link density below 2.0 average, low note count relative to time Background — annoying but not blocking These are maintenance tasks. Important for long-term health but not urgent. Threshold rule: 10+ pending observations OR 5+ pending tensions is ALWAYS session-priority. Recommend {DOMAIN:rethink} in this case. Signal interaction rules: Task stack items ALWAYS override automated recommendations (user-set priorities beat system-detected urgency) Multiple session-priority signals: pick the one with highest impact (most items affected) If inbox pressure AND queue backlog: recommend reducing inbox first (pipeline needs input before it can process) Step 5: Generate Recommendation Select the SINGLE most valuable action. The recommendation must be specific enough to execute immediately — a concrete command invocation, not a vague suggestion. Priority cascade:
All signals healthy. Inbox: 0 | Queue: 0 pending | Orphans: 0 | Dangling: 0
No urgent work detected.
Suggested: Explore a new direction from goals.md or reweave older {DOMAIN:notes} to deepen the graph. Rationale is always mandatory. Every recommendation must explain: WHY this action over alternatives What DEGRADES if this action is deferred How it connects to goals (if applicable) Step 6: Deduplicate Read ops/next-log.md (if it exists). Check the last 3 entries. Deduplication rules: If the same recommendation appeared in the last 2 entries, select the next-best action instead This prevents the system from getting stuck recommending the same thing repeatedly when the user has chosen not to act on it If the same recommendation is genuinely the highest priority (e.g., inbox pressure keeps growing), add an explicit note: "This was recommended previously. The signal has grown stronger since then ([before] → [now])." Step 7: Output next
State: Inbox: [count] items (oldest: [age]) Queue: [count] pending ([phase breakdown]) Orphans: [count] | Dangling: [count] Observations: [count] | Tensions: [count] [any other decision-relevant signals]
Recommended: [specific command/action]
Rationale: [2-3 sentences — why this action, how it connects to goals, what degrades if deferred]
After that: [second priority, if relevant] [optional: alignment with goals.md priority] Command specificity is mandatory. Recommendations must be concrete invocations: Good Bad /{DOMAIN:reduce} inbox/article-on-spaced-repetition.md "process some inbox items" /ralph 5 "work on the queue" /{DOMAIN:rethink} "review your observations" /{DOMAIN:reweave} [[note title here]] "update some old notes" State display rules: Show only 2-4 decision-relevant signals — not all 14 checks Zero-count signals that are healthy can be omitted (don't show "Orphans: 0" unless contrasting with a problem) Non-zero signals at session or multi-session priority should always be shown Step 8: Log the Recommendation Append to ops/next-log.md (create if missing):
State: Inbox: [N] | Notes: [N] | Orphans: [N] | Dangling: [N] | Stale: [N] | Obs: [N] | Tensions: [N] | Queue: [N] Recommended: [action] Rationale: [one sentence] Priority: session | multi-session | slow Why log? The log serves three purposes: Deduplication — prevents recommending the same action repeatedly Evolution tracking — shows what signals have been persistent vs transient /rethink evidence — persistent recommendations that go unacted-on may reveal misalignment between what the system detects and what the user values Edge Cases Empty Vault (0-5 notes) Recommend capturing or reducing content. Maintenance is premature with < 5 notes — the graph does not have enough nodes for meaningful analysis. next
State: Notes: [N] — early stage vault
Recommended: Capture or /{DOMAIN:reduce} content Rationale: Your graph has [N] notes. At this stage, adding content matters more than maintaining structure. Health checks, reweaving, and rethink become valuable after ~10 notes. Everything Clean Say so explicitly. Recommend exploratory work aligned with goals, or reflective work on older notes: No urgent work detected. Consider: