THE SHORT ANSWER
What could your agent reach?
Because a permission granted once keeps applying, and nothing in the agent's world re-asks whether it should. An authority failure is a permission that reaches further than intended: the agent can do something you never meant to allow, and nothing refuses. Two of the 23 can be prevented outright, fourteen can be caught every time, and seven cannot be closed by anything available.
Your agent has access to a terminal, your logins and a repository. What is actually stopping it from making changes to production?
This is a well-trod path in the human world. Provisioning, least privilege, segregation of duties, dual sign-off: most of the institutional machinery transfers to agents intact.
All of it rests on one precondition. Somebody knows what was granted. A new hire is not handed a keyring and told that some of these open the safe. Access is issued deliberately, per role, and both sides can name it.
That precondition is the thing an agent breaks. It does not authenticate as itself. It runs as you – your shell, your keychain, your active logins, whatever the last supabase link pointed at – and nobody has ever written down what that adds up to.
Which is why the human self-repair loop is no help here. You learn from deleting the wrong file. You learn from being pulled up on a rule you broke. Nobody learns from exceeding permissions they never knew they had, because nothing tells them it happened.
So the controls transfer and the precondition does not. You are not giving the agent less permission. You are finding out what it already has, and moving the limits somewhere it cannot edit them.
What this register does
An authority failure is a permission that reaches further than the person who granted it intended: the agent can do something you never meant to allow, and nothing refuses. The authority register names 23 of them. Two can be prevented outright. Fourteen can be caught every time. Seven cannot be closed by anything currently available. The register carries 16 evidenced rows and seven candidates – the highest evidenced share of the six registers, because its rows were read off a live security register – and the hub's headline counts count evidenced rows only.
What decides your exposure is where each control lives. Only 11 of the 23 are enforced somewhere the agent cannot reach. The other 12 rest on a file, a habit or a login it can change. That is where the register's one working rule comes from: a boundary the agent can edit is not a boundary, it is a preference.
This is a technical page listing every row in the register and what it costs, what closes it (if anything). It sits under the hub. Its neighbours are can you get it back?, which asks what happens once a change has landed, and can you believe your agent?, which asks whether its account of the work can be trusted.
Many of the controls on this page are standard software engineering – server-side rulesets, required checks, least-privilege credentials – and experienced engineers already run some of them.
What the register adds is the failure behind each control: which failures are prevented, which are only detected, and which ones nothing closes. This shows where your remaining gaps are.
THE DEFINING FINDING
Only 11 of the 23 are enforced somewhere the agent cannot reach. The other 12 rest on a file, a habit or a login it can change.
The question this register asks
What could it reach? The unit this register tests is a permission:
- A database grant nobody approved, created the day the function was created.
- A credential the session happens to hold because you were logged in.
- A deny rule in a settings file the agent can also edit.
- A required check sitting on the pull request rather than on the branch.
The register follows a permission through five stages of its life.
- Was the boundary written down?
- Does the grant match the job?
- Is there a route around it?
- Will anything refuse?
- Does it outlive the reason it was granted?
Each row is one way a stage fails. Every row is then graded three ways: what the failure costs, how silently it happens, and whether the control lives inside or outside the agent's reach. A control the agent can reach is a control it can bypass.
The ambient-authority fact above has a name in the security literature, and it is older than agents. Nothing in a session asks what your machine's authority adds up to, and the practical answer is almost always "more than the task needed".
Ambient authority has always been how developer machines work. What has changed is that the thing holding it now acts on its own initiative, at speed, across paths a person would not have opened.
What an authority failure looks like
A WORKED EXAMPLE / AL-3C
Here is one from our own build.
Here is one of the nine rows on this register with a dated first-party incident behind it, from our own build in August 2026. It is a common scenario in multi-session coding, which is becoming the default way agents are used for software development.
Two agents worked the same repository at once. Each had its own Git worktree, which is standard practice and looks like separation. Both trees sat on the same writable filesystem, and each agent could reach the other's by absolute path. A file one agent had deliberately deleted came back. Neither session had any way to know the other was writing, because nothing anywhere told it.
The instructive part is what was not misconfigured. The worktrees were created correctly. No flag was bypassed. The separation was real in the sense that the default paths differed, and yet also worthless: no boundary was enforced anywhere either agent could not reach.
That is failure AL-3C on this register – a second session writing underneath the first, one you did not start – and it is diagnosed as Class C – survives: nothing catches it every time, so it reaches you. There are no settings that prevent it and no checks that detect it.
Worktrees reduce accidental collisions. They are not an authority boundary between two writers. The row stays open until a lock, a broker or an externally enforced write boundary exists. The same afternoon is carried by two other registers. The recovery register holds it as RL-1E, two agents in a fan-out you started wrote the same tree at once, which is irreversible. The provenance register holds it as PL-6C, two agents conflict and one overwrites the other, so a correct change silently disappears from the record.
TWENTY-EIGHT FUNCTIONS / EACH PINNED BY A POSTURE TEST
Why nothing catches this while it is happening
Two facts about this register decide where its controls have to go.
- Authority is a property of the mechanism, not of the grant. A rule the agent can edit changes how often a boundary is crossed. It never changes what happens when that boundary is crossed. Telling an agent not to touch production is an instruction. Making production unreachable is a boundary. The register grades boundaries, not instructions. A settings file is bypassable. A server-side ruleset is not. That is the only difference that survives contact with a session that wants to get past it, and it is why both of this register's Class A rows are rules stored on the server and not locally.
- Nothing here is caught while the session is running. This is when you can detect these failures: four rows are catchable before the session starts, three before the change lands, zero during the session, and 16 only after it has finished. Authority is settled in advance or discovered in retrospect.
Put together, those two facts say something specific about where to build controls for this register. Watching a session more carefully buys you nothing on this register, because there is no in-session catch point to watch. But if you move each row left and decide the boundary before the agent starts, then you can put the opportunity for failure beyond the agent's reach.
Severity here is measured as the cost of a failure multiplied by how silently the crossing fails. Ten of the 23 rows are S4 – it ships and nobody finds out – and exactly one is S1, a default grant that is visible the moment it is created.
How this register works
The authority register lists 23 failures and grades them against a base install: an agent running on a developer machine with the usual logins, a repository and a CI pipeline.
It then names the strongest mechanism available against each, and says whether that mechanism sits inside or outside the agent's reach. Whether any of them is actually switched on is a separate question, and one you answer against your own configuration. The whole catalogue is published on GitHub – clone it or download the zip.
The rows were derived by working through the life of a permission, stage by stage, and asking at each stage what could reach further than intended. Every register in this framework is built that way rather than from an incident log, because selecting for "we have seen this go wrong" filters out the failures that occur silently – and on this register that is most of them.
This register was read on 6 August 2026 against a production security register, and every row either happened there once or is a control gap recorded against it. That is a stronger claim than the other five registers can make about their rows collectively, and a weaker one than it sounds: it means the row set is drawn from real exposure, not that each row has a dated public incident behind it. On this page, only one row of 23 is backed by a dated incident.
Read the classes and the bypassable count rather than the incident count.
The life of a permission: five stages and an assurance band
Rows are grouped by how far a permission has travelled when the failure bites.
- Granted – is the boundary written down at all? Whether the grant exists as a policy rather than as an intention, and whether anything knows what the machine can reach. Six rows.
- Scoped – does the grant match the job? Whether the session holds what the task needs or what the person happens to have. Three rows.
- Reachable – is there a route around the gate? Whether a local credential, a flag or a second session goes around the control entirely. Three rows.
- Enforced – will anything actually refuse it? Whether a control refuses, asks nicely, or checks a different question than the one that matters. Five rows.
- Held – does the boundary survive the session? Whether the grant expires with its reason, and whether children inherit more than their brief. Three rows.
Cutting across all five is an assurance band, Checked – would you find out that it crossed? Three rows. Each row asks whether you would ever learn that a boundary had been crossed, which is a different question from whether it holds.
The three classes: prevented, detected and survives
Every row carries one of three classes. The class describes how complete the available remedy is, not how serious the failure is.
- Prevented – the failure cannot occur (two rows). Something refuses, from outside the agent's reach. Both rows here are the same shape: a server-side rule with no local bypass. A ruleset on the server rather than a hook on the machine. A required check on the destination branch rather than on the polite route. On this register, prevention has only ever come from a control the agent has no access to.
- Detected – it occurs and something catches it every time (14 rows). Mostly CI, and mostly ordinary: a guard that diffs the stated grant against the shipped one, a test that writes the forged value and expects refusal, a lint that fails a new function with no explicit revoke.
- Survives – nothing catches it every time, so it reaches you (seven rows). An inventory of what the machine can reach. A credential scoped to the task rather than to the person. A lock between two sessions writing one repository. A deny rule for a read-only pass instead of a request for restraint. An audit log the audited system cannot drop. A way to tell a sanctioned change from a breach. And a prompt-level limit, which survives because a rule in an editable file is not a boundary however firmly it is worded.
So the score is two prevented, 14 detected, seven surviving.
Now the cross-cut. 11 of 23 controls are unbypassable – enforced beyond the agent's reach. Eight are bypassable: a local hook, an editable settings file, a habit. Four have no mechanism at all. Sort by class and this register looks well covered, because 14 rows are detected.
Sort by authority and it looks more concerning: more than half the register rests on something the agent could change if it decided to.
The two views disagree because they measure different things. A detected failure with a bypassable control is not a caught failure. It is a caught failure provided the control was still there at the time, and nothing on this register checks that.
Vocabulary: this register reads its three classes as prevented, detected and survives. Five of the six use these words, and the class letter means the same thing everywhere – how complete the remedy is. [A note on vocabulary] on the hub covers the one exception and the three things still unreconciled across the framework.
Interviews, registers and essays. Free.
What to install
Start from a base install and add in this sequence. Settings and server-side rules first, then CI, then the decisions – which is also the order of increasing cost.
- Put the rule on the server, not on the machine. A ruleset with no bypass for the person who wrote it. This is one of only two things on the whole register that prevents rather than detects, and it takes minutes.
- Gate the destination, not the route. Required checks belong on the branch that deploys, not on the pull request. A change that goes straight to main runs nothing if the gate was attached to the polite path.
- Unlink the local credential and deploy only from CI. As long as a machine holds a credential that talks to production directly, every gate you build sits beside the road rather than on it.
- Diff the stated grant against the shipped one, in CI. Comments drift from grants immediately and silently. So do generated docs. The only version that matters is what the database will actually do.
- Revoke explicitly; never inherit a default. The cheapest row on this register is a default grant nobody chose. Lint it: a new function with no explicit revoke fails the build.
- Test each control against a case it must catch. Replay the guard pattern against real history. A control that has been green since the day it was written has never been observed doing anything.
- Give each subagent its own tool list. A child that inherits the parent's authority has a brief but not a boundary.
- Bound each grant to the window that justified it. Expiry is a property you can test for; "we will tidy it up later" is not.
- Then the seven that survive. An inventory of what this machine can reach. A credential scoped to the task. A lock between two writers. A deny rule, outside the agent's reach, for anything you meant to be read-only. Five of the seven are about limiting reach before the agent acts; two are about being able to tell afterwards what it did.
Run the free trust-check tool to find out which of these you already have. Or start without it: move one local rule to the server this afternoon. It is the only move on this list that converts a failure from detected to impossible.
THIS PAGE IS A VIEW, NOT THE RECORD
Generated from the register at commit f179130, last updated 2026-09-01. The register file is canon; this page is a rendering of it. Where the two disagree, the register is right.
OPEN THE CURRENT REGISTER →Who this is written for
This page assumes a developer's setup. The mechanisms below are written for an agent with hooks, a git repository, plain-text notes carrying a frontmatter schema, and a CI pipeline. The reference implementation is a markdown second-brain vault, which is where these rows were derived. If that is your stack, everything here is directly installable as written.
If your work sits in Microsoft 365, Google Workspace, Confluence or Notion, the failure is identical – a permission that reaches further than you granted is the same failure anywhere – but the mechanism is not. Role assignments and privileged-identity management stand in for a least-privilege credential, conditional access for a server-side ruleset, a scheduled access review for the expiry check. A few rows are native to a repository and have no clean equivalent: the branch ruleset, the required check bound to the branch rather than the pull request, and the grant-diff in CI are the clearest of them.
Those mappings are not published here. Enterprise mapping is available on request.
How to read each row
Every row in every register in this framework is described the same five ways. This register adds a sixth.
- Stage – how far the permission had travelled when the failure occurred.
- The failure – what goes wrong, and the sentence you actually hear when it does.
- Severity – cost multiplied by how silently it fails. A judgement, not a measurement.
- S1 visible at once
- S2 caught at review
- S3 real damage, found late
- S4 it ships and nobody finds out
- Class – how complete the available remedy is.
- Prevented: the failure cannot occur.
- Detected: it occurs and something catches it every time.
- Survives: no available remedy closes it.
- Authority – this column is unique to this register.
- Unbypassable means the control runs beyond the agent's reach.
- Bypassable means a login, a local hook, or a file the agent can edit.
- None means there is no mechanism to classify.
- The fix – the mechanism, and where it has to live.
Nine rows on this register carry a dated first-party incident – AL-3C's is told in full above, and the others are marked Seen here: Recorded in the row list below. The other 14 do not, or not that we know of. See "How this register works" for why that number is low here and how the register was grounded instead.
Nothing on this page says whether a control is switched on in your setup. The register states that nine of its 18 tooled rows are not built in the codebase it was derived from, which is exactly the difference between a mechanism existing and a mechanism running.
How to test your own setup
The register describes what is available. Whether any of it is running on your machine is the other question, and you answer it by working down the rows below against your own configuration. The same rows are on GitHub as plain markdown, if you would rather read them in your editor or diff them into your own notes.
Two things reading the rows will not tell you. What your machine is currently logged in to – that is AL-1A, and nothing reads it. And whether a change that crossed a boundary was sanctioned or not, which is AL-6C, and is a decision record rather than a setting.
STAGE 1
Granted: is the boundary written down at all?
None prevented, four detected, two survive. Every row here is about the gap between what somebody meant and what the system will actually do
AL-1AS4SURVIVESNO MECHANISM
“It had the token because you were logged in.”
Nobody listed what the session can reach. It appears the first time you ask what an agent could have done, and find that the answer is the union of every credential on the machine.
AL-1BS2SURVIVESBYPASSABLE
“I told it not to touch production.”
The limit lives in the prompt, not in a policy. It appears in every project that writes its boundaries into a rules file and treats that as the boundary.
AL-1CS3DETECTEDUNBYPASSABLE
“The comment says service_role only.”
The comment and the grant say different things. It appears wherever access is documented in one place and applied in another.
AL-1DS1DETECTEDUNBYPASSABLE
“PUBLIC could run it the day it was created.”
A default grant nobody approved. It appears at creation time, silently, because the default is permissive and nobody looked.
AL-1ES3DETECTEDUNBYPASSABLE
“Row security never gets a say in this call.”
A definer-rights function runs with its author's privileges, not the caller's, so the row-level policies that would have applied to the caller are never consulted. It appears wherever such a function sits between a caller and a table, bypassing the row policies everyone assumes are in force.
AL-1FS2DETECTEDUNBYPASSABLE
“Created already revoked, in someone else's name.”
A column the policy never constrains. It appears when a record can be written with a field the policy does not check, so the row is valid and wrong.
AL-2AS4SURVIVESNO MECHANISM
“Read-only work, write-capable credentials.”
The session holds more than the task needs. It appears in essentially every session, because credentials are scoped to people and tasks are not.
AL-2BS4DETECTEDUNBYPASSABLE
“Admin can, so the rule does not apply.”
One admin flag bypasses the whole rule. It appears wherever an exception was implemented as a role rather than as a policy.
AL-2CS4DETECTEDUNBYPASSABLE
“Descent reaches further than you thought.”
A reach path across tenants nobody tested. It appears where a hierarchy exists and the isolation matrix has gaps in it.
STAGE 3
Reachable: is there a route around the gate?
AL-3AS4DETECTEDBYPASSABLE
“It never went near a pull request.”
A local credential routes around every gate. It appears wherever a machine can talk to the deployment target directly.
AL-3BS3PREVENTEDUNBYPASSABLE
“--no-verify, and the hook is gone.”
A local guard that one flag defeats. It appears the first time a commit is in a hurry.
AL-3CS4SURVIVESNO MECHANISM
“The file I deleted exists again.”
A second session writing underneath the first – one you did not start. It appears in any repository worked by more than one agent at a time. This is the row behind the August 2026 incident told above.
STAGE 4
Enforced: will anything actually refuse it?
AL-4AS4PREVENTEDUNBYPASSABLE
“Straight to main, so nothing ran.”
The gate runs on the route it did not take. It appears the first time a change reaches the destination by a path the checks were not attached to.
AL-4BS4DETECTEDUNBYPASSABLE
“It shipped a test with it, so it passed.”
The check asks a different question. It appears where a gate measures diligence rather than authorisation – tests present, description filled in – and passes a change that alters a grant.
AL-4CS3SURVIVESBYPASSABLE
“You asked for a report; it wrote a migration.”
Asked for a report, it edited the repository. It appears whenever a read-only request is expressed as an instruction rather than as a permission.
AL-4DS4SURVIVESBYPASSABLE
“An owner can drop the trigger.”
The log's guard can be dropped by what it logs. It appears wherever the audit trail is defended by the system it audits.
AL-4ES2DETECTEDBYPASSABLE
“Review required, zero reviewers required.”
The approval gate with nobody to approve. It appears where a pull request is required and the required-reviewer count is zero, so the ceremony runs and nothing is reviewed.
STAGE 5
Held: does the boundary survive the session?
None prevented, three detected, none survive. The only group on the register where every row has a complete remedy
AL-5AS3DETECTEDUNBYPASSABLE
“Still visible long after they left.”
The grant outlives the reason for it. It appears months after the access was justified, which is why nobody connects the two.
AL-5BS2DETECTEDBYPASSABLE
“The child could write what the parent could.”
A subagent inherits more than its brief. It appears in every fan-out, because the child gets the parent's tools by default and the brief is not a boundary.
AL-5CS3DETECTEDBYPASSABLE
“We decided to live with it, once.”
An accepted risk becomes a forgotten one. It appears whenever an acceptance is recorded without a date to revisit it.
ASSURANCE
Checked: would you find out that it crossed?
None prevented, two detected, one survives. Not a sixth stage. These rows cut across all five above and ask whether a crossing would ever reach you
AL-6AS4DETECTEDUNBYPASSABLE
“Green from the day it was written.”
The control was never watched failing anything. It appears in every audit and no incident: a guard that has never refused anything is indistinguishable from a guard that cannot.
AL-6BS3DETECTEDBYPASSABLE
“Its files-changed list left one out.”
The tool's own account is the only record. It appears wherever the agent's summary of what it touched is taken as the record of what it touched.
AL-6CS3SURVIVESNO MECHANISM
“It was approved; nobody checked the log.”
Crossed and sanctioned look identical. It appears during any review of access history, where an approved exception and an unapproved crossing produce the same entry.
The fixes: dedupe view
Server-side ruleset, no bypass
Refuses the action from outside the agent's reach, including for the person who configured it.
Unbypassable. Hosted Git rulesets.
Required checks on the destination branch
Attaches the gate to where the change lands rather than to the route it politely took.
Unbypassable. Branch protection.
Grant-versus-doc diff in CI
Compares the stated grant with the one that ships, so a comment cannot drift from behaviour.
Unbypassable. Any CI.
Explicit-revoke lint
Fails the build on a new function that relies on a permissive default.
Unbypassable. Pre-commit.
Definer-function inventory
Lists every function that runs as its author, and who may call it.
Unbypassable. Any CI.
Behavioural isolation suite
Writes the forged value, asserts refusal, and holds a cell for every reach path including the assumed-impossible ones.
Unbypassable. pgTAP or equivalent.
Deploy only from CI, local credential unlinked
Removes the direct route from a machine to the deployment target.
Bypassable – unlinking is a habit, not a refusal.
Reviewer count above zero
Turns a required pull request into a reviewed one.
Bypassable. Branch settings.
Per-subagent tool lists
Gives a child its own authority rather than inheriting the parent's.
Bypassable – the list is a file the agent can edit.
Acceptance with a reopening trigger
Puts a date on every risk somebody agreed to live with.
Bypassable. A register field.
Repository diff in place of the agent's summary
Reads what changed from the history rather than from the account of it.
Bypassable – nothing runs it for you.
Deny rule outside the writable surface
Refuses a write on a read-only pass, instead of asking the agent to hold back.
Does not close AL-1B or AL-4C while the rule lives in a file the agent can edit.
Off-platform audit log
Moves the record beyond the reach of the system it records.
Does not close AL-4D while the log stays on the platform that writes it.
Things with no mechanism
An inventory of what the machine can reach · a credential scoped to the task · a lock between two writers · a way to tell sanctioned from breached.
No tooling exists. Three limit reach before the act; one tells you afterwards.
GROUNDING
Grounding, per the project's claim discipline: these counts and classes come from one production security register and one coding-agent harness, read row by row on 6 August 2026, where every row either occurred once or is a recorded control gap. Install-state markers are provisional: nine of the 18 tooled rows are not built in the codebase this was derived from. It is not a universal benchmark.
› Next register: Can you trust the record of what your agent did?› Back to the False Floors hub