01 · Vault, declared
One repo. CI applies it. Nobody clicks.
Policies live under policies/ and auth roles under
roles/. Auth methods and secret engines sit
next to them. A pipeline plans on every MR. It applies on
the default branch, with a short-lived token from your own CI.
The assistant never applies anything. It reads the repository like any
other reviewer. It proposes changes through the same MRs
your team uses.
02 · Read it exactly
A small parser for a small grammar.
Vault policies are flat. Each has a path and a list of
capabilities. The assistant parses them with a focused,
dependency-free reader. The reader copes with either brace style. It also loads the role JSON, so every later check works on structure, not on
text matching.
On a real Vault setup with 14 policies and 4 roles, this reader and the rules below
produced zero findings. That clean baseline is the point. The assistant
speaks only when something is actually wrong.
03 · Capability hygiene
Write or sudo on an escalation surface.
The assistant flags a grant that gives sudo, or
create / update / delete, on a
path that controls Vault itself:
- near-root wildcards:
*, sys/*, auth/*
- the control-plane engines:
sys/, auth/, identity/
- audit devices
- CA and key management on
pki/, transit/, ssh/
A companion check catches broad read/list access on those same wildcard surfaces.
04 · Don't cry wolf
Least-privilege consumer paths are exempt, by name.
A service that issues certificates needs update on
pki/issue/<role>. That grant has the right scope.
It is not a finding. So the check fires on everything under the
consumer engines except a curated list of consumer leaves.
These leaves are issue, sign, encrypt, decrypt, creds, and the public read endpoints.
Anything not on that list keeps firing. This includes management verbs
that nobody thought to list. Key export and verbatim signing stay
off the list on purpose.
05 · Cross-reference integrity
A role that grants a policy that does not exist.
An auth role lists the policies that its tokens receive. If one of them is
missing from policies/, the role mints tokens bound to
nothing. Today that does nothing and gives no warning. The day someone creates a
policy with that name, it becomes an unreviewed grant.
06 · Findings go out as issues
Named path, named capability, "N of M paths".
Each finding says which file, which path and which capability. It also says how
much of the policy it concerns. It passes the same fail-closed safety
layer as the audit story. The assistant never flags or edits the protected root policy.
It never proposes anything that touches an audit device.
Lint findings are issue-only. The audit-driven policy widen from the
previous story can open draft MRs against this repository.
That path is in development. It is switched on, but as of October 2026 it
has not fired on a real production denial.
07 · Consistent with its consumers Roadmap
Planned: check Vault against the workloads that use it.
Planned: join the Vault repository to the cluster side. Take each ExternalSecret or agent-injected path. The policy that
its ServiceAccount gets through a Kubernetes auth role should allow that read.
Every role should also point at a ServiceAccount and namespace that still
exist.
Today the assistant sees Vault on the cluster side only as an External
Secrets backend. So this join is not built yet.
08 · Declared vs live Roadmap
Planned: compare git with what Vault actually runs.
The assistant could use a read-only Vault token (list and read on policies, auth methods
and mounts). It could then flag policies, roles or engines that
exist in Vault but not in git. This is the classic "someone fixed it in the
UI" drift. It needs a token that an operator provides, and it is not built yet.