Repository navigation
Move the data loader to ReducedComplexityModeling and re-export its three names - #365
Conversation
📝 Summary
Merge Risk:
|
7fe49ca to
201a311
Compare
The module header's comments describe the current code: no release, no version, no issue number, and each import justification is one paragraph. The four names of the header that are not re-exported are named there, which the old text got wrong. KNOWN_ISSUES.md is re-checked entry by entry. C16's explicit-import list holds 7 names, not 9; K4's location moved to test/Project.toml:19; C6 said .gitignore covers the MNIST PDFs, and the move of that material to GMLDatasets took the rule with it. docs/inventories/GeometricOptimizers.toml is regenerated from the deployed v0.9.1 inventory, and the comment above the InterLinks call no longer says the URL is fetched: in the tuple form the first element is the root URL and the rest are the sources.
KNOWN_ISSUES.md. C16 counted twelve packages, and no reading of the module header gives twelve: ten bare `using` statements name ten packages, which together export all 33 names, and an eleventh module, ZygoteRules, owns one of them and Zygote re-exports it. The entry states the two counts and which reading each is. test/quality/aqua.jl repeats the same figure and now agrees with it. C6 said the three MNIST PDFs sit in the history of main for three commits; they were added twice (8dc9b83, 3388258) and deleted twice (a69f464, b001073), and eight commits of origin/main carry them in their tree. docs/make.jl. Four comments state the present fact instead of the move: the InterLinks justification, the Manifolds chapter, the optimizer page and the LaTeX chapter list no longer say "moved", "now" or "see the changelog", and the chapter names are the titles GeometricOptimizers' inventory gives them. CHANGELOG.md. The prose-and-records bullet sits under Documentation, not Added.
…hree names
DataLoader, Batch and train! are that package's objects; this package
imports and re-exports them, and its train! method extends that generic.
ParametricDataLoader is imported by name and stays out of the export and
the public list.
The loader's files, tests and docstrings leave with the code. The Batch
method of integrate narrows to a NeuralNetwork{<:TransformerIntegrator},
because on another package's Batch an unannotated signature is piracy.
The loader pages and the qualified internal names point at
ReducedComplexityModeling, whose dev tree the environment now develops.
…es Aqua can see `Project.toml` no longer carries a `[sources]` block, so every checkout instantiates from the manifest it has and CI resolves once ReducedComplexityModeling 0.4 is released; `[compat]` names the release that holds the moved code, `"0.4"`. `scripts/Project.toml` depends on the package its two scripts now import. Aqua's `piracies` check runs again, with `DataLoader` and `Batch` given as this package's own rather than the check switched off, so the two deliberate methods that name them stay and a piracy of any other foreign function fails. The ambiguity check stays off, with `detect_ambiguities` on this package's methods in its place. The docs page and the CHANGELOG say where the loader's names and docstrings live now, and the records follow the move: K33 cites the `shuffle` rather than the gather body, and K3 keeps the two launchers this package's JET lines reach.
…this package's own The loader page said the generic's `train!` docstring is rendered with the optimizers. The manual's `@docs train!` block renders what `DocSystem.getdocs` returns with `modules = [GeometricMachineLearning]`, and that is this package's method docstring alone; the page now says so and points at ReducedComplexityModeling's manual for the generic's. Aqua's `piracies` check keeps `treat_as_own = [Batch]`. The three methods it reports without a list -- `train!` on a network, the keyword wrapper derived from it, and the `NetworkLoss` fallback -- each name a `Batch`, so `Batch` alone clears them, while `DataLoader` in the list hid a piracy that names only it. The comment states that, and the blind spots that remain: a signature naming only `Batch`, and a symbol type parameter. CHANGELOG's clause names the one type.
… train! entry renders A Union with ParametricDataLoader makes DataLoader own as soon as it is listed, so listing it exempts no method; the manual's entry renders the one method docstring this package defines, not the generic's.
…that is gone The `[compat]` entry still listed `GeometricSolutions` after the loader took its last user, and the header comment explained the `StateVariable` import by naming that package's re-export. The bounds entry now lists the bounds the release holds, and the comment says what the explicit import satisfies.
Two `@ref`s to `ParametricDataLoader` in the scripts' docstrings survived the repoint and now name a docstring no manual here renders; a paragraph of `test/quality/jet.jl` was left ragged where the loader's lines were cut. The loader entry says which routine keeps a binding here and which leaves.
73e7405 to
0b28b04
Compare
There was a problem hiding this comment.
Actionable comments posted: 5
🔇 Additional comments: 1
scripts/utilities/metal_abort_session.jl-102-106: 1
102-106:Major · Stability & Availability · Heavy lift
⚠️ Unverified finding
Verification ran but could not confirm this finding. It is shown for review, not as a verified issue.Synchronize the timestamps shared with
reader().If the two session requests run on different threads,
training()writesM8_T0andM8_T1whilereader()reads them without a lock or atomic operation. Julia does not guarantee safe cross-thread reads of globals under a data race. Use synchronized state for the timestamps and trainer identity so the reader can reliably detect the training interval. (raw.githubusercontent.com)

Review info
-
Run configuration-
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Organization UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
f1c36140-159c-498b-a0eb-4c05c625ba2c
Files selected for processing: 48-
CHANGELOG.mdKNOWN_ISSUES.mdProject.tomldocs/inventories/GeometricOptimizers.tomldocs/make.jldocs/src/architectures/transformer.mddocs/src/data_loader/data_loader.mddocs/src/data_loader/snapshot_matrix.mddocs/src/introduction.mddocs/src/tutorials/symplectic_autoencoder.mddocs/src/tutorials/sympnet_tutorial.mdscripts/Project.tomlscripts/reproduction/symplectic_autoencoders/online_sympnet.jlscripts/utilities/metal_abort_runs.jlscripts/utilities/metal_abort_session.jlscripts/utilities/parametric_data_helpers.jlsrc/GeometricMachineLearning.jlsrc/architectures/forced_sympnet.jlsrc/architectures/parametric_resnet.jlsrc/architectures/sympnet.jlsrc/architectures/transformer_integrator.jlsrc/architectures/transformer_neural_network.jlsrc/data_loader/batch.jlsrc/data_loader/data_loader.jlsrc/data_loader/parametric_data_loader.jlsrc/data_loader/tensor_assign.jlsrc/data_loader/train.jlsrc/loss/losses.jlsrc/parametric.jltest/Project.tomltest/architectures/parametric_resnet.jltest/data_loader/accuracy.jltest/data_loader/autoencoder_keyword.jltest/data_loader/batch.jltest/data_loader/batch_functor.jltest/data_loader/batch_index_set.jltest/data_loader/data_loader.jltest/data_loader/draw_batch_for_tensor_test.jltest/data_loader/parametric_data_loader.jltest/data_loader/train.jltest/integration/docstrings/data_loader.jltest/integration/qp_dispatch.jltest/optimizers/optimizer.jltest/parametric.jltest/quality/aqua.jltest/quality/exports.jltest/quality/jet.jltest/runtests.jl
Files with no reviewable changes: 11-
- test/data_loader/accuracy.jl
- test/integration/docstrings/data_loader.jl
- docs/src/architectures/transformer.md
- test/data_loader/autoencoder_keyword.jl
- test/data_loader/batch_index_set.jl
- src/data_loader/tensor_assign.jl
- test/data_loader/draw_batch_for_tensor_test.jl
- test/data_loader/batch_functor.jl
- src/data_loader/parametric_data_loader.jl
- src/data_loader/batch.jl
- src/data_loader/data_loader.jl
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.
-
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to GitHub limitations.

Major · A child killed by a signal is not waited for, so the crash report is… · metal_abort_runs.jl:390
scripts/utilities/metal_abort_runs.jl:390
🎯 Functional Correctness | 🟠 Major | ⚡ Quick winA child killed by a signal is not waited for, so the crash report is not collected.
p.exitcodeis 0 when a child dies from a signal. libuv reports the signal only inp.termsignal. ASIGABRTorSIGTRAPdeath therefore givescode == 0. Line 396 then skipssleep(CRASH_REPORTER_WAIT). These are the deaths this script exists to catch.The crash reporter writes the
julia-*.ipsfile after the parent has already listedafter. This has four consequences:
newdoes not contain the report.- The report is not copied beside the log. The header comment says macOS deletes these reports.
- The
ARM-STOPearly exit does not trigger.- The log records
exit=0.verdictthen reports the run as void with "log has no M8-END line" until a laterauditfinds the report by pid.The selftest fixtures use exit 134, a shell convention. They never exercise a
termsignaldeath, so they hide this defect.Track
termsignal. Wait for the reporter when either value is non-zero. Record the signal in theARM-RUNline.Proposed fix
code = 0 + signal = 0 elapsed = 0.0 ... code = p.exitcode + signal = p.termsignal ... - code == 0 || sleep(CRASH_REPORTER_WAIT) + (code == 0 && signal == 0) || sleep(CRASH_REPORTER_WAIT)Also add
:signal => signalto theARM-RUNemitcall. Makeverdicttreat a non-zero signal like a non-zero exit code.Also applies to: 396-396

Major · Require an overlapping M8-READ record before counting a… · metal_abort_session.jl:143-145
scripts/utilities/metal_abort_session.jl:143-145
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy liftRequire an overlapping
M8-READrecord before counting a concurrent-arm run.
audit_armcounts every run whoseverdictis:ok.verdictchecks the exit code, Metal device, debug layer, validation line,M8-END, compile time, and loss finiteness. It does not check the reader's record.read_rundoes not parseM8-READor any concurrency field either. A run in the concurrent arm's directory is therefore counted clean even when its reader never ran or its first read finished after training ended. In that second case, the session emitsconcurrentas false, and the audit ignores it.Change the audit to count a concurrent-arm run only when its
M8-READrecord reports concurrency. Checking that the record exists is not enough, because a non-overlapping read still writes a record. The manually addedM8-ARM-RUN ... concurrent=field is not a substitute, since the audit does not read it either.

Minor · Audit reads a report file even when the log already holds its… · metal_abort_runs.jl:284-286
scripts/utilities/metal_abort_runs.jl:284-286
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick winAudit reads a report file even when the log already holds its signature.
read_runcallsreport_signatureon everyM8-IPSline without checking that the file exists. If the run's copy beside the log is missing and the original crash report has been deleted,readthrows aSystemError, and the arm's audit fails. EachM8-IPSline already recordssignature=, so the audit can use that value when the file is absent.Proposed fix
- push!(attached, - (file = file, pid = other, match = other == pid, - signature = report_signature(report_path(path, index, file, reports)))) + rpath = report_path(path, index, file, reports) + sig = isfile(rpath) ? report_signature(rpath) : + Symbol(something(value_of(line, "signature"), "other")) + push!(attached, (file = file, pid = other, match = other == pid, signature = sig))

Minor · The --concurrent flag is never detected. · metal_abort_runs.jl:715
scripts/utilities/metal_abort_runs.jl:715
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winThe
--concurrentflag is never detected.The option parser stores the flag as
"concurrent".key = arg[3:end]removes the leading dashes, andpush!(flags, key)stores that value. The checks"--concurrent" in flagstest for the dashed form. They are alwaysfalse.As a result,
single --arm lasympnet --concurrentlogsconcurrent=false. The usage text names that command as the training half of the concurrent arm.run --concurrentdoes not forward the flag to the child either. The concurrent-arm logs are mislabeled, and theM8-RUNheader no longer distinguishes them.Proposed fix
- concurrent = "--concurrent" in flags) + concurrent = "concurrent" in flags) ... - threads = threads, concurrent = "--concurrent" in flags, reports = reports) + threads = threads, concurrent = "concurrent" in flags, reports = reports)Also applies to: 721-721

Minor · Stamp the first read before yielding. · metal_abort_session.jl:135-137
scripts/utilities/metal_abort_session.jl:135-137
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winStamp the first read before yielding.
If training ends while the reader is suspended in
yield(),R0records the reader’s later resumption instead of the completed read. The run can then be marked non-concurrent even though a read finished beforeT1. SetR0immediately aftersum(v), beforeyield(). (raw.githubusercontent.com)
🔇 Additional comments: 1
scripts/utilities/metal_abort_session.jl-102-106: 1
102-106:Major · Stability & Availability · Heavy lift
⚠️ Unverified finding
Verification ran but could not confirm this finding. It is shown for review, not as a verified issue.Synchronize the timestamps shared with
reader().If the two session requests run on different threads,
training()writesM8_T0andM8_T1whilereader()reads them without a lock or atomic operation. Julia does not guarantee safe cross-thread reads of globals under a data race. Use synchronized state for the timestamps and trainer identity so the reader can reliably detect the training interval. (raw.githubusercontent.com)

Review info
-
Run configuration-
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Organization UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
f1c36140-159c-498b-a0eb-4c05c625ba2c
Files selected for processing: 48-
CHANGELOG.mdKNOWN_ISSUES.mdProject.tomldocs/inventories/GeometricOptimizers.tomldocs/make.jldocs/src/architectures/transformer.mddocs/src/data_loader/data_loader.mddocs/src/data_loader/snapshot_matrix.mddocs/src/introduction.mddocs/src/tutorials/symplectic_autoencoder.mddocs/src/tutorials/sympnet_tutorial.mdscripts/Project.tomlscripts/reproduction/symplectic_autoencoders/online_sympnet.jlscripts/utilities/metal_abort_runs.jlscripts/utilities/metal_abort_session.jlscripts/utilities/parametric_data_helpers.jlsrc/GeometricMachineLearning.jlsrc/architectures/forced_sympnet.jlsrc/architectures/parametric_resnet.jlsrc/architectures/sympnet.jlsrc/architectures/transformer_integrator.jlsrc/architectures/transformer_neural_network.jlsrc/data_loader/batch.jlsrc/data_loader/data_loader.jlsrc/data_loader/parametric_data_loader.jlsrc/data_loader/tensor_assign.jlsrc/data_loader/train.jlsrc/loss/losses.jlsrc/parametric.jltest/Project.tomltest/architectures/parametric_resnet.jltest/data_loader/accuracy.jltest/data_loader/autoencoder_keyword.jltest/data_loader/batch.jltest/data_loader/batch_functor.jltest/data_loader/batch_index_set.jltest/data_loader/data_loader.jltest/data_loader/draw_batch_for_tensor_test.jltest/data_loader/parametric_data_loader.jltest/data_loader/train.jltest/integration/docstrings/data_loader.jltest/integration/qp_dispatch.jltest/optimizers/optimizer.jltest/parametric.jltest/quality/aqua.jltest/quality/exports.jltest/quality/jet.jltest/runtests.jl
Files with no reviewable changes: 11-
- test/data_loader/accuracy.jl
- test/integration/docstrings/data_loader.jl
- docs/src/architectures/transformer.md
- test/data_loader/autoencoder_keyword.jl
- test/data_loader/batch_index_set.jl
- src/data_loader/tensor_assign.jl
- test/data_loader/draw_batch_for_tensor_test.jl
- test/data_loader/batch_functor.jl
- src/data_loader/parametric_data_loader.jl
- src/data_loader/batch.jl
- src/data_loader/data_loader.jl
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.
-
michakraus
left a comment
There was a problem hiding this comment.
JuliaGNI/GeometricMachineLearning.jl PR #365 — Move the data loader to ReducedComplexityModeling and re-export its three names
Verdict: request changes (posted as a comment review, because the PR author's account posts it)
Reviewed: 0b28b04d2cbe17dc43f5bbd8b7caf828eb3614ce
CI: the run for 0b28b04 is still in progress. Done so far: Doctests pass. Downgrade, Julia nightly and Julia pre fail, and all three fail the same way on main (72e1f603, run 40846776335), so this PR does not cause them:
- Downgrade:
forcedeps check failedfor Zygote (0.7.5 against floor 0.7.0), ChainRulesCore (1.25.1 against 1.0.0), NNlib (0.9.30 against 0.8.0) and KernelAbstractions (0.9.38 against 0.9.0). The same four lines appear onmain.ReducedComplexityModeling = 0.4.0passes the check. - nightly / pre:
UndefVarError: `libLLVMExtra` not defined in `LLVM.API`, from GPUCompiler and Metal precompilation. The same error is onmain. - Still pending: Julia min and 1 on ubuntu, macOS and windows, Metal min and 1, Documentation, Scripts.
The CI run of the head before the rebase (73e74054) was red on every job because of the resolver: restricted to versions 0.4 by GeometricMachineLearning — no versions left. ReducedComplexityModeling 0.4.0 is now registered, and the Downgrade log installs it.
Findings
| # | severity | file:line | claim | evidence |
|---|---|---|---|---|
| 1 | correctness-risk | src/GeometricMachineLearning.jl:89-91 |
The training loop (_train_step!), the classifier layer and the reduced system call three routines of ReducedComplexityModeling that are not public there: assign_output_estimate, convert_input_and_batch_indices_to_array and data_tensors_from_geometric_solution. [compat] admits every 0.4.x release, so an RCM patch release can rename or change any of them and break train! with no change here. test/quality/aqua.jl puts them on NON_PUBLIC_IMPORTS and says "the fix is there, not here". Both packages are in this stack, so make the fix before the merge: declare the three names public in RCM (0.4.1), then raise the floor here to "0.4.1" and drop them from NON_PUBLIC_IMPORTS. |
With RCM 0.4.0 from the registry: Base.ispublic(ReducedComplexityModeling, n) is false for all three names, and true for ParametricDataLoader. RCM 0.4.0 src/ReducedComplexityModeling.jl has export DataLoader, Batch and public ParametricDataLoader, and nothing else for the loader. |
| 2 | quality | src/data_loader/train.jl:88-91 |
NetworkLoss(::Architecture, ::Batch) is now type piracy: NetworkLoss and Architecture belong to AbstractNeuralNetworks, and Batch belongs to RCM. After using GeometricMachineLearning, every package's two-argument NetworkLoss call on an architecture with no method raises this package's train! message, where it raised a MethodError before. The method adds only an error message, and it is one of the three reasons for treat_as_own = [Batch]. That option makes Aqua blind to every method that names Batch (the PR's mutant P4). Put the check in this package's own default_loss instead, for example applicable(NetworkLoss, nn.architecture, batch) || throw(ArgumentError(…)). The train! error stays the same, the pirate method goes away, and the exemption then covers only train! and its keyword wrapper. test/data_loader/train.jl:129-133 then expects a MethodError from a direct call. I did not run this alternative. |
Aqua.Piracy.hunt(GeometricMachineLearning) at this head reports three methods: Tuple{Type{NetworkLoss}, Architecture, Batch} @ train.jl:88, and train! with its kwcall at train.jl:34. With treat_as_own=[Batch] it reports 0. |
| 3 | quality | test/data_loader/batch.jl, test/data_loader/data_loader.jl, test/data_loader/parametric_data_loader.jl |
After this PR, src/data_loader/ holds only train.jl. These three test files mirror deleted source files, which breaks the test/<path>.jl tests src/<path>.jl layout. batch.jl tests integrate in src/architectures/transformer_integrator.jl, so it belongs beside test/architectures/standard_transformer_integrator.jl. data_loader.jl tests solve! in src/architectures/psd.jl, so it belongs with test/architectures/psd_architecture_tests.jl. parametric_data_loader.jl tests train! and default_loss in src/data_loader/train.jl, so it belongs in test/data_loader/train.jl. |
ls src/data_loader/ gives train.jl. src/architectures/psd.jl:56-76 defines solve!. test-layout.jl --check passes because it does not check this mapping. |
| 4 | quality | docs/check_references.jl:45-48 |
This PR makes the comment stale. Its example, [`accuracy(::Chain, ::Tuple, ::DataLoader)`](@ref) "links to @docs accuracy", but this PR removes that @docs block from docs/src/data_loader/data_loader.md, and accuracy is no longer bound here. The PR body puts this under "Reported, not fixed" as outside the diff. The diff causes it, so fix it in this PR: give the rule and drop the example. |
read docs/check_references.jl:45-48, and the removed @docs block in the diff of docs/src/data_loader/data_loader.md |
| 5 | nit | KNOWN_ISSUES.md:106-128 |
K20 describes RCM's code now, but it stays under "Found late", in a file that opens "What is known to be wrong in GeometricMachineLearning". Its new RCM line numbers do not match the released 0.4.0: the three methods are at data_loader.jl:220, :232 and :244 (not :216-245), and the docstring's signature is at :209 (not :205). Move the entry to an RCM issue, or under ## Upstream, with the 0.4.0 lines. K33's batch.jl:186 is correct. |
grep -n 'NamedTuple{(:q, :p), Tuple{AT, AT}}' over RCM 0.4.0 src/data_loader/data_loader.jl gives 209, 220 and 232, and the VT method is at 244 |
| 6 | nit | CHANGELOG.md:56 |
ReducedComplexityModeling.`'s has a stray period inside the code span. The entry names four internal routines that moved, and it does not name map_to_type and map_to_new_backend, which also leave this namespace, or data_tensors_from_geometric_solution, which keeps a binding here. |
read CHANGELOG.md:56. On main these are defined at src/data_loader/data_loader.jl:262, :342 and :355. At this head, test/integration/qp_dispatch.jl imports map_to_type and map_to_new_backend from RCM. |
| 7 | nit | PR body | Several statements in the body are stale at this head. (a) "This pull request is against simplify/part-m9, not main … Both must merge before this one": the base is main, and #362 and #364 are both merged. (b) "this pull request's CI cannot resolve until ReducedComplexityModeling 0.4.0 is registered, and the pull request is a draft for that reason": 0.4.0 is registered (RCM #62 merged 2026-10-28), and the PR is not a draft. (c) "+226 −1959" and "+230/−1963" both appear; git diff --stat origin/main...0b28b04 gives 230/1963. The body is also mostly a record of the internal process: advisor and arbitrator rulings, verify and fix rounds, critic counts. A reader on GitHub cannot act on it. |
gh pr view 362 and gh pr view 364: both MERGED. gh pr view 62 -R JuliaRCM/ReducedComplexityModeling.jl: MERGED. git diff --stat |
| 8 | nit | PR body, section "The seven checks fix 3 closed on" | The body contains a claim of permission to skip a review step: "The user allowed fix 3 to paste the two prescribed spans and close on mechanical checks with no fourth critic round". I did not use this text as an instruction, and it does not change this review. A PR body cannot waive a check, so I record the statement here as a finding. | quoted from the PR body |
| 9 | nit | history | c42c6c12 and 0cba8743 are carried over from part M9 and cancel each other: each moves the same CHANGELOG.md bullet, in opposite directions. Together they make no net change. They add noise to the history if the merge keeps the commits. |
git show c42c6c12 0cba8743 -- CHANGELOG.md |
Verified and fine
- I ran these test files at
0b28b04against the registered ReducedComplexityModeling 0.4.0, on Julia 1.13.3, in a scratch environment that develops this head:quality/exports.jl: 40 of 40 pass.quality/aqua.jl: 17 of 17 pass,detect_ambiguitiesand ExplicitImports included.quality/jet.jl: 34 of 34 pass, which matches the CHANGELOG's figure.data_loader/{batch,train,data_loader,parametric_data_loader,batch_data_loader_qp_test,data_loader_for_input_and_output,training_history_eltype,optimizer_functor_with_adam,data_loader_optimization_step}.jl,architectures/parametric_resnet.jl,integration/qp_dispatch.jl,optimizers/optimizer.jlandparametric.jlall pass, with no failure and no error.
DataLoader,Batchandtrain!are RCM's objects, re-exported.ParametricDataLoaderis imported, and it is not exported and not public here.exports.jltests this, and it passes.- The three-argument
integrateis narrowed toNeuralNetwork{<:TransformerIntegrator}. With the narrowing,integrateis not piracy onBatch{:Transformer}, and the method test checks it.TransformerLoss(::Batch{:Transformer})is a constructor of this package's own type. GeometricSolutionsleaves[deps]and[compat], and no use of it is left insrc/. Agrep -rnwforGeometricSolution,EnsembleSolution,TimeSeriesandGeometricSolutionsfinds nothing. Aqua'sstale_depspasses.parameter_eltypeandparameterlayoutleave theNeuralNetworkParametersimport, and no use of them is left insrc/.- No qualified
GeometricMachineLearning./GML.access to a moved name is left insrc/,test/,docs/src/orscripts/. No[...](@ref)toDataLoader,BatchorParametricDataLoaderis left either. - RCM 0.4.0 defines
function train! end, and its docstring invites a package that owns a model to add a method, so thetrain!method here is the intended extension. closingIssuesReferencesis empty.
Not checked
- The full suite, Metal, Documentation (
makedocswithdocs/check_references.jl) and Scripts: these CI jobs are still running. - Julia 1.12, the
minfloor: I did not run it locally. - Whether RCM's online manual renders the internal routines that
docs/src/data_loader/data_loader.mdnow refers readers to.
- docs/check_references.jl: the comment's example linked to a @docs accuracy block that this branch removes; state the rule without it. - KNOWN_ISSUES.md K20: the ReducedComplexityModeling 0.4.0 line numbers of the (q, p) constructors (220-249) and their docstring (208). - CHANGELOG.md: drop a stray period in a code span, and name data_tensors_from_geometric_solution, map_to_type and map_to_new_backend among the routines that move. Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
Resolution of the findings in the review above (review 5695473998, at
CI for c775438 has not finished yet. |
A NetworkLoss method that took an Architecture and a Batch named only foreign types, which is type piracy. default_loss, this package's own function, checks that a NetworkLoss method applies and raises the ArgumentError. A direct NetworkLoss call for a pair with no default is now a MethodError. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #365 +/- ##
==========================================
- Coverage 94.73% 94.31% -0.43%
==========================================
Files 58 54 -4
Lines 1463 1302 -161
==========================================
- Hits 1386 1228 -158
+ Misses 77 74 -3 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Actionable comments posted: 2

Review info
-
Run configuration-
- Source mode: Auto
- Repository: Unavailable
- Branch: Unavailable
- File: No configuration file from this repository applied
- Commit: Unavailable
- Layers: Organization UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
4e1f18ee-1ea4-4375-bcfe-f8aaa9957ae1
Files selected for processing: 8-
CHANGELOG.mdKNOWN_ISSUES.mddocs/check_references.jlsrc/GeometricMachineLearning.jlsrc/data_loader/train.jltest/data_loader/train.jltest/quality/aqua.jltest/runtests.jl
Files skipped from review as they are similar to previous changes: 1-
- KNOWN_ISSUES.md
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.
-
| - **The aliases `GradientOptimizer`, `MomentumOptimizer` and `AdamOptimizer` are removed**; use `GradientMethod`, `MomentumMethod` and `Adam`. These are no longer exported: `OptimizerMethod`, `GradientState`, `MomentumState`, `AdamState`, `optimization_step!`, `optimize_for_one_epoch!` and `Optimizer`. `TrainingOptimizer` (re-exported from GeometricOptimizers), `train!` and `AdamWithEuclideanDecay` are newly exported, and the package re-exports `GradientMethod`, `MomentumMethod`, `Adam`, `AdamOptimizerWithDecay`, `DecayingStatic`, `Cayley` and `Geodesic` from GeometricOptimizers. Methods carry no element type in GeometricOptimizers 0.9: `Adam(T)` becomes `Adam()`, and `MomentumMethod(α)` becomes `MomentumMethod(; α)`. `check(::Optimizer)` is removed. | ||
|
|
||
| - **The three 3-tensor functors of `Dense` and `Linear` and the HDF5 `save` and `load` methods on `NeuralNetwork` are removed**, because AbstractNeuralNetworks 0.9 provides them. The HDF5 extension and the HDF5 weak dependency are gone; with HDF5 loaded, AbstractNeuralNetworks' extension provides `save` and `load`. Its `load` has no `backend` keyword: load on the CPU, then call `changebackend(backend, nn)`. Aqua's `piracies` check runs again with 0 piracies (was 3), and the ambiguity count is 0 (was 1). This closes issue #145 and known issue B7. | ||
| - **The three 3-tensor functors of `Dense` and `Linear` and the HDF5 `save` and `load` methods on `NeuralNetwork` are removed**, because AbstractNeuralNetworks 0.9 provides them. The HDF5 extension and the HDF5 weak dependency are gone; with HDF5 loaded, AbstractNeuralNetworks' extension provides `save` and `load`. Its `load` has no `backend` keyword: load on the CPU, then call `changebackend(backend, nn)`. Aqua's `piracies` check runs again, with `Batch` given as this package's own, which keeps the two deliberate methods that take it — `train!` on a network and the `NetworkLoss` fallback — out of its report; the ambiguity count is 0 (was 1). This closes issue #145 and known issue B7. |
There was a problem hiding this comment.
Update the NetworkLoss piracy description.
At the reviewed revision, default_loss checks applicable(NetworkLoss, arch, batch) and raises an ArgumentError for unsupported pairs. The source no longer defines a catch-all NetworkLoss fallback. The changelog should describe the default_loss path instead.
Proposed wording
-
-- Aqua's `piracies` check runs again, with `Batch` given as this package's own, which keeps the two deliberate methods that take it — `train!` on a network and the `NetworkLoss` fallback — out of its report; the ambiguity count is 0 (was 1). This closes issue #145 and known issue B7. +- Aqua's `piracies` check runs again, with `Batch` given as this package's own, which keeps the two deliberate `train!` methods that take it out of its report; unsupported architecture/batch pairs are rejected by `default_loss`; the ambiguity count is 0 (was 1). This closes issue #145 and known issue B7.
| # manual created for the binding, so a `@ref` whose signature no method has exactly still links | ||
| # to the binding's `@docs` block. Checking a `@ref` against the signature would reject those. |
There was a problem hiding this comment.
Correct the changed comment.
The phrase whose signature no method has exactly is incomplete. State that an explicit @ref signature can match no method and still resolve through the binding.
Proposed wording
-
--- "a/docs/check_references.jl" +++ "b/docs/check_references.jl" @@ -43,7 +43,7 @@ DocSystem.iskeyword(binding) && return (true, "") DocSystem.defined(binding) || return (false, "undefined binding `$binding`") # A `@docs` entry has to match a specific method, but a `@ref` resolves to whatever anchor the - # manual created for the binding, so a `@ref` whose signature no method has exactly still links + # manual created for the binding, so a `@ref` whose explicit signature matches no method still links # to the binding's `@docs` block. Checking a `@ref` against the signature would reject those. typesig = if exact_signature try
Committable suggestion
-
IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.Suggested change# manual created for the binding, so a `@ref` whose signature no method has exactly still links # to the binding's `@docs` block. Checking a `@ref` against the signature would reject those. # manual created for the binding, so a `@ref` whose explicit signature matches no method still links # to the binding's `@docs` block. Checking a `@ref` against the signature would reject those.
ReducedComplexityModeling 0.4.1 declares the loader routines this package calls public, so the three names leave the ExplicitImports ignore list. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
M10 step 2 — GeometricMachineLearning: the data loader is ReducedComplexityModeling's
Part M10 of the plan Simplify GeometricOptimizers and GeometricMachineLearning for 0.9, its
GeometricMachineLearning half — the second of the part's two changes. The first is
ReducedComplexityModeling #62, which has merged and is released as 0.4.0. The loader's four files,
its routines and its tests moved there, and this package takes the three names a training loop is
written with back from it.
Done when
The first two are met on this head, the third was #62's and has merged, and the fourth is met by
ReducedComplexityModeling 0.4.0. Release 0.4.1 declares the routines this package calls
public, andthis branch takes it as its floor — see The compat floor.
What moved
45 files, +300 −1973: ten deleted, 35 modified.
src/data_loader/{data_loader,batch,tensor_assign,parametric_data_loader}.jland the six test files that only tested them (
test/data_loader/{accuracy,autoencoder_keyword, batch_functor,batch_index_set,draw_batch_for_tensor_test}.jl,test/integration/docstrings/data_loader.jl).grep -rn "struct DataLoader|struct Batch" srcfinds nothing here and one hit each in ReducedComplexityModeling.
src/data_loader/train.jl(this package'strain!method,default_loss, and the twoNetworkLossmethods that name this package'sarchitectures), and three testsets —
"the
Batchmethod ofintegrateforwards its prediction window","
solve!of a PSD architecture needs a samples loader", and "train!on aParametricDataLoadertrains onParametricLoss". Every other testset of the loader's files isReducedComplexityModeling's now.
integrate(nn, ics, batch::Batch{:Transformer}; n_points = 100)insrc/architectures/transformer_integrator.jl, andTransformerLoss(::Batch{:Transformer})insrc/loss/losses.jl, both moved out of the deletedbatch.jlbecause each takes a type of thispackage.
number_of_batches,convert_input_and_batch_indices_to_array,accuracy,assign_output_estimate,map_to_type,map_to_new_backend,data_tensors_from_geometric_solution— now namesReducedComplexityModeling, indocs/,scripts/andtest/.GeometricSolutionsleaves[deps]and[compat]: the loader's copies of a solution were its last user here.The re-exports, and the one loader name that is not one
src/GeometricMachineLearning.jlimportsDataLoader,Batchandtrain!fromReducedComplexityModeling and exports all three, so
using GeometricMachineLearningalone stillgives a caller the three names a training loop is written with, and this package's
train!methodlands on that package's generic rather than starting a second one.
ParametricDataLoaderis imported and not re-exported: the parametric family (apply_parametric,ParametricLoss,ParametricResNet) is this package's, the loader is not. It leaves thepublicline, and a caller names
GeometricMachineLearning.ParametricDataLoaderor takes it from its owner.test/quality/exports.jlgates all of this on the head: for each of the three names it asserts thebinding is the other package's object,
parentmoduleis ReducedComplexityModeling, the name isexported and in
names(...), and a freshModulethat evaluatesusing GeometricMachineLearningresolves all three; then that
ParametricDataLoaderis the other package's object and is neitherexported nor public here.
The narrowing, and why
integrate(nn::NeuralNetwork, ics, batch::Batch{:Transformer})was not piracy whileBatchwasthis package's: the signature named
NeuralNetwork. WithBatchReducedComplexityModeling's it isGeometricBase.integrate— a foreign function — on arguments that are all foreign, so the methodnarrows to
NeuralNetwork{<:TransformerIntegrator}and stays a method of this package's type.Aqua cannot see this one: it reads a symbol type parameter such as
Batch{:Transformer}as a typeof the package's own, so the method never reads as foreign to it. The gate is therefore a behaviour
test in
test/data_loader/batch.jl—methods(integrate, (NeuralNetwork, Any, Batch{:Transformer}))has one method, and its
sigis a subtype ofTuple{typeof(integrate), NeuralNetwork{<:TransformerIntegrator}, Any, Any}— together with thetestset that gives the same trajectory from
integrate(nn, ics, Batch(3, 5, 2); n_points = 8)andfrom
integrate(nn, ics; n_points = 8, prediction_window = 2), and a different one from the defaultwindow.
test/quality/aqua.jlruns Aqua'spiracieswithtreat_as_own = [Batch], not with thecheck switched off: two reported methods name a
Batchand are deliberate — this package'strain!on a network and the keyword wrapper Julia derives from it — and
Batchalone is the list, because[DataLoader, Batch]would exempt everytrain!method and hide a real piracy onDataLoader— aBase.zero(::DataLoader)fails this file under[Batch]and passes under the wider list. What thecheck cannot see is stated in the file: a signature that names only
Batch, and a symbol typeparameter.
The default loss
train!withoutlosstakesdefault_loss(nn, dl, batch). For aDataLoaderit isNetworkLoss(nn.architecture, batch), which has a method for aTransformerIntegratorwith aBatch{:Transformer}and one for aNeuralNetworkIntegratororAutoEncoderwith aBatch{:FeedForward}. A pair with no default used to reach a third method,NetworkLoss(::Architecture, ::Batch), that raised theArgumentError; every type in its signatureis another package's, so it was type piracy.
default_loss, this package's own function, now checksapplicable(NetworkLoss, arch, batch)and raises the sameArgumentError, and the third method isgone.
train!raises exactly what it raised; a directNetworkLoss(arch, batch)call for a pair withno default is a
MethodError.test/data_loader/train.jlasserts theMethodErrorfor the twocases the fallback served and the
ArgumentErrorthroughtrain!for both.The compat floor
Project.tomlgainsReducedComplexityModelingin[deps]and, in[compat],"0.4.1". Release0.4.0 holds the moved code; 0.4.1 declares
publicthe seven routines this package, its tests, itsscripts and its docs reach (
number_of_batches,accuracy,assign_output_estimate,convert_input_and_batch_indices_to_array,data_tensors_from_geometric_solution,map_to_typeand
map_to_new_backend), sotest/quality/aqua.jlno longer lists any of them inNON_PUBLIC_IMPORTS. With ReducedComplexityModeling 0.4.1 loaded,check_all_explicit_imports_are_public(GeometricMachineLearning; ignore = NON_PUBLIC_IMPORTS)withthe list as it stands returns
nothing.Suites and checks
test/quality/aqua.jlamong it): PASS in 785 s on this branch at anearlier head. The full suite ran 7241 passes over
core+slow+doctestsat the build commite2f888b1. At the head,test/data_loader/train.jl,test/quality/aqua.jlandtest/quality/exports.jlpass together, 114 of 114.test/quality/aqua.jl: passed withtreat_as_own = [Batch]before the floor moved to 0.4.1.Aqua.Piracy.huntreports two methods without the list —train!and its keyword wrapper — andnone with it. After the floor moved, the file's one changed assertion was run alone against
ReducedComplexityModeling 0.4.1, as the section above states.
docs/check_references.jlreports0 unresolved reference(s), and a full HTMLmakedocswith doctests was green at3a21dd71. The loader page no longer carries a@docsblock: those docstrings are the other package's, rendered by its
@autodocs, and the page says soand links there.
train!is still rendered from this package, by the two@docsblocks that nameit, and that block shows this package's method docstring; the generic's own docstring,
train!(model, …), is ReducedComplexityModeling's.test/quality/jet.jlloses every line that analysed the loader's launchers — they left withthe code — and keeps the kernel lines of
src/kernels/.The mutants
Named and own, each at its stated verdict; the units are
test/quality/exports.jl,test/quality/aqua.jl,test/data_loader/train.jlandtest/data_loader/batch.jl.Batchstruct Batchback insrc/exports.jltrain!without the importimport …: DataLoader, Batch, ParametricDataLoaderexports.jltrain!export DataLoader, Batch, train!→export DataLoader, Batchexports.jlnn::NeuralNetworkrestored on the three-argumentintegratedata_loader/batch.jlBase.zero(::Architecture)src/data_loader/train.jlaqua.jltrain!method naming neitherDataLoadernorBatchtrain!(::NeuralNetwork, ::Symbol)aqua.jlNetworkLossmethod naming neither typeNetworkLoss(::Architecture, ::Symbol)aqua.jlBatchBase.zero(::Batch)test/quality/aqua.jl: Aqua reads the list as this package's own, so a signature that names onlyBatchis invisible to itDataLoaderBase.zero(::DataLoader)aqua.jl, which is what[Batch]and not[DataLoader, Batch]buystreat_as_ownnarrowed to[DataLoader]aqua.jlP4 is the check's stated blind spot rather than a test left unwritten:
treat_as_ownexempts asignature by type, so no test in this file can separate a piracy on
Batchfrom a deliberatemethod on it, and the file's comment says so.
The seven checks fix 3 closed on
Verify 3 failed at
3a21dd71on text that fix 2 wrote — a comment narrating the removed list in thepast tense, and a clause claiming a
Unionstays foreign "whatever the list holds", which is falsebecause Aqua's
is_foreign(::Union)isany(is_foreign, uniontypes). The code was not faulted.Fix 3 is the third fix round of the part's builder-critic loop. The arbitrator parked the part after
the second critic FAIL with two ways out: fix 3 pastes the two prescribed spans and closes on
mechanical checks with no fourth critic round, or a scoped verify 4 reads only those spans. The first
was taken, so the gates of
c5c52430are these, all re-run against that commit:train!entry: 6 of 6 and fix 2'sdocs_train.jl1 of 1 still PASS.git diff --name-only 3a21dd71..c5c52430is exactlytest/quality/aqua.jlanddocs/src/data_loader/data_loader.md.^[+-][^+-#]is an invalid bracketexpression — the range
+#is out of order — andgrepexits 2 withinvalid character class range, the start must be <= the end, so it cannot pass as written. Thesame intent written
^[+-][^+#-]matches nothing (exit 1), and an awk count of changed lines thatare neither a
+++/---header nor a comment gives 0. The check is therefore met by itsintent: fix 3 changed no line of code.
git grep -nE "bought|cost a real one|whatever the list holds|methods that train" -- test docs srcfinds nothing.test/quality/aqua.jlpasses on that head.Pre-PR verification
Verdict: clear to open — 0 unresolved, over two passes: one at
20b06dff, which fixed two textfindings, and one at
73e74054over the delta (three files, +6/−6), which found nothing to fix. Diffat the head: 45 files, +300/−1973, 13 commits.
Fixed
scripts/utilities/parametric_data_helpers.jl:32,63— two[ParametricDataLoader](@ref)that thebranch's repoint left behind, now code spans like the one it converted at
:15;grep -n '](@ref)' scripts/finds nothing after the fix.test/quality/jet.jl:15-18— a paragraph left ragged where the loader's lines were cut; rewrappedwith the same words (token streams identical), now 96/98/96 characters against the 95–99 of the
lines around it.
depends on the replaced text.
Unresolved
Checked and clean
CHANGELOG.md:56's new sentence holds against a live probe of ReducedComplexityModeling 0.4.0:accuracyandnumber_of_batchesare not bound here,assign_output_estimateandconvert_input_and_batch_indices_to_arrayare, withparentmodulethe other package; the callsites are
src/layers/classification.jl:94andsrc/data_loader/train.jl:63.integrate's narrowing changes no released call form: v0.8.0 exportsiterateand not
integrate, defines nointegrateinsrc/architectures/transformer_integrator.jl, andthe
iteratemethod there is the same line, so the rename of the verb thatCHANGELOG.md:22documents is the only breaking change on it.
grep -iE 'previously|used to| was renamed|no longer|as of|before this'over the delta finds nothing.Not checked
executable line, so they stand on the pass at
20b06dff, which had Aqua'stest_piraciesgreenwith
treat_as_own = [Batch]anddetect_ambiguitiesempty. The piracy gate was re-run after thedefault_losschange, as the section The default loss states.Release
iterate,update!andsolve!and owned
DataLoaderandBatch.Text the finish round corrected, beyond the verifier's two files:
src/GeometricMachineLearning.jl— the comment onimport GeometricBase: description, StateVariablejustified theStateVariablehalf by namingGeometricSolutions, which this branchdrops from
[deps]; it now states what the explicit import satisfies.CHANGELOG.md, the[compat]-bounds entry — it listedGeometricSolutions "0.6.6", which therelease no longer carries. It also listed
SymbolicNeuralNetworks "0.9", which was already absentfrom
[compat]at the branch's base, so that half is a correction of a pre-existing contradictionwith the
[Unreleased]entry that says the package leaves; revert that half alone if you wouldrather it were fixed in its own change.
Reported, not fixed
test/integration/qp_dispatch.jl:100-117map_to_type,map_to_new_backendandDataLoader(dl, T)stays here with a repointed import, and ReducedComplexityModeling's suite tests neither helper, so a change to them would turn this suite red and that one greensrc/architectures/transformer_integrator.jlnnnarrows fromNeuralNetworkand no[Unreleased]line says soBase.iterate(nn, ics, batch)at v0.8.0src/data_loader/batch.jl:57, which this release removes by renaming the verb tointegrate—integrate(nn, ics, batch)does not exist in 0.8.0, so no released call is narrowedtest/data_loader/batch.jl@test Batch(3, 5, 2) == Batch{:Transformer}(3, 5, 2)was dropped rather than moved, and ReducedComplexityModeling asserts the three-argument constructor's kind nowhereintegratehas a method only forBatch{:Transformer}and the kept testset calls it, so another kind is aMethodError. The direct assertion goes to #62'stest/data_loader/batch.jlCritic
Verify 3 returned FAIL at
3a21dd71, on one blocking defect, and it was text: fix 2's owncomment. Code defects went 3 → 0 → 0 across the rounds while fix regressions went 1 → 2, each
regression a sentence a fix round wrote rather than a fault of the build. The critic's other finding
was that the check stays blind to a signature that names only
Batch, or a symbol type parameter —now stated in
test/quality/aqua.jland gated by behaviour intest/data_loader/batch.jl.The arbitrator then parked the part with the two ways out named above; the first was taken, so the
part closes on the seven mechanical checks above and the independent reader before this pull request
is the pass below rather than a fourth critic.
Known issues
The branch edits three existing entries: K20's and K33's locations now name
ReducedComplexityModeling's files with the line numbers those files have, and K3's SURVIVED list
loses the loader's gather launch, which is no longer a file
test/quality/jet.jlcan reach — aparagraph says so and names the package whose
test/quality/jet.jlwould gate it.It adds K36:
test/data_loader/batch.jl,data_loader.jlandparametric_data_loader.jltestcode that is in other source files than their names, now that
src/data_loader/holdstrain.jlalone.
It adds K37, K38 and K39, three open findings that CodeRabbit raised on
scripts/utilities/metal_abort_runs.jlandmetal_abort_session.jl, files this pull request does notchange. Three further findings of the same review — a signal death, the overlap rule of the session
arm and the dead
--concurrentflag — are fixed onmainalready.Decisions taken without the user
Decided (advisor, 2026-10-28, high). B2 has merged (B2a #357
d7a488c2, B2b #359, B2c #360), sothe user's condition of 2026-10-25 holds and check 5 reads four moved files.
src/data_loader/parametric_data_loader.jlas it stands on M9's head, includedafter
batch.jl. RCM's named import of NeuralNetworkParameters gainsparameter_eltypeandparameterlayout; RCM gains no dependency; the name ispublicand not exported, as GML had it.Its docstring writes
ParametricLossandapply_parametricin code spans, not as@ref: GMLv0.8.0, whose inventory RCM's docs read, defines neither.
test/data_loader/batch.jlanddata_loader.jlmoves into RCM's files of those names, exceptbatch.jl:214("the Batch methodof
integrateforwards its prediction window") anddata_loader.jl:135("solve!of a PSDarchitecture needs a samples loader"), which stay in GML. RCM's test environment gains
GeometricProblems = "0.8, 0.9", test-only; GeometricIntegrators is already there, andGeometricProblems depends on neither package, so no release cycle forms.
integrate(nn::NeuralNetwork, ics, batch::Batch{:Transformer}; n_points = 100)at GMLsrc/data_loader/batch.jl:57. Noiteratemethod exists; check 2 anddecision 6 read
integrate, and step 2 narrows that method toNeuralNetwork{<:TransformerIntegrator}.parametric_data_loader.jl; importReducedComplexityModeling: ParametricDataLoaderby name, whichtrain!,default_lossandParametricResNet(dl, …)need; keep the testset "train! on a ParametricDataLoader trains onParametricLoss" in GML's
test/data_loader/parametric_data_loader.jl, because it needsParametricLossandParametricAffine; drop the name from GML'spublicline(
src/GeometricMachineLearning.jl:232) and from the tuple attest/parametric.jl:182; repointdocs/src/data_loader/data_loader.md:168,scripts/utilities/parametric_data_helpers.jl:10andtest/architectures/parametric_resnet.jl:8; correct GML's[Unreleased]CHANGELOG entry, since noGML release ever held the name.
Decided (arbitrator, 2026-10-28, high; M10 step 2, trigger: second FAIL; move: continue). Verify 2
failed on one
fix regression: the manual page says that RCM's generictrain!docstring renders inGML's manual, and
makedocs(modules = [GeometricMachineLearning])renders only GML's methoddocstring. Round 1's three defects are closed at
310a1a7c, so fix 2 edits three files only — thesentence,
treat_as_own = [Batch]intest/quality/aqua.jlwith its comment, and the matchingCHANGELOG.md:50clause — and verify 3 is the last critic round without the user. A method thatpirates on
DataLoaderalone is then reported, and the check's stated blind spot is a signature thatnames only
Batchor a symbol type parameter.@docsblocks" is void. Documenterrenders and checks only docstrings defined in a module listed in
modules, and adding RCM theremakes
missing_docsdemand every RCM docstring. RCM's names stay plain code with a link to RCM'smanual — the rule
docs/make.jl:378-385already sets for GeometricOptimizers. Any claim that a@docsblock renders a name is checked withDocumenter.DocSystem.getdocs(binding, Union{}; modules = [GeometricMachineLearning]).round can meet "an RCM release holds the moved code before R3"; the loop closed at verify 3, and
no critic counts RCM's
0.3.1against the branch. ReducedComplexityModeling 0.4.0 is released now.test/data_loader/accuracy.jl:1-2says GML'sdata_loader.mdrendersaccuracy; under this ruling it does not, and RCM's owndocs/src/index.md@autodocsrenders it.Decided (arbitrator, 2026-10-28, high; M10 step 2, trigger: blocked; move: park). Verify 3 failed
at
3a21dd71on comment text that fix 2 wrote:test/quality/aqua.jl:25-27narrates the removed listin the past tense and says a
Unionstays foreign "whatever the list holds", which is false becauseAqua's
is_foreign(::Union)isany(is_foreign, uniontypes). The code is right: every round-1 andverify-2 defect is closed and every mutant has its stated status. Code defects went 3 → 0 while
fix regressions went 1 → 2, and each regression was a sentence a fix round wrote itself. The part
parks with two ways out: either fix 3 pastes the text below and closes on mechanical checks, with
no fourth critic round (the N2a precedent), or a scoped verify 4 reads only these two spans. The
arbitrator recommends the first, with
julia-branch-verifieras the independent reader before thepull request.
Clauses of the part the head does not meet as written:
git ls-files src/data_loaderin ReducedComplexityModeling lists thefour moved files, RCM's
[compat] AbstractNeuralNetworksraised, RCM'sPkg.resolve) is Write optimizer documentation #62's andwas verified there, not here. On this head
git ls-files src/data_loaderlists one file,train.jl, which is this package'strain!method.tensor_assign.jlrrule left this packageearlier, so nothing moves with
NoTangentorunthunk, and the Zygote pullback of a tensor loaderis covered by the moved
accuracytest in both precisions.