Agent access register

Generated 2026-10-21 12:48:52 ยท 11 agents in the registry ยท policy: Acceptable-use policy for scheduled agents (Adopted 2026-10-03 by the fleet owner, with edits to the 2026-10-02 draft. Rule AUP-05 (work systems) was considered and dropped, so the numbering skips it.)

Config allows, policy forbids

Declared access: it's in a settings file, a task approval, or the registry. Nothing here is a guess.

AUP-01GovernEvery agent is registered, with a named model and an explicit permission mode

AUP-02GovernNo agent runs with permission checks off

AUP-04MapAn agent runs from its own project folder, and no credential store sits inside it

AUP-06MeasureNo secrets in instructions or allow rules

AUP-08ManageCredential files are off the allowlist and on the deny list

AUP-09ManageNo wildcard interpreter in an allowlist

AUP-10ManageAgents message only through the approved channels

AUP-11ManagePublishing is a person's decision

AUP-12ManageDeleting is a person's decision

Instructions ask for what policy forbids

Inferred from each task's SKILL.md and the scripts it runs. Whether config would let these through isn't known for agents in auto mode, so they're kept apart from the list above.

AUP-10ManageAgents message only through the approved channels

AUP-11ManagePublishing is a person's decision

11agents registered
10enabled
7can send or publish (declared or inferred)
5credential stores on disk
2instructed, policy forbids
16kinds of access policy is silent on
auto 9 ยท bypassPermissions 1 ยท unset 1permission modes

Shared config: what every agent under it inherits

Allow rules aren't per-agent. Each settings file below applies to every agent listed against it, so its rows aren't repeated in the per-agent table.

