{"id":51468886,"url":"https://github.com/tomascupr/sous-chef","last_synced_at":"2026-07-09T17:00:47.427Z","repository":{"id":368955802,"uuid":"1287663860","full_name":"tomascupr/sous-chef","owner":"tomascupr","description":"Claude orchestrates and reviews; Codex CLI implements. A Claude Code plugin for the two-model kitchen: /serve tasks end to end, /simmer goals until green. Your head chef doesn't chop onions.","archived":false,"fork":false,"pushed_at":"2026-07-07T23:09:00.000Z","size":1441,"stargazers_count":56,"open_issues_count":3,"forks_count":8,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-07-08T16:21:22.545Z","etag":null,"topics":["ai-agents","claude-code","codex","glm","loop-engineering","multi-agent"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tomascupr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-07-02T22:38:10.000Z","updated_at":"2026-07-08T08:11:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tomascupr/sous-chef","commit_stats":null,"previous_names":["tomascupr/sous-chef"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/tomascupr/sous-chef","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsous-chef","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsous-chef/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsous-chef/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsous-chef/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tomascupr","download_url":"https://codeload.github.com/tomascupr/sous-chef/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomascupr%2Fsous-chef/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35306717,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","claude-code","codex","glm","loop-engineering","multi-agent"],"created_at":"2026-07-06T14:31:42.181Z","updated_at":"2026-07-09T17:00:47.386Z","avatar_url":"https://github.com/tomascupr.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🧑‍🍳 sous-chef\n\n![MIT](https://img.shields.io/badge/license-MIT-blue) ![Claude Code plugin](https://img.shields.io/badge/Claude_Code-plugin-d97757) ![Codex CLI ≥ 0.134](https://img.shields.io/badge/Codex_CLI-%E2%89%A50.134-black)\n\n**Fable 5 orchestrates and reviews; GPT-5.5 or GLM 5.2 implements. Your head chef doesn't chop onions.**\n\nA Claude Code plugin that splits coding between two frontier models the way a kitchen\nsplits work. Fable plans, writes the ticket, reviews every diff line by line, and\nre-runs the checks itself. Codex or GLM do the implementation, with no say over what\nships. The split is economic:\nFable is the most expensive model on the line, so its tokens go to judgment and\nCodex or GLM tokens go to bulk. In the measured setup this pattern is built on,\n[Codex did ~20x the implementation work](https://madewithlove.com/blog/claude-up-front-codex-in-the-back/)\nper orchestration round trip, and two mid-tier subscriptions often beat one top-tier one.\n\n## What it looks like\n\n![One /sous-chef:serve command in: Fable 5 plans, delegates to Codex or GLM, reviews the diff, validates findings, re-runs the checks itself, and plates a verified result. The worker never grades its own homework.](docs/sous-chef-flow.png)\n\nCodex saying \"tests pass\" is a sentence; `pnpm test` output is a fact - Claude\nre-runs everything itself.\n\n## Two commands\n\n**`/sous-chef:serve`** is for task-shaped work, done end to end: implement,\ncross-review, fix the findings, verify. One announcement up front, one report at the\nend, a hard budget of five Codex runs in between. This is the daily driver.\n\n**`/sous-chef:simmer`** is for goal-shaped work, looped until a command passes:\n\"make the suite green\", \"get the benchmark under 200ms\". A fresh Codex run each lap,\nClaude judging every lap with real command output, on a dedicated branch, with lap\ncaps and no-progress detection. The worker never grades its own homework.\n\nRule of thumb: **serve a task, simmer a goal.** If a serve runs out of budget and\nwhat remains is goal-shaped, it offers to continue as a simmer.\n\nÀ la carte, when you want to drive the stations yourself:\n\n| Command | What it does |\n|---|---|\n| `/sous-chef:fire` | Write the ticket, delegate one implementation run, review the diff against a pre-fire baseline, verify. |\n| `/sous-chef:taste` | Cross-model review, read-only. Claude validates every finding against the code and filters false positives before you see them. |\n| `/sous-chef:refire` | Turn the confirmed findings from a taste into one scoped fix run, then re-verify each finding at its cited location. |\n| `/sous-chef:mise` | Setup: Codex CLI + auth checks, delegation profile, `AGENTS.md` scaffold, routing policy (manual or autonomous). Once per machine, once per repo. |\n\n## Install\n\nRequirements: [Codex CLI](https://developers.openai.com/codex/cli) ≥ 0.134,\nauthenticated (`codex login` - a ChatGPT subscription is enough; no API key needed).\n\n```text\n/plugin marketplace add tomascupr/sous-chef\n/plugin install sous-chef@sous-chef\n```\n\n(`sous-chef@sous-chef` is `plugin@marketplace` - same name for both here.) Then,\ninside a repo:\n\n```text\n/sous-chef:mise\n```\n\n`/mise` is idempotent - re-run it anytime as a health check, and after a plugin\nupdate to refresh the installed profile.\n\n## How the split works\n\n```text\nyou ── \"/sous-chef:serve migrate auth\" ──▶ CLAUDE (head chef)\n                                              │ ticket: files ±, done-when,\n                                              │ verification commands\n                                              ▼\n            ┌────────────────────────────────────────────┐\n            │ codex exec --profile sous-chef             │  background;\n            │ workspace-write sandbox · approvals off    │  no session memory;\n            │ reads AGENTS.md · implements the ticket    │  hard boundary\n            └───────────────────┬────────────────────────┘\n                                ▼ diff\n            CLAUDE reviews + re-runs verification itself\n                                ▼\n            CODEX cross-reviews read-only ──▶ CLAUDE validates findings\n                                ▼\n            confirmed findings refired once ──▶ verified ──▶ served\n```\n\n**Soft routing, not hard blocks.** A routing policy in `CLAUDE.md` plus skills that\nmake delegation the path of least resistance. Claude still edits directly for small\nsurgical fixes - hard-blocking Edit/Write provably makes agents route around the\nblock instead. Manual routing is the default - you trigger the skills, and Claude\noffers them when they fit. Autonomous routing lets Claude invoke serve, fire, taste,\nand refire itself by task shape, announcing in one line before every delegation;\nsimmer stays explicit-ask; choose the mode in `/mise`, and switch by re-running it.\nThe boundary that IS hard: delegated Codex runs execute in a\n`workspace-write` sandbox with approvals off, and Codex reviews run `read-only`. (The\noptional GLM Claude-worker route has no OS sandbox underneath; its docs say to treat\nit accordingly - trusted repos or a branch/worktree only.)\n\n**One source of truth for standards.** Repo conventions live in `AGENTS.md`, which\nCodex re-reads on every run - including non-interactive `codex exec`. Claude reads\nthe same file via an `@AGENTS.md` import in `CLAUDE.md`. Per-task instructions travel\non the ticket; standing orders stay in the file.\n\n**Background always, polling never.** Delegated runs execute via `run_in_background`\nso the Bash timeout ceiling can't kill them mid-job, and completion re-invokes Claude.\n\n**Claims are not evidence.** After every delegated run, Claude reviews the diff line\nby line and re-runs the verification commands itself.\n\n## The receipts\n\nEvery load-bearing decision traces to a documented incident, an official doc, or a\nmeasured comparison - not vibes. A sample:\n\n- **Why background-always:** a single polling loop against a running Codex job burned\n  27% of a weekly Claude quota in ~12 hours producing nothing\n  ([anthropics/claude-code#54143](https://github.com/anthropics/claude-code/issues/54143)).\n- **Why soft routing, not blocking Edit/Write:** an agent, blocked three times by a\n  hook, routed around it with a Python file-write via Bash\n  ([anthropics/claude-code#29709](https://github.com/anthropics/claude-code/issues/29709)).\n  A hard block that can't hold is worse than an honest routing policy.\n- **Why findings get validated:** in a 20-review field test, ~3 of 20 Codex reviews\n  failed silently, and adversarial mode flagged missing circuit breakers on a\n  500-line cron script.\n\nFull sources for these and every other decision: [docs/design.md](docs/design.md).\n\n## FAQ\n\n**How is this different from OpenAI's official codex plugin?** Three deliberate\ndivergences, each with receipts in [docs/design.md](docs/design.md): (1) no stop-time\nreview gate - OpenAI's own README warns it \"can create a long-running Claude/Codex\nloop and may drain usage limits quickly\"; here, review runs inside a pass you\nexplicitly ordered, under a hard run budget, not on every stop. (2) findings get\nvalidated against the actual code before you see them - raw cross-model reviews\nover-flag, and validation filters the false positives. (3) `/simmer` fills a gap\nneither the official plugin nor ralph-loop covers: a delegated implementer inside the\nloop with an independent judge outside it.\n\n**What does this cost me?** Two subscriptions: any Claude plan for Claude Code, and a\nChatGPT plan for Codex - `codex login`, no API key needed. Subscription auth is the\nfirst-class path for headless runs: `codex exec` reuses the saved login, tokens\nauto-refresh even mid-run, and fire unsets the two env vars (`CODEX_API_KEY`,\n`CODEX_ACCESS_TOKEN`) that could silently switch a run to per-token billing.\nDelegation overhead is ~5-7k Claude tokens per round trip, which is why small tasks\nstay with Claude.\n\n**How do I see what I'm saving?** Every delegated run ends with a receipt - the\nworker's token count from the job log - and appends one JSON line to\n`~/.sous-chef/ledger.jsonl`. `/mise` prints the running tab (jobs to date, tokens\nkept off Claude), or sum it yourself:\n`jq -s '{jobs: length, tokens: (map(.tokens) | add)}' ~/.sous-chef/ledger.jsonl`.\n\n**What does delegation actually save?** Measured 2026-07-04: three seeded tasks\n(mechanical refactor, mid-size feature, parser-class feature), each run both ways\nfrom a clean clone against identical checkable done-criteria - direct in a fresh\nClaude Code session (Fable 5) vs a sous-chef-profile `codex exec` (GPT-5.5, xhigh).\nAll six runs green. Per task, Claude-side spend fell from 0.78-4.3M tokens\n(~$3.8-12.7 at cache-aware API list prices) to the ~5-7k-token orchestration\noverhead, with the worker burning 140-361k GPT-5.5 tokens (~$0.27-0.53) - roughly\n10-20x cheaper per task in effective API-price terms. Full method, per-task table,\nand caveats: [issue #2](../../issues/2).\n\n**What do I see while it cooks?** An announcement first: what was delegated, the\nexpected duration (typically 5-20+ minutes per Codex run at high reasoning effort),\nand the log path. You keep working; Claude is re-invoked when the job exits. Cancel\nanytime - Claude kills the job and shows you any partial changes to keep or revert.\n\n**Does Claude stop writing code?** No. Small fixes, prototypes, and anything\ndesign-ambiguous stay with Claude - the routing rules themselves say so. Delegation\nis announced, never silent - in both routing modes.\n\n**Which models?** Whatever your `~/.codex/config.toml` says - the shipped profile\npins only sandbox and approval policy. Recommended: `gpt-5.5` with\n`model_reasoning_effort = \"xhigh\"`. GLM-5.2 ships as an opt-in second implementer\n(\"fire with GLM\"): it slightly out-benchmarks GPT-5.5 on SWE-bench Pro at a fraction\nof the per-token price, though ~3.3x more token-hungry. Two routes as templates\n(GLM Coding Plan via a headless Claude worker, or OpenRouter through Codex); `/mise`\nsets up whichever key you have. On the Claude side it's model-agnostic; built for and\ndogfooded with Fable 5.\n\n**Why not MCP?** Plain `codex exec` over Bash gives you the sandbox flag, the exit\ncode, stdin for prompts, and background execution with no extra moving parts. That is\nwhy sous-chef uses a thin wrapper instead of a persistent MCP server.\n\n**Windows?** The snippets are POSIX; under Claude Code's Git Bash they should work,\nbut this is dogfooded on macOS.\n\n## What's in the box\n\n```text\nskills/serve/         the autonomous pipeline: fire, taste, refire, verify, report\nskills/simmer/        the loop: Codex works, Claude judges, until the goal passes\nskills/fire/          delegation skill + ticket template + GLM routes\nskills/taste/         cross-review skill + review prompt template\nskills/refire/        fix skill: confirmed findings become a scoped fix run\nskills/mise/          setup skill\ncodex/                Codex profiles → ~/.codex/ (sous-chef default, sous-chef-glm)\ntemplates/            AGENTS.md scaffold, CLAUDE.md routing blocks (manual + autonomous), GLM worker config\ndocs/design.md        the receipts: sources for every design decision\n```\n\n## Uninstall\n\n`/plugin uninstall sous-chef` removes the skills (and\n`/plugin marketplace remove sous-chef` the registration). If you ran `/mise`, it may\nalso have created (remove by hand if you're done with them):\n\n- `~/.codex/sous-chef.config.toml` and `~/.codex/sous-chef-glm.config.toml`\n- `~/.sous-chef/glm-claude/` (isolated GLM worker config)\n- a \"Division of labor (sous-chef, ...)\" routing block (manual or autonomous variant)\n  appended to `~/.claude/CLAUDE.md`\n- an `AGENTS.md` scaffold and/or `@AGENTS.md` import line in repos you set up (these\n  are yours now - they're useful regardless of the plugin)\n\n## Contributing\n\nField reports welcome - especially Windows, and especially receipts that contradict\n[docs/design.md](docs/design.md); it's meant to be corrected.\n\n## License\n\nMIT © Tomas Cupr\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomascupr%2Fsous-chef","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomascupr%2Fsous-chef","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomascupr%2Fsous-chef/lists"}