8.9 KiB
Independent contextual source layout review — 2026-09-11
Codex-9e8r6t /root/behavior_audit. Source review closed after one concrete visibility correction; no remaining material finding in the bounded slice. Prepared tests, compilation and native acceptance remain distinct. This reviewer made no production changes, compiler execution, Git mutation or native input.
Observed acceptance boundary
Read Gitea issue 1 and issue 2, current AGENTS instructions, the Authoring20260911 Wiki and release-contextual-source-layout-review-20260911.md. Independently inspected the supplied screenshot .local/native-qa/contextual-source-20260911-v1/oa-source-open-clipped-name.png, SHA256 e59f32d493fe1c46981ed74e85fa622c0eaaafe01ce33aa04da9e5a4bbce9fb7d.
The image confirms the source Name input is focused but mostly clipped below the approximately 130px inner viewport. Introductory heading/context/explanation and the single Activity action precede the input; Back/Use remains visible below the scroller. The unchanged immutable GUI is 52DE82E434B636E18DB02D381842AA6DB84B721CFFD5502063F784F37246ACCE at the root-reported 1100×700 client size.
Root ratified essentials-first presentation confined to behavior/source_draft.rs. This adjacent correction does not close issue 2 or take ownership of the external process/scenario canvas design, workspace allocation or FormShown/focus changes. Source/consumer names, typed source selection, semantic ownership, invocation tokens, draft/recovery and final atomic admission remain existing contracts.
Independent review targets
- At zero source-body scroll, the short actual composition must expose the complete Name input, current permitted/selected kind and current layer-root parent summary. Multiple permitted kinds must remain explicit choices rather than an implicit semantic selection.
- Long context or recovered selected-parent names must not displace the initial Name or pinned Back/Use footer. Any shortened presentation must leave the raw source/consumer/parent state exact.
- The inner source field scroller remains bounded and independent; Back/Use stays outside it. Rendering and presentation controls must not mutate the accepted model/source, alter invocation guards or change canvas scroll/focus state.
- The mounted regression must meaningfully distinguish the old intro-first layout at the observed short height. A unit renderer with zero paragraph bounds or a footer-only assertion is insufficient evidence for this failure.
The author accepted the last concern before freeze: the test renderer uses iced::advanced::graphics::text::Paragraph for real text shaping. This is meaningful nonzero paragraph geometry, while still requiring the native font/layout check below.
Concrete finding and correction
The first freeze, source_draft.rs SHA256 1b5a0ec54e6cc9746f4664b70d7db79ebc769284953d1d679d15d9b0f15a9bb7, put the complete selected-parent name/kind/alias before the multi-kind row. A recovered ParticipantInteraction draft can have an arbitrarily long existing Entity parent: validation::parent_permits permits an Actor/Entity/Role under that Entity. The unbounded wrapping therefore pushes every explicit Entity/Actor/Role choice below the short viewport. The initial long-parent test used single-kind Work and increased total host height to 235px, so it did not falsify this case.
This was a usability/coverage finding, not a source-command or recovery corruption. Sent the concrete counterexample to root and the author before compilation. The corrected freeze moves the wrapped explicit choices before the parent summary. Full authored parent detail remains available in the scroller; it is not truncated in state or falsely claimed to fit arbitrary text into 130px.
Readback at SHA256 89b08ef68f5c28e28f2f9feaebe67e0be5b84efca1bfa6d64b4029c965701de4 closes the finding. The extended long-parent test serializes/reloads an OA ParticipantInteraction draft with selected Actor and a long existing Entity parent, then mounts the same 340×215 composition. It requires all three kind rectangles and Name to fit inside the initial field viewport; all kinds precede the parent; the parent label/first line begins visibly; the full summary actually exceeds the viewport height; full parent name/alias and raw recovered state remain exact. The initial parent-before-kind freeze would fail these conditions.
Final implementation and test readback
At source_draft.rs:327, a compact heading precedes the 14-point Name input. A single allowed kind replaces its redundant button only when it equals the actual draft kind. A missing/invalid single-kind recovery keeps an explicit repair action; rendering does not select a kind. Multi-kind actions remain individually token-bound and styled for the selected kind, inside a wrapped row before the parent summary at lines 343–384. The longer contextual/atomic explanation follows the essentials.
Compared the original committed file from Gitea MCP at df6f59562643b7771ecf0c972f8655f3e3f1c4da with the reviewed source using explicit UTF-8 and normalized line endings. The MCP bytes independently match their declared Git blob 7c5dced53d38567c6b4d250bde553ef74fc1d940. All pre-view state/serialization/token/update/combination code, Draft::command, existing parent search/pagination/actions and pinned footer are unchanged. An initial comparison used Windows' default local-file encoding; repeating with explicit UTF-8 removed that harness-only text mismatch. There was no MCP or production encoding defect.
The behavior-source-fields scroller and behavior-source-actions footer keep their existing identities, bounded Fill composition and separation. Name remains NAME_INPUT. No App, scenario/topology workspace allocation, FormShown event, canvas viewport/scroll state, source planner or semantic guard changed in this source-card correction. The real scenario and topology child hosts were read back: both render a 12-point retained consumer caption, 6px gap and child Fill; the test reproduces that composition at the observed short total height. The machine host has the same shape with its own caption.
Three prepared test functions cover:
- OA/SA Work, four strict lifeline viewpoints and both machine layers at 340/500 widths and 215px total height; nonzero actual paragraphs, zero scroll offset, measured 125–132px field viewport, fully contained Name/root-parent/explicit-kind rectangles, footer containment/separation, and missing single-kind recovery.
- Moderate wrapped selected-parent and long Unicode caption controls, plus the corrected overflowing multi-kind recovery case at the same minimum height, with exact raw name/parent snapshot retention.
- Actual mounted mouse press/release events for each OA participant kind and focused Unicode Name input. Emitted events carry the current token; handling the Name event preserves the accepted Project and does not implicitly choose a kind. The kind-click portion checks event production, not subsequent semantic adoption.
These assertions address the observed clipping and the independent counterexample. They are prepared source evidence at this handoff, not a test pass or native result. The full scenario/topology workspace is not mounted by these new tests; root's actual host/native check remains necessary.
Adjacent staged-owner caption readback
Palette requested the coordinated readback before the same combined gate. At creation.rs SHA256 0fb19be3a5688c4bd3ca3643c47a97da7e7f85add8a860cd046a0d9cb3ce9dfc, the narrow picker_view delta suppresses the misleading accepted-catalog Selected/Missing row only when Owner selection exactly matches State::label's staged draft ID. That case already has the explicit New owner label above and now offers the correctly named existing-participant alternative. A different or genuinely missing accepted owner still takes the existing reference-label path; Context behavior, choice eligibility, search and event dispatch remain unchanged. No material finding in this display-only delta; no new execution claimed.
Remaining acceptance and scope
Author owns the serialized focused compile/tests and matching GUI/lint. Root must use the rebuilt artifact at actual 1100×700 with ordinary panels: open the source child without scrolling, see complete Name/current kind/root parent, type visibly, confirm Back/Use reachability, and repeat a multi-kind/long-parent recovery and wider-host control. Full overflow text may scroll below the visible parent-label beginning. Rendering must leave accepted model/source and canvas offsets unchanged; semantic adoption/history still uses the independent existing oracle.
The first GUI52DE82 observation and its original evidence remain unchanged. Source closure here neither transfers native acceptance from that old binary nor closes issue 2's broader canvas-workflow requirement. Only this new independent report was written by the reviewer; prior reports, production and common ledgers remain under their assigned owners.