# Independent process Fit/layout review — 2026-09-07 Scope: read-only review of the frozen desktop change in `behavior.rs`, `behavior/topology.rs`, `behavior/topology/view.rs`, `behavior/topology/layout_tests.rs`, the test accessor in `behavior/topology/direct.rs`, and the narrow process sidebar/main seam in `views.rs`. App dispatch and process-canvas handlers were inspected as dependencies. No Cargo, native input, production edits or VM activity by this reviewer. **Updated result: the constructor correction passed all six focused Fit tests and the full 570-test desktop suite.** The first executed filter exposed a real defect missed by the initial static review (four passed, two failed): Iced dropped zero-size sibling slots, remounting the canvas/main tree. The independently reviewed correction closed both failures without weakening their expectations. Current packaged native evidence is bounded below; broader native acceptance remains open. BCC1 routing and the earlier full 564-test/native results precede this layout change. | Boundary | Inspection and remaining evidence limit | | --- | --- | | Available canvas versus graph size | Explicit topology now has fixed header/details/canvas sibling positions. The inner canvas scroller and enclosing card use Fill; its sensor measures the scroller allocation after card padding. The removed scrolling page ancestor cannot allocate an apparently large viewport below its visible clip. Fit uses the measured width and height with scrollbar gutters. Layout tests exercise production pane builders with tall content, pending forms and several center-pane sizes. These are representative pane allocations, not a rendered measurement of the whole app at 1100×700. | | Fit and manual zoom | Fit clamps at 5–100%, reports when the 5% minimum still exceeds available area, and leaves both-axis scrolling available. Manual zoom remains 50–200% and independent of viewport changes. Header wrapping and the limit hint change the measured remaining height; they do not become part of the graph's content size. A first-layout fallback is explicitly provisional. | | Pointer coordinates | Explicit graphs now apply only the Canvas offset. A stale ordered-view Page offset no longer shifts clicks. The new real canvas-input regression retains Page=370 and checks selection at scales .45 and 1.0 with nonzero Canvas offsets. Existing qualified/direct hit ordering is unchanged by this delta. | | Focus and disclosure state | The process main widget remains row child 1. Focus replaces sidebar contents with a clipped zero-width Space while leaving the main slot stable; inspector removal occurs after main. Permanent inner shelf/canvas and diagram/form slots avoid sibling-index changes. Focus intentionally preserves the current disclosure choice; initial shelves are closed. Full qualified addresses and definition actions remain in the scrollable Selection details shelf. | | Raw pending actions | Shelf changes do not start or submit forms, so App dispatch admits them with a pending behavior draft. Focus remains view-only. Apply/Cancel stay above the independently scrolling form. Owner/definition changes remain behind existing pending guards; this change does not clear raw fields to permit navigation. | ## Review corrections and test scope The initial new tests preserved draft bytes but did not assert that dispatched shelf events actually changed state; a swallowed event could therefore satisfy them. The worker added explicit Tools → Selection → None assertions and Focus boolean assertions. The local real-Iced scroll test now also moves the pending form to y=600, checks pinned actions, and retains canvas translation (90,180). The passing whole-app test uses the actual `views::view` tree and App dispatch, checking a marker at the canvas ancestor through Focus/disclosure/form changes, together with exact raw recovery DTO and accepted snapshot identity. This establishes stable tree identity, **not** actual whole-app canvas/form scroll offsets after renderer layout. The passing local production-builder layout/scroll tests provide the complementary geometry evidence. ## Executed falsifier and constructor correction The first six-test run passed four and failed the actual canvas-scroll retention and whole-app tree-path tests. These were genuine implementation failures, not expectations to relax. The initial review's assumption that syntactically permanent slots imply permanent widget-tree children was false: locked `iced_widget` 0.14.2 `Row::push` and `Column::push` inspect `size_hint().is_void()` and omit zero-size children. Thus the collapsed details shelf disappeared before canvas, and the zero-width Focus sidebar disappeared before main. The worker changed only these two constructors to `Column::from_vec` and `Row::from_vec`. Independent source inspection confirms that `from_vec` retains the supplied children without filtering. Both callsites explicitly set Fill width/height because this constructor also skips automatic child sizing inference. The optional form is after the diagram, and the inspector remains after main, so neither can shift the preceding canvas path. No padding, tool, pointer or semantic behavior was changed by this correction. The two failing expectations remain unchanged. An added assertion establishes a unique actual `process-canvas` ID and translation (90,180) before any tree diff, ruling out a meaningless unscrolled baseline. The generic text-renderer bound was also corrected to compile the helper with the real scroll widget. No further blocking defect was found in the narrow constructor fix; the successful rerun closes both observed failures. ## Final automated gates and packaged native observation Authoritative `.local/source7-latest-preview-status.json` records all six gates exit0: Fit6/6 (54.02s command including compile), existing pending-scroll1/1 (1.09s), existing branch-fit1/1 (1.73s), locked workspace bins build51.63s, format4.02s, strict workspace/all-target Clippy42.95s. `.local/source7-latest-full-desktop-status.json` records exit0/200.63s; its log reports570passed/0failed/0ignored,198.82s test execution. Initial failures remain in `source7-latest-fit-tests-attempt2-scroll.log`; the passing run is `source7-latest-fit-tests.log`. The verified development-profile preview is `dist/ArcadiaStudio-preview-source7-20260907-x86_64-pc-windows-gnullvm/arcadia-studio.exe`, SHA256 `DC50C887BFE9C73565E3C5DC2AE451BEBC48EC25DF7A1F7C5D97E9C853F2C93A`. Root launched it with a clean PATH. At1444×932 the accepted OA caller graph showed all four cards at Fit68%; width1102 at height932 was also observed. This is not1100×700 evidence. The user's Escape ended Computer Use before final verification; no clean shutdown or final model/source oracle is claimed, and the app may remain open. To run, open that executable with its adjacent runtime files intact, or extract the entire corresponding ZIP first. Independent package verification records565files/all37teachingfiles and ZIP SHA256 `1fac10b30daf2f8e1dac29e9469485e4bea142e77ff5a13e4c9d1e41ff03abb2`; the `.zip.provenance.json` preserves the build/source capture. Package integrity and this limited native observation do not close the remaining checks below. ## Required native recheck on the new binary At 1100×700, with both panels and with Focus: exercise Fit on a tall expanded OA and SA process; open Tools and Selection details and reach the last control/full nested identity; open an invalid raw contribution form, scroll its final fields and use its pinned actions; toggle disclosures/Focus and verify raw text plus manual canvas/form scroll remain usable. Check both minimum-fit scrolling and ordinary fit without clipping, then click a qualified mini endpoint and a selected direct reconnect anchor after scrolling. Repeat resize and guarded owner navigation. These checks should use the new build's hash; the earlier BCC1 routing oracle is not a substitute.