diff --git a/harness/drag-out-20260925.md b/harness/drag-out-20260925.md index 9f11ab76..8b5d8d70 100644 --- a/harness/drag-out-20260925.md +++ b/harness/drag-out-20260925.md @@ -68,6 +68,15 @@ clipped-card identification/regrabbing, native Undo/Redo and Save/reopen remain unverified. The issue remains open; no integration or release acceptance follows from the targeted gates. +Test-only successor `24b1eab07d306d8cb091bb46f7daf9f027a8f1c0` additionally +checks an actual fallback blocked by unrelated work, including preservation of +an existing redo branch, and an outgoing move while an allocated sibling keeps +the source enclosure expanded. Both run for OA and SA. All 123 allocation-drag +tests and strict desktop Clippy pass at that successor. Fresh independent review +confirms those tests exercise their claimed invariants, with no material source +finding in this scope. The same linked evidence includes the new logs and review; +production code and native-acceptance limits remain unchanged. + The first build attempt failed before tests because the sparse checkout omitted `build/windows_manifest.rs`; restoring the tracked build directory corrected the checkout. The local drive initially had about 22 MB free. Git sparse checkout and diff --git a/harness/experiments/architecture-perf-20260925/.gitattributes b/harness/experiments/architecture-perf-20260925/.gitattributes new file mode 100644 index 00000000..817a7482 --- /dev/null +++ b/harness/experiments/architecture-perf-20260925/.gitattributes @@ -0,0 +1 @@ +*.log -text diff --git a/harness/experiments/architecture-perf-20260925/README.md b/harness/experiments/architecture-perf-20260925/README.md new file mode 100644 index 00000000..b96e4078 --- /dev/null +++ b/harness/experiments/architecture-perf-20260925/README.md @@ -0,0 +1,91 @@ +# Small architecture diagram CPU investigation + +Question: does core projection/routing explain [issue 44's low FPS](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/44) +with roughly eight architecture cards? This experiment narrows that question; +it neither reproduces native frame rate nor establishes a complete cause. + +## Workload and source + +The screenshot uses names from `examples/release1`. Its exact model, projection, +camera and authored geometry are unavailable. The probe loads the unchanged +`examples/release1/model.json`, measures its five saved views, and constructs a +clearly labeled eight-card SA Overview approximation using those semantic +elements. Approximate coordinates and stable placement IDs are in the probe; +it has 8 projected nodes, 6 ports and 13 projected edges. It is not a recovered +copy of the user's diagram. All data changes occur in memory. + +Source: `24b1eab07d306d8cb091bb46f7daf9f027a8f1c0`; core, manifest and lockfile +are unchanged from the drag contribution's `1a669130` production source. +Windows 10.0.26200, Rust 1.98.1, x86_64-pc-windows-gnullvm, LLVM-MinGW +20260908 UCRT, reported CPU Intel Core i7-10870H with 4 exposed cores/threads. +The probe was optimized with `-O` and linked to the existing **unoptimized +development-profile core library** used by the completed desktop test build. +This distinction matters: optimizing the driver does not optimize that library. +The desktop test process had completed before measurement; no Cargo compilation +was started until after measurement. Other operating-system workloads were not +controlled, so outliers are retained rather than interpreted as stable capacity. + +## Method and results + +Each phase gets 3 warmups and 40 timed samples, with returned values passed to +`black_box`. Reported p50/p95 select sorted index `ceil((n-1)*p)` as implemented +in the source. Returned output destruction is outside each timed phase. Diagram +movement uses a deterministic small delta sequence and the existing descendant +and authored-route translation APIs. Index creation, projection, routing, and +combined movement preparation are measured separately. The probe does not model +allocation transaction admission or an Iced frame. + +For the eight-card approximation, `performance-01.log` records: + +| Phase | p50 ms | p95 ms | max ms | +| --- | ---: | ---: | ---: | +| Reused-index projection | 0.3885 | 0.7550 | 1.2965 | +| Fresh-index projection | 1.7135 | 2.7022 | 4.2204 | +| Settled routing | 2.4525 | 4.4617 | 4.7735 | +| Moved routing | 3.1907 | 4.4781 | 4.5672 | +| Movement preparation + projection + routing | 4.2640 | 6.8259 | 8.8052 | + +This workload does not expose severe core latency sufficient by itself to +explain very low FPS. It does not rule out different authored routes, allocation +admission, hardware/rendering, or the user's exact scene. Repeated fresh-index +projection has a measurable cost, but no change is justified solely by this +small sample. No FPS or performance-fix claim follows. + +## Source observations and next discriminating measurement + +Independent read-only hot-path review found that `DiagramCanvas::scene` already +caches projection and routing by semantic context and transient geometry. +Ordinary node movement changes preview geometry and routes the full view; +route gestures use `route_edge_preview`. Ordinary hover need not reroute. + +`diagram/port_labels.rs` requests redraw on every mouse event, including when +no tooltip is visible. `DiagramCanvas::draw` rebuilds geometry and each dot-grid +circle on every draw. At a 1900x660 canvas this yields about 2,240 circles at +zoom 1 and 6,528 at minimum spacing. Scene caching does not cache that geometry. +`views.rs` also performs an unindexed `project_view` during app view rebuilding; +legacy node-motion redraw does not itself require that full UI rebuild. + +Next, measure actual canvas draw/frame costs independently for idle hover, pan, +ordinary node drag and allocation drag, with grid generation separated from +node/edge/text rendering and frame presentation. Compare the same scene/camera +and renderer before changing production code. Native automation was stopped +with Escape; no GPU/frame measurement was attempted in this experiment. Live +ownership and subsequent results belong to issue 44. + +## Reproduction + +Build `oa-core` at the identified source with the stated Windows toolchain, then +compile this standalone probe against that exact library and matching dependency +directory. For a fresh standard Cargo development build: + +```powershell +cargo build --locked -p oa-core +rustc --edition=2024 -O harness/experiments/architecture-perf-20260925/architecture_perf_probe.rs --extern oa_core=target/debug/liboa_core.rlib -L dependency=target/debug/deps -C linker=clang.exe -o architecture_perf_probe.exe +./architecture_perf_probe.exe examples/release1/model.json 40 +``` + +The actual run linked `target/debug/deps/liboa_core-2f3c5174cb6398fd.rlib` +and used the same dependency directory. Set the linker/runtime PATH as required +by the Windows toolchain. Compiler flags, core profile, machine load and fixture +all affect timings; preserve them when comparing candidates. This standalone +probe is experimental evidence, not a production dependency or a timing test. diff --git a/harness/experiments/architecture-perf-20260925/architecture_perf_probe.rs b/harness/experiments/architecture-perf-20260925/architecture_perf_probe.rs new file mode 100644 index 00000000..6cd7e336 --- /dev/null +++ b/harness/experiments/architecture-perf-20260925/architecture_perf_probe.rs @@ -0,0 +1,166 @@ +//! Local-only CPU diagnosis. Does not measure native FPS, canvas redraw, or GPU. +//! Usage: architecture_perf_probe.exe PATH_TO_RELEASE1_MODEL_JSON [SAMPLES=40] +use oa_core::{persistence, projection, routing, view_options::ViewIndex, *}; +use std::{collections::BTreeMap, hint::black_box, time::Instant}; + +fn measure(label: &str, samples: usize, mut f: impl FnMut(usize) -> T) { + for i in 0..3 { + black_box(f(i)); + } + let mut ms = Vec::with_capacity(samples); + for i in 0..samples { + let start = Instant::now(); + let output = black_box(f(i)); + ms.push(start.elapsed().as_secs_f64() * 1000.0); + drop(output); // Exclude destruction consistently from each timed phase. + } + ms.sort_by(f64::total_cmp); + let percentile = |p: f64| ms[((samples - 1) as f64 * p).ceil() as usize]; + println!( + "{label}: n={samples} p50_ms={:.4} p95_ms={:.4} max_ms={:.4}", + percentile(0.5), + percentile(0.95), + ms[samples - 1] + ); +} + +fn probe(p: &Project, d: &Diagram, samples: usize) { + let index = ViewIndex::new(p); + let view = projection::project_diagram_with_index(p, d, &index); + println!( + "\nview={} projection={:?} nodes={} ports={} edges={}", + d.name, + d.projection, + view.nodes.len(), + view.ports.len(), + view.edges.len() + ); + measure("index_new", samples, |_| ViewIndex::new(black_box(p))); + measure("projection_reused_index", samples, |_| { + projection::project_diagram_with_index(black_box(p), black_box(d), black_box(&index)) + }); + measure("projection_fresh_index", samples, |_| { + projection::project_diagram(black_box(p), black_box(d)) + }); + measure("routing_settled", samples, |_| { + routing::route_diagram(black_box(p), black_box(d), black_box(&view)) + }); + // Deterministic slight motion of the first root card. Includes the same + // descendant/route translation as legacy single-card canvas drag. This is + // presentation-only, not the allocation transaction pipeline. + let Some(root) = view.nodes.iter().find(|n| n.visual_parent.is_none()) else { + return; + }; + println!("moving_root={} element={}", root.id, p.named(root.element)); + let mut moved = projection::descendant_nodes(p, d.id, root.id); + moved.push(root.id); + let make_moved = |i: usize| { + let delta = Position { + x: (i % 21) as f32 * 3.0, + y: (i % 11) as f32 * 2.0, + }; + let mut preview = d.clone(); + let deltas = moved + .iter() + .map(|id| (*id, delta)) + .collect::>(); + for route in projection::translated_routes(p, d, &deltas) { + if let Some(stored) = preview.routes.iter_mut().find(|r| r.edge == route.edge) { + *stored = route; + } else { + preview.routes.push(route); + } + } + for id in &moved { + if let Some(n) = preview.nodes.get_mut(id) { + n.position.x += delta.x; + n.position.y += delta.y; + } + } + preview + }; + let previews = (0..samples.max(3)).map(make_moved).collect::>(); + let projected = previews + .iter() + .map(|d| projection::project_diagram_with_index(p, d, &index)) + .collect::>(); + measure("moved_projection", samples, |i| { + projection::project_diagram_with_index(p, black_box(&previews[i]), &index) + }); + measure("moved_routing", samples, |i| { + routing::route_diagram(p, black_box(&previews[i]), black_box(&projected[i])) + }); + measure("moved_prepare_projection_routing", samples, |i| { + let preview = make_moved(i); + let view = projection::project_diagram_with_index(p, &preview, &index); + routing::route_diagram(p, &preview, &view) + }); +} + +fn main() -> Result<(), Box> { + let args = std::env::args().collect::>(); + let path = args + .get(1) + .ok_or("usage: architecture_perf_probe PATH [SAMPLES]")?; + let samples = args + .get(2) + .map(|s| s.parse::()) + .transpose()? + .unwrap_or(40) + .max(1); + let p = persistence::decode(&std::fs::read(path)?)?; + println!( + "CPU-only probe; samples={samples}; fixture={path}; elements={} relations={}", + p.elements.len(), + p.relations.len() + ); + for d in p.diagrams.values() { + probe(&p, d, samples); + } + // Approximation of the reported eight-card screenshot, not an exact repro: + // fixture semantics, Overview projection, synthetic positions/card sizes. + let mut approx = p.clone(); + let id: Id = "f0440000-0000-4000-8000-000000000001".parse()?; + approx.diagrams.insert( + id, + Diagram { + id, + alias: "fps44_approx_overview".into(), + name: "APPROXIMATION eight-card SA Overview".into(), + description: "Synthetic positions, not user geometry".into(), + layer: Layer::Sa, + projection: ProjectionKind::Overview, + view_options: Default::default(), + nodes: BTreeMap::new(), + routes: vec![], + layout: None, + }, + ); + for (ordinal, (alias, x, y)) in [ + ("sa_assessment_procedure", 30., 240.), + ("sa_triage", 510., 240.), + ("sa_control", 990., 240.), + ("sa_technician", 530., 440.), + ("sa_assess", 1490., 240.), + ("sa_repair", 1030., 440.), + ("sa_confirm", 1530., 440.), + ("sa_reset", 30., 440.), + ] + .into_iter() + .enumerate() + { + let element = approx + .elements + .values() + .find(|e| e.alias == alias) + .ok_or_else(|| format!("missing alias {alias}"))? + .id; + let generated = approx.place(id, element, Position { x, y }); + let diagram = approx.diagrams.get_mut(&id).unwrap(); + let mut node = diagram.nodes.remove(&generated).unwrap(); + node.id = format!("f0440000-0000-4000-8000-{:012}", ordinal + 2).parse()?; + diagram.nodes.insert(node.id, node); + } + probe(&approx, &approx.diagrams[&id], samples); + Ok(()) +} diff --git a/harness/experiments/architecture-perf-20260925/context.json b/harness/experiments/architecture-perf-20260925/context.json new file mode 100644 index 00000000..2d531ace --- /dev/null +++ b/harness/experiments/architecture-perf-20260925/context.json @@ -0,0 +1,11 @@ +{ + "source": "24b1eab07d306d8cb091bb46f7daf9f027a8f1c0", + "core_profile": "dev unoptimized", + "driver_optimization": "rustc -O", + "samples_per_phase": 40, + "warmups_per_phase": 3, + "rlib_sha256": "E10C81BF28A33CD0FB6C4C26884CFFA480EF05328E78BCDB138DD4B635B2531C", + "fixture_sha256": "EF0EF4006C3E09D5DB6E1B621256B3F7D6642F3A7B09CC34607CFBCCA830C727", + "driver_exe_sha256": "4C66E9CDE4F08D6DFD2A0DC3DBF1A80B97E340F3F22CA001A76301F06F47C2E2", + "native_fps_measured": false +} diff --git a/harness/experiments/architecture-perf-20260925/performance-01.log b/harness/experiments/architecture-perf-20260925/performance-01.log new file mode 100644 index 00000000..d709951b --- /dev/null +++ b/harness/experiments/architecture-perf-20260925/performance-01.log @@ -0,0 +1,61 @@ +CPU-only probe; samples=40; fixture=.local/drag-out-01a0d6fd/examples/release1/model.json; elements=94 relations=62 + +view=1 · OA responsibility and repair traffic projection=Allocation nodes=6 ports=0 edges=3 +index_new: n=40 p50_ms=1.0106 p95_ms=2.0583 max_ms=2.0910 +projection_reused_index: n=40 p50_ms=0.5702 p95_ms=1.2320 max_ms=1.3490 +projection_fresh_index: n=40 p50_ms=1.5505 p95_ms=3.6681 max_ms=5.1533 +routing_settled: n=40 p50_ms=0.1944 p95_ms=0.3391 max_ms=0.4246 +moving_root=3191e05c-1c7f-5f0e-beb0-5f3bded54c48 element=Control room +moved_projection: n=40 p50_ms=0.4848 p95_ms=1.2745 max_ms=1.5797 +moved_routing: n=40 p50_ms=0.1994 p95_ms=0.7971 max_ms=1.1414 +moved_prepare_projection_routing: n=40 p50_ms=0.9250 p95_ms=2.6847 max_ms=10.4908 + +view=5 · SA pressure supervision projection=StateMachine { machine: 132b3f28-3f88-5327-9868-8c8b645ed412 } nodes=5 ports=0 edges=3 +index_new: n=40 p50_ms=0.9602 p95_ms=2.1394 max_ms=2.4512 +projection_reused_index: n=40 p50_ms=0.1697 p95_ms=0.7629 max_ms=1.1780 +projection_fresh_index: n=40 p50_ms=1.1189 p95_ms=2.6324 max_ms=3.3912 +routing_settled: n=40 p50_ms=0.7063 p95_ms=1.0812 max_ms=1.1149 +moving_root=a676fbb9-0833-59a8-98cf-a10d8f4b7434 element=Pressure supervision +moved_projection: n=40 p50_ms=0.1565 p95_ms=0.3445 max_ms=0.3790 +moved_routing: n=40 p50_ms=0.6113 p95_ms=1.3199 max_ms=1.3733 +moved_prepare_projection_routing: n=40 p50_ms=0.8259 p95_ms=1.7640 max_ms=2.1752 + +view=2 · SA service boundary and functions projection=Allocation nodes=6 ports=6 edges=3 +index_new: n=40 p50_ms=0.7820 p95_ms=3.4180 max_ms=6.8439 +projection_reused_index: n=40 p50_ms=0.7938 p95_ms=1.9946 max_ms=2.1411 +projection_fresh_index: n=40 p50_ms=2.0597 p95_ms=3.4554 max_ms=3.6616 +routing_settled: n=40 p50_ms=0.1478 p95_ms=0.7886 max_ms=1.0081 +moving_root=8345c76a-8d85-5c31-902e-ec1cd33ed4a3 element=Pressure coordination service +moved_projection: n=40 p50_ms=0.6914 p95_ms=1.5286 max_ms=1.8658 +moved_routing: n=40 p50_ms=0.1862 p95_ms=0.5658 max_ms=2.8924 +moved_prepare_projection_routing: n=40 p50_ms=1.1724 p95_ms=3.1806 max_ms=4.2620 + +view=4 · SA mission and included capability projection=Capabilities nodes=4 ports=1 edges=3 +index_new: n=40 p50_ms=0.6879 p95_ms=1.3582 max_ms=1.5266 +projection_reused_index: n=40 p50_ms=0.1562 p95_ms=0.6767 max_ms=1.0102 +projection_fresh_index: n=40 p50_ms=1.2929 p95_ms=2.3543 max_ms=4.0762 +routing_settled: n=40 p50_ms=0.2553 p95_ms=1.4389 max_ms=1.6677 +moving_root=069a3fb3-077c-59d8-91da-27b0665143c7 element=Assess an alarm +moved_projection: n=40 p50_ms=0.1243 p95_ms=0.1928 max_ms=0.2212 +moved_routing: n=40 p50_ms=0.2271 p95_ms=0.6733 max_ms=1.2408 +moved_prepare_projection_routing: n=40 p50_ms=0.5542 p95_ms=1.3344 max_ms=1.8957 + +view=3 · SA service conversation only projection=Allocation nodes=6 ports=6 edges=1 +index_new: n=40 p50_ms=0.9618 p95_ms=1.6890 max_ms=2.0995 +projection_reused_index: n=40 p50_ms=0.6661 p95_ms=2.3388 max_ms=2.6429 +projection_fresh_index: n=40 p50_ms=2.3913 p95_ms=4.1941 max_ms=4.8120 +routing_settled: n=40 p50_ms=0.0660 p95_ms=0.2156 max_ms=0.6289 +moving_root=40210589-69f7-5209-b329-10bb83cf615c element=Field technician +moved_projection: n=40 p50_ms=0.5527 p95_ms=1.1239 max_ms=1.1362 +moved_routing: n=40 p50_ms=0.0495 p95_ms=0.1771 max_ms=0.2209 +moved_prepare_projection_routing: n=40 p50_ms=0.7963 p95_ms=4.1835 max_ms=6.7551 + +view=APPROXIMATION eight-card SA Overview projection=Overview nodes=8 ports=6 edges=13 +index_new: n=40 p50_ms=0.7487 p95_ms=1.9597 max_ms=2.2005 +projection_reused_index: n=40 p50_ms=0.3885 p95_ms=0.7550 max_ms=1.2965 +projection_fresh_index: n=40 p50_ms=1.7135 p95_ms=2.7022 max_ms=4.2204 +routing_settled: n=40 p50_ms=2.4525 p95_ms=4.4617 max_ms=4.7735 +moving_root=f0440000-0000-4000-8000-000000000002 element=Assess an alarm procedure +moved_projection: n=40 p50_ms=0.4691 p95_ms=0.8354 max_ms=1.0408 +moved_routing: n=40 p50_ms=3.1907 p95_ms=4.4781 max_ms=4.5672 +moved_prepare_projection_routing: n=40 p50_ms=4.2640 p95_ms=6.8259 max_ms=8.8052 diff --git a/harness/experiments/drag-out-20260925/README.md b/harness/experiments/drag-out-20260925/README.md index 2b7d707b..f83bda5a 100644 --- a/harness/experiments/drag-out-20260925/README.md +++ b/harness/experiments/drag-out-20260925/README.md @@ -27,6 +27,14 @@ these paths identify this run, not required directories on another machine. ## Results and boundaries +- Test-only successor `24b1eab07d306d8cb091bb46f7daf9f027a8f1c0` adds two + OA/SA App regressions: a clearance proposal blocked by unrelated work and an + outgoing move with a retained sibling enlarging the source enclosure. + `tests-04.log` passes all 123 allocation-drag tests (zero failed/ignored, + 1,424 filtered) in 54.86s; `clippy-02.log` passes the same strict command in + 1m27s. Production inputs are unchanged from `1a669130`; its normal binary + remains the native candidate. [Independent review](independent-review.md) + covers the source, new test design and evidence limits. - `tests-03.log`: 121 passed, zero failed/ignored, 1,424 filtered; 35.33 seconds test execution. This is the allocation-drag subset, not the full desktop suite. - `clippy-01.log`: strict desktop all-target Clippy passed in 4m30s. diff --git a/harness/experiments/drag-out-20260925/clippy-02.log b/harness/experiments/drag-out-20260925/clippy-02.log new file mode 100644 index 00000000..1b5d503c --- /dev/null +++ b/harness/experiments/drag-out-20260925/clippy-02.log @@ -0,0 +1,2 @@ + Checking oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\drag-out-01a0d6fd\crates\oa-desktop) + Finished `dev` profile [unoptimized] target(s) in 1m 27s diff --git a/harness/experiments/drag-out-20260925/independent-review.md b/harness/experiments/drag-out-20260925/independent-review.md new file mode 100644 index 00000000..3fb67d79 --- /dev/null +++ b/harness/experiments/drag-out-20260925/independent-review.md @@ -0,0 +1,33 @@ +# Independent source and evidence review + +Fresh read-only GPT-6 Astra review, 2026-09-25. Production source +`1a669130fb6d2b65279aab3847e966a1a282c191`; test-only successor +`24b1eab07d306d8cb091bb46f7daf9f027a8f1c0`. No GUI actions or test execution +were performed by this reviewer. + +No material correctness finding in the bounded scope: + +- The outgoing collision regression in `app/allocation_drag_tests.rs` proves a + real source-boundary crossing and unobscured OutsidePerformers target, a + nonempty clearance proposal, and intersection with unrelated work. Ordinary + placement rejects that proposal. Release preserves project, source bundle, + revision, snapshot identity and redo availability. +- The retained-sibling regression first requires exact requested placement to + fail. The admitted correction clears the enlarged source enclosure while + preserving its projection, sibling allocation/placement and all other stored + placements. Preview/release and source Undo/Redo comparisons are exact. +- In `app/allocation_drag.rs`, clearance remains downstream of semantic + admission and retries ordinary placement. Release recomputes placement and + passes through `finish` and document execution. No collision, stale-state or + retained-preview commit bypass was found. +- The committed passing log's bytes and SHA256 match `context.json`; the + baseline image hash also matches. Logs support 121 passing tests, strict + Clippy and normal development build for the production source. They do not + establish execution of the two successor tests; consult the linked raw logs + and README for subsequent execution evidence. + +The review supports the source policy and test design, not native usability. +The 24x24 visible-header threshold alone does not prove readable identity or +practical regrabbing. Changed-binary fitted-view dragging, feedback, recovery +and Save/reopen remain unverified. This review is not the broad final +requirements/domain/UX/release review required by `PROJECT_GOAL.md`. diff --git a/harness/experiments/drag-out-20260925/successor-context.json b/harness/experiments/drag-out-20260925/successor-context.json new file mode 100644 index 00000000..3744125d --- /dev/null +++ b/harness/experiments/drag-out-20260925/successor-context.json @@ -0,0 +1,12 @@ +{ + "source": "24b1eab07d306d8cb091bb46f7daf9f027a8f1c0", + "production_source": "1a669130fb6d2b65279aab3847e966a1a282c191", + "test_log": "tests-04.log", + "test_log_sha256": "C98E0F70D60788B484146B3C8785891888BA696130ACC4BFD7D30DA570E6B1E1", + "passed": 123, + "failed": 0, + "ignored": 0, + "filtered": 1424, + "native_candidate_sha256": "9BDA1A6A1D24FDC98C7A8822400C12FEA9AFE1DE828A82BA9273F03B99E47C07", + "native_acceptance": "unverified" +} diff --git a/harness/experiments/drag-out-20260925/tests-04.log b/harness/experiments/drag-out-20260925/tests-04.log new file mode 100644 index 00000000..7f544188 --- /dev/null +++ b/harness/experiments/drag-out-20260925/tests-04.log @@ -0,0 +1,131 @@ + Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\.local\drag-out-01a0d6fd\crates\oa-desktop) + Finished `test` profile [unoptimized] target(s) in 6m 05s + Running unittests src\main.rs (C:/Users/User/Documents/Git/ARCADIA-Studio/target\debug\deps\arcadia_studio-c5b42126ba36cd38.exe) + +running 123 tests +test allocation_drag::outgoing_header_retains_a_grab_region_without_requiring_full_camera_containment ... ok +test allocation_drag::tests::allocation_artifact_and_manual_trace_cascades_are_named_and_refused ... ok +test allocation_drag::tests::arrange_tests::explicit_arrange_detects_hidden_moved_child_and_stationary_enclosure_growth ... ok +test allocation_drag::tests::arrange_tests::explicit_arrange_distributed_oa_sa_exact_scope_routes_source_history_and_anchor ... ok +test allocation_drag::tests::arrange_tests::explicit_arrange_noop_stale_tamper_target_and_all_selected_headers ... ok +test allocation_drag::tests::arrange_tests::explicit_arrange_performer_closure_does_not_acquire_incidental_semantic_root ... ok +test allocation_drag::tests::arrange_tests::explicit_arrange_preserves_existing_overlap_but_refuses_its_growth ... ok +test allocation_drag::tests::arrange_tests::explicit_arrange_preserves_roles_and_does_not_invent_unplaced_descendants ... ok +test allocation_drag::tests::arrange_tests::explicit_arrange_preserves_unrelated_folded_interior_diagnostic_boundary ... ok +test allocation_drag::tests::arrange_tests::explicit_arrange_simultaneous_roots_may_enter_each_others_vacated_bounds ... ok +test allocation_drag::tests::arrange_tests::explicit_arrange_validates_all_original_members_before_normalizing ... ok +test allocation_drag::tests::assignment_boundary_tests::group_assignment_checks_original_identity_and_visibility_before_normalization ... ok +test allocation_drag::tests::assignment_boundary_tests::group_assignment_distributed_parent_refuses_but_its_independent_leaves_can_reassign ... ok +test allocation_drag::tests::assignment_boundary_tests::group_assignment_finish_rejects_stale_project_and_each_tampered_result ... ok +test allocation_drag::tests::assignment_boundary_tests::group_assignment_normalizes_parent_child_and_assigns_unplaced_leaf_once ... ok +test allocation_drag::tests::assignment_boundary_tests::group_assignment_requires_non_anchor_selected_header_inside_viewport ... ok +test allocation_drag::tests::assignment_boundary_tests::group_assignment_unresolved_oa_role_leaf_accepts_explicit_target_but_not_outside ... ok +test allocation_drag::tests::assignment_tests::group_assignment_accumulates_stable_ids_and_aliases_without_partial_reuse ... ok +test allocation_drag::tests::assignment_tests::group_assignment_collateral_surviving_constraint_refuses_whole_semantic_candidate ... ok +test allocation_drag::tests::assignment_tests::group_assignment_deletes_only_own_routes_across_views_and_keeps_internal_flow ... ok +test allocation_drag::tests::assignment_tests::group_assignment_independent_performers_preserves_already_correct_provenance ... ok +test allocation_drag::tests::assignment_tests::group_assignment_source_failure_preserves_existing_history_and_retry_ids ... ok +test allocation_drag::tests::assignment_tests::group_assignment_unfolds_only_changed_destination_and_refuses_newly_exposed_overlap ... ok +test allocation_drag::tests::assignment_tests::group_assignment_uses_vacated_space_and_one_complete_route_owner_map ... ok +test allocation_drag::tests::assignment_tests::group_assignment_zero_delta_changes_semantics_once_and_then_is_noop ... ok +test allocation_drag::tests::cache_plan_uses_candidate_index_and_same_pixel_different_target_changes_preview ... ok +test allocation_drag::tests::collapsed_target_unfold_is_explicit_and_no_other_fold_changes ... ok +test allocation_drag::tests::direct_exit_revealing_another_role_performer_has_truthful_refusal ... ok +test allocation_drag::tests::explicit_different_performer_retains_advisory_role_warning ... ok +test allocation_drag::tests::folded_subtree_cannot_hide_new_collision ... ok +test allocation_drag::tests::geometry_refuses_new_overlap_bounds_and_invisible_headers_and_preserves_existing_overlap ... ok +test allocation_drag::tests::group_arrange_experiment::mixed_arrange_experiment_detects_moved_folded_child_collision ... ok +test allocation_drag::tests::group_arrange_experiment::mixed_arrange_experiment_detects_stationary_enclosure_growth_collision ... ok +test allocation_drag::tests::group_arrange_experiment::mixed_arrange_experiment_distributed_root_and_performer_can_translate_rigidly ... ok +test allocation_drag::tests::group_arrange_experiment::mixed_arrange_experiment_unrelated_folded_interiors_are_outside_diagnostic_domain ... ok +test allocation_drag::tests::malformed_scope_wrong_projection_duplicate_placement_and_stable_id_collision_refuse ... ok +test allocation_drag::tests::mixed_p_x_y_refuses_semantic_and_arrange_instead_of_stretching_destination ... ok +test allocation_drag::tests::oa_communication_incompleteness_remains_advisory_without_collateral_loss ... ok +test allocation_drag::tests::oa_sa_incoming_between_outgoing_preserve_identity_source_history_and_other_views ... ok +test allocation_drag::tests::oa_sa_one_leaf_move_refuses_when_ancestor_regrouping_introduces_unrelated_overlap ... ok +test allocation_drag::tests::oa_sa_one_leaf_reassignment_and_outward_move_regroup_ancestors_without_moving_sibling ... ok +test allocation_drag::tests::oa_sa_populated_collapsed_target_accepts_room_and_refuses_collision_without_relocating_contents ... ok +test allocation_drag::tests::oa_sa_state_owned_action_and_availability_reject_reassignment_atomically ... ok +test allocation_drag::tests::oa_sa_unfolding_prior_hidden_overlap_refuses_even_when_insertion_does_not_collide ... ok +test allocation_drag::tests::own_deleted_allocation_routes_may_disappear_in_every_diagram_only ... ok +test allocation_drag::tests::role_only_same_effective_performer_is_semantic_noop_and_outgoing_refuses ... ok +test allocation_drag::tests::sa_port_and_deferred_exchange_allocation_cascade_refuses_and_retarget_is_invalid ... ok +test allocation_drag::tests::same_performer_readability_preserves_snapped_noop_and_allocation_identity ... ok +test allocation_drag::tests::scope_detects_first_child_allocation_and_role_transfer_and_finish_rejects_live_edits ... ok +test allocation_drag::tests::selected_header_visibility_allows_viewport_edge_but_refuses_clipping ... ok +test allocation_drag::tests::snapped_noop_returns_no_command_and_keeps_source_revision_and_redo ... ok +test allocation_drag::tests::source_budget_refusal_keeps_project_bundle_history_and_retry_identity_exact ... ok +test allocation_drag::tests::surviving_constraint_mutation_is_refused_even_when_core_candidate_is_valid ... ok +test allocation_drag::tests::target_presentation_requires_accepted_identity_and_selected_header_visibility ... ok +test allocation_drag::tests::toolbar_identity_allows_exact_incoming_placement_at_old_label_overlap ... ok +test allocation_drag::tests::uniform_folded_grandchild_and_unplaced_scope_moves_exactly_q_and_all_l_oa_sa ... ok +test allocation_drag::tests::uniform_role_only_and_mixed_direct_role_composites_same_target_do_not_allocate ... ok +test allocation_drag::tests::uniformly_unassigned_composite_creates_only_stable_leaf_allocations_including_unplaced ... ok +test allocation_drag::tests::unrequested_view_option_cleanup_is_not_whitelisted ... ok +test allocation_drag::tests::unresolved_role_leaf_can_arrange_or_accept_explicit_target_without_guessing ... ok +test app::allocation_drag::clearance::tests::corner_order_follows_boundary_crossing_and_is_deterministic ... ok +test app::allocation_drag::clearance::tests::descendant_footprint_controls_clearance_without_mutating_projects ... ok +test app::allocation_drag::clearance::tests::each_outgoing_edge_clears_the_source_and_passes_ordinary_placement ... ok +test app::allocation_drag::clearance::tests::independent_selected_roots_keep_one_rigid_group_translation ... ok +test app::allocation_drag::clearance::tests::no_crossing_no_overlap_no_source_and_nonfinite_requests_are_empty ... ok +test app::allocation_drag::clearance::tests::source_shrink_uses_candidate_enclosure_not_frozen_target ... ok +test app::allocation_drag::tests::actual_canvas_origin_change_cancels_held_work_before_any_legacy_release ... ok +test app::allocation_drag::tests::arrange_is_one_gesture_and_snapped_noop_preserves_redo_and_source ... ok +test app::allocation_drag::tests::candidate_semantics_are_cached_per_destination_with_stable_ids_and_own_index ... ok +test app::allocation_drag::tests::destination_identity_does_not_describe_blocked_or_outside_viewport_as_unallocation ... ok +test app::allocation_drag::tests::frozen_collapsed_target_uses_only_visible_header_and_port_edge_controls_occlude ... ok +test app::allocation_drag::tests::frozen_targets_use_half_open_semantic_priority_and_refuse_incomparable_overlap ... ok +test app::allocation_drag::tests::full_tree::actual_app_tree_dirty_description_retains_focus_and_middle_caret_for_next_key ... ok +test app::allocation_drag::tests::full_tree::actual_app_tree_dirty_name_retains_focus_and_middle_caret_for_next_key ... ok +test app::allocation_drag::tests::full_tree::actual_app_tree_exact_incoming_drag_keeps_destination_visible_and_canvas_stable ... ok +test app::allocation_drag::tests::full_tree::actual_keyboard_arrange_shortcut_consumes_once_escape_cancels_and_dirty_owner_refuses ... ok +test app::allocation_drag::tests::full_tree::actual_rendered_canvas_pixels_do_not_change_when_toolbar_feedback_text_changes ... ok +test app::allocation_drag::tests::full_tree::actual_toolbar_hover_inspects_last_full_name_without_authorizing_an_outside_drop ... ok +test app::allocation_drag::tests::full_tree::actual_tree_outgoing_boundary_motion_preview_release_and_cancel ... ok +test app::allocation_drag::tests::full_tree::control_focus::dirty_selected_pin_outer_ring_keeps_real_name_focus_and_caret ... ok +test app::allocation_drag::tests::group::allocation_bare_moves_cannot_bypass_armed_active_or_retired_lifetime ... ok +test app::allocation_drag::tests::group::completed_text_apply_rejects_old_allocation_packets_without_retiring_a_new_drag ... ok +test app::allocation_drag::tests::group::connection_lifetime::captured_connection_after_cancel_preserves_arrange_arm_and_live_group ... ok +test app::allocation_drag::tests::group::connection_lifetime::captured_connection_context_mismatches_preserve_the_current_session ... ok +test app::allocation_drag::tests::group::connection_lifetime::captured_connection_current_restart_and_pair_commit_after_tool_boundary ... ok +test app::allocation_drag::tests::group::group_arrange_work_and_performer_anchors_preserve_every_responsibility ... ok +test app::allocation_drag::tests::group::group_assignment_split_rebuild_preserves_primary_and_commits_one_complete_candidate ... ok +test app::allocation_drag::tests::group::group_out_and_back_assigns_at_zero_delta_then_true_noop_preserves_redo ... ok +test app::allocation_drag::tests::group::group_selection_aba_and_old_press_cannot_retire_a_new_token ... ok +test app::allocation_drag::tests::group::group_source_refusal_retains_primary_source_and_both_history_paths ... ok +test app::allocation_drag::tests::group::idle_group_press_rejects_selection_generation_aba_with_unchanged_other_stamps ... ok +test app::allocation_drag::tests::group::ordinary_off_grid_performer_out_and_back_is_noop_with_redo ... ok +test app::allocation_drag::tests::group::route_lifetime::captured_route_context_fields_independently_reject_before_retirement ... ok +test app::allocation_drag::tests::group::route_lifetime::current_route_commits_without_session_preserve_exact_route_history ... ok +test app::allocation_drag::tests::group::route_lifetime::same_context_route_attachment_after_selection_preserves_arrange_arm_and_live_group ... ok +test app::allocation_drag::tests::group::route_lifetime::same_context_route_commit_after_selection_preserves_arrange_arm_and_live_group ... ok +test app::allocation_drag::tests::group::route_lifetime::stale_route_attachment_preserves_arrange_arm_and_live_group ... ok +test app::allocation_drag::tests::group::route_lifetime::stale_route_commit_preserves_arrange_arm_and_live_group ... ok +test app::allocation_drag::tests::group::unsupported_group_click_collapses_but_threshold_crossing_never_becomes_click ... ok +test app::allocation_drag::tests::modal_roundtrip_equal_fit_undo_resize_and_focus_retire_press_before_replay ... ok +test app::allocation_drag::tests::mounted_clean_stationary_selects_exact_work_without_revision_or_legacy_apply ... ok +test app::allocation_drag::tests::mounted_dirty_port_press_cannot_fall_through_to_applying_port_selection ... ok +test app::allocation_drag::tests::mounted_dirty_property_press_does_not_select_apply_or_destroy_draft ... ok +test app::allocation_drag::tests::mounted_oa_sa_ordered_incoming_between_outgoing_are_exact_single_history_steps ... ok +test app::allocation_drag::tests::mounted_role_only_outgoing_refusal_retains_placement_and_same_performer_creates_no_allocation ... ok +test app::allocation_drag::tests::mounted_uniform_parent_moves_hidden_placements_and_assigns_only_leaves ... ok +test app::allocation_drag::tests::navigation_union::old_chooser_envelopes_preserve_a_current_canvas_gesture ... ok +test app::allocation_drag::tests::navigation_union::stale_gesture_packets_preserve_navigation_and_a_new_live_cancel_still_works ... ok +test app::allocation_drag::tests::oa_sa_clipped_selected_header_refuses_preview_release_and_retries_without_partial_source_or_history ... ok +test app::allocation_drag::tests::oa_sa_toolbar_identity_accepts_exact_receiver_and_collapsed_header_drag ... ok +test app::allocation_drag::tests::outgoing_boundary_drop_clears_source_without_changing_other_placements ... ok +test app::allocation_drag::tests::outgoing_clearance_collision_refuses_release_without_source_or_history_mutation ... ok +test app::allocation_drag::tests::outgoing_clearance_preserves_source_enclosure_and_allocated_sibling ... ok +test app::allocation_drag::tests::outside_release_is_cancel_and_does_not_remove_an_assignment ... ok +test app::allocation_drag::tests::pending_behavior_draft_refuses_actual_work_press_and_equal_document_replacement_retires_packet ... ok +test app::allocation_drag::tests::refused_motion_retains_last_scene_but_release_never_commits_it ... ok +test app::allocation_drag::tests::release_uses_ordered_native_position_before_later_motion_in_same_batch ... ok +test app::allocation_drag::tests::same_snapped_position_on_opposite_shared_border_rebuilds_semantics_even_if_layout_refuses ... ok +test app::allocation_drag::tests::source_and_modal_admission_reject_prebuilt_clean_press_without_selecting ... ok +test app::allocation_drag::tests::source_refusal_is_atomic_and_a_new_gesture_can_retry_against_live_revision ... ok +test app::allocation_drag::tests::stale_packets_do_not_cancel_a_newer_token_and_each_release_is_consumed_once ... ok +test app::allocation_drag::tests::toolbar_destination_names_transformed_target_whose_header_is_clipped ... ok +test app::allocation_drag::tests::toolbar_status_leaves_transformed_top_edge_work_header_readable ... ok + +test result: ok. 123 passed; 0 failed; 0 ignored; 0 measured; 1424 filtered out; finished in 54.86s +