Changes for decisions/0046-oeg-fronts-federation-lifecycle-ewbi-as-sync-proxy.md: 1 added line, 1 removed line.
Original line number
Diff line number
Diff line
@@ -9,7 +9,7 @@ status: "accepted"
# ADR-0046: Operator-triggered federation establishment and zone subscription proxy synchronously through OEG to FM; no DataBus, no internal schema
**Status:** accepted
**Status:** accepted — the *transport* (synchronous internal HTTP OEG→FM, no DataBus, no `command.fm.federation.*`, stateless OEG) stands. The *scope* (three operations), *payload* (trimmed operator-facing shape, "not a raw `FederationRequestData`", FM maps it to OPG.04), and *namespace* (`/platform/v1/federation/*`) are superseded by [ADR-0048](/decisions/0048-oeg-fronts-federation-lifecycle-ewbi-byte-for-byte.md): seven canonical OPG.04 operations under `/operatorplatform/federation/v1/*`, raw GSMA payload forwarded byte-for-byte, operator-triggered outbound only, split from inbound EWBI at the ingress.
Changes for decisions/0047-oeg-federation-lifecycle-proxy-errors-are-gsma-problem-json.md: 1 added line, 1 removed line.
Original line number
Diff line number
Diff line
@@ -9,7 +9,7 @@ status: "accepted"
# ADR-0047: OEG's federation-lifecycle proxy endpoints return the GSMA OPG.04 problem+json error model, not CAMARA ErrorInfo
**Status:** accepted
**Status:** accepted — the error-model decision stands unchanged. The endpoint paths named below were later corrected by [ADR-0048](/decisions/0048-oeg-fronts-federation-lifecycle-ewbi-byte-for-byte.md): the surface is the seven canonical OPG.04 operations under `/operatorplatform/federation/v1/*`, not three under `/platform/v1/federation/*`. Read every `/platform/v1/federation/partners…` path in this ADR as the corresponding canonical OPG.04 path; the `ProblemDetails` rule applies to all seven.
# ADR-0048: OEG fronts seven GSMA federation-lifecycle operations on the canonical OPG.04 prefix, forwarding the raw payload byte-for-byte to FM (operator-triggered outbound only)
**Status:** accepted
**Date:** 2026-09-08
**Affects:**[oeg/architecture.md](/oeg/architecture.md), [oeg/interface-contract.md](/oeg/interface-contract.md), [fm/requirements-and-design.md](/fm/requirements-and-design.md), [fm/implementation-and-delivery.md](/fm/implementation-and-delivery.md), [fm/overview-and-architecture.md](/fm/overview-and-architecture.md), [platform/architecture.md](/platform/architecture.md), supersedes the scope/payload/namespace parts of [ADR-0046](/decisions/0046-oeg-fronts-federation-lifecycle-ewbi-as-sync-proxy.md), builds on [ADR-0047](/decisions/0047-oeg-federation-lifecycle-proxy-errors-are-gsma-problem-json.md), [ADR-0042](/decisions/0042-ewbi-oauth2-client-credentials-mtls-deferred.md)
## Context
[ADR-0046](/decisions/0046-oeg-fronts-federation-lifecycle-ewbi-as-sync-proxy.md) settled the
transport for the operator-triggered federation-establishment trigger — a synchronous internal
HTTP call OEG → FM, no DataBus, no `command.fm.federation.*` subject family, OEG holding no
federation state. That part is sound and this decision keeps it.
ADR-0046 also carried forward three assumptions from [ADR-0043](/decisions/0043-oeg-proxied-federation-establishment.md)
that a later review of the actual request shape showed to be wrong:
1.**Operation set.** ADR-0046 scopes OEG to *three* actions — establish a federation, and
subscribe / unsubscribe a zone — and keeps read, update, and delete of an existing federation
on FM's L.2 internal admin API only (REQ-FED-19).
2.**Payload.** ADR-0046 says the request body is "the operator-facing shape FM's L.2 internal
admin API already defines (`partnerEndpoint`, `mccMnc`, `supportedApis`, `zones`) … **not** a
raw OPG.04 `FederationRequestData`", with FM mapping that trimmed shape to OPG.04.
3.**Namespace.** ADR-0046 mounts the trigger under OEG's own platform namespace
(`POST /platform/v1/federation/partners` and siblings, ADR-0020), explicitly "not the EWBI
prefix".
The request body the caller actually sends is the GSMA `FederationRequestData` schema verbatim —
Changes for decisions/index.md: 2 added lines, 1 removed line.
Original line number
Diff line number
Diff line
@@ -48,5 +48,6 @@ the reasoning lives here. Never renumber; supersede instead (see the record-deci
*[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 (transport superseded by ADR-0046)
*[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
*[ADR-0045](0045-pin-narrows-candidates-not-probing.md) - a zone/domain pin narrows the device-targeted candidate set rather than bypassing target probing; probing is triggered by how many candidates survive the pin (amends ADR-0038's unpinned scoping)
*[ADR-0046](0046-oeg-fronts-federation-lifecycle-ewbi-as-sync-proxy.md) - operator-triggered federation establishment and zone subscription proxy synchronously through OEG to FM (no DataBus, no internal schema); scope and payload unchanged from ADR-0043, inbound EWBI stays entirely with FM (supersedes ADR-0043's transport)
*[ADR-0046](0046-oeg-fronts-federation-lifecycle-ewbi-as-sync-proxy.md) - operator-triggered federation establishment and zone subscription proxy synchronously through OEG to FM (no DataBus, no internal schema); scope and payload unchanged from ADR-0043, inbound EWBI stays entirely with FM (supersedes ADR-0043's transport; scope/payload/namespace corrected by ADR-0048)
*[ADR-0047](0047-oeg-federation-lifecycle-proxy-errors-are-gsma-problem-json.md) - OEG's federation-lifecycle proxy endpoints (§N.7, ADR-0046) return OPG.04 `application/problem+json``ProblemDetails` for every error - FM's errors relayed unchanged, OEG's own 400/401/403/502/503 from a fixed template; ADR-0030's `ErrorInfo` rule is scoped to OEG's CAMARA northbound surface
*[ADR-0048](0048-oeg-fronts-federation-lifecycle-ewbi-byte-for-byte.md) - OEG fronts seven canonical OPG.04 federation-lifecycle operations under `/operatorplatform/federation/v1/*` (create/read/update/delete federation, fed-context-id lookup, zone subscribe/unsubscribe), forwarding the raw GSMA request/response byte-for-byte to FM; operator-triggered outbound only, separated from inbound EWBI at the ingress; keeps ADR-0046's sync-HTTP/stateless/no-DataBus transport and ADR-0047's error model (corrects ADR-0046's three-operation, trimmed-operator-payload, platform-namespace scoping)
Changes for fm/implementation-and-delivery.md: 2 added lines, 0 removed lines.
Original line number
Diff line number
Diff line
@@ -446,6 +446,7 @@ remove the FM fleet from load balancing.
### S.3 Contract Tests
-**OPG.04 compliance:** Vendor the published OPG.04 v6.0 OpenAPI v1.4.0 artifact unchanged, apply only a separately reviewed/versioned profile overlay for recorded upstream defects, and compare FM's generated external OpenAPI against the resulting contract by method/path, parameters, required headers, request/response media types and schemas, status codes, callbacks, security-scheme names, and scopes. The canonical contract has 74 operations under `/operatorplatform/federation/v1`; CI fails on an undocumented alias or deviation.
-**Federation-lifecycle proxy alias (ADR-0048):** OEG also serves seven of these canonical operations — `CreateFederation`, `GetFederationDetails`, `UpdateFederation`, `DeleteFederationDetails`, `GetFederationContextId`, `ZoneSubscribe`, `ZoneUnsubscribe` — for the operator-triggered *outbound* direction, forwarding the raw GSMA payload byte-for-byte to FM. Both FM and OEG declaring these paths is **not** a gate violation: the two are separated at the ingress (partner-facing → FM, operator-facing → OEG), so each component's deployed surface is disjoint. Two follow-ups remain open: (1) FM still declares all 74 operations in its generated OpenAPI regardless — record this alias explicitly so the "undocumented alias" check does not flag it; (2) OEG's generated OpenAPI for those seven paths needs its own conformance check against the same vendored artifact + overlay, which does not exist yet. The OPG.04 contract version to pin and vendor is itself open (ADR-0048): the `federation-manager.yaml` in the `refactor/fm` code branch is `1.2.0` with snake_case operationIds and ~20 operations, inconsistent with the "v1.4.0 / 74 operations" language here.
-**Security metadata and runtime:** Preserve the root OpenAPI OR between `oAuth2ClientCredentials: [fed-mgmt]` and `notifClientCredentials: [fed-mgmt-notif]`, plus callback-specific notification security. Runtime policy must implement the declared operation security exactly or record a deliberate profile deviation; a runtime scope check alone does not repair incorrect OpenAPI metadata.
-**SRM interface:** Validate that `command.srm.*` messages published by FM conform to `CommandEnvelopeV1` and the per-subject payload schemas defined in [srm/interface-contract.md](/srm/interface-contract.md).
@@ -635,3 +636,4 @@ This validates the core architectural claim: FM publishes the same `command.srm.
| Version | Date | Summary |
|---------|------|---------|
| 2.0 | 2026-07-07 | OOP Release 2.0. |
| 2.0 | 2026-09-08 | S.3 Contract Tests: added the federation-lifecycle proxy alias note (ADR-0048) — OEG serves seven canonical OPG.04 operations for the operator-triggered outbound direction, disjoint from FM's surface by ingress split; open follow-ups recorded (explicit alias entry for the 74-op gate, an OEG-side conformance check, and the still-open OPG.04 contract version/vendoring). |