epoptes

Claude Code / Codex / pi / Antigravity

Long agent runs.
Under watch.

Epoptes runs the long jobs you'd love to hand to an agent overnight: a feature build, a research sweep, a stack of documents, a data clean-up. You describe the goal in a chat. Epoptes runs it as a series of fresh-context cycles in a time box, with a live dashboard, a board you steer it through, and a report in the morning.

ἐπόπτης, “the overseer”: a title for Zeus and Helios, who watch over everything.

127.0.0.1:4747 · field-guide
Runningcycle 7 · M2 · reference chapters 2h41m of 8h
A goal page while a run works through the night. Simulated, but drawn from the real dashboard.

01 · what it is

A skill, a runner, a dashboard.

Three small parts that share nothing but a folder of plain files, .epoptes/, in your project. Any of them can be replaced, and you can read or fix every file by hand.

  1. 1

    The skill designs the harness

    Ask your agent to “use the epoptes skill”. It interviews you about the outcome, a done definition it can check, the time box, the team and what always needs your approval. Then it writes the harness and checks it with a dry run.

  2. 2

    The runner runs it in cycles

    A detached process per goal. Each cycle starts your own claude, codex, pi or agy with a fresh context. The cycle orients from small state files and the board, does a slice of work, verifies it, records it and exits.

  3. 3

    The dashboard lets you watch and steer

    epoptes ui on 127.0.0.1. A live ticker, a kanban board for feedback, approvals to answer, the clock, costs and plan usage, then a report. Closing it never stops a run.

You chat with the skill, which writes .epoptes. The runner loops cycles over it, and the dashboard reads it and writes your feedback back. youa chat the skillinterview → files .epoptes/ goal.json · loop.mdagents/ · state/board.jsonl · events the runnercycle after cycle the dashboardwatch · steer · report agentfresh context claude · codex · pi · agy cards, comments, approvals
The file format is the contract. The runner, the CLI, the dashboard and the skill only read and write these files.

02 · why

Long sessions drift. Short cycles don't.

Epoptes grew out of a 12-hour autonomous game build: 19 cycles, about $186 of API-equivalent usage, and a notebook of what went wrong. Its rules for keeping long runs cheap and on track are built in, so you don't have to relearn them.

One context fills up, gets summarised, and forgets what failed.

1 A fresh context every cycle

Memory lives in small files the next cycle reads first: a 25-line handoff, a progress table, lessons and decisions. Nothing drifts out of a summary, and every cycle starts sharp.

Every step costs the price of the most expensive model.

2 Cheap models for mechanical work

A team of roles, each with its own model: a strong orchestrator and reviewer, mid-size workers, and a small checker that only runs tests and reports facts.

Notes grow until reading them is the job.

3 State files with size caps

Each state file has a line cap the dry run and the runner check. Orienting takes six tool calls or fewer, with targeted reads instead of whole files.

A single run can wander for hours with nothing to show.

4 A time and round cap per cycle

A cycle does at most three rounds of one to three tasks, under a soft time cap and a hard timeout. A fresh cycle is cheaper than a bloated one.

03 · the night shift

Ask one session, or run a harness.

The same 8-hour job, two ways: one agent session told to “keep going all night”, and an Epoptes harness. Drag the clock, or press play.

0h00

One long session

“Build the field guide. Keep going all night.”

working

context
8%
milestones

      Epoptes harness

      The same goal, 8-hour time box, done checks agreed up front.

      cycle 1

      context
      8%
      milestones

          An illustration of the failure modes Epoptes was built around, not a benchmark. Your agent may do better on a good night.

          Side by side
          Ask one agent sessionRun it with Epoptes
          ContextOne window that fills, gets compacted and loses detailA fresh context every cycle; memory in small, capped files
          “Done”When the agent says it looks goodChecks agreed at the interview: commands, files, a reviewer's rubric
          “Shall I continue?”Waits for an answer you're asleep forThe loop says what's next. Approvals wait while other work carries on
          TimeNo clock: it stops early, or runs onA time box of active time, then wrap-up; it finishes early once checks pass
          Closing the laptop lidEnds the sessionThe runner is detached; the next start recovers interrupted work
          Rate limitsAn error, or a loop of retriesWaits for the reset with the clock paused, then carries on
          ModelsOne model for every stepA model per role: small for checks, strong for review
          SteeringType into the session and hope it noticesCards and comments on a board; ⚡ Steer now replans around you
          Seeing the costA total at the end, if you askTokens, cache share and cost per cycle, outliers flagged, plan usage live
          The morning afterA long transcriptA report, the board, events, commits or snapshots per cycle
          The next jobStarts from zeroStarts from the brain: lessons from every harness you've run

          04 · crash course

          From a sentence to a morning report.

          Seven steps. The first two take a few minutes; the rest is the run looking after itself.

          Install Epoptes and give your agent the skill

          You need Node.js 22.18 or newer, Linux, macOS or WSL2, and at least one agent CLI installed and logged in. Epoptes runs your own CLI and never handles logins or keys.

          The skill is how your agent learns to design harnesses. Install it for each CLI you use: it links into that CLI's skills folder.

          terminal
          $ npm install -g @ramigbcom/epoptes
          $ epoptes skill install                        # Claude Code
          $ epoptes skill install --agent codex          # Codex
          $ epoptes skill install --agent pi             # pi
          $ epoptes skill install --agent antigravity    # agy

          Describe the goal. The skill interviews you.

          In the folder the work should happen in, ask for a harness. The agent looks around first, then asks only what it can't find out, two to four questions at a time:

          • the outcome, and a done definition it can check
          • non-goals and the time box
          • the team: roles, models and effort
          • checkpoints, and what always needs your approval
          • where the deliverable lives, so the dashboard can link to it

          It reads lessons from your past harnesses and shows a one-screen summary for you to sign off.

          claude
          > use the epoptes skill to build a harness for writing a
            20-page field guide to our internal APIs
          
          ● I read the README, the OpenAPI spec and docs/. A few questions:
          
            1. Done: how would you check it in 2 minutes?
               ❯ every endpoint documented + examples run (Recommended)
                 an editor's rubric score ≥ 8 as well
            2. Time box: ❯ 8h active, 45m wrap-up (Recommended)
            3. Team: ❯ writer (sonnet) · factcheck (haiku) · editor (opus)
            4. Always ask before: ❯ publishing anything outside this machine
          
          ● Lessons applied from the brain: 2 (fresh-results timestamps,
            parallel tasks own separate files). Summary below; sign off?

          The harness is a folder of plain files

          Everything lives in .epoptes/ next to your work. Commit it, diff it, edit it by hand. Live runner state and per-cycle transcripts are gitignored and never leave your machine.

          Role files become native subagents on Claude Code, Codex and Antigravity, each on its own model. On pi the loop works through them in sequence.

          .epoptes/
          .epoptes/
            goal.json        objective, done checks, time box, models
            loop.md          the orchestrator's per-cycle instructions
            agents/
              writer.md      model: sonnet · effort: medium
              factcheck.md   model: haiku  · effort: low
              editor.md      model: opus   · effort: high
            settings.json    allow/deny list: no git push, no .env
            state/           handoff.md (25 lines), progress, lessons
            board.jsonl      every card, comment and move
            events.jsonl     milestones, blocks, done
            cycles/  run/    per-cycle records · live state (ignored)
          
          "done": [
            { "id": "D1", "check": "every endpoint has a page",
              "verify": { "type": "command", "run": "npm run check:coverage" } },
            { "id": "D2", "check": "editor scores every chapter ≥ 8",
              "verify": { "type": "agent" } }
          ],
          "timebox": { "total_min": 480, "wrapup_min": 45, "grace_min": 30 }

          A dry run checks the guardrails

          epoptes run --dry-run never starts the clock. It validates the goal and prints the exact command the next cycle will run. It also flags:

          • template leftovers
          • missing deny rules and over-broad allows
          • anything that looks like a credential
          • roles with no description or a model the CLI can't use
          • a loop that never reads the board or reports done

          Then epoptes add registers the goal with the dashboard.

          terminal
          $ epoptes run --dry-run
          goal field-guide: A 20-page field guide to our internal APIs.
          adapter claude-code (2.1.300) · roles: writer, factcheck, editor
          time box 8h00m (wrap-up 45, grace 30) · cycle timeout 90 min · checkpoints git
          clock: not started (a dry run never starts it)
          next cycle runs in ~/work/api-guide:
            claude -p "<loop.md>" --model sonnet --effort medium --permission-mode auto
              --agents …/agents.json --settings …/settings.json …
          
          warnings:
            state/lessons.md has 34 lines (cap 30)
          
          ok with warnings
          
          $ epoptes add
          registered field-guide (API field guide)

          Press Start, then go to bed

          Open the dashboard and press Start, or start from the terminal. The runner is detached: closing the dashboard or the terminal never stops it.

          Between cycles it checks the clock, your controls, rate limits and failures. Near the end the goal switches to wrap-up (feature freeze), then overtime, then stops. It finishes early once its checks pass.

          terminal
          $ epoptes ui
          dashboard on http://127.0.0.1:4747
          
          $ epoptes start field-guide
          started: run r1, runner pid 48213
          
          $ epoptes status
          field-guide · API field guide   (~/work/api-guide)
          state running (pid 48213) · run r1 · cycle 7 · mode build
          clock 2h41m active of 8h00m · wrap-up in 4h34m · end in 5h19m · …
          pace M1 took 72% of its planned time · on pace to finish at ~6h50m of 8h00m
          board 6/10 done · 1 backlog · 2 todo · 1 doing · 1 review · 0 blocked · 0 cut
          last cycle c6: ok · 0h38m · 41 turns · ≈ $1.12 (estimate)

          Steer through the board, not the transcript

          Your feedback lands in the backlog as a card. The orchestrator triages it into TODO or cuts it with a reason, works it, verifies it in REVIEW and moves it to DONE. Comment on any card; the next cycle acts on it or replies.

          Anything on the approval list waits for your Approve or Disapprove while the run carries on with other work. Need to change course right now? ⚡ Steer now interrupts the cycle, and the next one replans the board around you.

          terminal
          $ epoptes feedback "the intros are too long"
          added C-9 to the backlog
          
          $ epoptes card C-4 comment "link the error codes table"
          $ epoptes card C-12 approve "internal wiki only"
          $ epoptes feedback "drop GraphQL, REST only" --steer
          added C-13 (steering): the running cycle is interrupted now
          and a fresh one replans around it
          
          $ epoptes extend 1h
          $ epoptes pause          # after this cycle

          Read the report, follow up, take the next job

          The report covers what was done, where the time went, tokens and cost per cycle, milestones against the plan, and the handoff. It comes as Markdown and as script-free HTML.

          Small tweaks after DONE go through a follow-up: only your open cards, no time box. The project's next feature is a new job on the same harness, which keeps its roles and lessons. Every run feeds the brain, so the next harness starts smarter.

          terminal
          $ epoptes report
          report written:
            ~/work/api-guide/.epoptes/reports/field-guide-20261029-0712.md
            ~/work/api-guide/.epoptes/reports/field-guide-20261029-0712.html
          
          $ epoptes start --follow-up       # fix my open cards
          $ epoptes job new "SDK quick-starts"
          $ epoptes brain
          brain: 6 goals, 41 harness lessons, 9 signals
            ~/.epoptes/brain/INDEX.md

          05 · features

          Everything a long run needs. Nothing it doesn't.

          06 · bring your own agent

          Four CLIs. One harness format.

          Epoptes runs the CLI you're already logged into, on your plan or your keys. A harness says which one in goal.json; the dashboard, board and reports work the same for all four.

          What each CLI supports
          Claude CodeCodexAntigravitypi
          Each cycle runsclaude -pcodex exec --jsonagy -ppi --mode json
          Rolesnative subagentsnative custom agentsnative subagentsworked in sequence
          Model per rolehaiku · sonnet · opusany Codex model + effortflash · pro · inheritone per cycle
          Permissionsallow / deny listnative sandbox and rulesagy's own allow rulesEpoptes deny-list guard
          Cost shown≈ API-equivalenttokenstokens≈ from pi's catalog
          Plan usage5h and 7d windows5h and 7d windows—API spend
          Budget cap per cycleyes——yes

          What Epoptes is and isn't

          epoptes is

          • a local runner for your own logged-in agent CLI
          • for long jobs: an evening, a night, a weekend
          • plain files in your project you can read and fix
          • a personal tool that improves from daily use, MIT licensed

          epoptes isn't

          • a hosted service: no accounts, no telemetry
          • a way around usage limits: it waits for them
          • an agent itself: your CLI does the work
          • finished: early (0.6), and file formats may still change

          07 · start tonight

          Try it on a 15-minute goal.

          The example writes a small glossary in about 15 minutes, for well under $1 of API-equivalent usage. Then ask your agent for a harness of your own.

          terminal
          npm install -g @ramigbcom/epoptes
          epoptes skill install
          git clone https://github.com/ramigb/epoptes.git
          cp -r epoptes/examples/glossary /tmp/glossary
          epoptes add /tmp/glossary && epoptes start glossary
          epoptes ui
          your agent
          use the epoptes skill to build a harness for <your goal>

          Works in Claude Code, Codex, pi and Antigravity once the skill is installed for it. Needs Node.js 22.18+ on Linux, macOS or WSL2.