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 observation
Verdict
Root cause (one line)
1
Missing + 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
2
phi 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
3
Is 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
4
Unit-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:
site/src/components/ParseBreakdown.jsx:14FILTERABLE_ROLES — omits
qualifier and process: qualifier chips never get the + glyph. This is
exactly what the reviewer saw.
site/src/App.jsx:73PARSE_FILTER_KEYS — omits qualifier,
aggregation, orbit, population, zone, channel,
channel_qualifier. Consequence (latent, unreported): chips for those six roles DO show a
+, toggle visual state, but the filter is silently never applied.
site/tests/integration/filter-chain.test.js:6 — a third stale copy inside the test.
Both lists also carry reduction/modifier, which the emitter never produces.
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).
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→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):
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.
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.
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.
ISN validation exempts unit vectors from the locus rule.validation/semantic.py:13ORIENTATION_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:
grammar/vocabularies/coordinate_axes.yml: canonical keys are x, y,
radial (alias r), toroidal (aliases phi, tor), vertical (alias z) —
there is no z key, and grammar/parser.py:226 loads keys only
(aliases are never consumed), so z is unparseable as a coordinate token today.
Catalog usage is unanimous: 46 vertical_coordinate_*, 20 radial_coordinate_*,
8 Cartesian x/y_coordinate_* names — and zero names with a z token.
Every Cartesian x/y family already names its third member vertical_…
(e.g. ferritic/object/centroid/{x,y,z} →
x/y/vertical_coordinate_of_ferritic_element_centroid).
So the frame distinction the steer remembers is real but carried by the horizontal tokens:
x/y marks Cartesian, radial/toroidal marks cylindrical. The third axis is the
machine vertical in both frames — physically the same coordinate — and sharing
vertical is semantically exact, not drift. components.yml still lists a vestigial
z component token (zero uses); promoting z to canonical would create two tokens for
one physical axis and re-open exactly the family-splitting drift this plan fixes.
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
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.
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".
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).
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).
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.
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.
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.
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.
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.
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.
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).