From 282433572e7797033e301e562b92119fc9939702 Mon Sep 17 00:00:00 2001 From: Siddharth Kapoor Date: Mon, 20 Jul 2026 20:59:10 -0400 Subject: [PATCH 1/2] chore(skills): enforce soft-wrap in every md-writing skill & agent Add the canonical soft-wrap rule (one line per paragraph, no mid-paragraph hard-wrap) to every skill and agent that emits prose markdown, so generated .md artifacts reflow correctly and produce clean diffs. - Skills: pr, flow, skill, usage, gh, glab, changelog, linear (the ones that lacked it; spec/dev/em/pm/ux/docs/ed/qa already had it). - Agents (the actual writers): spec/*, pm/*, pr/*, skill/*, dev/{researcher, linear-tasks-agent}, em/linear-push-agent. - Each rule notes the optional deterministic sanitizer: prettier --prose-wrap never. - Deliberately excluded: git commit messages (72-col convention) and code-pattern/lookup skills that don't emit prose markdown. --- skills/changelog/SKILL.md | 2 ++ skills/dev/agents/linear-tasks-agent.md | 4 ++++ skills/dev/agents/researcher.md | 4 ++++ skills/em/agents/linear-push-agent.md | 4 ++++ skills/flow/SKILL.md | 2 ++ skills/gh/SKILL.md | 2 ++ skills/glab/SKILL.md | 2 ++ skills/linear/SKILL.md | 2 ++ skills/pm/agents/competitive-researcher.md | 4 ++++ skills/pm/agents/ideation-researcher.md | 4 ++++ skills/pm/agents/internal-researcher.md | 4 ++++ skills/pm/agents/linear-initiative-sync.md | 4 ++++ skills/pm/agents/market-researcher.md | 4 ++++ skills/pm/agents/pm-planner.md | 4 ++++ skills/pm/agents/user-problems-researcher.md | 4 ++++ skills/pr/SKILL.md | 2 ++ skills/pr/agents/code-quality-auditor.md | 4 ++++ skills/pr/agents/docs-freshness-checker.md | 4 ++++ skills/pr/agents/slop-detector.md | 4 ++++ skills/skill/SKILL.md | 2 ++ skills/skill/agents/skill-planner.md | 4 ++++ skills/skill/agents/skill-researcher.md | 4 ++++ skills/skill/agents/skill-updater.md | 4 ++++ skills/spec/agents/spec-executor.md | 4 ++++ skills/spec/agents/spec-planner.md | 4 ++++ skills/spec/agents/spec-updater.md | 4 ++++ skills/usage/SKILL.md | 2 ++ 27 files changed, 92 insertions(+) diff --git a/skills/changelog/SKILL.md b/skills/changelog/SKILL.md index 8b1e3b8..eb24ccc 100644 --- a/skills/changelog/SKILL.md +++ b/skills/changelog/SKILL.md @@ -21,6 +21,8 @@ If neither is available: warn the user but allow `changelog preview` to proceed ## Critical Rules +- **Markdown output: soft-wrap prose, never hard-wrap** — when this skill writes a `.md` artifact (changelog entries, previews, or any generated document), write each paragraph as one continuous line; do not insert manual newlines to wrap prose at a fixed column width. Newlines still separate paragraphs, list items, headings, and code fences. (If a markdown formatter is available, `prettier --prose-wrap never` enforces this deterministically.) + - **Never rebase on protected branches** — refuse if branch is main, master, develop, or matches `*-stable` - **Never force-push without --force-with-lease** — always protect against concurrent pushes - **retcon --apply requires a clean working tree** — refuse if `git status --porcelain` is non-empty diff --git a/skills/dev/agents/linear-tasks-agent.md b/skills/dev/agents/linear-tasks-agent.md index 057c513..3fb4b7c 100644 --- a/skills/dev/agents/linear-tasks-agent.md +++ b/skills/dev/agents/linear-tasks-agent.md @@ -117,3 +117,7 @@ For each task in the breakdown: ## Output Reports results inline (no file output). + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/dev/agents/researcher.md b/skills/dev/agents/researcher.md index 9f25050..702bbab 100644 --- a/skills/dev/agents/researcher.md +++ b/skills/dev/agents/researcher.md @@ -94,3 +94,7 @@ In **--deep mode** additionally: **Flag uncertainty explicitly.** If you couldn't find good information on something, say so. A gap honestly reported is more useful than a confident guess. **Do not propose solutions.** Your job ends at "here is what exists and what is true." Evaluation and direction selection happen elsewhere. + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/em/agents/linear-push-agent.md b/skills/em/agents/linear-push-agent.md index 08c56e0..eab2f70 100644 --- a/skills/em/agents/linear-push-agent.md +++ b/skills/em/agents/linear-push-agent.md @@ -150,3 +150,7 @@ Projects synced: {N} Errors: {any failures or "None"} ``` + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/flow/SKILL.md b/skills/flow/SKILL.md index 7cf5e02..2b8c12a 100644 --- a/skills/flow/SKILL.md +++ b/skills/flow/SKILL.md @@ -8,6 +8,8 @@ requires: [skill] You are the `flow` dispatcher. Parse the user's command and route to the correct workflow file. +**Markdown output: soft-wrap prose, never hard-wrap** — when a flow workflow writes a `.md` artifact (flow.md, step files, progress/context/run state, or any generated document), write each paragraph as one continuous line; do not insert manual newlines to wrap prose at a fixed column width. Newlines still separate paragraphs, list items, headings, and code fences. (If a markdown formatter is available, `prettier --prose-wrap never` enforces this deterministically.) + ## Dependency Check Before dispatching, verify each skill listed in `requires:` is available in your context. diff --git a/skills/gh/SKILL.md b/skills/gh/SKILL.md index f1ee69a..997f251 100644 --- a/skills/gh/SKILL.md +++ b/skills/gh/SKILL.md @@ -11,6 +11,8 @@ GitHub skill dispatcher. ## Critical Rules +- **Markdown output: soft-wrap prose, never hard-wrap** — when this skill writes a `.md` artifact (review doc, comment body, or any generated document), write each paragraph as one continuous line; do not insert manual newlines to wrap prose at a fixed column width. Newlines still separate paragraphs, list items, headings, and code fences. (If a markdown formatter is available, `prettier --prose-wrap never` enforces this deterministically.) + - **Never execute workflow logic here** — this file only parses args and dispatches - **Step 0 always runs first** — no exceptions - **Unknown verb → run `help.md`** — never error silently diff --git a/skills/glab/SKILL.md b/skills/glab/SKILL.md index e97f704..1e60ae0 100644 --- a/skills/glab/SKILL.md +++ b/skills/glab/SKILL.md @@ -11,6 +11,8 @@ GitLab skill dispatcher. ## Critical Rules +- **Markdown output: soft-wrap prose, never hard-wrap** — when this skill writes a `.md` artifact (review doc, comment body, or any generated document), write each paragraph as one continuous line; do not insert manual newlines to wrap prose at a fixed column width. Newlines still separate paragraphs, list items, headings, and code fences. (If a markdown formatter is available, `prettier --prose-wrap never` enforces this deterministically.) + - **Never execute workflow logic here** — this file only parses args and dispatches - **Step 0 always runs first** — no exceptions - **Unknown verb → run `help.md`** — never error silently diff --git a/skills/linear/SKILL.md b/skills/linear/SKILL.md index 8f4212c..273140d 100644 --- a/skills/linear/SKILL.md +++ b/skills/linear/SKILL.md @@ -5,6 +5,8 @@ license: MIT compatibility: Works on Claude Code with the Linear MCP server configured. Requires mcp__claude_ai_Linear tools. --- +**Markdown output: soft-wrap prose, never hard-wrap** — when composing markdown issue/bug bodies (or any generated document), write each paragraph as one continuous line; do not insert manual newlines to wrap prose at a fixed column width. Newlines still separate paragraphs, list items, headings, and code fences. (If a markdown formatter is available, `prettier --prose-wrap never` enforces this deterministically.) + ## Dispatcher ``` diff --git a/skills/pm/agents/competitive-researcher.md b/skills/pm/agents/competitive-researcher.md index d719a05..c06be1a 100644 --- a/skills/pm/agents/competitive-researcher.md +++ b/skills/pm/agents/competitive-researcher.md @@ -83,3 +83,7 @@ Never state a competitive claim without fetching the competitor's actual page. I ## Output Saves to: `.codevoyant/explore/{SLUG}/research/competitive.md` + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/pm/agents/ideation-researcher.md b/skills/pm/agents/ideation-researcher.md index b384386..39b61f0 100644 --- a/skills/pm/agents/ideation-researcher.md +++ b/skills/pm/agents/ideation-researcher.md @@ -74,3 +74,7 @@ Never state a user behavior or market gap claim without a source URL. If informa ## Output Saves to: `.codevoyant/explore/{SLUG}/research/ideation.md` + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/pm/agents/internal-researcher.md b/skills/pm/agents/internal-researcher.md index 6ae2336..96fe74c 100644 --- a/skills/pm/agents/internal-researcher.md +++ b/skills/pm/agents/internal-researcher.md @@ -63,3 +63,7 @@ Do not invent findings. If a directory doesn't exist, note it as absent. If no r ## Output Saves to: `.codevoyant/explore/{SLUG}/research/internal.md` + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/pm/agents/linear-initiative-sync.md b/skills/pm/agents/linear-initiative-sync.md index 61e4e9f..d5cc6ba 100644 --- a/skills/pm/agents/linear-initiative-sync.md +++ b/skills/pm/agents/linear-initiative-sync.md @@ -73,3 +73,7 @@ Using `window.location.href` (not the navigate tool's click-through) bypasses th - Call `save_project` — creating Linear projects is em approve's responsibility - Call `create_document` with `initiativeId` — this parameter is not supported by the MCP tool + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/pm/agents/market-researcher.md b/skills/pm/agents/market-researcher.md index fda06ec..ae175b1 100644 --- a/skills/pm/agents/market-researcher.md +++ b/skills/pm/agents/market-researcher.md @@ -78,3 +78,7 @@ Never state a market size or growth rate without a source URL. If data can't be ## Output Saves to: `.codevoyant/explore/{SLUG}/research/market.md` + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/pm/agents/pm-planner.md b/skills/pm/agents/pm-planner.md index d822536..54e8a7d 100644 --- a/skills/pm/agents/pm-planner.md +++ b/skills/pm/agents/pm-planner.md @@ -85,3 +85,7 @@ Be specific and concrete. Avoid vague language. ## Output Saves to: {DRAFT_PATH} + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/pm/agents/user-problems-researcher.md b/skills/pm/agents/user-problems-researcher.md index e4d77a2..ac9ac54 100644 --- a/skills/pm/agents/user-problems-researcher.md +++ b/skills/pm/agents/user-problems-researcher.md @@ -90,3 +90,7 @@ Prioritize behavioral evidence (what users do, build, or pay for) over stated pr ## Output Saves to: `.codevoyant/explore/{SLUG}/research/user-problems.md` + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/pr/SKILL.md b/skills/pr/SKILL.md index 48003a9..2abee2a 100644 --- a/skills/pr/SKILL.md +++ b/skills/pr/SKILL.md @@ -27,6 +27,8 @@ Pass the PR/MR number directly: `/pr review 42`, `/pr address 42`. ## Critical Rules +- **Markdown output: soft-wrap prose, never hard-wrap** — when this skill writes a `.md` artifact (PR/MR body, review doc, or any generated document), write each paragraph as one continuous line; do not insert manual newlines to wrap prose at a fixed column width. Newlines still separate paragraphs, list items, headings, and code fences. (If a markdown formatter is available, `prettier --prose-wrap never` enforces this deterministically.) + - **Never execute workflow logic here** — this file only parses args and dispatches - **Step 0 always runs first** — no exceptions - **Unknown verb → run `help.md`** — never error silently diff --git a/skills/pr/agents/code-quality-auditor.md b/skills/pr/agents/code-quality-auditor.md index 6f9e0e8..bd9fa47 100644 --- a/skills/pr/agents/code-quality-auditor.md +++ b/skills/pr/agents/code-quality-auditor.md @@ -64,3 +64,7 @@ Severity: - **NOTE** — minor or low-confidence. Follow `references/voice.md`: one or two short sentences, name the issue and the ask, cite the standard, no lecture. Return `[]` rather than inventing nitpicks. + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/pr/agents/docs-freshness-checker.md b/skills/pr/agents/docs-freshness-checker.md index 7064290..05ffadb 100644 --- a/skills/pr/agents/docs-freshness-checker.md +++ b/skills/pr/agents/docs-freshness-checker.md @@ -50,3 +50,7 @@ Rules: - If you only recommend a docs update (default read-only mode, or docs skill unavailable), severity CONSIDER. - Prefix every body with `Docs: `. - Follow `references/voice.md`: one or two short sentences, no lecture. Return `[]` for a change that needs no docs. + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/pr/agents/slop-detector.md b/skills/pr/agents/slop-detector.md index 56f9aec..a58df3e 100644 --- a/skills/pr/agents/slop-detector.md +++ b/skills/pr/agents/slop-detector.md @@ -73,3 +73,7 @@ Severity: - **NOTE** — minor or low-confidence ("possibly unrelated — confirm this is needed"). Follow `references/voice.md`: one or two short sentences, name the change and the ask, no lecture. "Revert this" beats a paragraph. Return `[]` rather than inventing nitpicks. + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/skill/SKILL.md b/skills/skill/SKILL.md index 6cbc487..c578755 100644 --- a/skills/skill/SKILL.md +++ b/skills/skill/SKILL.md @@ -26,6 +26,8 @@ Pass your intent directly on the invocation line — `new` and `explore` proceed ## Critical Rules +- **Markdown output: soft-wrap prose, never hard-wrap** — when this skill writes a `.md` artifact (SKILL.md, skill docs, critique/review reports, or any generated document), write each paragraph as one continuous line; do not insert manual newlines to wrap prose at a fixed column width. Newlines still separate paragraphs, list items, headings, and code fences. (If a markdown formatter is available, `prettier --prose-wrap never` enforces this deterministically.) + - **Never execute workflow logic here** — this file only parses args and dispatches - **Step 0 always runs first** — no exceptions - **Unknown verb → run `help.md`** — never error silently diff --git a/skills/skill/agents/skill-planner.md b/skills/skill/agents/skill-planner.md index e3f6eea..f3ebbfe 100644 --- a/skills/skill/agents/skill-planner.md +++ b/skills/skill/agents/skill-planner.md @@ -119,3 +119,7 @@ Produces: - `{PLAN_DIR}/plan.md` - `{PLAN_DIR}/files/proposed-skill.md` - `{PLAN_DIR}/files/agents/{agent-name}.md` (one per agent) + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/skill/agents/skill-researcher.md b/skills/skill/agents/skill-researcher.md index 5825bf0..7a8c4ce 100644 --- a/skills/skill/agents/skill-researcher.md +++ b/skills/skill/agents/skill-researcher.md @@ -43,3 +43,7 @@ Write only what the resource actually says. Every claim should be traceable back ## Output Saves to: {OUTPUT_PATH} + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/skill/agents/skill-updater.md b/skills/skill/agents/skill-updater.md index 4edefea..349094c 100644 --- a/skills/skill/agents/skill-updater.md +++ b/skills/skill/agents/skill-updater.md @@ -122,3 +122,7 @@ Produces: - `{PLAN_DIR}/plan.md` - `{PLAN_DIR}/files/proposed-skill.md` - `{PLAN_DIR}/files/agents/{name}.md` (only for new or modified agents) + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/spec/agents/spec-executor.md b/skills/spec/agents/spec-executor.md index 708ab5b..fbee605 100644 --- a/skills/spec/agents/spec-executor.md +++ b/skills/spec/agents/spec-executor.md @@ -146,3 +146,7 @@ When you finish the phase (or stop due to an error), report: - Any gaps or issues encountered - Whether the phase is fully complete or stopped early (and why) - Checklist completion: {N}/10 items complete + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/spec/agents/spec-planner.md b/skills/spec/agents/spec-planner.md index 87f8902..0ad379a 100644 --- a/skills/spec/agents/spec-planner.md +++ b/skills/spec/agents/spec-planner.md @@ -83,3 +83,7 @@ Produce: - `.codevoyant/plans/{plan-name}/user-guide.md` - `.codevoyant/plans/{plan-name}/implementation/phase-N.md` for each phase (1 through N) - Registry entry appended to `.codevoyant/README.md` + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/spec/agents/spec-updater.md b/skills/spec/agents/spec-updater.md index 750160f..81f79f0 100644 --- a/skills/spec/agents/spec-updater.md +++ b/skills/spec/agents/spec-updater.md @@ -109,3 +109,7 @@ Run the full validation loop from `references/validation-loop.md` (relative to ` ``` If any annotations were skipped, list them clearly so the user knows what to resolve manually. + +## Markdown output + +**Soft-wrap prose, never hard-wrap.** When this agent emits markdown — a `.md` artifact, or a markdown field in its returned output — write each paragraph as one continuous line. Do not insert manual newlines to wrap prose at a fixed column width; let the renderer wrap. Newlines still separate paragraphs, list items, headings, and code fences. diff --git a/skills/usage/SKILL.md b/skills/usage/SKILL.md index eb5eab3..b9eb13e 100644 --- a/skills/usage/SKILL.md +++ b/skills/usage/SKILL.md @@ -12,6 +12,8 @@ Generate a responsible-AI usage and decision-attribution report for the current ## Critical Rules +- **Markdown output: soft-wrap prose, never hard-wrap** — when this skill writes a `.md` artifact (usage report or any generated document), write each paragraph as one continuous line; do not insert manual newlines to wrap prose at a fixed column width. Newlines still separate paragraphs, list items, headings, and code fences. (If a markdown formatter is available, `prettier --prose-wrap never` enforces this deterministically.) + - **Never execute workflow logic here** — this file only parses args and dispatches - **Step 0 always runs first** — no exceptions - **Unknown verb → run `help.md`** — never error silently From 0228196da5b74a836c5fcd2da81dbcb7f6ab0ea7 Mon Sep 17 00:00:00 2001 From: Siddharth Kapoor Date: Mon, 20 Jul 2026 21:04:01 -0400 Subject: [PATCH 2/2] chore(dev-docs): add soft-wrap rule to the deprecated alias for parity (PR #35 review) --- skills/dev-docs/SKILL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/skills/dev-docs/SKILL.md b/skills/dev-docs/SKILL.md index 8414801..a01edea 100644 --- a/skills/dev-docs/SKILL.md +++ b/skills/dev-docs/SKILL.md @@ -17,6 +17,7 @@ Triggers: "dev docs", "generate docs", "create docs", "document {component}", "w ## Critical Rules +- **Markdown output: soft-wrap prose, never hard-wrap** — when this skill writes a `.md` artifact (or any generated document), write each paragraph as one continuous line; do not insert manual newlines to wrap prose at a fixed column width. Newlines still separate paragraphs, list items, headings, and code fences. (If a markdown formatter is available, `prettier --prose-wrap never` enforces this deterministically.) - **Never execute workflow logic here** — this file only parses args and dispatches - **Step 0 always runs first** — no exceptions - **Unknown verb → run `help.md`** — never error silently