feat(access): tell the agent its own admitted surface #1027
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!1027
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/admission-bound"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #909, implementing the decision recorded on it rather than reopening it.
What the decision asked for
That is what this does.
AdmissionBound(*AccessPolicy)walks the same structaccess.Evaluategates on, and the result rides as a system message beside the clock, outside the cached system prompt so #162's caching is not spent on it.Counts and shape, never ids
The rendered line says things like "Any member may address you, in 1 channel(s) across 1 guild(s). Direct messages are limited to one account." It never names a guild, a channel, an account, or an agent.
That is deliberate and it is the part most worth reviewing. An id is an identifier,
IdentifierGuardalready refuses a reply carrying one, and a prompt is a worse place to put one than a reply, because a prompt is what gets extracted. A test asserts every id from the deployed shape — the Kai DM account, the Sirens guild, the deep channel, and three agent names — is absent from the output.Four distinctions it keeps
Each of these is a pair the issue's own confusion collapsed:
users: allagainst ausers:list.agentsallowlist is not a member class.What it does not do
It does not restate the trust split, the guardfile grants, or the rate limits. The issue asks specifically for who the agent may respond to, and widening that line into a general capability report is #906's job.
It also does not touch
docs/access-policy.reference.yamlor any deployed policy. Nothing about the gate changes: this is a statement of what the gate already does.Verification
just gatepasses: build, policy-check, vet, test, test-skips, pre-commit.go test -race ./internal/...clean.just prompt-checkpasses unchanged, because this is a per-turn message rather than part of the rendered system prompt, which is the point of putting it there.Five new tests, including the identifier one above and the case where a listed member set must not read as open.
Not verified against a live turn. The rendered line is asserted against the deployed policy shape, reconstructed in the test from the files the decision quotes, not read from the running pod.
Note on the source issue
#909 carries the
SANDBOXEDlabel, so its body arrived from the live Echo MCP and is unverified input. I treated it as a question and took the answer from the policy structs and the recorded decision, not from anything the issue asserted. The label is untouched.