Surfaced while debugging the rollback-dispatch fleet suite. Only promote and rollback finalize call PushPreviousSnapshot; the deploy-on-merge (orchestrate) path does not push a ring snapshot. So after seed+advance deploys, state..previous holds whatever was there before (a stale/cross-run entry), and a no-target rollback resolves its target from that, not from the just-deployed history. The rollback-dispatch suite was rewritten to anchor its assertion on cascade rollback preflight rather than a self-seeded sha to work around this. Product question: should deploy-on-merge advance the ring so a no-target rollback after a deploy returns to the prior deploy? Decide intended semantics and align the code + docs.
Surfaced while debugging the rollback-dispatch fleet suite. Only promote and rollback finalize call PushPreviousSnapshot; the deploy-on-merge (orchestrate) path does not push a ring snapshot. So after seed+advance deploys, state..previous holds whatever was there before (a stale/cross-run entry), and a no-target rollback resolves its target from that, not from the just-deployed history. The rollback-dispatch suite was rewritten to anchor its assertion on
cascade rollback preflightrather than a self-seeded sha to work around this. Product question: should deploy-on-merge advance the ring so a no-target rollback after a deploy returns to the prior deploy? Decide intended semantics and align the code + docs.