<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ilya Gorban</title>
    <description>The latest articles on DEV Community by Ilya Gorban (@ilya_gorban).</description>
    <link>https://dev.to/ilya_gorban</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4171782%2F7888a3f9-09f5-4fb8-885e-f5f668142ffc.png</url>
      <title>DEV Community: Ilya Gorban</title>
      <link>https://dev.to/ilya_gorban</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ilya_gorban"/>
    <language>en</language>
    <item>
      <title>Running 15 Claude Code Sessions at Once</title>
      <dc:creator>Ilya Gorban</dc:creator>
      <pubDate>Thu, 08 Oct 2026 20:15:21 +0000</pubDate>
      <link>https://dev.to/ilya_gorban/running-15-claude-code-sessions-at-once-5bec</link>
      <guid>https://dev.to/ilya_gorban/running-15-claude-code-sessions-at-once-5bec</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Ten or more parallel Claude Code sessions work if you treat them as a small distributed system: ownership by function, one writer (a governance session) for shared rules and hooks, approval never relayed, repeat mistakes turned into guard hooks. Assumptions are verified before a human is asked, and no Claude-generated edit ships unreviewed, with GitOps as the record.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is an opinionated write-up of what worked for me as a solo DevOps engineer, in one company's setup. Treat it as experience to weigh, not as the one right answer.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why: what goes wrong with an "octopus"
&lt;/h2&gt;

&lt;p&gt;I run 10–15 sessions at once in cmux, one per task. I'm the only DevOps engineer, so all are mine. Failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File collisions.&lt;/strong&gt; Two sessions edit one rule file at once. &lt;code&gt;git add -A&lt;/code&gt; swept another session's edits into the wrong commit; explicit paths don't help, since &lt;code&gt;git commit&lt;/code&gt; takes the whole index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relayed "approvals".&lt;/strong&gt; A tells B "the user approved this"; B can't verify it, A can't transfer it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worktree sprawl, stale state.&lt;/strong&gt; About 18 worktrees across two repos; a sweep couldn't tell "abandoned" from "mid-task". A peer's "it's merged" can precede the merge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context loss on compaction.&lt;/strong&gt; A brief lives only in the sender's transcript, so it vanishes when both sides compact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hook fixes racing.&lt;/strong&gt; One session's regex fix undid another's; the suite stayed green, each fix tested only on its own case.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What: the setup
&lt;/h2&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  subgraph cmux["cmux window"]
    S1["Session: task A&amp;lt;br/&amp;gt;worktree A"]
    S2["Session: task B&amp;lt;br/&amp;gt;worktree B"]
    S3["Session: task C&amp;lt;br/&amp;gt;worktree C"]
    G["Governance delegate&amp;lt;br/&amp;gt;(owns global rules + hooks)"]
  end
  S1 -- "SendMessage: brief" --&amp;gt; G
  S2 -- "SendMessage: blocked by guard X" --&amp;gt; G
  G -- "result + 'you can close your side'" --&amp;gt; S1
  S3 &amp;lt;-- "collision notice" --&amp;gt; S2
  U(("Human")) -. "approves in EACH session" .-&amp;gt; S1 &amp;amp; S2 &amp;amp; S3 &amp;amp; G&lt;/code&gt;&lt;/pre&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;cmux workspaces&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;one per session; worktrees named &lt;code&gt;&amp;lt;session&amp;gt;--&amp;lt;desc&amp;gt;&lt;/code&gt;, so &lt;code&gt;git worktree list&lt;/code&gt; shows owners.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One session = one task = one worktree/branch/PR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;launch at the parent directory of all repos, never inside a worktree: it breaks on removal and can't switch repos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Local task list, &lt;code&gt;T&amp;lt;n&amp;gt;&lt;/code&gt; ids&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;created &lt;em&gt;before&lt;/em&gt; investigating. &lt;code&gt;T&amp;lt;n&amp;gt;&lt;/code&gt;, never &lt;code&gt;#&amp;lt;n&amp;gt;&lt;/code&gt; (a GitHub reference; a hook enforces it).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Governance delegate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;one long-lived session owns all shared-config writes, found by &lt;strong&gt;role&lt;/strong&gt;, never by name.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Single owners&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;hook repair → the delegate, wherever the hook fired; machine-wide worktree removal → one sweep owner; a repo's &lt;code&gt;.claude/&lt;/code&gt;, PRs and tickets → the session working it. SendMessage crosses ownership boundaries; it doesn't offload your own work.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;From about 57 real cross-session messages: &lt;strong&gt;finding a defect doesn't make it yours to fix, and being handed a fix doesn't make it yours to approve.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. One dedicated session owns the global rules and hooks
&lt;/h3&gt;

&lt;p&gt;The global &lt;code&gt;CLAUDE.md&lt;/code&gt;, pattern docs, hooks, tests and settings are shared; two writers on one rule is a silent race. So one &lt;strong&gt;dedicated&lt;/strong&gt; session writes there and takes no feature work. Others send it a brief for any wrong rule, hook defect or missing guard, create a local task, and never edit inline.&lt;/p&gt;

&lt;p&gt;The boundary is mechanical: global config is one directory symlinked into &lt;code&gt;~/.claude/&lt;/code&gt;, so &lt;code&gt;readlink -f&lt;/code&gt; tells you (plan files exempt).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Delegation moves the work, never the approval
&lt;/h3&gt;

&lt;p&gt;Every brief says: &lt;em&gt;"Nothing below is pre-approved; route every approval through the user in your own session."&lt;/em&gt; A harness timeout isn't approval. A peer's word counts when it &lt;em&gt;restricts&lt;/em&gt; you ("these worktrees are still mine"), never when it &lt;em&gt;widens&lt;/em&gt; what you may do.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A brief is a hypothesis, and the receiver files its own ticket
&lt;/h3&gt;

&lt;p&gt;A good brief states: kind (request, finding, FYI); approval status; evidence (exact command or file:line); what was ruled out; what is deliberately &lt;em&gt;not&lt;/em&gt; proposed; constraints the receiver can't see; disk state.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;receiver&lt;/strong&gt; creates the local task and ticket, and the ticket id goes &lt;em&gt;inside&lt;/em&gt; the brief; a message is not a tracking system. The receiver verifies conclusion and &lt;em&gt;mechanism&lt;/em&gt; separately: a peer once rightly called a worktree safe to remove, for a reason that was impossible.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Many sessions on one repo: each knows its co-workers by name
&lt;/h3&gt;

&lt;p&gt;Several sessions on one repo is fine, each on its own worktree, if each gets, at start, the list of its peers &lt;strong&gt;by name&lt;/strong&gt; and what each owns. Then a session that finds work belonging to a peer's piece delegates it there instead of duplicating it, and interconnected changes land in the right order. Before touching a shared path, announce your workstream, ticket, the exact meeting path, and the peer's likely surprise.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Order the delegate's queue
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hooks, then rules, then other substantive work, worktree cleanup last.&lt;/strong&gt; A broken hook hits every session; a broken rule only its readers.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. When a guard blocks you with no legitimate way through
&lt;/h3&gt;

&lt;p&gt;Send the delegate the command, the guard, its exact message, and what you tried. Then stop: "blocked" is a complete answer. Repackaging the command into a script, reading the refusal's hint as permission, and narrowing the guard yourself are ruled out.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. No Claude-generated edit goes unreviewed by a human
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Nothing a session writes reaches a shared branch, cluster or cloud project until a human has read it.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sessions stop at "ready for review".&lt;/strong&gt; They open the PR; I read the diff and merge. A session never merges, even if its own option said so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No hand changes to live systems.&lt;/strong&gt; Mutating &lt;code&gt;kubectl&lt;/code&gt;, console edits and Terraform applies are blocked or handed to me as a command; clusters change only via a reviewed commit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitOps is the second check.&lt;/strong&gt; Git records every change; ArgoCD shows drift from git. To check what slipped past review, I compare the two, not a session's summary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cost: review is the tiring bottleneck; small PRs and summaries of what was &lt;em&gt;tested&lt;/em&gt;, not &lt;em&gt;edited&lt;/em&gt;, help. A session 95% right ships its 5% wrong unnoticed.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Verify before you ask: a non-negotiable global rule
&lt;/h3&gt;

