The conflict-modal path bypassed the FSM extension landed in L.7: panels/detail.lua set ctx.modal_open directly and init.lua drove modal handling off the side-channel field, so STATE_MODAL_CONFLICT was unreachable at runtime (only the test-lib asserts exercised it). Now detail.lua marks ctx._pending_modal_open and init.lua dispatches the open_conflict event so state actually transitions through the fsm. Modal entry/exit is gated on state == STATE_MODAL_CONFLICT. Also fixes the conflict body line: r.missing doesn't exist on the dep-fetcher result; use #(errors) + #(conflicts) for the count displayed in the modal body.
17 KiB
17 KiB