Repository navigation
Release candidate v0.5.0: Gate G1 record, version 0.5.0, notebook installs v0.5.0 - #253
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…n's pin docs/conformance.md: the G1 record measured on c74d717 (Spec pin 1bed024): the whole suite, the Spec modules with no skip, P01-P35 with their tests, the golden CSVs, the notebook items, the four environment skips listed as not run, and the gaps against the conformance plan. The PR 17 run of 8 November is restored to the pin it ran with (b197ac1). Fixes #235 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…, confirmed_on, v27 Tests only; src and pyproject.toml are unchanged, so RELEASE_REF 3b616a0 stays valid. - P06: two unnamed v12 units with physically swapped fluorophores run unrefused, the check and the run record cannot tell them from the unswapped folder, the layout group is not batch-confirmable and the preview shows each unit's own planes (test_physical_check, test_spec_run_aliases). - P30: the v13 legacy answers, migrated and derived, give back the legacy file byte for byte; with two dates in rep1 the derived file differs only in the earlier date, and no clock is read (test_spec_derived_design). - P34 on v01 and P35 on v25 and t07: a confirmed removal from v01 publishes exactly t07 or v25; removals from the v25 base; t07 without the removal is refused (test_spec_records). - P28 on v09: each batch of masks is unchecked until the mask step reads it (test_spec_run_inputs_semantic). - P33 (a): the hand-made attachment is the fixture t12 (test_spec_reconcile). - Section 2 confirmed_on: a frozen clock moved by one day writes identical bytes and the canonical writer reads no clock (tests/frozen_clock.py, test_description_write). - Section 2 descriptive keys and digests on v27 (test_description_write). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…inding Measured on a6a0343 (tests only on top of 4437067; src and pyproject.toml equal to 3b616a0). P06, P30, P34, P35, P28 (v09) and the section 2 confirmed_on and v27 rows now pass on the fixtures the plan names. P24, P27, P31 and the lab-tool part of Provenance are deferred to the Stage 2 gate per ADR 0001 GS1 (MorphoBricks-Spec cdc1841). P21 and P29 are recorded as not met on v01 and v07: a run with a published description never reports R_FOLDER_NOT_NFC or R_MASK_TYPE_NAME_INVALID (source defect, left for the owner). The Colab and JupyterLab browser check is the owner's, before tagging. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…paths (P21, P29) The two refusals were raised only by preflight(..., with_description=True), and no production caller passed it: a run with a published morphobricks.toml refused a decomposed folder only as R_UNIT_NOT_DECLARED and the mask types NA, ' cells' and a decomposed name only as R_MASK_TYPE_NOT_DECLARED. Spec experiment-v1 section 3.3 (a folder label read from disk that is not NFC is refused by preprocessing, never normalized or renamed), section 8 and ADR 0001 AQ11 (an invalid mask type name is refused at discovery, never reaching E_ID_TEXT), section 10 (an R_* conflict blocks publication) and owner decision Q1 (only when a description is in use). - run.preflight.description_in_use: the output folder holds a published morphobricks.toml. - run_experiment, prepare_mask_step and the command line's check/run pass it as with_description; the notebook's folder check and mask re-pairing pass it, or True while the user describes the experiment; Check and save is blocked while a name is refused. - The command line's describe refuses a folder label that is not NFC. Without a published description nothing changes. Regression tests on v01 and v07 through run_experiment, the mask step, the command line and the notebook fail on c675f13. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
RELEASE_REF (and the test asserting it) now names 0a2e25b, the commit that raises R_FOLDER_NOT_NFC and R_MASK_TYPE_NAME_INVALID on the described paths. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Only docs/conformance.md: the measured commit, the counts (5049 collected, 5045 passed, 4 skipped; Spec modules 1671 passed, 0 skipped), the P21 and P29 rows with the new tests, and the summary against the conformance plan, with the undescribed-parity evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Brings the audit batch 33/34a/34b fixes and the pre-release follow-ups into the v0.5.0 release candidate, keeping the P21/P29 description_in_use wiring. Conflicts: - notebook_folder.py: the folder check passes both with_description (P21/P29) and bind_headers=True (audit batch 33). - cli_describe.py: the module docstring says both that describe reads image headers when it compares a published description and that a non-NFC folder label is refused; the imports of both sides are kept. - CHANGELOG.md: main's Unreleased entries are folded into the 0.5.0 section, after the P21/P29 fix; the 0.5.0 introduction names #254, #255 and #257. Also: the P30 test's answers (added on this branch) now answer the image type as "channels", since an unanswered image type is an open question since audit batch 33 (unit_image_type_unanswered). tools/check.py: ruff clean, 415 files formatted, 5105 passed, 4 skipped (environment), code rules passed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
RELEASE_REF (and the test asserting it) now names 0ea3254, the merge of origin/main (#254, #255, #257) into claude/release-0.5.0, which carries the P21/P29 fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Only docs/conformance.md: the measured commit (ba415de, whose RELEASE_REF is the merge 0ea3254), the counts (5109 collected, 5105 passed, 4 skipped; Spec modules 1671 passed, 0 skipped), tools/check.py (415 files, 5105 passed), the P30 answers now stating the image type, and the fixes merged from main: audit batches 33/34a (#254), 34b (#255) and the pre-release follow-ups (#257). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
1. A header refusal lifted by an answer about another cell. Tagging any channel of any folder recomputed every label's header_names from every saved tag (channel_answers.synced). After images were rewritten with other header names (for example two channels swapped), tagging one channel of an unchanged folder made the R_HEADER_CONTRADICTION of the changed folders vanish: Check and save said the images agree, the save published it and the run wrote the table. Now a tag confirms the header name of the cell tagged and nothing else: synced() takes the cells of the answer, drops the names no tagged cell has any more and adds a name only for those cells. The refusal stays until the channel it names is tagged again (the resolution #257 documents). 2. A "same way?" kept for other folders or another layout in a draft. With nothing published, the answer saved in morphobricks.draft.json was kept when a folder joined or left the replicate before the next folder check (carry_over keeps repeats by label), and when a tag or an image type changed after it (reasked ran only against a published file); it was then published as the user's confirmation. Now the draft file's date is kept only when every unit the repeat has now has its whole saved channel list and type and no unit with a saved answer left it (published_answers.resumed), and an answer that changes a repeat's declared layout reopens it with or without a published file; a repeat tagged back to the layout it was answered for keeps its date. The names card says which replicate is asked again. Tests: tests/test_notebook_final_review.py (10; 8 fail before the fix), and two existing tests follow the new rule (the alias of a cell not tagged by the answer; "same way?" asked again after the image type of a folder changed). Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
RELEASE_REF (and the test asserting it) now names fd7afd3, the commit that carries the two final-review fixes on top of the merge of main (0ea3254). Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
The record of the release candidate v0.5.0 is measured again on 1e5390c (the final-review fix fd7afd3 and the RELEASE_REF commit): 5115 passed, 4 skipped (environment, outside the Spec modules), Spec modules 1671 passed with 0 skipped, tools/check.py exit 0. It lists the two final-review fixes. Only this file changes. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Fourteen commits on
mainatbf733ee, withmainat8c573d6merged in:3b616a0Prepare v0.5.0.pyproject.tomlversion0.5.0(static version, not derived from tags); the CHANGELOG's "Unreleased" becomes "0.5.0 - 2026-11-09" with a short release paragraph; the notebook'scurrent_version = "0.5.0"andRELEASE_TAG = "v0.5.0";notebooks/notebook_latest_versions.yaml0.5.0; README install pins@v0.5.0;tests/test_notebook_setup.pyversions.c74d717Point the notebook at the v0.5.0 preparation commit.RELEASE_REF = "3b616a0a8791a0a93d5059e96c4cf311f717724d", the same two-commit pattern as v0.4.0 (4b8a32e,e77830a). A commit cannot hold its own SHA, so the notebook installs the preparation commit, whose code is the release's.4437067Gate G1 record indocs/conformance.md(the conformance plan names no place; the file already holds the conformance records), and the PR 17 run restored to the pin it ran with. Fixes docs/conformance.md was relabelled to Spec c8f6852 without a new conformance run #235.a6a0343G1 gap tests (tests only). P06, P30, P34/P35 on the named fixtures, P28 onv09, P33 againstt12, the section 2confirmed_onfrozen-clock test and thev27digest test.c675f13G1 record update (onlydocs/conformance.md).0a2e25bFix P21/P29: raiseR_FOLDER_NOT_NFCandR_MASK_TYPE_NAME_INVALIDon the described paths, with regression tests and a CHANGELOG note (details under Gate G1 below).5cc3b07Point the notebook at the fix commit.RELEASE_REF = "0a2e25b4ff4dd1f638ac65c50e09b43182e71a6d"(and the test asserting it), asc74d717did for3b616a0.76e09c3G1 record update (onlydocs/conformance.md): P21 and P29 met, measured on5cc3b07.0ea3254Mergeorigin/main(8c573d6: Audit batches 33, 34a, 34b: publish only what was answered, of the image checked #254, Batch 34b: preview-gated one-click axes, header evidence on reopen, NaN crop #255, Pre-release follow-ups to #254 and #255 #257). Conflicts resolved so both behaviours are kept:notebook_folder.pypasseswith_description(P21/P29) andbind_headers=True(batch 33) to the folder check'spreflight;cli_describe.py's docstring says both thatdescribereads headers when comparing a published description and that a non-NFC label is refused (both sides' imports kept);CHANGELOG.mdfolds main's Unreleased entries into the 0.5.0 section, after the P21/P29 entry. One test-only adjustment: the P30 test's answers (added on this branch) now state the image type"channels", since batch 33 makes an unanswered image type an open question (unit_image_type_unanswered).ba415dePoint the notebook at the merge.RELEASE_REF = "0ea3254418fb808feddb0a235fabc025bd855e9e"(and the test asserting it).43d1257G1 record update (onlydocs/conformance.md): measured onba415de, with the fixes merged frommainlisted.fd7afd3Final review of v0.5.0: two confirmations the user did not give (details under "Final-review fixes" below), withtests/test_notebook_final_review.py(10 tests; 8 fail before the fix) and a CHANGELOG entry.1e5390cPoint the notebook at the final-review fix.RELEASE_REF = "fd7afd339bcaab7579c806a28a65bb7ecebe940c"(and the test asserting it).18673aaG1 record update (onlydocs/conformance.md): measured on1e5390c, with the final-review fixes listed.git diff fd7afd3 HEAD -- src pyproject.tomlis empty, soRELEASE_REF(fd7afd3) installs exactly the package code of this head.Final-review fixes (
fd7afd3)Found by the final adversarial review of the candidate, driving the notebook headless. Both let something the user did not confirm be published and run.
header_namesfrom every saved tag (channel_answers.synced). After images were rewritten with other header names (for example two channels swapped), tagging one channel of an unchanged folder made theR_HEADER_CONTRADICTIONof the changed folders vanish: Check and save said the images agree, the save published it and the run wrote the table. Now a tag confirms the header name of the cell tagged and nothing else; names no tagged cell has any more are dropped. The refusal stays until the channel it names is tagged again (the resolution Pre-release follow-ups to #254 and #255 #257 documents).morphobricks.draft.jsonwas kept when a folder joined or left the replicate before the next folder check, and when a tag or an image type changed after it; it was then published as the user's confirmation. Now it is asked again in both cases (published_answers.resumed;reaskedworks with or without a published file), the names card says which replicate is asked again, and a replicate brought back to the layout it was answered for keeps its answer.Gate G1 record
Measured on
1e5390c(the code and tests of this head; the last commit changes onlydocs/conformance.md). Earlier measurements:a6a0343(5028 passed, 1660 Spec) found P21 and P29 not met, which0a2e25bfixes;5cc3b07(5045 passed, 1671 Spec) was before the merge ofmain;ba415de(5105 passed, 1671 Spec) was before the final review. Every P-scenario in G1 scope (P01-P23, P25, P26, P28-P30, P32-P35) still passes in this run. Spec pinPIN.toml: MorphoBricks-Spec1bed024(unchanged). The scope ruling, ADR 0001 GS1, was merged in the Spec ascdc1841. That commit changes only the ADR anddocs/conformance-plan.md, so the pinned files are unchanged.1e5390c)tests/test_spec_*.py(JUnit run,1e5390c)EXPECTED_MODULES(JUnit: noskipped,failureorerrorelement in any Spec case)python tools/check.pyon1e5390cNot run (environment, outside the Spec modules; owner ruling):
test_cli_log.py:165,test_folder_rules.py:201and:229(case-sensitive file system),test_discovery.py:665(run as root).New tests and what each shows
v12)test_physical_check::test_p06_swapped_fluorophores_in_unnamed_units_pass_and_each_unit_needs_its_own_lookC0,C1v12)test_spec_run_aliases::test_p06_two_unnamed_units_with_swapped_fluorophores_run_unrefused_on_the_confirmationexperiment_descriptionequals the unswapped run's. Every image is listed underimages_without_header_channel_namesv13)test_spec_derived_design::test_p30_the_derived_file_of_migrated_legacy_answers_differs_only_in_the_earlier_date(2 cases)v13migrated and derived gives the legacy file (and golden) byte for byte. Withrep1dated 10-01 and 10-15,rep1takes 10-15 and the note lists both. The derived file differs from the legacy file in the CTRL/rep1 date only, andrep2/rep3are identical. No clock readv01)test_spec_records::test_p34_v01_one_changed_count_appends_one_line_and_keeps_every_confirmed_on,test_p34_v01_a_removal_and_count_changes_write_removed_then_one_line_per_memberimage_count_changedline. The file differs only in thatimage_countline, soconfirmed_onis byte-identical. RR3 writesremovedand then one count line per remaining memberv25,t07)test_spec_records::test_p35_t07_is_what_a_confirmed_removal_from_v01_publishes,..._t07_without_the_recorded_removal_is_refused_and_writes_nothing,..._v25_is_what_removing_the_last_members_of_drug_a_from_v01_publishes,..._on_the_v25_base_a_removed_repeat_keeps_every_retired_id,..._on_the_v25_base_an_unconfirmed_removal_writes_nothingv01publishest07/v25byte for byte, with the rightremovedlines.t07without the removal givesR_CONFIRMED_ID_CHANGEDand writes nothing. On thev25base a removed repeat keepsused_ids, and an unconfirmed removal writes nothingv09)test_spec_run_inputs_semantic::test_p28_on_v09_each_batch_of_masks_is_unchecked_until_the_mask_step_reads_itnot yet checkedandA_MASK_UNCHECKEDuntil the mask step reads it. Earlier batches staycheckedt12)test_spec_reconcile::test_p33_a_...(one more assertion)t12and gives exactlyR_CONFIRMED_ID_CHANGEDconfirmed_ontest_description_write::test_a_frozen_clock_moved_by_a_day_writes_identical_bytes_for_an_unchanged_model(+tests/frozen_clock.py)v01leaves the file byte-identical, with no recordv27)test_description_write::test_editing_only_target_or_treatment_key_of_v27_changes_no_digest_and_no_groupingtarget/treatment_keyofv27leaves all four digests and the derived rows unchangedtests/test_notebook_final_review.py(10)The rows that GS1 keeps in G1 passed in this run: RGB (
v28,v29,i100-i106,i119), mask fields (i111,i112), descriptive keys and digests (v27), and thei99half of Provenance.Scope and status
cdc1841): P24, P27, P31 and the lab-tool-links part of §2 Provenance.v01andv07since0a2e25b. The defect:R_FOLDER_NOT_NFCandR_MASK_TYPE_NAME_INVALIDcame only frompreflight(..., with_description=True), which no production caller passed. Where the Spec puts them: experiment-v1 §3.3 (a folder label read from disk that is not NFC is refused by preprocessing, never normalized or renamed), §8 and ADR 0001 AQ11 (an invalid mask type name is refused at discovery, never reachingE_ID_TEXT; a non-NFC one isR_FOLDER_NOT_NFC), §10 (anR_*conflict blocks publication), conformance plan §3 P21/P29, and owner decision Q1 (only when a description is in use). The fix is one wiring:run.preflight.description_in_use(root, output)(the output folder holds a publishedmorphobricks.toml) is passed aswith_descriptionbyrun_experiment,prepare_mask_step(CLImasks) and the CLI'scheck/run. The notebook's folder check and mask re-pairing pass it, or True while the user describes. Check and save is blocked while a name is refused, anddescriberefuses a non-NFC folder label. Nothing is renamed.c675f13):v01plusCTRL/Café(NFD) givesR_UNIT_NOT_DECLAREDonly.v07plus masksNA,cells,CafégivesR_MASK_TYPE_NOT_DECLAREDonly.R_FOLDER_NOT_NFC(CTRL/Café), andR_MASK_TYPE_NAME_INVALID(cells,NA) plusR_FOLDER_NOT_NFC(Café). The run is not written and the folders are unchanged.test_spec_discovery, coveringrun_experiment, the mask step, the CLIcheck/run/masks/describeanddescription_in_use. 6 intest_notebook_name_refusals, covering the folder check, re-pairing, the save gate and a v0.4 notebook with a published file. All of them fail onc675f13except those for undescribed paths.c675f13and on the fix. The run, mask step andcheckoutputs are byte-identical (plane_histograms.csv,mask_relationships.json,experiment_design.csv, the reports), apart from the manifest'swritten_atand the manifest SHA-256 that follows from it.test_parity_v0_4_0(24) passed.describenow exits 1 withR_FOLDER_NOT_NFCon such a folder, where it used to draft it ("no ID can be proposed (E_ID_NOT_NFC)").describedrafts a description, so §3.3 applies.docs/colab-release-check.md): owner, before tagging.Pins and links naming the old tag
notebooks/MorphoBricks_Preprocessing.ipynbcurrent_version0.4.0 → 0.5.0,RELEASE_TAGv0.4.0 → v0.5.0,RELEASE_REF4b8a32e…→3b616a0…→0a2e25b…(the P21/P29 fix) →0ea3254…(the merge ofmain) →fd7afd3…(the final-review fix)notebooks/notebook_latest_versions.yamlREADME.mdpip install …git@v0.4.0→@v0.5.0(Installation); notebook-extrapip install …git@v0.4.0→@v0.5.0; "Planned work after v0.4.0" → v0.5.0tests/test_notebook_setup.pyRELEASE_REFand "pinned v0.5.0 candidate"blob/mainand names no tag. The v0.4.0 mentions indocs/migration-0.3-to-0.4.md,docs/colab-release-check.md("release PR of v0.4.0"),docs/contract.mdandtests/test_parity_v0_4_0.pyare history or deliberate comparisons with v0.4.0Install check. After the push I installed the notebook's target commit with
pip install --no-deps --target …fromgit+https://github.com/CellMigrationLab/morphobricks-preprocessing@fd7afd339bcaab7579c806a28a65bb7ecebe940c. It reportsVersion: 0.5.0, and its package files are identical to this head'ssrc/morphobricks_preprocessing(diff -r). The@v0.5.0README pins cannot be installed until the owner publishes the tag.For the owner
RELEASE_REFfd7afd3stays reachable frommain, as with v0.4.0.2975e0e. The record was written in7418da1, wherePIN.tomland the record's own first text both nameb197ac1.2975e0ewas the first relabel (c9d7847), sob197ac1is the pin restored.🤖 Generated with Claude Code
https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc