Non-blocking items surfaced by the two independent reviews run against #364 (a whole-schema standardization audit and a devoted physics units review). Everything blocking was fixed in #364 itself; these were deliberately left out to keep that PR reviewable and because several are data-layout or out-of-scope-file changes.
Re-verified against develop at b3abe074 (#363 and #364 both merged). All items below still reproduce; the wording of items 1, 2 and 4 has been corrected where the original text was inaccurate.
Schema / data layout
1. ξ array axis order differs between integrator backends.
ForceFreeStates/Solutions/ForwardIntegration/xi_psi is (mode, solution, psi); ForceFreeStates/Solutions/GalerkinIntegration/Solution/xi_psi is (mode, psi, solution) — the same physical quantity, transposed. #364 unified the names (both are xi_psi/dxi_psidpsi now), each dims attribute is honest about its own order, and the Galerkin long_name now carries an explicit warning ("note the psi/solution axis order differs from ForwardIntegration"), so the trap is at least signposted in the file. Cross-backend tooling that reads one and then the other still silently gets a transpose. Unifying requires a permutedims at write plus updates to benchmarks/verify_gal_{solution,ideal}.jl and friends — a data change, not a naming one, so it wants its own PR and a regression run.
2. Tearing/PerSurface/ cannot be plotted against ψ.
PerSurface/ already writes m, n and rs per surface, so the resonant q = m/n is derivable — but rational_psi is absent, and Roots/ and LayerWidths/ carry only the opaque rational_index. Attach paths resolve relative to the annotated group, so cross-group dimension-scale attachment to SingularSurfaces/rational_psi is not mechanically possible — the fix is writing rational_psi (and rational_q for symmetry with the rest of the schema) directly into Tearing/PerSurface/. The file's own (now stale) header comment suggests that was the original intent. Would make Tearing results natively plottable vs ψ or q like SingularCoupling/ already is.
3. PE Response/ writes empty placeholder arrays where sibling code skips.
src/PerturbedEquilibrium/Utils.jl:143-148 unconditionally writes xi_psi, b_psi_area_weighted, Jb_theta, Jb_zeta, b_n, xi_n as ComplexF64[] when not computed (so a rank-1 empty array carries a rank-2 dims attribute), while the surrounding function and the main writer both use !isempty(...) && guards or zero-extent sentinels. Pick one pattern file-wide.
4. Optional completeness. EulerLagrangeMatrices/Kinetic/{D,E,H,F} are shared unchanged from Ideal/ and never re-emitted — table entries were trimmed accordingly, but writing the copies for symmetry is an option. (Equilibrium/b_norm was also listed here; it has since been folded into #389, which owns the decision to compute the field or delete it. Do not fix it in both places.)
5. Vocabulary watch item. dims uses both solution (arbitrary-amplitude basis index, e.g. ForwardIntegration/xi_psi) and eigenmode (normalized generalized eigenvector index, e.g. FreeBoundaryStability/eigenmode_energies). These look like genuinely distinct concepts, but a schema owner should confirm rather than leave it implicit. Similarly Tearing/PerSurface/lu could be S, the literature symbol for the Lundquist number — its long_name already reads "Lundquist number S per surface", so only the leaf name is out of step. Low value, listed for completeness.
Documentation defects found during the units review
6. Metric coefficient labels are dimensionally inverted. src/ForceFreeStates/Fourfit.jl:35-40 (the docstring listing "1. g^ψψ · J … 6. g^ψθ · J", and the MetricData.fs field docs) describes metric.fs[1..6] as g^ij·J. The code computes g_ij/J: v[i,:] = e_i/J (e.g. v[3,3] = 2π·R/jac, which is |e_ζ|/J, not ∇ζ = 1/(2πR)), then fs[k] = dot(v_i, v_j) * jac. Verified independently. Numbers are unaffected — only the label is wrong — but it will mislead the next person auditing units. The same wording is repeated in src/PerturbedEquilibrium/FieldReconstruction.jl:611, and a nearby block comments its covariant basis vectors as "Contravariant basis vectors WITHOUT /jac". Highest value-per-effort item here: a wrong dimensional label inside a physics kernel.
7. Two smaller comment corrections in FieldReconstruction.jl: the # b^ψ (not J-weighted) (:797) / # b^ψ (no Jacobian) (:191) comments describe a quantity that is J·b^ψ (χ₁ supplies the weight; what is absent is the jmat convolution); and the area = <J·|∇ψ|>_θ (Hamada: J is const over θ) caveat at :133 is unnecessary — the (J·b^ψ)_m/A = b̄_m identity is exact in any SFL working coordinate.
8. Stale agent memory. .claude/agent-memory/fortran-physics-reviewer/known_issues_perteq.md:7-9 states xss is a zero placeholder; it is now solved as -A⁻¹(B·xmp1 + C·xsp) in compute_clebsch_displacements. The MEMORY.md index line says the same.
Suggested split
Items 1–3 are the substantive ones and each wants its own PR with a regression run. Items 6–8 are documentation/comment-only and could land together in a single cheap pass. Items 4–5 are judgement calls for whoever owns the schema.
Context: #226 (schema overhaul), #363 and #364 (merged), #389 (equilibrium parameter cleanup, owns b_norm).
Non-blocking items surfaced by the two independent reviews run against #364 (a whole-schema standardization audit and a devoted physics units review). Everything blocking was fixed in #364 itself; these were deliberately left out to keep that PR reviewable and because several are data-layout or out-of-scope-file changes.
Re-verified against
developatb3abe074(#363 and #364 both merged). All items below still reproduce; the wording of items 1, 2 and 4 has been corrected where the original text was inaccurate.Schema / data layout
1. ξ array axis order differs between integrator backends.
ForceFreeStates/Solutions/ForwardIntegration/xi_psiis(mode, solution, psi);ForceFreeStates/Solutions/GalerkinIntegration/Solution/xi_psiis(mode, psi, solution)— the same physical quantity, transposed. #364 unified the names (both arexi_psi/dxi_psidpsinow), eachdimsattribute is honest about its own order, and the Galerkinlong_namenow carries an explicit warning ("note the psi/solution axis order differs from ForwardIntegration"), so the trap is at least signposted in the file. Cross-backend tooling that reads one and then the other still silently gets a transpose. Unifying requires apermutedimsat write plus updates tobenchmarks/verify_gal_{solution,ideal}.jland friends — a data change, not a naming one, so it wants its own PR and a regression run.2.
Tearing/PerSurface/cannot be plotted against ψ.PerSurface/already writesm,nandrsper surface, so the resonantq = m/nis derivable — butrational_psiis absent, andRoots/andLayerWidths/carry only the opaquerational_index. Attach paths resolve relative to the annotated group, so cross-group dimension-scale attachment toSingularSurfaces/rational_psiis not mechanically possible — the fix is writingrational_psi(andrational_qfor symmetry with the rest of the schema) directly intoTearing/PerSurface/. The file's own (now stale) header comment suggests that was the original intent. Would make Tearing results natively plottable vs ψ or q likeSingularCoupling/already is.3. PE
Response/writes empty placeholder arrays where sibling code skips.src/PerturbedEquilibrium/Utils.jl:143-148unconditionally writesxi_psi,b_psi_area_weighted,Jb_theta,Jb_zeta,b_n,xi_nasComplexF64[]when not computed (so a rank-1 empty array carries a rank-2dimsattribute), while the surrounding function and the main writer both use!isempty(...) &&guards or zero-extent sentinels. Pick one pattern file-wide.4. Optional completeness.
EulerLagrangeMatrices/Kinetic/{D,E,H,F}are shared unchanged fromIdeal/and never re-emitted — table entries were trimmed accordingly, but writing the copies for symmetry is an option. (Equilibrium/b_normwas also listed here; it has since been folded into #389, which owns the decision to compute the field or delete it. Do not fix it in both places.)5. Vocabulary watch item.
dimsuses bothsolution(arbitrary-amplitude basis index, e.g.ForwardIntegration/xi_psi) andeigenmode(normalized generalized eigenvector index, e.g.FreeBoundaryStability/eigenmode_energies). These look like genuinely distinct concepts, but a schema owner should confirm rather than leave it implicit. SimilarlyTearing/PerSurface/lucould beS, the literature symbol for the Lundquist number — itslong_namealready reads "Lundquist number S per surface", so only the leaf name is out of step. Low value, listed for completeness.Documentation defects found during the units review
6. Metric coefficient labels are dimensionally inverted.
src/ForceFreeStates/Fourfit.jl:35-40(the docstring listing "1. g^ψψ · J … 6. g^ψθ · J", and theMetricData.fsfield docs) describesmetric.fs[1..6]asg^ij·J. The code computesg_ij/J:v[i,:] = e_i/J(e.g.v[3,3] = 2π·R/jac, which is|e_ζ|/J, not∇ζ = 1/(2πR)), thenfs[k] = dot(v_i, v_j) * jac. Verified independently. Numbers are unaffected — only the label is wrong — but it will mislead the next person auditing units. The same wording is repeated insrc/PerturbedEquilibrium/FieldReconstruction.jl:611, and a nearby block comments its covariant basis vectors as "Contravariant basis vectors WITHOUT /jac". Highest value-per-effort item here: a wrong dimensional label inside a physics kernel.7. Two smaller comment corrections in
FieldReconstruction.jl: the# b^ψ (not J-weighted)(:797) /# b^ψ (no Jacobian)(:191) comments describe a quantity that isJ·b^ψ(χ₁ supplies the weight; what is absent is thejmatconvolution); and thearea = <J·|∇ψ|>_θ (Hamada: J is const over θ)caveat at:133is unnecessary — the(J·b^ψ)_m/A = b̄_midentity is exact in any SFL working coordinate.8. Stale agent memory.
.claude/agent-memory/fortran-physics-reviewer/known_issues_perteq.md:7-9statesxssis a zero placeholder; it is now solved as-A⁻¹(B·xmp1 + C·xsp)incompute_clebsch_displacements. The MEMORY.md index line says the same.Suggested split
Items 1–3 are the substantive ones and each wants its own PR with a regression run. Items 6–8 are documentation/comment-only and could land together in a single cheap pass. Items 4–5 are judgement calls for whoever owns the schema.
Context: #226 (schema overhaul), #363 and #364 (merged), #389 (equilibrium parameter cleanup, owns
b_norm).