Stability checkpoint v0.5.0 — five backlog items shipped together

- feat(ci): auto-run smoke:llm-real on tag when ANTHROPIC_API_KEY_SMOKE is set (277e610)
- feat(cli): `secured-claude principal validate` (ADR-0031) (b359392)
- feat(ops): auto-anchor cron templates — launchd + systemd (ADR-0032) (2ea0dcf)
- feat(ci): containerise the broker for CI full-stack smoke (ADR-0033) (31b753d)
- feat(security): PrincipalProvider abstraction — foundation for OIDC IdP (ADR-0034) (53b52b8)

v0.4.0 closed the v0.3+ residual gaps. v0.5.0 closes the v0.4 + v0.5
backlog as one coherent batch :

- The real-LLM smoke is no longer manual-only ; operators who set
  ANTHROPIC_API_KEY_SMOKE get auto-run on every release.
- The principal directory has lint protection ; typos no longer
  silently fall back to default.
- Daily anchor cron templates make tamper-evidence operationally
  sustainable, not "remembered to run once a quarter".
- Full-stack smoke is now possible (5-container CI compose ; v0.5.1
  ticket : wire `bin/test-full-stack.sh` as a `smoke:full-stack` CI job).
- The PrincipalProvider abstraction lays the foundation for v0.6
  proper OIDC + JWT validation.

Discovered + fixed in this batch : Cerbos's parentRoles requires the
derived role explicitly in the principal's role list. The v0.3.1
principal directory had dropped `claude_agent` from the default
principal by mistake ; v0.5 corrects it (broker tests + audit-demo
agree on `[agent, claude_agent]`).

CI :
- ✅ Main pipeline #N green — pending v0.5.0 tag run
- ✅ MR #17 merged

Local test pass :
- ✅ uv run pytest -q — 152 passed (15 new for principals, 5 for
  principal-validate)
- ✅ uv run ruff check + format src tests — clean
- ✅ uv run mypy src — Success: no issues found in 12 source files
- ✅ shellcheck bin/*.sh — clean (incl. new test-full-stack.sh)
- ✅ glab ci lint — valid YAML across 8 included files
- ✅ bash bin/test-full-stack.sh — 2/2 PASS (broker + Cerbos via container)

Regression check vs v0.4.0 :
- ✅ Multi-arch images (ADR-0028) — unchanged
- ✅ Hash chain + external anchor (ADR-0024 + ADR-0029) — unchanged
- ✅ Asset-links on Release (ADR-0023) — unchanged
- ✅ Cosign signing all 3 images (ADR-0025+0016) — unchanged

- Principal directory now has lint + type-validation (catches
  silent-fallback typos before runtime, ADR-0031)
- Tamper-evident audit log ships with daily-anchor crontab
  (operationally sustainable, ADR-0032)
- Full-stack smoke proves agent → broker → Cerbos → audit log path
  (ADR-0033 ; the v0.4 ADR-0030 only proved agent → API)
- IdP integration foundation — operators with central identity infra
  (Auth0, Keycloak, OIDC) can serve principals over HTTP via
  SECURED_CLAUDE_IDP_URL (ADR-0034)

- smoke:llm-real now auto-runs on tag when budget variable is set
- 8 stages preserved : lint → test → security → build → smoke →
  publish → release
- Pipeline jobs : 28 + 1 manual + 1 conditional (smoke:llm-real).
  31 max if the operator has set the variable.

- 4 new CLI surfaces : `principal validate` (ADR-0031),
  `audit-anchor` (v0.4 ADR-0029), `audit-verify-anchor` (v0.4 ADR-0029),
  the cron templates that auto-run them (ADR-0032)
- bin/test-full-stack.sh — local + CI-runnable end-to-end smoke

- 34 ADRs (was 30 in v0.4) — 4 new in v0.5 (0031, 0032, 0033, 0034)
- New module : src/secured_claude/principals.py — PrincipalProvider
  ABC + 2 concrete providers + factory
- ADR-0006 (host-side broker) amended for CI use only ; production
  posture preserved

- JWT validation in /check (currently agent passes principal_id as a
  trusted string) — v0.6 ticket
- OIDC discovery (.well-known/openid-configuration fetch) — v0.6
- TTL cache for HTTPPrincipalProvider — v0.6
- Auth on the IdP URL (bearer / mTLS) — v0.6
- build:image:broker Kaniko CI job + cosign sign — v0.5.1
- smoke:full-stack as a CI job (currently bin/test-full-stack.sh
  is local-only) — v0.5.1
- Windows scheduled-task template for audit-anchor — v0.6 if demand

- v0.5.1 — build:image:broker + cosign-sign + smoke:full-stack CI job
- v0.6.0 — JWT validation + OIDC discovery + TTL cache + bearer auth