Route existing agent logins and isolated Claude API work on owned machines

One request.
One pinned worktree.
One
accountable
route.

A self-hosted control desk for existing Claude Code, Codex, and Grok CLI logins, plus an isolated Claude API route. The control plane, called Main, remembers which machine owns a project, where work may happen, who produces, who verifies, what needs approval, and what to do when a connection disappears.

Field notes

The promise is deliberately narrow.

Logins

Your CLI logins stay where they already work.

SSH routes use the dedicated remote account's authenticated home.

Recovery

SSH vanished. Main did not guess.

A missing terminal result becomes needs_reconciliation, never an automatic replay.

Workspaces

Fenced sessions, disposable worktrees.

Every code route points at a pre-staged worktree that you reserve for exactly one writer.

Session truth

One board shows where work runs, who touched it, and what still needs your call.

A single durable session joins the project route, SSH host, disposable worktree, producer, optional verifier, budget semantics, lease epoch, and normalized event history.

RC / SESSION BOARD / PROJECT:TIDELINE Main reachable / SSE attached

Current case / intake INT_0184

Fix weekly Codex limit display and preserve unavailable usage state

P1 / BUG
CX Codex / configured modelproducer / high / write
then
verify
CL Claude / configured modelverifier / high / read-only
Nodeworker-zurich
Profiletrusted-subscription
BudgetUSD 0 / subscription
Worktree/srv/agent-workspaces/tideline-184
Leaseepoch 12 / fenced
BacklogBACKLOG.md / configured path
  1. Turn admitted

    Session lease acquired; operator-reserved worktree selected.

  2. Fixed runner accepted request

    One bounded JSON frame crossed SSH stdin. No prompt text entered the command line.

  3. Producer result normalized

    Provider-native output became canonical events and a bounded terminal result.

  4. Verifier queued

    Sequential, read-only, different family. Exit zero is not enough; the runner expects an exact PASS verdict.

Mockup / Session board The point is not another chat window. This view explains a concrete run: which durable route selected the host, which worktree the operator reserved, how the producer hands off to a verifier, and where an uncertain transport outcome would stop.

Console status

Every surface in the sidebar now opens to working state.

The current build ships the fleet overview plus Projects, Workflows, Bugfix and backlog, Approvals, Reconciliation, and Settings as functional workspaces, in comfortable or compact density. The live stream shows event structure; message payloads stay redacted.

RC / FLEET OVERVIEW / OPERATOR CONSOLE Control plane live / events streaming

Healthy nodes

1/11 slot free / 0 nodes need attention

Active turns

00 queued behind active work

Needs decision

0No ambiguous outcomes
Live activity / CanonicalEventV1stream connected / 8 events
  1. Session started

    Codex thread started on the assigned node.

  2. Turn started

    Codex turn started under one fenced session lease.

  3. Message

    Content retained on the assigned node.

    redacted
  4. Provider stderr

    Provider wrote a diagnostic line to stderr.

    redacted
  5. Message

    Content retained on the assigned node.

    redacted
Guardrails active. Every turn has one session lease, an explicit execution profile, and guarded write access.
Console / Fleet overview What Main shows, and what it refuses to mirror. Counters summarize node health, active turns, and outcomes waiting on a person. The stream lists canonical events with payloads redacted: message content is retained on the assigned node, not copied into the control plane view.

Control plane ownership

Main owns decisions. Runners own execution.

The split keeps provider-specific streams away from the loopback control plane while preserving enough state to schedule, recover, and audit work.

Persistent project routes

One record pins node, absolute disposable working directory, profile, producer, optional different-family verifier, write policy, budget, egress list, and relative backlog path. Allow writes, auto-dispatch intake, independent verifier, and approve writes are explicit toggles on the route, not defaults.

Three trigger types

Manual, intake, and five-field cron schedules with an IANA timezone all converge on the same durable workflow-run lifecycle.

Guided dispatch

One form binds workspace, task prompt, and reasoning route: a single agent, or the recommended producer plus verifier pair, each with its own provider, model, and reasoning effort. A route preview shows the verified delivery chain before launch.

State before send

Main creates the session, encrypted prompt reference, turn, command ID, idempotency key, budget reservation, and fenced lease before dispatch.

Normalized evidence

Runners translate Claude, Codex, and Grok output into CanonicalEventV1. Final answer text is stripped from the durable control result.

Deliberate uncertainty

