Что в итоге для меня щёлкнуло про Moonlight и Phoenix на DuskVM, так это то, что разные модели состояний не требуют разных моделей окончательности.

Moonlight приходит с открываемым публичным следом аккаунта: балансы, отправитель, получатель, сумма, nonce.

Phoenix приходит через зашифрованные ноты, защищённые выходы и nullifier’ы.

Я всё время предполагал, что эти две формы каким-то образом будут требовать двух разных способов прийти к окончательности после DuskVM.

Но это не задача DuskDS.

Moonlight может оставаться формой аккаунта. Phoenix может оставаться формой ноты. DuskVM может принимать обе без принуждения одной превращаться в другую, при этом Dusk L1 всё равно задаёт получающемуся состоянию детерминированную границу окончательности.

Значит, ошибка была в предположении, что разные представления состояния требуют разных финалов.

Не требуют.

Dusk может позволить Moonlight и Phoenix оставаться фундаментально разными «под капотом», при этом всё равно давать обоим один и тот же ответ на единственный вопрос, который важен в конце:

когда это состояние становится окончательным?
#dusk $DUSK @Dusk