Files
ARCADIA-Studio/harness/release-process-fit-layout-audit-20260907.md
Codex e2ecfea69b
Rust checks / check (ubuntu-latest) (push) Canceled after 0s
Rust checks / check (windows-latest) (push) Canceled after 0s
Checkpoint source 7 workflows and in-progress diagram authoring redesign
Preserve current core, source, REST, desktop, recovery, documentation and validation work, including AGENTS.md and the development summary. This is a work-in-progress checkpoint: the new compact palette has outstanding compilation errors and native acceptance; earlier passing gates retain their documented scope.
2026-09-10 10:06:55 -07:00

12 KiB
Raw Permalink Blame History

Process Fit and focused-layout audit

Initial read-only audit followed by the authorized implementation below. Root's BCC1 native routing check passed the short visible path, terminal-stub selection and qualified B selection. This is a separate viewport/layout defect, not a routing regression.

Verified cause

  • behavior/topology.rs:235: Fit uses measured viewport width, but its height term is always 450 / graph.height. The measured Size.height is ignored.
  • behavior/topology/view.rs:316: the inner canvas scroller is assigned (window_height - 360).clamp(190,600); pending forms use (window_height - 510).clamp(160,240). Neither subtracts actual header, palette, qualified-summary or form allocation height.
  • view.rs:324: the sensor surrounds that allocated box plus 8px padding. Iced iced_widget-0.14.2/src/sensor.rs:217,239,250 publishes layout.bounds().size(), not its intersection with the outer viewport. Substituting sensor height for 450 alone therefore leaves the off-screen-box problem.
  • view.rs:559: a second outer scroller contains the entire heading, owner picker, focus button, two palette rows, help, variable navigation and inner canvas. panes divides that page and the independent editor vertically when pending.
  • views.rs:228: Focus removes explorer/inspector only. It does not compact any vertical controls. behavior.rs:717 and view.rs:78–261 explain the tall stack.

For the observed 1444×932 window, canvas top y566 leaves at most 366px even before the footer; Fit can still create 450px of graph. The allocated inner scroller is 572px high, so much of it lives below the outer fold. Seeing Nested below the fold is consistent with the code. The current action fits a synthetic 450px drawing height, not the visible viewport. Outer scrolling can reach it but does not make the Fit claim accurate. Existing test fitting_a_branch_keeps_all_nodes_visible... uses viewport height460 and only asserts450, so never falsifies smaller viewports.

Smallest coherent correction

Keep the existing main/form split and graphical model; replace only the explicit process graph's nested page layout with a height-constrained column:

  1. A stable compact header/control shelf: owner/focus controls, then accessible Tools, Selection details/definition navigation, and Fit/zoom controls. Keep its always-visible rows small (about80–100px at1100×700); place the existing palette, help and full qualified identity text in a bounded scrollable details area opened explicitly. Focus starts with that details area collapsed. Every action and complete From/To identity remains reachable; no silent text truncation or removal of raw-draft guards. Do not collapse/alter the actual pending editor.
  2. The graph scroller takes Fill in the remaining allocated pane height. It must not sit inside an outer scrollable that permits its allocation to extend off-screen. Measure its inner usable viewport, excluding card padding and any scrollbar allowance, independently of scaled graph content.
  3. Fit uses min(available_width/graph_width, available_height/graph_height,1). Preserve the existing bounded minimum zoom policy, but report that limit if a huge graph cannot fit at the minimum; do not promise a full fit in that case. Resizing, opening details, changing qualified selection or opening the form updates this measured area and recomputes Fit. Manual100% stays100% and scrolls.
  4. Preserve panes' independent pending editor with fixed Apply/Cancel above its own process-form scroller. At the existing minimum570px center height, a roughly285px graph pane minus at most100px shelf leaves about185px usable canvas; the editor retains its current approximately200px-or-more field viewport. Without a form, Focus gives most of the center height to the graph.

This should be a bounded topology/view.rs, topology.rs::scale, and layout-test change, with only small state/events for Tools/Selection details if needed. behavior.rs may need its title/owner header factored into the compact shelf. No core/analysis/source/recovery schema change, no expansion of the512-node preview. Persist only existing authored drafts; disclosure/viewport state remains transient.

Scroll-tree and verification boundaries

Keep permanent shelf, canvas and form sibling slots. Put conditionals inside each slot; do not prepend/remove siblings containing the real process-canvas or process-form trees. Retain IDs and owner/document observer identity. A shelf disclosure may resize the graph but must not remount it, change selection or erase manual scroll. The existing unchanged pending-form scroll-state regression is a required falsifier; merely naming a new scrollable with the same ID is insufficient.

Focused checks should exercise the actual shared layout helpers and Iced tree:

  • Minimum1100×700 and native1444×932 available center sizes; graph viewport entirely inside its pane before/after full qualified summary, Tools and pending editor.
  • Fit at measured heights180,320,600 with a tall fixture; every graph bound within measured usable dimensions (unless explicit minimum-zoom limit), and100% unchanged.
  • Real scroll state through select→qualified select→pending form→cancel and focus toggle; full raw invalid draft unchanged and Apply/Cancel always visible.
  • Existing nested picker/definition/Back and reconnect tests unchanged, plus native Fit after100% scrolling and after a resize, with exact accepted source unchanged.

Avoid a patch that merely swaps450 for another window-height estimate or sensor height while retaining the outer clipped allocation. That would leave the measured native failure intact.

Follow-up implementation checkpoint

Owned delta: behavior.rs compact owner header; topology.rs transient Tools/ Selection shelf state and measured Fit; topology/view.rs stable remaining-height explicit graph; topology/layout_tests.rs; one cfg(test) annotation on the unchanged legacy summed-scroll accessor in topology/direct.rs.

The explicit graph now uses a permanent header/shelf/canvas structure. Tools opens its existing authoring palette including Qualified link / assembly…. Selection details opens complete addresses and definition/Back actions. The details scroller is112px (64px with pending editor), or closed by default; the canvas gets remaining Fill height. Its inner sensor measures actual usable space. Fit reserves24px horizontally and10px vertically, keeps5% minimum/100% maximum, and visibly reports when the minimum leaves graph content outside the viewport. Manual zoom behavior is unchanged. The independent editor/actions remain mounted.

Explicit pointer transforms use Canvas offset only; an old ordered-page offset cannot move a hit target. New prepared tests exercise actual mouse selection with Page y370 and Canvas(11,19) at45%/100%, small-height Fit/minimum notice policy, exact rejected raw draft retention during disclosures/focus, and real Iced layout/ scroll operations across compact shelves, form open/close and pane resizing. The existing pending-form canvas-tree regression remains unmodified.

Authorized outer-tree correction: views.rs keeps process main at row child1 through Focus. The sidebar's container remains as a clipped zero-width slot with an empty Space child while focused, so hidden controls cannot intercept input. Inspector is removed only after main. Other page layouts retain their existing branches. A new whole-views::view tree test checks the actual canvas scroll-state marker and exact pending raw draft through Focus/disclosure changes in both layers. This supplements actual layout/scroll tests; it does not claim pixel/native proof. The full-app test proves tree identity, exact disclosure/Focus events and raw state; actual offsets are exercised in the production pane helpers with Iced's debug renderer. That helper additionally scrolls the pending form to600 while requiring canvas(90,180) and pinned actions to remain unchanged. Native full-app offset retention after Focus still needs direct verification.

Six focused process_fit_ tests now pass. Full source list also includes this narrow views.rs seam. Existing pending-form scroll regression is unchanged. Current exact native control path is Tools → Qualified link / assembly… and Selection details → full addresses / Open contribution definition / Back. Focused exit label is Restore panels; old ordered-view layout remains as before.

The current automated gates are recorded below. The earlier564 desktop pass and BCC1 native routing evidence retain their previous-binary scope.

First focused execution and correction

Root's initial compile identified the generic helper's missing text-renderer bound; root applied the required iced::advanced::text::Renderer bound. The next compile succeeded and process_fit_ ran:4 passed,2 failed, preserved in .local/source7-latest-fit-tests-attempt2-scroll.log. Failures were genuine remounting defects: actual canvas offsets became(0,0), and Focus shifted the main tree path.

Locked Iced0.14.2 Row::push and Column::push discard children whose size hints have a Fixed(0) dimension (iced_core::Size::is_void). Thus the supposedly stable zero-height shelf and zero-width sidebar slots disappeared. This was not a wrong ID or first-scrollable test bug. The bounded correction uses Column::from_vec for explicit header/shelf/canvas and Row::from_vec for process sidebar/main; these retain the supplied children verbatim, with Fill dimensions set explicitly. All retention expectations remain unchanged. The local test additionally proves there is exactly one process-canvas ID and that its actual offset is(90,180) before any diff. Corrected source passed the rerun without changing the failed expectations; the original failure remains part of the evidence.

Final gates and runnable preview

.local/source7-latest-preview-status.json records exit0 for every gate:

Gate Result / command duration
Six process_fit_ tests 6/6;54.02s including compilation
Existing pending-form scroll regression 1/1;1.09s
Existing branch Fit/selection regression 1/1;1.73s
Locked workspace binaries build Passed;51.63s
Format check Passed;4.02s
Strict workspace/all-target Clippy Passed;42.95s
Subsequent full desktop 570/570,0failed/0ignored;200.63s command,198.82s tests

The full desktop result is independently recorded in .local/source7-latest-full-desktop-status.json and .local/source7-latest-full-desktop-tests.log. Focus intentionally preserves the chosen disclosure; only its initial default is collapsed. No new accepted-source or recovery fields were introduced by the Fit fix.

Open dist/ArcadiaStudio-preview-source7-20260907-x86_64-pc-windows-gnullvm/arcadia-studio.exe with its runtime files beside it. Alternatively extract the whole corresponding ZIP, then open the executable. This is a development-profile preview. Independent package integrity verification records565files, all37teachingfiles, ZIP SHA256 1fac10b30daf2f8e1dac29e9469485e4bea142e77ff5a13e4c9d1e41ff03abb2, and the adjacent .zip.provenance.json. The executable SHA256 is DC50C887BFE9C73565E3C5DC2AE451BEBC48EC25DF7A1F7C5D97E9C853F2C93A.

Root's native observation on this packaged binary: clean-PATH launch succeeded; the accepted OA caller graph at1444×932 fitted at68% with all four cards visible. A1102×932 width was also observed, not the700-pixel minimum-height case. The user's Escape stopped Computer Use before final checks. The app may remain open; no clean-close or final unchanged model/source oracle is claimed. The remaining minimum-height, pending-form, disclosure/Focus scroll and broader OA/SA native cases above remain acceptance work.