Articles

Building around agents

Picture a startup that is eight months old. Two founders. Five human contributors if you count the part-time artist. And on a normal working day, thirty agent sessions: a coding agent refactoring the build, a research agent summarising competitor patch notes, one drafting store copy, another triaging playtest feedback.

None of those agents has a laptop. None is an employee. Most exist for less than an hour. But every one of them reads company material, and several of them write things that end up shipping.

The uncomfortable part is that the incumbent toolchain already lets those agents contribute. Git's author field is unverified free text; bots have been committing under typed-in names for two decades and nothing complains. An identity like that cannot be scoped to the one subtree an agent needs, cannot expire when the experiment ends, and cannot be revoked without taking a human's credentials down with it. The real divide is between identity that is merely asserted and identity that is verified, scoped, and expiring.

I live inside this question. I build Grixel, a server-authoritative version control and data platform, with AI assistance every working day, and the mechanisms in this piece are how the product itself gets built. When I describe an agent submitting a change under its own identity with its working transcript attached, I am describing my Tuesday.

So: if a growing share of your contributors are software, what should your system of record look like?

· · ·

#One filing room, one clerk

Grixel is deliberately Perforce-shaped, not Git-shaped. One global, server-authoritative namespace, with paths like /companies/acme/marketing. No clone; you mount a view of the subtree you need. The server daemon, grixeld, is authoritative for everything: metadata, permissions, storage, atomic changelist commits. The command-line client and the AI-facing server are thin; neither holds enforcement logic of its own. That shape matters here because it gives the whole company a single door, and a single door is the only place you can meaningfully govern a crowd of short-lived software contributors.

