If you come from Ethereum, Solana, or almost any other smart-contract chain, you carry a quiet assumption: a transaction either lands fully or it does not land at all. Midnight breaks that assumption on purpose.

A Midnight transaction can succeed in one section and fail in another and the successful section still commits. Fees paid for the failed work are still consumed. That is not an edge case. It is the execution model.

This article walks through the three-stage pipeline documented in Midnight's transaction semantics, then maps it to what you write in Compact with kernel.checkpoint(), and finally to what your DApp client must check after submission.

Why this matters more than another “intro to privacy” post

Most Midnight content stops at “ZK + shielded tokens.” Useful, but it does not prepare you for the failure modes that actually burn builders: