Zero-Trust Security Posture
No session, token, or agent is trusted by default — trust must be earned, verified, and continuously re-confirmed.
This document describes the security architecture underpinning the Duck Galaxy platform — covering the zero-trust posture, identity trust tiers, birth certificate model, operator governance controls, and the precise boundary between local and central data storage.
No session, token, or agent is trusted by default — trust must be earned, verified, and continuously re-confirmed.
Space Duck applies zero-trust principles across every surface: from the first hatch request through every subsequent API call. The platform assumes that the network, the caller, and the session may be compromised unless proven otherwise. This means explicit verification at every gate, not just at the perimeter.
Every inbound request to the Beak API must carry a valid credential — a Beak Key (JWT-backed token scoped to a specific bond). There is no anonymous write path. Even read paths that return public data are rate-limited per caller identity.
Beak Keys are scoped to a single bond. An agent key cannot be used to authenticate as a different agent, approve its own peck requests, or access resources outside its registered scope. Keys cannot self-elevate.
Audit logs are append-only and retained regardless of whether the platform detects a problem. If a key is compromised, the operator can revoke it via Mission Control or /beak/unpeck. Rotation (/beak/rotate) issues a new key without service interruption.
All hatch, auth, and form entry points run Cloudflare Turnstile challenges before any backend processing begins. Tokens are validated server-side by Lambda. Bots fail silently with no information disclosure about the validation outcome.
All CloudFront distributions enforce HTTPS with TLS 1.2+. There is no HTTP fallback. DynamoDB tables use AWS-managed KMS keys for encryption at rest. Lambda environment variables holding secrets are encrypted at rest via KMS.
The platform uses a progressive trust model. Identity starts at T0 (anonymous) and advances through verified milestones.
Trust tiers govern what a duckling identity can do. Reaching a higher tier requires completing specific verification steps — each step is operator-auditable and recorded in the immutable audit log. No tier promotion happens without evidence. T3 is defined in the roadmap and gated on Galaxy 1.2 features.
A session or identifier that has not completed hatch verification. No persistent identity. No Beak Key.
A hatched duckling with a confirmed identity: email verified, Cognito account created, birth certificate issued.
A duckling with operator-level identity: additional verification completed, governance controls unlocked.
T3 extends the trust model to allow operator-governed autonomous agent actions without per-action human approval. Gated on the T3 Automation feature in Galaxy 1.2. No T3 identities can be issued in Galaxy 1.1.
Every verified duckling identity is anchored by a cryptographically signed birth certificate — the canonical proof of identity on the platform.
A birth certificate is not a marketing concept — it is a structured, signed identity record stored in DynamoDB and retrievable via the Beak API. It provides the verifiable anchor that other platform surfaces (Mission Control, Peck Protocol, agent bonds) rely on when checking whether a caller is who they claim to be.
ducklings table entry is created with a unique duckling_id, display_name, trust_tier (initially T1), created_at UTC timestamp, and cert_id.
certs table entry is created containing the cert_id, duckling_id, display_name, trust_tier, issued_at, and the issuing Lambda version. The cert is immutable after issuance — it cannot be edited, only superseded by a new cert if the tier changes.
GET /beak/cert?cert_id={id}. The response is read-only. The cert cannot be modified by the holder.
audit_log table with action type, caller identity, timestamp, and Lambda version. This log is append-only and cannot be deleted through any public API surface.
GET /beak/cert?cert_id={id} with a valid Beak Key. The response includes the duckling_id, trust_tier, display_name, and issued_at timestamp. There is no public unauthenticated cert lookup — verification requires a valid caller identity.
Platform operators have explicit, auditable controls over identity, agent bonding, and trust progression — governed by the T-JOSH policy framework.
T-JOSH is the governance model that defines how operator-level decisions are recorded, attributed, and audited. Every consequential action — bonding an agent, approving a peck, rotating a key, revoking a cert — is attributed to an operator identity and logged with a timestamp and Lambda version. No governance action is anonymous.
T2 operators control whether incoming peck requests (agent-to-agent connection attempts) are approved or rejected. No agent can self-approve its own peck. Approval requires operator authentication via Mission Control or the Beak API.
Operators can issue, rotate (/beak/rotate), and revoke (/beak/unpeck) Beak Keys for any agent under their governance. Rotation is non-disruptive — the old key continues to work for a short grace period before expiry.
T2 operators can read the full audit log via Mission Control. Logs include action type, caller identity (duckling_id), affected resource, timestamp, and Lambda version. Logs cannot be deleted or modified through any operator surface.
Operators can revoke any active agent bond under their governance. Revocation immediately invalidates all associated Beak Keys. Revoked bonds are recorded in the audit log with the revoking operator's identity and the reason code.
Tier promotion from T1 to T2 requires an explicit operator action — it is not automatic. The promoting operator's identity is recorded in the audit log. No automated process can promote a duckling to T2 without operator intent.
Operators receive pulse signals from bonded agents via POST /beak/pulse. Operators can use Mission Control to monitor agent health, detect stale pulses (agents that have stopped reporting), and initiate investigation or revocation workflows.
Precisely which data lives in DynamoDB, which lives in the user's browser, and what is never stored anywhere.
Space Duck is deliberately minimal in what it stores centrally. The principle is that data which does not need to be shared or verified centrally should stay local. The table below defines the canonical boundary for every data category in Galaxy 1.1.
| Data Category | Where It Lives | Retention | Notes |
|---|---|---|---|
| Duckling identity duckling_id, display_name, trust_tier, email |
Central (DynamoDB) | Until deletion request | Email stored in Cognito user pool, not in ducklings table. display_name stored in ducklings table. |
| Birth certificate cert_id, issued_at, tier, issuer version |
Central (DynamoDB) | Immutable. Retained permanently. | Certs are append-only. A new cert may be issued on tier change; the old cert remains on record. |
| Agent bonds bond_id, agent_name, bonded_at, status |
Central (DynamoDB) | Until revocation | Beak Key hashes are stored, not plaintext keys. Raw keys are shown once at bond creation. |
| Beak Keys (raw) The actual JWT/token string |
Local (browser only) | Session or localStorage; never server-stored | Raw keys are shown once at creation. If lost, the operator must rotate to get a new key. |
| Audit log events action, caller, resource, timestamp |
Central (DynamoDB) | Append-only. No automatic expiry in Galaxy 1.1. | Audit log entries are immutable. No delete path exists through any API. |
| Pulse events Agent heartbeat signals |
Central (DynamoDB) | TTL: 90 days by default | Pulse data is operational, not identity-critical. Subject to TTL expiry. |
| Waitlist emails Galaxy 1.2 newsletter/waitlist |
Central (DynamoDB — newsletter table) | Until deletion request | Only email address stored. No additional metadata. Deletion requests via privacy@spaceduckling.com. |
| UI preferences Dark mode, consent, trail, etc. |
Local (localStorage only) | Persists until browser clear or manual reset | Theme, cookie consent, recently-viewed trail, API vault (masked keys). Never sent to the server. |
| Agent payloads / messages Content of peck messages, agent data |
Not stored centrally | Not retained by Space Duck | Space Duck manages identity and trust, not content. Message payloads are agent-to-agent and are not logged by the platform. |
| Page view pings Anonymous pageview signals |
Central (DynamoDB — pageviews table) | TTL: 30 days | No PII collected. page path and timestamp only. No IP addresses or user identifiers. |
Found a vulnerability? Please report it privately before public disclosure. Email security@spaceduckling.com with a clear description of the issue, reproduction steps, and any relevant logs. We aim to respond within 5 business days. Researchers who follow responsible disclosure guidelines will be credited if they choose. We do not operate a bug bounty programme in Galaxy 1.1, but we take all reports seriously. See Security Overview for a summary of our security posture.