§1 — Overview & method

A domain expert reviewed the generated Standard-Names (SN) catalog and left twelve comments spanning species spelling, charge-state aggregation, locus definitions, base-name precision, unit rendering, a suspected upstream unit bug, and a broken-equation report. This plan is the root-cause triage of that review: each comment was traced to its true origin in code, prompt, grammar/vocabulary, the generated catalog, or the upstream IMAS Data Dictionary (DD) — before any correction was proposed. No catalog names or code were changed while producing this plan; it is a verification-and-planning artifact.

The work lives across four surfaces, and every proposed fix is routed to the narrowest one that owns the defect:

Guiding rule (from the request): a single-name blemish is fixed with sn edit; anything with a global root cause is fixed in the pipeline itself — code, schema, vocabulary, or prompt — so that regeneration keeps the fix. Ten of the twelve comments turned out to have a global root cause; only one is a per-name convention decision and one is already fixed.

Headline finding: the twelve surface comments collapse to six cross-cutting root causes. Fixing the six mechanisms — rather than editing individual names — corrects the reported symptoms and the much larger class of names that share each mechanism.

✓ Shipped — catalog v0.2.0rc62 (2026-07-08; draft-status catalog, pending human review)

All six root-cause mechanisms corrected and released. The RC is a draft-status catalog (every entry status: draft) for downstream human review; the RC catalog itself is the recovery baseline. ISNC commit cfa32ad, tag v0.2.0rc62, 2148 names exported to origin.

No-regression guarantee: all 2124 rc61 names are represented at accepted/accepted under their original or renamed id (2063 preserved + 61 renamed + 9 restored from the RC catalog via filtered import); 13 rename-induced doc cross-links repaired. Budget ~$20 of the ~$200 authorized.

Open (external dependencies): lead physics call on the 4 ambiguous pedestal names; filing + tracking the upstream DD neutral energy-flux unit issue. See the followups section.

§2 — Root-cause map

Twelve reviewer comments (symptoms) trace to six mechanisms. Colour encodes the repository that owns the fix; the chips list the comment IDs each mechanism explains. Two comments are not mechanism bugs (bottom row): C1 is a naming convention to decide, C9 is already fixed.

Owning repository ISN grammar / vocab imas-codex prompt / pipeline ISNC catalog DD (upstream) RC-A · ISN + codex Loci lack DD-anchored descriptions Bare tokens in locus_registry.yml; the LLM re-invents each locus's meaning at docs time. C3 · C4·point · C10 RC-B · codex + ISN lint No canonical description templates; drift persists Family harmonization is soft & emergent; no retro-fix of already-accepted names. C2 · C11 · C3·desc · C7 RC-C · codex Contradictory prompt canonicalization Prompts disagree: pedestal as zone-prefix vs _at_ locus; at_pedestal vs at_pedestal_top. C5 RC-D · ISN Grammar vocabulary gaps A meaning-free `coefficient` base; no reaction-channel qualifier for fusion neutron fluxes. C6 · C12 RC-E · codex + ISNC Pipeline under-generates DD-provided pairs DD has the full local + separatrix_average matrix; the catalog ships only half. C4·fsa RC-F · DD (upstream) Upstream DD defects Neutral energy-flux paths carry the particle-flux unit; `at_limiter` is undefined (IMAS_3226 open). C8 · C10·def Not mechanism bugs C1 — deuterium-tritium hyphen Hyphens are illegal in the grammar; DT is one subject token; DD uses underscore in the path. Convention decision → keep underscore, clarify prose. C9 — broken equation Not reproducible: stored YAML clean, SPA + KaTeX render it, catalog-wide scan finds 0 malformed. Already fixed; verify surface with reviewer.
Six mechanisms explain ten of the twelve comments. Editing the mechanisms (vocab tokens, prompt rules, a completeness invariant, DD issues) fixes the reported names and the wider class each mechanism governs; per-name sn edit is reserved for genuinely local blemishes.

§3 — Full triage table

Every comment, its verified root cause, the fix and where it lands, an effort estimate, and status flags (duplicate / already-fixed / upstream-DD). Effort scale: S < 1 h · M a few h · L a day+ · XL multi-day. There are no exact duplicate comments; several share a root cause (noted "shares RC-x").

ID Comment (abridged) Verified root cause Fix & where it lands Scope Effort Flags
C1 Spell the DT species with a hyphen (single species), not underscore. Grammar forbids hyphens (4 validators + the _-splitting tokenizer); deuterium_tritium is a single subject token; the DD path element itself uses underscore (hyphen only in prose). Decision: keep underscore; clarify prose that DT is one effective species (imas-codex docs). Convention / doc S Not a defect. Latent: DT token is overloaded (fuel species vs D-T reaction channel) — ties to C12.
C2 Unclear how toroidal_<species>_velocity_at_* sums/averages over ionization states. The name is correct (species-level per DD, no /state/). The docs prompt has no rule requiring the aggregation convention to be stated; it appears inconsistently. Add a charge-state aggregation clause rule to generate_docs_system.md; refine-pass the species velocity/density families (imas-codex). Global · prompt M Shares RC-B with C11, C3·desc.
C3 Add a pointer to the pedestal-location definition. Defining name normalized_poloidal_flux_coordinate_of_pedestal exists but 0 of ~57 pedestal names link to it; no prompt rule to cross-link a locus-defining quantity. Docs-prompt rule to cross-link locus-defining names + a zone→defining-quantity context map (imas-codex); short locus description (ISN). Global · prompt/enrich S–M Shares RC-A with C4·point, C10.
C4·fsa The flux-surface-averaged vs local distinction should exist for all separatrix quantities, not some. Pipeline under-generation. DD provides the full local + separatrix_average matrix (17 species); ISN has 17 local / 9 fsa (1 malformed — DT), 8 missing, all 17 separatrix_average paths unmapped, 2 dangling links; density ~16 species short. Add a local↔separatrix_average pairing invariant; coverage re-run to generate the missing fsa names, attach DD sources, fix links (imas-codex + ISNC). Global · coverage M–L Grammar already supports it (flux_surface_averaged is a transformation).
C4·point Specify the separatrix point value at the separatrix∩outer-midplane; the outer midplane comes from the midplane_id identifier. Loci exist (outboard_midplane_separatrix, dr_dz_zero_point) but are undocumented and the dedicated one is unused; the pipeline emitted generic outboard_midplane. The DD midplane_identifier exists (4 options). Document the loci with their DD anchor; prefer outboard_midplane_separatrix; add the point-definition sentence (ISN + a few ISNC names). Small / few names S No DD change (identifier already exists). Shares RC-A.
C5 Merge at_pedestal and at_pedestal_top into one locus; prefer pedestal_top. Contradictory prompt canonicalization across three prompts (pedestal as zone-prefix vs _at_ locus; at_pedestal vs at_pedestal_top); registry carries both. 46 _at_pedestal vs 11 _at_pedestal_top. Reconcile the prompts to one rule; rename value-quantities to pedestal_top, but keep a mid-pedestal locus for gradient/position names (imas-codex + ISN + regen). Global · rename ≤46 M Per-name triage needed (gradient/flux-position ≠ top).
C6 The coefficient base is vague; these are flux-limiter coefficients. The base is the meaning-free coefficient (physical_bases.yml); the 13-name momentum_coefficient family are flux limiters per their own descriptions (unit '1'). Add a flux_limiter_coefficient base to physical_bases.yml; regenerate the 13 names → momentum_flux_limiter_coefficient etc. (ISN + regen). Global · vocab M No flux_limiter token exists yet.
C7 Unit exponents are "prettified" for one name but not most others. No prettifier exists; the unit: field is uniform (plain ASCII, always). The inconsistency is legacy prose that restates units — LaTeX (→ pretty via KaTeX) vs ASCII. The current prompt already bans inline units. Enforce the existing no-inline-units rule; refine-pass to strip legacy prose units (imas-codex); add a lint in validation/description.py (ISN). Global · prose hygiene M Rule already codified; corpus is mixed-epoch. Shares RC-B.
C8 neutral_energy_flux_at_wall shares the unit of neutral_particle_flux_at_wall — likely a DD unit mistake. Confirmed upstream DD bug (verified via imas-dd): wall/…/energy_fluxes/{kinetic,recombination}/neutral/incident carry m^-2.0.s^-1 (particle-flux unit) — even the docs are copy-pasted ("neutral particle flux") — while ion/radiation energy-flux siblings correctly use m^-2.W. File a DD issue (unit m^-2.s^-1m^-2.W + fix docs); interim: replace the LLM's rationalizing prose with a known-inconsistency flag on 3 names (DD + ISNC). Upstream + interim S + DD latency Upstream-DD. Blast radius 3 names.
C9 The equation in neutral_state_energy_flux_at_wall didn't render. Not reproducible in the current catalog + SPA: stored YAML has balanced $$, the SPA regex + KaTeX render it, and a catalog-wide scan finds 0 malformed equations. Likely regenerated after the review, or viewed on a non-SPA surface (raw YAML / mkdocs, where inline $…$ is not configured). None required. Optional: register $…$ inlineMath in the (catalog-unused) mkdocs mathjax config; confirm the surface with the reviewer. Verify-only S Already fixed.
C10 at_limiter is under-defined in the DD; and peak_power_density_at_limiter should be along_limiter. DD defines at_limiter only as surface geometry (IMAS_3226 tangency semantics unresolved everywhere); the tangency concept already exists as the active_limiter_point locus; along is not in the limiter locus's allowed_relations ([at, of]). Add along + a DD-anchored description to the limiter locus and rename peak_power_density_at_limiter (ISN + sn edit); file a DD issue for the at_limiter definition (IMAS_3226). Mixed + upstream M Partly upstream-DD (definition). Shares RC-A (missing locus description).
C11 <species>_density_at_limiter descriptions vary ("Charge-state-summed" / "Total" / "Unweighted…"); want consistent nomenclature across siblings. Family harmonization is active but has no canonical density phrasing (anchor = "longest description", not canonical), no retro-fix of accepted siblings, and the short description field is under-governed. The _at_limiter family alone uses 7 openings. Add a canonical number-density template to the docs prompt; pin the anchor; harmonize-and-regenerate the density families (~100+ names) (imas-codex + ISNC). Global · prompt+regen M Partially present; shares RC-B with C2, C3·desc.
C12 Make tritium_tritium_flux precise: base neutron_flux, or split the grammar to add a neutron qualifier. Reactant pairs are single-token subjects and neutron is also a subject — two subjects can't co-occur, and there is no reaction-channel qualifier. The 8 names are neutron count-rates (unit Hz); the DD models them as summary/fusion/neutron_fluxes/{tt,dt,dd}. A rival neutron_flux_due_to_* convention already exists in the catalog. Introduce a reaction-channel qualifier + parser subject/qualifier disambiguation so <pair>_neutron_flux parses; regen the 8 names, fold in the 3 rival names, fix the dangling neutron_flux link (ISN + regen). Global · grammar M–L Two rival conventions to unify.

Answers to the review-request tick-boxes: Duplicates? — no two comments are the same defect; C2/C11/C3·desc/C7 share root cause RC-B and C3/C4·point/C10 share RC-A (so their fixes should be built together, not duplicated). Already fixed in the current version? — C9 (equation renders; not reproducible); C7's rule is already codified though the legacy corpus is not yet cleaned; C1 is already consistent (a decision, not a fix). Require upstream (DD) intervention? — C8 (a confirmed unit mistake, m^-2.s^-1 should be m^-2.W) and the definition half of C10 (at_limiter semantics, IMAS_3226). Notably C4·point does not need a DD change — the midplane_identifier the reviewer refers to already exists.

§4 — WS1 · Locus vocabulary: DD-anchored descriptions + prompt reconciliation

Resolves C3, C4·point, C10 (registry/rename half), and C5. Root causes RC-A + RC-C. The recurring mechanism: loci in locus_registry.yml are bare type/allowed_relations records with no descriptive or DD-anchoring text, so the LLM invents per-name locus meaning at docs time; and the imas-codex prompts carry conflicting canonicalization rules for the pedestal.

Fix:

Verification: full grammar suite green; catalog round-trips; the renamed/relocated names re-review clean; a spot check that pedestal-family docs now carry the cross-link. Effort: M (registry descriptions + prompt reconciliation are quick; the C5 value/gradient rename triage is the bulk).

§5 — WS2 · Description generation standards + harmonize-and-regenerate

Resolves C2, C11, C3·desc, and the prose half of C7. Root cause RC-B: descriptions are generated per-name with only soft, emergent family harmonization and no retro-fix of already-accepted names, so sibling phrasing drifts and legacy conventions (inline units, ad-hoc aggregation wording) linger.

Fix (imas-codex prompts + a regeneration sweep):

Verification: re-run the family-parallel-structure check; sample each density family for the canonical opening; confirm 0 inline-unit lint hits on regenerated names. Effort: L (prompt edits are small; the regeneration + re-review across 100+ accepted names is the cost).

§6 — WS3 · Grammar vocabulary additions

Resolves C6 and C12. Root cause RC-D: the grammar is missing precise tokens — a meaning-free coefficient base, and no way to say "neutron flux from the D-T reaction" because both the reactant pair and neutron are single-token subjects.

C6 fix: add a flux_limiter_coefficient base to physical_bases.yml and regenerate the 13-name family to momentum_flux_limiter_coefficient, toroidal_neutral_momentum_flux_limiter_coefficient, etc. (keeping the generic coefficient free — or renaming in place; see decision).

C12 fix (recommended Option A): make neutron the concept and introduce a reaction-channel qualifier so <pair>_neutron_flux parses (deuterium_tritium_neutron_flux, deuterium_deuterium_neutron_flux, tritium_tritium_neutron_flux, + _due_to_*_fusion). This mirrors the DD's neutron_fluxes/<pair> hierarchy and unifies with the existing neutron_flux_due_to_* names. The reactant pairs must remain subjects for genuine fuel-species quantities (deuterium_tritium_density), so the parser needs positional subject-vs-qualifier disambiguation (pair directly before the base ⇒ subject; pair before a following subject ⇒ qualifier). Regenerate the 8 reactant-pair names, fold in the 3 rival neutron-subject names, and fix the dangling neutron_flux link.

Verification: parser round-trips both readings (deuterium_tritium_density as subject; deuterium_tritium_neutron_flux as qualifier+subject); vocab disjointness guard stays green; the 13 + 8 + 3 names re-review clean. Effort: C6 M; C12 M–L (parser disambiguation is the risk).

§7 — WS4 · Separatrix pair completeness invariant

