v0.23.2
ALMa v0.23.2
Patch release: two Health buttons that could never do what they promised. The "Rebuild map layouts" operation added in 0.23.1 shipped unable to run when a human clicked it, and "Paper group integrity" sat at a permanent warning above a repair with nothing to repair.
Fixed¶
-
"Rebuild map layouts" did nothing when you clicked it, and said nothing either. Both runs on a live instance finished
completedin under 0.3 seconds with every map view still stale and not one line in Activity. The pass consulted the background admission gate, and both of its policies require the app to be idle — but clicking the button is itself a user request, which is exactly what makes the app non-idle. A human-triggered run could never pass its own gate. It returned before the "running" status write, so nothing reached Activity, and the job harness then stamped the jobcompleted. The trigger source now travels with the run: a click skips the background idle gate (the concurrency guards that exist for real reasons still apply), and a click that finds everything already fresh gets an Activity line saying so, rather than being indistinguishable from a broken button. -
The layout pass deferred to a job it had started itself. It enqueues the super-region substrate build, then a few lines later asks "is a layout being fitted right now?", sees that very job, and stops before the first view — "placed 720, rebuilt 0 view(s)". The in-flight check now takes several keys instead of one, so a caller can exclude both its own operation and the work it just spawned.
-
"Paper group integrity" warned about 84 defects no repair could clear. The card read
warningwhile the repair underneath read0 pending, so its Run button could never move the number. The dimension counted every defect; the operation counted only the subset it can actually fix, and the card showed a full card if either was non-zero. Severity now ranks on the fixable remainder and reports the terminal slice separately — the same "N missing · M no fix" rule the metadata gaps already used. Every defect is still counted and still listed; only the colour changes.
The 84 in question are standalone datasets and software releases (Zenodo, NEMAR/OpenNeuro) plus book chapters whose parent volume isn't in the corpus. A component with no parent to attach to is a terminal state, not pending work.
- Two paper-group defects were unfixable by any code path.
- A row that is its own canonical/parent was skipped by the merge primitive rather than repaired, so one self-pointer permanently pinned three defect kinds. It is now cleared.
-
The "which orphans can we link?" counter used a narrower rule than the detector that raises the defect, so a component typed by work type alone was flagged as broken but excluded from the fixable count — reported terminal while the repair could in fact link it. Both sides now share one predicate.
-
Crossref hydration created paper-group defects on every sweep. It was the one ingestion path that wrote component/parent pointers without settling the group afterwards, so a paper it newly classified as a component kept its vectors, clusters, feed rows and preference rows — regenerating defects between every reconcile run. Feed, the importer, the OpenAlex upsert and Library all settled already; this one now does too.
-
The Map page's Rebuild button reported success for a no-op. A response of "a rebuild is already running" fell through to the "Layout rebuilt" toast, and the mutation had no error handler at all, so any failure was completely invisible. Both now say what actually happened.