§4 landed — vocab / grammar / prompt / grouper encoding of the conditional rule

Evergreen: sn-boundary-averaged-name-multiplicity · landed 2026-07-10

What shipped

LevelChangeCommit
Vocab (ISN)constant_on_flux_surface: true flag on safety_factor, magnetic_shear, magnetic_flux, pressure in physical_bases.yml and on the flux-label carriers (toroidal_flux_radius, toroidal_flux_coordinate, normalized_toroidal_flux_coordinate, normalized_poloidal_flux_coordinate) in geometry_carriers.yml; flux_surface_reduction: true on the three reduction operators in operators.yml. Membership per the locked flux-function-base-list decision (definitional-only).b8a2024 (ISN)
Grammar (ISN)IR-level gate in grammar/model.py: a flux-surface reduction (flux_surface_averaged, maximum/minimum_over_flux_surface) applied to a flagged base fails BOTH parse_standard_name and compose_standard_name (recurses into binary-operator arguments). 19 unit tests in tests/grammar/test_flux_surface_reduction_gate.py; full ISN suite 1665 passed / 2 legacy fixtures updated to surface-varying bases.
Prompts (imas-codex)generate_name_dd.md separatrix_average path-rule row replaced with the conditional rule (locus always; prefix iff not constant_on_flux_surface; flux-function leaves share ONE name across both subtrees). generate_name_system.md averaging-operator bullet gains the no-op guard; review.md gains check [I2.8] (both directions: no reduction of a flux function; surface-varying averaged leaves must keep the prefix).8d6cb77b (imas-codex)
Audit (imas-codex)audits.find_flux_surface_reduction_violations() — read-only live-catalog probe wired into the sn run startup reconcile block (warns with offender list). Pre-collapse it flags exactly 1 live violation: flux_surface_averaged_magnetic_shear (superseded by §3).
Grouper (imas-codex)harmonize._FAMILY_REDUCTION_OPERATORS: the three reduction operator tokens now join docs-harmonization families via the edge operator token (kind filter unchanged, so the broad unary_prefix class stays out). derive_edges/parents.py confirmed correct, untouched.

Results