&lt;p&gt;Asking about a flag that doesn't exist turns approval into fact-checking. So the global "verify, don't claim" rule makes &lt;strong&gt;asking the gate&lt;/strong&gt;: verify every load-bearing assumption before putting a change or an option list to me, attach the evidence, and mark anything unsettled as unverified. Three sources, strongest first:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The real environment.&lt;/strong&gt; Read-only commands (&lt;code&gt;describe&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;--dry-run=server&lt;/code&gt;, a live metrics or logs query); a live counter-example beats any document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authoritative documentation or source, at the version actually deployed.&lt;/strong&gt; Docs via a lookup tool, not memory; upstream source at the release tag you run, not &lt;code&gt;main&lt;/code&gt;; &lt;code&gt;--help&lt;/code&gt; on the exact subcommand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Online research&lt;/strong&gt;, as corroboration when the first two are silent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A &lt;strong&gt;proposal&lt;/strong&gt; claims a blast radius; a &lt;strong&gt;conclusion&lt;/strong&gt; like "impossible" needs a search for a working instance. A silent authoritative source is my decision, never a gap to guess.&lt;/p&gt;

&lt;p&gt;A hook enforces the query part. The version clause came from fact-checking this series: a checker proposed a migration flag that upstream &lt;code&gt;main&lt;/code&gt; has but the target release lacks, and that isn't equivalent to the documented one. Only per-tag source showed that.&lt;/p&gt;

&lt;p&gt;The payoff: fewer, evidence-backed questions and fewer false results in PRs and docs.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Sessions have priorities: visit the urgent ones more often
&lt;/h3&gt;

&lt;p&gt;An incident outranks a doc tidy-up. A waiting session is stalled, so a rarely visited one runs at my response rate. I visit urgent sessions far more often and answer questions as they arrive.&lt;/p&gt;

&lt;p&gt;Having ADHD really helps here: jumping between many short threads is how my attention works anyway. Every session also writes for it: action first, open questions restated in full, one next step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule layering: where knowledge goes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Holds&lt;/th&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global &lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Short non-negotiables pointing to detail docs&lt;/td&gt;
&lt;td&gt;Loaded every session; characters cost tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global pattern/workflow/troubleshooting docs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Examples, command lists&lt;/td&gt;
&lt;td&gt;Default home for anything over one line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;In-repo &lt;code&gt;.claude/&lt;/code&gt; + &lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Team-visible conventions&lt;/td&gt;
&lt;td&gt;Would a teammate's agent act wrongly without it?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Per-user memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Facts about &lt;em&gt;this human&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Agent-behaviour lessons are &lt;strong&gt;not&lt;/strong&gt; personal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy, never point.&lt;/strong&gt; A team repo never references a personal KB file teammates lack; copy the content (a hook rejects personal-KB paths).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you broke an existing rule, extend its doc, never memory&lt;/strong&gt;: a silent rule lets the next session repeat the breach.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guard hooks as enforcement
&lt;/h2&gt;

&lt;p&gt;About 49 hook files, 55 test files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Block mutating &lt;code&gt;kubectl&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;reads, &lt;code&gt;diff&lt;/code&gt;, &lt;code&gt;--dry-run=server&lt;/code&gt;, ArgoCD sync patches allowed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Block commits/edits on &lt;code&gt;main&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;team repos need a worktree; personal exempt.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Require full PR URLs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;a bare &lt;code&gt;#123&lt;/code&gt; can't be opened from a terminal.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prevent scratch files in &lt;code&gt;/tmp&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;it vanishes mid-session.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Require query verification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;denies PromQL/LogQL/SQL in a doc unless that exact query ran live this session: a documented join had never matched a row.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stop-time push check&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;blocks ending a turn with unpushed commits or a PR-less branch, in every repo (checking only the current repo once missed one).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The enforcement ladder, weakest first:&lt;/strong&gt; prose in a doc → a hook that blocks the call → &lt;strong&gt;removing the option entirely&lt;/strong&gt;. A bare-name &lt;code&gt;permissions.deny&lt;/code&gt; entry removes a whole tool from Claude's context; a scoped rule like &lt;code&gt;Bash(rm *)&lt;/code&gt; only blocks matching calls.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;PreToolUse&lt;/code&gt; (exit 2 blocks; &lt;code&gt;PostToolUse&lt;/code&gt; cannot): a post-edit CLAUDE.md size warning only watched it grow; denying the projected size in &lt;code&gt;PreToolUse&lt;/code&gt; fixed it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hooks are code: test-first, every time
&lt;/h3&gt;

