Landed 2026-07-04. Items 1–3 shipped; item 4's four generation-layer guards shipped, its catalog re-mapping is queued in the pipeline. ISN: 538729d (SPA filter roles), f4aee1a (notation rule + description validator), 42dde36 (polarization convention note), ca4585c (image_up_unit_vector carrier), a6a91a5 (bonus: seven dead semantic checks awakened — see §2a). imas-codex: dbcc8359/3bbbfdd1 (prompt rules), 9295d4ad/e6d59bf1 (attach-gate guards), 655e8cff (family audit), ISN pin → ca4585c. 15 sn edits attached (2 camera image-up renames, FOV-angle pair hint, E− formula, 11 notation outliers); bounded review rotation launched. Residual work: §5c.

Rotation results (three bounded runs, ~$6.6, ended no_eligible_work). 13 of 15 edits applied and re-accepted: all 9 LaTeX descriptions now plain text, the mixed-phi block and Phi_tor markup fixed, the E− formula carries 1/√2, and both camera image-up renames landed (x/y_direction_unit_vector_of_camera superseded by accepted x/y_image_up_unit_vector_of_camera). Two stragglers ride the next routine rotation: the x_angle_of_camera rename hint (edit_status open — pooled runs don't claim hint edits on accepted names) and the x image-up successor's docs review (docs_stage drafted). Catalog YAML export / RC release remains the lead's call (sn release).

§1 — Triage verdicts

An independent reviewer raised four observations against the ISN catalog and SPA. Each was root-caused before treatment (three parallel investigations, 2026-07-04). Fixes must persist at generation level (grammar spec, codex prompts, validation) — not only as cosmetic edits to existing names.

#Reviewer observationVerdictRoot cause (one line)
1Missing + to filter by the qualifier grammar category (other categories fine) Confirmed bug, plus a worse latent one Two hand-maintained role lists in the SPA drifted from the dataset emitter's role set
2phi vs $\phi$ vs $\Phi$ inconsistency, sometimes within one SN Partly confirmed — an unwritten per-field convention, not random drift; $\Phi$ is legitimate (flux/potential, never the angle) No notation rule exists for the description field; the LaTeX rule is scoped to documentation only
3Is right_hand_circularly_polarized redundant given right-handed coordinate frames? Reviewer mistaken — qualifier is physically mandatory L/R = rotation sense of the wave E-field about B0 (DD's own e_field/plus vs minus), unrelated to coordinate handedness
4Unit-vector components a mess: vertical vs z, of_camera vs no locus, domain changes Confirmed, and worse than reported Four independent gaps: a prompt rule that strips device loci, family batching that splits direction/up, an attach gate with no locus↔source check, and no family-consistency validation

§2 — Item 1: qualifier chips cannot filter (SPA)

Root cause. The dataset emitter (imas_standard_names/catalog/dataset.py, _derive_grammar_facets) emits parse roles base, operator, axis, locus, subject, process, qualifier, aggregation, orbit, population, zone, channel, channel_qualifier (+unparseable). The SPA holds three independent hand-copies of "which roles are filterable", all stale in different ways:

Treatment. Single source of truth: mark filterability on ROLE_META in site/src/lib/grammar.js and export a derived FILTERABLE_PARSE_ROLES. Consume it in App.jsx (filter keys + state init), ParseBreakdown.jsx, Filters.jsx (EMPTY_FILTERS), and ActiveFilterStrip.jsx (labels from ROLE_META.label). Extend the filter-chain test to cover a qualifier-role filter end-to-end and to assert the SPA list matches the emitter's role set. Persistence: any future emitter role added to ROLE_META is filterable by default — no second list to forget.

§2a — Bonus discovery: seven semantic checks were dead code

While extending the orientation-locus rule, the whole grammar-based semantic check family turned out to be dead since birth: every check called parse_standard_name(entry.standard_name), but the model field is .name — the AttributeError was swallowed by except: pass, so none of the seven checks (geometric qualification, component/coordinate base-type, orientation completeness, trajectory qualification, extent dimensionality, physical-base-with-object, and the unit-vector rule being added) had ever run. Landed in ISN a6a91a5: the attribute fixed, the newly-live checks calibrated against the 2117-entry catalog (accept at_<locus> position qualification; exempt intrinsic plasma coordinate carriers like normalized_toroidal_flux_coordinate; delegate orientation/unit-vector/path bases to their dedicated checks), and the validate CLI made severity-aware (ERROR blocks, WARNING blocks under --strict, INFO never). Post-calibration catalog blast radius: 0 errors, 3 warnings (the item-4 locus-less generics — intended), 310 non-blocking INFO.

§3 — Item 2: phi notation

Evidence (full-catalog YAML parse, 2117 entries): the reviewer's raw counts conflate three populations. ~1116 bare phi are DD-path tokens (k_phi, b_field_phi_probe) — untouchable. The prose split is systematic by field: description uses bare phi 437× vs 6× LaTeX; documentation uses $\phi$ 3876× vs 1× bare. All 227 $\Phi$ denote flux/potential/phase — zero mis-capitalised angles. The "within one SN" mixing the reviewer saw is the cross-field seam (e.g. count_of_toroidal_magnetic_field_probe, magnetic_field_diagnostics.yml:260 vs :265).

Root cause. The only notation guidance lives in grammar/field_schemas.py:118,169 (generated from grammar/specification.yml) and is scoped to the documentation field ("Use LaTeX commands ($\phi$…), not Unicode"). The description field has no notation rule anywhere, and imas-codex copies this guidance verbatim into its generation prompts via get_grammar_context() (imas_codex/standard_names/context.py:77,92) — so the LLM improvises per field.

Treatment (decision D1 below): codify the de-facto convention — description is plain text (Greek letters written as words: phi, frames as (R, phi, Z)); documentation uses LaTeX ($\phi$, $(R, \phi, Z)$; capital $\Phi$ reserved for flux/potential). Implement in grammar/specification.yml (propagates to field_schemas.py via grammar_codegen and to codex prompts via get_grammar_context()), add a validate_description check flagging LaTeX/$ markup in descriptions, and fix the ~8 true outliers via sn edit (6 LaTeX-in-description entries, 1 mixed documentation block in transport.yml vertical_current_density_due_to_ion_inertia, 1 bare Phi_tor in equilibrium.yml toroidal_flux_radius_at_plasma_boundary).

§4 — Item 3: circular polarization qualifier (reviewer rebuttal)

The qualifier is physically mandatory. Left/right-hand circular polarization is the rotation sense of the wave electric field about the background magnetic field B0 — with the exp(-iωt) phasor convention, E+ (left-hand) co-rotates with positive-ion gyromotion and drives ion-cyclotron resonant coupling; E- (right-hand) governs electron-cyclotron and right-hand-cutoff physics. This is the IMAS DD's own distinction (waves/coherent_wave/full_wave/e_field/plus = "Left-hand circularly polarized component…" vs e_field/minus) and is unrelated to coordinate-system handedness: in the same right-handed frame both polarizations exist as physically distinct, separately stored fields, and the qualifier is the only token distinguishing their ISN names. All 10 catalog entries document the B0-anchored convention.

Real defects found while verifying: (a) the E- definition in right_hand_circularly_polarized_wave_electric_field (electromagnetic_wave_diagnostics.yml:2633) writes E_- = E_x - iE_y without the 1/√2 normalisation its siblings use — fix via sn edit --hint; (b) the polarization category in grammar/vocabularies/qualifier_categories.yml carries no convention note — add a one-line comment pointing at the B0-anchored definition so future generation inherits it.

§5 — Item 4: direction-unit-vector family

What the catalog holds today for the machine-frame orientation vectors (camera_ir/channel/camera/{direction,up}/{x,y,z} and seven sibling devices):

DD paths (camera_ir/channel/camera/…) Current standard names line of sight direction/x direction/y direction/z image-up (a different vector) up/x up/y up/z 7 other devices (spi, ec_launchers, neutron, operational sensors…) …/direction/{x,y,z} x_direction_unit_vector y_direction_unit_vector_of_strain_gauge_sensor vertical_direction_unit_vector generic, no locus · mechanical_measurement_diagnostics x_direction_unit_vector_of_camera y_direction_unit_vector_of_camera image-up named as "direction" · plasma_wall_interactions up/z collapses into the line-of-sight z name
DD→SN mapping today. Red: the image-up vector's x,y got camera-locus names (in a different physics domain) while its z was absorbed into the generic vertical name that also carries the line-of-sight z — two different vectors of one device sharing one scalar name. The y generic carries a strain-gauge locus over camera/EC/SPI sources.

Four root-cause layers (each alone would have let this through):

  1. Composition prompt strips loci and is self-inconsistent on the axis token. imas-codex/imas_codex/llm/prompts/sn/generate_name_system.md:232 (mirrored at generate_name_dd.md:85) instructs: ✗ z_coordinate_of_sensor_direction_unit_vector → ✓ vertical_surface_normal / z_direction_unit_vector — i.e. drop the device locus, and it endorses both vertical and z in one breath.
  2. Family batching pre-normalises z→vertical but keeps x,y, and splits sibling vectors. imas_codex/standard_names/families.py:52-61 maps DD leaf z→"vertical" with identity x→x, y→y; families are keyed per DD parent, so camera/direction/* and camera/up/* are named in independent batches, never reconciled.
  3. Attach gate has no locus↔source or distinct-vector check. imas_codex/standard_names/workers.py:1643 _is_attachment_consistent checks tense, state-resolution and shape surface only — nothing stops a camera path attaching to an of_strain_gauge_sensor name, or direction/z and up/z collapsing onto one name. Domain promotion (domain_ranking.py:106) then drifts family members apart by design.
  4. ISN validation exempts unit vectors from the locus rule. validation/semantic.py:13 ORIENTATION_BASES = {surface_normal, sensor_normal, tangent_vector} — it omits direction_unit_vector, unit_vector, x1_unit_vector, x2_unit_vector, so the locus-less generics validated clean.

§5a — vertical vs z (lead steer, researched)

Steer: "I feel we use these labels to distinguish x,y,z and radius,phi,vertical coordinate systems — may be historical, research and decide." Findings from the live grammar and catalog:

Decision D2 (first lock, superseded same day): vertical stays the single canonical token for the machine vertical axis in all frames; z remains an input alias; the frame is marked by the horizontal tokens.

D2 reopened and re-locked (lead steer, 2026-07-04 evening): the lead reviewed and steered — "reassess the need for a vertical vs z convention when we have family groups; it seems odd to have x, y, and vertical". Reassessment: the drift risk that motivated a single token (two tokens for one physical axis letting sibling families diverge) is now covered by the codex vector-node family audit, which enforces one canonical triple per DD vector family — a guard that did not exist at first lock. With family-level enforcement, the mixed triple's readability cost dominates (the external reviewer and the lead both tripped over x, y, vertical). New rule: Cartesian family triples are x, y, z; cylindrical triples stay radial, toroidal, vertical; vertical remains for cylindrical Z and standalone machine-vertical quantities; z appears only as the third member of an x, y, z family. First lock archived at archive/…-vertical-vs-z-locked. Implementation: z promoted to a canonical coordinate-axis token (alias removed from vertical), codex prompts + family audit updated to the per-frame triples, Cartesian vertical_… siblings renamed via sn edit.

§5b — Treatment

  1. Rule (D3): device orientation/direction unit vectors require an object locus — matching the universal locus-qualified pattern for coordinates and the existing normals rule. Distinct vectors of one device get distinct bases (line-of-sight direction_unit_vector vs image-up), and an attached source must be device-compatible with the name's locus.
  2. imas-codex prompts: rewrite generate_name_system.md:232 and generate_name_dd.md:85 — locus is kept for device orientation vectors; canonical Cartesian device triple is x, y, vertical; never name a non-line-of-sight vector as bare "direction".
  3. imas-codex attach gate: extend _is_attachment_consistent with (a) locus↔source-device compatibility, (b) reject attaching two different vector parents of one DD device node to the same scalar name; add a family audit (one base+locus+domain triple per DD vector node).
  4. ISN validation: add the unit-vector carriers to the orientation-locus check (warning severity until the catalog renames land, then promote to error, so ISNC CI does not break mid-flight).
  5. Catalog renames via sn edit (graph is live): split the generic triple per device with --hint/--scope family; rename the camera image-up pair to image-up-based names; re-home camera/up/z; fix y_…_of_strain_gauge_sensor; harmonise family domains; rename x_angle_of_camera/vertical_angle_of_camera to a consistent horizontal/vertical field-of-view pair.

§5c — Landed vs residual (2026-07-04)

Landed. All four generation layers now guard this family: (1) the prompt rules teach locus-kept orientation vectors, the x,y,vertical triple, and distinct bases for distinct vectors (imas-codex dbcc8359, 3bbbfdd1); (2) the attach gate rejects device-vs-locus contradictions and two-vectors-of-one-device collapses (9295d4ad, e6d59bf1); (3) a family audit checks each DD vector node's components agree on base+locus+domain and the canonical axis triple (655e8cff); (4) ISN warns on locus-less unit-vector carriers (a6a91a5, staged warning) and gained the image_up_unit_vector carrier (ca4585c, catalog round-trip 2117/0). sn edits attached: x/y_direction_unit_vector_of_camera → x/y_image_up_unit_vector_of_camera (renames) and the FOV-angle pair hint on x_angle_of_camera.

Residual (stays in f-irf-004… reopened as f-irf-006). The generic x/vertical_direction_unit_vector + mis-locused y_…_of_strain_gauge_sensor triple needs a per-device split (one SN per device per D3), and camera/up/z must be re-homed from vertical_direction_unit_vector to the image-up family — a source detach/re-map that sn edit cannot express; it needs a scoped regeneration pass (sn run --focus over the affected DD paths) now that the prompts and attach gate are fixed. Afterwards, promote the ISN unit-vector locus warning to error and harmonise the camera family's physics_domain.

§6 — Out-of-scope findings (queued, not shipped here)

While auditing item 4: 89 dd_paths map to more than one standard name (e.g. spectrometer_x_ray_crystal/camera/centre/z → both vertical_coordinate_of_camera and vertical_coordinate_of_diagnostic_antenna). Same class of attach-gate gap as item 4 but much wider; queued as its own followup rather than folded into this plan's scope.

§7 — Follow-up session (2026-07-05): reversal, symbols, incident, rc60

Lead steers implemented. (1) vertical-vs-z re-locked: Cartesian family triples are x, y, z (ISN d4c8beb; codex frame-aware families 8b9ecb54, audit triples 70543413, prompts 2a051e3c); three Cartesian vertical_coordinate_* renames queued. (2) Descriptions use Unicode Greek symbols (φ, θ, ρ) instead of spelled-out words — rule in the grammar spec (ISN ed716c8), deterministic normalizer at every codex description-persist site (aceef6cf), one-shot graph pass over ~410 descriptions.

Incident (recovered, memory recorded). sn run --reset-to extracted --reset-only --include-accepted --focus <paths> ignores --focus for the reset and cleared 1863 accepted names graph-wide. Recovery: sn import from ISNC YAML (the released catalog is the authoritative record), surgical re-supersession of resurrected predecessors, deterministic re-application of the φ pass and re-attachment of the doc edits. Three export-blocking defects found and fixed in the aftermath: the import never stamped validation_status/docs_stage on created nodes, advance_watermark was called with the wrong signature (64078660/69e622a9), and Gate C excluded catalog-lineage names as "unreviewed" — which would have shrunk a full-scope publish to 241 entries (b815f3a8).

Composition unblocked. Every direction-vector compose failed ISN IR validation because the LLM labels geometry projections 'component'; the shape is derivable from base kind, now coerced deterministically (2a8ac508). New vocabulary: sensor, pellet_injector, shatter_cone loci + major/minor_axis_unit_vector carriers (ISN 18b8465). The unit-vector locus rule is now a blocking ERROR (ISN d7794de).

Released: ISNC v0.2.0rc60 (commit f86883b3, 2119 entries, validation PASSED with the awakened checks). Dropped 8 (the retired generics/mis-named camera names), added 10 (per-device triples, image-up, angular-width pair, 3 pipeline names). ~20 direction-vector paths deliberately parked as visible vocab_gap sources rather than shipped wrong — see f-irf-007. LLM spend ≈ $35 across nine bounded rotations.

§ Decisions

Notation convention for the description field: plain text or LaTeX?

99.4% of descriptions already use plain text and 99.97% of documentation already uses LaTeX — codifying the de-facto per-field convention costs ~8 edits vs ~437, keeps the ≤120-char descriptions markup-free for plain-text consumers (MCP tools, netCDF-style attributes), and both fields render correctly in the SPA either way.

Canonical token for the machine vertical axis: vertical everywhere, or z in Cartesian triples?

REOPENED same-day on lead steer (first lock archived: docs/archive/independent-review-fixes-vertical-vs-z-locked.html). With the codex vector-node family audit enforcing one canonical triple per DD vector family, the drift risk that motivated a single vertical token is covered at the family level, and the mixed x,y,vertical triple's readability cost dominates (both the external reviewer and the lead tripped over it). New rule: Cartesian family triples are x, y, z; cylindrical triples stay radial, toroidal, vertical; vertical remains for cylindrical Z and standalone machine-vertical quantities; z appears ONLY as the third member of an x,y,z family.

Device orientation/direction unit vectors: generic multi-attach names or locus-required?

Matches the catalog's universal pattern for geometry (every coordinate name is locus-qualified) and the existing ORIENTATION_BASES rule for normals/tangents; the generic pattern demonstrably conflates distinct vectors (camera direction/z + up/z on one name) and produced the strain-gauge mis-locus. See §5b.

Keep left/right_hand_circularly_polarized qualifiers?

Physically mandatory — mirrors DD e_field/plus vs minus; rotation sense about B0, not coordinate handedness. Rebuttal in §4; only the E- formula normalisation and a vocab comment change.

§ Followups

§2 — SPA: single source of truth for filterable parse roles

Derive FILTERABLE_PARSE_ROLES from ROLE_META in site/src/lib/grammar.js; consume in App.jsx, ParseBreakdown.jsx, Filters.jsx, ActiveFilterStrip.jsx; align filter-chain test with the emitter role set; qualifier chips gain the + and the six silent roles start filtering.
Project: imas-standard-names
Plan:    independent-review-fixes (http://localhost:8765/imas-standard-names/independent-review-fixes.html)
Section: §2
Tier:    opus

Context
  Reviewer found qualifier grammar chips lack the + filter affordance; investigation found
  two drifted role lists and a stale test copy (§2 of the plan).

State to read
  site/src/lib/grammar.js (ROLE_META), site/src/App.jsx:73-95,148-160,
  site/src/components/ParseBreakdown.jsx:14, site/src/components/Filters.jsx:45-60,
  site/src/components/ActiveFilterStrip.jsx, site/tests/integration/filter-chain.test.js,
  imas_standard_names/catalog/dataset.py (_derive_grammar_facets role strings)

Scope locks / constraints
  site/ only. Single derived list; no second hand-copy may remain.

Done-when
  1. Qualifier chips show + and filter; aggregation/orbit/population/zone/channel/channel_qualifier filters actually apply
  2. site tests green (npx vitest run in site/)
  3. Outcome recorded in plan, followup resolved

Landed ISN 538729d: FILTERABLE_PARSE_ROLES derived from ROLE_META feeds chips, filter chain, state init, and labels; qualifier + process chips gain the +, six silently-dead filters (aggregation/orbit/population/zone/channel/channel_qualifier) now apply; drift-guard test vs the emitter role set. 165 site tests green.

§3 — Codify per-field notation rule + fix 8 outlier entries

Add the description=plain-text / documentation=LaTeX rule to grammar/specification.yml, regenerate field_schemas.py, extend validate_description to flag LaTeX in descriptions, and sn-edit the ~8 outliers.
Project: imas-standard-names
Plan:    independent-review-fixes (http://localhost:8765/imas-standard-names/independent-review-fixes.html)
Section: §3
Tier:    opus

Context
  Per-field notation convention is de-facto but unwritten; codex prompts inherit ISN field
  guidance via get_grammar_context(), so the fix lands once in specification.yml.

State to read
  imas_standard_names/grammar/specification.yml (entry_schema description/documentation guidance),
  imas_standard_names/grammar_codegen/generate.py, imas_standard_names/validation/description.py,
  outlier list in plan §3

Scope locks / constraints
  Honour decision description-notation (plain-text descriptions). DD-path phi tokens untouchable.
  Catalog text changes only via imas-codex sn edit (graph is live), never hand-edited YAML.

Done-when
  1. specification.yml rule + regenerated field_schemas.py committed; validation check + tests green
  2. sn edit proposals attached for the 8 outliers (dry-run first)
  3. Outcome recorded in plan, followup resolved

Rule landed ISN f4aee1a (specification.yml notation guidance for both fields, regenerated field_schemas.py via build-grammar, validate_description warns on $/LaTeX/Unicode-Greek in descriptions; 9 new tests, full suite 1634 green). All 11 outlier sn edits attached (9 LaTeX-in-description hints, the transport.yml mixed-phi doc block, the equilibrium Phi_tor markup nit) — review rotation running; codex ISN pin bumped so generation prompts serve the new rule.

§4 — Polarization: E- formula fix + vocab convention comment

sn edit the E- normalisation at electromagnetic_wave_diagnostics right_hand_circularly_polarized_wave_electric_field (missing 1/sqrt2); add B0-anchored convention comment to the polarization category in qualifier_categories.yml. Reviewer rebuttal already recorded in §4.
Project: imas-standard-names
Plan:    independent-review-fixes (http://localhost:8765/imas-standard-names/independent-review-fixes.html)
Section: §4
Tier:    sonnet

Context
  Physics verified: qualifier stays. Two small defects remain (formula normalisation, missing
  vocab convention note).

State to read
  imas-standard-names-catalog/standard_names/electromagnetic_wave_diagnostics.yml:2616-2660,
  imas_standard_names/grammar/vocabularies/qualifier_categories.yml (polarization category)

Scope locks / constraints
  No name changes. Catalog docs fix via imas-codex sn edit --hint only.

Done-when
  1. sn edit attached for the E- formula (dry-run first)
  2. Vocab comment committed in ISN
  3. Outcome recorded in plan, followup resolved

Vocab convention comment landed ISN 42dde36 (B0-anchored handedness note on the polarization category). E- normalisation sn edit (--axis docs hint: E_- = (E_x - i E_y)/sqrt2) attached, pending review rotation. Rebuttal stands in §4 — the qualifier is physically mandatory.

§5 — Direction-vector family: prompts, attach gate, validation, renames

Implement the four-layer treatment of §5b: prompt rule rewrite (codex), attach-gate locus/device + distinct-vector checks and family audit (codex), orientation-locus validation extension (ISN, warning first), and the sn-edit rename cascade for the direction/up/angle families.
Project: imas-standard-names
Plan:    independent-review-fixes (http://localhost:8765/imas-standard-names/independent-review-fixes.html)
Section: §5
Tier:    opus

Context
  Four root-cause layers identified (§5); decisions vertical-vs-z and orientation-locus locked.

State to read
  imas-codex/imas_codex/llm/prompts/sn/generate_name_system.md:45,92,231-266,
  generate_name_dd.md:85,328; imas_codex/standard_names/families.py:13-61;
  workers.py:1643-1723; audits.py; domain_ranking.py:41-126;
  ISN validation/semantic.py:13-17,139-165; grammar/vocabularies/coordinate_axes.yml, components.yml

Scope locks / constraints
  Honour decisions: vertical canonical (z = alias), locus required for orientation vectors,
  distinct bases for distinct vectors. ISN validation lands warning-severity until renames land.
  components.yml z disposition goes to canonical-qualifier-order §3, not here.
  All catalog renames via sn edit with --dry-run preview; family/subtree scope as appropriate.

Done-when
  1. Codex prompt + attach gate + family audit changes committed with tests
  2. ISN validation extension committed with tests (warning severity)
  3. sn edit cascade attached for direction/up/angle families; dry-run outputs recorded in plan
  4. Outcome recorded in plan, followup resolved

Four-layer guards landed: codex prompt rules dbcc8359/3bbbfdd1, attach-gate guards 9295d4ad/e6d59bf1, family audit 655e8cff; ISN staged unit-vector locus warning a6a91a5 + image_up_unit_vector carrier ca4585c (catalog round-trip 2117/0). Camera image-up renames + FOV-angle hint attached as sn edits. Residual split/re-home work re-queued as f-irf-006 (see §5c).

§6 — Audit the 89 dd_paths mapped to multiple standard names

Wider attach-hygiene sweep discovered during item-4 triage; needs its own classification pass (legitimate multi-name cases vs attach errors) and probably an attach-gate uniqueness rule.
Project: imas-standard-names
Plan:    independent-review-fixes (http://localhost:8765/imas-standard-names/independent-review-fixes.html)
Section: §6
Tier:    opus

Context
  Full-catalog source scan found 89 dd_paths carried by 2+ standard names (examples in §6).
  Out of scope for the review fixes; queued for a dedicated pass.

State to read
  imas-standard-names-catalog/standard_names/*.yml (sources blocks);
  imas_codex/standard_names/workers.py:1643 (_is_attachment_consistent)

Scope locks / constraints
  Classify before fixing: some duplicates may be legitimate (deprecation pairs, aliases).

Done-when
  1. Classification table (legit vs error) recorded
  2. Attach-gate uniqueness rule proposed with evidence
  3. Followup resolved or split into implementation followups

Classification of all 90 double-attached paths archived (60 generic-vs-specific / 17 locus mismatch / 9 both-wrong / 4 defensible — docs/archive/independent-review-fixes-dup-paths-classification.html); dd_path_uniqueness_check corpus audit landed (codex cafbb397). Post-restore the accepted set has 1 remaining dup + 6 momentum-family inconsistencies (pre-existing, in the classification); per-path fixes ride f-irf-007.

§5c — Regenerate the direction-vector family: per-device split, up/z re-home, domain harmonisation, warning→error

The generic x/vertical_direction_unit_vector + mis-locused y_…_of_strain_gauge_sensor triple needs a per-device split, and camera/up/z must move to the image-up family — source re-mapping that sn edit cannot express. Prompts and attach gate are now fixed, so a scoped regeneration produces the correct per-device names. Then promote the ISN unit-vector locus WARNING to ERROR and check family physics_domain agreement.
Project: imas-standard-names
Plan:    independent-review-fixes (http://localhost:8765/imas-standard-names/independent-review-fixes.html)
Section: §5c
Tier:    opus

Context
  Generation-layer guards landed (codex prompts, attach gate, family audit; ISN image_up carrier +
  staged warning). The legacy generic direction-vector names still hold 8 devices' sources each and
  camera/up/z sits on the line-of-sight name.

State to read
  Catalog: standard_names/mechanical_measurement_diagnostics.yml (direction_unit_vector family),
  plasma_wall_interactions.yml (camera image-up pair post-rename). Codex: sn run --focus semantics,
  edit/cascade + supersede machinery; families.py; workers.py attach gate.

Scope locks / constraints
  Honour locked decisions vertical-canonical and locus-required. Per-device split via the pipeline
  (sn run --focus over camera_ir/channel/camera, spi/injector, ec_launchers/mirror,
  neutron_diagnostic/detectors, operational_instrumentation/sensor direction paths), never hand-edited
  YAML. Verify each family with the new vector-node audit. After the split lands: move
  UNIT_VECTOR_BASES into ORIENTATION_BASES (error) in ISN semantic.py and drop the staged-warning
  comment.

Done-when
  1. Each device direction vector has its own locus-qualified x/y/vertical triple; up/z on the
     image-up family; family domains agree (vector-node audit clean)
  2. ISN warning promoted to error; ISN + codex tests green; catalog validate passes
  3. Outcome recorded in plan, this followup resolved

Shipped in v0.2.0rc60: broken generics + strain-gauge mis-locus + inconsistent camera angle pair RETIRED (8 drops); per-device replacements ADDED (pellet_injector x/y/z triple, image-up y, shatter-cone minor-axis y, toroidal/vertical_angular_width_of_camera); ISN unit-vector locus rule promoted to ERROR (d7794de); z canonical in Cartesian triples end-to-end (families 8b9ecb54, audits 70543413, prompts 2a051e3c); projection-shape coercion unblocked composition (2a8ac508). Remaining direction-vector paths deliberately parked as visible vocab_gap sources — see f-irf-007.

Post-rc60 residuals: parked direction-vector paths, momentum-family dups, direction_second qualifier, x_image_up docs

Deliberately parked as vocab_gap in rc60 (visible, unexported): camera direction/{x,y,z} + up/{x,z}, ec mirror movement/direction triple, sensor direction triple, shatter_cone direction x/y + minor x/z, neutron direction_to_detector triple, sensor direction_second (needs an ordinal qualifier — token review). Also: 6 momentum-family base-carrier inconsistencies + 1 dup path (classification archive), x_image_up docs still pending, 9 LaTeX descriptions + E− formula edits still queued as open hint edits. Supervised pipeline session recommended — pooled runs re-drafted catalog names and burned budget without claiming hint edits tonight.
Project: imas-standard-names
Plan:    independent-review-fixes (http://localhost:8765/imas-standard-names/independent-review-fixes.html)
Section: §5c residuals
Tier:    opus

Context
  rc60 shipped the guard-rails and clean replacements; ~20 direction-vector DD paths are parked
  as vocab_gap sources and several doc-fix hint edits remain open. Pooled runs proved unreliable
  for claiming hint edits on accepted names and re-drafted catalog names — supervise each rotation.

State to read
  Graph: StandardNameSource status=vocab_gap for camera_ir/ec_launchers/spi/operational_instrumentation/
  neutron_diagnostic direction paths; open edits (sn.edit_status='open').
  Memory: sn-reset-ignores-focus-incident, sn-pipeline-rotation-traps.
  Archive: docs/archive/independent-review-fixes-dup-paths-classification.html.

Scope locks / constraints
  Honour locked decisions (z-in-cartesian-families, locus-required, plain-text-symbol descriptions).
  direction_second needs the ordinal-qualifier decision at the canonical-qualifier-order token review
  FIRST. Never run sn run --reset-to with --include-accepted (incident). Verify every rotation's
  output against the vector-node family audit before accepting.

Done-when
  1. Each parked path carries a locus-qualified x/y/z name accepted with docs
  2. Momentum-family dups + open doc edits drained; family + uniqueness audits clean
  3. Outcome recorded, this followup resolved

Migrated to a dedicated plan so this shipped plan can close: catalog-naming-followups. That plan carries the parked orientation-vector paths (f-cnf-002), the momentum-family/dup residual (f-cnf-003), the open doc edits (f-cnf-004), the confirmed-unfixed sn-run --reset-to/--focus scoping bug (f-cnf-001), and two reopened decisions (cylindrical axis naming; reset-bug approach).