Changes for decisions/index.md: 1 added line, 0 removed lines.
Original line number
Diff line number
Diff line
@@ -40,3 +40,4 @@ the reasoning lives here. Never renumber; supersede instead (see the record-deci
*[ADR-0035](0035-qod-session-service-specification.md) - a QoD session references one platform-seeded service specification held in OEG config; profile names stay unvalidated, and QoS profiles are a catalog-layer concern (resolves F2)
*[ADR-0036](0036-srm-owns-network-capability-expiry.md) - SRM owns expiry of async network capabilities and reports it via event.srm.operation.status metadata (qos_status_info); OEG runs no timer and maps it to CAMARA DURATION_EXPIRED
*[ADR-0037](0037-canonical-target-ports.md) - target.device.ports / target.application_server.ports join srm.params/v1's canonical target descriptor, generic across every capability with a device/application-server target rather than allowlisted per capability_type
*[ADR-0038](0038-device-targeted-control-path-resolution.md) - device-targeted capabilities resolve their control path by probing candidate adapters with can_serve_target; the loop and the choice stay in SRM, the per-backend answer comes from TF-SDK
-**One generic capability-execution interface:** SRM depends on a single `CapabilityExecutionAdapter` interface — `activate_capability` / `update_capability` / `deactivate_capability` / `query_capability` / `get_capability_runtime_state`, plus optional discovery methods (`get_zones`, `get_domains`, `get_capabilities`, `get_control_path_bindings`) — used uniformly across compute, network, trust, data, federation, and custom domains. Capability-specific behavior is selected by a `capability_kind` string (e.g. `deploy_workload`, `qod_session`, `traffic_influence`) carried in the normalized request, not by a distinct Python type per capability. This avoids a combinatorial explosion of base classes as TF-SDK grows from two domains to five (see Future Architecture below).
-**One generic capability-execution interface:** SRM depends on a single `CapabilityExecutionAdapter` interface — `activate_capability` / `update_capability` / `deactivate_capability` / `query_capability` / `get_capability_runtime_state` / `can_serve_target`, plus optional discovery methods (`get_zones`, `get_domains`, `get_capabilities`, `get_control_path_bindings`) — used uniformly across compute, network, trust, data, federation, and custom domains. Capability-specific behavior is selected by a `capability_kind` string (e.g. `deploy_workload`, `qod_session`, `traffic_influence`) carried in the normalized request, not by a distinct Python type per capability. This avoids a combinatorial explosion of base classes as TF-SDK grows from two domains to five (see Future Architecture below).
-**Adapter/executor resolution via `control_path_ref`:** SRM does not read an `adapter_type` column from the database to pick an adapter. Placement resolves a `control_path_binding` for the matched capability, and the binding's `control_path_ref` is resolved through the runtime ControlPathRegistry to the concrete adapter and its infrastructure connection config (ADR-0004). The database stores only the stable `control_path_ref` string, never adapter config or secrets.
-**Capability gating:** If an adapter doesn't support a requested `capability_kind`/action, it fails fast with a typed error — not deep inside vendor-specific code.
-**Internal adapter organization is not prescribed by the contract:** how a given adapter shares code across vendors internally (e.g. common HTTP client, auth, circuit breaker) is an implementation detail behind `CapabilityExecutionAdapter`, not part of the SRM-facing interface.
@@ -1129,6 +1129,7 @@ CapabilityExecutionAdapter ← one interface, all domains
deactivate_capability(request)
query_capability(request)
get_capability_runtime_state(request)
can_serve_target(request) ← "is this subscriber reachable through me?"