Phase 2 wrote declarations and said, plainly, that nothing read them. A declaration is a claim about a bridge that has never been checked against the bridge. This phase turns one into a command line and proves it is right before anything is launched from it.
A renderer reads the agent plus its active revision and produces the complete 19-flag set a bridge would be launched with; a reconciler logs the actions it would take. The two production declarations are then diffed against what the live bridges are actually running — so a mis-bucketed flag or a wrong value surfaces as a readable table, instead of as a bridge that will not come up.
This phase spawns nothing. No exec, no fork, no process-spawning import in the package, no process created by any code path — including the tests. That is not caution, it is the seam: the entire config boundary can be verified at zero risk, and the next phase then only has to get spawning right.
Named explicitly so they could not be smuggled in: starting or killing anything, re-adoption of running bridges, the launchd plist, backoff and give-up, rotation of the log files this phase names, and the cutover itself.
⭐ And this phase is the acceptance test for Phase 2. Phase 2 could only assert its own rules against itself. This is the first time the declarations meet the processes they claim to describe.