§4 landed — vocab / grammar / prompt / grouper encoding of the conditional rule
Evergreen: sn-boundary-averaged-name-multiplicity · landed 2026-07-10
What shipped
| Level | Change | Commit |
|---|---|---|
| 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
- Gate verified end-to-end:
flux_surface_averaged_safety_factor_at_plasma_boundaryrejected;flux_surface_averaged_electron_density_at_plasma_boundaryround-trips. - ISN pin in imas-codex bumped
515d83c → b8a2024(extras-preservinguv sync --extra test). - Generalisation: no live
maximum/minimum_over_flux_surfacenames exist;summary/volume_average/*(26 leaves / 27 names) explicitly scoped out — a volume average of a flux function is NOT a no-op.