NewEnforcement ships — the plugin and the CLI are live

Several AI coding agents on one repo. One quietly reverts the other.

CommitCycle gives that work somewhere to live. The paths that would hurt get an owner and a risk level; each agent gets access to one task on one branch, and it expires on its own. Moving a wall takes one approval — with a reason, on the record.

CommitCycle is built under CommitCycle, and it runs today — boards, the agent connector, repository setup, and the plugin that denies a write before it lands, which anyone can install. A board is what needs an invitation while this is new, and that is a queue rather than a coming-soon page.

Claude Code · branch task/CC-42-add-an-org-index
$ cycle start "add an org index" --goal "index org lookups" --non-goals "no data backfill" --criteria "the query plan uses it"  board  https://dash.commitcycle.com · pow/commitcycleCC-42 is In Progress on task/CC-42-add-an-org-index  open   no protected zones — everything unprotected is yours already  record .zones/tasks/CC-42.md● Edit apps/api/migrations/0007_add_org_index.sql✗ Denied by CC  zone     schema · risk high  owner    paulo@commitcycle.com  task     CC-42 declared no protected zones  reason   path is in a zone the task never asked for$ cycle request-access --zone schema --mode write --reason "the index needs a migration" --alternative "hand the DDL to the owner"REQ-7 sent to paulo@commitcycle.com  Approving opens schema for this task only, for as long as you say.  Answer it in the console, or with cycle requests.

Every number here has its limits printed next to it

From audit records in this repository, not from a benchmark designed to win. A gate that oversells itself gets uninstalled in week two.

CC-3

25 / 25

Bash escape vectors contained

sed -i, python -c, tee, redirects, git checkout --, and an npm run whose build script writes into a protected path. Executed against a fixture repo and verified byte-for-byte, not simulated.

What it doesn't proveGitignored paths inside a zone are not covered — and .env is both gitignored and the archetypal secret.

CC-3

0 / 20

false positives on ordinary commands

The conservative allowlist stopped 24 of 24 attacks and blocked 8 of 20 legitimate commands, mkdir and cp among them. A 40% false-positive rate is the week-two uninstall arriving with a perfect scoreboard, so the design was inverted.

What it doesn't proveTwenty commands we chose ourselves, not twenty real tasks. Phase 6 is the real test and it has not run.

CC-1

68–83 ms

added to a tool call, p95

Over 120 cold process spawns — the hook is a new process on every call, and warm timings would have flattered it.

What it doesn't proveOne machine, idle. p99 reached 102 ms against a 100 ms budget.

Four things break when a team points agents at one repo.

Context that lives on one laptop

A private Obsidian vault, a CLAUDE.md that drifted three sprints ago, an AGENTS.md nobody trusts. Per-person upkeep, per-person answers.

cycle sync generates the agent’s context from zones.yml — active task, open zones, non-goals — between markers in AGENTS.md, touching nothing outside them. The same file for every person and every agent, reviewed like code.

The context block

Two agents, one repo, no referee

Both convinced they own the same module. One quietly reverts the other, and the honest fix is going back to one agent at a time.

A grant is bound to a task and a branch, opens only the zones that task declared, and expires on its own — so reaching outside it is refused while it happens, not discovered at review. Worktrees isolate; they do not decide. CC confines each agent; it does not arbitrate between them.

Grants and access requests

A prompt is not a permission

AGENTS.md asks the agent to stay out of migrations/. Asking works right up until it doesn’t, and no line in any log shows that it didn’t.

Mark the irreversible paths as zones with an owner, a risk level and a deny policy — then a grant opens only what the task declared, and only until it expires. The zone model is agent-agnostic; the enforcement point needs one small adapter per harness, and today exactly one ships. 25 of 25 escape vectors contained, on a corpus we chose ourselves.

Zones, and what not to declare

Describing the work costs more than doing it

The task lives in a browser tab you are not in, so work starts undescribed and the first record of its scope is the diff.

An MCP server files and scopes the task from inside the session you are already in — zone map, four fields, saved. No tool there issues a grant, approves access or decides a transition: moving a task is the gate’s call, made by the same rules whichever client asks.

The MCP server

Three layers, and only two of them enforce anything

Layer 1

Context

AGENTS.md

Tells the agent the rules in language it reads, and enforces nothing whatsoever. This layer is documentation, and we would rather call it that.

advisory

Layer 2

Policy enforcement

Pre-tool-call hook

Decides every tool call against the grant on disk: allow, ask, deny. Never touches the network, so an outage cannot open a zone. The zone model is agent-agnostic — this layer needs one small adapter per harness, and one ships today.

blocking

Layer 3

Required status check

GitHub Action

Re-runs the same zone matching against the pull request, from the same implementation. The deterministic net under whatever the laptop missed.

blocking

What CommitCycle won’t do

Permanent decisions from the spec, not a roadmap in disguise. The fastest way to lose a developer’s trust is to be vague here and specific later.

Run your code

Not your tests, not your migrations, not your deploy. CC asks for evidence and checks it. Anything executing on your behalf is blast radius we would be adding.

Host preview environments

Visual evidence is a URL you already have, or a capture you attach. Preview hosting is a product, not a side effect of a checklist item.

Replace your tracker

The first version ships its own board — five fixed states are what let the gate mean anything. Intake is an API, so a webhook bridges whatever you use today.

Gate anything through MCP

The MCP server ships, and files, drafts and reports. It issues no grant. An agent chooses whether to call a tool, and a boundary you can decline to call is not one.

Support Windows, yet

macOS and Linux only. Saying so now is cheaper for both of us than a support matrix that quietly does not include you.

Ask for an invite

Signup is closed while this is small. Not because there is nothing to use — there is, and the four steps in the quickstart are the real ones — but because the people using it early get answered personally, and that stops being true past a certain number.

Tell us what you would be gating. Two questions, and they decide what gets built next as much as they decide the queue. If your setup is one we can support properly today, you will hear back quickly; if it is not, we would rather say so than have you find out.

  • Your address goes in our own database and nowhere else.
  • Free for everyone let in at this stage, and you will hear it from us before that changes.

Already have an account? Sign in.

Which agent do you use most?
How many people commit to the repo?

Two questions because the answers decide what gets built next and who we can support properly today — not because a CRM wants them. No tracking pixels, no list rental, and we write only about the thing you asked for.