Repository navigation
Fix cross-brick test findings F1, F8, F9, F10, F11 - #139
Conversation
The masks command refused per-plane Cells with a stated shared 2-D Nuclei mask (mask_planes_differ) although the run accepts the set. Leave shared masks out of the plane comparison, as masks.checks does; read_mask already gives the shared plane for every plane. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Design v0.4 §3: --axes is only needed for plain stacks. When every readable image names all its axes and the suggested mapping gives each a role, the first run uses the headers' roles; a plain stack still needs --axes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
A no-op rerun rewrote run_manifest.json with only written_at changed, so its SHA-256 (pinned by CellPatcher and MorphoFeature) changed. Keep the earlier written_at when the manifest is otherwise identical; any real change still writes the new time. The report still records the rerun. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
The lock refusal now says a lock left by a process that is no longer running on this computer looks stale, and how to remove it (never automatically). A resumed run no longer says all rows were computed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…keeps the order (F8) convert takes --output, the output folder of the runs on the originals; the printed next commands name it, so they work. Without it the default folder is named with what to do if the runs used another one. Images arranged differently are told that named-axis copies keep each image's stored order (plan question 73). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Contract §9, §15, §17, the user guide, the migration guide, the changelog and AGENTS.md; plan §12 question 73 records the decisions and the open F8 follow-ups (reordering copies, a stated page reshape). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Move the arrangement message to size_checks and the F10 test to test_resume; lower the baseline where the change shrank functions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…review of #139) convert's output_locked still said another conversion was writing when the holder was a process on this computer that is no longer running. It now uses the run's wording through the shared lock.looks_stale; the lock is never removed without --remove-stale-lock. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
… --axes None (F9, review of #139) The run's --axes help still said it was needed for the first run. Without --axes, images that no mapping describes (a plain stack among named images) printed the example '--axes None'; the preflight's issues are printed instead, as with --axes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
|
Independent review, merged as e24f334 (merge commit; the branch was restored on the PR head 9c1d018). Verified adversarially
Review findings, fixed
Gate (Python 3.12, §9 figures: no file over its baseline ( Left for the owner (already recorded in question 73): reordering copies into the common order (F8a), and a stated reshape for pages-only stacks (F8c). One minor point outside this PR: the printed next commands do not quote paths that contain spaces. Generated by Claude Code |
Q66 confirmed by the owner (3 November 2026); Q73's follow-up decided: neither a stated reshape nor a reorder in v0.4, kept in issue #144; Q74 records the tie-break and the consumers checked. The changelog gains a section for rc5 (PRs #139, #140, #142, #143) with migration notes: mounts refused, position_id required in v2, micrometre conversion within 1 ULP, --verify-content, and the tie-break. The migration guide gets the same. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Fixes for findings F1, F8, F9, F10 and F11 of the cross-brick test of 3 November 2026 (MorphoFeature
docs/restart/cross-brick-test-2026-11-03.md). The owner decided on 2026-11-03 to fix them before the round-2 audit. The version stays 0.4.0rc4. The decisions are recorded in plan §12 question 73.Summary
mask_scan(F1):scan_masksnow skips stated shared 2-D masks when it compares the planes of an image's masks, the same waymasks.checksdoes.read_maskalready returns the shared plane for every plane, so each relationship is still counted per plane and never across planes. Before this,masksrefused a set thatrunaccepts (per-plane Cells plus--mask-axes Nuclei=YX) withmask_planes_differ.cli_run(F9):runno longer needs--axeswhen every readable image names all its axes (header_axes) and the suggested mapping gives each axis a role. It prints "Axis roles (as every image names them)", and the axis check still runs. Plain stacks still need--axes, andconvertstill requires it. When no mapping can describe the images,runwithout--axesprints the preflight's issues instead of the example--axes None(review).run.pipeline(F10): if a rerun's manifest would differ only inwritten_at, the earlier time is kept.run_manifest.jsonthen stays byte-identical, so pinned SHA-256s (CellPatcher, MorphoFeature) stay valid. Any real change still writes the new time, and the report records every rerun.run.lock,conversion_issues,report,notebook_run(F11):run.lock.looks_stale), theoutput_lockedmessage says the lock looks stale and how to remove it (--remove-stale-lock, the notebook button,remove_stale_lock). The lock is never removed automatically.convert's copy-tree lock uses the same wording (review, coordinator decision 3).cli_convert,size_checks,metadata,axis_review(F8):convert --output FOLDER(the output folder of the runs on the originals). The printed next commands name it, so they work. The recorded masks folder is also looked up there. Without--output, the default folder is named along with what to do if the runs used another one.inconsistent_dimensionsandinconsistent_mappingnow say that named-axis copies keep each image's stored order, soconvertdoes not fix the problem.--axesis needed only for plain stacks that are new or changed") and plan question 73.Decisions
runuses the headers' roles when every image names them, and prints them.Notes for review
RunManifest.to_dict(). A changed package version, or a manifest of an older schema, counts as a change.metadata.py747, unchanged; largest other changed filemask_scan.py578). Baseline: 38 entries, unchanged;review_axes67→66 and_check_dimensions30→29;noqacounts unchanged (ANN 51, PLR0913 3, C901 0, PLR0915 0).tools/check.py --rulesis clean.Tests
test_the_masks_command_scans_a_shared_2d_mask_with_per_plane_masks(F1),test_images_that_name_their_axes_need_no_axes_option(F9),test_a_rerun_that_changes_nothing_keeps_the_manifest_bytes(F10),test_the_summary_names_the_resumed_images(extended) andtest_a_lock_left_by_a_killed_run_is_called_stale_and_kept(F11),test_the_printed_next_command_uses_the_output_folder_given_and_worksandtest_images_arranged_differently_are_told_that_convert_keeps_the_order(F8).test_the_convert_command_removes_a_stale_lock_only_on_request(extended: stale wording, lock kept),test_a_conversion_whose_folder_a_running_process_locks_is_not_called_stale,test_a_plain_stack_among_named_images_still_needs_axes..[dev,notebook,zarr]: ruff check and format clean,tools/check.py --rulesclean, pytest 2064 passed, 4 skipped (expected on a Linux root container: case-sensitive file system ×3, permissions that ignore file modes ×1).🤖 Generated with Claude Code
https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc