administering ai

Govern the fleet,
not the prompt.

Anyone can turn agents on. The question a platform owner has to answer is what happens next — how much they can spend, what they're allowed to touch, who says yes, and how you stop them. fastverk makes each of those a field on a resource you can read, diff, and audit.

Fleet migration — launch plan (dry run) read-only
fleet.v1.FleetService/LaunchPlan · 76 repos
repofixesblast radiusgate
rules_cc_crossC3 · C6blast:rules_cc_cross://srcgreen BuildRun
plugin-depotC6blast:plugin-depot://uigreen BuildRun
rules_leanC3blast:rules_lean:*serializes repo
…73 more
nothing exists yet — no branch, no MR Launch fleet migration
DispatchAll(dry_run=false)
FanoutRun · tbzl-guards Running
17merged 4running 6queued 2blocked 1failed
budget · maxTokens 2.1M / 3.0M
admission stops when the next task would exceed it
concurrency4 leasesHeld4
⏸ pause admit nothing · in-flight agents finish
prompt → policy
where the control lives
a CR field, not a system prompt
seat → run
the unit you budget
a fan-out, not a per-user licence
review 76 → review 1
the pre-flight
a dry run before any MR exists
one switch
stops the fan-out
in-flight agents finish
01 · the unit of control

Reason about the run, not the request.

Per-request guardrails are the wrong altitude for a fleet that will open forty pull requests before lunch.

The thing worth bounding isn't the individual call — it's the campaign: a batch of tasks under one spend ceiling, one concurrency cap, and one stop. That's a fan-out run, and it's a Kubernetes resource, so every control is a field you can read with kubectl, diff in git, and hand to an auditor.

Which matters more than it sounds. A guardrail expressed as a system prompt is a request. A guardrail expressed as an admission check is a property: the scheduler will not admit a task that would exceed the token budget, and there is no phrasing that talks it into doing so.

02 · what it's allowed to touch

Two agents. One package. One of them waits.

A permissions model that says "this agent may write code" isn't a permissions model. This one is spatial: a task declares its Bazel affected-set, the scheduler leases each package before admitting it, and a task whose region is already held stays blocked with the reason on its status. Values illustrative.

migrate-toolchain-7f3 Running
spec.blastRadius.packages
  • //src/toolchain
  • //src/rules
  • //tests/toolchain
blast:tbzl://src held
//src/rules the contested region
fix-flaky-cache-9c2 Blocked
spec.blastRadius.packages
  • //src/rules
  • //src/cache
blast:tbzl://src waiting
status.blockedReason
conflict: lease blast:tbzl://src held
blastRadius.full: true

A toolchain, MODULE.bazel, or .bazelrc change can reach anything in the repo, so it takes blast:tbzl:* and serializes the whole repo rather than pretending to a narrow radius. Leases carry a TTL — a scheduler or agent that dies releases its region instead of wedging the fleet.

03 · what it's allowed to be

An agent's reach is exactly yours.

You don't provision an agent's permissions. It inherits yours, per call — and the inheritance is a reduction, never an expansion.

01

Forward

The host forwards the signed-in user's identity on every tool call. There is no shared service account to over-scope, and the forge's own record names a person rather than a bot.

02

Boundary

Each plugin's own MCP server is the authorization boundary. The host aggregates tools; it never decides what you may do. The owner of the capability does.

03

No static key

The model turn runs on Bedrock through the pod's IRSA role. There is no long-lived provider credential to leak, rotate, or find in a log.

04

Later turn

A write comes back flagged for confirmation as a preview. It fires only after you approve and the model re-calls it on a subsequent turn. It can't ask and act at once.

04 · the template

Configure the fleet, not each agent.

An AgentProfile is to an Agent what a WorkspaceConfig is to a DevWorkspace — one reusable template pinning the runtime, the model, the MCP servers every agent loads, its compute, and its environment. The last row is honest about what's declared but not yet enforced. Values illustrative.

AgentProfile · fleet-migrator
fastverk.savvifi.com/v1
fieldvaluestate
backend claude-code wired
model claude-opus-4-8 wired
mcpServers[] agent-coord · meridian-mcp wired
resources 4 CPU · 8Gi wired
defaultPlaybookRef migrate-playbook wired
env[].valueFrom secretKeyRef — no literals wired
tools[] scopes the exposed tool set declared
declared: in the CRD; the runner doesn't scope from it yetcredentials: arrive from Secrets at runtime, never in the CR
05 · earning autonomy

Autonomy is earned per repo, not granted per org.

The eval harness drives the merge-gate loop deterministically through tool calls — no git, no model — so it measures whether the gate holds rather than how well an agent reasons. A nonzero false-merge rate exits nonzero: it's a CI gate, not a dashboard. Values illustrative.

