# Pm Decision Router

> 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.

- Skill: `officebeats/pm-decision-router` (Agent Skill)
- Install (CLI): `npx skillmds@latest add officebeats/pm-decision-router`
- Raw SKILL.md: https://api.skillmd.com/api/skills/officebeats/pm-decision-router/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: officebeats (https://skillmd.com/u/officebeats)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/officebeats/pm-decision-router

---


# 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:

```json
{
  "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.

