3f7bc3815e
Fleetd.main kept config loading, startup reports and validation. Everything from the herdr socket connect onward moved verbatim, same order, into FleetdAssembly.assembleAndStart(AssemblyInputs, ResourcePorts), which returns a FleetdRuntime owning the real objects (package-private accessors, never a copy) and their single ordered close(). ResourcePorts/SystemResourcePorts abstract every boot-time side effect (env, herdr connect, broker openers, clocks, schedulers, shutdown-hook registration, HTTP start) with no inert production variant, per the architect proposal on the ticket. sleepHerdrPoll widened from private to package-private so FleetdAssembly can pass a method reference to it; no other signature changed. FleetdAssemblyLifecycleTest drives the real assembly with FakeHerdr, a temp FleetConfig and a fake ResourcePorts recording a start/close ledger, asserting it against the order recorded from the pre-move main() and shutdown hook, and proving every resource the ledger can observe (herdr client, three schedulers, the AMQP reply inbox) closes via FleetdRuntime.close(). FakeHerdr gained a closed flag for this.