Improve scenario tool feedback and keep draft actions visible

This commit is contained in:
2026-09-06 05:32:34 +03:00
parent b2d713e774
commit c6c07cc3a3
5 changed files with 114 additions and 67 deletions
+24 -4
View File
@@ -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();
+38 -22
View File
@@ -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)))
+27 -39
View File
@@ -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.
+3 -2
View File
@@ -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.
+22
View File
@@ -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.