Operator's Shell: an opinionated, battle-tested Claude Code harness.
OPS is the configuration layer one operator actually runs Claude Code inside, extracted as a public template. It is not a starter kit or a demo. It is a working shell with strong opinions about how an AI coding session should behave, hardened over months of real use, with the operator's identity stripped out so you can adopt it as your own.
What it gives you, out of the box:
- One always-loaded core.
CONTEXT/core.mdis the rule set every session and every lane carries, on every launch path: terminal, T3 Code, IDE, andclaude -p. Everything else loads on demand. - Foreman-by-default orchestration. Every session boots as a foreman, not a solo engineer. Plan hard up front, then delegate parallelizable work to worktree-isolated sub-agents and review their diffs. The posture, the brief template, the quality gates, and the estimation math all ship with it.
- Persistent, file-based memory. Knowledge lives in tracked files on disk, not in a context window that dies on compaction. Auto-memory is git-synced across every machine you run OPS on.
- Session-survival discipline. Compaction is a pause, not death. Pre-compact
synthesis, cross-session handoff batons, and post-compact re-orientation hooks
keep durable state on disk before a
/compactruns, so a fresh context can self-recover from files alone. - A skills system. Local Claude Code Skills (and their Claude.ai GUI Project
twins) for the recurring work that binds to OPS's own hooks and layout: memory
pruning, pre-compact synthesis, session lifecycle, file transfer, and more. The
portable technique skills (delegation, skill authoring) aren't vendored here:
OPS mounts them from a shared skill source rather than carrying a copy that
drifts. The default source is
Exploitacious/agent-skills; an org or private source mounts alongside it. SeeSKILLS/README.md.
OPS ships the author's working configuration, not a set of neutral defaults you have to assemble yourself. That means:
- Fixed model tiers instead of per-task model shopping: Opus 5.5 is the
foreman, Sonnet 5.5 every sub-agent's default, Opus 5.5 again for
high-criticality lanes, Haiku 5.5 for cheap bounded reads, Fable 5.1 rarely.
Effort is
xhigheverywhere.CONTEXT/model-roles.mdis the policy. - A full-autonomy posture: you plan with it up front, then it runs the list end to end without re-prompting.
There are no feature flags and no hedging. The philosophy is explained once,
here and in CONTEXT/, and after you bootstrap you adjust it to taste; it's
your copy. If a default doesn't fit you, change it; nothing stops you. But the
defaults are chosen on purpose, and they are what makes the harness feel like
one system instead of a pile of settings.
The recommended install (linuxploitacious, Stage 1) links its settings.json
into ~/.claude/ for every profile. Read this before your first session,
because these defaults decide what Claude Code may do without asking you:
permissions.defaultMode: "bypassPermissions". Every session starts in bypass mode: Claude Code runs every tool call, including shell commands, file edits and deletes, and network requests, without a permission prompt. Onlydenyrules and hooks still stop a call. OPS's own brakes are two PreToolUse hooks: a git guard (hook bypass, force-push, history rewrites, remote branch deletes, and recursive deletes of a few protected roots) and a secrets guard (literal credentials written into memory and lessons files). They are narrow guards, not a sandbox: anything else runs.skipDangerousModePermissionPrompt: true. Claude Code normally shows a one-time confirmation before a session enters bypass mode; this skips it, so nothing warns you at launch.remoteControlAtStartup: true. Every interactive session connects to Remote Control at start, so you can watch and drive it from the Claude apps signed in to your own claude.ai account. It grants no one else access, but a session is reachable from your other devices without you asking for it.- Auto-compaction on (
autoCompactEnabled: true,DISABLE_AUTO_COMPACT"0"; idle compaction off). It is a backstop near the end of the context window; the harness still compacts by hand at natural breaks (CONTEXT/core.md§ "Rhythm and context"). Haiku 5.5 gets a 100K compaction window so its lanes stay cheap.
The same file also pins the model tiers above, sets effort to xhigh, empties
the commit and PR attribution lines, and turns on push notifications for agent
events. BOOTSTRAP.md asks you, as an explicit step, whether to keep the
permission defaults or switch to normal permission prompts, and shows the exact
change. Do not edit the Stage-1 file to change them: it is a tracked file in
your linuxploitacious checkout, so a local edit (including a /config or
/model save, which writes it) dirties that checkout, and its next
git pull --ff-only fails whenever upstream changed the same file.
OPS is a template repo, not something you clone-and-run in place. Your copy becomes your memory and your identity: it will hold your context files, your project map, your auto-memory. Set it up correctly the first time.
Use GitHub's "Use this template" button, or the CLI:
gh repo create <you>/<your-name> --template Exploitacious/OPS --private --cloneNever fork this repo: forks of a public repo cannot be made private, and
never run your copy public. Your OPS repo accumulates who you are and what
you're working on. It has to be private. The automatic pushes (the daily
backup and memory-init) check this first: they commit locally but push only
when gh confirms origin is a private GitHub repo, and they refuse the public
template itself, so a tryout clone never publishes your notes
(DEPLOYMENT.md, "The push gate").
Two paths, pick one:
-
Via linuxploitacious (recommended). The host-provisioning installer at
Exploitacious/linuxploitacioushas anAI Harnessoption inshellSetup.shthat clones your private copy (it needsghauth so it can see a private repo), then wires everything. If you don't have a copy yet, it offers to create one from this template. -
Manually. Clone your private repo to
~/OPS, then run the Stage 2 deployer:git clone git@github.com:<you>/<your-name>.git ~/OPS bash ~/OPS/.claude-config/deploy.sh # Linux / macOS # Windows PowerShell: & "$HOME\OPS\.claude-config\deploy.ps1"
Both paths are idempotent. Full procedure, both stages, both OSes: see
DEPLOYMENT.md.
On the first launch in a fresh copy, the gate in AGENTS.md (also named in
CONTEXT/core.md) finds no CONTEXT/.bootstrapped marker, so instead of a
normal session it runs BOOTSTRAP.md: an interview about who you are and how
you work, plus machine reconnaissance. Together they write your identity
(CONTEXT/USER.md), a starter voice profile (CONTEXT/voice.md), your rulings
(CONTEXT/standing-orders.md), and the work-tracking, team, and tools slots,
then drop the marker. The doctrine already ships; bootstrap fills in the who,
never the how. On a fresh copy, the bootstrap is the session. Under T3 Code,
open a thread on the ~/OPS project and say "run the bootstrap"; T3 Code hosts
also get a one-time browser setup step (DEPLOYMENT.md § "T3 Code hosts").
OPS/
├── AGENTS.md # how sessions work in this repo (the first-launch gate, build/test/land)
├── README.md # this file: what OPS is + spin-up
├── DEPLOYMENT.md # the two-stage deploy (linuxploitacious -> deploy.sh), migration, T3 hosts
├── BOOTSTRAP.md # first-launch interview + machine recon (writes your identity files)
├── LICENSE # MIT
├── CONTRIBUTING.md # the porting discipline: how private-harness improvements land here
├── CONTEXT/ # core.md always loaded; everything else on demand
│ ├── core.md # the always-loaded rules (linked into ~/.claude/rules/ops-core.md)
│ ├── how-i-work.md # principles P1-P15 + situational rules (the why behind core.md)
│ ├── model-roles.md # the model-tier policy, one source
│ ├── project-kata.md # repo shape + documentation discipline
│ ├── slots.md # context-slot registry (voice, team, tools, work-tracking, doctrine)
│ ├── USER.md / voice.md / standing-orders.md # your identity, voice, rulings: templates BOOTSTRAP fills, never synced
│ ├── work-tracking.md / team.md / tools.md / doctrine.md # the context slots
│ └── projects/ # per-project lessons, loaded only when on that project
├── SKILLS/ # Claude Code Skills + GUI Project twins (symlinked -> ~/.claude/skills/)
├── .claude-config/ # Stage 2 deploy + the machinery it does not itself install
│ ├── deploy.sh / deploy.ps1 # Stage 2 deployer (links, core rule, skill mounts, memory sync, ...)
│ ├── hooks/ # SessionStart briefing, pre-compact snapshot, secrets/git guards
│ ├── systemd/ # ops-verify timer (nightly drift gate) + optional tmux-main
│ ├── remote-sessions/ # hand-run tmux sessions you remote-control (see its README)
│ ├── agents/ + workflows/ # sub-agent definitions + multi-lane workflow scripts
│ └── bin/ # memory-index/-init, root wrapper, skills-vendor, verify-ops, grabit, tests/
├── .claude-memory/ # per-machine Claude auto-memory dirs (git-synced via bin/memory-init)
├── .claude-handoffs/ # cross-session / cross-machine handoff batons
├── PROJECTS/ # your working repos (2nd-level subdirs are their own repos, gitignored)
├── DELIVERABLES/ # cross-cutting one-off outputs not tied to a single project
├── ARCHIVE/ # machine-local archives kept out of git
└── NOTES/ # an Obsidian vault for personal knowledge
The memory pattern is the load-bearing idea: durable state (doctrine, identity, project lessons, auto-memory, handoff batons) lives in tracked files, so a fresh context (after a compaction, a new machine, or a profile switch) recovers by reading the repo, not by remembering.
What every session carries, and why. CONTEXT/core.md is one file under
15,360 bytes with the rules every session and lane needs on every turn.
deploy.sh links it into ~/.claude/rules/ops-core.md, and Claude Code loads
every user rule file at launch on every launch path, with no prompt: the
terminal, T3 Code threads, IDE extensions, claude -p, and the lanes they
spawn. The session briefing's Boot: line says whether the link is in place.
This replaces an earlier boot that appended a foreman charter and an identity
digest to the system prompt through a claude() shell function. Only launches
typed into an interactive shell ever ran that function, so T3 Code and IDE
sessions booted without doctrine. The claude() function remains, but only to
add ultracode to terminal launches.
For a forker, this means:
- Your identity is not in the boot.
USER.md,voice.md, andstanding-orders.mdload on demand, through the core's "Where to look" table and the context skills (operator-voice,harness-readme,harness-deploy,project-kata,projects-map,machines). BOOTSTRAP fills them, andharness-updatenever syncs them, so a template refresh never clobbers them. - Keep the core small and generic. It is paid on every turn of every
session and lane, and the template sync updates it. Put your rulings in
standing-orders.md, never incore.md. - Rest-stop cadence. Compaction is a rest stop, not a scarcity response: compact by hand at natural breaks (core.md § "Rhythm and context"); auto-compaction is the backstop.
- Mount portable skills.
deploy.shclones the public skill source and runs.claude-config/bin/skills-vendor.sh sync; seeSKILLS/README.md. - The drift gate checks it.
verify-ops.shfails if the core is missing, over budget, or not linked (check 16), if a rootCLAUDE.mdwould hideAGENTS.md(1b), ifUSER.mdis still the template on a bootstrapped copy (21), or ifharness-updatestops excluding an identity file (23).
This is a working shell, published as-is. It's occasionally updated when the author's own setup changes. There is no support promise and no SLA. Issues are open; treat them as a place to compare notes, not a help desk. It ships MIT, so reuse the mechanics in your own harness freely; just don't run this template's lineage as a public repo of your own life.
OPS ("Operator's Shell") is unrelated to Anthropic's "Claude Cowork" desktop app. Same broad space, different thing: this is a self-hosted configuration layer for the Claude Code CLI, not a desktop product.
MIT; see LICENSE.