Repository navigation
feat: operator-signed agent revocation (needs migration 0006 before merge) - #3
Open
mikejmorgan-ai wants to merge 1 commit into
Open
mikejmorgan-ai wants to merge 1 commit into
mikejmorgan-ai wants to merge 1 commit into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
mikejmorgan-ai
added a commit
that referenced
this pull request
Oct 19, 2026
…tion approval Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012Jiy2JKhXUXk8LLDtAkjaR
The first lifecycle transition this deployment writes. POST
/api/v1/agents/{agenid}/revocation accepts a Revocation (v1.2-draft object,
revokes_type "agent") signed by the agent's own operator key - the key its
ManifestProof names, role=operator, controller=agent_id - and nothing else.
AgenID holds no key that can revoke an agent.
Spec 1.1.1 section 12 makes REVOKED permanent: a replay or second revocation is
409 already_revoked, re-registration is 409 agent_exists, directory listing is
refused. revoked_at must be within five minutes of the registry clock.
Status, stored revocation and the agent.revoked ledger event are written in one
Postgres transaction by revoke_agent (migration 0006: RLS on, public read, no
write policies, EXECUTE revoked from PUBLIC). Validated against an embedded
Postgres: idempotent on a revoked agent, full rollback on a failed insert,
anon cannot execute.
The resolution envelope gains `revocation` (the signed object when REVOKED,
null otherwise) so a verifier can check who made the change. /revoke signs in
the browser from the /issue key file. Rules live once in
packages/api/src/revoke.ts, shared by the Fastify registry and the web route;
a test fails if any other file calls revokeAgent or writes REVOKED.
Every public surface that said "no revocation flow" now says agent revocation
is operator-only and key rotation, key revocation and other transitions are
not deployed. docs/revocation-propagation.md proposes the missing half.
Tests: web 1294, api 93 (+4), e2e 3s-3v. Standing, window and permanence
guards each proven to fail with the check removed.
Requires migration 0006 applied to production before merge.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Jiy2JKhXUXk8LLDtAkjaR
mikejmorgan-ai
force-pushed
the
feat/agent-revocation
branch
from
October 19, 2026 13:50
896343a to
6761cfa
Compare
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Operator-signed agent revocation
The first lifecycle transition this deployment writes. Only the agent's own operator key can revoke it; AgenID holds no key that can.
0006_revocationsis applied to production (Supabaseprljrmgickpkkunrrkxq). The route calls therevoke_agentfunction it creates, and every public page in this PR says revocation is deployed. The automated apply was not approved during the autonomous run, so this PR waits. Once the migration is applied, merging is safe and the deploy is the only remaining step.What changes
POST /api/v1/agents/{agenid}/revocation— accepts a v1.2-draftRevocation(revokes_type: "agent") signed by the agent's operator key. Refuses another agent's key, an authority key, a tampered signature, arevoked_atoutside ±5 min, a path/target mismatch.409 already_revoked, re-registration →409 agent_exists, directory listing refused.revoke_agentwrites the revocation, the status and theagent.revokedledger event in one transaction. Validated on embedded Postgres (idempotent, full rollback on failure,anoncannot execute).revocation(signed object whenREVOKED, elsenull); the Verification Card shows who signed it./revokesigns in the browser from the/issuekey file; requires reason, typed identifier and a permanence confirmation.packages/api/src/revoke.ts), shared by Fastify and the web route; a test fails if anything else callsrevokeAgentor writesREVOKED.docs/revocation-propagation.md— proposal (not normative) for cache lifetime and registry-unreachable behavior.Verification
pnpm -r buildclean;check:docsclean.🤖 Generated with Claude Code
https://claude.ai/code/session_012Jiy2JKhXUXk8LLDtAkjaR