Overview
Built mostly by a coding agent
Tenant isolation as a build requirement
- A tenant-scoped database client. Feature code goes through a client that injects the store filter automatically, and a guard throws at startup if a model has a store column but was never registered as tenant-owned.
- A static check on every push. It inspects data access and fails the build on any query that reaches around the scoped client without a written reason, alongside a migration compatibility check that catches schema changes that would break the running app mid-deploy.
- A review skill for what the static check cannot see. Before any database change is committed, the agent reviews it for the blind spots: a client bound inside a transaction callback, a hoisted filter that sets the wrong store, an exception whose written reason is no longer true.
Keeping the agent out of trouble
- Production access goes through one committed command-line tool that resolves credentials itself, so the agent never sees one.
- A pre-tool hook blocks any command that would read the contents of a secret file.
- The agent's permission list went from 662 rules to 62, with deny rules for the old patterns.
- The instructions file became a short index into the docs. It used to point every session at a single 861 KB log file, about 210,000 tokens, before any work could start.