Companion work can reattach to its host supervisor and spool. Direct SSH cannot, so missing terminal results wait for explicit operator reconciliation.

Intake and schedules

A backlog item should already know which machine owns it.

Projects turn short bug, backlog, and feature requests into bounded work. Scheduled fleet operations use the same route rules, but broad writes stop after targets are frozen and before dispatch.

RC / AUTOMATION WORKBENCH / INTAKE + WEEKLY OPS Run WR_0091 / awaiting approval
New project intakeINT_0184

Project

Tideline

Type

Bug

Priority

P1 / high

Title

Codex weekly limit displays 0%

Instruction

Parse the weekly-only usage window. Keep unavailable data distinct from a real zero. Add the menu bar regression fixture.
Create item and use pinned route
MON
03:00

Weekly Claude fleet update instructions

Dispatch reviewed maintenance instructions through one Claude producer route to the eligible trusted SSH subset. This is an agent workflow, not a typed package updater.

0 3 * * 1Europe/Zurich
Target resolution / frozen for run WR_00913 eligible / 4 registered
worker-zurichhealthy / free / route compatibleSSH / Claudeincluded
worker-irelandhealthy / free / route compatibleSSH / Claudeincluded
worker-labhealthy / free / route compatibleSSH / Claudeincluded
worker-tokyoCompanion supports isolated-api onlygRPC / Claudeexcluded

Concurrency policy: allow or forbid overlap. Replace is intentionally rejected. A partial fan-out can also enter needs_reconciliation if some nodes changed and others never started.

Mockup / Automation workbench Two paths, one set of controls. The project bug inherits a precise route. The weekly job resolves only eligible nodes, records that subset, and waits for a person because its scope is both all-node and write-capable.

Execution profiles

Pick the trust boundary before you pick the model.

These profiles are not interchangeable modes. One narrows a Claude API job inside a Linux sandbox. The other deliberately trusts an owned SSH account so existing Claude, Codex, and Grok subscriptions can be reused.

Profile Anarrower boundary

isolated-api

For unattended, API-funded Claude work through an outbound Linux Companion.

Transport
Persistent outbound gRPC/TLS over Tailscale.
Provider
Claude only in Phase 1. No independent verifier on this route.
Job
Digest-pinned read-only toolchain, one explicit workspace, bwrap namespaces, systemd limits.
Secret
Root-only API key exposed through a job-scoped helper socket.
Network
No native child network. HTTP(S) uses an allowlisted Companion proxy.
Budget
Positive per-turn USD ceiling reserved against the fleet UTC daily cap.
Recovery
Host supervisor spool, idempotent resend, and Companion reattachment.

Use when the narrower technical boundary matters more than reusing a subscription login.

Profile Btrusted host

trusted-subscription

For machines and dedicated OS accounts whose home, filesystem permissions, environment, network, and sudo policy you accept as agent scope.

Transport
One fixed OpenSSH runner invocation per turn.
Providers
Claude, Codex, or Grok from the remote account's existing login.
Job
Operator-prestaged disposable worktree with one exclusive writer.
SSH
Pinned host key and identity, batch mode, no PTY, no forwarding, forced command.
Network
Provider process and tools inherit host networking.
Budget
Explicit USD 0 / unmetered. Subscription windows are not a dollar meter.
Recovery
No durable remote inbox. Lost terminal result requires inspection and explicit resolution.

Use when the machine is owned, the account is credential-minimal, and existing CLI subscriptions are the point.

Operator lifecycle

Every trigger ends in recorded fact, explicit failure, or a human decision.

The browser may close. Main, Companion, runner, leases, and spools own the lifecycle beneath it.

Trigger

Create a manual run, accept project intake, or persist the next cron occurrence in its declared timezone.

Resolve

Freeze the project route or an eligible explicit/all-node target set. Mixed fleets can produce a deliberate subset.

Approve

Write-capable all-node runs and gated project intake remain pending until the local operator reviews scope and instruction.

Dispatch

Create durable state first, reserve budget when metered, acquire the session lease, then send one bounded command.

Verify

If configured, start a sequential read-only worker from a different provider family. Only an exact structured PASS completes it.

Resolve outcome

Record success or failure. If SSH truth is missing, stop in needs_reconciliation and let the operator inspect the workspace.

Security ledger

The product says exactly what it trusts.

Isolation is scoped to the provider child, not used as a blanket adjective for the entire system. The operator still owns host setup, worktree discipline, credentials, logs, backups, and rollout.

