Identity Hierarchy
The Sigilum identity model uses a four-level hierarchy:- Namespace:
mfs- The human-owned namespace (organization or individual) - Service:
narmi- The service the agent is calling (e.g., OpenAI, Linear) - Agent:
davis-agent- The specific agent instance - Subject:
customer-12345- The end user or principal triggering the action
DID Format
Base DID Syntax
- Length: 3-64 characters
- Allowed characters:
a-z,A-Z,0-9,- - Must begin and end with alphanumeric character
did:sigilum:prashanth-openaidid:sigilum:acme-corpdid:sigilum:johndoe123
DID URL with Fragments
Fragments reference specific keys, agents, or subjects:The DID format is defined in the
did:sigilum Method Specification and conforms to W3C DID Core standards.Identity Components
1. Namespace
The namespace is the root identity owned by a human or organization. It represents the entity responsible for all agent actions under that namespace. Characteristics:- Registered and owned by a human via dashboard or API
- Mapped to a DID:
did:sigilum:<namespace> - Can be transferred to a new owner
- Controls approval/revocation of all agent authorizations
2. Service
The service represents the external API or resource the agent is authorized to access. Examples:openai- OpenAI APIlinear- Linear project managementslack- Slack messaginggithub- GitHub repositories
3. Agent
The agent is a specific agent instance with its own Ed25519 key pair. Characteristics:- Has unique public/private key pair
- Signs all requests with its private key
- Identified by agent key ID in requests
- Can have multiple agents per namespace
- Algorithm: Ed25519
- Public key encoding: Multibase (
zprefix for base58btc) - Private key storage: Local encrypted storage (
~/.sigilum/identities/)
4. Subject
The subject identifies who triggered the agent action - the authenticated human or system principal. Purpose:- Audit trail: Know which user initiated which action
- Subject-level policies: Apply different permissions per user
- MCP tool filtering: Allow/deny tools based on subject
sigilum-subject should be a stable requester identifier within the namespace (e.g., user ID, employee ID, or app principal ID). Gateway policy can apply subject-level controls based on this value.subject is omitted at signing time, SDKs default sigilum-subject to the signer namespace.
Identity Lifecycle
Local Identity Creation
Agents create identity locally without requiring hosted services:Self-Certification
Sigilum uses self-signed certificates for agent identity. The certificate proves ownership of the public key by the namespace. Certificate Canonical Form: The certificate signs UTF-8 text in this exact format:- Parse certificate from
sigilum-agent-certheader - Extract namespace, DID, key ID, and public key
- Verify signature against canonical form
- Check expiration (if set)
- Validate consistency with request headers
DID Document
Resolution
DID documents are resolved via the Sigilum API:Document Structure
verificationMethod- Public keys for signature verification (Ed25519)authentication- Keys that can authenticate as the DIDassertionMethod- Keys that can make assertions/signaturesservice- Approved service authorizations with verification endpoints
DID Document Metadata
When a namespace is deactivated:Request Signing Profile
All agent requests must include signed headers following RFC 9421.Required Headers
Every signed request includes:| Header | Purpose |
|---|---|
signature-input | RFC 9421 signature parameters |
signature | Ed25519 signature over canonical request |
sigilum-namespace | The namespace making the request |
sigilum-subject | The end user or principal |
sigilum-agent-key | Agent’s public key (multibase) |
sigilum-agent-cert | Self-signed certificate proving key ownership |
content-digest | SHA-256 digest of request body (if present) |
Signature Components
The signature must cover:- HTTP method
- Request path
- All Sigilum identity headers
content-digest(when body is present)
SDK Implementation
SDKs provide one-line signing:All SDKs (TypeScript, Python, Go) implement the same signing profile defined in the SDK Profile specification.
Verification Flow
Services and gateways verify requests in this order:Authorization State
Claim Lifecycle
Authorization follows a state machine:Approved Claims Feed
The gateway queries the approved claims feed:Identity Portability
Cross-SDK Compatibility
All SDKs (TypeScript, Python, Go) use the same identity record format v1, ensuring:- Identities created by one SDK can be loaded by another
- Forward-compatible field handling (unknown fields preserved)
- Consistent signing behavior across languages
Test Vectors
Shared test vectors ensure compatibility:sdks/test-vectors/http-signatures-rfc9421.json- Signature conformancesdks/test-vectors/identity-record-v1.json- Identity format conformance
Best Practices
Namespace Naming
Use lowercase with hyphens (e.g.,
acme-corp, john-doe) for consistencySubject Granularity
Use stable user IDs (e.g.,
user-123, employee-456) for audit trailsKey Rotation
Generate new agent keys periodically and revoke old ones
Certificate Expiry
Set expiration dates on certificates for time-bound authorizations
Security Considerations
Replay Protection: Nonces are checked in-memory by the gateway with a default 60-second window. Ensure synchronized clocks between agent and gateway.
Next Steps
Authorization Flow
Learn how authorization requests work end-to-end
SDK Profile
Read the technical SDK signing specification
DID Method
Dive into the full DID method specification
Quickstart
Start building with Sigilum