I think I liked your `notify_on_job_completion` function a little better.  :)  Alternately, since `deferred_pool` is a public attribute of `SupervisorService` (although not of `ISupervisor`), maybe it'd be ok just to call `supervisor.deferred_pool.notify_when_empty`, if you wanted to avoid another function definition?

While this definitely works, and is not harmful (because `twisted.application.service.Service` is idempotent and just sets `self.running=0`, and `supervisor.stopService()` is mostly idempotent), I don't think `stopService` being idempotent is in the interface contract - so this depends upon those two specific implementations.  If `SupervisorService` inherited from a different subclass of `Service` at some point, it's possible that this would stop working.