v2.0.0 — Soft-Enforcement Delegation (BREAKING)
Note: This is a re-tag of
v1.18.0as a major release to honor semver. The same code, tagged honestly.v1.18.0shipped earlier today with breaking changes that should not have gone out under a minor bump —v2.0.0makes the contract change explicit.
⚠️ BREAKING CHANGES
Removed /workflow-orchestrator:bypass command
commands/bypass.md is deleted. The command was an escape hatch from the old hard-blocking enforcement and is no longer needed under soft enforcement (nothing to bypass). Anyone with it in muscle memory or in scripts will get "command not found".
Hard-blocking delegation enforcement removed
The delegation hook no longer blocks tool calls — it nudges. Workflows that relied on the framework physically preventing direct tool calls (Bash, Edit, Write, etc.) now find those calls go through. See "Soft enforcement" below for the new behavior.
system-prompts/workflow_orchestrator.md removed
Anyone using claude --append-system-prompt \"\$(cat ~/.claude/system-prompts/workflow_orchestrator.md)\" is broken. The full orchestrator logic now lives inline in commands/delegate.md and is loaded on-demand by the slash command.
Tool allowlist removed
There is no longer an allowlist to maintain. The hook tracks only the 8 stable work primitives (Bash, Edit, Write, Read, Glob, Grep, MultiEdit, NotebookEdit); new Claude Code tools never trigger nudges. Anyone who customized the allowlist needs to delete those customizations.
Output style loading mechanism changed
output-styles/technical-adaptive.md is now loaded natively from plugin.json's outputStyles field instead of via a SessionStart hook. Custom integrations that injected the output style themselves should remove that injection.
Highlights
This release replaces the brittle hard-blocking delegation enforcement with a soft, adaptive nudge system, simplifies team-mode selection to a single rule, and ships the lean SessionStart injection that lands ~6.6K tokens off every session start.
Soft enforcement (no more allowlist)
`hooks/PreToolUse/require_delegation.py` no longer blocks tool calls. It emits per-turn escalating stderr nudges based on `.claude/state/delegation_violations.json`:
| Violations | Message | Tokens |
|---|---|---|
| 0 | (silent) | 0 |
| 1 | `delegate?` | ~2 |
| 2 | `nudge: use /workflow-orchestrator:delegate for multi-step work` | ~12 |
| 3–4 | `WARNING: N direct tool calls bypassing delegation. Use /workflow-orchestrator:delegate .` | ~25 |
| 5+ | Strong reminder explaining what's being lost | ~55 |
The counter resets each turn and zeros when `/workflow-orchestrator:delegate` runs. Subagents are immune (`CLAUDE_PARENT_SESSION_ID` / `CLAUDE_AGENT_ID` set).
Stable work-tool surface — only the 8 stable primitives are tracked: `Bash`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `MultiEdit`, `NotebookEdit`. New Claude Code tools never trigger nudges, so the framework no longer needs allowlist maintenance every time Anthropic ships a new tool.
`python_posttooluse_hook.py` (Ruff/Pyright) is now the only remaining hard-blocking hook. `validate_task_graph_compliance.py` and `validate_task_graph_depth.py` are advisory-only.
One-rule team-mode selection
Deleted the `team_mode_score` scoring table from `commands/delegate.md`. New rule:
If `TeamCreate` is in your available tools → `execution_mode: "team"`. Otherwise → `"subagent"`. No scoring, no exceptions.
The previous scoring logic was the off-ramp that caused the planner to rationalize its way into sequential subagent mode even when teams were available.
Team-mode persistent teammate fix
Teammate `Agent(team_name=...)` calls must NOT use `run_in_background: true`. Background Agent tasks exit on completion and are not persistent swarm members, leaving the tmux session empty. Subagent-mode spawns still use `run_in_background: true`.
Lean SessionStart (~6.6K token savings)
- Three SessionStart hooks consolidated into a single `inject_all.py` Python process
- Stub orchestrator (`orchestrator_stub.md`, ~1.1KB) on startup
- Full orchestrator logic loaded on-demand by `/workflow-orchestrator:delegate` (lives inline in `commands/delegate.md`)
- Output style loaded natively from `plugin.json` `outputStyles` field — no hook injection required
Documentation
- README walkthrough refreshed with team-mode demo: 4× speed gif and 4 new screenshots showing plan mode → dependency graph → tmux swarm view → completion
- Updated: `README.md`, `CLAUDE.md`, `docs/hook-debugging.md`, `docs/ARCHITECTURE_QUICK_REFERENCE.md`, `docs/environment-variables.md`, `docs/plan-explore-parallel-processing.md`, `docs/validation-schema.md`
Full diff: v1.16.0...v2.0.0