PM Decision Router
Purpose
Classify incoming evidence before starting a heavier workflow so the kit can decide what to do inside its own system: update a task, create a task, run discovery, challenge scope, prioritize, create a document, log a decision, archive-only, or ask the user for missing intent.
The router is a preflight, not a replacement for downstream workflows. After routing, the selected workflow still owns durable writes and validation.
Router Schema
Every routing pass returns exactly these fields:
{
"intent": "task_update | new_task | discovery | scope_challenge | prioritize | create_doc | decision_log | archive_only | ask_user",
"routing_target": ".agent/workflows/<workflow>.md",
"confidence": 0.0,
"evidence": [],
"candidate_updates": [],
"blocking_questions": []
}
Use system/scripts/pm_decision_router.py --text "<input>" for deterministic classification when input text is available. For screenshots or binary files, extract visible text first, then route the text.
Routing Rules
task_update: existing task ID, explicit progress, blocker, owner, due-date, or status signal. Route to /track and update the existing task before creating anything new.
new_task: actionable request without an existing task match. Route to /track and apply the task-manager Priority Gate before acceptance.
discovery: problem-space, assumptions, user research, opportunity, experiment, or validation work. Route to /discover.
scope_challenge: scope creep, PO-level filler, day-to-day engineering support, release ownership, legacy integration/UI work, or unclear PM ownership. Route to /track for Priority Gate handling, but do not create an active task until the user confirms.
prioritize: ranking, scoring, cut-line, RICE, ICE, Kano, MoSCoW, or capacity allocation. Route to /prioritize.
create_doc: PRD, spec, one-pager, six-pager, brief, or stakeholder-ready document request. Route to /create.
decision_log: explicit decision, go/no-go, tradeoff, alignment, or option selection. Route through /track to 5. Trackers/DECISION_LOG.md.
archive_only: FYI, reference-only, no-action note, or evidence with no current work signal. Route to /archive or the relevant local evidence archive.
ask_user: insufficient signal. Return concrete blocking questions instead of guessing.
Quality Bar
For task_update, new_task, discovery, prioritize, create_doc, and decision_log, carry forward:
- outcome metric
- owner
- due date or gate date
- scope boundary
- evidence strength
- dependency
- next decision gate
If these are missing for committed work, list them in blocking_questions or candidate updates. Do not silently convert ambiguous work into active task state.
Obsidian MCP
Obsidian is optional read/search context only. Use system/scripts/obsidian_mcp_health.py to check whether a local Obsidian MCP endpoint is configured.
- Allowed v1 behavior: search, read, list, get document map, get active file path, list tags, open a file in Obsidian.
- Disallowed v1 behavior: write, append, patch, delete, move, execute arbitrary Obsidian commands, or use Obsidian as the task source of truth.
- If Obsidian MCP is unavailable, fall back to repo-local
rg searches over the canonical kit files.
1---2name: pm-decision-router3description: Classify messy PM input before workflow execution. Use for task intake, transcripts, communication refreshes, discovery, planning, prioritization, PRD creation, decision logging, and scope-boundary challenges.4---56# PM Decision Router78## Purpose910Classify incoming evidence before starting a heavier workflow so the kit can decide what to do inside its own system: update a task, create a task, run discovery, challenge scope, prioritize, create a document, log a decision, archive-only, or ask the user for missing intent.1112The router is a preflight, not a replacement for downstream workflows. After routing, the selected workflow still owns durable writes and validation.1314## Router Schema1516Every routing pass returns exactly these fields:1718```json19{20 "intent": "task_update | new_task | discovery | scope_challenge | prioritize | create_doc | decision_log | archive_only | ask_user",21 "routing_target": ".agent/workflows/<workflow>.md",22 "confidence": 0.0,23 "evidence": [],24 "candidate_updates": [],25 "blocking_questions": []26}27```2829Use `system/scripts/pm_decision_router.py --text "<input>"` for deterministic classification when input text is available. For screenshots or binary files, extract visible text first, then route the text.3031## Routing Rules3233- `task_update`: existing task ID, explicit progress, blocker, owner, due-date, or status signal. Route to `/track` and update the existing task before creating anything new.34- `new_task`: actionable request without an existing task match. Route to `/track` and apply the task-manager Priority Gate before acceptance.35- `discovery`: problem-space, assumptions, user research, opportunity, experiment, or validation work. Route to `/discover`.36- `scope_challenge`: scope creep, PO-level filler, day-to-day engineering support, release ownership, legacy integration/UI work, or unclear PM ownership. Route to `/track` for Priority Gate handling, but do not create an active task until the user confirms.37- `prioritize`: ranking, scoring, cut-line, RICE, ICE, Kano, MoSCoW, or capacity allocation. Route to `/prioritize`.38- `create_doc`: PRD, spec, one-pager, six-pager, brief, or stakeholder-ready document request. Route to `/create`.39- `decision_log`: explicit decision, go/no-go, tradeoff, alignment, or option selection. Route through `/track` to `5. Trackers/DECISION_LOG.md`.40- `archive_only`: FYI, reference-only, no-action note, or evidence with no current work signal. Route to `/archive` or the relevant local evidence archive.41- `ask_user`: insufficient signal. Return concrete blocking questions instead of guessing.4243## Quality Bar4445For `task_update`, `new_task`, `discovery`, `prioritize`, `create_doc`, and `decision_log`, carry forward:4647- outcome metric48- owner49- due date or gate date50- scope boundary51- evidence strength52- dependency53- next decision gate5455If these are missing for committed work, list them in `blocking_questions` or candidate updates. Do not silently convert ambiguous work into active task state.5657## Obsidian MCP5859Obsidian is optional read/search context only. Use `system/scripts/obsidian_mcp_health.py` to check whether a local Obsidian MCP endpoint is configured.6061- Allowed v1 behavior: search, read, list, get document map, get active file path, list tags, open a file in Obsidian.62- Disallowed v1 behavior: write, append, patch, delete, move, execute arbitrary Obsidian commands, or use Obsidian as the task source of truth.63- If Obsidian MCP is unavailable, fall back to repo-local `rg` searches over the canonical kit files.