In everyday terms: think of the depot (the industry's word for the central store of everything) as the company's one filing room, with a clerk at the door. Every person and every hired robot gets its own stamp. Every paper that goes in is stamped with who filed it, and, if a machine typed it, which machine and which model of machine, with a carbon copy of the notes it was typed from clipped behind it in the same drawer. The drawers you're not cleared for don't appear in the index you're handed. And the clerk keeps one ledger of work to be done, which people and robots read from and report back to alike.

Contrast that with how a small company usually operates: a version control system, a forge for review, a tracker for the work, a secrets manager, a wiki for standards. Five systems, five permission models, five places where offboarding a contractor can be forgotten. Then an AI layer gets bolted across all five with access governed by none of them. The pitch of Grixel as a system of record is that a small team does not need five buildings. It needs one filing room where a permission, a pin, or a private drawer means the same thing to a human at the keyboard, a CI bot, and an agent speaking MCP (the standard socket AI tools use to read from external systems). I don't concede the forge layer to anyone in this design, GitHub included. The seam I care about is where review policy lives: on a forge it is hosting-layer configuration beside the repository, while here it is a committed gate evaluated by the server that owns the bytes. A gate, throughout this piece, means a server-enforced rule that nothing ships until the named people or checks have signed off on these exact bytes; a separate piece is entirely about them.

#Four decisions

Agents authenticate as themselves. The path of least resistance is to let an agent borrow its operator's token, and it is a mistake that compounds. Once history shows a human name on work a tool did, your audit trail is fiction; you cannot revoke the agent without revoking the person, and you cannot cut its access down to the one corner it needs. In Grixel an agent identity reads like a job description: read-scoped to the marketing subtree, expiring Friday. You will see the actual command below.

The AI's working context is captured with the commit. When a change looks wrong six months from now, the first question is who made it, and provenance answers that. The second question, once you know a model made it, is what did the model know at the time. Grixel lets a submit carry the session transcript or context bundle the assistant worked from, stored like any other content and attached to the commit the way the clerk's carbon copy is clipped behind a filed paper: bound to it without altering the paper itself, so capturing context never changes what the change is. Capture is per-submit and optional, and because transcripts can be sensitive they sit behind the same access rules as the commit, with client-side encryption for when even the server shouldn't read them.

One namespace beats five subscriptions. The real cost of five tools was never the invoices; it is permission drift, and agents multiply it, because every agent integration re-implements access control against each tool's API. With one namespace, "this agent cannot see the games subtree" is one rule, enforced at one chokepoint, inherited by every surface including the AI one. What you give up is diversification: one system to run, one system to trust. I'll come back to that honestly below.

Ingest the git ecosystem rather than fight it. The world's open source lives in git, and a startup builds on it from week one. So Grixel imports from git: snapshot a repository into a clean project and start hacking, or vendor a dependency read-only at a pinned revision inside your project, with the source URL, branch, and SHA recorded as provenance either way. The fetch happens client-side using your own local git, so the server needs no git and no outbound network. Arriving is cheap, and the lineage stays auditable.

· · ·

#An agent gets its own name

The transcripts below are real output from the current build, run in local mode against a scratch data root, which is why commands assert a principal with -as; in a team deployment you grixel login once and identity comes from the server-verified token. The names are demo principals.

Here is the hiring paperwork for a read-only marketing agent:

$ grixeld user add -name svc-store-copy -ttl 7d -scope ro
Added user "svc-store-copy" to ~/demo/data/users.yaml
  token id: 872d8784e038 (label "default", scope ro, expires in 168h0m0s)

  token: 45e4f62ec3b6765f4d9fb694bee31e7772b776a0842316fed2ee586564d25bb1

This token is shown ONCE. Give it to the user; they run:
  grixel login -server <url> -token 45e4f62ec3b6765f4d9fb694bee31e7772b776a0842316fed2ee586564d25bb1

One command. The token is read-only (scope ro) and lapses in a week (expires in 168h0m0s). To be precise: the scope and the expiry live in the token; which paths the agent can see at all comes from an access-list entry for svc-store-copy, the same list that governs every human. Hand the token to an assistant and this is its world:

$ grixel ls -as svc-store-copy /companies/acme/marketing
/companies/acme/marketing/
  store-copy-notes.md

$ grixel ls -as svc-store-copy /companies/acme/games
grixel: not found: /companies/acme/games

$ grixel submit -as svc-store-copy -ref companies/acme/marketing -m "agent tries to write" draft.md
grixel: submit: repo: write access denied: /companies/acme/marketing

The games subtree, where the unannounced work lives, simply does not exist as far as this principal can tell, and when it tries to write even inside its own patch, the server refuses. A second agent, provisioned with write access, commits under its own name and declares which tool and model it is (a ref is a project's named line of history, the address a change is filed under):

$ grixel submit -as svc-briefbot -ref companies/acme/marketing --tool claude-agent-sdk --model claude-fable-5 --role authored -m "draft spring sale copy" spring-sale-copy.md
Committed: dfc2057c38103ded02f0ed8737417d5ec99a5c6ea745399c142656142bd00745
  ref     : companies/acme/marketing
  changes : 1 files, 78 B
  stored  : 78 B new, 0 B deduped
  parent  : 8add2b73d4827d1a8d8fa7a2818bc067f0159300d3ede5bded43b7aaaba29e3a
  author  : svc-briefbot
  message : draft spring sale copy

$ grixel log -as bob companies/acme/marketing
commit dfc2057c38103ded02f0ed8737417d5ec99a5c6ea745399c142656142bd00745
  author : svc-briefbot
  date   : 2026-07-06 00:04:51 UTC
  files  : 1 changed
  made by:  [claude-agent-sdk/claude-fable-5 authored]
  draft spring sale copy

commit 8add2b73d4827d1a8d8fa7a2818bc067f0159300d3ede5bded43b7aaaba29e3a
  author : bob
  date   : 2026-07-06 00:04:51 UTC
  files  : 1 changed
  store copy notes

Read that as a non-engineer and it still lands: a human commit and a bot commit sit side by side in the same history, the bot under its own name, tagged with the tool and model that did the work. Nobody typed a human's name into a bot's paperwork.

Because the AI-facing surface inherits the same permissions, you can also preview exactly what an assistant holding that scoped identity would see over MCP (wiring Claude Code to a workspace is one command, grixel mcp setup):

$ grixel mcp preview -as svc-store-copy
MCP session preview — principal: svc-store-copy
(everything an AI assistant authenticated as "svc-store-copy" can see)

reach — file_tree(/), ACL-filtered (paths you can't see are simply absent):
  //
    companies/
      acme/
        marketing/  -> ref @ dfc2057c

governed context: no scope.json in this workspace —
  run from a checkout containing .grixel/scope.json to preview the AI context bundle.

The whole company, as seen by this agent's AI session, is one marketing folder. The note at the bottom is the rig being candid: this checkout has no scope manifest, so there is no context bundle to preview. That bundle is the next part of the story.

#What an agent reads

A project declares its knowledge dependencies in a scope manifest: brand voice, coding standards, vendored libraries, pulled from elsewhere in the namespace at pinned revisions. A pin is a committed note saying "this project uses revision X of that document." When an assistant's session starts, the MCP server assembles the bundle those pins describe, filtered through the same permission chokepoint you just watched refuse svc-store-copy. The model's context holds what the team reviewed and declared, at the revision they declared it, and nothing its principal cannot see. The surface is strictly read-only; there is no submit tool on it anywhere. When an agent wants to change something, it goes back out through the command-line client, under its own identity, through the same gates as everyone else. Another piece walks through a full context bundle line by line.

#What an agent writes

A submit can declare its attribution: which tool, which model, in what role. The marketing bot did it under its own service identity; in a human's assisted session the assistant tags the commits it helps with automatically through an environment variable, GRIXEL_ATTRIBUTION, with no extra flags. (This attribution is declared by the tool about itself; nothing verifies it yet, and I'll come back to that.) Query an assisted commit and the record answers with the tool, the model, and the role:

$ grixel provenance -as maya 9c80ad050744013231cdcf05e1d5856a866ac1843e05b81c6ee0cdd4107ab498
9c80ad05  (declared by alice, 2026-07-05T23:32:41Z)
    claude-code (claude-opus-4-8) — assisted: drafted from quest brief

In grixel log, that commit carries a compact tag on its own line, made by: [claude-code/claude-opus-4-8 assisted], so anyone reading history can tell an AI-assisted change from a hand-written one at a glance, and grixel blame separates a machine-authored baseline from later human edits line by line.

The next step is the one I think AI-heavy teams will come to treat as table stakes: capturing what the assistant was working from, alongside the change it produced. It rides the same submit, via a -context-file flag or by capturing the live Claude Code session directly, and the provenance record then carries it:

$ grixel provenance -as maya c51e37e50e0db4739729130ecdc8597873158e5e7f20a1f64058a32020adb723
c51e37e5  (declared by alice, 2026-07-05T23:32:42Z)
    claude-code (claude-opus-4-8) — assisted
      context captured: transcript, 191 B (d50c05c7) — read with 'grixel provenance context <commit>'

Months later, "how did this line come to be" is a command:

$ grixel provenance context -as maya c51e37e50e0db4739729130ecdc8597873158e5e7f20a1f64058a32020adb723
# Session: festival dialogue draft
user: draft the lantern keeper's opening line from the quest brief
assistant: reading .standards/brand/voice.md — playful, concrete, players are "you"...

An encrypt flag seals the captured context client-side so the server itself cannot read it. For a startup that expects to face a customer's security questionnaire, or a regulator, or its own post-mortem, this is the difference between "an AI was involved somehow" and a record you can actually stand behind.

#One backlog for people and agents

A system of record has to track the work as well as the files. Grixel's jobs are a modern take on Perforce's: lightweight tickets anchored to a path in the namespace, which means the access rules apply to them too. A job filed under a hidden project is itself invisible to anyone who can't see that project. The ticket types and their status flows come from your own admin-editable spec, with no methodology vocabulary baked in. Below, maya has filed job000001, a bug on the seasonal project, assigned to alice. A fix cites the job it resolves, and the ticket and the exact commit that closed it stay linked in both directions:

$ grixel submit -as alice --job job000001 -m "fix seams on hero texture"
grixel: holding exclusive lock on /companies/acme/games/seasonal/art/keyart_main.psd (lockable type)
Committed: 4bb92aee3ed1c442e92da6ecc482c0561231ca0631fdb91a4dfce77f90caf507
  ref     : companies/acme/games/seasonal
  changes : 1
  stored  : 5.1 MiB new, 58.9 MiB deduped
  parent  : ad439db18fa79626577df2f8f35dd4225e7a131a325034bb135e1bc1731582bf
  base    : 4bb92aee3ed1c442e92da6ecc482c0561231ca0631fdb91a4dfce77f90caf507 (advanced)
  jobs    : 1 cited

Two commands make this backlog agent-shaped: the worklist and the events feed. The worklist is what an agent (or a person) gets when it asks "what should I pick up":

$ grixel jobs -as alice --mine
assigned to me (1):
  job000001  bug        fixed        Hero texture seams on consoles
available (unassigned) (1):
  job000002  task       open         Spring festival content drop

The events feed is what automation polls; jobs are event-sourced, so many actors editing at once don't clobber each other:

$ grixel job events -as maya
2026-07-05T23:32:40Z  job000001  created maya     bug "Hero texture seams on consoles" [open]
2026-07-05T23:32:40Z  job000002  created maya     task "Spring festival content drop" [open]
2026-07-05T23:32:40Z  job000001  link    maya     link parent job000002
2026-07-05T23:32:41Z  job000001  link    alice    link commit 4bb92aee3ed1c442e92da6ecc482c0561231ca0631fdb91a4dfce77f90caf507
2026-07-05T23:32:41Z  job000001  status  alice    → triaged
2026-07-05T23:32:41Z  job000001  status  alice    → fixed
next cursor: 1783294361490152000

The next cursor line is the bookmark your automation polls from: hand it back on the next call and you receive only what happened since. Agents read this backlog through the read-only MCP tools and write back through the authenticated command line. One ledger of work, under the same permissions as the code it describes.

#Secrets, and the honest limits of hiding things

Small companies want their .env files versioned and backed up, and agents sharpen the want. But secrets are short and guessable, and a content-addressed store has a property you should hear from me rather than discover. Deduplication accounting is global: submit some bytes and the stored ... deduped line reports whether those exact bytes existed anywhere before. That is an oracle, and it is precisely why per-user secrets are encrypted on your own machine before they ever leave it. The ciphertext is freshly randomised every time, so it never dedups against anything, and it is size-padded, so even the length of what you're hiding doesn't leak. The oracle gets nothing. For content that is merely private (Grixel also has self-service private folders, hidden from everyone but you and the admins), the working files are ordinary high-entropy material where byte-guessing isn't practical. And for hidden paths in general, the most the oracle could ever confirm is that some exact bytes the guesser already possesses exist somewhere in the depot: never a path, a name, or any content.

$ grixel secret push -as alice
⚠ no escrow recipient configured — if you lose your key, these secrets are UNRECOVERABLE.
  set one: 'grixel key gen-escrow -out <file>' then 'grixel secret set-escrow <recipient>'.
Encrypted + pushed 1 secret(s): .env

$ grixel secret status -as alice
encrypted secrets (1):
  .env             pushed, decryptable by you

That warning is the tool telling me to configure an escrow recovery key, which my demo depot hasn't. A secret can also be granted to extra recipients or to service identities, so CI decrypts with its own key instead of a copied human one. "Decryptable by you" is the property the whole feature exists for: not by an operator reading raw bytes off the disk, and not by the server.

#Grab it from the git world and build on it

Here is the arrival story. An upstream repository, snapshotted into a clean Grixel project with one command; your local git does the fetch:

$ grixel import -as bob ~/demo/work/upstream companies/acme/tools/noise noise-ws -m "import noise lib" -y
fetching ~/demo/work/upstream …
Imported ~/demo/work/upstream into project companies/acme/tools/noise
  source    : ~/demo/work/upstream (master) @ 37bfc8f1
  commit    : 0228934870ba171543d09ea8def6fc430878dd97adab998254d90e4988e70ffd
  files     : 2 (131 B)
  workspace : ready — 'grixel status' works here; 'grixel blame' separates your edits from the import

$ grixel log -as bob companies/acme/tools/noise
commit 0228934870ba171543d09ea8def6fc430878dd97adab998254d90e4988e70ffd
  author : bob
  date   : 2026-07-05 23:32:43 UTC
  files  : 2 changed
  made by:  [git-import]
  import noise lib

The import itself is provenance: made by: [git-import], with the source, branch, and SHA on record. For a dependency you don't intend to edit, vendoring pins it read-only inside your project, and updating it later is an explicit, reviewable re-pin rather than a silent drift:

$ grixel vendor update -as alice noise
fetching ~/demo/work/upstream …
Re-pin "noise" from 37bfc8f1 to fa3078b7 (master) — 1 changed file(s), 0 deletion(s)? Continue? [Y/n] Updated "noise"
  re-pinned : 37bfc8f1 → fa3078b7 (master)
  mounted   : vendor/noise (read-only, pinned)
  ref       : companies/acme/games/seasonal-vendored/noise @ 2fccf980
  changed   : 1 file(s) (126 B), 0 deletion(s), 1 unchanged
  scope     : 0fc058b00345fb50caab34601935c49281e4c6b28b7a535fd853f4eb76a09898

That vendored library then shows up in a project's governed context at its pinned revision, so what your agents see of the open-source world is governed like everything else. And because files of any size are first-class here, chunked and deduplicated by content, there is no Git LFS bolt-on to configure when the thing you're building on includes real assets.

#Scriptable from day one

The last piece is quieter but it carries the others. Every Grixel command takes a --json flag and emits a frozen, versioned output envelope: a schemaVersion, a data payload, and structured errors with stable codes. That contract is what a two-person team automates against before any marketplace of integrations exists: a cron job watching review status, a bot filing a ticket when a mapping drifts. Underneath it sit a public, stable gRPC interface and first-party Go and Python SDKs generated from it. The command line the agents write through is a machine interface on purpose.

· · ·

#Where this can hurt you

Making a pre-release depot your company's system of record is a serious act of trust in a young product. I won't dress that up, so here is what limits the exposure. Your data sits on your own disk, in a single server process you run. The operator backup command takes an exclusive lock on the data root, so today a backup means briefly stopping the server or snapshotting the filesystem underneath it; because chunks are immutable once written, incremental backups are clean, and grixeld verify integrity-checks the store. Arriving is cheap because git import exists. Leaving is scriptable because the --json contract, the public gRPC interface, and the Go and Python SDKs can read everything out, though, to be equally precise, no purpose-built export-to-git tooling exists today, so departure would be a script you write, not a button you press.

There is no web UI. A non-technical co-founder works through the command line or through an AI assistant reading the depot over MCP, and what such an assistant sees is exactly the governed view previewed above for svc-store-copy. If your co-founder needs a graphical review queue today, this is not that.

Provenance is declared, not cryptographically attested. The design keeps attribution in that clipped-behind side-record precisely so server-verified attestation can be added later without rewriting history, but today a tool that wants to lie about which model it is, can. What you get now is honest actors leaving an honest trail, which is most of the audit value and none of the adversarial guarantee.

And the ecosystem is thin. Git enjoys two decades of CI templates, badges, editor integrations, and dashboards. Here you will write glue. The frozen JSON contract and the SDKs exist to make the glue short, but short glue is still glue you wrote and maintain.

· · ·

The assumption underneath the incumbent toolchain has quietly expired: an author line you can type anything into is no longer an identity. A company that builds with agents from day one needs them named and scoped, on credentials that lapse by themselves, reading governed context, writing through the same gates as the humans beside them, and leaving a record of what they knew. I want that to be one system instead of five, so that is what I'm building, and what Grixel itself is built inside of. The svc-store-copy token minted earlier in this piece has, as I write, under a week left to live. When it lapses, nothing needs cleaning up, and nothing it did was anonymous.


Grixel is pre-release. Read the docs, or request early access.