Commit f17e83c0 authored by George Papathanail's avatar George Papathanail
Browse files

docs: renumber federation ADRs and sync docs to ADR-0051's amendment

parent 098551f1
Loading
Loading
Loading
Loading
+1 −1
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 — the *transport* (synchronous internal HTTP OEG→FM, no DataBus, no `command.fm.federation.*`, stateless OEG) and the *namespace* (`/platform/v1/federation/*`) stand. The *scope* (three operations) and *payload* (trimmed operator-facing shape, "not a raw `FederationRequestData`", FM maps it to OPG.04) are superseded by [ADR-0048](/decisions/0048-oeg-fronts-federation-lifecycle-ewbi-byte-for-byte.md): eight operations, raw GSMA payload forwarded byte-for-byte, each scoped by an explicit `partnerOpId` path segment, operator-triggered outbound only, split from inbound EWBI at the ingress. ADR-0048's first version (2026-09-08) had also moved the namespace onto the bare canonical OPG.04 paths; that part was reverted in its 2026-09-15 amendment, which restores this ADR's namespace decision.
**Status:** accepted — the *transport* (synchronous internal HTTP OEG→FM, no DataBus, no `command.fm.federation.*`, stateless OEG) and the *namespace* (`/platform/v1/federation/*`) stand. The *scope* (three operations) and *payload* (trimmed operator-facing shape, "not a raw `FederationRequestData`", FM maps it to OPG.04) are superseded by [ADR-0051](/decisions/0051-oeg-fronts-federation-lifecycle-ewbi-byte-for-byte.md): eight operations, raw GSMA payload forwarded byte-for-byte, each scoped by an explicit `partnerOpId` path segment, operator-triggered outbound only, split from inbound EWBI at the ingress. ADR-0051's first version (2026-09-08) had also moved the namespace onto the bare canonical OPG.04 paths; that part was reverted in its 2026-09-15 amendment, which restores this ADR's namespace decision.
**Date:** 2026-09-08
**Affects:** [oeg/architecture.md](/oeg/architecture.md), [oeg/interface-contract.md](/oeg/interface-contract.md), [fm/overview-and-architecture.md](/fm/overview-and-architecture.md), [fm/requirements-and-design.md](/fm/requirements-and-design.md), [platform/architecture.md](/platform/architecture.md)

+3 −3
Changes for decisions/0050-oeg-federation-lifecycle-proxy-errors-are-gsma-problem-json.md: 3 added lines, 3 removed lines.
Original line number Diff line number Diff line
---
type: Decision Record
title: "ADR-0047: OEG's federation-lifecycle proxy endpoints return the GSMA OPG.04 problem+json error model, not CAMARA ErrorInfo"
title: "ADR-0050: OEG's federation-lifecycle proxy endpoints return the GSMA OPG.04 problem+json error model, not CAMARA ErrorInfo"
description: "The operator-facing federation-lifecycle proxy endpoints (POST/DELETE /platform/v1/federation/partners..., ADR-0046) use OPG.04 application/problem+json ProblemDetails for every error - relayed FM errors and OEG-originated ones (operator auth, body schema, FM unreachable); ADR-0030's ErrorInfo rule is scoped to OEG's CAMARA northbound surface"
tags: [adr]
timestamp: 2026-09-08T00:00:00Z
status: "accepted"
---

# ADR-0047: OEG's federation-lifecycle proxy endpoints return the GSMA OPG.04 problem+json error model, not CAMARA ErrorInfo
# ADR-0050: OEG's federation-lifecycle proxy endpoints return the GSMA OPG.04 problem+json error model, not CAMARA ErrorInfo

**Status:** accepted — the error-model decision stands unchanged. The endpoint set named below was later extended by [ADR-0048](/decisions/0048-oeg-fronts-federation-lifecycle-ewbi-byte-for-byte.md): the surface is eight operations under `/platform/v1/federation/partners/{partnerOpId}/federations/...` (the namespace and paths below are current, only widened with the `partnerOpId` segment and `GetZoneData`), not three. The `ProblemDetails` rule applies to all eight.
**Status:** accepted — the error-model decision stands unchanged. The endpoint set named below was later extended by [ADR-0051](/decisions/0051-oeg-fronts-federation-lifecycle-ewbi-byte-for-byte.md): the surface is eight operations under `/platform/v1/federation/partners/{partnerOpId}/federations/...` (the namespace and paths below are current, only widened with the `partnerOpId` segment and `GetZoneData`), not three. The `ProblemDetails` rule applies to all eight.
**Date:** 2026-09-08
**Affects:** [oeg/interface-contract.md](/oeg/interface-contract.md), [oeg/architecture.md](/oeg/architecture.md), [fm/requirements-and-design.md](/fm/requirements-and-design.md), [platform/glossary.md](/platform/glossary.md), [platform/architecture.md](/platform/architecture.md)

