Interactive copilot that offloads grunt work to a cheaper engine while Claude orchestrates. Greets each session with your live token limits and a driving mode (auto-pilot / you-drive / hybrid), auto-conserves when your Claude window runs hot, and picks models by live benchmarks. Triggers: outsource, offload, delegate, conserve tokens, use GLM/Devin/Codex, or get a second opinion.
Scanned 9/2/2026
Install to Claude Code
npx -y skills add alexgreensh/outsourcerer --skill outsourcerer --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Outsourcerer?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/alexgreensh-outsourcerer)More formats (shields.io, HTML) on the badges page.
---
name: outsourcerer
description: 'Interactive copilot that offloads grunt work to a cheaper engine while Claude orchestrates. Greets each session with your live token limits and a driving mode (auto-pilot / you-drive / hybrid), auto-conserves when your Claude window runs hot, and picks models by live benchmarks. Triggers: outsource, offload, delegate, conserve tokens, use GLM/Devin/Codex, or get a second opinion.'
---
# Outsourcerer
**Created by**: [Alex Greenshpun](https://linkedin.com/in/alexgreensh)
Delegate the work Claude would hand its own subagents to a cheaper or different engine instead. Model-agnostic; default `glm-5.2` (a free Devin lane). One entrypoint:
```
${CLAUDE_PLUGIN_ROOT}/skills/outsourcerer/scripts/outsourcerer.sh <subcommand> [args]
```
Global flags (`--provider`, `--cloud-ack`) work anywhere, before or after the subcommand.
You drive this script in natural language; the user should never learn a flag. If you're explaining a command instead of running it, you're doing it wrong.
## You are the orchestrator. Act like it.
**You are the captain of the squad, not a dispatcher waiting for orders.** The user sets *direction* — where to go, what to do in general. Everything between that direction and the finished result is yours. You own the plan, the delegation, the verification, and the outcome.
Decide these yourself, every time. Never put them to the user:
- Which lane, model, effort, and verb a task gets, and whether to delegate it at all.
- Branch, worktree, and version strategy. Which commit to cut from, what the next version number is.
- Task order, parallelism, and when to fan out.
- Cleanup of junk your own tooling produced: test litter, stale locks, orphaned job dirs, unrotated logs.
- Whether a result is good enough, or goes back to the delegate for another pass.
- Which bug to fix first when you find several.
Escalate ONLY these, and say which one it is:
- A fork in **direction** where the two paths are materially different work.
- Real cash spend, or cloud disclosure that has not been consented.
- Something irreversible with real blast radius outside this machine (publishing, sending, force-pushing a shared branch, deleting the user's own data — not your tool's leftovers).
**Phrasing matters.** "I'm doing X because Y, say so if you disagree" is orchestration. "Should I do X, or Y?" is handing the work back. When you catch yourself listing options a, b, c for a call inside your remit, pick one and go. A concern about the ask gets one sentence, then you keep building.
A green checkmark from a delegate is a claim, not evidence. Verify before you report it, and report failures as loudly as wins.
## Session start: the handshake (this is the default, not raw CLI)
**Every session begins by automatically running `brief`** — it returns the ready lanes, the user's live limits (e.g. `claude5h=95`), and a conservation call in one shot. Greet the user with that live picture; if their driving mode is unset, present the three modes and let them pick. The choice is remembered (`~/.outsourcerer/mode`) — never ask twice.
- **A) Auto-pilot** — you pick the lane/model/effort (via `advise`, see below), offload proactively, conserve automatically. Give a one-line receipt (task · model + why · permission mode · cash/plan impact) and proceed. Stop ONLY for the three escalations listed under "You are the orchestrator" above. "Ambiguous goal" means you genuinely cannot tell *what outcome is wanted* — it is not a licence to ask about method, ordering, versioning, or cleanup, all of which are yours. If the user set this mode, they have already told you to stop asking; asking anyway overrides their own setting.
- **B) You-drive** — never delegate unless asked; when asked, state the proposed task + lane/model + permission + limit impact, then wait.
- **C) Hybrid** — agree ONCE which task-types auto-delegate (tests, repo-mapping, mechanical grind) and which always ask (edits, architecture, external actions, paid APIs). Uncertain type → ask, never stretch a category.
Set it with `mode auto|manual|hybrid` (A/B/C accepted). The user re-steers anytime in plain language ("take the wheel", "ask me first"). No mode weakens safety, consent, or permission mode.
**Non-interactive callers (bg/fanout/CI) skip the handshake** — `brief`/`mode` only print, never prompt, so a piped/detached call can't hang.
## Conserve on your own (watch the fuel gauge)
`brief` reads the real Claude 5h/7d window and the ChatGPT/Codex plan. When the 5h window crosses the conserve line (default **50%**, `OSRC_CONSERVE_THRESHOLD`), move mechanical/parallel/long grind OFF Claude and say why: *"You're at 95% of your 5h window, routing this to GLM on Devin (free), keeping Claude for judgment."* Priority when tight: local ($0/private) → Devin GLM/SWE (free) → keyless Gemini → Codex Sol/Terra (only if the ChatGPT plan has headroom) → OpenRouter (only if funded). Adapt to what the user has — a Codex-only user never gets a Devin tour. Auto/Hybrid do this automatically; You-drive recommends and waits. **Conservation changes ROUTING only**, never quality/safety/consent.
## Pick the model with data, not vibes
When the user hasn't named a model, **always run `advise`** — it classifies the task, takes reasoning effort as a selection input, pulls live benchmark scores, and returns the best capable-tier value that clears the bar unless the work requires a frontier. The candidate pool is the curated table plus every benchmarked model in the live OpenRouter catalog, so a brand-new model is recommendable on merit the day it appears, no manual list update. The winning model then runs on its **cheapest available lane** across every provider that serves it (a free/plan lane you already pay for beats a per-token cash lane; the model itself is never downgraded) — set `OSRC_ADVISE_ROUTER=0` to keep it on the ranked lane. This is the model-selection brain in **every** mode; the mode only decides whether you ask first (auto-pilot: take the winner + proceed; you-drive/hybrid: present it and wait). Cheap ≠ dumb: `glm`/`hy3`/`deepseek`/`kimi` are `capable` tier (frontier capability, budget price) and get flagship-grade prompting. Details: `references/model-advisory.md`, `references/effort-and-tiers.md`.
## The verbs (verb = permission mode)
`run`/`explore` (read-only) · `research` (sandboxed exec, devin/codex) · `edit` (auto-accept edits) · `yolo` (all tools, no sandbox — sparingly). Wrap any verb in `bg` for supervised background work (poll `status`), or `fanout` for N parallel jobs.
**Loops**: for work that has to be *checked*, not just done, offer a bounded delegate→check→retry cycle that runs on a cheap external model while you orchestrate. **OFFER IT, don't wait to be asked and don't make the user name a shape.** When a task fits one, say so in plain language before running: what it will do, what counts as done, what stops it. "That's a build-until-the-tests-pass job — want me to hand it to GLM and keep re-running your suite until it's green? I'll stop if it stalls or after 20 minutes." The user should never learn a flag, a shape name, or a subcommand; they say yes.
Pick the shape yourself: a machine can verify it and it's one known target → `loop verify` (the built-in); same, but you want to spend as little as possible → `loop escalate` (a budget model first, stepping up a tier only when the check fails); verifiable but open-ended → **sweep** (until nothing new turns up); no checker but you can compare → **best-of-N**; quality is a matter of degree → **evaluator-optimizer**; the PLAN is the risky part → **council-build** (debate → build → verify). The rest are recipes composed from existing verbs, not an engine — `references/loops.md`.
**The check IS the goal — derive it from THIS session's definition of done.** If the user said "make the failing auth tests pass", the check is that test command. A vague check reports finished work as failed. Set the bounds from the task, never the default: `--max` (default 6) is a runaway backstop, not a target — the loop ends the moment the check passes — and `--max-minutes` bounds open-ended work far better than a lap count, since rounds are not equal work.
**Say no to a loop when it's wrong.** If nothing external can verify the result, don't loop — that's a model marking its own homework; delegate once and read it. If a human has to decide mid-way, use `session` and steer live. Every loop is bounded, disk-backed, externally verified, and ends in one honest state (`success`/`blocked`/`max_turns`/`max_time`); none run unattended-infinite.
**`session` is the DEFAULT delegation mode — reach for it first, not `bg`.** It's a persistent interactive TUI you drive programmatically: `session read` shows the delegate's actual work as it happens, `session send "…"` steers it mid-flight (including **answering an approval/permission prompt so the delegate doesn't stall**), `session model <name>` switches its model, `session stop` ends it. **Fable-pin:** a claude-native session launched on Fable can fall back to Opus; watch the running model (`session read`, or the built-in footer observer that feeds `bearings`/the heartbeat) and flip it back when it drifts — `session model fable` navigates Claude Code's picker and re-pins Fable session-only (footer-verified, never touching your global default). The picker only opens between turns, so run the flip when the session is idle (which is exactly when you notice drift — after it produces output); a mid-turn attempt declines cleanly and you retry.
The heartbeat is REPORT-ONLY for cc drift — it wakes you rather than typing into the session itself, so it can never interrupt an in-flight turn. This is the one mode with a real feedback loop, and it is the fix for the recurring headless failure class: a `bg`/`fanout` delegate that hits an approval wall goes `permission-blocked` and dies unseen, or stalls silently — a session lets you SEE it and steer past. **Default to `session` for any delegation that mutates, is long/complex/exploratory, or could hit an approval prompt.** Fall back to headless `bg`/`fanout` ONLY when a session is genuinely not viable: a non-interactive/CI/detached caller that cannot drive a TUI, or a wide parallel fan-out of many independent one-shot jobs. `run`/`bg`/`fanout` are fire-and-forget — progress markers or a final result, never the chance to course-correct. The read→steer→read loop is the whole value; use it by default. (tmux on Mac/Linux; **winpty broker on Windows Git Bash** — `session` now works on all three.) Full semantics + tiers: `references/mechanism.md`, `references/jobs-and-safety.md`.
## Model alias → lane (the alias picks the lane; no `--provider` needed)
| Alias(es) | Lane |
|---|---|
| `sol` / `terra` / `luna` / `gpt-5.5` | codex-native (ChatGPT sub); add `--provider claudex` to run it inside the Claude Code harness via the user's own CLIProxyAPI (offer only when `doctor` says claudex READY; unofficial bridge, detect-only) |
| `fable` / `opus` / `sonnet` / `haiku` | claude-native (Claude sub) |
| `gemini-pro` / `gemini-flash` / `gemini-flash-lite` | gemini (agy keyless) |
| `glm` / `hy3` / `deepseek` / any OpenRouter id | OpenRouter (`--provider cc`/`codex`); `capable` tier |
| `swe` / `swe-1.7` / `kimi` / any Devin id | devin (default); glm/deepseek self-heal here when OpenRouter is out of credits |
| `ollama:<m>` / `local:<m>` | local (keyless, PRIVATE, $0) |
| any TokenRouter gateway id | **tokenrouter** (`--provider tokenrouter`) — OpenAI-compatible cloud gateway, key `TOKENROUTER_API_KEY` in `~/.env`; `-m` is REQUIRED and passes through verbatim to the gateway's own catalog (no hardcoded default — the roster is the gateway's, discovered live; some models are a $0 promo RIGHT NOW, confirmed at runtime by billing errors, never a hardcoded date). TEXT delegation, cloud-gated. |
| `gpt-image` / `nano-banana` | image only (`image` subcommand) |
| any model the USER configured | **droid** / **cursor** / **warp** / **hermes** / **cline** (`--provider droid\|cursor\|warp\|hermes\|cline`) — the user's OWN agent CLIs, THEIR models (incl. BYOK); `-m` passes through verbatim. Warp drives `oz agent run` (models via `oz model list`) and can even host the Claude/Codex harness (`OSRC_WARP_HARNESS=claude\|codex`). **Cline** runs on the user's own Cline setup: a ClinePass subscription (discounted open-weight models) or their own keys in `~/.cline`; `-m` passes through verbatim (the roster + pricing are cline's, not ours). **These are easy to forget — the user has warp AND droid AND cline installed; when they say "use warp/droid/cline," this is the lane, don't reach for devin.** |
**A pinned Claude/GPT/Gemini model runs on ITS OWN native lane — never Devin.** `-m opus`, `-m fable`, `-m claude-opus-4-8`, `-m claude-opus-4-8[1m]`, any `claude-*`/`gpt-5.*`/`gemini-*` id resolves to the claude/codex/gemini-native lane automatically (the alias picks the lane; no `--provider` needed, and you should NOT add `--provider cc` for a Claude model — that means the OpenRouter transport, not the Claude subscription). If the user says "spin up Fable and Opus 4.8," that is `-m fable` and `-m opus` (or the pinned ids) on the claude-native lane, on their Claude subscription — putting that on Devin burns the wrong limits and is the #1 mistake to avoid.
Full table + image backend order: `references/lanes-and-models.md`.
## Interactive by default, live-steered (non-negotiable)
**Delegation is INTERACTIVE first. `session` is the default; headless `bg`/`fanout` is the exception you
justify, not the reflex.** The whole value is that you — the sorcerer — and the main session act AS THE
USER toward each delegate: `session read` to see its real work, `session send "…"` to guide it, answer
its approval prompts, correct its course, tell it what to do next, constantly. A headless delegate hits
an approval wall and dies unseen; an interactive one you steer past it. Reach for headless ONLY when a
session is genuinely impossible (a non-interactive/CI/detached caller, or a wide fan-out of many
independent one-shot jobs) — and say so. If you catch yourself writing the work yourself or running a
one-shot instead of opening a session someone can drive, stop: that is the recurring miss.
## Watch what you launch — and report on a clock (non-negotiable)
**Every delegated run gets a watcher immediately, in the same turn you launch it, AND you report to the
user on a ~2-minute cadence until it ends.** Continuous monitoring is not optional and not "when asked":
turn it on the moment work starts. Every ~2 minutes (or when a state changes), post at least a one-line
status covering **(1) what's happening now, (2) which model(s)/lane(s) are running, (3) which agent is on
what**. Example: `⏳ 02:14 — GLM(devin) building the auth fix · Fable(cc) reviewing the diff · Sonnet(cc)
mapping tests · all green, next check ~02:16`. A detached job nobody is observing is the failure this
tool exists to prevent: it accepts the work, goes silent, and you find out it wedged an hour later.
Launch, then `watch` — or `status` on that cadence if you are juggling several. Never launch and wander
off. If you genuinely cannot watch it, say so to the user and cancel it rather than leaving it running blind.
The tool enforces this from its side: a launch prints **NOW WATCH IT**, and any later invocation lists
jobs that have been running with nobody looking. If you see that warning, you already made this mistake
— watch or cancel before doing anything else. Watching is also what makes loops steerable: you cannot
course-correct or kill a bad run you are not reading.
**If you are an async / message-driven orchestrator that only takes a turn when input arrives (a
chat/Slack/Telegram bot, or any assistant that sits idle between messages — even a long-lived process
counts, because staying alive is not the same as polling), watching-by-polling is impossible: nothing
gives you a turn between inputs.** The background beacon still records status durably, but it can only
WRITE a pulse; it cannot wake you. So arm a push: export `OSRC_HEARTBEAT_WAKE="<your notifier command>"` before you
launch, and the beacon runs it on every state change (blocked/dead) and on the periodic digest
(still-cooking / landed), passing the compact summary as `$1` and the full event JSON on stdin. Point it
at whatever re-invokes you or messages the user through your OWN sanctioned send path — the plugin never
sends anything itself. A headless launch with no wake armed prints an **ASYNC SUPERVISION** warning
naming the fix; don't ignore it, or your delegate will run silent until the user pings. (Suppress just
the periodic-digest push with `OSRC_HEARTBEAT_WAKE_DIGEST=0`, keeping only the attention-needed wakes.)
## Operating rules
- **Cloud consent, once ever.** The first cloud delegation needs consent (repo content leaves the machine; a secret-scan hard-block runs on EVERY delegation regardless). Tell the user in one line, then `consent grant` (or `--cloud-ack`) — remembered in `~/.outsourcerer/cloud-consent`. Never retry a gate refusal blindly; the error names the fix.
- **Cost honesty.** Split cash from plan limits. A subscription/keyless run is $0 cash but spends finite plan limits — say both. Only the local lane is truly free. Details: `references/tab.md`.
- **"state home NOT WRITABLE"** = the sandbox denies `~/.outsourcerer`. The error spells out the two fixes (allowWrite, or `OSRC_HOME=`). Don't rerun unchanged.
- **Missing CLI?** Say what's missing in one line, suggest the fastest ready lane, keep going.
- **Windows: no WSL.** Runs under Git Bash; `outsourcerer.cmd`/`.ps1` launch it. Only tmux `session` is unavailable (bg/fanout cover it).
## Subcommands
Core: `brief` · `mode` · `consent` · `run`/`explore`/`research`/`edit`/`yolo` · `bg`/`fanout` (+ `status`/`watch`/`result`/`cancel`) · `fleet` (`ls`/`show`/`name`/`supervise` — one view of your Claude Code sessions + delegated jobs; see below) · `advise` · `doctor` · `models`. More: `suggest`/`deals` (cheap now) · `estimate` (cost quote) · `tab` (the ledger) · `second-opinion` · `image` · `continue` · `tap` (capture live limits without token-optimizer) · `sanitize` (scrub fallback-trigger vocabulary from state/todo/memory/commit prose — `--write` applies; `references/vocabulary-hygiene.md`) · `parity`/`parity-codex`/`parity-droid`/`parity-cursor`/`parity-hermes` (two-way bridges) · `posture` (show/reset remembered lane org-policy restrictions) · `classify` (post-hoc verdict for a terminated job: `REUSE-OUTPUT` / `RETRY-DIFFERENT-LANE` / `REAL-FAIL` — deterministic, zero-LLM; `references/jobs-and-safety.md`) · `cleanup`/`gc`. Failure states map to one-line user messages (`launching`→`running`→ `done`/`done?`/`blocked`/`permission-blocked`/`interrupted`/`timeout`/`wedged`/`failed`): `references/jobs-and-safety.md`. `permission-blocked` (a headless delegate hit a wall it can't confirm — e.g. devin print-mode) is NOT `blocked`: re-run with `yolo` or restructure the prompt, don't just read the result. `launching` that never becomes `running` → `failed` (stillborn: the environment killed the detached worker — run foreground).
### `fleet` — one view of every session you're running
`fleet ls` prints a single list of every AI coding session Outsourcerer can see on this machine: your live **Claude Code** sessions plus **every job you delegated through Outsourcerer** (any lane — Codex, Devin/GLM, Fable, droid, cursor, warp, cline). Each row carries an honest state derived from the live process and the session's own transcript tail — `Working` / `Waiting on you` / `Maybe stuck` / `Idle` / `Done` / `Stopped mid-task` / `Failed` (never "dead") — so you can walk up to the one session that actually needs you instead of checking all of them.
`fleet name` reads each session's transcript and gives it a human name via the free GLM lane (cached per session at `fleet/names.jsonl`), so `alexgreenshpun-71` reads as `Update feedback skill for Gambit`. `fleet show <id>` dives into one session. `fleet supervise` (auto-armed with `OSRC_FLEET_SUPERVISION=1`) runs a background heartbeat that catches a stalled or never-initialized delegate and bounds it instead of leaving it silent.
Scope today: Claude Code sessions + Outsourcerer's own delegated jobs. It does **not** enumerate sessions those other tools started independently of Outsourcerer (a Cursor agent you launched inside Cursor, say) — that cross-tool enumeration is planned, not shipped. Don't describe `fleet` as a universal cross-tool dashboard.
### External-session claims
`session claim <external-id> <tmux-pane>` prints a secret claim token. For a later, separate CLI invocation, pass it as `OSRC_SESSION_CLAIM_TOKEN` to `session reply` or `session release`. Set `OSRC_CONTROLLER_ID` to a durable controller identity when commands are driven outside tmux; inside tmux, the controlling tmux session is used automatically. The controller ID and token must both match the claim record. Without either durable source, the token is the capability, protected by the 0700 state directory and 0600 claim record boundary. Do not place the token in logs or shared shell history.
## References
- `mechanism.md` — setup, provider flags, verb/tier semantics, `session` mode
- `lanes-and-models.md` — full alias/lane table, native lanes, image backends
- `jobs-and-safety.md` — background jobs, watchdog, exit codes, failure messages
- `parallel-and-fanout.md` — `fanout`, gauntlet recipe, self-heal
- `effort-and-tiers.md` — `--effort` per lane, capability-vs-price tiers
- `tab.md` — cash vs plan-limit accounting, estimates
- `model-advisory.md` — `advise`: classification, scoring, thresholds, fallback
- `second-opinion-and-parity.md` — `second-opinion`, `parity`, install paths, env vars
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!