Main HTTP
Loopback only

The UI/API has same-origin checks and no public network authentication boundary. Remote access belongs behind an authenticated local tunnel.

Companion identity
TLS plus node token

TLS authenticates Main. A per-node bearer token authenticates Companion; Main stores only a one-way verifier.

Isolated child
One workspace, helper sockets, no state mount

The bwrap child cannot see the host supervisor's durable spool or control socket. Root Companion and host supervisor remain trusted infrastructure.

SSH account
Broad, explicit trust

The authenticated home, allowed project files, inherited environment, network, and sudo rules are all inside this profile's boundary.

Workspace
Disposable and exclusive

Main fences sessions, not arbitrary filesystem paths. The operator must pre-stage, reserve, review, promote, then reset or discard each code worktree.

Stored state
Encrypted prompts, sensitive events

Prompt blobs are encrypted at rest. Canonical events, runner state, transcripts, logs, backups, node tokens, and model keys still need protected storage.

Field sequence

The operator still has a job.

Run Control makes the Agent Orchestrator route durable. It does not quietly take ownership of machine trust, promotion, deployment, or incident judgment.

Enroll

Register nodes and pin trust.

Use a node token and TLS for Companion, or a verified host key, dedicated identity, and forced runner command for SSH.

Prepare

Stage disposable work.

Create an exclusive worktree outside canonical, shared, deployed, or concurrently written paths.

Route

Bind each project once.

Choose node, path, profile, producer, optional verifier, write policy, budget, and backlog path.

Watch

Approve and reconcile.

Review broad write targets. Inspect uncertain SSH workspaces before selecting an explicit outcome.

Promote

Move reviewed work separately.

Apply normal tests, code review, deployment controls, and promotion outside the agent run, then dispose of the worktree.

FAQ

Questions an operator should ask before the first run.

Does Run Control replace Claude Code, Codex, or Grok?

No. It runs those existing CLIs and adds persistent routes, projects, intake, schedules, approvals, normalized events, budget accounting, and recovery rules around them. No custom provider adapter is implemented in Phase 1.

Where do subscription credentials live?

In the dedicated remote user's existing authenticated home. Main receives neither the login tokens nor the provider-native stream. That same home, its environment, project permissions, host network, and any sudo rules become trusted scope.

Can one bug report reach the right server automatically?

Yes, when its project has a valid fixed route. The item inherits the registered node, absolute disposable worktree, execution profile, producer, optional verifier, write rule, budget semantics, egress list, and backlog path. Intake can auto-dispatch or remain queued.

Can the Monday workflow update every server?

It can dispatch reviewed update instructions to the eligible trusted SSH subset. Target resolution includes only healthy, admitted, free-slot, route-compatible nodes, so it may exclude part of a mixed fleet. Because the run targets all nodes and writes, manual approval is mandatory before dispatch.

Does the verifier guarantee good code?

No. If configured, it adds a sequential, read-only, different-family review. Exit zero is insufficient; the runner requires an exact ORCHESTRATOR_VERDICT: PASS. Tests, human code review, promotion, and deployment controls still apply.

What happens after a direct SSH disconnect?

If no terminal result arrived, Main records needs_reconciliation and never auto-replays the prompt. The operator inspects the remote worktree, then explicitly resumes, marks succeeded, marks failed, or terminates.

Does Main guarantee one writer per worktree?

No. Its fenced lease is session-scoped. The operator must reserve each disposable worktree for one writer and keep humans, other sessions, and external processes out. A producer and verifier may share only because they run sequentially.

How much of the operator interface exists today?

The fleet overview, projects, workflows, bug and backlog intake, approvals, reconciliation, and settings workspaces are all functional in the current build, with interaction tests behind them. The interface offers comfortable and compact density, persisted locally in the browser. Cost and budget surfaces are deliberately kept out of the interface while that feature flag is disabled.

Does the control plane display prompt and message content?

Prompt blobs are encrypted at rest, and the live activity stream redacts event payloads. A message entry records that content was produced and retained on the assigned node, not the text itself. Full transcripts stay with the runner on the node that did the work.

Is isolated-api production ready?

Not yet. The implementation has automated tests and Linux cross-build coverage, but the full Linux kernel, systemd, bubblewrap, bundle, egress, cancellation, and restart path still needs a disposable real-host canary. While budget controls remain behind the disabled flag, dispatch and workflow choices are limited to trusted-subscription routes.