Plan 4 Task 2c.3c.1. Additive only — no production callers (2c.3c.4
wires them). Mirrors 2c.3b's forward phase split for the same
composition reason: cuBLAS Linear_b backward must run BETWEEN GLU
backward and ELU backward.
New methods on GrnBlock:
- backward_raw_phase1: LN_bwd + LN_dgamma_dbeta_p1 + LN_dgamma_dbeta_p2
+ GLU_bwd. Produces d_linear_b_out for caller's Linear_b backward,
plus d_pre_LN (= d_residual = d_glu_out via implicit residual split).
- backward_raw_phase2: ELU_bwd. Takes d_elu_out from caller's Linear_b
backward, produces d_linear_a_out for caller's Linear_a backward.
The existing monolithic backward() is left as-is for surface-area
minimization; will be deleted with 2c.5 cleanup if no production
callers emerge.
No CUDA kernel changes. Pure Rust dispatcher split.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>