Skip to content

Notebook: one image viewer for every step, formatted report, X/Y pixel inputs (redesign 3, part 1) - #284

Merged
guijacquemet merged 13 commits into
mainfrom
claude/redesign3-1-viewer
Nov 12, 2026
Merged

guijacquemet merged 13 commits into
mainfrom
claude/redesign3-1-viewer

Conversation

@guijacquemet

Copy link
Copy Markdown
Contributor

Redesign iteration 3 after the owner's test of v0.5.1 in Colab, part 1 of 4 (stacked). Items (u), (v), (w), (y), (r) of "OWNER v0.5.1 NOTEBOOK TEST" (RESTART.md).

Summary

  • One image viewer, one reader (u). notebook_viewer.ImageViewer + image_view.read_view + image_tree (pure). Four dropdowns that narrow each other (condition → biological repeat → technical repeat → image; a level with one value is not shown), a t and a z slider when the image has those axes, every channel of the plane side by side (at most 6, then "6 of N channels shown"; a colour folder is one colour picture), Larger pictures. notebook_viewers says per step which roles an image is read with and where they come from:
    • Images: the image's own header roles, for looking only (no picture when the header does not name Y, X and every dimension with several planes; nothing guessed);
    • Axes: the roles being edited (the example), then the confirmed ones;
    • Channels, Check and save: the confirmed roles, each channel with its own header name and the tag of its folder.
      Every read is bound to the fingerprint the folder check (or the quick scan) took with the header, before and after.
      The folder check no longer draws a picture per folder; the tag grid and the replicate boxes hold no pictures; a block of more than three folders folds its folder rows. The stacked pages other bricks embed (folder_step, axis_step) are unchanged.
  • Bug (v). "Another image, or other planes" (a dropdown inside a folded panel inside a card) is gone: the image, time point and slice are chosen in the viewer's own row. Regression test: no control of the example is inside an Accordion, none is disabled.
  • Report (w). report_view.report_html renders discovery_report.json as a summary table, headings and tables, with long lists and each message folded and the plain text last. The files are unchanged.
  • Pixel size (y). Two labelled inputs X and Y with same for X and Y instead of "One pixel is …". What is written to calibration.csv is unchanged.
  • Colab (r). Cell 3 calls google.colab.output.no_vertical_scroll() inside the Colab guard. RELEASE_REF is not touched.

Notes for review

  • The cause of (v) in Colab was not reproduced: in headless Chromium with ipywidgets 8 the folded dropdown of main is clickable. The fix removes the construct; a real Colab session was not available here. no_vertical_scroll() is likewise verified only against a faked google.colab (the call, inside the guard, only in cell 3).
  • Same answers give the same published files (no code of the answers, the draft, the save or the run is touched); a byte comparison against main is in the last PR of the stack.
  • PR Fixes #281 #282's Channels questions (moves and header names) stay on the Channels step.

Tests

python tools/check.py on the head: see the comment below with the exact counts.


Generated by Claude Code

…pixel inputs; Colab output not scrolled

Owner's test of v0.5.1, items (u), (v), (w), (y), (r). Images, Axes, Channels and Check and
save show images through one viewer (narrowing dropdowns, t and z sliders, every channel of
one plane, at most six) and one reader; the folded 'Another image, or other planes' is gone;
the check's and run's reports are formatted; the pixel size has labelled X and Y inputs;
cell 3 calls google.colab.output.no_vertical_scroll() on Colab. No published file changes.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…aves the folder pictures out

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…s output (user guide, changelog, module map)

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…I timed out after 4 s)

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…kernel's output (macOS CI)

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

Copy link
Copy Markdown
Contributor Author

Gate on the final head e2e160f (main a775ebf, #288, merged in): python tools/check.py exit 0, 5353 passed, 4 skipped (environment skips: case-sensitive file system ×3, file modes ×1). The counts for the whole stack and the byte comparison against main are in #287 (comment).

Added after opening, tests only: the kernel runs of the notebook file (tests/test_notebook_file.py::_execute) are repeated, twice at most, when the client loses the kernel's output. On the macOS runners the faked-Colab runs timed out waiting for the app's display message ("Timeout waiting for IOPub output"); the app now has about 1,800 widget models (1,540 on main). A notebook that really shows nothing still fails every time.

🤖 Generated with Claude Code

https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc


Generated by Claude Code

…mited queue (macOS CI lost them)

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
…(it was set on the manager's)

The app's cell sends 2,015 IOPub messages on this branch (1,837 on main); ZeroMQ keeps
2,000 for a slow subscriber, so the display message was dropped on macOS CI.

Co-Authored-By: Claude Fable 5.2 <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

Copy link
Copy Markdown
Contributor Author

Independent review: #284 (viewer, formatted report, X/Y pixel inputs, Colab scroll)

Verdict: approve. Merged main a685711 (#289, parent-label masks) forward as e5d7103. There were no textual conflicts. No branch in the stack touches notebook_mask_question.py, notebook_masks_screen.py or preview_render.py, so #289's grouped labels option and its coloured group preview are kept as they are inside the single-column Masks step.

What I checked with my own scripts, not the PR body:

  • The viewer is display only. read_view binds every read to the folder check's fingerprint, before and after the read. Sources say where their roles come from: the header's, the ones being edited, or the confirmed ones. A header without Y and X gets a sentence, never a guess. Moving the sliders, Larger pictures and redrawing on every step wrote nothing to the output folder and nothing to the draft.
  • X/Y pixel inputs. same for X and Y reproduces main's one-input statement. calibration.csv is byte for byte main's for the same answer.
  • tests/test_notebook_file.py::_execute retry. It only repeats on RuntimeError/TimeoutError whose message contains "IOPub". With raise_on_iopub_timeout=True that is nbclient's CellTimeoutError("Timeout waiting for IOPub output"). A cell error is CellExecutionError, which is not caught. A dead kernel is a RuntimeError without "IOPub" and is re-raised. A real cell timeout ("Cell execution timed out") is re-raised. cell.outputs is cleared at each execution, so a retry cannot inherit the outputs of the run that lost them. A deterministic failure still fails all three times. The retry could only mask a flaky error that happens to coincide with lost output. I accept it. A possible tightening is to match the full phrase and the CellTimeoutError type.
  • Embedding API (tests/test_embedding_api.py) is unchanged.

Gate on e5d7103 (Ruff check, Ruff format, code rules, pytest -n 2): 5427 passed, 4 skipped. The skips: one test needs file modes that a root user does not have; three need a case-insensitive file system. CI is 7/7 green.


Generated by Claude Code

@guijacquemet
guijacquemet merged commit 1cd94a3 into main Nov 12, 2026
7 checks passed
@guijacquemet
guijacquemet deleted the claude/redesign3-1-viewer branch November 12, 2026 02:52
guijacquemet pushed a commit that referenced this pull request Nov 12, 2026
682e14e)

Not for merging: RELEASE_REF points at main as merged (#284-#287, with #289)
so the owner can test it in Colab. Only RELEASE_REF changes; cell 3 calls
PreprocessingNotebook().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G3qp9AxjpGPw9xfWAUJNqc
@guijacquemet guijacquemet mentioned this pull request Nov 12, 2026
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