Changes for README.md: 2 added lines, 2 removed lines.
Original line number
Diff line number
Diff line
@@ -22,7 +22,7 @@ This repository is an [Open Knowledge Format (OKF) v0.1](https://github.com/Goog
1. Read [platform/architecture.md](platform/architecture.md) for the end-to-end mental model.
2. Open the component folder ([oeg/](oeg/), [srm/](srm/), [fm/](fm/), [tf-sdk/](tf-sdk/), [data-lab/](data-lab/), [portal/](portal/), [ai2/](ai2/)) via its `index.md`.
3. Follow architecture → interface contract → persistence model → flow walk-throughs in that order.
3. Follow the reading order stated in that component’s index. OEG uses overview → requirements and design → implementation and delivery → interface contract.
4. When a spec cites an ADR, read the decision record for the rationale behind the rule.
**Looking up a term or cross-cutting concern**
@@ -50,4 +50,4 @@ This repository is an [Open Knowledge Format (OKF) v0.1](https://github.com/Goog
| [ai2/](ai2/) | AI² — agent and MCP server over OEG's APIs |
| [decisions/](decisions/) | Architecture Decision Records |
| [external-specs/](external-specs/) | Vendored third-party API definitions |
| [archive/](archive/) | Superseded working documents |
| `archive/` (planned) | Superseded working documents, created when needed |
**OEG implementation evidence:** the [OEG disagreement register](/oeg/requirements-and-design.md#n3-disagreements-and-decision-register) distinguishes intended contracts from selected implementation, including operations GET, native health/helpers, consent, messaging, relay query bytes and network-policy evidence. These disagreements remain unresolved.
## Mental Model
If you are new to FM, this is the simplest useful way to think about it:
@@ -85,7 +88,7 @@ There are two success definitions:
| Area | Current architecture position |
|---|---|
| **EWBI termination** | Terminate all inbound EWBI HTTPS requests routed via the partner-facing ingress under the OPG.04 server prefix `/operatorplatform/federation/v1/*`. That ingress is not deployed today, so there is no partner-facing EWBI ingress and inbound federation from external partner OPs is not exercised — it is a future release (OEG interface-contract §K.0). Separately, eight GSMA operations arrive for the operator-triggered *outbound* direction as a synchronous internal HTTP call from OEG's own `/platform/v1/federation/partners/{partnerOpId}/federations/...` namespace onto FM's mirrored `/internal/*` endpoint (§L.3b; ADR-0051), carrying the raw GSMA payload and query string byte-for-byte, protected only by cluster-internal network-policy reachability and validated/executed by FM — this path works today and does not depend on the partner-facing ingress. The two directions are on different paths entirely, not split at the ingress. Client mTLS is a future defense-in-depth layer (ADR-0042) for the EWBI partner hop, not required today and not applicable to the internal OEG→FM hop. |
| **EWBI termination** | Terminate all inbound EWBI HTTPS requests routed via the partner-facing ingress under the OPG.04 server prefix `/operatorplatform/federation/v1/*`. That ingress is not deployed today, so there is no partner-facing EWBI ingress and inbound federation from external partner OPs is not exercised — it is a future release (OEG [interface-contract §1](/oeg/interface-contract.md#1-api-surfaces-and-errors)). Separately, eight GSMA operations arrive for the operator-triggered *outbound* direction as a synchronous internal HTTP call from OEG's own `/platform/v1/federation/partners/{partnerOpId}/federations/...` namespace onto FM's mirrored `/internal/*` endpoint (§L.3b; ADR-0051), carrying the raw GSMA payload and query string byte-for-byte, protected only by cluster-internal network-policy reachability and validated/executed by FM — this path works today and does not depend on the partner-facing ingress. The two directions are on different paths entirely, not split at the ingress. Client mTLS is a future defense-in-depth layer (ADR-0042) for the EWBI partner hop, not required today and not applicable to the internal OEG→FM hop. |
| **Partner authentication** | OAuth2 Client-Credentials + signed JWT. Our Keycloak `federation` realm issues inbound tokens; each target partner's Authorization Server issues outbound tokens. FM validates `fed-mgmt` and maps inbound `azp` to the partner profile (ADR-0042). |
| **Federation agreement enforcement** | Check that the requesting partner has a valid agreement before routing any request. |
| **Outbound federation routing** | Resolve target partner from user identifiers (MSISDN — Mobile Station International Subscriber Directory Number — prefix, IP CIDR — Classless Inter-Domain Routing block) via routing table. Forward requests over EWBI to partner OPs. |
@@ -403,7 +406,7 @@ sequenceDiagram
An operator onboards, updates, or decommissions a federation partner.
-**Actor:** Operator, via OEG's synchronous proxy on `/platform/v1/federation/partners/...` (§N.7, §L.3b; ADR-0051) — partner registration, agreements, and the eight federation-lifecycle operations. Routing rules stay on FM's own internal admin API (L.2).
-**Actor:** Operator, via OEG's synchronous proxy on `/platform/v1/federation/partners/...` (OEG contract §5, FM §L.3b; ADR-0051) — partner registration, agreements, and the eight federation-lifecycle operations. Routing rules stay on FM's own internal admin API (L.2).
-**Trigger:** New bilateral agreement signed, OAuth2 credential rotation, endpoint change, or partner decommission — or FM's own bootstrap configuration at startup (ADR-0043).
-**Main flow:**
1.**Register the partner.** The operator calls `POST /platform/v1/federation/partners`; OEG forwards the L.2 partner body byte-for-byte to `POST /internal/partners`. Profile fields: name, MCC-MNC, the partner's EWBI base URL, the client ID we issued the partner, and for outbound calls our client ID at the partner, its secret (a mounted-file reference, or the value itself, stored encrypted; ADR-0067) and the partner's token endpoint.
@@ -584,19 +587,6 @@ goes through OEG at all — see G4.
## Revision History
| 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. |
| 2.0 | 2026-09-08 | Dropped the `X-Federation-Correlation-ID` extension (UC-FM-02/UC-FM-05, scope, glossary): no custom headers on EWBI; correlation via OPG.04 identifiers. |
| 2.0 | 2026-09-08 | OEG→FM transport for the *operator-triggered* federation-establishment trigger moves from async over the DataBus (ADR-0043) to a synchronous internal HTTP call (ADR-0046); scope, the operator endpoint and its payload are unchanged from ADR-0043. FM authenticates OEG's platform service credential and maps the operator payload to OPG.04; FM mints `federationContextId` and replies on the same call. Inbound EWBI termination is unchanged — the whole `/operatorplatform/federation/v1/*` prefix stays with FM, no OEG carve-out. UC-FM-06, boundaries and boundary matrix updated; `command.fm.federation.*` consumer row replaced. |
| 2.0 | 2026-09-08 | A.1 EWBI-termination row notes the Nginx EWBI ingress is not deployed today, so there is no partner-facing inbound EWBI ingress and inbound federation is a future release; the operator-triggered OEG→FM internal path (§L.3b) works today regardless. Clarification, no behaviour change. |
| 2.0 | 2026-09-08 | ADR-0051 corrects ADR-0046's scope/payload/namespace (transport kept): OEG serves **seven** canonical OPG.04 federation-lifecycle operations (create/read/update/delete federation, `GetFederationContextId`, zone subscribe/unsubscribe) for the operator-triggered *outbound* direction, on `/operatorplatform/federation/v1/*`, forwarding the raw GSMA payload **byte-for-byte** — FM no longer "maps an operator-facing payload to OPG.04". Inbound partner traffic on the same paths still terminates at FM; the two directions split at the ingress. Intro bullets, A.1 EWBI-termination row, UC-FM-06, dependency and boundary-matrix rows updated. |
| 2.0 | 2026-09-16 | ADR-0051 amended after FM-side review, reversing this file's own previous entry above: OEG's federation-lifecycle surface moves back to its own `/platform/v1/federation/partners/{partnerOpId}/federations/...` namespace, not the canonical prefix — the two directions no longer share a URL or split at the ingress at all. Eight operations now (`GetZoneData` added). The "authenticated by OEG's platform service credential" language is corrected everywhere it appeared: this hop has no dedicated credential, only cluster-internal network-policy reachability. Intro bullets, A.1 EWBI-termination row, UC-FM-06, dependency and boundary-matrix rows updated again. ADR-0047/0048 renumbered to ADR-0050/0051. |
| 2.0 | 2026-09-24 | UC-FM-06 rewritten: partner registration goes through OEG onto L.2 `/internal/partners` (the id FM assigns is the `partnerOpId`), agreements and routing rules stay on L.2 directly, federation establishment and later changes go through OEG. Removes the contradictory "read/update/decommission via L.2, unchanged" step. ADR-0051, amended 2026-09-24. |
| 2.0 | 2026-10-08 | UC-FM-07 / §G4: ADR-0053 amendment — SRM tracks pending partner targets in `service_order.federated_handoff`; no partner zone/instance inventory in SRM. |
| 2.0 | 2026-10-13 | UC-FM-06 matches the built FM: the profile fields are the partner API's, the secret may be typed in (ADR-0067); agreements and routing rules are not needed to federate (and not built yet); bootstrap federates with partners already registered, it does not register them; `CreateFederation`'s identity fields come from OEG's `GET /platform/v1/federation/identity`. ADR-0051, amended 2026-10-13. |
| 2.0 | 2026-10-13 | G4: the 30-minute deploy-callback wait is marked not built yet (ADR-0053). |
| 2.0 | 2026-10-13 | UC-FM-01, -03, -06 and -07 rewritten, text and diagrams, to match FM `develop`: `InstallApp` answers `202` and reports through `onInstanceStatusEvent`; the zones we offer are computed on request and partner zones come from `CreateFederation` and operator subscriptions; partner registration and federation go through OEG; the SRM hand-off runs over the DataBus with onboarding before `InstallApp`. Capacity check, rate limit and catalogue re-sync are marked not built yet. UC-FM-02, -04 and -05 (federated Device Location, Device Status and network capabilities such as QoS) are marked proposed, to be discussed in the next releases. |
| 2.0 | 2026-10-13 | Mental model, diagram, A.1, scope and assumptions match FM `develop`: the SRM hand-off goes over the DataBus; FM consumes only `event.srm.operation.completed`; the zones we offer are computed on request; no `oop-commons` dependency. Periodic partner health checks, `operation.status` consumption and the agreement/routing admin API marked not built yet; Service API capabilities and queries marked proposed |
| 2.0 | 2026-10-19 | UC-FM-06: agreements are proxied by OEG like partner registration, with `GET /local-zones` to pick zones; routing rules alone stay on L.2 (ADR-0051, amended 2026-10-15). |
| Version | Summary |
|---|---|
| 2.0 | Initial specification for OOP Release 2.0. |
| 2.1-draft | 2026-09-08 | `federation_contexts` landed in code; status vocabulary enumerated from the OPG.04 `Status` enum. |
| 2.1-draft | 2026-09-08 | `external_resource_id` records the wire spelling of the external identifier; LCM audit columns (idempotency key, request fingerprint, callback) landed in code. |
| 2.1-draft | 2026-10-13 | Single source for FM's schema: §J.1 takes over the table definitions from requirements-and-design §K.1, adding `partner_op_secrets` (ADR-0067) and `federation_agreements.zone_resources`. §J.2 subjects corrected for ADR-0051 and ADR-0053. Implementation status brought up to date with FM `develop`. |
| 2.1-draft | 2026-10-16 | `federation_agreements`: partial unique index `uq_federation_agreements_one_per_partner`, so a partner has one agreement that isn't `expired` (migration `0008_one_agreement_per_partner` marks the extra ones `expired`). |
| 2.1-draft | 2026-10-16 | `partner_ops.supported_apis` built (the partner's `platformCaps`); `federation_contexts.offered_zone_ids` added (migration `0009_zone_offer_state`). |
| 2.1-draft | 2026-10-13 | Full audit against FM `develop`: shared-resource types, synchronous-query audit order, secret storage, Alembic, operator access to `/internal/*` and topology-hiding names corrected; module tree moved to implementation-and-delivery §O; partner SLA/API columns and rate limiting marked not built yet. |
| Version | Summary |
|---|---|
| 2.0 | Initial specification for OOP Release 2.0. |