# user-engine application binding | Field | Value | |-------|--------| | application id | `coulomb-social` (`USER_ENGINE_APPLICATION_ID`) | | display name | coulomb.social | | tenant (v1) | `tenant:coulomb` (KeyCape default; Binky friendly slug later) | | identity link | `(issuer, sub)` via user-engine `GET /api/v1/me` auto-provision | | local row | `members.Member` (no passwords) | | live base URL | `https://users.92-205-62-239.nip.io` (cluster ingress) | ## Runtime | Mode | When | Behavior | |------|------|----------| | **stub** | `USER_ENGINE_BASE_URL` or `USER_ENGINE_PROXY_SECRET` empty | Deterministic `user_id` from sha256(iss\|sub) | | **http** | both set | Trusted-proxy `GET /api/v1/me` with IAM-shaped claims envelope | ### Trusted proxy envelope user-engine accepts claims only when: ```http X-User-Engine-Proxy-Secret: X-Verified-Oidc-Claims: {"iss","sub","tenant","principal_type","aud",...} ``` `aud` must include the portal audience `user-engine-portal` (deployed expectation) plus `coulomb-social`. Trust is the proxy secret; claims were verified by KeyCape OIDC at the app edge. ### Operator: enable HTTP mode locally ```bash # secret never printed to shell history if you use process substitution carefully export USER_ENGINE_BASE_URL=https://users.92-205-62-239.nip.io export USER_ENGINE_PROXY_SECRET="$(kubectl -n user-engine get secret user-engine-runtime \ -o jsonpath='{.data.proxy-secret}' | base64 -d)" export USER_ENGINE_EXPECTED_AUDIENCE=user-engine-portal # then OIDC or dev-login ``` OpenBao lane for the proxy secret (future): document under railiance-platform workload KV; until then kubectl-sourced secret is operator-only on the workstation. ## Profile attributes (shell only) - display name (OIDC `name` / user-engine user.display_name) - email (optional) Bubble content fields are **not** part of this binding. ## Live probe (2026-08-09) `GET /api/v1/me` with probe claims returned `user_id` `usr_…` and `actor.tenant=tenant:coulomb` (HTTP 200).