You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The platform side of the agent-identity program (agent-identity-plan L1–L4) has merged. It is deliberately inert end-to-end until forge presents/propagates the identity at runtime — the framework-aware half lives here. This issue tracks the forge deliverables and the exact contracts they must match.
Merged platform PRs (contracts):
L1 workload identity — agent-builder#187: per-agent k8s ServiceAccount + a projected, audience-bound, rotated SA token at deploy (gated WORKLOAD_IDENTITY_MODE=k8s_sa); the k8s_sa TokenReview validator; the §19.13 per-agent entitlement check wired shadow-mode (WORKLOAD_ENTITLEMENT_ENFORCE). agent-builder#186: PrincipalSub on grants.
Schema — security-next#41: chain_id, chain_hop, mandate_id, grant_ref, principal_sub, principal_iss, delegation_mode, actor_agent_id, actor_workload_id, attestation_level promoted onto audit events + the PDP caller. api-next#36: RFC 8725 token typ media types.
On calls to the platform token endpoint (POST /api/v1/mcp/token) and other platform-authenticated calls, send header X-Workload-Token = the projected SA token, read per request from INITIALIZ_WORKLOAD_TOKEN_PATH (default /var/run/secrets/initializ.ai/workload/token) — do not cache it (kubelet rotates the file in place; caching is the no_token failure class). Token audience is initializ:platform-token-endpoint.
Once forge sends it, agent-builder flips WORKLOAD_ENTITLEMENT_ENFORCE on: an agent bound to svc-runbooks can no longer fetch svc-security's token.
Active only when the agent is deployed with WORKLOAD_IDENTITY_MODE=k8s_sa (agent-builder provisions the per-agent SA + projects the token).
2. Populate the agentic-identity fields on PDP requests + audit events (lights up L2/L4)
POST /pdp/decide caller: principal_sub, principal_iss, delegation_mode, actor_agent_id, actor_workload_id, attestation_level, mandate_id, grant_ref + chain_id, chain_hop on the request.
Emitted audit events: the same promoted columns (security-next#41).
Without this, the Phase-3 delegation-mode / bind-strength floors, the phantom-principal guard, mandate evaluation, and the Phase-4 actor-breakdown + foreign-agent reports all evaluate on nulls.
del enum must match security-next exactly: chained | connected_account:user | connected_account:workspace | mandate | agent_own | none.
Stamp chain_id/chain_hop on emitted audit events (feeds the org_chain index + the foreign-agent detector, which flags actions lacking a gateway chain token).
4. Egress-proxy chain propagation for non-Forge frameworks (§20)
The egress proxy reads the incoming chain token, re-mints for the hop, and stamps it outbound — so Strands / Claude Agent SDK / BYO get an unbroken chain without an SDK helper. Build this alongside the native path; the chain must be unbroken regardless of framework.
5. Token typ discipline (RFC 8725)
Validate typ at every forge verification point — a chain token must be rejected where an access token is expected. Media types: application/vnd.initializ.{platform-bearer,chain-token,workload-credential,mandate}+jwt.
6. SPIRE mode (attested:workload) — when SPIRE ships (Phase 1.3/1.4)
Consume the X.509-SVID via the Workload API / CSI (the initializ-sdk already refuses cluster mode without a real INITIALIZ_SPIFFE_ID/SVID).
cnf/x5t#S256-bind the chain token to the X.509-SVID → bind strength attested:workload.
In k8s_sa mode the chain token stays an unbound bearer (attestation_level = attested:placement), replay-mitigated by actor_workload_id claim checks + the ~60s TTL, and gated per-tool by the PDP bind-strength floor already merged (security-next#42, Decision Add LLM fallback chains, multi-LLM init wizard, and OpenAI OAuth #7). No global switch — forge just stamps attestation_level accurately.
7. Release + rebuild
Cut a forge release including the above so agents bake it (AGENT_FORGE_VERSION); the merged platform features stay inert until deployed agents carry the runtime hooks.
Open decision
TTS placement (Decision #3, resolved as cluster-local): does forge mint/re-mint chain tokens in-process, or call a cluster-local token-exchange service? Settle before Phase-2 build.
Related existing issues (cross-link, not duplicates)
Context
The platform side of the agent-identity program (agent-identity-plan L1–L4) has merged. It is deliberately inert end-to-end until forge presents/propagates the identity at runtime — the framework-aware half lives here. This issue tracks the forge deliverables and the exact contracts they must match.
Merged platform PRs (contracts):
WORKLOAD_IDENTITY_MODE=k8s_sa); thek8s_saTokenReview validator; the §19.13 per-agent entitlement check wired shadow-mode (WORKLOAD_ENTITLEMENT_ENFORCE). agent-builder#186:PrincipalSubon grants.chain_id, chain_hop, mandate_id, grant_ref, principal_sub, principal_iss, delegation_mode, actor_agent_id, actor_workload_id, attestation_levelpromoted onto audit events + the PDP caller. api-next#36: RFC 8725 tokentypmedia types.All of the above read fields forge does not yet populate, so today they see nulls.
Forge deliverables
1. Present the per-agent workload token (unblocks §19.13 enforcement — smallest, highest value)
On calls to the platform token endpoint (
POST /api/v1/mcp/token) and other platform-authenticated calls, send headerX-Workload-Token= the projected SA token, read per request fromINITIALIZ_WORKLOAD_TOKEN_PATH(default/var/run/secrets/initializ.ai/workload/token) — do not cache it (kubelet rotates the file in place; caching is theno_tokenfailure class). Token audience isinitializ:platform-token-endpoint.WORKLOAD_ENTITLEMENT_ENFORCEon: an agent bound tosvc-runbookscan no longer fetchsvc-security's token.WORKLOAD_IDENTITY_MODE=k8s_sa(agent-builder provisions the per-agent SA + projects the token).2. Populate the agentic-identity fields on PDP requests + audit events (lights up L2/L4)
POST /pdp/decidecaller:principal_sub, principal_iss, delegation_mode, actor_agent_id, actor_workload_id, attestation_level, mandate_id, grant_ref+chain_id, chain_hopon the request.delenum must match security-next exactly:chained | connected_account:user | connected_account:workspace | mandate | agent_own | none.3. L3 chain tokens — native ChainContext (Phase 2, framework-aware)
ChainContexthelpers mirroringWorkflowContext:FromHTTPHeaders/WithContext/ApplyToHTTPHeadersover headerX-Agent-Chain-Token(compact JWS).workflow_propagation.allowed_hosts.suband the outermostactfixed once at ingress; per-hopagentic_ctxreplaced.sub,act.wl = workload_identity_ref,agentic_ctx{chain_id, hop, org_id, workspace_id, entity_type, del, grant, purpose},attestation_level, TTL ~60s,jti,typ = application/vnd.initializ.chain-token+jwt.chain_id/chain_hopon emitted audit events (feeds theorg_chainindex + the foreign-agent detector, which flags actions lacking a gateway chain token).4. Egress-proxy chain propagation for non-Forge frameworks (§20)
The egress proxy reads the incoming chain token, re-mints for the hop, and stamps it outbound — so Strands / Claude Agent SDK / BYO get an unbroken chain without an SDK helper. Build this alongside the native path; the chain must be unbroken regardless of framework.
5. Token typ discipline (RFC 8725)
Validate
typat every forge verification point — a chain token must be rejected where an access token is expected. Media types:application/vnd.initializ.{platform-bearer,chain-token,workload-credential,mandate}+jwt.6. SPIRE mode (attested:workload) — when SPIRE ships (Phase 1.3/1.4)
INITIALIZ_SPIFFE_ID/SVID).cnf/x5t#S256-bind the chain token to the X.509-SVID → bind strengthattested:workload.k8s_samode the chain token stays an unbound bearer (attestation_level = attested:placement), replay-mitigated byactor_workload_idclaim checks + the ~60s TTL, and gated per-tool by the PDP bind-strength floor already merged (security-next#42, Decision Add LLM fallback chains, multi-LLM init wizard, and OpenAI OAuth #7). No global switch — forge just stampsattestation_levelaccurately.7. Release + rebuild
Cut a forge release including the above so agents bake it (
AGENT_FORGE_VERSION); the merged platform features stay inert until deployed agents carry the runtime hooks.Open decision
TTS placement (Decision #3, resolved as cluster-local): does forge mint/re-mint chain tokens in-process, or call a cluster-local token-exchange service? Settle before Phase-2 build.
Related existing issues (cross-link, not duplicates)
Suggested order
1 (present workload token → flip §19.13 enforce) → 2 (populate PDP/audit fields) → 5 (typ) → 3 (native ChainContext) → 4 (egress-proxy path) → 6 (SPIRE) → 7 (release). Items 1–2 deliver most of the value and are small.