docs: publish drag regressions and small-diagram CPU measurements

This commit is contained in:
2026-09-24 23:22:43 -07:00
parent 24b1eab07d
commit c0908f101a
11 changed files with 525 additions and 0 deletions
+9
View File
@@ -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
@@ -0,0 +1 @@
*.log -text
@@ -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.
@@ -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<T>(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::<BTreeMap<_, _>>();
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::<Vec<_>>();
let projected = previews
.iter()
.map(|d| projection::project_diagram_with_index(p, d, &index))
.collect::<Vec<_>>();
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<dyn std::error::Error>> {
let args = std::env::args().collect::<Vec<_>>();
let path = args
.get(1)
.ok_or("usage: architecture_perf_probe PATH [SAMPLES]")?;
let samples = args
.get(2)
.map(|s| s.parse::<usize>())
.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(())
}
@@ -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
}
@@ -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
@@ -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.
@@ -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
@@ -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`.
@@ -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"
}
@@ -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