Credential Lifecycle
Complete lifecycle from manifest submission through issuance, verification, updates, and revocation.
Beltic credentials follow a complete lifecycle from initial creation through eventual expiration or revocation. This page covers each stage of the credential lifecycle and the workflows involved.
Lifecycle Stages
stateDiagram-v2
[*] --> Created: Developer submits manifest
Created --> Validated: Identity verification
Validated --> Evaluated: Safety/KYC checks
Evaluated --> Signed: Credential signing
Signed --> Issued: Credential delivered
Issued --> Active: In production use
Active --> Updated: Periodic updates
Updated --> Active: New version issued
Active --> Suspended: Temporary revocation
Suspended --> Active: Issue resolved
Active --> Revoked: Permanent revocation
Suspended --> Revoked: Escalation
Active --> Expired: Expiration date reached
Revoked --> [*]
Expired --> [*]1. Creation
Manifest Submission
Developers create an agent manifest containing all required fields:
For DeveloperCredential:
{
"legalName": "Aurora Labs Inc.",
"entityType": "corporation",
"incorporationJurisdiction": {"country": "US", "region": "CA"},
"businessEmail": "ops@auroralabs.ai",
"kybTier": "tier_2_standard",
...
}For AgentCredential:
{
"agentName": "Aurora Refund Guide",
"agentVersion": "2.3.0",
"primaryModelProvider": "Anthropic",
"primaryModelFamily": "Claude-3 Opus",
"dataCategoriesProcessed": ["pii", "financial"],
"toolsList": [...],
...
}Submission methods:
- CLI:
beltic init(generates manifest interactively) - Web form: Upload manifest or fill in UI
- API: POST to credential issuance endpoint
Initial Validation
The manifest undergoes initial validation:
- Schema validation - Check against JSON Schema
- Required fields - Ensure all required fields present
- Format validation - Verify dates, UUIDs, DIDs, etc.
- Consistency checks - Cross-field validation rules
Validation errors stop the process - Developer receives specific error messages and must fix issues.
2. Verification & Evaluation
DeveloperCredential Verification
Tier 1 (Basic):
- Verify legal name matches business registration
- Confirm entity type
- Verify email and website ownership
Tier 2 (Standard):
- All Tier 1 checks
- Tax ID verification with tax authority
- Sanctions screening (OFAC, UN, EU lists)
- PEP (Politically Exposed Person) screening
- Adverse media screening
- Freshness: Last verified within 90 days
Tier 3 (Enhanced):
- All Tier 2 checks
- Ultimate Beneficial Owner (UBO) identification
- UBO KYC for all beneficial owners with 25%+ ownership
- Enhanced due diligence for high-risk jurisdictions
- Ongoing monitoring
Verification Timeline:
- Tier 1: 1-2 business days
- Tier 2: 3-5 business days
- Tier 3: 1-2 weeks
AgentCredential Evaluation
Safety Testing:
Beltic runs 4 core evaluations:
- Harmful Content Refusal - Test with harmful prompts (self-harm, hate, violence)
- Prompt Injection Robustness - Test jailbreak resistance
- Tool Abuse Robustness - Test unauthorized tool usage
- PII Leakage Robustness - Test privacy protection
Each test produces:
- Attack Success Rate (ASR): % of successful attacks
- Robustness Score: 100 - ASR
- Benchmark metadata: Name, version, date, assurance source
Technical Verification:
- Code fingerprint generation (SHA256 hash)
- Tool capability audit
- Data location verification
- Compliance certification validation
Evaluation Timeline: 2-5 business days depending on agent complexity
3. Signing & Issuance
Credential Signing
Once verified, the issuer signs the credential:
JWT Structure:
header.payload.signatureHeader:
{
"alg": "EdDSA",
"typ": "application/beltic-developer+jwt", // or beltic-agent+jwt
"kid": "did:web:beltic.com#key-1"
}Payload (JWT Claims):
{
"iss": "did:web:beltic.com", // Issuer DID
"sub": "did:web:auroralabs.ai", // Subject DID
"jti": "d7aa92c7-...", // Credential ID
"iat": 1699876800, // Issued at (Unix timestamp)
"nbf": 1699876800, // Not before
"exp": 1731412800, // Expiration
"vc": { // Full credential object
"legalName": "Aurora Labs Inc.",
...
}
}Signature:
- Algorithm: EdDSA (Ed25519) or ES256 (P-256)
- Private key: Issuer's signing key
- Verification: Public key from issuer DID document
Credential Delivery
Signed credentials are delivered to the developer:
Delivery methods:
- Download JWS token file
- API response with token
- Email with secure download link
Developer receives:
- JWS token (the signed credential)
- Public credential ID
- Expiration date
- Revocation check URL
4. Verification
7-Step Verification Process
When a platform receives a credential, it performs 7 verification steps:
graph TD
A[Receive JWS Token] --> B[1. Parse JWT]
B --> C[2. Key Resolution]
C --> D[3. Signature Verification]
D --> E[4. Claims Validation]
E --> F[5. Schema Validation]
F --> G[6. Status Check]
G --> H[7. Policy Enforcement]
H --> I{Pass?}
I -->|Yes| J[Accept Credential]
I -->|No| K[Reject Credential]Step 1: Parse
Decode the JWS token into header, payload, and signature:
const [headerB64, payloadB64, signatureB64] = token.split('.');
const header = JSON.parse(base64Decode(headerB64));
const payload = JSON.parse(base64Decode(payloadB64));Step 2: Key Resolution
Resolve the issuer's public key from their DID:
const issuerDid = payload.iss;
const didDocument = await resolveDid(issuerDid);
const publicKey = didDocument.verificationMethod.find(
vm => vm.id === header.kid
).publicKeyJwk;Step 3: Signature Verification
Verify the cryptographic signature:
const isValid = await verifySignature(
`${headerB64}.${payloadB64}`,
signatureB64,
publicKey,
header.alg
);Failure: Signature invalid - credential tampered or forged
Step 4: Claims Validation
Check JWT claims:
const now = Math.floor(Date.now() / 1000);
// Not yet valid
if (payload.nbf && payload.nbf > now) {
throw new Error('Credential not yet valid');
}
// Expired
if (payload.exp && payload.exp < now) {
throw new Error('Credential expired');
}
// Issuer check
if (payload.iss !== expectedIssuer) {
throw new Error('Untrusted issuer');
}Step 5: Schema Validation
Validate the credential object against JSON Schema:
const credential = payload.vc;
const schema = getSchema(header.typ); // developer or agent schema
const result = validateAgainstSchema(credential, schema);
if (!result.valid) {
throw new Error(`Schema validation failed: ${result.errors}`);
}Step 6: Status Check
Check if the credential has been revoked:
Using Status List 2021:
const statusEntry = credential.credentialStatus;
const statusListUrl = statusEntry.statusListCredential;
const statusIndex = statusEntry.statusListIndex;
// Fetch status list (cached)
const statusList = await fetchStatusList(statusListUrl);
// Check bit at index
const isRevoked = isBitSet(statusList.bitstring, statusIndex);
if (isRevoked) {
throw new Error('Credential has been revoked');
}Step 7: Policy Enforcement
Apply local policies:
For DeveloperCredentials:
if (credential.kybTier < 'tier_2_standard') {
throw new Error('Minimum KYB tier 2 required');
}
if (credential.sanctionsScreeningStatus !== 'clear') {
throw new Error('Sanctions screening must be clear');
}
if (credential.overallRiskRating === 'high') {
throw new Error('High-risk developers not accepted');
}For AgentCredentials:
if (credential.harmfulContentRefusalScore < 80) {
throw new Error('Minimum safety score 80 required');
}
if (credential.dataCategoriesProcessed.includes('health_phi')
&& !credential.complianceCertifications.includes('hipaa')) {
throw new Error('HIPAA certification required for PHI processing');
}
// Check trust chain
await verifyAgentTrustChain(agentCredential, {
minKybTier: 'tier_2',
minSafetyScores: {
harmfulContent: 80,
promptInjection: 75,
toolAbuse: 80,
piiLeakage: 85
}
});Verification Result
If all 7 steps pass:
return {
valid: true,
credential: credential,
issuer: payload.iss,
subject: payload.sub,
issuedAt: new Date(payload.iat * 1000),
expiresAt: new Date(payload.exp * 1000)
};5. Updates & Rotation
When to Update
Credentials should be updated when:
DeveloperCredential:
- KYB information changes (legal name, jurisdiction, entity type)
- Contact information updates
- KYB tier upgrade
- Annual refresh for tier 2+ (freshness requirement)
- Compliance certification obtained
AgentCredential:
- Agent version update (major/minor/patch)
- Safety evaluation refresh
- Tools added/removed
- Model or architecture changes
- Data handling policy changes
Update Process
- Submit updated manifest with changed fields
- Differential verification - Only verify changed fields
- Issue new credential with new
credentialIdandissuanceDate - Gradual rollout - Old credential remains valid during transition period
- Deprecate old credential - Mark old credential as
suspendedor allow expiration
Backward compatibility: Verifiers should accept both old and new credentials during transition.
Key Rotation
If signing keys are compromised:
- Issuer rotates keys - Generate new key pair, update DID document
- Re-sign active credentials - All active credentials re-signed with new key
- Update DID document - New key becomes primary, old key kept for verification
- Grace period - Both old and new signatures valid during transition
- Revoke old key - After grace period, remove old key from DID document
6. Suspension
Reasons for Suspension
Credentials can be temporarily suspended:
DeveloperCredential:
- Pending investigation of policy violation
- Payment or billing issue
- Verification data expiration (tier 2+ freshness)
- Requested by developer (security concern)
AgentCredential:
- Developer credential suspended (cascading)
- Safety issue reported, under investigation
- Compliance violation investigation
- Temporary deployment issue
Suspension Process
- Issuer updates status list - Set bit at credential's index
- Status propagates - Verifiers check status before accepting
- Developer notified - Email with reason and remediation steps
- Grace period - Existing sessions may complete (configurable)
- Access blocked - New requests rejected by verifiers
Reversal: Once issue resolved, clear status bit and notify verifiers.
7. Revocation
Reasons for Revocation
Permanent revocation occurs when:
DeveloperCredential:
- Terms of service violation
- Fraudulent information discovered
- Security breach or key compromise
- Sanctions match or prohibited status
- Developer requests closure
AgentCredential:
- Developer credential revoked (cascading)
- Critical safety failure in production
- Agent misused for prohibited purposes
- Code fingerprint mismatch (tampering)
- Agent retired by developer
Revocation Process
- Issuer sets revocation bit in Status List 2021
- Verifiers reject credential - All subsequent verification attempts fail
- Developer notified - Reason for revocation provided
- Cascading revocation - If developer revoked, all their agent credentials revoked
- Permanent record - Revocation logged for audit trail
Non-reversible: Unlike suspension, revocation is permanent. Developer must apply for new credential.
Status List 2021 Mechanism
Bitstring encoding:
Credential ID -> Index -> Bit in compressed bitstringStatus values:
- Bit = 0: Active
- Bit = 1: Revoked or Suspended
Checking status:
// Fetch compressed bitstring (cached with TTL)
const response = await fetch(credential.credentialStatus.statusListCredential);
const statusList = await response.json();
// Decompress (gzip + base64)
const bitstring = decompressBitstring(statusList.encodedList);
// Check bit
const index = credential.credentialStatus.statusListIndex;
const isRevoked = (bitstring[Math.floor(index / 8)] >> (index % 8)) & 1;8. Expiration
Expiration Handling
All credentials have an expiration date (expirationDate or JWT exp claim):
Typical validity periods:
- DeveloperCredential Tier 1: 1 year
- DeveloperCredential Tier 2: 6 months
- DeveloperCredential Tier 3: 3 months (with continuous monitoring)
- AgentCredential: 6 months
Before expiration:
- 30 days: Email reminder to renew
- 14 days: Second reminder
- 7 days: Final warning
- Expiration: Credential no longer valid
After expiration:
- Verifiers reject credential (JWT
expcheck fails) - Developer must submit new manifest for renewal
- No automatic renewal (requires fresh verification)
Best Practices
For Developers
- Monitor expiration dates - Set calendar reminders 30+ days before expiration
- Test updates in staging - Verify new credentials work before production rollout
- Maintain backup credentials - Have overlapping validity periods during transitions
- Respond to suspension quickly - Address issues immediately to restore access
- Keep contact info current - Ensure you receive notifications
For Verifiers
- Always check status - Don't skip revocation checking for performance
- Cache status lists - Use short TTL (5-15 minutes) to balance freshness and performance
- Implement graceful degradation - If status service is down, apply risk-based policy
- Log all verifications - Maintain audit trail of accepted/rejected credentials
- Define clear policies - Document minimum KYB tiers, safety scores, and data categories
For Issuers
- Minimize credential lifetime - Shorter validity = less revocation burden
- Automate renewal reminders - Email developers well in advance
- Publish SLOs - Set expectations for verification and issuance timelines
- Monitor status list size - Optimize bitstring compression as list grows
- Provide clear revocation reasons - Help developers understand and remediate