After reviewing #1877, I took a look at the other field module function docs w.r.t. their normalized/magnitude promises and found this mismatch: the secp256k1_fe_half docs state the output is normalized, but the impl sets r->normalized = 0 (it only halves the limbs, without a reduction):
This is a minimum-diff fix to match the implementation, with a similar "On output" structure as used for _fe_add:
https://github.com/bitcoin-core/secp256k1/blob/bd0287d650c24dc41e0362675a9f6a49ee952def/src/field.h#L246