Skip to content

docs: ADR 0008 — agent identity in a namespaced Secret, the one write grant - #17

Merged
kfeofantov merged 1 commit into
mainfrom
docs/identity-in-secret
Aug 9, 2026
Merged

kfeofantov merged 1 commit into
mainfrom
docs/identity-in-secret

Conversation

@kfeofantov

Copy link
Copy Markdown
Contributor

Docs-only slice fixing the identity-durability gap the user spotted after ADR 0007: data loss is bounded by snapshot delivery, but identity loss was not — a reschedule after the enrollment token's TTL meant silent local-only mode until an operator intervened.

The decision (ADR 0008)

  • Identity lives in one pre-created, named Secret in the agent's namespace. Helm owns the object's existence; the agent owns only its content: get + update in a namespaced Role scoped by resourceNames. No create (cannot be name-scoped — pre-creation is what keeps the grant airtight), no list/watch/delete, no ClusterRole. The only write verb in the product.
  • Strict mode stays write-free: persistence.enabled: true keeps identity on the PVC and the chart emits no Secret grant at all.
  • DaemonSet profiles hold no backend identity — projected, audience-bound SA tokens toward the controller; one identity per cluster regardless of node count. Now a promise, not an accident.
  • Lifecycle documented: empty-data template → atomic single-update after enrollment → survives restart/reschedule/upgrade (Helm three-way merge; ArgoCD ignoreDifferences note) → dies with helm uninstall deliberately.

Honest consequences (in the ADR and security.md)

The categorical "no write verbs anywhere" becomes "one disclosed, name-scoped exception"; the key gains one copy location (etcd + Secret-including backups), whose theft buys only telemetry poisoning of that one cluster — the protocol is one-way, monetary-free, fingerprint-checked, and recovery is revoke + re-enroll with continuous history.

Amends ADR 0003/0005 on storage location; their core decisions stand. No code — enrollment does not exist yet; these documents lead it per the ADR-first rule.

🤖 Generated with Claude Code

… grant

Identity is not data: it cannot be re-derived from the cluster, and with
emptyDir (ADR 0007) a reschedule after the enrollment token's TTL left the
agent silently local-only until an operator intervened.

- ADR 0008: key and certificate live in one pre-created, named Secret;
  Helm owns the object's existence, the agent owns only its content via
  get/update scoped by resourceNames in a namespaced Role — no create
  (cannot be name-scoped), no list/watch/delete. persistence.enabled: true
  keeps identity on the PVC and emits no write grant at all. DaemonSet
  profiles hold no backend identity — projected SA tokens toward the
  controller, promised, not accidental. Full lifecycle section including
  helm upgrade three-way merge and the ArgoCD ignoreDifferences note.
- security.md §4: the categorical no-write-verbs claim is replaced by the
  disclosed single exception, with its own RBAC table row; the storage
  section moves credentials from the volume to the Secret with honest
  etcd/backup consequences; the emptyDir degradation and key-loss recovery
  notes updated accordingly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kfeofantov
kfeofantov merged commit e0f0f8a into main Aug 9, 2026
3 checks passed
@kfeofantov
kfeofantov deleted the docs/identity-in-secret branch August 10, 2026 17:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant