"""Building, verifying, installing and rolling back a TaxPilot AI release.

The CMS updates itself: the vendor cannot reach a customer's cPanel, so the
installation has to pull, verify and apply its own packages. TaxPilot AI is the
other way round — it runs on infrastructure the vendor controls (ADR-0001, one
deployment per CMS install), so the vendor pushes.

That difference decides the design. This package builds and verifies artifacts
with the same offline-key discipline the CMS uses, but the transport is a
separate concern: today an operator runs `install` against a file, and a pull
transport can be added later without changing anything below it.

What is shared with the CMS deliberately:

  * the same offline RSA key, which never touches any server
  * signing a canonical manifest string rather than raw bytes
  * verify-before-extract, because everything after extraction writes to a live
    application directory

What is deliberately NOT shared is the manifest prefix. A CMS package signature
must never verify as an AI package, and vice versa — see manifest.py.
"""
