Repository navigation
Fixes #281 - #282
Fixes #281#282
Conversation
A saved channel that loses a header name is a changed entity (experiment-v1
4.6 (c)) and had no confirmation: after a removal saved without a re-tag, any
later re-tag of that channel was refused for good. The Channels step now lists
each such channel with its header names saved and now and asks once ("Yes, this
header name changed"); only that click gives publication one reconfirmation per
channel (new_id null, the date of the click, both SHA-256), as for a move. The
click covers exactly the change shown; a later change asks again.
No removal or rename answer accepts a lost header name any more: the published
file keeps no names per folder, so a switch to another saved name with a removal
no longer publishes unseen. The line beside the disabled Save names each change
still waiting, instead of telling folders that never had names that they lost
one. A channel that moved and lost a name is asked both questions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…s missing (#281) The line beside the disabled Save said only "1 answer still missing" while a moved channel or a lost header name also waited on Channels, so that question was found only after answering. It now names both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Reopened as saved, the step is folded behind "Saved on ..., nothing changed". A re-tag on Channels then left it folded with only [Run] [Change...] and no line, hiding the waiting header-name question and the line beside Save. A change since the save (or a refusal, as before) now unfolds it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Independent review of 6ee1b46, with two fixes pushed (head now 644591c)Checked from a fresh clone, venv Behaviour on main vs this branchI wrote probe scripts that do not use the new widget, so they also run on main. "Click" means Yes, this header name changed. "Saves" means Save is enabled and publishing succeeds.
So main's tests fail for behavioural reasons too, not only because the widget is missing. Adversarial paths (branch)
Records and byte identity
Fixes (one commit each; each regression test fails before its fix)
Gate on 644591c ( I accept the guard-test reading: a re-tag that drops the removed folder's name is asked like any other loss. Not fixed: on main and outside this PR. Removing every member of a repeat (ctrl/rep2 and drug/rep2) is refused with Generated by Claude Code Generated by Claude Code |
Fixes #281. Base:
main2d1ab30 (the merge of #280). One commit: 6ee1b46.Summary
This follows the owner decision of 11 November: an explicit confirm on Channels.
reconfirmationper channel: the channel ID,new_idnull, the date of the click, and both SHA-256 values. This is the record format moves have used since Fixes #258, fixes #252 #278.header_namesas stored).channel_moves.name_changesis new (pure);reconfirmations(..., names=)accepts a header-name loss only for channels confirmed as shown;headers_changed/HEADER_NAMEare removed (no longer used);notebook_check_save.pystays under 600 lines.describe: it does not share this logic. It holds no answers and builds no re-confirmations. Only its user-guide sentence was extended.tests/spec_fixtures/is untouched.For review: a conflict in the requested tests
"A name held only by the removed folder is still covered by the removal" cannot hold together with "'Hoechst' → 'DAPI' with a removal needs the click" when the user re-tags.
DNA = ["DAPI", "Hoechst"]), the same folders on disk and the same user actions. Fixes #279 #280's review already pointed this out.test_a_header_name_held_only_by_the_removed_folder_is_the_removals, which re-tagged and expected Save to be enabled without asking. It is now two tests: no re-tag, and re-tag plus click. Please confirm this reading.Evidence
New and changed tests, all failing on main. Run against main's
src, they fail at the missing question (names_box). Main's behaviour in each scenario, from a probe on main:tests/test_header_name_confirm.py:tests/test_reconfirm_scope.py: the parametrized test now covers other name, other saved name ("DAPI"), empty name and no header names, each with a removal. In each case Save stays disabled with the reason beside it until the click, and then saves with one DNA record. The removed-folder guard is split as described above.test_notebook_channel_moves.py::test_a_lost_header_name_is_asked_besides_the_movereplaces the old "not offered as a move" test.test_notebook_stepper.py: the Channels page now ends with the header-name question.Byte-identical publishes, main vs this branch: the SHA-256 of
morphobricks.toml,experiment_design.csvandmorphobricks.records.jsonlis identical in all five scenarios:header_names;Records files: checked with MorphoBricks-Spec main b4b1008
tools/audit/refrecords.py check. All pass:Screenshots (headless Chromium via ipywidgets embed):
The widgets were not looked at in a real JupyterLab or Colab.
Tests
python tools/check.pyon 6ee1b46 passed:ruff check: all checks passed;ruff format --check: 438 files already formatted;The 4 skips are environment-only:
test_cli_log.py:166,test_folder_rules.py:199andtest_folder_rules.py:230: "this file system tells names apart by case";test_discovery.py:665: "running with permissions that ignore file modes".Spec modules:
tests/test_spec_*.py1733 passed, 0 skipped.Generated by Claude Code