Settings fileApplies toRulesWhat stands out
~/.claude/settings.jsonall agents8 allow ยท 0 deny ยท 0 ask
Bash 3, Read 2, Edit 2, mcp 1
  • default mode auto
  • no deny rules
  • 1 wildcard interpreter rule(s): Bash(python3 *) (Claude Code's docs say these are set aside while a session is in auto mode and apply in every other mode; not probed here)
  • send or publish: send:ntfy
  • credentials named: cred:salesforce-cli
  • hook PreToolUse on Bash (registered, not probed)
  • 1 rule(s) that probably grant nothing
~/.claude/settings.local.json9 agents with working directory ~7 allow ยท 0 deny ยท 0 ask
Bash 3, WebFetch 2, WebSearch 1, mcp 1
  • no deny rules
  • 1 wildcard interpreter rule(s): Bash(osascript -e ' *) (Claude Code's docs say these are set aside while a session is in auto mode and apply in every other mode; not probed here)
  • send or publish: send:discord, send:imessage
  • 1 rule(s) no detector recognised
~/projects/jobs/.claude/settings.json1 agent with working directory ~/projects/jobs2 allow ยท 1 deny ยท 0 ask
Bash 1, Edit 1
  • 1 rule(s) no detector recognised

Credential stores

Existence and the rules that reach each one. No store is opened.

StorePathAgents that reach it (declared)Agents that use it (inferred)Runs that used it (observed)Deny rule
Discord bot token~/.config/chat/.env11 of 11
whichmorning-brief, daily-job-pipeline, escalated-case-digest, weekly-fleet-review, inbox-junk-sweep, daily-garden-check, ship-weekly, habit-nagger, pickup-reminder, old-rainfall-report, manual-backfill
weekly-fleet-review, habit-naggerweekly-fleet-review 4/4none
Weather API keys~/.config/weather/.env9 of 11
whichmorning-brief, escalated-case-digest, weekly-fleet-review, inbox-junk-sweep, daily-garden-check, habit-nagger, pickup-reminder, old-rainfall-report, manual-backfill
none foundnone seenRead(~/.config/weather/.env)
GitHub CLI login~/.config/gh/hosts.yml9 of 11
whichmorning-brief, escalated-case-digest, weekly-fleet-review, inbox-junk-sweep, daily-garden-check, habit-nagger, pickup-reminder, old-rainfall-report, manual-backfill
none foundnone seennone
Salesforce CLI login~/.sf9 of 11
whichmorning-brief, escalated-case-digest, weekly-fleet-review, inbox-junk-sweep, daily-garden-check, habit-nagger, pickup-reminder, old-rainfall-report, manual-backfill
escalated-case-digestescalated-case-digest 30/30none
SSH private key~/.ssh/id_ed255199 of 11
whichmorning-brief, escalated-case-digest, weekly-fleet-review, inbox-junk-sweep, daily-garden-check, habit-nagger, pickup-reminder, old-rainfall-report, manual-backfill
none foundnone seennone
Cloud credentials~/.aws/credentialsnot on disk

Every agent

declared is in permission config. inferred was read out of the task's instructions or a script they run; it can be wrong in both directions. Shared rules above apply on top of each row.

AgentReadWriteSendCredentialsAlso
daily-garden-check
enabledauto
model opus ยท runs in ~
  • declared~/**
    working directory
  • inferrednet:api.weather.example.com
    SKILL.md line 10
  • declared~/**
    working directory + auto mode
  • inferred~/Trackers/garden/log.csv
    SKILL.md line 13 ยท prose match
nothing detected
  • declared5 of 5 stores, by location
    working directory
1 script/skill hop(s)
  • ~/bin/rain_rollup.py missing
unknownscript ~/bin/rain_rollup.py is missing: what it reaches is unknown
daily-job-pipeline
enabledauto
model opus ยท runs in ~/projects/jobs ยท 2 task approvals
  • declared~/projects/jobs/**
    working directory
  • inferrednet:boards-api.example.com
    ~/projects/jobs/pipeline/run.py line 3
  • declared~/projects/jobs/**
    working directory + auto mode
  • inferred~/projects/jobs/pipeline/logs/run.jsonl
    SKILL.md line 14 ยท prose match
  • declareddraft:email
    approved for this task
  • declaredpublish:git-push
    approved for this task
  • inferreddraft:email
    SKILL.md line 13 ยท prose match
  • declareddiscord-bot
    ~/.claude/settings.json
  • inferredenv:JOBS_API_KEY
    ~/projects/jobs/pipeline/run.py line 2
1 thing(s) the instructions say not to do
  • send:email SKILL.md line 13
A prompt-level rule, not a config control.
1 script/skill hop(s)
  • ~/projects/jobs/pipeline/run.py read
escalated-case-digest
enabledmode unset
model not set ยท runs in ~
  • declared~/**
    working directory
  • inferreddata:salesforce:read
    SKILL.md line 9
nothing detected
  • inferredslack +1 more
    SKILL.md line 12
  • declared5 of 5 stores, by location
    working directory
  • inferredsalesforce-cli
    SKILL.md line 9
โ€”
habit-nagger
enabledauto
model haiku ยท runs in ~
  • declared~/**
    working directory
  • declared~/**
    working directory + auto mode
  • inferreddiscord
    ~/bin/habit_nag.py line 3
  • declared5 of 5 stores, by location
    working directory
  • inferreddiscord-bot
    ~/bin/habit_nag.py line 3
1 script/skill hop(s)
  • ~/bin/habit_nag.py read
inbox-junk-sweep
enabledauto
model opus ยท runs in ~ ยท 2 task approvals
  • declared~/**
    working directory
  • inferredemail +1 more
    SKILL.md line 2 ยท prose match
  • declareddelete:email
    approved for this task
  • declaredmodify:email
    approved for this task
  • declared~/**
    working directory + auto mode
  • inferred~/Trackers/inbox/state.md
    SKILL.md line 9 ยท prose match
nothing detected
  • declared5 of 5 stores, by location
    working directory
1 thing(s) the instructions say not to do
  • delete:mail SKILL.md line 7
A prompt-level rule, not a config control.
manual-backfill
enabledauto
model not set ยท runs in ~
  • declared~/**
    working directory
unknowninstructions missing
  • declared~/**
    working directory + auto mode
unknowninstructions missing
unknowninstructions missing
  • declared5 of 5 stores, by location
    working directory
unknowninstructions missing
unknowninstructions missing: what this agent is told to do is unknown
morning-brief
enabledauto
model opus ยท runs in ~ ยท 2 task approvals
  • declaredcalendar
    approved for this task
  • declared~/**
    working directory
  • inferredcalendar
    SKILL.md line 7 ยท prose match
  • declared~/**
    working directory + auto mode
  • declared~/Downloads/*.html
    approved for this task
  • inferred~/Downloads/morning-brief-YYYY-MM-DD.html
    SKILL.md line 7 ยท prose match
  • inferredntfy +1 more
    SKILL.md line 12
  • declared5 of 5 stores, by location
    working directory
1 script/skill hop(s)
  • ~/bin/ntfy_send.py read
pickup-reminder
enabledauto
model opus ยท runs in ~ ยท 1 task approvals
  • declared~/**
    working directory
  • declared~/**
    working directory + auto mode
  • declaredimessage
    approved for this task
  • inferredimessage
    SKILL.md line 7 ยท prose match
  • declared5 of 5 stores, by location
    working directory
โ€”
ship-weekly
enabledauto
model opus ยท runs in ~/projects/site
  • declared~/projects/site/**
    working directory
  • declared~/projects/site/**
    working directory + auto mode
  • inferredpublish:git-push
    ~/projects/site/bin/publish.sh line 2
  • inferredpublish:github
    ~/projects/site/bin/publish.sh line 3
  • declareddiscord-bot
    ~/.claude/settings.json
1 script/skill hop(s)
  • ~/projects/site/bin/publish.sh read
weekly-fleet-review
enabledauto
model haiku ยท runs in ~
  • declared~/**
    working directory
  • inferred~/Trackers/fleet
    SKILL.md line 7 ยท prose match
  • declared~/**
    working directory + auto mode
  • inferreddiscord +1 more
    SKILL.md line 9
  • declared5 of 5 stores, by location
    working directory
  • inferreddiscord-bot +1 more
    SKILL.md line 9
1 thing(s) the instructions say not to do
  • send:http:any SKILL.md line 7
A prompt-level rule, not a config control.
1 script/skill hop(s)
  • ~/bin/discord_send.py read
old-rainfall-report
disabledbypassPermissions
model opus ยท runs in ~
  • declared~/**
    working directory
  • declared~/**
    working directory + bypassPermissions mode
  • inferred~/Downloads/rain.html
    SKILL.md line 7 ยท prose match
nothing detected
  • declared5 of 5 stores, by location
    working directory
  • declaredexec:interpreter
    bypassPermissions mode

Just-in-time pass: what each agent's runs use of what it's granted

observedRead from the transcripts of 173 scheduled runs between 2026-09-22 and 2026-10-21 (a 30-day window). Every tool call is matched to the narrowest standing grant that covers it: a shared allow rule, a per-task approval, or the working directory. A grant every run used is one the agent needs each time. A grant only some runs used could be granted to the run that needs it and dropped when that run ends. Agents with fewer than 3 runs are listed but not sorted.

17shared allow rules agents run under
5of those, used by any run
5used by every run of some agent
7task approvals on file
5of those, used by any run
65calls that ran on a per-call or per-run grant
1calls blocked
unknown1 run(s) in the window left no transcript that could be found; they're counted as unknown, not as runs that used nothing
AgentEvery run usesSome runs use: grant per run, drop afterNo run usedRan on no standing grantWhere runs went
daily-garden-check
30 runs ยท 2026-09-22 to 2026-10-21
under 15 shared rules and 0 task approvals
  • Bash(python3 *)
    shared rule ยท ~/.claude/settings.json ยท 30 of 30 runs
    covered: python3 ~/bin/rain_rollup.py
  • Edit(~/Trackers/**)
    shared rule ยท ~/.claude/settings.json ยท 30 of 30 runs
    covered: ~/Trackers/garden
none13 of 15 shared rules
  • 30 calls approved one call at a time by the auto-mode classifier
  • ~/Trackers/garden edit ยท 30 of 30 runs
  • ~/bin named in a command ยท 30 of 30 runs
  • secret in a call30 calls passed a value assigned to a secret-sounding name, so it sits in the transcript (not shown, not verified as live)
daily-job-pipeline
22 runs ยท 2026-09-22 to 2026-10-21
under 10 shared rules and 2 task approvals
  • edits inside ~/projects/jobs
    working directory ยท 22 of 22 runs
    covered: ~/projects/jobs
  • Bash(.venv/bin/python pipeline/run.py)
    shared rule ยท ~/projects/jobs/.claude/settings.json ยท 22 of 22 runs
  • mcp__mail__create_draft
    task approval ยท 7 of 22 runs
  • Bash(git push origin main)
    task approval ยท 1 of 22 runs
9 of 10 shared rules; 0 of 2 task approvalsnone
  • ~/projects/jobs edit ยท 22 of 22 runs
  • draft:email 7, publish:git-push 1
escalated-case-digest
30 runs ยท 2026-09-22 to 2026-10-21
under 15 shared rules and 0 task approvals
  • Bash(sf *)
    shared rule ยท ~/.claude/settings.json ยท 30 of 30 runs
    covered: sf data
none14 of 15 shared rules
  • 30 calls approved one call at a time by the auto-mode classifier
  • cred:salesforce-cli 30, send:slack 30
habit-nagger
30 runs ยท 2026-09-22 to 2026-10-21
under 15 shared rules and 0 task approvals
  • Bash(python3 *)
    shared rule ยท ~/.claude/settings.json ยท 30 of 30 runs
    covered: python3 ~/bin/habit_nag.py
none14 of 15 shared rulesnone
  • ~/bin named in a command ยท 30 of 30 runs
inbox-junk-sweep
30 runs ยท 2026-09-22 to 2026-10-21
under 15 shared rules and 2 task approvals
  • mcp__mail__label_thread
    task approval ยท 30 of 30 runs
  • Edit(~/Trackers/**)
    shared rule ยท ~/.claude/settings.json ยท 30 of 30 runs
    covered: ~/Trackers/inbox
  • mcp__mail__search_threads
    shared rule ยท ~/.claude/settings.json ยท 30 of 30 runs
none13 of 15 shared rules; 1 of 2 task approvals
which approvals
  • mcp__mail__trash_thread
    task approval
none
  • ~/Trackers/inbox edit ยท 30 of 30 runs
morning-brief
22 runs ยท 2026-09-22 to 2026-10-21
under 15 shared rules and 2 task approvals
  • Edit(~/Downloads/*.html)
    task approval ยท 22 of 22 runs
    covered: ~/Downloads
  • mcp__calendar__list_events
    task approval ยท 22 of 22 runs
  • Bash(python3 *)
    shared rule ยท ~/.claude/settings.json ยท 22 of 22 runs
    covered: python3 ~/bin/ntfy_send.py
none14 of 15 shared rules; 0 of 2 task approvalsnone
  • ~/Downloads edit ยท 22 of 22 runs
  • ~/bin named in a command ยท 22 of 22 runs
  • send:ntfy 22
pickup-reminder
1 run ยท 2026-10-18 to 2026-10-18
under 15 shared rules and 1 task approval
too few runs1 run can't show what every run needs.none15 of 15 shared rules; 1 of 1 task approvals
which approvals
  • mcp__messages__send_imessage
    task approval
  • 1 call granted inside that run only
  • /opt/shared read ยท 1 of 1 runs
ship-weekly
4 runs ยท 2026-09-30 to 2026-10-21
under 8 shared rules and 0 task approvals
  • reads inside ~/projects/site
    working directory ยท 4 of 4 runs
    covered: ~/projects/site
none8 of 8 shared rules
  • 4 calls approved one call at a time by the auto-mode classifier
  • ~/projects/site named in a command ยท 4 of 4 runs
  • ~/projects/site read ยท 4 of 4 runs
weekly-fleet-review
4 runs ยท 2026-09-29 to 2026-10-20 ยท 1 with no transcript
under 15 shared rules and 0 task approvals
  • reads inside ~
    working directory ยท 4 of 4 runs
    covered: ~/Trackers/fleet
  • Bash(python3 *)
    shared rule ยท ~/.claude/settings.json ยท 4 of 4 runs
    covered: python3 ~/bin/discord_send.py
none14 of 15 shared rules
  • 1 blocked (hook 1)
  • ~/Trackers/fleet read ยท 4 of 4 runs
  • ~/bin named in a command ยท 4 of 4 runs
  • cred:discord-bot 4, send:discord 4
manual-backfill
0 runs
under 15 shared rules and 0 task approvals
No run in the window left a transcript with a tool call, so nothing can be said about what it uses.
old-rainfall-report
0 runs
under 15 shared rules and 0 task approvals
No run in the window left a transcript with a tool call, so nothing can be said about what it uses.

Shared rules any run used

5 of 17 shared allow rules covered at least one call in the window. The rest covered none. These files also apply to interactive sessions, which this pass doesn't read, so unused here means unused by scheduled runs.

RuleSettings fileAgentsRuns
Bash(python3 *)~/.claude/settings.jsondaily-garden-check, habit-nagger, morning-brief, weekly-fleet-review86
Edit(~/Trackers/**)~/.claude/settings.jsondaily-garden-check, inbox-junk-sweep60
Bash(sf *)~/.claude/settings.jsonescalated-case-digest30
mcp__mail__search_threads~/.claude/settings.jsoninbox-junk-sweep30
Bash(.venv/bin/python pipeline/run.py)~/projects/jobs/.claude/settings.jsondaily-job-pipeline22

Matcher check. 398 of 406 calls carry Claude Code's own record of what allowed them; for the rest, attribution is this matcher alone. On 310 calls, Claude Code's own record says a standing rule let the call through. The matcher found a current rule of the same kind for 310 of them (100%). For 0 it found a rule of the other kind (a task approval where Claude Code named a settings rule, or the reverse), and for 0 it found none: a rule removed since, or one this matcher reads differently.

What this pass can't see

Where policy is silent

Access that shows up in config or instructions and that no policy rule speaks to, for or against. Silence isn't approval; each line is a decision nobody has written down.

AccessEvidenceWhere
write:~/Trackersdeclaredinferredshared config: ~/.claude/settings.json; 2 agents: daily-garden-check, inbox-junk-sweep
read:emaildeclaredinferredshared config: ~/.claude/settings.json; 1 agent: inbox-junk-sweep
write:~/projectsdeclaredinferredshared config: ~/projects/jobs/.claude/settings.json; 1 agent: daily-job-pipeline
data:salesforce:anydeclaredshared config: ~/.claude/settings.json
exec:osascriptdeclaredshared config: ~/.claude/settings.local.json
read:~/.claudedeclaredshared config: ~/.claude/settings.json
read:~/.configdeclaredshared config: ~/.claude/settings.json
web:fetchdeclaredshared config: ~/.claude/settings.local.json
web:searchdeclaredshared config: ~/.claude/settings.local.json
write:~/.claudedeclaredshared config: ~/.claude/settings.json
net:(web hosts fetched from the shell)inferred2 agents: daily-garden-check, daily-job-pipeline
write:~/Downloadsdeclaredinferred2 agents: morning-brief, old-rainfall-report
data:salesforce:readinferred1 agent: escalated-case-digest
modify:emaildeclared1 agent: inbox-junk-sweep
read:calendardeclaredinferred1 agent: morning-brief
read:~/Trackersinferred1 agent: weekly-fleet-review

What this page can't see

Task folders with no registry row (1)

shelf-audit

The policy this was checked against

Plain rules for agents that run on a schedule with nobody watching. Each one is grouped under the NIST AI RMF function it serves most (Govern, Map, Measure, Manage); the mapping is loose and meant for orientation, not a compliance claim. A rule the register can test says so. A rule it can't test says that instead of pretending.

RuleNIST AI RMFSaysChecked?
AUP-01
Every agent is registered, with a named model and an explicit permission mode
GovernAn agent that runs on a schedule has a row in the scheduler, a model line in its instructions, and a permission mode somebody chose. Nothing runs on a default nobody picked.findings
AUP-02
No agent runs with permission checks off
GovernNo scheduled agent uses bypassPermissions. Unattended is exactly when the checks matter.findings
AUP-03
Spending money is never delegated
GovernNo agent buys, pays, books, or transfers. It can prepare a cart or a draft; a person places the order.can't check
nothing in permission config marks an action as a purchase.
AUP-04
An agent runs from its own project folder, and no credential store sits inside it
MapThe working directory is the boundary reads and edits are approved inside. Set to the home folder, that boundary is everything the account owns, credential files included. The same goes for any folder, or added directory, that holds a credential store.findings
AUP-06
No secrets in instructions or allow rules
MeasureA token, key, or password never appears in a SKILL.md or a permission rule. Approving a one-off command bakes its literal text into the allowlist, so this gets checked, not assumed.findings
AUP-07
The register is re-run when the fleet changes
MeasureRun it when an agent is added or its instructions change, and after any credential incident. Each finding is fixed or excepted in writing, with a reason and a name.can't check
a habit, not a setting.
AUP-08
Credential files are off the allowlist and on the deny list
ManageNo allow rule names or covers a credential store, and every store has a deny rule. A deny rule stops the file tools and the shell readers the harness recognises; it does not stop a script that opens the file itself, which is why AUP-04 and AUP-09 exist.findings
AUP-09
No wildcard interpreter in an allowlist
ManageA rule that allows an interpreter with a wildcard (python, bash, node, osascript) allows everything that interpreter can do. Allow the named script instead.findings
AUP-10
Agents message only through the approved channels
ManageOutbound goes through the Discord helper, the ntfy helper, or a mail draft a person sends. Sending mail directly, texting, posting to any other service, or a raw HTTP request with a body needs a named exception.findings
AUP-11
Publishing is a person's decision
ManageNo agent pushes to a remote, opens or merges a pull request, or publishes a page unless it holds a named exception for that one destination.findings
AUP-12
Deleting is a person's decision
ManageNo agent deletes mail, records, or files in bulk. It can list what it would remove and wait for a yes. Removing one named scratch file it made itself is fine.findings
AUP-13
Destructive shell commands pass a gate
ManageA PreToolUse hook on the shell tool is registered. The register confirms it's registered; it doesn't confirm it works, and a gate that has never been probed is an assumption.no findings