+6 −6
Changes for decisions/0051-oeg-fronts-federation-lifecycle-ewbi-byte-for-byte.md: 6 added lines, 6 removed lines.
Original line number Diff line number Diff line
---
type: Decision Record
title: "ADR-0048: OEG fronts eight GSMA federation-lifecycle operations on its own platform namespace, scoped by partner id, forwarding the raw payload byte-for-byte to FM (operator-triggered outbound only)"
description: "The operator-triggered outbound federation-lifecycle surface stays on OEG's own platform namespace, /platform/v1/federation/partners/{partnerOpId}/federations/..., with the registered partner named explicitly in the path; the raw GSMA request/response is carried byte-for-byte through OEG to FM, pinned to OPG.04 v6.0 / artifact v1.4.0. Corrects this ADR's own first version, which moved the surface onto the bare canonical OPG.04 paths and lost the partner addressing GSMA gets for free from the URL in a direct operator-to-operator call. Keeps ADR-0046's synchronous-HTTP transport, stateless-OEG, and no-DataBus decisions and ADR-0047's error model."
title: "ADR-0051: OEG fronts eight GSMA federation-lifecycle operations on its own platform namespace, scoped by partner id, forwarding the raw payload byte-for-byte to FM (operator-triggered outbound only)"
description: "The operator-triggered outbound federation-lifecycle surface stays on OEG's own platform namespace, /platform/v1/federation/partners/{partnerOpId}/federations/..., with the registered partner named explicitly in the path; the raw GSMA request/response is carried byte-for-byte through OEG to FM, pinned to OPG.04 v6.0 / artifact v1.4.0. Corrects this ADR's own first version, which moved the surface onto the bare canonical OPG.04 paths and lost the partner addressing GSMA gets for free from the URL in a direct operator-to-operator call. Keeps ADR-0046's synchronous-HTTP transport, stateless-OEG, and no-DataBus decisions and ADR-0050's error model."
tags: [adr]
timestamp: 2026-09-15T00:00:00Z
status: "accepted"
---

# ADR-0048: OEG fronts eight GSMA federation-lifecycle operations on its own platform namespace, scoped by partner id, forwarding the raw payload byte-for-byte to FM (operator-triggered outbound only)
# ADR-0051: OEG fronts eight GSMA federation-lifecycle operations on its own platform namespace, scoped by partner id, forwarding the raw payload byte-for-byte to FM (operator-triggered outbound only)

**Status:** accepted — amended 2026-09-15 after FM-side review of the first version. **This ADR is due for renumbering before merge**: 0047 and 0048 are already taken on `develop` and `docs/platform-roles`; keep the content, pick free numbers at merge time.
**Status:** accepted — amended 2026-09-15 after FM-side review of the first version. Originally drafted as ADR-0048 (and its error-model companion as ADR-0047); renumbered to 0051/0050 at 2026-09-16 to clear the collision with `develop`'s ADR-0047 (terminal-record-read) and `docs/platform-roles`'s ADR-0048 (platform-roles) — content unchanged by the renumbering.
**Date:** 2026-09-08 (amended 2026-09-15)
**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), amends this ADR's own first version, restores the namespace part of [ADR-0046](/decisions/0046-oeg-fronts-federation-lifecycle-ewbi-as-sync-proxy.md) it had superseded, 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)
**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), amends this ADR's own first version, restores the namespace part of [ADR-0046](/decisions/0046-oeg-fronts-federation-lifecycle-ewbi-as-sync-proxy.md) it had superseded, builds on [ADR-0050](/decisions/0050-oeg-federation-lifecycle-proxy-errors-are-gsma-problem-json.md), [ADR-0042](/decisions/0042-ewbi-oauth2-client-credentials-mtls-deferred.md)