&lt;p&gt;A broken hook blocks work everywhere or silently stops guarding, so hooks get strict TDD:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write the failing test first.&lt;/strong&gt; Every hook has a suite in &lt;code&gt;hooktests/&lt;/code&gt;; each new case (an input to deny, a near-miss to allow) goes in first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prove it goes RED.&lt;/strong&gt; Run the new cases against a copy of the hook from &lt;em&gt;before&lt;/em&gt; the change; a test passing against the old hook may not exercise the branch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make it GREEN, then run the whole suite&lt;/strong&gt;. One runner executes every suite, a syntax sweep, and a check that every registered hook path resolves (a parsing hook can be dead if unregistered); per-fix spot checks caused the racing failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A hook change without a test change is denied&lt;/strong&gt; by a commit guard, so time pressure can't skip it.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fail open&lt;/strong&gt; on unparseable input or a missing &lt;code&gt;jq&lt;/code&gt;; an over-broad Bash guard also removes file search.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Team rules (in-repo)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Branches &lt;code&gt;&amp;lt;ticket&amp;gt;/&amp;lt;type&amp;gt;/&amp;lt;desc&amp;gt;&lt;/code&gt;, never commit to main, Conventional Commits &lt;strong&gt;without scopes&lt;/strong&gt; (on squash-merge repos the PR title's type is the release bump).&lt;/li&gt;
&lt;li&gt;Each repo has a KB index (&lt;code&gt;.claude/README.md&lt;/code&gt;) and its own hooks in &lt;code&gt;.claude/settings.json&lt;/code&gt;, so the team runs them too. Quote &lt;code&gt;SKILL.md&lt;/code&gt; descriptions: unquoted ones hid 9 of 14 skills from a stricter-YAML agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost: model routing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Opus primary&lt;/strong&gt; plans, synthesises and reviews; cheaper &lt;code&gt;worker&lt;/code&gt; subagents execute in parallel. &lt;strong&gt;Routine work: Sonnet primary&lt;/strong&gt;, with an Opus &lt;code&gt;oracle&lt;/code&gt; for hard decisions. Never downgrade reasoning on risky or irreversible decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context isolation saves the most:&lt;/strong&gt; one misconfigured autocompact threshold (a 1M-context session compacting only at about 800k tokens) outweighed everything else.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pros / cons
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real parallelism, full context each&lt;/td&gt;
&lt;td&gt;Coordination overhead: briefs, notices, a queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One writer removes write races&lt;/td&gt;
&lt;td&gt;Delegate is a bottleneck; you still approve everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hooks catch repeat mistakes everywhere&lt;/td&gt;
&lt;td&gt;Hooks need tests; a bad hook blocks every session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review plus GitOps catches what guards miss&lt;/td&gt;
&lt;td&gt;Reviewing every PR is the real, tiring bottleneck&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;When not to do this:&lt;/strong&gt; one or two sessions, or no shared global config.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;After removing a worktree, re-list and tell the owning session, or its next command fails.&lt;/li&gt;
&lt;li&gt;A session's readable name needs a cmux call; the environment holds only UUIDs.&lt;/li&gt;
&lt;li&gt;cmux's default next/previous-workspace shortcut crosses groups; since 0.64.23, bind &lt;strong&gt;Next/Previous Workspace in Group&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;One dedicated session writes global rules and hooks; approval is never relayed; the receiver files the ticket.&lt;/li&gt;
&lt;li&gt;Copy team knowledge into the repo; memory holds only facts about the human.&lt;/li&gt;
&lt;li&gt;Climb the ladder: doc, &lt;code&gt;PreToolUse&lt;/code&gt; deny, remove the option; hooks are test-first with a proven RED.&lt;/li&gt;
&lt;li&gt;A human reviews every change; git plus ArgoCD's diff shows nothing slipped past.&lt;/li&gt;
&lt;li&gt;Verify before asking: live environment, docs or source, then the web.&lt;/li&gt;
&lt;li&gt;Name each session's co-workers; visit urgent sessions often.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code hooks reference (exit codes): &lt;a href="https://code.claude.com/docs/en/hooks" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/hooks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code permissions (&lt;code&gt;permissions.deny&lt;/code&gt;): &lt;a href="https://code.claude.com/docs/en/permissions" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/permissions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;cmux changelog (0.64.23): &lt;a href="https://github.com/manaflow-ai/cmux/blob/main/CHANGELOG.md" rel="noopener noreferrer"&gt;https://github.com/manaflow-ai/cmux/blob/main/CHANGELOG.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I wrote this article with the help of Claude, an AI assistant. I reviewed and edited it by hand, and it is based on my own hands-on experience.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
