I have since gotten the system working (mostly) properly. Here's my macro (note I changed switches, so trigger height changed to 2.92):
;; NB Your G31 must be set to 0 G31 X0 Y30 Z0 P1
;; M585 needs 15 (because that's where we start ) - trigger height of switch
;; so mine is 15-2.92 -12.08
;;G1 X0 Y82.1 moves my nozzle over the switch. YMMV. 😄
M574 Z0 S0 ; set up the Z min endstop
G10 L1 P0 Z0 ; remove any existing offset
G28 Z ; home Z
T0 ; select tool
G90
G1 Z15 F300 ; go to 15mm
G1 X0 Y82.1 F3200 ; move to switch
M585 Z-12.08 E2 L0 F60 S1 ; probe
G1 Z15 F600; move back off the switch
I've tested this ... many 🙂 ... times and it produces the behavior I expected; that is, it sets the tool offset such that when I G0 Z0, the nozzle is at the bed. I can swap hot ends or nozzles, run the tool offset macro, M500, and start printing. I'm starting at 15 and moving towards 0. It's not intuitive which sign should be the right one, in either sense, though I think the way it's implemented makes sense to folks who've grown up using CNC mills.