It's mostly just an artifact of my thinking of registering StageId -> JobId and JobId -> StageId as separate, independent operations -- driven somewhat by the way locally run jobs are treated differently from normal Spark jobs.  You're right, though, that they can (and really should) be more tightly coupled, for an efficiency gain at the cost of a little more cleanup on local job completion.