From c6c07cc3a36373ffe956f2390cd2edc5f577a4b0 Mon Sep 17 00:00:00 2001 From: "sorokin.oleg.edu" Date: Sun, 6 Sep 2026 05:32:34 +0300 Subject: [PATCH] Improve scenario tool feedback and keep draft actions visible --- crates/oa-desktop/src/behavior.rs | 28 +++++++-- crates/oa-desktop/src/behavior/scenario.rs | 60 ++++++++++++-------- harness/STATE.md | 66 +++++++++------------- harness/TASK_LEDGER.md | 5 +- harness/release-scenario-editing.md | 22 ++++++++ 5 files changed, 114 insertions(+), 67 deletions(-) diff --git a/crates/oa-desktop/src/behavior.rs b/crates/oa-desktop/src/behavior.rs index da4cf658..6edeb550 100644 --- a/crates/oa-desktop/src/behavior.rs +++ b/crates/oa-desktop/src/behavior.rs @@ -878,11 +878,14 @@ impl Scene { MessageKind::Timer { .. } => "timer · ", } }; - let message_label = if let MessageKind::Timer { expression } = message_kind - { - expression.as_str() + let message_label = if !scenario { + r.map(|r| r.name.clone()).unwrap_or_else(|| e.name.clone()) + } else if let MessageKind::Timer { expression } = message_kind { + format!("{} · {expression}", e.name) + } else if let Some(exchange) = r.filter(|r| r.name != e.name) { + format!("{} · {}", e.name, exchange.name) } else { - r.map(|r| r.name.as_str()).unwrap_or(&e.name) + e.name.clone() }; self.lines.push(Line { id: *id, @@ -1603,6 +1606,23 @@ mod direct_canvas_tests { }) } #[test] + fn reused_exchange_messages_display_their_distinct_occurrence_names() { + let mut f = scenario::direct_tests::fixture(); + f.project.elements.get_mut(&f.call).unwrap().name = "Route request".into(); + f.project.elements.get_mut(&f.reply).unwrap().name = "Route response".into(); + let scene = Scene::sequence(&f.project, f.owner, f.call); + let call = scene.lines.iter().find(|line| line.id == f.call).unwrap(); + let reply = scene.lines.iter().find(|line| line.id == f.reply).unwrap(); + assert!(call.label.starts_with("1. call · Route request")); + assert!(reply.label.starts_with("2. reply · Route response")); + assert!(call.label.ends_with(&f.project.relations[&f.exchange].name)); + assert!( + reply + .label + .ends_with(&f.project.relations[&f.exchange].name) + ); + } + #[test] fn direct_drag_and_click_click_use_ordered_sources_and_publish_once() { for drag in [false, true] { let (f, scene) = scene(); diff --git a/crates/oa-desktop/src/behavior/scenario.rs b/crates/oa-desktop/src/behavior/scenario.rs index c3e97637..95e00ea4 100644 --- a/crates/oa-desktop/src/behavior/scenario.rs +++ b/crates/oa-desktop/src/behavior/scenario.rs @@ -1254,10 +1254,16 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen if !pending { out = out.push( row![ - button("Select / reorder").on_press(Message::ScenarioCanvas(CanvasEvent::Choose( - context, - CanvasTool::Select - ))), + button("Select / reorder") + .on_press(Message::ScenarioCanvas(CanvasEvent::Choose( + context, + CanvasTool::Select + ))) + .style(if tool == CanvasTool::Select { + style::selected + } else { + style::nav + }), pick_list( vec![ MessageStyle::Asynchronous, @@ -1277,10 +1283,16 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen .text_size(12) .padding(8) .width(Fill), - button("Draw message").on_press(Message::ScenarioCanvas(CanvasEvent::Choose( - context, - CanvasTool::Message(style) - ))), + button("Draw message") + .on_press(Message::ScenarioCanvas(CanvasEvent::Choose( + context, + CanvasTool::Message(style) + ))) + .style(if matches!(tool, CanvasTool::Message(_)) { + style::selected + } else { + style::nav + }), ] .spacing(6), ); @@ -1314,7 +1326,7 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen horizontal: scrollable::Scrollbar::default(), }) .height(if pending { - (app.window_size.height - 500.).clamp(160., 260.) + (app.window_size.height - 660.).clamp(110., 190.) } else { (app.window_size.height - 410.).clamp(180., 340.) }), @@ -1524,24 +1536,28 @@ pub fn view<'a>(app: &'a App, owner: Id, mut out: Column<'a, Message>) -> Elemen if let Err(error) = &readiness { form = form.push(label(error.clone())); } - form = form.push( - row![ - button("Create") - .padding(9) - .on_press_maybe(readiness.is_ok().then_some(event(Event::Submit))), - action("Cancel", event(Event::Cancel)) - ] - .spacing(7), - ); + let footer = row![ + button("Create") + .padding(9) + .on_press_maybe(readiness.is_ok().then_some(event(Event::Submit))), + action("Cancel", event(Event::Cancel)) + ] + .spacing(7); out = out.push( - container(scrollable(form).height((app.window_size.height - 470.).clamp(190., 280.))) - .padding(14) - .style(style::card), + container( + column![ + scrollable(form).height((app.window_size.height - 650.).clamp(110., 240.)), + footer + ] + .spacing(9), + ) + .padding(14) + .style(style::card), ); } if lines(p, owner).is_empty() && p.elements[&owner].steps().is_none_or(Vec::is_empty) { out = out.push(container(label("Add lifelines for the participating work or actors, then create messages between them.")).padding(16).width(Fill).style(style::card)); - } else { + } else if !pending { out = sequence_rows(p, owner, out); } super::scenario_scroll::observe(context, ScrollArea::Page, scrollable(out.padding(24))) diff --git a/harness/STATE.md b/harness/STATE.md index fa48034d..6e4e0701 100644 --- a/harness/STATE.md +++ b/harness/STATE.md @@ -182,46 +182,34 @@ The independent bounded-browser review reports no remaining medium/high finding. Linux native R6 workflows remain a root-owned acceptance gate. See release-data-verification.md. Main remains a8f451e; R6 is not yet accepted. -## Latest root runtime checkpoint — Computer Use stopped by user +## Latest root checkpoint — native scenario trial and refinement -User physically pressed Escape during the first combined-Windows capture. Root -stopped all Computer Use input; new native authorization is required. Before that, -Linux b35dede launched but its first capture timed out awaiting WSLg app access. -The pending async question asks whether to retry Linux and approve the window. -Do not interpret elapsed time as permission. Code work remains authorized. +User reauthorized Computer Use; root resumed on the frozen combined dfd2e41 +Windows binary. Its 1440x900 trial created a named Call/Reply pair at a middle +slot, set Origin/Latitude to route.origin.latitude, blocked navigation without +losing the pending draft, and verified Undo/Redo plus Save All. The saved model +has57 objects/5 links/3 expected checks in ui-scenario-data-windows-dfd2e41/model. +Valid reordering retained occurrence selection. Moving a reply before its call +was rejected without history; Undo restored the preceding valid reorder. Inner +scroll and injected Escape canceled armed message gestures. Saved trial exec63022 +closed normally with exit0 and no output. Older exec43338/57994 also exited0. -b35dede Windows native property browser passed at1440x900 and1100x700:32-field -pages showed distinct names, page/root navigation did not edit the field/expression, -recursive Origin/Next coordinate/Latitude was selected, expression changed to -origin.next.latitude + 0.5, Save All/reopen preserved it and the separate Destination -value. The reopened properties confirmed the path/expression. Windows app1966548 -closed normally; exec94220 exited0 with only newline. Frozen binary SHA256 -717B8D5AFF501F42473E043BD49EE3E5E017ABBBC84AB8C3AE85AA37121FBD50. -Evidence/model: ui-r6-browser-windows under the release evidence directory. +Observed UI issues are being fixed locally: identical tool styling, exchange +names obscuring distinct message names, and draft Create/Cancel hidden by nested +scrolling. Root owns scenario.rs plus occurrence label construction in behavior.rs. +Native verification of the fixes, ALT/reuse/resize and Linux workflows remains. +Combined Linux286 desktop tests, strict all-target Clippy and release build pass; +logs desktop{-clippy,-release}-dfd2e41.log in Linux target/linux-verification. -b35dede Linux264 tests, strict Clippy and optimized build passed. Frozen ELF in -ui-r6-linux SHA256 EEDF02913CE69C4D5F2B820A48E375A0D22791A2CEC721D9E29F5532370B9E40. -Its exec43338 is still running; last listed WSLg window4524780. No Linux R6 native -interaction/visual acceptance occurred. Do not reuse old bindings without inventory. +Semantic core/source5 checkpoint346fb24 passed345 core tests (one intentional +ignored probe) and strict Clippy; independent nine-finding recheck is closed. +Semantic checkout server test checkpointc746ab6 passes42 existing server tests +and strict Clippy after seven current-output assertions changed to5. Semantic API +production additions were rejected twice by automatic approval review; a direct +authorization question is pending. No API route bodies were retained. Spec work +continues independently. Process direct editing is active in codex/process-direct. -DATA and Linux integration checkouts fast-forwarded to combined1bf8ebc (production -merge dfd2e41). Windows286 tests, strict Clippy/release pass, independent scenario -recheck has no medium/high finding. Combined Windows frozen binary in -ui-scenario-data-windows-dfd2e41, SHA256 -8BC031CF6124859D31082BB0FFB0335C406D54E12ECAD8493CE50A23923E5589, -exec57994 running; first capture stopped by user, no native acceptance. Linux -combined286 tests passed; Clippy/release still running in exec27433. Root owns -both integration targets and native. Poll exact session/logs before recording pass. - -Semantic core remains isolated and under independent review. Original five findings -were fixed; four additional constructor/canonical/reset/artifact-owner findings -prompted immutable independent proposals, agreement over canonical target slots, -one application and final expected/prepared audits. Core is running new regressions; -do not accept until independent recheck. Historical closed facts may outlive current -families; current-family applicability applies to new review resolutions. A proposed -stronger historical gate was withdrawn as inconsistent with that contract. - -Next: finish core gates/review and process-editing design; after native permission, -resume R6 Linux and combined scenario Windows/Linux workflows in their copied models. -Then source5 semantic GUI/API/spec integration and remaining release milestones. -No goal completion or blocked status is justified by this single native interruption. +Next: verify scenario UI fixes on Windows/Linux; integrate semantic core/source, +spec and authorized API; implement semantic GUI; integrate direct process editing. +Broader coverage/lifecycle/hosted/help/release gates in PLAN remain active. Main +is4101434 (docs pointer on productiona8f451e); this integration is not yet accepted. diff --git a/harness/TASK_LEDGER.md b/harness/TASK_LEDGER.md index 8dae8c7b..10d11ca8 100644 --- a/harness/TASK_LEDGER.md +++ b/harness/TASK_LEDGER.md @@ -73,5 +73,6 @@ Finish and independently verify R6, then semantic R3 reconciliation and direct scenario/process gestures. Complete lifecycle/recovery, hosted editing, guidance and fresh cross-disciplinary Windows/Linux acceptance. No subsystem checkpoint completes the first release. Current work is making measured implementation, -review and runtime progress. User stopped Computer Use with Escape after Windows -R6 verification; native input awaits reauthorization, while code work continues. +review and runtime progress. User reauthorized Computer Use. Root resumed combined Windows scenario tests; +middle insertion, history, save, reorder and scroll/Escape cancellation passed. +Three native UI findings are being refined; Linux acceptance remains pending. diff --git a/harness/release-scenario-editing.md b/harness/release-scenario-editing.md index c28ba909..1ed70390 100644 --- a/harness/release-scenario-editing.md +++ b/harness/release-scenario-editing.md @@ -234,3 +234,25 @@ workflow. Its Windows/Linux native tasks remain pending, including scroll/resize cancellation, middle/operand insertion, execution spans and save recovery. Root owns final integration into main and native acceptance; process editing remains outside this task. + + +## Root combined Windows native trial — 2026-09-06 + +Frozen dfd2e41 binary above, 1440x900. Native drag inserted Routed request and +its correlated reply before the original third call. The Origin/Latitude value +route.origin.latitude was authored in the bounded browser. Navigation while +pending retained the draft. Create produced57 objects; Undo removed both messages +(55), Redo restored them, Save All persisted the pair and qualified value. Saved +steps are original call/reply, Routed request/reply, original second call/reply. +Valid selected-message reorder retained selection; invalid reply-before-call +reorder reported reply_order and added no history. Undo restored the saved order. +Inner-canvas scrolling and injected Escape cleared armed source gestures, verified +by the next lifeline click starting a new source without completing a draft. +The saved app closed normally (exec63022 exit0, no runtime output). + +Native findings: active/inactive tools looked identical, line labels used the +shared exchange name despite distinct occurrence names, and Create/Cancel needed +inner and outer scrolling. Root is refining those three issues before accepting +the milestone. ALT/reuse/resize/save recovery and Linux native remain pending. + +Root UI refinement checks:287 desktop tests passed, strict all-target desktop Clippy passed, optimized Windows desktop build passed. Native verification of this refinement remains pending.