Hi, sorry for the delay.
1. Basically break is implemented to not be placed during service time but during the travel part.
Small explanation: suppose you have the route "A -> B", so the routing solver will use your
transit callback i.e. transit(/*from_index=*/A, /*to_index=*/B).
this transit can be split in two parts: the service time at node A and the travel time from A to B.
Since break can't overlap the service time the BreakInterval need to know which part of the transit value correspond to the service time thus you pass an solver index based array "node_visit_transit".
note: some time this "service time" is also call "pre-travel time".
2. May I have some links concerning the "issue" are you referring too ?
note: we start to have few samples:
vrp_break.py and
vrp_break_from_start.py to play with...
3. I'm afraid there is no easy way to implement break without using this method. e.g. if you try to model break as a dummy node with a service time equal the the break time you still have issue to compute the travel from and to this break since it has not a real location (i.e. A -?> Break -?> B) (ed also solver often use this to "teleport" vehicle from location to another far away from each other)
side note: In order for the solver to place a break along the route, this break will be integrated to the SlackVar i.e. each node should have a slackVar with a upper bound large enough so the solver can "place" the break in it.