Eval — autonomy bar
fastverk.eval.v1.EvalReport · ≥95% green-merge · 0% false-merge · ≥50 runs
reporunsgreen mergefalse mergeverdict
rules_cc_cross 62 97.2% 0.0% graduated
aion/web 51 91.4% 0.0% held — below the bar
plugin-forge 23 96.1% 2.1% blocked — false merge ≠ 0
the bar: graduate a repo only when its eval clears italso reported: flake_rate · scope_accuracy · pass_rate
06 · the record

Every coordination step is a record, not a log line.

Spawn, claim, checkpoint, handoff, merge and human-prompt each append an AgentEvent to the durable agent-events stream. Live churn — presence, focus, claim state — stays on the KV where it belongs; the provenance lands where it can be replayed. Values illustrative.

AGENT_SPAWNED
spawned from profile fleet-migrator into pool migrations
09:14:02
CLAIM_ACQUIRED
lease taken · blast:tbzl://src
09:14:03
CHECKPOINTED
ck-3 — git WIP ref, context summary, active claims, tokensUsed
s3://…/ck-3 09:31:47
HUMAN_PROMPTED
approval raised — the agent checkpointed and suspended
09:32:10
RESUMED
rehydrated from ck-3 — spec.resumeFrom patched
10:02:55
HANDED_OFF
offer → accept, with the remaining work list
10:18:20
MERGED
folded into merge-wave-f6 — lineage.mergedFrom recorded
10:41:09
07 · the payoff

Governing the agents is half of it.
The other half is where they work.

A governed agent still needs a machine, a toolchain, and a checkout — and so does the human reviewing its pull request. Give them the same one. We call it a verkspace: fastverk + workspace. The resource is still a DevWorkspace, the URL is still <name>.ws.fastverk.com, and the CLI is still fv ws create. The word is for what the thing becomes when the agents move in.

A verkspace is a workspace with the agents already in it — same layers, same identity, same remote execution.

verkspace · fastverk + workspace
compose · preview

A verkspace is a set of layers. Pick them.

The catalog is made of ToolLayer resources, so the gallery is add-a-CR-to-appear — apply another and it shows up, with no code change. Pick layers à la carte or pull one whole from a bundle, each pinned to a version, and save the result as a template your team and your agents launch from. Layers, versions, and image cost below are read from the shipped catalog.

Compose · a verkspace template preview
language6
runtime2
browser2
database2
cli6
agent1
resolved WorkspaceConfig 5 layers · image +840 MB
RustChromePostgreSQLBazelClaude Code
catalog: 19 layers · 34 pinned versions · 3 bundles add a ToolLayer CR and it appears here — no code change
08 · vs a seat you switch on

One environment. Not two.

The unit of control is the thing worth comparing.

fastverk
a seat-based AI assistant
Unit of control
A run — budget, concurrency, stop
A per-user seat
Spend ceiling
A token budget, enforced at admission
A monthly invoice
What it may touch
A leased Bazel blast radius
The whole checkout
Identity
Yours, forwarded per tool call
A shared service account
Stopping it
One field on one resource
Revoke seats, one by one
The record
A durable event stream you replay
Chat scrollback
Where it runs
Your cluster, your remote execution
A vendor's cloud
diligence-ready

What's built today — and what's next.

Straight about maturity, because a platform owner will ask. The controls that hold are reconciled today; the policy surface above them is the build ahead.

Built today
  • The fan-out scheduler: a task is admitted only when its dependencies merged, its blast radius is free, it's within budget, and it's under the concurrency cap
  • The kill switch — admits nothing, queued tasks go blocked, in-flight agents finish
  • A token budget enforced at admission, summed from each checkpoint's usage
  • Bazel blast-radius leases keyed blast:<repo>:<pkg>, TTL-reclaimed if a scheduler or agent dies
  • A lease held until the build is green and the forge merges — green alone isn't merged
  • A read-only launch plan: a dry run of a whole fan-out before any MR exists
  • Profiles pinning backend, model, MCP servers, resources, playbook, and env from Secrets
  • Human gate: raise → checkpoint → suspend → answer → resume from the checkpoint
  • The durable agent-events stream, plus KV for claims and focus
  • Faithful deputy — identity forwarded per tool call; Bedrock via IRSA, no static key
  • Confirm-gated writes that can't fire in the same turn
  • A false-merge rate that exits nonzero — the autonomy bar is a CI gate
  • Workspaces: owner-scoped, template-driven, one wildcard, scale-to-zero at 30m idle

Turn on the agents. Keep the stop button.

A budget, a blast-radius lease, a human gate, and a kill switch — on resources you can read. Then a verkspace to run it all in.