Chronological record of significant changes to patchbay. Moved from AGENTS.md to keep agent-facing instructions concise.
For current architecture and conventions, see AGENTS.md.
- Device/Router handles return
ResultorOptioninstead of panicking on removed nodes. spawn()returnsResult<JoinHandle>.with_device/with_routerreturnOption<R>.
LabInnerstruct withnetnsandcanceloutside the topology mutex.with()/with_mut()helpers on handles for lock-access boilerplate.- Cached
name/nson Device/Router/Ix (zero-lock for common accessors). - Per-node
tokio::sync::Mutex<()>for operation serialization. parking_lot::Mutexfor the topology lock (no poisoning, compile-time await guard).- All handle mutation methods made async.
- Pre-await reads combined into single lock acquisitions.
- Expanded
LinkLimitswithjitter_ms,reorder_pct,duplicate_pct,corrupt_pct. - Added presets:
Lan,WifiBad,Mobile4G,Mobile3G,Satellite,SatelliteGeo. LinkCondition::Manualnow wrapsLinkLimits(was inline struct fields).- Old
Mobilepreset removed; TOML"mobile"deserializes toMobile4G. LinkCondition::to_limits()converts any preset to concreteLinkLimits.RouterBuilder::downlink_condition(LinkCondition)applies impairment at build time.tc netemcommand now conditionally emits jitter/reorder/duplicate/corrupt args.
- Added
NatConfig,NatConfigBuilder,ConntrackTimeoutsstructs. Nat::to_config()expands presets intoNatConfig.generate_nat_rules()builds nftables fromNatConfig(mapping/filtering enums).
- Added
Natenum:None,Home,Corporate,Cgnat,CloudNat,FullCone. - Implemented fullcone dynamic nftables map for reliable EIM.
- APDF filtering via
ct state established,relatedin forward filter chain. - Home NAT hole-punching verified and tested.
- API renames:
switch_route->set_default_route,switch_uplink->replug_iface,rebind_nats->flush_nat_state,set_impair->set_link_condition,impair_link->set_link_condition,impair_downlink->set_downlink_condition.
IpSupportenum:V4Only,DualStack,V6Only.- DAD consolidation, ULA addressing for downstream, all tests pass.
LabwithArc<LabInner>,Device/Routerhandles.- Builder API:
lab.add_router("name").nat(Nat::Home).build().await?. - Instant construction - topology built on
build(), notLab::load().
- ELF constructor bootstrap enters unprivileged user namespace before Tokio starts.
- No root or file capabilities required.
- Config-driven sim flow, iroh integration layout.
- Relay/QAD runtime wiring, transfer steps.
- FD-only netns backend, namespace lifecycle via in-process FD registry.
- VM orchestration (patchbay-vm), QEMU artifact staging.
- Browser UI (Vite + React), live progress, log viewer.
- Sim runner with progress.json, manifest.json, combined reports.
- Netlink-based cleanup, prefix isolation, Ctrl-C handling.
- NAT test harness + matrix coverage.
- NetnsManager with worker threads + single-thread Tokio per namespace.