Live link quality and suspend

Live ethernet quality (NETEM) and suspend are Interaction as Code: they change the running lab through the agent HTTPS API using public YAML identity (n_1 + interface). They do not rewrite topology.yml.

Consoles remain the other Interaction as Code surface: Interaction as Code.

Two planes

Quality (delay / jitter / loss / bandwidth) Suspend
Desired state topology.yml source_impairment / destination_impairment none — there is no YAML *_suspend
Live apply POST /api/v1/projects/links/quality POST /api/v1/projects/links/suspend
Persist deploy / reconcile never
Observe inspect inspect runtime source_suspend / destination_suspend

Live quality always uses native save=0. persisted is always false. Persist later with YAML + deploy/reconcile. Do not use live apply to paper over a missing reconcile impairment write.

Identity

match.endpoints is exactly two public endpoints. endpoints[0] is source. Never send native EVE numeric ids.

LOAD, CREATE, and IMPORT all allow these ops (they are not topology mutation). Native lab.lock is not a gate.

Unknown pair → 400 unknown_link. Serial NETEM → 400 serial_impairment_unsupported.

CLI

eve-iac link quality ./lab --from n_1:e0/0 --to n_2:e0/1 --delay 50 --loss 1
eve-iac link suspend ./lab --from n_1:e0/0 --to n_2:e0/1 --side source
eve-iac link resume ./lab --from n_1:e0/0 --to n_2:e0/1

SDK

applyLinkQuality / setLinkSuspend (Python apply_link_quality / set_link_suspend). Generated from OpenAPI like every other v1 op.

MCP

eve_iac_link_quality and eve_iac_link_suspend. Observe with eve_iac_inspect. Do not eve_iac_edit a fake suspend field.