Changes for decisions/index.md: 2 added lines, 0 removed lines.
Original line number
Diff line number
Diff line
@@ -45,3 +45,5 @@ the reasoning lives here. Never renumber; supersede instead (see the record-deci
*[ADR-0040](0040-target-serveability-is-a-tri-state.md) - can_serve_target answers can_serve | unknown_subscriber | unsupported_identifier; a boolean cannot carry the 404/422 split §E.2 requires, and 404 needs positive evidence (supersedes ADR-0038's boolean)
*[ADR-0041](0041-tfsdk-owns-adapter-construction.md) - TF-SDK builds adapters behind a factory keyed by adapter kind; SRM resolves control_path_ref to an instance but never enumerates adapter kinds
*[ADR-0042](0042-ewbi-oauth2-client-credentials-mtls-deferred.md) - E/WBI authorization is OAuth2 Client-Credentials: local Keycloak for inbound, partner Authorization Server for outbound; mTLS deferred
*[ADR-0043](0043-oeg-proxied-federation-establishment.md) - operator-triggered federation establishment is proxied through OEG over the DataBus (command.fm.federation.*); FM also supports config-driven bootstrap federation
*[ADR-0044](0044-srm-owns-federated-zone-locality-and-hand-off.md) - SRM resolves Edge Cloud Zone locality for deployment targets and forwards non-local deploys to FM; interim layer pending a future runtime-coordinator component
Changes for fm/overview-and-architecture.md: 43 added lines, 8 removed lines.
Original line number
Diff line number
Diff line
@@ -23,6 +23,8 @@ If you are new to FM, this is the simplest useful way to think about it:
-**FM does not fulfill requests itself.** For OPG.04 lifecycle mutations (install/remove application and supported network-capability operations), it publishes the same `command.srm.*` commands to DataBus that OEG publishes (ADR-0001). For stateless queries (device location, device status), it calls SRM's internal HTTP endpoints synchronously. Either way, SRM handles all fulfillment identically regardless of whether the request came from OEG or FM.
-**FM enforces topology hiding.** Before any response leaves the operator boundary, FM strips internal IPs, cluster names, namespace names, pod UIDs, node names, and internal trace IDs. Partner operators never see our internal infrastructure details.
-**FM manages partner relationships.** It stores partner operator profiles, federation agreements, routing rules, and shared resource catalogues in its own PostgreSQL database (`fm_db`).
-**Establishing a new federation is triggered two ways (ADR-0043):** an operator-facing action proxied through OEG (persist + publish `command.fm.federation.*`, no orchestration in OEG), or FM self-initiating from bootstrap configuration at startup. Either way, FM alone executes the outbound OPG.04 `CreateFederation`/`ZoneSubscribe` handshake.
-**For zone-based deployment targeting, SRM — not OEG — determines locality and hands off to FM (ADR-0044).** SRM checks its own zone inventory first, queries FM for federated zone data when the target isn't found locally, and forwards the deploy using FM's internal schema. This is an interim layer pending a future "runtime coordinator" component (see [platform/future-architecture.md](/platform/future-architecture.md) §6.1). OEG's outbound hand-off to FM (below) is now scoped to subscriber-identifier (MSISDN/IP) routing only.
```text
Partner Operators
@@ -225,7 +227,11 @@ A partner operator requests deployment of an edge application on our infrastruct
A locally connected App Provider makes a request that targets a subscriber or resource on a partner network. OEG detects that the target cannot be served locally and hands off to FM.
**Scope (ADR-0044):** this use case covers subscriber-identifier-based routing (MSISDN/IP) for
UC-FM-07 below — the hand-off there comes from SRM, not OEG.
A locally connected App Provider makes a request that targets a subscriber on a partner network. OEG detects that the target cannot be served locally and hands off to FM.
-**Actor:** FM (on behalf of local App Provider, triggered by OEG)
-**Trigger:** OEG determines the request target (MSISDN, IP) belongs to a partner network.
@@ -287,14 +293,31 @@ A partner operator queries device location or device status for a subscriber tha
An operator onboards, updates, or decommissions a federation partner.
-**Actor:** Operator (via Portal admin console or internal API)
-**Trigger:** New bilateral agreement signed, OAuth2 credential rotation, endpoint change, or partner decommission.
-**Actor:** Operator, normally via OEG's proxied federation-establishment trigger (ADR-0043); Portal or FM's own internal admin API (L.2) remain available for direct read/update/decommission operations on existing partner records.
-**Trigger:** New bilateral agreement signed, OAuth2 credential rotation, endpoint change, or partner decommission — or FM's own bootstrap configuration at startup (ADR-0043).
1. Operator triggers creation via OEG (`command.fm.federation.create`) or FM self-initiates from bootstrap config; profile fields are the same either way (EWBI/token endpoints, inbound and outbound OAuth2 client IDs, mounted-secret reference, supported APIs, SLA limits).
2. FM stores profile in `partner_ops` table.
3. FM creates/updates federation agreement in `federation_agreements` table.
4. FM populates routing rules.
5. FM uses OPG.04 federation-management operations (`CreateFederation`, `GetFederationHealth`, `RenewFederation`) with the partner.
6. Subsequent read/update/decommission operations on an existing partner use FM's L.2 internal admin API directly (unchanged by ADR-0043).
### UC-FM-07: Outbound Federated Deployment via SRM (ADR-0044)
A locally connected App Provider deploys to an Edge Cloud Zone that turns out to be on a partner network. SRM — not OEG — detects this and hands off to FM.
-**Actor:** FM (on behalf of local App Provider, triggered by SRM)
-**Trigger:** SRM's zone-locality check finds the target `zone_id` is absent from its own inventory and present in FM's federated zone data.
-**Main flow:**
1. OEG publishes `command.srm.service.deploy` unconditionally, as it does for every deploy (no locality check in OEG).
2. SRM checks its own zone inventory; not found locally, so it queries FM for federated zone/capability data.
3. FM returns the matching federated zone entry (from `shared_resource_catalogues`).
4. SRM forwards the deploy to FM using FM's internal schema (not raw GSMA/OPG.04) — exact request/response contract, retry, and timeout semantics are an open item (§G4).
5. FM maps the request to OPG.04 `InstallApp` and executes the outbound EWBI call to the partner's FM, through the same code path used for inbound federation-originated deploys (UC-FM-01's fulfillment pipeline).
6. FM reports the result back to SRM, which resumes its normal `event.srm.operation.completed` lifecycle for the original command.
-**Why this exists:** Keeps placement (local-vs-federated) a single SRM-owned decision instead of splitting it between OEG and FM; see ADR-0044.
-**Interim status:** this SRM-side hand-off is a deliberate stopgap pending a future "runtime coordinator" component (platform/future-architecture.md §6.1) that will eventually own it.
---
@@ -330,7 +353,7 @@ An operator onboards, updates, or decommissions a federation partner.
FM sits between **partner operators** and **internal platform services**:
| Consuming `command.fm.federation.*` (ADR-0043) | **FM** (published by OEG) |
| TF-SDK adapter invocation | **SRM** (not FM) |
| Placement decisions | **SRM** (not FM) |
| Placement decisions, including local-vs-federated zone determination for deployment targets (ADR-0044) | **SRM** (not FM) |
| Service and resource inventory | **SRM** (not FM) |
---
@@ -375,11 +399,21 @@ Per the component boundary matrix:
**Recommendation:** Initially, FM does not implement consent forwarding. Consent is enforced at the leading OP's OEG before the request is federated. When the CAMARA ICM spec stabilizes, FM forwards an opaque consent reference in EWBI headers. This is a cross-cutting concern with the Consent domain in TF-SDK's future architecture.
### G3. OEG → FM Hand-off for Outbound Federation
### G3. OEG → FM Hand-off for Outbound Federation (subscriber-identifier routing only)
**Scope note (ADR-0044):** this question, and its recommendation, cover subscriber-identifier
(MSISDN/IP) routing for synchronous query APIs only. Zone-based deployment targeting no longer
goes through OEG at all — see G4.
**The question:** When OEG detects that a request requires federation (target MSISDN/IP is not local), what is the hand-off mechanism to FM?
**Recommendation:** Internal HTTP from OEG to FM for all outbound federation hand-offs (synchronous queries and lifecycle forwards). OEG calls FM with the routing identifiers and original request context; FM resolves the partner, forwards over EWBI, and returns the result to OEG. This keeps EWBI protocol knowledge inside FM and avoids a second async hop on the developer-facing latency path. Initially, OEG rejects non-local requests with a 400/404 (federation not yet available). The OEG spec already anticipates this pattern in UC-OEG-05.
**Recommendation:** Internal HTTP from OEG to FM for all outbound federation hand-offs (synchronous queries). OEG calls FM with the routing identifiers and original request context; FM resolves the partner, forwards over EWBI, and returns the result to OEG. This keeps EWBI protocol knowledge inside FM and avoids a second async hop on the developer-facing latency path. Initially, OEG rejects non-local requests with a 400/404 (federation not yet available). The OEG spec already anticipates this pattern in UC-OEG-05.
### G4. SRM → FM Hand-off for Federated Deployment (ADR-0044)
**The question:** When SRM determines a deploy target zone is federated (UC-FM-07), what is the exact hand-off contract to FM — synchronous internal HTTP (matching every other FM↔SRM internal call in this document) or a new async DataBus command?
**Status:** unresolved. The 2026-09-01 TSC+MDL meeting decided SRM (not OEG) owns this hand-off, but did not conclude the transport. **Recommendation:** default to synchronous internal HTTP for consistency with L.4's existing FM↔SRM pattern, with SRM treating the call as part of its own already-async `command.srm.service.deploy` handling (SRM owns retry/timeout toward FM, not OEG). Revisit once FM/SRM implementation work starts on UC-FM-07.
---
@@ -388,3 +422,4 @@ Per the component boundary matrix:
| Version | Date | Summary |
|---------|------|---------|
| 2.0 | 2026-07-07 | OOP Release 2.0. |
| 2.0 | 2026-09-04 | Added OEG-proxied federation-establishment trigger and FM bootstrap config (ADR-0043, UC-FM-06 updated). Added UC-FM-07: SRM (not OEG) now owns zone-based deployment locality and the hand-off to FM (ADR-0044); UC-FM-02/G3 narrowed to subscriber-identifier routing; added G4 for the open SRM→FM transport question. |