Repository navigation
Handover 169 JWT
Focused handover for taking Auth0 login JWT signature verification from its current shadow state to enforce, safely, and closing noetl/ai-meta#169.
Repo copies (source of truth):
docs/HANDOVER-169-JWT.md
(full reference) +
docs/CODEX-169-HANDOFF-PROMPT.md
(copy-paste Codex kickoff).
The one danger: prod runs a single server replica → no partial-replica canary.
shadowverifies-and-meters but always allows. The moment you setenforce, a wrong issuer/audience/JWKS config rejects 100% of logins. Every enforce step is gated on a real success observation and paired with an instant one-variable rollback (NOETL_AUTH_VERIFY_SIGNATURE=shadow).
| Leg | PR | State |
|---|---|---|
| Server sync-path RS256/JWKS verify | server#276 | Merged → v3.52.0 → deployed to prod, running in shadow |
| Drive-path (Python-stdlib) mirror | e2e#84 |
OPEN / unmerged (same flag, default off; only runs when NOETL_AUTH_SYNC off) |
Prod: server-rust:v3.52.0, single replica,
NOETL_AUTH_VERIFY_SIGNATURE=shadow,
NOETL_AUTH0_DOMAIN=mestumre-development.us.auth0.com (bare host),
NOETL_AUTH0_AUDIENCE unset. JWKS reachable from the pod (2 RS256
keys). outcome="success" not yet captured — the verify metric is
lazily registered and appears only after the first real claims-valid
login hits shadow.
-
Capture shadow success — trigger one real Muno login, read
noetl_auth_jwt_verify_total{mode="shadow"}, requiresuccessonly. Anybad_*/no_domain/jwks_unavailable= config mismatch to fix first. -
Set audience — confirm the real
aud(= SPAclient_id, never printed) and setNOETL_AUTH0_AUDIENCEso enforce validatesaud. - Merge e2e#84 — both paths verify (flag-gated; prod path is the sync one).
-
Flip to enforce — pre-checks pass →
NOETL_AUTH_VERIFY_SIGNATURE=enforce→ immediately verify a real login + latency → instant rollback toshadowat the firstbad_*. - Close #169 once both paths verify, enforce is live + stable, and the metric shows success.
- unset /
off— claims-only decode (pre-#169, byte-identical). -
shadow— verify + meter + log, still allow. ← prod is here. -
enforce— verify and reject on failure. ← target.
verify_signature builds the issuer via format!("https://{domain}/"),
so NOETL_AUTH0_DOMAIN must be the bare host — a URL value would
produce https://https://…// and break every verify (a full login
outage under enforce).
- Issuer:
https://mestumre-development.us.auth0.com/ - JWKS:
https://mestumre-development.us.auth0.com/.well-known/jwks.json - Audience: the SPA
client_idin GSMauth0_client.data.client_id(projectnoetl-demo-19700101) — value never printed.
- Sessions Log · Releases · Codex Handover (broader Muno/travel + deploy handover)
- Issue: noetl/ai-meta#169
- Home — overview
- Repo Map
- Releases
- Sessions Log
- Codex Handover — Muno/travel + SLM + safe deploy
- Handover #169 JWT — Auth0 JWT verify: shadow → enforce
- Catalog Model on EHDB (#427) — generalized catalog of internal resources; EHDB is the only store; P0+P1 landed
- EHDB Primary Serve Path (#257) — writer-fronted tier service; nothing is primary anywhere
- Domain-Specific SLM Platform (#139) — RFC (design); travel#63 is the reference impl
- Secrets Wallet (#61) — SECURITY (design)
- Rust Server Port (#49) — PRIMARY
- Decoupled Context + Event Chain (#115) — RFC (design), reframes #101
- Orchestrator Scaling (#101) — reframed by #115; consume side = #115 Phase 1
- Event WAL + Derivable Storage (#104) — Round 01 (locator) PR open
- WASM Plug-in Compilation (#105) — system-pool plug-in hot-reload (ADR Phase 4)
- System Pool Design (#46) — PRIMARY
- Regression Baseline Migration (#98) — e2e
- Subscription / Listener Tool (#90) — RFC
- Container Tool Callback (#43)
- Rust Worker Parity Gaps (#47 · #48)
- Event Envelope Reconciliation (#51 in TaskList)
- Cursor Loop Mode (#100) — server v3.8.0 + tools v3.10.1, 2026-06-15
- Transfer Tool Credentials (#99) — tools v3.10.0 + worker v5.22.0, 2026-06-14
- Explicit Input Binding (#77) — v3.0.0 shipped 2026-06-09
- Rust Worker Migration (#30)
- Python Services → Rust (#45)
- Agent Coordination — Claude ⇄ Codex lanes + shared-surface deconfliction
- Issue Tracking
- Continuous Integration — the ai-meta pointer + docs gate, and every repo's PR-gate status
- Wiki Convention
- Handoffs
- Deployment Validation
- Execution Model
- Data Access Boundary
- Observability
- Specs Index — cross-repo + architectural specs
- noetl/noetl wiki — app + DSL
- noetl/server wiki — Rust control plane
- noetl/worker wiki — Rust pull worker
- noetl/tools wiki — tool registry crate
- noetl/cli wiki — CLI + local mode
- noetl/gateway wiki — gatekeeper
- noetl/ops wiki — Helm + manifests
- noetl/travel wiki — domain SPA reference
- Docs site — engineer-facing architecture