Skip to content

Release v0.5.2 - #290

Merged
guijacquemet merged 8 commits into
mainfrom
claude/release-0.5.2
Nov 12, 2026
Merged

guijacquemet merged 8 commits into
mainfrom
claude/release-0.5.2

Conversation

@guijacquemet

@guijacquemet guijacquemet commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

What

Rebuilt again on 12 November 2026, after #292 merged as 25c561f. #292 covers the owner's v0.5.2 Colab test: the axes confirmation is shown at once and is faster, and the image type moved to Channels. The PR branch was not force-pushed. In order, it holds:

Since v0.5.1 (8726cb4), main has merged #278, #280, #282, #288, #289, #284-#287, #291 and #292.

  1. cadbed4bb049995b2385e3b8499c8d247d3754bd Prepare v0.5.2 again (commit A'').
  2. 4db97e9016d773bd97e8d29ab62911455082327e Points the notebook at A'' (commit B'').
    • RELEASE_REF = "cadbed4bb049995b2385e3b8499c8d247d3754bd", with the pair cadbed4… → PreprocessingNotebook() in RELEASE_CALLS and the one test that asserts the ref. RELEASE_TAG stays "v0.5.2".
    • git diff A'' B'' touches only the notebook's RELEASE_REF line, tests/test_notebook_file.py and tests/test_notebook_setup.py.
    • git diff A'' B'' -- src pyproject.toml is empty, and git diff main B'' -- src is empty.
    • claude/release-test-0.5.2 is now at B'' (4db97e9).

