OrchestKit doctor for health diagnostics across manifest integrity, hook configuration, skill validation, agent frontmatter, MCP server connectivity, CC version compatibility, and permission rules. Reports issues with severity levels and auto-remediation suggestions. Validates component counts, detects orphaned entries, and checks CC version matrix compliance. Use when diagnosing plugin health, troubleshooting configuration issues, or running pre-release checks.
Commandlow
Invoke
/ork:doctor
Doctor OrchestKit doctor for health diagnostics across manifest integrity, hook configuration, skill validation, agent frontmatter, MCP server connectivity, CC version compatibility, and permission rules. Reports issues with severity levels and auto-remediation suggestions. Validates component counts, detects orphaned entries, and checks CC version matrix compliance. Use when diagnosing plugin health, troubleshooting configuration issues, or running pre-release checks.
A full doctor run takes ~20s. Most invocations only need one slice. Ask the user up-front so voice-flow shortcuts ("just the MCPs") map cleanly:
# Skip the prompt when an explicit scope arg or env override is present:# /ork:doctor cc → skip, use cc-only# /ork:doctor mcp → skip, use mcp-only# /ork:doctor plugin → skip, use plugin-only# ORK_DOCTOR_SCOPE=all (or any of the above) → skip, use the env value## Otherwise, ask:AskUserQuestion(questions=[{ "question": "What should doctor check?", "header": "Scope", "options": [ {"label": "Everything (default)", "description": "Full system health — ~20s; runs all 15 categories"}, {"label": "CC version & features only", "description": "Categories 10 + 13 + 14; ~3s — for 'is my CC up to date?'"}, {"label": "MCP servers only", "description": "Category 12 (incl. pinning sub-check); ~5s — for 'are MCPs working?'"}, {"label": "Plugin health only", "description": "Categories 0-3 + 5 (skills, agents, hooks, build); ~8s — for 'after npm run build'"} ]}])
Skip the prompt entirely when the scope is unambiguous from the invocation. The fast scopes (3-8s) are 3-7× faster than the full run — voice users say "just the MCPs" and get a 5s answer.
The /ork:doctor command performs comprehensive health checks on your OrchestKit installation. It auto-detects installed plugins and validates 15 categories:
MCP Status - Active vs disabled vs misconfigured, API key presence for paid MCPs. CC 2.1.110: detects duplicate definitions across config scopes. Sub-check warns when HIGH-tier servers resolve to @latest in .mcp.json (closes #1462)
Plugin Validate - Runs claude plugin validate for official CC frontmatter + hooks.json validation (CC >= 2.1.77)
Effort/Model Compatibility - Warns when xhigh effort is requested without Opus 4.8 (silent fallback otherwise)
Activation-channel orphans (repo / pre-release): a user-invocable skill should be reachable by more than a human typing it — via a chain (another skill references /ork:<skill>), a subagent grant (skills: in src/agents/*.md), or a background trigger. A skill with none is an "island" that silently rots. In a repo checkout, run npm run test:manifests:channels (gated in CI via test:manifests). Fix an island by wiring any one channel, or add it to STANDALONE_ALLOWLIST with a justification.
CC 2.1.111 added xhigh effort (Opus 4.8; since CC 2.1.154 it defaults to high and takes xhigh for the hardest tasks). Using it with a model that doesn't support it silently falls back to high — producing no error but losing the extra deepening pass documented in the affected skills.
Detection:
If the active model does NOT support xhigh (i.e. not Opus 4.8), check whether /effort is set to xhigh:
Read .claude/settings.json → effort field
Read $ORCHESTKIT_EFFORT env var (populated by the effort-detector hook)
Check for any skill invocation under .claude/chain/*.json that explicitly set effort: xhigh with a non-Opus-4.8 model in scope
Warning format:
WARNING: xhigh effort requires Opus 4.8. Current model: <model-id> Configured effort: xhigh Impact: Skills fall back to high — xhigh's extra deepening pass is lost silently. Fix: Either switch to Opus 4.8 (`claude --model opus-4-8`) or lower effort to `high`.
Exit code: Non-zero in --json mode; soft warning in interactive mode.
Load Read("$\{CLAUDE_SKILL_DIR\}/references/remediation-guide.md") for the full results interpretation table and troubleshooting steps for common failures (skills validation, build sync, memory).
Bisect with --safe-mode (CC 2.1.169+): when doctor findings don't explain a misbehaving session, restart with claude --safe-mode (or CLAUDE_CODE_SAFE_MODE=1) — it disables ALL customizations (CLAUDE.md, plugins incl. ork, skills, hooks, MCP). If the problem disappears, it's a customization; re-enable halves to isolate. If it persists, it's CC itself — file upstream.
CC 2.1.69+: Run /reload-plugins to activate plugin changes in the current session without restarting.
CC 2.1.116+: /reload-plugins and background plugin auto-update now auto-install missing plugin dependencies from marketplaces you've already added. If ork:doctor flagged a plugin-load failure due to a missing dep, /reload-plugins resolves it in place — no manual plugin install step needed.
CC 2.1.152+: For non-plugin skills in a skill directory (~/.claude/skills/ or .claude/skills/), run /reload-skills to re-scan without restarting — the skill analogue of /reload-plugins.
Validates graph memory with file-level integrity checks:
# Automated checks:# - Graph: .claude/memory/ exists, decisions.jsonl valid JSONL, queue depth# Run these commands to gather memory health data:wc -l .claude/memory/decisions.jsonl 2>/dev/null || echo "No decisions yet"wc -l .claude/memory/graph-queue.jsonl 2>/dev/null || echo "No graph queue"ls -la .claude/memory/ 2>/dev/null || echo "Memory directory missing"
Read .claude/memory/decisions.jsonl directly to validate JSONL integrity (each line must parse as valid JSON). Count total lines, corrupt lines, and report per-category breakdown.
# agent-browser (vercel-labs/agent-browser)# Prefer the structured `agent-browser doctor --json` from 0.26.0+ (CC 2.1.121+).# Falls back to the fuzzy "is the binary on PATH + symlink present?" probe on older versions.if command -v agent-browser >/dev/null 2>&1; then if agent-browser doctor --json >/tmp/ab-doctor.json 2>/dev/null; then # Structured snapshot: surface only high-severity issues + a one-line health summary. jq -r ' "agent-browser: " + (if (.daemon.status // "unknown") == "running" then "OK" else "DEGRADED" end) + " (chrome=" + (.chrome.version // "?") + ", net=" + (if .network.reachable then "✓" else "✗" end) + ")" ' /tmp/ab-doctor.json # Promote any high-severity issue into doctor's findings stream. jq -r '.issues[]? | select(.severity == "high") | " ↳ HIGH: " + .message' /tmp/ab-doctor.json else # Fallback for agent-browser < 0.26 (no `doctor` subcommand) test -L "$HOME/.claude/skills/agent-browser" \ && echo "agent-browser: installed (legacy probe — upgrade to 0.26+ for structured doctor)" \ || echo "agent-browser: SYMLINK MISSING at ~/.claude/skills/agent-browser" fielse echo "agent-browser: NOT INSTALLED (optional — install via vercel-labs/agent-browser ≥ 0.26)"fi# portless: stable named localhost URLs for local dev# which portless 2>/dev/null && portless list 2>/dev/null# If missing: RECOMMEND "npm i -g portless" for stable local dev URLs# If installed but not running: WARN "portless is installed but no services registered"# tailscale (M127 #1561): only relevant if user has used /ork:dev --share / --funnel / --live.# Detected by inspecting .claude/state/dev-stack.json for share != null.# if [[ -f .claude/state/dev-stack.json ]] && jq -e '.share != null' .claude/state/dev-stack.json >/dev/null 2>&1; then# command -v tailscale >/dev/null 2>&1 \# && echo "tailscale: OK (share mode in use: $(jq -r '.share.mode' .claude/state/dev-stack.json))" \# || echo "tailscale: SHARE MODE ACTIVE BUT TAILSCALE CLI MISSING (Install: brew install tailscale)"# fi# Live demos older than 24h (M127 #1565): warns about sprawl from /ork:dev --live.# live_log=".claude/state/live-demos.jsonl"# if [[ -f "$live_log" ]]; then# now_ts=$(date -u +%s)# while IFS= read -r line; do# expires=$(printf '%s' "$line" | jq -r '.expiresAt // empty')# [[ -z "$expires" ]] && continue# expires_ts=$(date -j -u -f '%Y-%m-%dT%H:%M:%SZ' "$expires" +%s 2>/dev/null \# || date -u -d "$expires" +%s 2>/dev/null)# if [[ -n "$expires_ts" && "$expires_ts" -lt "$now_ts" ]]; then# age_h=$(( (now_ts - expires_ts) / 3600 ))# echo "live demo: EXPIRED ${age_h}h ago — branch=$(printf '%s' "$line" | jq -r '.branch')"# fi# done < "$live_log"# fi
Why structured doctor: agent-browser 0.26.0 added doctor --json returning a snapshot of chrome, daemon, network, config, security, and providers. Wiring it in turns the previous "agent-browser broken" failure into actionable per-subsystem findings (Chrome version, daemon status, network reachability, high-severity issues), unblocking debug sessions where the user can't tell us what's wrong.
Runs claude plugin validate for official CC validation of frontmatter and hooks.json. This complements OrchestKit's custom checks (categories 1-3) with CC's built-in validator.
# Check CC version supports plugin validate (>= 2.1.77)# If CC < 2.1.77, skip with: "Plugin validate: SKIPPED (requires CC >= 2.1.77)"# Run official validation from plugin rootclaude plugin validate# Checks performed by CC:# - SKILL.md frontmatter schema (required fields, types, allowed values)# - hooks.json schema (event types, matchers, command paths)# - Agent frontmatter schema (model, tools, skills fields)# - File path resolution (command paths in hooks exist)
Relationship to OrchestKit checks:claude plugin validate performs structural/schema validation at the CC level. OrchestKit's categories 1-3 perform deeper semantic checks (token budgets, cross-references, async patterns) that CC does not cover. Both should pass for a fully healthy plugin.
CC 2.1.126 added claude project purge [path] — deletes all CC state (transcripts, tasks, file history, config entry) for a project. Surface this as an info-severity diagnostic when canonical project paths no longer exist on disk.
# Check CC version supports project purge (>= 2.1.126)# If CC < 2.1.126, skip silently (suggestion would be unactionable)# Detect stale project state via the authoritative source.# Use `claude project purge --dry-run --all` because the directory-name encoding# under ~/.claude/projects/ is lossy (both `/` and `.` collapse to `-`, so the# original path cannot be reconstructed deterministically — `my-project` is# indistinguishable from `my.project` or `my/project`). The CLI's dry-run# output emits canonical paths from ~/.claude.json which IS lossless.## claude project purge --dry-run --all 2>/dev/null \# | grep -oE 'projects\["[^"]+"\]' \# | sed -E 's/^projects\["//; s/"\]$//' \# | while IFS= read -r p; do# [ -n "$p" ] && [ ! -d "$p" ] && echo "$p"# done## Example output (info severity, never blocking):# ℹ Stale project state: 3 canonical paths reference directories that no longer exist on disk.# Suggested cleanup (always preview first):# claude project purge --dry-run --all# claude project purge --interactive # confirm each project
Why info, never warn or fail: the user may have moved a project rather than deleted it; aggressive removal would lose transcript history. Always recommend --dry-run first. Mirrors the pattern from claude plugin prune (Category 13b).
Why not parse ~/.claude/projects/ directly: the directory naming is a lossy collapse of the original path (/ and . both become -). A naive sed 's|-|/|g' decode produces ambiguous results — ~/.claude/projects/Users-me-my-project could be /Users/me/my-project, /Users/me/my/project, /Users/me/my.project, or other combinations. The dry-run output above is the canonical source.
# Checks performed:# - Parse .mcp.json, list each server with enabled/disabled state# - For tavily: check TAVILY_API_KEY env var OR op CLI availability# - For memory: check MEMORY_FILE_PATH path is writable# - For agentation: check agentation-mcp package is installed (npx --yes dry-run)# - Flag any enabled MCP whose process would likely fail at startup# - HIGH-tier @latest pinning: see references/mcp-pinning-check.md# (script: scripts/check-mcp-pinning.sh — exit 1 on HIGH-tier @latest)# - alwaysLoad audit (CC 2.1.121+, #1541): warn when memory, context7, or# sequential-thinking lack `"alwaysLoad": true` — these are universally# used and per-skill ToolSearch probes are wasted work without it.# Skip the warning on CC < 2.1.121 (key would be silently ignored).# - claude plugin orphans (CC 2.1.121+, #1544): suggest `claude plugin prune`# when `claude plugin list --json` shows orphaned auto-installed deps.
Incorrect:
MCP Servers: all OK
Correct:
MCP Servers:- context7: enabled ✓- tavily: enabled ✗ TAVILY_API_KEY not set — will fail at startup
MCP Servers:- context7: enabled ✓- memory: enabled ✓- tavily: enabled ✗ TAVILY_API_KEY not set — MCP will fail at startup Fix: set TAVILY_API_KEY or set "disabled": true in .mcp.json
Misconfigured (agentation enabled but not installed):
MCP Servers:- agentation: enabled ✗ agentation-mcp package not found Fix: npm install -D agentation-mcp or set "disabled": true
Warning — forceRemoteSettingsRefresh without endpoint:
Managed Settings: WARNING- forceRemoteSettingsRefresh: enabled but no remote settings endpoint detected- This will block startup if network is unavailable- Configure a remote endpoint or remove forceRemoteSettingsRefresh
Info — not set:
Managed Settings: OK (default)- forceRemoteSettingsRefresh: not set (falls back to cached settings)
MCP connector conflict (CC >= 2.1.92 fix):
MCP Servers: WARNING- Plugin MCP server "{name}" duplicates a claude.ai connector- Prior to CC 2.1.92 this caused stuck "connecting" state- Consider setting ENABLE_CLAUDEAI_MCP_SERVERS=false or renaming the plugin server
OrchestKit uses 148 global hook entries across 27 event types, compiled into 11 bundles. This reference explains how to validate and troubleshoot hooks.
Warns when .mcp.json resolves HIGH-tier MCP servers to @latest. HIGH-tier
upstream packages are pre-1.0 or beta-surface — a breaking change can land on
any npx -y fetch with no signal.
The check parses .mcp.json and for each non-disabled entry extracts the npm
package + version specifier from args (handles both npx -y pkg@x and
sh -c "... npx -y pkg@x" shapes). Local servers (e.g., node ./server.mjs)
are skipped.
src/skills/doctor/scripts/check-mcp-pinning.sh — invokable standalone or via
/ork:doctor Category 12.
# Standalonesrc/skills/doctor/scripts/check-mcp-pinning.sh# JSON for CIsrc/skills/doctor/scripts/check-mcp-pinning.sh --json# Test fixturesrc/skills/doctor/scripts/check-mcp-pinning.sh --mcp-json /tmp/test.json
Exit codes: 0 = OK or absent, 1 = HIGH-tier @latest found, 2 = usage error.
Separate from the graph store above: the harness injects a per-project
auto-memory index (MEMORY.md) into context every session. CC loads only
the first 200 lines OR first 25 KB, whichever comes first — anything past
either limit is silently dropped (per code.claude.com/docs/memory). CC gives no
warning as you approach those caps; this check makes it actionable by pointing
at the fix (/ork:dream). A growing index also busts the prompt cache, since it
changes whenever a memory is written.
The index lives under ~/.claude/projects/<encoded-cwd>/memory/MEMORY.md — the
harness encodes the project path by replacing both / and . with -.
# Auto-memory index budget check (CC caps at 200 lines OR 25 KB, whichever first).# ORK_MEM_INDEX override is for the unit test; default derives the per-project index.MEM_INDEX="${ORK_MEM_INDEX:-$HOME/.claude/projects/$(echo "$PWD" | sed 's|[/.]|-|g')/memory/MEMORY.md}"BUDGET_BYTES=24986 # 24.4 KB — conservative vs CC's 25 KB load capBUDGET_LINES=200 # CC loads the first 200 lines OR 25 KB, whichever comes firstif [ -f "$MEM_INDEX" ]; then bytes=$(wc -c < "$MEM_INDEX" | tr -d ' ') lines=$(wc -l < "$MEM_INDEX" | tr -d ' ') # index lines over ~200 chars are the usual re-bloat cause long=$(awk 'length > 200 && /^- \[/' "$MEM_INDEX" | wc -l | tr -d ' ') if [ "$bytes" -gt "$BUDGET_BYTES" ]; then echo "WARN: MEMORY.md index ${bytes}B > ${BUDGET_BYTES}B budget — run /ork:dream to consolidate" elif [ "$lines" -gt "$BUDGET_LINES" ]; then echo "WARN: MEMORY.md index ${lines} lines > ${BUDGET_LINES} (CC drops the rest) — run /ork:dream" elif [ "$long" -gt 0 ]; then echo "WARN: ${long} index line(s) > 200 chars — run /ork:dream (re-bloat risk)" else echo "OK: MEMORY.md index within budget (${bytes}B, ${lines} lines)" fifi
/context shows what's currently loaded into the window (CC's native view);
this check is the budget warning CC doesn't provide on its own.
# Find corrupt linespython3 -c "import json, syswith open('.claude/memory/decisions.jsonl') as f: for i, line in enumerate(f, 1): try: json.loads(line) except: print(f'Line {i}: {line.strip()[:80]}')"
Queue items accumulate if the stop dispatcher doesn't run (e.g., session crash). The queue-recovery hook processes orphaned queues on the next session start.
# Run CC's official validator (requires CC >= 2.1.77)claude plugin validate# Fix reported errors, then rebuild and re-validatenpm run buildclaude plugin validate
CC ≤ 2.1.127 occasionally left installed_plugins.json entries pointing at deleted cache directories, polluting PATH for subprocesses. CC 2.1.128+ scrubs those automatically — no maintenance needed at our floor (2.1.168). If you see plugin commands failing with command not found after uninstalling a plugin on CC < 2.1.128, upgrade.
If multiple CC sessions all logged themselves out at the same moment after the laptop woke from sleep, that is the pre-2.1.129 OAuth refresh race — concurrent wake-time refreshes invalidated the active token across every running session.
Fix: upgrade to CC ≥ 2.1.129 (our floor is 2.1.206, so anyone on the supported window is already fixed). Recover the session with:
claude /login
Then claude --resume the affected session(s). Checkpoint state in .claude/pipeline-state.json survives — see checkpoint-resume skill for resume semantics.
If logouts after wake persist on CC ≥ 2.1.129, the cause is no longer the race — investigate the refresh token (expired, keychain ACL changed, 1Password locked) instead.
If you had multiple CC sessions open (worktree-isolated agents, parallel /ork:implement chains, multi-tab work) and every one of them dead-ended at 401 Unauthorized at the same instant — that is the pre-2.1.133 parallel-session refresh-token race. A refresh-token rotation fired in one session, the other sessions raced against it, and they all wound up holding the now-invalidated old token.
Fix: upgrade to CC ≥ 2.1.133 (our floor is 2.1.206, so the supported window is already past this). Recover the stuck sessions with:
claude /login
Then claude --resume the affected sessions. Worktree state in each agent's branch is unaffected.
If "all sessions 401 at once" still reproduces on CC ≥ 2.1.133, the cause is no longer this race — check the refresh token itself (expired, revoked by the IdP, keychain ACL changed, 1Password locked). See also the "Logged out after laptop wake" entry above for the related 2.1.129 wake-from-sleep race.
If a worktree spawned via EnterWorktree, --worktree, or an agent run with isolation: "worktree" is missing commits you made locally but never pushed — and git log in the new worktree starts from origin/<default-branch> instead of your current HEAD — that is CC 2.1.133's new worktree.baseRef default at work. CC 2.1.133 added the setting with default "fresh", which branches new worktrees from origin/<default> rather than local HEAD (the 2.1.128–2.1.132 behavior).
Fix: set worktree.baseRef: "head" in .claude/settings.json (project) or ~/.claude/settings.json (user):
{ "worktree": { "baseRef": "head" }}
After adding the setting, spawn a fresh worktree — the new one will branch from local HEAD and include your unpushed commits. Existing worktrees that were created without the setting need to be recreated; you can recover their work by cherry-picking commits from the original branch first.
See $\{CLAUDE_SKILL_DIR\}/../chain-patterns/references/worktree-agent-pattern.md for the full agent-isolation context, and $\{CLAUDE_SKILL_DIR\}/../configure/references/cc-version-settings.md (CC 2.1.133 section) for the upstream change description.
Note:\{version\} is read from package.json at runtime. \{cc_version\} is detected from Claude Code. Counts reflect installed plugin — dynamic, not hardcoded.
Severity: info — this is a recommendation, never a hard gate. Claude Code's
OS sandbox is opt-in and Bash-only; doctor surfaces whether it's on and nudges it,
but a session is healthy without it.
Claude Code ships a native Bash sandbox (/sandbox → Seatbelt on macOS,
bubblewrap on Linux/WSL2). OrchestKit ships zero sandbox config by design —
isolation is the harness's job, not a plugin's. So most users never turn it on
and don't know it exists. This check makes the posture visible.
There is no runtime API for a hook to read sandbox state, so the only signal
is settings.local.json. Treat a missing sandbox.enabled key as "off / unknown".
sandbox.enabled == true → report ON. If denyRead is empty, add: "sandbox on
but ~/.ssh / ~/.aws are still readable — add them to sandbox.filesystem.denyRead."
false / unset → emit the nudge below.
Nudge (info-level):
Run /sandbox to enable Claude Code's OS Bash-sandbox. Starter config for.claude/settings.local.json: "sandbox": { "enabled": true, "filesystem": { "denyRead": ["~/.ssh", "~/.aws", "~/.config/gh"] }, "network": { "allowedDomains": ["github.com", "registry.npmjs.org", "pypi.org", "api.anthropic.com"] } }
Bash-only. The sandbox confines Bash subprocesses. The Read/Write tools,
MCP servers, and hooks run unsandboxed on the host. Turning it on raises the
floor; it is not full agent containment.
~/.ssh is readable by default unless sandbox.filesystem.denyRead is set —
the nudge above includes it for exactly this reason.
No detection API.settings.local.json is the only signal; a session running
sandboxed via CLI flag without the settings key reads here as "not configured".
This pairs with the runtime network-egress guard (#2533): the guard blocks known
exfil patterns at the policy layer; the sandbox adds a real OS boundary. Neither is
a substitute for the other. See milestone #160.
# Validate all SKILL.md filesfor category in skills/*/.claude/skills; do for f in "$category"/*/SKILL.md; do npx ajv validate \ -s .claude/schemas/skill files \ -d "$f" || echo "INVALID: $f"done
Skills that depend on a Claude Code Research Preview feature are marked with an
experimental: frontmatter block declaring the reason, expected GA window, and
exit criteria. Doctor should compute this list dynamically by scanning
src/skills/*/SKILL.md for frontmatter containing experimental: and report
any skills whose exit-criteria is missing or empty as a warning.
Current experimental skills (M139, snapshot — verify via dynamic scan):
None.ork:agents-view was removed in favor of the native claude agents
CLI (CC 2.1.139+) plus the parallel-primitives doc at
docs/parallel-primitives.md.
When a future skill depends on an unreleased CC feature, add it to this table
with its exit-criteria so doctor can warn about Research Preview surface
area. Remove the entry once the underlying CLI feature reaches GA and the
skill is no longer marked experimental: in its frontmatter.
Re-scans skill directories without restarting; SessionStart hooks can return reloadSkills: true to expose hook-installed skills the same session
Restart required to pick up new/edited skills
marketplace remove --scope
2.1.152
claude plugin marketplace remove accepts --scope user|project|local, matching add/install/uninstall
remove had no scope selector
disallowed-tools frontmatter
2.1.152
Skills/slash commands can set disallowed-tools to remove tools while active (ork uses allowed-tools allowlists instead)
Tool restriction only via allowlist
--fallback-model session switch
2.1.152
When the primary model is not found, CC switches to the configured --fallback-model for the rest of the session instead of failing every request
Every request errored on a missing primary model
auto mode no consent
2.1.152
permissionMode: "auto" no longer requires opt-in consent before the classifier approves tools
Auto mode gated behind a one-time consent prompt
sandbox warning in condensed layout
2.1.152
The sandbox-enabled warning now shows in every startup layout — previously missing in condensed mode
Sandbox warning hidden in condensed startup
MessageDisplay hook event
2.1.152
New hook event: hooks can transform or hide assistant message text as it is displayed. ork has no MessageDisplay hook (recognized in the HookEvent type union for future use; not in the curated hook-contract spec)
No hook-point for displayed assistant text
Opus 4.8 + default effort
2.1.154
Opus 4.8 launches; defaults to high effort, xhigh for the hardest tasks. Lean system prompt is now default for all models except Haiku/Sonnet/Opus ≤ 4.7
Opus 4.7 was the newest; xhigh framed as 4.7-only
Dynamic workflows / /workflows
2.1.154
Ask Claude to create a workflow; it orchestrates tens-to-hundreds of agents in the background. /workflows lists runs. ork treats it as complementary to its foreground Agent Teams patterns (see agent-orchestration, swarm-migrate)
No native large-scale background orchestration
/simplify cleanup-only
2.1.154
/simplify now runs a cleanup-only review (reuse, simplification, efficiency, altitude) and applies fixes — it no longer invokes the full /code-review --fix bug-hunt
ork's code-review-playbook briefly documented the old behavior (fixed)
subagent worktree-isolation guard
2.1.154
Subagents in background sessions no longer bypass the worktree-isolation guard / write to the shared checkout; worktree.baseRef:"head" resolves the current worktree's HEAD when spawning from a linked worktree. A residual shell-command leak persisted until 2.1.203 (see that row)
Agent(isolation:"worktree") thrashed the shared checkout; manual pre-create workaround needed
claude agents runs a shell command as an attach/detachable background session via ! <command> (or claude --bg --exec) — documented in ork:dev
No backgrounded shell from the agents view
multiple-choice reserved
2.1.154
CC reserves the multiple-choice prompt for decisions it genuinely can't make itself; don't gate orchestration on resolvable AskUserQuestions (agent-orchestration)
Asked even when context sufficed
/model default persist
2.1.153
/model saves the selection as the default for new sessions; press s for session-only. BREAKING: keybinding modelPicker:setAsDefault renamed to modelPicker:thisSessionOnly (documented in setup/references/keybindings.md)
d set default; old binding name silently dead
subagent MCP policy + strict-config fixes
2.1.153
Subagent frontmatter mcpServers now honor --strict-mcp-config/--bare/managed-MCP allow-deny; --strict-mcp-config no longer strips inline mcpServers from explicit --agents defs. ork agents declaring mcpServers inherit policy correctly — no ork change
Subagent MCP servers bypassed managed policy
OAuth gateway credential fix
2.1.153
Fixed a custom API gateway receiving the user's Anthropic OAuth credential instead of the gateway's own token (security). CC-internal; no ork surface
Gateway could receive the wrong credential
/usage per-category breakdown
2.1.149
/usage breaks cost down per skill, subagent, plugin, and per-MCP-server — complements claude plugin details ork for ork cost audits
Aggregate usage only
internal infra + thinking-block fix
2.1.155–2.1.156
2.1.155 is internal infrastructure only; 2.1.156 fixes a client crash where modified thinking blocks on Opus 4.8 caused API errors. No ork surface
—
.claude/skills autoload + plugin init
2.1.157
Plugins under .claude/skills auto-load without a marketplace; claude plugin init <name> scaffolds a plugin; EnterWorktree switches worktree mid-session; OTEL_LOG_TOOL_DETAILS=1 adds tool_parameters spans; /config toggles the Workflow keyword trigger. ork: no adoption yet (local-skills autoload could simplify dev installs)
Plugins required a marketplace; no mid-session worktree switch
auto mode on cloud providers
2.1.158
CLAUDE_CODE_ENABLE_AUTO_MODE=1 enables auto mode on Bedrock/Vertex/Foundry for Opus 4.7 & 4.8. Latest published CC (2026-05-30). No ork surface
Auto mode was first-party API only
shell startup file write prompt
2.1.160
CC prompts before writing shell startup files (.zshenv/.zlogin/.bash_login, ~/.config/git/); documented in security-patterns, configure
Silent writes to exec-on-load files
acceptEdits build-config write prompt
2.1.160
acceptEdits mode prompts before writing build-tool configs that grant code execution (.npmrc, bunfig.toml, .bazelrc, .pre-commit-config.yaml, .devcontainer/)
Silent writes to exec-granting build configs
grep satisfies read-before-edit
2.1.160
A single-file grep/egrep/fgrep now satisfies the read-before-edit check; a separate Read is no longer required before Edit
Redundant Read required before each Edit
bg session SIGTERM before SIGKILL
2.1.160
Background-session teardown (claude rm/stop, idle reap) sends SIGTERM to shell subprocesses before SIGKILL so cleanup handlers run
Cleanup handlers skipped on teardown
workflow trigger renamed ultracode
2.1.160
Dynamic-workflow trigger keyword renamed workflow → ultracode; the bare word "workflow" no longer triggers a run. ork invokes the Workflow tool programmatically, so no skill copy depends on the keyword
Typing "workflow" silently triggered a run
parallel tool independent failure
2.1.161
A failed Bash in a parallel tool batch no longer cancels sibling calls; each returns independently. Noted in chain-patterns, agent-orchestration, task-dependency-patterns
One failed call aborted the whole batch
claude mcp secret redaction
2.1.161
claude mcp list/get/add no longer expands $\{VAR\} refs and redacts credential headers + URL secrets; noted in mcp-patterns, security-patterns
Secrets printed to terminal
OTEL resource-attr metric labels
2.1.161
OTEL_RESOURCE_ATTRIBUTES attached as labels on metric datapoints for slicing by team/repo; noted in monitoring-observability, telemetry-inspect
No custom-dimension slicing of usage metrics
claude agents done/total
2.1.161
claude agents rows show done/total for fanned-out work; peek shows the longest-running item
No fan-out progress in the agents list
/mcp collapse unused connectors
2.1.161
/mcp collapses claude.ai connectors never signed in to behind a "Show unused connectors" row
Long connector list with dead entries
OTEL_LOG_ASSISTANT_RESPONSES
2.1.193
New claude_code.assistant_response OTEL log event carries the model's response text. Redacted unless OTEL_LOG_ASSISTANT_RESPONSES=1; when unset it follows OTEL_LOG_USER_PROMPTS — deployments already logging prompts START logging response content on upgrade. Set =0 to keep prompts-only. Same secret-leak class as OTEL_LOG_RAW_API_BODIES (2.1.111)
No response-text log event; prompt logging never implied response logging
Notification agent events
2.1.198
Notification hook fires agent_needs_input / agent_completed for background agents. Adopted: ork's notification/sound.ts + desktop.ts map both — needs-input gets a desktop banner + Ping (actionable), completed is sound-only Glass so a fleet of finishing agents doesn't spam banners. ORK_SOUND_AGENT_NEEDS_INPUT / ORK_SOUND_AGENT_COMPLETED override the sounds
New types silently dropped by the notification hooks
subagents background by default
2.1.198
Agent-tool subagents launch in the background by default; pass run_in_background: false when a synchronous result is required. ork: 15/38 agents already declare background: true; cover/expect pass the flag explicitly (chain-patterns has the await/Monitor note)
Subagents ran foreground unless requested
Explore inherits session model (≤ Opus)
2.1.198
Built-in Explore agent inherits the main session's model capped at Opus. Cost note: from a premium-model session (e.g. Fable 5), Explore bills at Opus — no longer haiku-floored, and there is no knob to pin it back
Explore always ran on haiku
extended-thinking inheritance
2.1.198
Subagents and context compaction inherit the session's extended-thinking config automatically; no agent-frontmatter knob needed, no ork change
Extended thinking disabled in delegated tasks
--bg + --print rejected up front
2.1.198
claude --bg combined with --print/-p is rejected at launch instead of silently creating an unattachable session. ork's --bg usages (ci-sentinel, dev) never combine the flags
Silent unattachable session
/agents wizard removed
2.1.198
Manage subagents by asking Claude or editing .claude/agents/ directly. No ork surface ever referenced the wizard
Interactive /agents wizard
stacked slash-skills (≤5)
2.1.199
/skill-a /skill-b do XYZ loads all leading skills (up to 5) in order; the trailing args belong to the whole stack — /ork:auto /ork:brainstorm <goal> now composes officially (documented in auto)
Only the first slash skill loaded
subagent partial results on API errors
2.1.199
Subagents cut off by a rate limit or server error return their partial work and report the error to the parent instead of failing silently or reading as success
Silent failure or false-success results
hook exit-2 stderr visible
2.1.199
SessionStart/Setup/SubagentStart hooks exiting code 2 now show stderr in the transcript. ork's SessionStart banners are async exit-0 (intentionally operator-visible, unchanged); no ork hook exits 2 on these events
Exit-2 stderr silently hidden
CLAUDE_CODE_RETRY_WATCHDOG
2.1.199
Raises the default retry count for non-capacity transient errors to 300 and lifts the cap of 15 on CLAUDE_CODE_MAX_RETRIES — relevant to long headless claude -p harnesses (noted in bare-eval)
Retry cap 15, no watchdog
permission mode "Manual" rename
2.1.200
The "default" permission mode displays as "Manual"; --permission-mode manual and "defaultMode": "manual" accepted as aliases while default stays valid. ork settings define no defaultMode; skill flags use explicit modes (acceptEdits/dontAsk/plan)
UI label "default" only
AskUserQuestion no auto-continue
2.1.200
AUQ dialogs no longer auto-continue by default; an idle timeout is opt-in via /config. ork uses AUQ as blocking intent gates and never relied on auto-continue (noted in configure)
Dialogs auto-continued after idle
worktree plugin loading fix
2.1.200
Project-scoped plugins now load correctly from git worktrees of the same repository — unblocks worktree-based plugin dev loops. Also fixes claude agents --plugin-dir flag placement
Plugins missing when working from a worktree
Sonnet 5 harness-reminder delivery
2.1.201
Sonnet 5 sessions stop using the mid-conversation system role for harness reminders. CC-internal; hook additionalContext delivery unchanged, no ork surface
—
Resume speed in many-worktree repos
2.1.202
Resuming a session by name or opening the resume picker no longer takes minutes / high memory in repos with many git worktrees — directly relevant to ork's worktree-heavy model (agents isolation: worktree, /ork:implement, /ork:dev branch-named worktrees, hq-ext:start-issue)
Multi-minute, high-memory session resume in worktree-heavy repos
MCP config url without type
2.1.202
A remote MCP server entry in .mcp.json with a url but no type now errors with a suggestion to add "type": "http". Doctor MCP diagnostics should echo this: a url-only entry is a missing type field, not a malformed command — tell the user to add "type": "http" (or "sse" for SSE transport)
Pre-2.1.202 the same misconfig surfaced as the cryptic command: expected string, misdirecting users toward command/args
Worktree shell-command leak closed
2.1.203
Worktree-isolated subagents no longer run Bash/git against the parent checkout — completes the 2.1.154 isolation guard, which left a residual shell-command leak through 2.1.202 (claims corrected in chain-patterns/worktree-agent-pattern.md, implement/manual-worktree-pattern.md)
Isolated agents' shell commands could execute in the primary tree, auto-stashing untracked files
startup command warnings → /doctor + /status
2.1.203
CC no longer prints "claude command missing or broken" warnings at startup — they surface in native /doctor + /status instead. CC-internal display change; ork's doctor skill validates hook command: entries independently, no surface change
Warnings printed at every startup
LSP-plugin disuse false-positive fix
2.1.203
LSP-only plugins are no longer flagged for disuse when their language servers deliver diagnostics or answer navigation requests. ork ships no LSP servers — unaffected either way
LSP-only plugins wrongly flagged unused
MCP roots/list additional dirs
2.1.203
MCP roots/list now includes the session's additional working directories (--add-dir), with notifications/roots/list_changed when the set changes. Client-side capability CC advertises to servers; ork's MCP servers consume no roots
Roots omitted --add-dir directories; no change notification
SessionStart hook streaming in headless
2.1.204
Hook events now stream during SessionStart hooks in headless sessions — remote workers are no longer idle-reaped mid-hook. ork's 4 SessionStart hooks are fast/async (timeout: 5) and unaffected; benefits headless claude -p harnesses (bare-eval, ci-sentinel)
Headless remote workers could be idle-reaped during a SessionStart hook
--json-schema strict validation
2.1.205
An invalid --json-schema now hard-errors instead of silently falling back to unstructured output; the format keyword is now accepted. Relevant to bare-eval, the only ork surface using --json-schema (grading/trigger/quality schemas) — a malformed schema fails loudly now (noted in bare-eval/references/invocation-patterns.md). ork's grading schemas use format only as a property name, not the JSON-Schema keyword, so the keyword change is a no-op
Invalid schema silently produced unstructured output; format keyword rejected
native /doctor full checkup + /checkup alias
2.1.205
CC's native /doctor is now a full setup checkup that can diagnose and fix issues, aliased as /checkup. Distinct from ork's /ork:doctor skill — no ork skill behavior change; ork's doctor validates manifest/hook/skill integrity independently
Native /doctor was a narrower diagnostic
native /doctor CLAUDE.md-trim check
2.1.206
Native /doctor now proposes trimming checked-in CLAUDE.md files by cutting content Claude could derive from the codebase. Complementary to ork's own CLAUDE.md ≤ 4800B byte-budget PostToolUse hook (hooks/src/posttool/write/claude-md-byte-budget.ts) + tests/perf/test-token-overhead.sh — both push the same direction; no ork change
No native CLAUDE.md-size guidance
EnterWorktree external-path confirmation
2.1.206
EnterWorktree now asks for confirmation before entering a git worktree OUTSIDE the project's .claude/worktrees/ directory. ork's entire worktree convention is ../<repo>-<task> — always outside .claude/worktrees/ — so every documented EnterWorktree/worktree-add path now triggers a confirmation prompt (implement/manual-worktree-pattern.md, implement/references/worktree-workflow.md, chain-patterns/worktree-agent-pattern.md). Interactive flows just confirm; headless/agent flows should expect the prompt or place worktrees under .claude/worktrees/
External-path worktrees were entered without confirmation
MCP per-server request_timeout_ms honored
2.1.206
A per-server request_timeout_ms in .mcp.json / --mcp-config is now respected instead of defaulting to 60s — long-running MCP tool calls no longer time out at 60s in fresh sessions. ork sets no per-server timeout today, but it is now available for slow MCP servers
CC's built-in /commit-push-pr now auto-allows git push to remote.pushDefault (or the sole configured remote) in addition to origin. ork's commit/create-pr skills push explicitly to origin, so no ork permission surface changes
For API-key, Bedrock, Vertex, or Foundry users running long OrchestKit sessions (brainstorm, implement, cover chains), enable 1-hour prompt caching:
export ENABLE_PROMPT_CACHING_1H=1
This extends the prompt cache TTL from 5 minutes to 1 hour, significantly reducing token costs when:
Returning to a session after brief breaks
Running multi-phase skills that exceed the 5-minute cache window
Using /loop or scheduled tasks with intervals > 5 minutes
Note: Since CC 2.1.110, session recap is enabled by default even with telemetry disabled. Opt out via /config or CLAUDE_CODE_ENABLE_AWAY_SUMMARY=0. On CC 2.1.108-2.1.109, users with DISABLE_TELEMETRY=1 must set CLAUDE_CODE_ENABLE_AWAY_SUMMARY=1 manually.
Doctor should check for this env var and recommend it when:
User is on API key / Bedrock / Vertex / Foundry (not subscription)
Doctor should detect and display the release channel alongside the CC version check. The version is read from .claude-plugin/plugin.json or version.txt.
Version Pattern
Channel
Stability
X.Y.Z (no suffix)
stable
Production-ready
X.Y.Z-beta.N
beta
Feature-complete, may have bugs
X.Y.Z-alpha.N
alpha
Experimental, expect breaking changes
When on beta or alpha, doctor should append a pre-release reminder to the compatibility output:
Claude Code: 2.1.56 (OK)- Minimum required: 2.1.56- OrchestKit channel: beta (v7.0.0-beta.3) ⚠ Pre-release version — some features may be unstable. Report issues at github.com/yonatangross/orchestkit/issues
On stable, no extra warning is needed — just include the channel line: