pub fn program_id<F: TowerField, P: Program<F>>(program: &P) -> Result<[u8; 32]>
Deterministic 32-byte structural ID. Witness-independent, num_rows-independent. Same program shape -> same ID.