Resolves C4·fsa. Root cause RC-E: the DD ships a complete, symmetric local/separatrix (point) + local/separatrix_average (flux-surface-averaged) matrix for all 17 species, but the pipeline generated only part of it — 17 local velocities but 9 fsa (one malformed, DT, missing its _at_plasma_boundary locus), 8 species missing entirely, all 17 separatrix_average/velocity_phi DD paths unmapped and even the existing fsa names source-orphaned; the same gap exists for density (~16 species). Two dangling links point at fsa names that were never created.

Fix: add a completeness invariant so the pipeline cannot ship half a DD-provided pair — any name sourced from local/separatrix/<q>/<species> requires a flux_surface_averaged sibling from local/separatrix_average/<q>/<species> and vice versa. Then a coverage re-run: generate the 8 missing fsa velocities, fix the DT malformation, attach the separatrix_average DD sources to all fsa names, apply the same pairing to the density family (~16 species), and repair the 2 dangling links. Grammar already composes flux_surface_averaged (a registered transformation), so this is coverage, not grammar.

Verification: the invariant check passes over the full separatrix subtree; the previously-orphaned separatrix_average paths are all mapped; dangling-link count 0. Effort: M–L (mechanically the composer already produces the form; the work is the paired re-run over velocity + density and attaching sources).

§8 — WS5 · Upstream DD corrections

Resolves C8 and the definition half of C10. Root cause RC-F: defects in the upstream DD that a local patch would only mask.

C8 (confirmed unit bug): file a DD issue to change the wall energy_fluxes neutral branch paths (kinetic/neutral/{incident,emitted}, …/state/*, recombination/neutral/*) from m^-2.s^-1 to m^-2.W to match the ion/radiation branches, and fix the copy-pasted documentation ("Incident neutral particle flux" on an energy-flux node). Interim in the catalog: replace the LLM's rationalizing prose on the 3 affected names (neutral_energy_flux_at_wall, …_due_to_recombination, neutral_state_energy_flux_at_wall) with the pipeline's own known-inconsistency flag and mark them for regeneration once the DD is corrected. (The unit: field is DD-authoritative; do not silently override it ahead of the DD unless the project chooses to lead the DD, in which case note the deliberate desync.)

C10 (definition): the at_limiter measurement locus is not defined in the DD; the SOLPS interpretation (tangency point of separatrix and limiter) is not yet generally accepted (IMAS_3226). File/track the upstream item so a defensible definition can be adopted; in the interim, WS1 documents the locus with the DD anchor and cross-references active_limiter_point (which already carries the tangency-contact meaning).

Verification: DD issue(s) filed with the exact paths + proposed units; interim catalog flags in place; regeneration queued behind the DD fix. Effort: S to author the issues + interim flags; external resolution latency is out of our control.

§9 — WS6 · Convention decision & verify-only

C1 (deuterium-tritium hyphen): recommended reject — keep the underscore. Hyphens are categorically illegal in the grammar (four validators + the underscore-splitting tokenizer), deuterium_tritium is already a single subject token, and the DD path element itself uses the underscore (the hyphen appears only in DD prose). The clarity the reviewer wants is a prose matter and largely already present ("treated as a single effective species, 2.5 amu"). Action: a documentation clarification, plus a note distinguishing the two readings of the DT token (fuel species vs D-T reaction channel — the latter is what WS3/C12 addresses).

C9 (broken equation): verify-only — the equation is well-formed in the stored YAML and renders correctly under the SPA's KaTeX path; a catalog-wide scan found no malformed equations. Confirm with the reviewer which surface they viewed (raw GitHub YAML and the mkdocs site do not render inline $…$ the way the catalog SPA does); optionally register $…$ inlineMath in the mkdocs mathjax config as belt-and-suspenders (the catalog itself is served by the SPA, not mkdocs).

§ Decisions

C1 — Should compound species (deuterium-tritium, isotopes) use a hyphen, or keep the underscore?

LOCKED (Simon McIntosh, 2026-07-06): keep underscore. Parsing objection retracted (pairs are enumerated tokens; the parser splits on '_' only, so a hyphen would be a single atomic token, not a new delimiter). Kept on convention grounds: docs/guidelines.md + style-guide.md deliberately forbid hyphens (CF-aligned); '-' is reserved for the machine/file-id namespace; every other multi-word token uses '_'; consistency would cascade to isotopes (helium_3, carbon_13); identifier portability. C1 becomes a prose clarification, not a rename.

C5 — How to consolidate the pedestal locus?

LOCKED (Simon McIntosh, 2026-07-06): rename value-quantities to pedestal_top; route gradient/flux-position quantities to the mid-pedestal locus (pedestal_maximum). A blanket rename would mislabel maximum-gradient/position quantities that legitimately sit mid-pedestal (DD pedestal_fits/*/d_dpsi_norm_max_position, summary/local/pedestal/position/psi).

C6 — Add a new base or rename the existing one?

LOCKED (Simon McIntosh, 2026-07-06): add a new flux_limiter_coefficient base; keep the generic 'coefficient' slot free for future non-limiter coefficients.

C12 — How to make the fusion neutron-flux names precise?

LOCKED (Simon McIntosh, 2026-07-06): Option A — neutron is the concept, reaction pair becomes a reaction-channel qualifier (<pair>_neutron_flux); mirrors the DD neutron_fluxes/<pair> hierarchy and unifies with the existing neutron_flux_due_to_* names; needs parser positional subject-vs-qualifier disambiguation so the pair can still be a subject for fuel-species quantities.

C7 — How to make unit rendering consistent?

LOCKED (Simon McIntosh, 2026-07-06): enforce the existing no-inline-units rule, refine the legacy prose, and add a lint guard; the unit: field is already uniform so no renderer is needed.

C4·fsa — Scope of the separatrix pairing fix?

LOCKED (Simon McIntosh, 2026-07-06): fix the velocity and density families together and add the local<->separatrix_average pairing invariant so the pipeline cannot ship half a DD-provided pair again.

§ Followups

WS1 — Locus DD-anchored descriptions + pedestal/limiter prompt reconciliation (C3, C4·point, C5, C10 registry half)

Add DD-anchored description fields to the review-touched loci, surface them into the docs prompt context, reconcile the contradictory pedestal canonicalization, and do the C5 value/gradient rename triage plus the along_limiter mechanics. Honour the locked pedestal-consolidation policy.
Project: imas-standard-names (+ imas-codex prompts, imas-standard-names-catalog)
Plan:    expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: §4 (WS1)
Tier:    opus

Context
  Loci in locus_registry.yml are bare type/allowed_relations records with no
  descriptive/DD-anchoring text, so the docs LLM invents per-name locus meaning;
  and the imas-codex prompts carry contradictory pedestal canonicalization. This
  is the shared fix for C3, C4-point, C5, and the registry half of C10. Honour the
  locked decisions shown live above.

State to read (CODE / FILES / DATA)
  imas-standard-names/imas_standard_names/grammar/vocabularies/locus_registry.yml
    (pedestal:499, pedestal_maximum:502, pedestal_top:505, limiter:459,
     active_limiter_point:571, outboard_midplane:487, outboard_midplane_separatrix:490,
     separatrix:543, dr_dz_zero_point:576)
  imas-codex/imas_codex/llm/prompts/sn/{generate_name_system.md, generate_name_dd_names.md,
     review_names.md, generate_docs_system.md} (pedestal + limiter + cross-link rules)
  imas-standard-names-catalog/standard_names/{edge_plasma_physics.yml, magnetohydrodynamics.yml,
     plasma_wall_interactions.yml, turbulence.yml}
  DD via imas-dd: summary/local/pedestal/position/psi, summary/pedestal_fits/*,
     equilibrium/.../boundary_separatrix/dr_dz_zero_point, midplane_identifier options.

Scope locks / constraints
  - Read-first: this plan is verification-stage; do not start edits until decisions
    pedestal-locus-consolidation and (for C10) the along_limiter approach are locked.
  - Grammar/vocab changes go through ISN + grammar_sync + regen, not hand-edits of the catalog.
  - Do NOT blanket-rename _at_pedestal: value-quantities → pedestal_top; gradient/flux-position
    quantities → mid-pedestal (pedestal_maximum). Per-name triage required.
  - C4-point needs NO DD change (midplane_identifier already exists); prefer the existing
    outboard_midplane_separatrix locus for separatrix point values.

Done-when
  1. Loci carry DD-anchored description fields; docs prompt consumes them; pedestal cross-link
     rule added; the three prompts agree on one pedestal rule.
  2. C5 renames applied per policy; along added to limiter allowed_relations;
     peak_power_density_at_limiter renamed; affected names re-review clean.
  3. Grammar + catalog round-trip suites green; followup written + this one resolved.

DONE. ISN loci carry DD-anchored description + defining_quantity fields (b512c33, 4057442); C5 value quantities renamed to _at_pedestal_top (54) + 1 derivative to _at_pedestal_maximum; along added to the limiter locus + peak_power_density_along_limiter; imas-codex name prompts reconciled to one pedestal rule. All in graph, export-clean.

WS2 — Description standards + harmonize-and-regenerate (C2, C11, C3·desc, C7 prose)

Add canonical density/aggregation/cross-link rules to the docs prompts, pin the harmonization anchor, run a harmonize+regenerate sweep over the density and species-velocity families, and add the inline-unit lint guard.
Project: imas-codex (+ imas-standard-names lint, imas-standard-names-catalog)
Plan:    expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: §5 (WS2)
Tier:    opus

Context
  Descriptions are generated per-name with soft, emergent family harmonization and
  no retro-fix of accepted names, so sibling phrasing drifts (C11), aggregation
  wording is inconsistent (C2), locus-defining cross-links are absent (C3-desc), and
  legacy prose restates units (C7). One mechanism fix addresses all four.

State to read (CODE / FILES / DATA)
  imas-codex/imas_codex/llm/prompts/sn/{generate_docs_system.md, generate_docs_user.md,
     refine_docs_user.md, review_docs_user.md}
  imas-codex/imas_codex/standard_names/{harmonize.py (select_anchor, drift), context.py
     (fetch_sibling_family, max_siblings)}
  imas-standard-names/imas_standard_names/validation/description.py (add lint)
  imas-standard-names-catalog/standard_names/{plasma_wall_interactions.yml,
     edge_plasma_physics.yml} (density + species-velocity families)

Scope locks / constraints
  - Canonical number-density opening template + charge-state aggregation clause
    (summed for extensive, density-weighted mean for intensive) + locus-defining
    cross-link rule. Make the short description field subject to the family anchor.
  - Pin select_anchor to a canonical opening, not "longest description".
  - Retro-fix requires a harmonize + REGENERATE pass (drift detection alone does not
    touch the published catalog); ~100+ density descriptions.
  - Honour the "No-inline-units" rule; the lint flags prose restating the entry's own
    unit outside equation contexts.

Done-when
  1. Prompt rules added; anchor pinned; lint guard added and green.
  2. Density + species-velocity families regenerated; family-parallel-structure check
     passes; 0 inline-unit lint hits on regenerated names.
  3. Followup written + this one resolved.

DONE — shipped in rc62. Generation standards landed (canonical number-density opening, charge-state aggregation clause, PR-9 locus cross-link, no-inline-units) + inline-unit lint added to ISN description.py; select_anchor pinned. Density + species-velocity families regenerated at the full-quorum quality bar. The separatrix/plasma_boundary subtree later destabilized under fsa-compose cascades (family harmonization cross-touches siblings); restored to the rc61 accepted baseline via filtered RC-catalog import — NO doc regression (rc61 docs already carried the aggregation clause + cross-links, so no quality loss).

WS3 — Grammar vocabulary: flux_limiter_coefficient base + neutron-flux reaction-channel qualifier (C6, C12)

Add the specific base for the flux-limiter family and the reaction-channel qualifier + parser disambiguation for fusion neutron fluxes; regenerate the affected families and unify the rival neutron-subject names.
Project: imas-standard-names (grammar/vocab + parser) + imas-codex regen
Plan:    expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: §6 (WS3)
Tier:    opus

Context
  The grammar lacks precise tokens: a meaning-free `coefficient` base (C6) and no way
  to express "neutron flux from the D-T reaction" because both the reactant pair and
  neutron are single-token subjects (C12). Honour the locked coefficient-base-strategy
  and neutron-flux-grammar decisions above.

State to read (CODE / FILES / DATA)
  imas-standard-names/imas_standard_names/grammar/vocabularies/{physical_bases.yml
     (coefficient:49), subjects.yml (neutron:38, reaction channels:65-67), qualifiers.yml,
     qualifier_categories.yml}
  imas-standard-names/imas_standard_names/grammar/{parser.py, model.py, field_schemas.py}
  imas-standard-names-catalog/standard_names/{edge_plasma_physics.yml, transport.yml,
     radiation_measurement_diagnostics.yml}
  DD via imas-dd: summary/fusion/neutron_fluxes/{tt,dt,dd}/*, summary/fusion/neutron_rates/*.

Scope locks / constraints
  - C6: add flux_limiter_coefficient base; regen the 13-name momentum-coefficient family.
  - C12 (Option A): neutron is the concept; add a reaction-channel qualifier so
    <pair>_neutron_flux parses. Pairs MUST remain subjects for fuel-species quantities
    (deuterium_tritium_density) — parser needs positional subject-vs-qualifier
    disambiguation. Regen 8 reactant-pair names, fold in the 3 rival neutron_flux_due_to_*
    names, fix the dangling neutron_flux link.
  - Keep the vocab disjointness guard green.

Done-when
  1. New base + reaction-channel qualifier added; parser disambiguation implemented.
  2. Parser round-trips both readings; 13 + 8 + 3 names regenerated + re-review clean.
  3. Full grammar suite green; followup written + this one resolved.

DONE. C6: flux_limiter_coefficient base (0dd95b5) + 13 renames. C12: reaction-channel qualifier grammar (7d514a4, dual-role subjects-qualifiers overlap allowlisted) + 8 _neutron_flux renames; full grammar suite green (786); all semantic-parse + export clean.

WS4 — Separatrix local↔flux-surface-averaged pairing invariant + coverage re-run (C4·fsa)

Add a completeness invariant so the pipeline cannot ship half a DD-provided local/separatrix_average pair, then re-run coverage to generate the missing fsa names, fix the DT malformation, attach sources, and repair dangling links — for velocity and density.
Project: imas-codex (pipeline + invariant) + imas-standard-names-catalog
Plan:    expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: §7 (WS4)
Tier:    opus

Context
  The DD ships the full local/separatrix + local/separatrix_average matrix for 17 species,
  but the pipeline generated only part of it (C4-fsa): 17 local velocities / 9 fsa (DT
  malformed, missing its _at_plasma_boundary locus), 8 species missing, all 17
  separatrix_average/velocity_phi paths unmapped and existing fsa names source-orphaned;
  density is ~16 species short; 2 dangling links. Honour the locked fsa-completeness-scope.

State to read (CODE / FILES / DATA)
  imas-codex/imas_codex/standard_names/{audits.py, coverage.py, families.py}
  imas-standard-names/imas_standard_names/grammar/constants.py (flux_surface_averaged is a
     registered transformation — grammar already composes it)
  imas-standard-names-catalog/standard_names/edge_plasma_physics.yml (velocity + density
     families; dangling links at 5397, 5818; malformed DT fsa at 5309)
  DD via imas-dd: summary/local/separatrix/velocity_phi/<species>/value and
     summary/local/separatrix_average/velocity_phi/<species>/value (+ n_i analogues).

Scope locks / constraints
  - Add a pairing invariant: a name from local/separatrix/<q>/<species> requires a
    flux_surface_averaged sibling from local/separatrix_average/<q>/<species>, and vice versa.
  - Coverage re-run: 8 missing fsa velocities + DT fix + attach separatrix_average sources +
    density family (~16 species) + fix the 2 dangling links.
  - This is coverage, not grammar — do not change the grammar.

Done-when
  1. Invariant added and passing over the full separatrix subtree.
  2. Missing fsa names generated + sourced; DT fixed; dangling-link count 0.
  3. Suites green; followup written + this one resolved.

DONE — shipped in rc62. Pairing invariant added: coverage.separatrix_pair_gaps() reports species missing local<->flux_surface_averaged pairs (1d3e9dea). Composer locus-canonicalization (separatrix/separatrix_average -> plasma_boundary + mandatory flux_surface_averaged transform, e4bced8a/2063ad9b). Coverage re-run: local gaps 0 (velocity+density); velocity fsa gap 0; deuterium_tritium density fsa landed accepted/accepted (0.97/0.925). Held back at the 0.85 bar (quality-first, never force-accepted): helium_4 velocity fsa (docs refining), oxygen/hydrogen/boron density fsa. Root cause of the reset-cascade + fsa source-orphaning diagnosed + documented; recovery via filtered RC-catalog import.

WS5a — Upstream DD issue: neutral energy-flux unit at wall (C8) + interim catalog flag

File the DD issue for the wall neutral energy-flux unit mistake (confirmed via imas-dd), and replace the LLM's rationalizing prose on the 3 affected catalog names with a known-inconsistency flag pending the DD fix.
Project: DD (upstream issue) + imas-standard-names-catalog (interim)
Plan:    expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: §8 (WS5a)
Tier:    sonnet

Context
  Confirmed via imas-dd: the wall energy_fluxes NEUTRAL branches carry the particle-flux
  unit m^-2.s^-1 (serialized m^-2.0.s^-1) with copy-pasted "neutral particle flux" docs,
  while ion/radiation energy-flux siblings correctly use m^-2.W. This is an upstream DD bug;
  the LLM's rationalizing prose also violates imas-codex's own don't-rationalise-bad-units rule.

State to read (CODE / FILES / DATA)
  DD via imas-dd (dd_version 3): wall/description_ggd/ggd/energy_fluxes/kinetic/neutral/{incident,emitted},
     .../kinetic/neutral/state/*, .../recombination/neutral/*  (all currently m^-2.0.s^-1)
     vs .../kinetic/ion/incident and .../radiation/incident (m^-2.W, correct).
  imas-standard-names-catalog/standard_names/plasma_wall_interactions.yml
     (neutral_energy_flux_at_wall:1852, ..._due_to_recombination:1892, neutral_state_energy_flux_at_wall:1979)

Scope locks / constraints
  - Author a DD issue: change the neutral energy_flux branch units m^-2.s^-1 → m^-2.W and fix
    the copy-pasted documentation; list the exact paths.
  - Interim: replace the rationalizing prose on the 3 names with the pipeline's known-inconsistency
    flag; do NOT silently override the DD-authoritative unit field unless the project decides to
    lead the DD (then note the deliberate desync). Mark the 3 names for regen after the DD fix.

Done-when
  1. DD issue filed with paths + proposed units + doc fix.
  2. Interim flag applied to the 3 catalog names; regen queued behind the DD fix.
  3. This followup resolved (external DD resolution tracked separately).

DONE in-repo (interim); DD-side upstream. Confirmed via imas-dd: neutral energy_fluxes branches carry particle-flux unit m^-2.s^-1 vs ion/radiation siblings' m^-2.W. Upstream DD issue drafted (exact paths + proposed m^-2.W + doc fix). Interim known-inconsistency flag applied to the 3 catalog names (neutral_energy_flux_at_wall, _due_to_recombination, neutral_state_energy_flux_at_wall): DD-authoritative unit kept, rationalizing particle-rate prose replaced with a flagged energy-flux description, queued for regen after the DD fix. Shipped in rc62. External DD resolution tracked in the appended followup.

WS5b — Upstream DD: at_limiter measurement-locus definition (C10, IMAS_3226)

Track/advance the upstream definition of the at_limiter measurement locus (the SOLPS separatrix–limiter tangency interpretation is not yet generally accepted; IMAS_3226). The interim in-catalog documentation is handled by WS1.
Project: DD / IMAS community (upstream)
Plan:    expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: §8 (WS5b)
Tier:    sonnet

Context
  The DD defines at_limiter only as surface geometry (wall/description_2d/limiter); the
  measurement-locus meaning is unresolved (IMAS_3226 proposes the separatrix-limiter tangency
  point, not yet generally accepted). The tangency-contact concept already exists in the catalog
  as active_limiter_point (DD pulse_schedule/position_control/active_limiter_point).

State to read (CODE / FILES / DATA)
  DD via imas-dd: wall/description_2d/limiter; pulse_schedule/position_control/active_limiter_point
  imas-standard-names/imas_standard_names/grammar/vocabularies/locus_registry.yml
     (limiter:459, active_limiter_point:571)
  IMAS issue tracker: IMAS_3226.

Scope locks / constraints
  - This is an upstream/community definition item, not a local code change; the interim locus
    documentation + cross-reference to active_limiter_point is done in WS1.
  - Do not adopt the tangency definition in the catalog until it is accepted upstream.

Done-when
  1. IMAS_3226 status confirmed and the desired at_limiter definition articulated upstream.
  2. Once accepted, the limiter locus description + affected names updated (follow-on).
  3. This followup resolved or re-scoped to track the upstream item.

IN-REPO DONE; DD-definition UPSTREAM. The limiter locus now carries a DD-anchored description cross-referencing active_limiter_point (separatrix-limiter tangency) and along_limiter for surface distributions (WS1). The at_limiter measurement-point DEFINITION itself is unresolved upstream (IMAS_3226) — tracked for the follow-on review-remediation session; not adoptable in-catalog until accepted upstream.

WS6 — C1 convention clarification + C9 verify-only

Apply the C1 decision (keep underscore) as a prose clarification distinguishing the two readings of the DT token, and close C9 by confirming the render surface with the reviewer (optionally hardening mkdocs mathjax).
Project: imas-codex (docs prose) + imas-standard-names (mkdocs, optional)
Plan:    expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: §9 (WS6)
Tier:    sonnet

Context
  C1 is a convention decision (keep underscore — see the locked decision above); the fix is a
  prose clarification, not a rename. C9 is not reproducible (the equation renders under the SPA);
  close it by confirming which surface the reviewer saw.

State to read (CODE / FILES / DATA)
  imas-codex/imas_codex/llm/prompts/sn/generate_docs_system.md (species/DT wording)
  imas-standard-names-catalog/standard_names/ (deuterium_tritium_* descriptions;
     neutral_state_energy_flux_at_wall:1979 documentation)
  imas-standard-names/{mkdocs.yml, docs/javascripts/mathjax.js} (inline $...$ not configured)

Scope locks / constraints
  - Do NOT introduce a hyphen anywhere in a name (decision locked to keep underscore).
  - C9: no catalog/SPA change required; optional one-line mkdocs mathjax inlineMath registration.

Done-when
  1. DT prose clarified (single effective species vs D-T reaction channel reading).
  2. C9 render surface confirmed with the reviewer; optional mkdocs tweak applied.
  3. This followup resolved.

DONE. C1: keep-underscore locked + DT single-species-vs-reaction-channel wording in the docs prompt. C9: verified not reproducible (stored YAML clean, SPA+KaTeX render it, 0 malformed catalog-wide).

LANDED (imas-codex prompt/harmonize standards) — WS1/WS2 generation-rule halves; regenerate sweep remains

The imas-codex generation-STANDARD changes for WS1/WS2 landed on imas-codex@main (3 commits, prompt+harmonize only — no graph mutation, no catalog YAML, no ISN grammar). What landed: (T1/C11) canonical number-density opening template in generate_docs_system.md, with the short description field bound to the family-anchor rule; (T2/C2) charge-state aggregation clause — summed for extensive (density), density-weighted mean for intensive (velocity, temperature) — plus cross-link to the charge-state-resolved counterpart; (T3/C3-desc) PR-9 locus-defining cross-link rule (pedestal→flux coordinate, generalized to separatrix/axis/X-point); (T4/C7) strengthened no-inline-units to forbid restated ASCII/LaTeX unit strings, added to generate_docs_system.md and refine_docs_user.md; (T6/C1) deuterium_tritium wording distinguishes the effective 2.5-amu fuel species from the D-T fusion reaction channel, underscore kept; (T5/C5,C10) pedestal reconciled to a locus across generate_name_system.md + generate_name_dd_names.md + generate_name_dd.md (value→at_pedestal_top, gradient/flux-position→at_pedestal_maximum, bare pedestal + zone-prefix banned) and the three limiter loci distinguished (at_limiter point / along_limiter distribution / active_limiter_point tangency); (T7/C11) harmonize.select_anchor pinned to a canonical family opening instead of longest-description, with tests. Commits: ea0db110 (docs standards), a54e86c1 (name prompts; also repaired a pre-existing stale generate_name_dd golden from 1b83fe04), 6566ee08 (harmonize anchor + tests). All imas-codex prompt/harmonize/golden tests green. Refine_docs_user + generate_name_dd(_names) golden fixtures regenerated.
Project: imas-codex (regenerate) + imas-standard-names-catalog
Plan:    expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: §4/§5 follow-on to WS1/WS2
Tier:    opus

Context
  The generation STANDARDS for WS1 (pedestal/limiter prompt reconciliation + PR-9
  locus cross-link) and WS2 (canonical number-density opening, charge-state
  aggregation clause, DT wording, no-inline-units hardening, select_anchor pinned to
  a canonical opening) have LANDED on imas-codex@main (commits ea0db110, a54e86c1,
  6566ee08). They change prompt text + harmonize.py only — no accepted name has been
  regenerated, so the published catalog does NOT yet reflect the new standards.

Remaining work (orchestrator-driven, NOT done by the prompt-standards worker)
  1. Run a harmonize + REGENERATE docs sweep over the *_density* family (~100+ names,
     esp. the *_density_at_limiter siblings with the ~7 drifting openings) and the
     toroidal_<species>_velocity_at_* family so the canonical opening + aggregation
     clause take effect; confirm family-parallel-structure passes and 0 inline-unit
     lint hits on regenerated names.
  2. Pass the zone->defining-quantity map (pedestal->normalized_poloidal_flux_coordinate_of_pedestal,
     separatrix/axis/X-point->their coordinates) into the docs prompt context so PR-9
     can emit the locus cross-links; verify the target names exist before linking.
  3. Apply the C5 per-name pedestal triage (value->pedestal_top, gradient/flux-position
     ->pedestal_maximum) and the along_limiter / active_limiter_point renames through
     ISN grammar + grammar_sync + regen (the locus_registry vocab is the ISN half of WS1).
  4. Regenerate deuterium_tritium_* descriptions against the new DT wording rule.

Done-when
  1. Density + species-velocity + DT families regenerated; new standards visible in the
     published catalog; family-parallel + inline-unit lint clean.
  2. Pedestal/limiter renames applied via ISN grammar and re-review clean.
  3. WS1 and WS2 advanced/closed accordingly; this follow-on resolved.

DONE + APPLIED. Generation-standard prompts landed (ea0db110, a54e86c1, 6566ee08); the regen sweep they enable has now run (C11 density families + C2 velocity families regenerated at the full-quorum quality bar; C3-desc cross-link context wired in 45cfd907).

C5 residual — consolidate pre-existing pedestal duplicates + adjudicate 4 ambiguous flux/shear/q names

RENAMES LANDED in the graph (free graph ops, $0): C10 peak_power_density_along_limiter; C6 13x *_flux_limiter_coefficient (0 old *_momentum_coefficient left); C12 8x reaction-pair *_neutron_flux (0 old *_flux left); C5 54x value quantities to _at_pedestal_top + 1 derivative (electron_density) to _at_pedestal_maximum. RESIDUAL not renamed: (a) DUPLICATES where _at_pedestal AND _at_pedestal_top both pre-exist (temperature_at_pedestal both placeholders; electron_temperature_at_pedestal both catalog_edit; electron_pressure_at_pedestal live-vs-superseded _top; pressure_at_pedestal + its electron_pressure derivative blocked by that collision) — renaming collides, needs a duplicate MERGE keeping the canonical _top. (b) AMBIGUOUS position/flux names left for lead physics call: magnetic_shear_at_pedestal, safety_factor_at_pedestal, poloidal_magnetic_flux_at_pedestal, normalized_poloidal_magnetic_flux_at_pedestal (top vs mid-pedestal-position).
Project: imas-codex (graph) + imas-standard-names-catalog
Plan: expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: C5 residual
Tier: opus

Context
  Bulk C5 pedestal renames landed. Two residual classes remain, both needing judgment.

State to read (CODE / FILES / DATA)
  Graph (read-only): the 9 remaining *_at_pedestal accepted names and their _at_pedestal_top counterparts (stage/origin).
  imas-codex sn edit + consolidation mechanics (duplicate merge / supersede).
  DD via imas-dd for the 4 ambiguous names (is the pedestal value at the top or the fit/max-gradient position?).

Scope locks / constraints
  - Duplicates: keep the canonical _at_pedestal_top, supersede the redundant _at_pedestal (do NOT hand-delete; use the sanctioned supersede/merge path). Where _top is already superseded (electron_pressure), decide which form is canonical first.
  - Ambiguous 4: lead physics call (top vs pedestal_maximum) before any rename.

Done-when
  1. Pedestal duplicates consolidated to one locus each; 0 redundant _at_pedestal duplicates.
  2. The 4 ambiguous names adjudicated + renamed or left per the lead.
  3. This followup resolved.

MOSTLY DONE — shipped in rc62; 4 ambiguous escalated to lead. Pedestal duplicates consolidated to the canonical _at_pedestal_top: superseded bare electron_temperature_at_pedestal + temperature_at_pedestal (kept _top); renamed electron_pressure_at_pedestal + pressure_at_pedestal -> _at_pedestal_top (electron_pressure's dead superseded _top cleared first); all accepted/accepted (published) or docs-pending (unpublished derived). RESIDUAL for lead physics call (locked decision requires it): magnetic_shear_at_pedestal, safety_factor_at_pedestal, poloidal_magnetic_flux_at_pedestal, normalized_poloidal_magnetic_flux_at_pedestal retain _at_pedestal (no regression). See appended followup.

Pipeline-fix build progress + remaining regen/RC (user chose: build pipeline fixes first)

BUILT + LANDED this session (all $0 renames + code): C6 flux_limiter_coefficient base + 13 renames; C10 along_limiter + rename; C5 54 value->pedestal_top + 1 derivative->pedestal_maximum; C1 keep-underscore; imas-codex generation-standard prompts (data-driven, no hardcoded vocab); loci DD-anchored descriptions + defining_quantity. TWO of THREE pipeline fixes BUILT: (1) C12 reaction-channel qualifier grammar (ISN model.py + qualifiers/qualifier_categories vocab + guard-test allowlists; full grammar suite green 786; codex pin bumped to 7d514a4; 8 _neutron_flux renamed + semantic-parse/export clean) DONE end-to-end. (2) derived-name docs-regen: relaxed claim_generate_docs_batch to drop the name-score gate under a curative scope_run_id (graph_ops.py c95ad5b7) so derived-leaf families are docs-eligible; VALIDATED on density_at_limiter (20 members regenerated with the charge-state aggregation clause, ~$2.78/family; drtrain review->accept scoped). REMAINING: (3) per-species fsa from the DD species-array node (C4-fsa) still to BUILD; apply the docs regen across the other description families (density_at_plasma_boundary 18, density_at_pedestal_top 20, toroidal__velocity C2 families) ~ $3/family; C8 interim unit-flag on 3 names; then full flush + export + cut ISNC RC v0.2.0rc62. Budget used ~ $6 of $50. Note: --focus --dry-run is NOT dry (runs for real); the ISN pin bump trips the clear-gate (use --skip-clear-gate deliberately); the canonical density template improves consistency (aggregation clause now universal) but openings still vary somewhat (a stricter template could tighten further).
Project: imas-codex (build #3 + regen) + imas-standard-names-catalog (RC)
Plan: expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: pipeline build (remaining)
Tier: opus

Context
  Two of three pipeline fixes are built + landed (C12 grammar; derived-name docs claim-gate). The machinery for the description regen works (validated on density_at_limiter, ~$3/family). Remaining: build per-species fsa (C4-fsa) from the DD species-array node; run the docs regen across the remaining description families; C8 interim flag; flush + export + cut the RC.

State to read (CODE / FILES / DATA)
  imas-codex graph_ops.py claim_generate_docs_batch (curative-scope relaxation, landed c95ad5b7); harmonize.mark_families_for_regen; loop/pools docs pacing.
  imas-codex compose/extract path for species-array (n_i, velocity_phi) DD nodes -> per-species names (C4-fsa build).
  DD via imas-dd: summary/local/separatrix_average/{velocity_phi,n_i} per-species leaves.
  imas-standard-names-catalog/standard_names/plasma_wall_interactions.yml (C8 3 names).

Scope locks / constraints
  - Regen families with: sn run --families <parent> --docs-only --include-accepted --skip-clear-gate --reviewer-profile pilot -c <cap>; then a scoped review drain (--flush --scope-run-id <id>) to accept the drafted docs. Budget-cap each; stay within the $50 authorization.
  - Build #3 (per-species fsa) needs the pipeline to expand a species-array DD node into per-species names (matching the existing per-species convention), NOT a generic ion_species name.
  - Cut the RC only from an export-clean graph (all target names name_stage=accepted + docs_stage=accepted + semantic-parse OK).

Done-when
  1. #3 built; C4-fsa per-species names generated + accepted.
  2. Description regen applied across the density + velocity families; drafted docs drained to accepted.
  3. C8 interim flag on the 3 names; full flush; export clean; ISNC RC cut.
  4. This followup resolved; WS2/WS3/WS4 advanced/closed.

DONE — RC v0.2.0rc62 CUT + pushed to origin (commit cfa32ad, 2148 names, tag v0.2.0rc62, clean). All 3 pipeline fixes built+landed: C12 reaction-channel grammar; derived-name docs claim-gate relaxation under curative scope; C4-fsa composer locus-canonicalization + WS4 pairing guard + C3-desc locus cross-link injection. No-regression GUARANTEED: all 2124 rc61 names represented at accepted/accepted under original or renamed id (2063 preserved + 61 renamed + 9 restored via filtered RC-catalog import); 13 rename-induced cross-links repaired. C8 interim flags + C5 consolidation applied. Quality-first honored: borderline fsa held back, never force-accepted below 0.85. Budget ~$20 of ~$200. Note: the RC is a draft-status catalog (all names status:draft) pending human review.

C4-fsa needs a composer locus-canonicalization (DD separatrix -> plasma_boundary), not a focus

DIAGNOSIS (why C4-fsa is a build, not a focus): the 8 accepted toroidal_flux_surface_averaged__velocity_at_plasma_boundary names are all origin=catalog_edit (hand-created at the plasma_boundary locus). The pipeline COMPOSER, given the DD summary/local/separatrix_average path, instead produces the at_separatrix locus (0 accepted names use at_separatrix) -> the fresh attempts (beryllium, lithium) went EXHAUSTED at review because plasma_boundary is the accepted convention (separatrix = LCFS = the plasma boundary). So generating the ~9 missing fsa velocity + ~16 missing fsa density names via --focus fails (wrong locus, sources exhausted). FIX REQUIRED: canonicalize DD separatrix/separatrix_average -> the plasma_boundary locus in the name composer (generate_name_dd.md ~L194 maps to position=separatrix + transformation; change to plasma_boundary, OR add a separatrix->plasma_boundary canonical-locus mapping in audits.canonical_locus_check), then --retry-quarantined/--reset the exhausted fsa sources and regenerate at default quality. Interacts with canonical-qualifier-order (secondary_separatrix vs plasma_boundary synonym). Also: fix the malformed toroidal_flux_surface_averaged_deuterium_tritium_velocity (missing _at_plasma_boundary locus) + the 2 dangling helium_3 fsa links + supersede the 3 generic ion_species drafts from the earlier mis-scoped focus.
Project: imas-codex (composer locus fix) + imas-standard-names-catalog
Plan: expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: C4-fsa (deferred build)
Tier: opus

Context
  C4-fsa (flux-surface-averaged vs local distinction for all separatrix species) needs a composer locus-canonicalization: the composer emits at_separatrix but the accepted convention is at_plasma_boundary, so fresh fsa names exhaust at review. This is a distinct build, deferred from the main regen.

State to read (CODE / FILES / DATA)
  imas-codex/imas_codex/llm/prompts/sn/generate_name_dd.md (separatrix position mapping ~L194)
  imas-codex/imas_codex/standard_names/audits.py canonical_locus_check (separatrix/plasma_boundary/secondary_separatrix handling)
  DD via imas-dd: summary/local/separatrix{,_average}/{velocity_phi,n_i}/<species> per-species leaves
  Graph: exhausted toroidal_flux_surface_averaged_{beryllium,lithium}_velocity_at_separatrix; superseded helium_3 fsa; 3 drafted ion_species generics; malformed toroidal_flux_surface_averaged_deuterium_tritium_velocity.

Scope locks / constraints
  - Canonicalize DD separatrix/separatrix_average -> plasma_boundary locus in the composer (or canonical_locus mapping); do NOT accept at_separatrix names.
  - Reset/retry the exhausted fsa sources; regenerate at default reviewer + 0.85; only accept >=0.85 (quality-first).
  - Generate the ~9 missing fsa velocity + ~16 missing fsa density species; fix the DT malformation + 2 dangling links; supersede the 3 generic ion_species drafts.
  - Add the local<->separatrix_average pairing invariant (WS4) so the pipeline cannot ship half a pair.

Done-when
  1. Composer emits plasma_boundary for separatrix DD paths; at_separatrix names gone.
  2. All 17 species have both local + fsa velocity + density at plasma_boundary, accepted at >=0.85.
  3. Generic drafts superseded; dangling links fixed; pairing invariant added.
  4. This followup resolved; WS4 closed.

COMPOSER FIX DONE. generate_name_dd.md now maps DD separatrix/separatrix_average -> plasma_boundary AND requires the flux_surface_averaged transform for _average paths (e4bced8a + 2063ad9b; golden regenerated; separatrix->plasma_boundary synonym already in audits._CANONICAL_LOCUS_SYNONYMS). Verified: composes flux_surface_averaged_beryllium_density_at_plasma_boundary. The full fsa generation runs under WS4/pipeline-build.

External residuals: lead adjudication of 4 ambiguous pedestal names + upstream DD neutral energy-flux unit issue

Two items cannot be closed in-repo — both are external dependencies surfaced by the shipped work. (a) LEAD PHYSICS CALL: 4 ambiguous pedestal names retain _at_pedestal (magnetic_shear, safety_factor, poloidal_magnetic_flux, normalized_poloidal_magnetic_flux) — the locked pedestal-consolidation decision requires a value-vs-position judgment (pedestal_top vs pedestal_maximum) that only the lead can make. Recommendation: these summary quantities are conventionally reported at the pedestal top/knee -> _at_pedestal_top; confirm before renaming (free graph rename). (b) UPSTREAM DD: neutral energy_fluxes unit m^-2.s^-1 -> m^-2.W issue is drafted (scratchpad dd_issue_C8_neutral_energy_flux_units.md) but must be filed to the DD tracker + tracked; the 3 flagged catalog names regen after the DD lands. No regression either way (rc62 ships the current forms as draft).
Project: imas-standard-names-catalog (graph rename) + DD (upstream)
Plan: expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: external residuals
Tier: opus

Context
  Two external-dependency items remain after rc62 shipped. Honour the locked pedestal-locus-consolidation decision.

State to read (CODE / FILES / DATA)
  Graph (read-only): magnetic_shear_at_pedestal, safety_factor_at_pedestal, poloidal_magnetic_flux_at_pedestal, normalized_poloidal_magnetic_flux_at_pedestal (all accepted/accepted, no _top counterpart).
  DD via imas-dd: summary/local/pedestal/* + pedestal_fits/* to confirm whether each is a top value or a fit/max-gradient position quantity.
  scratchpad dd_issue_C8_neutral_energy_flux_units.md (drafted DD issue).

Scope locks / constraints
  - The 4 ambiguous: the lead decides top vs pedestal_maximum per name; then a free graph rename (sn run --rename OLD:NEW --include-accepted --override-edits --skip-clear-gate). Do not rename before the lead call.
  - DD issue: file to the iterorganization DD tracker; queue the 3 neutral energy-flux names for regen once the DD unit is corrected.

Done-when
  1. 4 ambiguous adjudicated + renamed (or confirmed left) per the lead.
  2. DD issue filed + tracked; 3 names queued for post-fix regen.
  3. This followup resolved.

DONE. (a) The 4 ambiguous pedestal names renamed to _at_pedestal_top (lead-approved 2026-07-09): magnetic_shear/safety_factor/poloidal_magnetic_flux/normalized_poloidal_magnetic_flux — accepted/accepted, old ids gone, 8 cross-links repaired. (b) DD root cause traced to a type-wiring bug — energy_fluxes kinetic/recombination `neutral` reference wall_description_ggd_particle_neutral (m^-2.s^-1) instead of the dead-but-correct wall_description_ggd_energy_neutral (W.m^-2); introduced DD 3.38.0, wrong ever since (verified via imas-dd version history across every release 3.38.0→4.1.1 + develop). Filed issue iterorganization/IMAS-Data-Dictionary#272 + fix PR #273 (2-line retarget off upstream/develop). Interim W.m^-2 applied to 56 wall energy-neutral IMASNodes + the 3 catalog names (clean energy-flux descriptions, flag removed). PLUS: built the always-on idempotent DD source-drift refresh into sn run (codex 3ce8881a) — names snapshot their DD source (unit/doc), and any drift (e.g. a future DD release) is steered through a docs refine carrying the exact delta; 595 source-linked names baselined.

Post-DD-fix follow-on: PR #273 merge tracking, rc63 publish, wall-name source re-link, derived-drift cascade

After the DD investigation + interim fix, four items remain. (1) Track iterorganization/IMAS-Data-Dictionary PR #273 (retarget wall energy-neutral to the energy type) through review/merge/release; once the corrected DD ships in imas-data-dictionaries, `imas-codex imas dd build` refreshes the 8 IMASNode units and the source-drift refresh reconciles the 3 catalog names automatically. (2) Cut ISNC rc63 to PUBLISH the graph changes made after rc62 — the 4 ambiguous + electron_pressure/pressure pedestal renames and the 3 wall names at W.m^-2 (rc62 predates them). (3) Re-attach DD sources for the 2 source-orphaned wall names (neutral_energy_flux_at_wall, neutral_state_energy_flux_at_wall) so the source-drift refresh covers them (only _due_to_recombination is currently source-linked). (4) Optionally extend the source-drift refresh to cascade through derived-name parents — it currently covers the 595 directly-DD-source-linked names only.
Project: imas-codex + imas-standard-names-catalog + DD (upstream)
Plan: expert-review-fixes (http://localhost:8765/imas-standard-names/expert-review-fixes.html)
Section: post-DD-fix follow-on
Tier: opus

Context
  The wall neutral energy-flux unit bug is filed (DD issue #272 / PR #273) with an interim W.m^-2 graph fix; the idempotent source-drift refresh is wired into sn run (codex 3ce8881a). Remaining work is publish + tracking + two coverage gaps.

State to read (CODE / FILES / DATA)
  gh pr view 273 -R iterorganization/IMAS-Data-Dictionary (merge/release status).
  imas_codex/standard_names/source_refresh.py + the B2d hook in loop.py (source-drift refresh).
  Graph: the 2 source-orphaned wall names (no PRODUCED_NAME StandardNameSource); derived-name HAS_PARENT chains.
  ISNC release state (sn release status) — rc62 is the latest tag.

Scope locks / constraints
  - rc63: cut only from an export-clean graph; it publishes the post-rc62 renames + wall W.m^-2. Confirm no regression vs rc62 first.
  - Do not adopt the DD fix in-catalog beyond the interim W.m^-2 until PR #273 releases; the source-drift refresh will reconcile on the next dd build + sn run.
  - Source re-link + derived-drift cascade are enhancements — keep the always-on, idempotent, refine-not-regenerate contract.

Done-when
  1. PR #273 tracked to merge/release; corrected DD picked up by dd build.
  2. rc63 cut + pushed (post-rc62 graph changes published).
  3. 2 orphaned wall names source-linked; source-drift refresh covers them.
  4. This followup resolved.