Capability is not permission
What an agent can do and what it is allowed to do are kept apart. A capable agent still needs the right tier, and the highest tier belongs to the owner alone.
A governance layer for a team of AI agents: a git repository as shared memory, event-sourced state that changes only on independent verification, and a five-gate security CLI.
Several AI agents (including Claude Code and Codex) work on the same projects, and each run starts with no memory. They need shared state, they must not overwrite each other, and no agent should be able to mark its own work done or take a sensitive action on its own say-so.
01
Every agent run starts by reading the repository's rules and current state. A registry gives each agent its capabilities and a maximum permission tier, from read-only up to owner-only.
02
Agents never edit a task's status. They append events such as 'claimed' or 'completed' to a daily log; the earliest verified claim wins and later ones are flagged as conflicts.
03
An event changes state only when a different party verifies it with evidence. Approvals and rejections must come from the owner and point to a real decision.
04
A pure reducer applies a fixed table of transitions to the ordered event log, so the same events always produce the same state. Events with bad timestamps are quarantined, and unverified events stay claims.
05
Untrusted content is wrapped and scanned for injection, hidden text, and scams. External actions are checked against hard-deny rules, approval rules, quotas, and domain lists; outbound text is scanned for secrets and identity numbers; and every gated action is audited.
06
Money, contracts, and identity are owner-only. An approval must reference a real decision or source message; a bare 'yes' or 'ok' is refused.
07
CI runs a secret scan, the guard tests, and the full test suite, then rebuilds the state projection and fails if it differs or contains quarantined events.
08
The Command Center is a read-mostly view behind an authenticated session. Unverified items are labelled as unconfirmed claims, and approvals never happen from the dashboard itself.
What an agent can do and what it is allowed to do are kept apart. A capable agent still needs the right tier, and the highest tier belongs to the owner alone.
There is no git-level lock. Events are ordered deterministically by timestamp, file, and line, and conflicting claims are flagged for the owner instead of silently resolved.
A later revision fixed a gap where an agent could name its own verifier. Verification now has to come from a different party with non-empty evidence.
Python · pytest · Next.js · TypeScript · GitHub Actions · JSONL event log · JSON Schema