If I create some component/system that depends on two (e.g. BulletRocketSystem) , I will have to aware the order of execution.
BulletRocketSystem should execute after Bullet and Rocket's system.
If Bullet will be deleted by Bullet_System's command, the BulletRocketSystem must be notified and remove reference of it.
This promotes couple between System, which is bad.
Moreover, there have to be a headquarter to enforce the order, I don't know if there is non-ugly way to do it.
Order of systems is a very basic thing that will need to be set one way or the other. You can't have all systems running in whatever order. Doesn't makes sense to render if the transforms haven't been updated. Doesn't makes sense to run the sound system or the asset streaming system if no movement was processed yet.
In Artemis ECS, and consequently, the fork I've been working on (dustArtemis, look at my signature), all systems get notified when entities get added, removed or changed. So they have the opportunity to react to situations like yours, or if an entity mutates (ie, you remove/add an effect over an entity).
Order is enforced because you set it indirectly (by the order in which you added sub systems to the World instance) or directly (via a priority value). Here:
Thats the main processing routine. First it notifies all systems of entity changes made during the last tick, then it notifies the entity and component managers of the same changes (so components can be removed/entities deleted) then it lets systems process their main workload, which might end up in more entity additions/removals. Rinse and repeat.
Moreover, the main focus of decoupling system ordering always seemed to be so you can run each system in their own thread. Over the years developers realized it isn't a good idea. Workloads of each subsystem vary a lot, so most of the time one thread would get chewed while the others would barely do anything. Nowadays the approach is to go "wide" at each system. Got a couple thousand tasks to run in the movement system? Parallelize them in groups, then collect the results (if such step is needed) and move to the next system.