Breaking (summary; details in the CHANGELOG)

  • Run manifest version 5.
    • Version 4 (every v0.5.1 run) is refused by read_manifest and RunInputs.open with ManifestFormatError.
    • The fix: run preprocessing again into the same output folder.
  • Conversion record version 4 (Conversion record version 4: refuse version 3, require source_relative_path where written #291).
    • Version 3 (every v0.5.1 folder of copies) is refused with conversion_record_unreadable, naming the fix: convert the originals again into a new folder.
    • An OME-Zarr copy's entry must name its source in source_relative_path, and no other entry may.
    • A projected entry's two source paths must agree.
  • plane_histograms.csv schema version 5 (normalization v0.5.0). Columns are named by channel ID, an absent channel is blank (never zero), and a version 4 table is refused.
  • Resolver contract version 2:
    • Capabilities.parent_labels_support;
    • parent_labels_as_area;
    • as objects, A_MASK_NOT_INSTANCES.
  • Mask scan: pieces are counted 8-connected, and mask_relationships.json is report version 4.
  • Channels by ID in the API.
  • Spec pin 69a58b3.

#292 changes no published file: for the same answers, morphobricks.toml, experiment_design.csv and plane_histograms.csv are byte-identical to the files before it. This was checked on one RGB experiment and one fluorescence experiment, both with masks.

Gate

Result
python tools/check.py on A''s tree (before the record) Ruff clean, 459 files formatted, pytest 5487 passed, 4 skipped, 0 failed, code rules passed, exit 0
python tools/check.py on B'' 4db97e9 Ruff clean, 459 files formatted, pytest 5487 passed, 4 skipped (the same four), 0 failed, code rules passed, exit 0
Spec modules pytest -rsxX --junitxml tests/test_spec_*.py 1799 passed, 0 skipped, 0 xfailed, 0 failed, all 25 EXPECTED_MODULES. The JUnit file has no skipped, failure or error case
Install from GitHub by B''s SHA, fresh venv pip install --no-cache-dir "morphobricks-preprocessing[notebook] @ git+…@4db97e9016d773bd97e8d29ab62911455082327e" installs 0.5.2 (direct_url.json commit_id 4db97e9…), and PreprocessingNotebook() with .steps() builds. Not run: the shipped notebook's cell 1 in a real kernel
CI on B'' (run 43211911872) lint, and test on ubuntu, macos and windows with Python 3.11 and 3.13: all 7 jobs succeeded

Not run (environment skips, outside the Spec modules):

  • test_cli_log.py:166, test_folder_rules.py:199, test_folder_rules.py:230: the file system is case-sensitive;
  • test_discovery.py:665: the tests run as root.

Spec gates: unchanged. This is a G1-style record. G3 is not declared, because these are not shown: the v05 per-repeat coverage, HV3's per-channel failure, and the bricks' readers. The decision on a gate stays the owner's.

For the owner

  • Test the notebook with docs/colab-release-check.md. The Colab link is pinned to B'', which installs RELEASE_REF A'':
    • Colab: https://colab.research.google.com/github/CellMigrationLab/morphobricks-preprocessing/blob/4db97e9016d773bd97e8d29ab62911455082327e/notebooks/MorphoBricks_Preprocessing.ipynb
    • Raw download for JupyterLab: https://raw.githubusercontent.com/CellMigrationLab/morphobricks-preprocessing/4db97e9016d773bd97e8d29ab62911455082327e/notebooks/MorphoBricks_Preprocessing.ipynb
    • The same commit is on claude/release-test-0.5.2.
  • Merge with a merge commit, not squash or rebase, so that A'' stays reachable from main.
  • This PR creates no tag. After the merge: https://github.com/CellMigrationLab/morphobricks-preprocessing/releases/new?tag=v0.5.2&target=<merge sha>&title=v0.5.2

Open questions

  1. Stains left after switching to colour. If the stains are named and then every folder is switched to colour (RGB) on Channels, the stain names stay declared. The card says "stay saved, unused", and they are written as [channels.*] in morphobricks.toml (W_UNUSED_CHANNEL). Switching back to separate channels clears every tag, and no stale R/G/B remain. This behaviour is unchanged since Notebook: an all-RGB experiment should not need a channel label on "Your channels" #240. Recommendation: keep it for v0.5.2. If you would rather drop unused stains when every folder becomes colour, that is a small follow-up, but it changes the published file on that path.
  2. G3 and heterogeneous processing. Recommendation: release as is. Every brick refuses manifest v5 until its own S3.3 pin moves. Add a v05 coverage test before G3 is declared.
  3. Mixed RGB and channel units (Stage 3 S3.3: per-unit channel lists, plane_histograms v5 #288). Recommendation: keep them refused for v0.5.2.
  4. The Spec's docs/pins.md still lists preprocessing at 1bed024. Recommendation: update it in the Spec after the tag.

🤖 Generated with Claude Code

https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc

…or the redesigned notebook

- pyproject, the notebook's current_version/RELEASE_TAG, the version index and the README
  pins: 0.5.2. Normalization stays pinned at its tag v0.5.0 (1291b09, plane_histograms v5).
- CHANGELOG "Unreleased" becomes "v0.5.2 (12 November 2026)" with Breaking / Added / Changed /
  Fixed / Migration sections (manifest v5, plane_histograms v5, resolver contract v2, the
  8-connected mask scan and report v4, channels by ID), a table for bricks, and the merged
  sections of #278, #280, #282, #284-#289 under their own headings.
- docs/colab-release-check.md walks the seven redesigned steps: the viewer, the axes from the
  quick scan, X/Y pixel size, the extra-stain folder, grouped labels, the Z-stack projection,
  the time-lapse and the OME-Zarr copy.
- docs/conformance.md: the v0.5.2 release record (check.py 5460 passed, 4 environment skips;
  Spec modules 1799 passed, 0 skipped, 25 modules), measured on this tree before the record.
- Stale docs after #288: contract §9 and the user guide named manifest version 4.
- AGENTS.md status: v0.5.2, normalization v0.5.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
RELEASE_REF = 1244527 (RELEASE_TAG v0.5.2, set with
current_version in that commit), with its PreprocessingNotebook() call recorded in
RELEASE_CALLS and the test that asserts the ref, the same two-commit pattern as v0.5.0
(3b616a0, c74d717) and v0.5.1 (d023ff9, a4154ad). A commit cannot hold its own SHA, so the
notebook installs the preparation commit, whose package code is the release's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc

Copy link
Copy Markdown
Contributor Author

Measured on B c4173dcd4e713135f06b8a838f796624ea635af9

All runs: Linux, Python 3.13.18, a fresh venv with .[dev,notebook,zarr] (metadata 0.5.2, normalization 0.5.0).

Result
python tools/check.py Ruff clean, 457 files formatted, pytest 5460 passed, 4 skipped, 0 failed, code rules passed, exit 0. Same counts as on A's tree
Spec modules pytest -rsxX tests/test_spec_*.py 1799 passed, 0 skipped
Install from GitHub at B In a fresh venv, pip install "morphobricks-preprocessing[notebook] @ git+…@c4173dcd4e713135f06b8a838f796624ea635af9" gives 0.5.2, with normalization 0.5.0 and ipywidgets 8.1.9. The installed package equals src (diff -r). PreprocessingNotebook() builds welcome(), steps() and results_step() (three VBoxes). RESOLVER_VERSION is 2 and MANIFEST_VERSION is "5"
Shipped notebook, unmodified, real kernel (nbclient), fresh venv with only ipykernel/nbclient 1. Cell 3 run first prints one line, CellStop "… run cell 1 (Install MorphoBricks preprocessing) first …", with traceback == [evalue].
2. Cell 1 pip-installs RELEASE_REF A from GitHub (direct_url.json commit 1244527…) and prints Ready: preprocessing 0.5.2; normalization 0.5.0; ipywidgets 8.1.9. and "pinned v0.5.2 candidate (1244527)". The installed files equal src.
3. Cell 2 prints its one-line note.
4. Cell 3 displays the app (a widget view)

Skips (not run):

  • test_cli_log.py:166, test_folder_rules.py:199 and test_folder_rules.py:230: the file system is case-sensitive.
  • test_discovery.py:665: the tests run as root.

Generated by Claude Code

…e branch

The one conflict is CHANGELOG.md: #291's Unreleased block becomes the subsection
"Conversion record version 4 (#291)" of v0.5.2, before the notebook redesign; the next
commit moves it into the release notes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Commit A' of the release PR, after main (ac2dc27, #291) was merged in.

- CHANGELOG v0.5.2: Breaking gains conversion record version 4 (version 3, every v0.5.1
  folder of copies, refused with the fix: convert the originals again into a new folder);
  the summary, the OME-Zarr copy's line (no longer "record version 3 kept"), Migration
  (users and the bricks' table) follow; #291's notes stay as their own subsection.
- README upgrading paragraph and AGENTS.md status: the conversion record.
- docs/colab-release-check.md: projected copies written by v0.5.1 are not offered and one
  line says why (item 17); a v0.5.1 folder of copies is refused naming the fix (item 21).
- docs/conformance.md: the v0.5.2 record measured on this tree (check.py 5476 passed, 4
  environment skips; Spec modules 1799 passed, 0 skipped, 25 modules); the record version
  question is the owner's decision now.
- RELEASE_REF back to v0.5.1's d023ff9 (and its test), as in the first commit A; the next
  commit points it at this one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
RELEASE_REF = 6a151b8 (RELEASE_TAG v0.5.2), with its
PreprocessingNotebook() call recorded in RELEASE_CALLS and the test that asserts the ref: the
same two-commit pattern as v0.5.0 (3b616a0, c74d717), v0.5.1 (d023ff9, a4154ad) and the first
v0.5.2 pair (1244527, c4173dc), which #291 replaced. A commit cannot hold its own SHA, so the
notebook installs the preparation commit, whose package code is the release's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…s) into the v0.5.2 release branch

Two conflicts. CHANGELOG.md: #292's Unreleased block becomes the subsection "Axes
confirmation and the image type on Channels (#292)" of v0.5.2, before #291's; the next
commit moves it into the release notes. docs/colab-release-check.md: the release
branch's walk-through is kept as it was; the next commit adds #292's items to it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…n Channels (#292)

Commit A'' of the release PR, after main (25c561f, #292) was merged in.

- CHANGELOG v0.5.2: the summary and Changed gain #292 (Working… and the progress bar of
  the axes confirmation, a failure said in red, no picture read for the folded per-folder
  image-type rows, the image type proposed at the quick scan and confirmed on Channels);
  #292's notes stay as their own subsection.
- docs/colab-release-check.md: Images shows the image type, display only; Axes shows
  Working… and the bar, and no image type; Channels starts with the image type.
- docs/user_guide.md: the image type moves from step 2 to step 3 (and the quick scan's
  display-only line, the Working… state).
- docs/conformance.md: the v0.5.2 record measured on this tree (check.py 5487 passed, 4
  environment skips; Spec modules 1799 passed, 0 skipped, 25 modules).
- RELEASE_REF back to v0.5.1's d023ff9 (and its test), as in commits A and A'; the next
  commit points it at this one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
RELEASE_REF = cadbed4 (RELEASE_TAG v0.5.2), with its
PreprocessingNotebook() call recorded in RELEASE_CALLS and the test that asserts the ref: the
same two-commit pattern as v0.5.0 (3b616a0, c74d717), v0.5.1 (d023ff9, a4154ad), the first
v0.5.2 pair (1244527, c4173dc) and A', B' (6a151b8, 90f86cc), which #292 replaced. A commit
cannot hold its own SHA, so the notebook installs the preparation commit, whose package code
is the release's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
@guijacquemet
guijacquemet merged commit 6d81bcf into main Nov 12, 2026
7 checks passed
@guijacquemet
guijacquemet deleted the claude/release-0.5.2 branch November 12, 2026 13:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants