We keep the top-level commitment clean by committing to sub-structures.

4.1 Control Key Commitment

control_key_commitment = Hash(
    "LIVRE_CTRL_KEY_V1" ||
    key_scheme_id ||       // e.g. ed25519, secp256k1, MPC profile, etc.
    public_key_bytes ||
    key_metadata_root      // optional Merkle root of extra key metadata
)

4.2 Recovery Key Commitment

recovery_key_commitment = Hash(
    "LIVRE_RECOVERY_V1" ||
    recovery_scheme_id ||  // e.g. social, hardware, MPC, etc.
    recovery_data_root     // Merkle root of scheme config
)

4.3 Attributes Root

attributes_root is the Merkle root of attribute leaves inside the Vault:

attributes_root = MerkleRoot([
    leaf(attribute_1),
    leaf(attribute_2),
    ...
])

Each leaf(attribute_i) is a commitment to the attribute descriptor + value

(you already started this in Descriptors & Attributes).

4.4 Policies Root

policies_root is the Merkle root of policy leaves, describing: