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