## Context

@@ -183,7 +183,7 @@ What stays the same:
  federation state (no `operations` row, no domain model, repository, migration, or completion
  consumer); OEG does no OPG.04 protocol logic; FM owns all federation state including
  `federationContextId`.
- Every error on these endpoints is OPG.04 `application/problem+json` `ProblemDetails` (ADR-0047),
- Every error on these endpoints is OPG.04 `application/problem+json` `ProblemDetails` (ADR-0050),
  unchanged by this amendment.

Revisit trigger:
+3 −3
Changes for decisions/index.md: 3 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ 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; 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)
* [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-0051)
* [ADR-0049](0049-terminal-record-read-follows-camara-schema.md) - terminal-record read behaviour follows each family's own vendored CAMARA schema: Traffic Influence returns 200 with `state: deleted`, QoD stays 404 (amends ADR-0034's blanket 404 rule and its 204 delete code)
* [ADR-0050](0050-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-0051](0051-oeg-fronts-federation-lifecycle-ewbi-byte-for-byte.md) - OEG fronts eight GSMA federation-lifecycle operations on its own platform namespace, `/platform/v1/federation/partners/{partnerOpId}/federations/...`, scoped by a registered `partnerOpId` (create/read/update/delete federation, fed-context-id lookup, zone list/subscribe/details/unsubscribe), forwarding the raw GSMA request/response byte-for-byte to FM including the query string, pinned to GSMA OPG.04 v6.0 / artifact v1.4.0; operator-triggered outbound only, separated from inbound EWBI at the ingress; keeps ADR-0046's sync-HTTP/stateless/no-DataBus transport and ADR-0050's error model (amends this ADR's own first version, which used the bare canonical OPG.04 paths and lost the partner addressing GSMA gets for free from the URL)
+3 −2
Changes for fm/implementation-and-delivery.md: 3 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -446,7 +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.
- **Federation-lifecycle proxy alias (ADR-0051):** OEG also serves eight GSMA operations — `CreateFederation`, `GetFederationContextId`, `GetFederationDetails`, `DeleteFederationDetails`, `GetZoneData`, `ZoneSubscribe`, `GetZoneDetails`, `ZoneUnsubscribe` (`UpdateFederation` out of scope) — for the operator-triggered *outbound* direction, forwarding the raw GSMA payload and query string byte-for-byte to FM. Unlike the first version of ADR-0051, this is not a shared-URL/ingress-split situation: OEG serves these on its own `/platform/v1/federation/partners/{partnerOpId}/federations/...` namespace, never the canonical `/operatorplatform/federation/v1/*` prefix, so there is no path collision to reconcile at the gate. Two follow-ups remain open: (1) FM still declares all 74 operations in its generated OpenAPI regardless — this alias needs recording explicitly so the "undocumented alias" check does not flag it against OEG's own, differently-shaped paths; (2) OEG's generated OpenAPI for those eight paths needs its own conformance check, validating request/response **bodies** (not routes, which are OEG's own) against the same vendored artifact + overlay — this does not exist yet. The OPG.04 contract version to pin is resolved (ADR-0051): GSMA OPG.04 v6.0 / artifact v1.4.0, validated against FM's profiled overlay `docs/OPG.04-v6.0-EWBI-Federation-API-v1.4.0-oop-profile.yaml`. The legacy `federation-manager.yaml` (`1.2.0`, snake_case operationIds, ~20 operations) present in earlier drafts of the `refactor/fm` code branch is not a GSMA artifact and is not used by this surface.
- **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).

@@ -636,4 +636,5 @@ 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). |
| 2.0 | 2026-09-08 | S.3 Contract Tests: added the federation-lifecycle proxy alias note (ADR-0051) — 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). |
| 2.0 | 2026-09-16 | ADR-0051 amended after FM-side review, reversing this file's own previous entry above: OEG's alias moves to its own `/platform/v1/federation/partners/{partnerOpId}/federations/...` namespace, not the canonical prefix, removing the ingress-split framing entirely (no path collision at all). Now eight operations (`GetZoneData` added). The OPG.04 contract version question is resolved — pinned to v6.0 / artifact v1.4.0, FM's profiled overlay. ADR-0047/0048 renumbered to ADR-0050/0051. |
Loading