The starting styles lose to any equal rule written below them.
The common read: @starting-style is a rule like any other, so it can go anywhere the selector matches.
The declarations inside @starting-style are resolved by the ordinary cascade with their ordinary specificity, so a later rule of equal specificity overwrites them before the browser samples them as a from-state. This cascade rule is why the block goes AFTER the rule whose starting values it sets. The at-rule adds no specificity, no priority and no separate cascade step; it groups declarations the way @media groups them, and the cascade orders grouped declarations by their selector and their position in the file.
A from-state has to be supplied because a transition needs a before-change style and an after-change style. An element that was not rendered a moment ago has no before-change style for this style change, so the browser substitutes a starting style: the after-change style computed again with the matching @starting-style rules added to the cascade. The ordinary cascade applies them, so an equal-specificity rule below the block overwrites the starting declarations, the substituted style equals the end state, and two identical values start no transition.
@starting-style is supported in every browser. Support was added recently, so check it against the oldest browser versions you support. The placement rule holds in every version, because it is a cascade fact rather than an implementation detail, and it is also why the nested form is the better default: written inside the rule whose starting values it sets, @starting-style cannot be moved above that rule by an editor, a sort-properties tool or a merge.
The browser parsed the rule and did not animate the palette. The specification requires this behaviour.

