Compare commits

..
Author SHA1 Message Date
sorokin.oleg.edu 684061ec0f Record independent downloaded Windows prerelease QA 2026-09-24 15:23:46 -07:00
50 changed files with 1076 additions and 5425 deletions
+1
View File
@@ -12,6 +12,7 @@
*.png binary
*.jpg binary
*.zip binary
harness/prerelease37-independent-9e8r6t-20260924/** -text whitespace=cr-at-eol
# Exact source/recovery oracles and archived ledgers retain their measured bytes.
# Keep ordinary text diffs; only disable checkout/check-in newline conversion.
+11 -167
View File
@@ -53,8 +53,6 @@ pub struct RoutedEdge {
pub struct EdgeLabelGeometry {
/// Empty for edge kinds without a permanently displayed label.
pub text: String,
/// Dedicated State-canvas two-block presentation; raw summary stays in text.
pub state_layout: Option<StateLabelLayout>,
/// Effective arc-length fraction, including an automatic collision-avoidance
/// choice. Use this when the first label drag becomes authored metadata.
pub fraction: f32,
@@ -63,108 +61,6 @@ pub struct EdgeLabelGeometry {
pub bounds: RoutingBounds,
}
/// Derived hard-line layout for the dedicated State projection, never persisted.
/// Excerpts are chosen on raw text before display-only separator/tab expansion.
#[derive(Debug, Clone, PartialEq)]
pub struct StateLabelLayout {
pub title_lines: Vec<String>,
pub summary_lines: Vec<String>,
size: Size,
}
impl StateLabelLayout {
pub const FONT_SIZE: f32 = 10.0;
pub const LINE_HEIGHT: f32 = 12.0;
pub const HORIZONTAL_PADDING: f32 = 5.0;
pub const MIN_HEIGHT: f32 = 24.0;
/// `summary` is the existing raw, globally shortened routing summary.
/// Measurement receives each final display line at FONT_SIZE, without breaks.
/// Invalid measurements fall back to the deterministic approximate width.
pub fn new(title: &str, summary: &str, measure: &dyn Fn(&str) -> f32) -> Self {
let budget = (7 * summary.chars().count() + 6) / 6;
let title = if title.chars().count() > budget {
title
.chars()
.take(budget.saturating_sub(1))
.chain(std::iter::once('…'))
.collect()
} else {
title.to_owned()
};
let title_lines = state_display_lines(&title);
let summary_lines = state_display_lines(summary);
let width = title_lines
.iter()
.chain(&summary_lines)
.map(|line| {
let width = measure(line);
if width.is_finite() && width >= 0.0 {
width
} else {
approximate_state_line_width(line)
}
})
.fold(0.0_f32, f32::max);
let size = Size {
width: width + 2.0 * Self::HORIZONTAL_PADDING,
height: (Self::LINE_HEIGHT * (title_lines.len() + summary_lines.len()) as f32)
.max(Self::MIN_HEIGHT),
};
Self {
title_lines,
summary_lines,
size,
}
}
pub fn size(&self) -> Size {
self.size
}
/// Local origin relative to EdgeLabelGeometry.bounds.position.
pub fn title_line_position(&self, index: usize) -> Position {
Position {
x: Self::HORIZONTAL_PADDING,
y: index as f32 * Self::LINE_HEIGHT,
}
}
/// Local origin relative to EdgeLabelGeometry.bounds.position.
pub fn summary_line_position(&self, index: usize) -> Position {
Position {
x: Self::HORIZONTAL_PADDING,
y: (self.title_lines.len() + index) as f32 * Self::LINE_HEIGHT,
}
}
}
fn state_display_lines(raw: &str) -> Vec<String> {
if raw.is_empty() {
return Vec::new();
}
let mut lines = vec![String::new()];
let mut chars = raw.chars().peekable();
while let Some(ch) = chars.next() {
match ch {
'\r' => {
if chars.peek() == Some(&'\n') {
chars.next();
}
lines.push(String::new());
}
'\n' | '\u{85}' | '\u{2028}' | '\u{2029}' => lines.push(String::new()),
'\t' => lines.last_mut().unwrap().push_str(" "),
_ => lines.last_mut().unwrap().push(ch),
}
}
lines
}
fn approximate_state_line_width(line: &str) -> f32 {
line.chars().count() as f32 * 7.0
}
/// Derived labels and navigation markers for the two named association ends.
/// Canvas and SVG consume these same coordinates; no extra diagram state exists.
#[derive(Debug, Clone, PartialEq)]
@@ -265,7 +161,6 @@ pub fn association_end_geometry(
source_end,
label: EdgeLabelGeometry {
text,
state_layout: None,
fraction: if source_end { 0.0 } else { 1.0 },
anchor: tip,
center,
@@ -541,24 +436,7 @@ fn ancestors(id: Id, nodes: &BTreeMap<Id, &ProjectedNode>, out: &mut BTreeSet<Id
/// Search caps are presentation limits, reported on the affected edge, never
/// semantic errors or a reason to discard an authored point.
pub fn route_diagram(project: &Project, diagram: &Diagram, view: &ProjectedView) -> RoutedView {
route_diagram_with_state_label_measurement(
project,
diagram,
view,
&approximate_state_line_width,
)
}
/// Route with frontend line measurements for dedicated State labels before collision placement.
/// The legacy entrypoint uses a deterministic 7-units-per-scalar approximation,
/// not a promise of shaped glyph containment. All other label kinds are unchanged.
pub fn route_diagram_with_state_label_measurement(
project: &Project,
diagram: &Diagram,
view: &ProjectedView,
measure: &dyn Fn(&str) -> f32,
) -> RoutedView {
route_diagram_impl(project, diagram, view, None, measure)
route_diagram_impl(project, diagram, view, None)
}
/// Transient route/label editing with unchanged projected nodes and ports.
@@ -573,26 +451,7 @@ pub fn route_edge_preview(
baseline: &RoutedView,
edge: Id,
) -> RoutedView {
route_edge_preview_with_state_label_measurement(
project,
diagram,
view,
baseline,
edge,
&approximate_state_line_width,
)
}
/// Preview counterpart using the same State text measurer as the settled scene.
pub fn route_edge_preview_with_state_label_measurement(
project: &Project,
diagram: &Diagram,
view: &ProjectedView,
baseline: &RoutedView,
edge: Id,
measure: &dyn Fn(&str) -> f32,
) -> RoutedView {
route_diagram_impl(project, diagram, view, Some((baseline, edge)), measure)
route_diagram_impl(project, diagram, view, Some((baseline, edge)))
}
fn route_diagram_impl(
@@ -600,7 +459,6 @@ fn route_diagram_impl(
diagram: &Diagram,
view: &ProjectedView,
preview: Option<(&RoutedView, Id)>,
measure: &dyn Fn(&str) -> f32,
) -> RoutedView {
let nodes: BTreeMap<_, _> = view.nodes.iter().map(|n| (n.id, n)).collect();
let rectangles: Vec<_> = nodes.values().map(|n| Rect::node(n)).collect();
@@ -781,14 +639,13 @@ fn route_diagram_impl(
.flatten();
routed.label = make_label(
project,
diagram,
diagram.view_options.exchange_labels,
edge.id,
&routed.points,
authored_label,
&obstacles,
&previous_labels,
&previous,
measure,
);
}
if !routed.label.text.is_empty() {
@@ -1488,7 +1345,6 @@ fn label_text(project: &Project, edge: Id) -> String {
fn empty_label() -> EdgeLabelGeometry {
EdgeLabelGeometry {
text: String::new(),
state_layout: None,
fraction: 0.5,
anchor: pos(0.0, 0.0),
center: pos(0.0, 0.0),
@@ -1506,16 +1362,14 @@ fn empty_label() -> EdgeLabelGeometry {
#[allow(clippy::too_many_arguments)]
fn make_label(
project: &Project,
diagram: &Diagram,
labels: crate::view_options::ExchangeLabels,
edge: Id,
points: &[Position],
authored: Option<&crate::EdgeLabel>,
obstacles: &[Rect],
previous_labels: &[RoutingBounds],
strokes: &[Segment],
measure: &dyn Fn(&str) -> f32,
) -> EdgeLabelGeometry {
let labels = diagram.view_options.exchange_labels;
let text = if labels != crate::view_options::ExchangeLabels::Name
&& project
.relations
@@ -1531,23 +1385,14 @@ fn make_label(
} else {
label_text(project, edge)
};
let state_layout = (diagram.projection.state_machine().is_some()
&& project
.relations
.get(&edge)
.is_some_and(|r| r.kind() == RelationKind::StateTransition))
.then(|| StateLabelLayout::new(project.named(edge), &text, measure));
let size = state_layout.as_ref().map_or_else(
|| Size {
width: if text.is_empty() {
0.0
} else {
text.chars().count() as f32 * 7.0 + 16.0
},
height: if text.is_empty() { 0.0 } else { 24.0 },
let size = Size {
width: if text.is_empty() {
0.0
} else {
text.chars().count() as f32 * 7.0 + 16.0
},
StateLabelLayout::size,
);
height: if text.is_empty() { 0.0 } else { 24.0 },
};
let mut offset = authored.map_or(pos(0.0, -18.0), |l| l.offset);
let geometry = |fraction, offset: Position| {
let anchor = point_along_polyline(points, fraction).unwrap_or(pos(0.0, 0.0));
@@ -1629,7 +1474,6 @@ fn make_label(
let (anchor, center, bounds) = geometry(fraction, offset);
EdgeLabelGeometry {
text,
state_layout,
fraction,
anchor,
center,
-145
View File
@@ -1,145 +0,0 @@
use oa_core::{projection::project_diagram, routing::*, *};
fn fixture() -> (Project, Id, Id) {
let mut project = language::parse(include_str!(
"../../../harness/experiments/edge-attachments-20260922/native-fixture.arcadia"
))
.unwrap();
let edge = Id::parse_str("ea202922-0033-4000-8000-000000000041").unwrap();
let diagram = Id::parse_str("ea202922-0033-4000-8000-000000000200").unwrap();
let relation = project.relations.get_mut(&edge).unwrap();
relation.name = "Ready\nfor review".into();
if let RelationBody::StateTransition { guard, .. } = &mut relation.body {
*guard = "request_ready".into();
}
(project, diagram, edge)
}
#[test]
fn state_two_block_layout_separates_lines_and_keeps_authored_geometry_and_project() {
let (project, diagram, edge) = fixture();
let before = project.clone();
let diagram = &project.diagrams[&diagram];
let view = project_diagram(&project, diagram);
let routed = route_diagram(&project, diagram, &view);
let edge_geometry = &routed.edges[&edge];
let label = &edge_geometry.label;
let layout = label.state_layout.as_ref().unwrap();
assert_eq!(layout.title_lines, ["Ready", "for review"]);
assert_eq!(
layout.summary_lines,
["External · Completion [request_ready]"]
);
assert_eq!(label.text, "External · Completion [request_ready]");
assert_eq!(layout.title_line_position(1), Position { x: 5., y: 12. });
assert_eq!(layout.summary_line_position(0), Position { x: 5., y: 24. });
assert_eq!(
label.bounds.size,
Size {
width: 269.,
height: 36.
}
);
let authored = diagram
.routes
.iter()
.find(|r| r.edge == edge)
.unwrap()
.label
.as_ref()
.unwrap();
assert_eq!(label.fraction, authored.fraction);
let anchor = point_along_polyline(&edge_geometry.points, authored.fraction).unwrap();
assert_eq!(label.anchor, anchor);
assert_eq!(
label.center,
Position {
x: anchor.x + authored.offset.x,
y: anchor.y + authored.offset.y
}
);
assert_eq!(project, before);
}
#[test]
fn state_display_breaks_tabs_and_blank_lines_are_single_sourced() {
let summary = "A sufficiently long unchanged summary";
for title in [
"Ready\nfor review",
"Ready\r\nfor review",
"Ready\rfor review",
"Ready\u{85}for review",
"Ready\u{2028}for review",
"Ready\u{2029}for review",
] {
let layout = StateLabelLayout::new(title, summary, &|s| s.chars().count() as f32);
assert_eq!(layout.title_lines, ["Ready", "for review"]);
assert_eq!(layout.summary_line_position(0).y, 24.);
}
let layout = StateLabelLayout::new("Ready\n\nfor\treview\n", summary, &|s| {
s.chars().count() as f32
});
assert_eq!(layout.title_lines, ["Ready", "", "for review", ""]);
assert_eq!(layout.summary_line_position(0).y, 48.);
assert_eq!(layout.size().height, 60.);
let empty = StateLabelLayout::new("", "", &|_| 0.);
assert!(empty.title_lines.is_empty() && empty.summary_lines.is_empty());
assert_eq!(empty.size().height, 24.);
}
#[test]
fn state_summary_raw_prefix_and_title_budget_survive_display_normalization() {
let (mut project, diagram, edge) = fixture();
let relation = project.relations.get_mut(&edge).unwrap();
relation.name = "T".repeat(80);
if let RelationBody::StateTransition { guard, .. } = &mut relation.body {
*guard = format!("first\r\n{}", "guard".repeat(20));
}
let full = state_transition_summary(&project, &project.relations[&edge]);
let raw: String = full.chars().take(47).chain(std::iter::once('…')).collect();
let d = &project.diagrams[&diagram];
let routed = route_diagram(&project, d, &project_diagram(&project, d));
let label = &routed.edges[&edge].label;
assert_eq!(label.text, raw);
assert!(label.text.contains("\r\n"));
let layout = label.state_layout.as_ref().unwrap();
assert_eq!(layout.title_lines, [format!("{}…", "T".repeat(56))]);
assert_eq!(
layout.summary_lines,
raw.replace("\r\n", "\n")
.split('\n')
.map(str::to_owned)
.collect::<Vec<_>>()
);
assert_eq!(label.text.chars().count(), 48);
}
#[test]
fn supplied_measurement_controls_settled_and_preview_state_bounds_only() {
let (project, diagram, edge) = fixture();
let d = &project.diagrams[&diagram];
let view = project_diagram(&project, d);
let baseline = route_diagram(&project, d, &view);
let wide = |_: &str| 400.;
let measured = route_diagram_with_state_label_measurement(&project, d, &view, &wide);
let label = &measured.edges[&edge].label;
assert_eq!(
label.bounds.size,
Size {
width: 410.,
height: 36.
}
);
assert_eq!(label.center, baseline.edges[&edge].label.center);
assert_eq!(measured.edges[&edge].points, baseline.edges[&edge].points);
let preview =
route_edge_preview_with_state_label_measurement(&project, d, &view, &measured, edge, &wide);
assert_eq!(preview.edges[&edge].label, *label);
let mut ordinary = d.clone();
ordinary.projection = ProjectionKind::Allocation;
let ordinary_measured =
route_diagram_with_state_label_measurement(&project, &ordinary, &view, &wide);
let ordinary_default = route_diagram(&project, &ordinary, &view);
assert!(ordinary_measured.edges[&edge].label.state_layout.is_none());
assert_eq!(ordinary_measured, ordinary_default);
}
+2 -2
View File
@@ -5241,7 +5241,7 @@ impl App {
if route.waypoints.len() >= 128 {
return;
}
let geometry = crate::state_label::route_diagram(self.project(), diagram, &view);
let geometry = oa_core::routing::route_diagram(self.project(), diagram, &view);
let edge = &geometry.edges[&self.selected];
// Mandatory port leads are inside the card's clearance. A pin
// starts beyond those leads, including coincident short stubs.
@@ -5321,7 +5321,7 @@ impl App {
self.pan = iced::Vector::new(30., 30.);
return;
}
let geometry = crate::state_label::route_diagram(
let geometry = oa_core::routing::route_diagram(
self.project(),
&self.project().diagrams[&self.active_diagram.unwrap()],
&view,
+2 -2
View File
@@ -920,7 +920,7 @@ impl App {
};
let frozen = affected.map(|affected| {
let d = &self.project().diagrams[&diagram];
let routed = crate::state_label::route_diagram(self.project(), d, &view);
let routed = routing::route_diagram(self.project(), d, &view);
Arc::new(Frozen::capture(
self.project(),
d,
@@ -1066,7 +1066,7 @@ impl App {
self.reconcile_multiselect();
}
} else {
let routed = Arc::new(crate::state_label::route_diagram(candidate.project(), placed.diagram(), placed.view()));
let routed = Arc::new(routing::route_diagram(candidate.project(), placed.diagram(), placed.view()));
preview = Some(Arc::new(Preview { token, candidate, placement: placed.into_preview(), routed }));
}
Ok(label)
+1 -1
View File
@@ -85,7 +85,7 @@ impl App {
};
let diagram = &self.project().diagrams[&context.diagram];
let view = projection::project_diagram(self.project(), diagram);
let bounds = crate::state_label::route_diagram(self.project(), diagram, &view).bounds;
let bounds = routing::route_diagram(self.project(), diagram, &view).bounds;
let viewport = self.behavior.diagram.viewport.unwrap_or(iced::Size::new(
(self.window_size.width - 610.).max(280.),
(self.window_size.height - 320.).max(240.),
+24 -85
View File
@@ -744,7 +744,7 @@ pub(crate) fn diagram_usages(
}
}
}
for edge in crate::state_label::route_diagram(project, diagram, view)
for edge in routing::route_diagram(project, diagram, view)
.edges
.values()
{
@@ -754,10 +754,10 @@ pub(crate) fn diagram_usages(
if edge.id == subject || edge.label.text.is_empty() {
continue;
}
// The shared plan paints the complete retained raw summary. Keep its
// original prefix here: display normalization must not shift field offsets.
let painted = &edge.label.text;
if let Some(role) = transition_label_role_in_text(project, relation, subject, painted) {
// Routing already shortens external summaries before the canvas applies
// its width limit. Compare against precisely that doubly shortened text.
let painted = short(&edge.label.text, edge.label.bounds.size.width - 10., 10.);
if let Some(role) = transition_label_role_in_text(project, relation, subject, &painted) {
result.push(Usage {
subject,
surface: Surface::Saved(diagram.id),
@@ -1078,7 +1078,7 @@ impl StateCanvas<'_> {
}
let view = projection::project_diagram(self.project, &diagram);
let routed = if let Some(gesture) = state.bend.as_ref().filter(|_| bend_preview.is_some()) {
crate::state_label::route_edge_preview(
routing::route_edge_preview(
self.project,
&diagram,
&view,
@@ -1086,7 +1086,7 @@ impl StateCanvas<'_> {
gesture.route.edge,
)
} else {
crate::state_label::route_diagram(self.project, &diagram, &view)
routing::route_diagram(self.project, &diagram, &view)
};
let symbol_labels = symbol_labels(self.project, &view, &routed);
let scene = Arc::new(Scene {
@@ -1153,19 +1153,6 @@ impl StateCanvas<'_> {
.map(|n| n.element)
}
fn hit(&self, scene: &Scene, world: Point) -> Option<Hit> {
// State labels paint opaque backgrounds above nodes and rows. Select
// the last painted label at an overlapping pixel, including its padding.
// Endpoint/bend handling remains ahead of this ordinary hit path.
if let Some(edge) = scene.routed.edges.values().rev().find(|edge| {
edge.label.state_layout.is_some()
&& Rectangle::new(
point(edge.label.bounds.position),
Size::new(edge.label.bounds.size.width, edge.label.bounds.size.height),
)
.contains(world)
}) {
return Some(Hit::Transition(edge.id));
}
let node = self.node_at(scene, world);
if let Some(node) = node {
if let Some((relation, _)) = state_action_rows(self.project, node)
@@ -2120,29 +2107,21 @@ impl canvas::Program<Event> for StateCanvas<'_> {
Size::new(label.bounds.size.width, label.bounds.size.height),
Color::WHITE,
);
if let Some(plan) = &label.state_layout {
for (line, offset, ink) in plan
.title_lines
.iter()
.enumerate()
.map(|(index, line)| (line, plan.title_line_position(index), color))
.chain(plan.summary_lines.iter().enumerate().map(|(index, line)| {
(line, plan.summary_line_position(index), style::MUTED)
}))
{
frame.fill_text(Text {
content: line.clone(),
position: point(label.bounds.position)
+ Vector::new(offset.x, offset.y),
size: routing::StateLabelLayout::FONT_SIZE.into(),
line_height: iced::widget::text::LineHeight::Absolute(
routing::StateLabelLayout::LINE_HEIGHT.into(),
),
color: ink,
..Default::default()
});
}
}
let width = label.bounds.size.width - 10.;
label_text(
frame,
short(self.project.named(edge.id), width, 10.),
point(label.bounds.position) + Vector::new(5., 0.),
10.,
color,
);
label_text(
frame,
short(&label.text, width, 10.),
point(label.bounds.position) + Vector::new(5., 12.),
10.,
style::MUTED,
);
if active
&& self
.current_selection()
@@ -2616,7 +2595,6 @@ mod tests {
include!("state_bend_tests.rs");
include!("state_multiselect_canvas_tests.rs");
include!("state_label_canvas_tests.rs");
struct Fixture {
project: Project,
@@ -2825,45 +2803,6 @@ mod tests {
assert!(!retained_label_field("1234A678", "1234…", 4));
}
#[test]
fn state_label_usage_keeps_raw_crlf_prefix_for_later_typed_fields() {
let mut f = fixture();
let first = f
.project
.add_element(Kind::Event, Layer::Sa, "漢\r\nB", None)
.unwrap();
let second = f
.project
.add_element(Kind::Event, Layer::Sa, "Visible", None)
.unwrap();
let edge = f
.project
.relate(RelationKind::StateTransition, "Ready\nfor review", f.a, f.b);
if let RelationBody::StateTransition { triggers, .. } =
&mut f.project.relations.get_mut(&edge).unwrap().body
{
*triggers = vec![first, second];
}
let diagram = &f.project.diagrams[&f.diagram];
let view = projection::project_diagram(&f.project, diagram);
let routed = crate::state_label::route_diagram(&f.project, diagram, &view);
let label = &routed.edges[&edge].label;
assert_eq!(label.text, "External · 漢\r\nB OR Visible");
assert_eq!(
label.state_layout.as_ref().unwrap().summary_lines,
["External · 漢", "B OR Visible"]
);
let usages = diagram_usages(&f.project, diagram, &view, second);
assert!(
usages
.iter()
.any(|u| u.target == Target::Edge(edge) && u.role == "transition trigger")
);
// Feeding normalized display text to raw-prefix matching would lose
// the second field at CRLF. Its raw name and source remain unchanged.
assert_eq!(f.project.named(first), "漢\r\nB");
}
#[test]
fn diagram_usage_external_labels_obey_routing_cutoff_while_internal_rows_retain_full_summary() {
use crate::diagram_usage::Target;
@@ -2898,9 +2837,9 @@ mod tests {
}
let diagram = &f.project.diagrams[&f.diagram];
let view = projection::project_diagram(&f.project, diagram);
let routed = crate::state_label::route_diagram(&f.project, diagram, &view);
let routed = routing::route_diagram(&f.project, diagram, &view);
let edge = &routed.edges[&external];
let painted = &edge.label.text;
let painted = short(&edge.label.text, edge.label.bounds.size.width - 10., 10.);
// Independent painted-text oracle: 11 prefix characters + 35 As, then
// only the space before OR survives the routing limit.
assert_eq!(edge.label.text, format!("External · {} …", "A".repeat(35)));
+1 -1
View File
@@ -328,7 +328,7 @@ pub fn bend_route(
}
let stored = project.diagrams.get(&diagram)?;
let view = projection::project_diagram(project, stored);
let geometry = crate::state_label::route_diagram(project, stored, &view)
let geometry = oa_core::routing::route_diagram(project, stored, &view)
.edges
.remove(&relation)?;
(!geometry.custom_suspended).then_some(geometry)
@@ -1,463 +0,0 @@
// Included in state_canvas::tests. Fixed world points exercise the real scene
// and Program input, rather than choosing a successful point from returned bounds.
fn multiline_label_fixture() -> (Fixture, Id, Id) {
let mut f = fixture();
let work = f
.project
.add_element(Kind::Function, Layer::Sa, "Record request", None)
.unwrap();
let action = f
.project
.relate(RelationKind::StateAction, "Record shared work", f.a, work);
if let RelationBody::StateAction { phase, .. } =
&mut f.project.relations.get_mut(&action).unwrap().body
{
*phase = StateActionKind::Entry;
}
let generated = f
.project
.relate(RelationKind::StateTransition, "Ready\nfor review", f.b, f.c);
let edge = Id::from_u128(36_001);
let mut relation = f.project.relations.remove(&generated).unwrap();
relation.id = edge;
if let RelationBody::StateTransition { guard, .. } = &mut relation.body {
*guard = "request_ready".into();
}
f.project.relations.insert(edge, relation);
// B is (760,180), 224x94. Its bottom midpoint is (872,274).
// Fraction zero plus this authored offset fixes the label center at (440,260),
// over A's entry row (y244..270), independently of text width/routing choices.
f.project
.diagrams
.get_mut(&f.diagram)
.unwrap()
.routes
.push(EdgeRoute {
edge,
waypoints: vec![],
source_attachment: Some(EdgeAttachment {
side: PortAnchorSide::Bottom,
offset: 0.5,
}),
target_attachment: Some(EdgeAttachment {
side: PortAnchorSide::Top,
offset: 0.5,
}),
label: Some(EdgeLabel {
fraction: 0.,
offset: Position { x: -432., y: -14. },
}),
});
validate_candidate(&f.project).unwrap();
(f, edge, action)
}
#[test]
fn state_multiline_label_owns_covered_row_and_node_pixels_but_not_exposed_row() {
let (f, edge, action) = multiline_label_fixture();
let before = f.project.clone();
for zoom in [0.5, 1., 2.] {
let canvas = canvas(&f, Tool::Select, zoom); // Nonzero pan and canvas origin.
let scene = canvas.scene(&State::default()).unwrap();
let label = &scene.routed.edges[&edge].label;
let layout = label
.state_layout
.as_ref()
.expect("dedicated State label plan");
assert_eq!(layout.title_lines, ["Ready", "for review"]);
assert_eq!(
layout.summary_lines,
["External · Completion [request_ready]"]
);
assert_eq!(label.center, Position { x: 440., y: 260. });
assert_eq!(label.bounds.size.height, 36.);
let node = scene.view.nodes.iter().find(|n| n.element == f.a).unwrap();
let row = state_action_rows(&f.project, node)[0].1;
assert!(row.contains(Point::new(440., 260.)));
assert!(!row.contains(Point::new(440., 272.)));
// Second title cell covers a row; summary covers the State header below it.
for at in [Point::new(440., 260.), Point::new(440., 272.)] {
assert_eq!(canvas.hit(&scene, at), Some(Hit::Transition(edge)));
let events = click(&canvas, &mut State::default(), at);
assert!(
matches!(events.as_slice(), [Event::Select(context, id)]
if *context == canvas.context && *id == edge),
"{events:?}"
);
}
let exposed = Point::new(200., 260.);
assert!(row.contains(exposed));
assert_eq!(
canvas.hit(&scene, exposed),
Some(Hit::Row {
placement: node.id,
relation: action
})
);
let events = click(&canvas, &mut State::default(), exposed);
assert!(
matches!(events.as_slice(), [Event::Select(_, id)] if *id == action),
"{events:?}"
);
for (at, object, target) in [
(Point::new(440., 272.), edge, Target::Edge(edge)),
(
exposed,
action,
Target::StateRow {
placement: node.id,
relation: action,
},
),
] {
let mut state = State::default();
let at = screen(&canvas, at);
motion(&canvas, &mut state, at, at);
assert!(
matches!(input(&canvas, &mut state, mouse::Event::ButtonPressed(mouse::Button::Right), at),
Some(Event::ContextMenu { object: actual, selection_target: Some(actual_target), .. })
if actual == object && actual_target == target)
);
}
}
assert_eq!(
f.project, before,
"Hit testing and input cannot author layout or semantics"
);
}
#[test]
fn state_overlapping_label_background_selects_last_painted_even_if_lower_is_selected() {
let (mut f, lower, _) = multiline_label_fixture();
let upper = Id::from_u128(36_002);
let mut relation = f.project.relations[&lower].clone();
relation.id = upper;
relation.alias = "second_multiline_transition".into();
f.project.relations.insert(upper, relation);
let mut route = f.project.diagrams[&f.diagram].routes[0].clone();
route.edge = upper;
// Reverse authored route order: stable edge paint order must still decide.
f.project
.diagrams
.get_mut(&f.diagram)
.unwrap()
.routes
.insert(0, route);
validate_candidate(&f.project).unwrap();
let mut canvas = canvas(&f, Tool::Select, 1.);
canvas.selected = lower;
let selection = group_selection(&canvas, [Target::Edge(lower)]);
canvas.selection = Some(&selection);
let scene = canvas.scene(&State::default()).unwrap();
assert_eq!(
scene.routed.edges[&lower].label.bounds,
scene.routed.edges[&upper].label.bounds
);
let at = Point::new(440., 260.);
assert_eq!(canvas.hit(&scene, at), Some(Hit::Transition(upper)));
let events = click(&canvas, &mut State::default(), at);
assert!(
matches!(events.as_slice(), [Event::Selection(SelectionEvent::Choose(_, Target::Edge(id), Choice::Replace))]
if *id == upper),
"{events:?}"
);
}
#[test]
fn state_multiline_label_and_exposed_row_keep_shift_identity_and_refuse_mixed_drag() {
let (f, edge, action) = multiline_label_fixture();
let before = f.project.clone();
let mut canvas = canvas(&f, Tool::Select, 0.75);
let row = Target::StateRow {
placement: placement(&f, f.a),
relation: action,
};
let selection = group_selection(&canvas, [Target::Edge(edge), row.clone()]);
let snapshot = selection
.snapshot(selection_context(canvas.context))
.unwrap();
canvas.selection = Some(&selection);
canvas.selected = edge;
for (world, target) in [
(Point::new(440., 260.), Target::Edge(edge)),
(Point::new(200., 260.), row),
] {
let at = screen(&canvas, world);
let mut state = State::default();
assert!(
canvas::Program::update(
&canvas,
&mut state,
&canvas::Event::Keyboard(keyboard::Event::ModifiersChanged(
keyboard::Modifiers::SHIFT
)),
bounds(),
mouse::Cursor::Unavailable
)
.is_none()
);
motion(&canvas, &mut state, at, at);
assert!(
matches!(input(&canvas, &mut state, mouse::Event::ButtonPressed(mouse::Button::Left), at),
Some(Event::Selection(SelectionEvent::Choose(context, actual, Choice::Toggle)))
if context == selection_context(canvas.context) && actual == target)
);
assert!(state.group.is_none() && state.press.is_none() && state.bend.is_none());
assert!(
input(
&canvas,
&mut state,
mouse::Event::ButtonReleased(mouse::Button::Left),
at
)
.is_none()
);
let mut state = State::default();
motion(&canvas, &mut state, at, at);
assert!(
input(
&canvas,
&mut state,
mouse::Event::ButtonPressed(mouse::Button::Left),
at
)
.is_none()
);
assert!(state.group.is_some() && state.press.is_none() && state.bend.is_none());
let end = at + Vector::new(30., 20.);
motion(&canvas, &mut state, end, end);
assert!(canvas.group_preview_key(&state, Some(bounds())).is_none());
assert!(
matches!(input(&canvas, &mut state, mouse::Event::ButtonReleased(mouse::Button::Left), end),
Some(Event::Selection(SelectionEvent::Refuse(actual, _))) if actual == snapshot)
);
assert!(state.group.is_none() && state.bend_preview.is_none());
}
assert_eq!(
selection
.snapshot(selection_context(canvas.context))
.unwrap(),
snapshot
);
assert_eq!(f.project, before);
}
#[test]
fn state_multiline_label_group_preview_replaces_old_hit_rectangle_and_cancel_restores_it() {
let (f, edge, action) = multiline_label_fixture();
let before = f.project.clone();
let mut canvas = canvas(&f, Tool::Select, 0.75);
let selection = group_selection(
&canvas,
[
Target::Placement(placement(&f, f.b)),
Target::Placement(placement(&f, f.c)),
],
);
canvas.selection = Some(&selection);
canvas.selected = f.c;
let mut state = State::default();
let baseline = canvas.scene(&state).unwrap();
let old = Point::new(440., 260.);
let moved = Point::new(440., 580.);
assert_eq!(canvas.hit(&baseline, old), Some(Hit::Transition(edge)));
let start = screen(&canvas, Point::new(780., 200.));
let end = start + Vector::new(0., 320. * canvas.scale());
motion(&canvas, &mut state, start, end);
assert!(
input(
&canvas,
&mut state,
mouse::Event::ButtonPressed(mouse::Button::Left),
end
)
.is_none()
);
assert!(state.group.is_some());
motion(&canvas, &mut state, end, end);
let preview = canvas.scene_with_bounds(&state, Some(bounds())).unwrap();
assert_eq!(
preview.routed.edges[&edge].label.center,
Position { x: 440., y: 580. }
);
assert_eq!(
preview.routed.edges[&edge].label.state_layout,
baseline.routed.edges[&edge].label.state_layout
);
assert_eq!(canvas.hit(&preview, moved), Some(Hit::Transition(edge)));
assert_eq!(
canvas.hit(&preview, old),
Some(Hit::Row {
placement: placement(&f, f.a),
relation: action
})
);
assert_eq!(f.project, before, "Group preview is derived only");
assert!(
group_key(
&canvas,
&mut state,
keyboard::key::Named::Escape,
keyboard::Modifiers::empty()
)
.is_none()
);
assert!(state.group.is_none());
let restored = canvas.scene_with_bounds(&state, Some(bounds())).unwrap();
assert_eq!(
restored.routed.edges[&edge].label,
baseline.routed.edges[&edge].label
);
assert_eq!(canvas.hit(&restored, old), Some(Hit::Transition(edge)));
assert_ne!(canvas.hit(&restored, moved), Some(Hit::Transition(edge)));
assert!(
input(
&canvas,
&mut state,
mouse::Event::ButtonReleased(mouse::Button::Left),
end
)
.is_none()
);
assert_eq!(f.project, before);
}
#[test]
fn state_multiline_label_group_commit_matches_fixed_project_and_one_step_history() {
let (f, edge, _) = multiline_label_fixture();
let b = placement(&f, f.b);
let c = placement(&f, f.c);
let before = f.project.clone();
// Declare the complete expected model before driving input. No event, preview,
// movement planner or resulting document supplies the expected displacement.
let mut expected = before.clone();
for id in [b, c] {
let node = expected
.diagrams
.get_mut(&f.diagram)
.unwrap()
.nodes
.get_mut(&id)
.unwrap();
node.position.x += 40.;
node.position.y += 40.;
}
let original_route = before.diagrams[&f.diagram].routes[0].clone();
let mut document = Document::from_project(before.clone(), Default::default()).unwrap();
let original_source = document.bundle().clone();
let mut view_canvas = canvas(&f, Tool::Select, 0.75);
let selection = group_selection(&view_canvas, [Target::Placement(b), Target::Placement(c)]);
let snapshot = selection
.snapshot(selection_context(view_canvas.context))
.unwrap();
view_canvas.selection = Some(&selection);
view_canvas.selected = f.c;
let mut state = State::default();
let baseline = view_canvas.scene(&state).unwrap();
let baseline_label = &baseline.routed.edges[&edge].label;
assert_eq!(baseline_label.center, Position { x: 440., y: 260. });
// Explicit 0.75 scale: thirty screen pixels is the declared forty world
// units. The nonzero pan/origin and ordered pointer helpers stay in play.
let start = screen(&view_canvas, Point::new(780., 200.));
let end = start + Vector::new(30., 30.);
motion(&view_canvas, &mut state, start, end);
assert!(
input(
&view_canvas,
&mut state,
mouse::Event::ButtonPressed(mouse::Button::Left),
end
)
.is_none()
);
assert!(state.group.is_some());
motion(&view_canvas, &mut state, end, end);
let preview = view_canvas
.scene_with_bounds(&state, Some(bounds()))
.unwrap();
let preview_label = &preview.routed.edges[&edge].label;
assert_eq!(preview_label.center, Position { x: 480., y: 300. });
assert_eq!(
preview_label.bounds.position,
Position {
x: baseline_label.bounds.position.x + 40.,
y: baseline_label.bounds.position.y + 40.,
}
);
assert_eq!(preview_label.bounds.size, baseline_label.bounds.size);
assert_eq!(preview_label.state_layout, baseline_label.state_layout);
assert_eq!(
f.project, before,
"Preview must not author its derived label"
);
let event = input(
&view_canvas,
&mut state,
mouse::Event::ButtonReleased(mouse::Button::Left),
end,
)
.unwrap();
let Event::Selection(SelectionEvent::Move(actual_snapshot, delta)) = event else {
panic!("Expected a group movement event, got {event:?}");
};
assert_eq!(actual_snapshot, snapshot);
assert_eq!(delta, Position { x: 40., y: 40. });
assert!(state.group.is_none() && state.press.is_none());
assert!(
input(
&view_canvas,
&mut state,
mouse::Event::ButtonReleased(mouse::Button::Left),
end
)
.is_none()
);
// This is the same production snapshot-to-command boundary used by App's
// SelectionEvent::Move handler; App admission has its existing separate tests.
let ids = crate::app::multiselect::placements(&actual_snapshot).unwrap();
let command =
oa_core::diagram_edit::translate_placements(document.project(), f.diagram, &ids, delta)
.unwrap();
document.execute(command).unwrap();
assert_eq!(document.project(), &expected);
assert_eq!(
document.project().diagrams[&f.diagram].routes[0],
original_route,
"Authored fraction, offset, attachments and empty waypoints remain exact"
);
let committed = StateCanvas {
project: document.project(),
..canvas(&f, Tool::Select, 0.75)
}
.scene(&State::default())
.unwrap();
assert_eq!(
committed.routed.edges[&edge].label, *preview_label,
"Measured settled label, including raw text and every line cell, matches preview"
);
let edited_source = document.bundle().clone();
assert_ne!(
edited_source, original_source,
"The group move is a real source edit"
);
assert!(document.undo());
assert_eq!(document.project(), &before);
assert_eq!(document.bundle(), &original_source);
assert!(
!document.undo(),
"One group release produces exactly one history entry"
);
assert!(document.redo());
assert_eq!(document.project(), &expected);
assert_eq!(document.bundle(), &edited_source);
assert!(!document.redo());
assert_eq!(
selection
.snapshot(selection_context(view_canvas.context))
.unwrap(),
snapshot
);
assert_eq!(f.project, before);
}
+9 -208
View File
@@ -1,7 +1,6 @@
use crate::{
app::Message,
route_edit::{self, Context, Event as RouteEvent, Gesture, Handle, point, position},
state_label::route_diagram,
style,
views::short,
};
@@ -14,7 +13,7 @@ use iced::{
};
use oa_core::{
projection::{ProjectedNode, ProjectedView, project_view},
routing::{RoutedView, StateLabelLayout},
routing::{RoutedView, route_diagram},
*,
};
use std::{
@@ -35,9 +34,6 @@ mod lifecycle_tests;
#[path = "diagram/port_hit_tests.rs"]
mod port_hit_tests;
#[cfg(test)]
#[path = "diagram/state_label_input_tests.rs"]
mod state_label_input_tests;
#[cfg(test)]
#[path = "diagram/view_options_tests.rs"]
mod view_options_tests;
@@ -329,12 +325,7 @@ impl DiagramCanvas<'_> {
request.bend = Some(index);
return request;
}
if let Some(edge) = self.hit_state_label(&scene.routed, local) {
request.object = edge;
request.route_point =
routing::project_onto_polyline(&scene.routed.edges[&edge].points, position(world))
.map(|p| p.point);
} else if let Some(port) = self.hit_port(&scene.view, local) {
if let Some(port) = self.hit_port(&scene.view, local) {
request.object = port.element;
} else if let Some(node) = self.hit(&scene.view, local) {
request.object = self.project.diagrams[&self.diagram].nodes[&node].element;
@@ -433,35 +424,13 @@ impl DiagramCanvas<'_> {
})
.map(|(end, owner, _)| (end, owner))
}
fn hit_state_label(&self, routed: &RoutedView, p: Point) -> Option<Id> {
let world = self.world(p);
// State labels paint after nodes, in BTree order. Hit the frontmost first.
routed
.edges
.values()
.rev()
.find(|edge| {
edge.label.state_layout.is_some()
&& !edge.label.text.is_empty()
&& Rectangle::new(
point(edge.label.bounds.position),
Size::new(edge.label.bounds.size.width, edge.label.bounds.size.height),
)
.contains(world)
})
.map(|edge| edge.id)
}
fn hit_label(&self, routed: &RoutedView, p: Point) -> Option<Id> {
if let Some(edge) = self.hit_state_label(routed, p) {
return Some(edge);
}
let p = self.world(p);
routed
.edges
.values()
.filter(|edge| {
edge.label.state_layout.is_none()
&& !edge.label.text.is_empty()
!edge.label.text.is_empty()
&& Rectangle::new(
point(edge.label.bounds.position),
Size::new(edge.label.bounds.size.width, edge.label.bounds.size.height),
@@ -600,7 +569,7 @@ impl DiagramCanvas<'_> {
.as_ref()
.filter(|g| g.context == self.context)
{
crate::state_label::route_edge_preview(
oa_core::routing::route_edge_preview(
self.project,
&diagram,
&view,
@@ -993,11 +962,8 @@ impl canvas::Program<Message> for DiagramCanvas<'_> {
);
}
let label = &edge.label;
if (if label.state_layout.is_some() {
self.hit_state_label(&scene.routed, p) == Some(edge.id)
} else {
self.hit(view, p).is_none()
}) && !label.text.is_empty()
if self.hit(view, p).is_none()
&& !label.text.is_empty()
&& Rectangle::new(
point(label.bounds.position),
Size::new(label.bounds.size.width, label.bounds.size.height),
@@ -1016,9 +982,6 @@ impl canvas::Program<Message> for DiagramCanvas<'_> {
return Some(Action::capture());
}
}
if let Some(edge) = self.hit_state_label(&scene.routed, p) {
return Some(Action::publish(Message::Select(edge)).and_capture());
}
if let Some(port) = self.hit_port(view, p) {
if self.editable
&& let Some(owner) = view.nodes.iter().find(|n| n.id == port.owner)
@@ -1385,7 +1348,7 @@ impl canvas::Program<Message> for DiagramCanvas<'_> {
Stroke::default().with_color(color).with_width(1.7),
);
}
if routed.label.state_layout.is_none() && !routed.label.text.is_empty() {
if !routed.label.text.is_empty() {
let label = &routed.label;
f.fill_rectangle(
point(label.bounds.position),
@@ -1524,47 +1487,6 @@ impl canvas::Program<Message> for DiagramCanvas<'_> {
f.fill(&Path::circle(center, 1.5), color);
}
}
// State labels follow nodes, matching the dedicated State canvas layer.
for routed in scene.routed.edges.values() {
let label = &routed.label;
let active = self.selected == routed.id
|| highlighted.contains(&routed.id)
|| self.selection_contains(crate::diagram_usage::Target::Edge(routed.id));
if label.state_layout.is_some() && !label.text.is_empty() {
f.fill_rectangle(
point(label.bounds.position),
Size::new(label.bounds.size.width, label.bounds.size.height),
Color::WHITE,
);
if let Some(plan) = &label.state_layout {
for (lines, title) in [(&plan.title_lines, true), (&plan.summary_lines, false)]
{
for (index, line) in lines.iter().enumerate() {
let offset = if title {
plan.title_line_position(index)
} else {
plan.summary_line_position(index)
};
f.fill_text(Text {
content: line.clone(),
position: point(label.bounds.position)
+ Vector::new(offset.x, offset.y),
color: if title {
if active { style::TEAL } else { style::INK }
} else {
style::MUTED
},
size: StateLabelLayout::FONT_SIZE.into(),
line_height: iced::widget::text::LineHeight::Absolute(
StateLabelLayout::LINE_HEIGHT.into(),
),
..Default::default()
});
}
}
}
}
}
if let Some(bounds) = self.navigation_focus {
f.stroke(
&Path::rectangle(bounds.position(), bounds.size()),
@@ -2021,34 +1943,6 @@ impl std::fmt::Display for ExportError {
}
impl std::error::Error for ExportError {}
fn edge_label_svg(label: &routing::EdgeLabelGeometry) -> String {
if label.text.is_empty() {
return String::new();
}
let mut svg = format!(
"<rect x=\"{}\" y=\"{}\" width=\"{}\" height=\"{}\" fill=\"white\"/>",
label.bounds.position.x,
label.bounds.position.y,
label.bounds.size.width,
label.bounds.size.height
);
if let Some(plan) = &label.state_layout {
for (lines, title) in [(&plan.title_lines, true), (&plan.summary_lines, false)] {
for (index, line) in lines.iter().enumerate() {
let offset = if title {
plan.title_line_position(index)
} else {
plan.summary_line_position(index)
};
svg.push_str(&format!("<text x=\"{}\" y=\"{}\" dominant-baseline=\"text-before-edge\" xml:space=\"preserve\" font-family=\"sans-serif\" font-size=\"{}\" fill=\"{}\">{}</text>", label.bounds.position.x + offset.x, label.bounds.position.y + offset.y, StateLabelLayout::FONT_SIZE, hex(if title { style::INK } else { style::MUTED }), escape(line)));
}
}
} else {
svg.push_str(&format!("<text x=\"{}\" y=\"{}\" text-anchor=\"middle\" dominant-baseline=\"central\" font-family=\"sans-serif\" font-size=\"13\" fill=\"#637487\">{}</text>",label.center.x,label.center.y,escape(&label.text)));
}
svg
}
pub fn export_svg(p: &Project, diagram: Id) -> Result<String, ExportError> {
let d = p
.diagrams
@@ -2135,8 +2029,8 @@ pub fn export_svg(p: &Project, diagram: Id) -> Result<String, ExportError> {
.join(" ");
svg.push_str(&format!("<path data-edge=\"{}\" d=\"{path}\" fill=\"none\" stroke=\"#8999a9\" stroke-width=\"1.5\"{dashed}{arrow}><title>{}</title></path>",edge.id,escape(p.named(edge.id))));
let label = &route.label;
if label.state_layout.is_none() {
svg.push_str(&edge_label_svg(label));
if !label.text.is_empty() {
svg.push_str(&format!("<rect x=\"{}\" y=\"{}\" width=\"{}\" height=\"{}\" fill=\"white\"/><text x=\"{}\" y=\"{}\" text-anchor=\"middle\" dominant-baseline=\"central\" font-family=\"sans-serif\" font-size=\"13\" fill=\"#637487\">{}</text>",label.bounds.position.x,label.bounds.position.y,label.bounds.size.width,label.bounds.size.height,label.center.x,label.center.y,escape(&label.text)));
}
if let Some(relation) = p.relations.get(&edge.id) {
for end in routing::association_end_geometry(relation, route) {
@@ -2195,11 +2089,6 @@ pub fn export_svg(p: &Project, diagram: Id) -> Result<String, ExportError> {
}
svg.push_str("</g>");
}
for route in routed.edges.values() {
if route.label.state_layout.is_some() {
svg.push_str(&edge_label_svg(&route.label));
}
}
svg.push_str("</svg>");
Ok(svg)
}
@@ -3057,94 +2946,6 @@ mod tests {
);
assert!(state.route_drag.is_none());
}
#[test]
fn state_svg_paints_separate_escaped_lines_at_shared_layout_origins() {
let plan = StateLabelLayout::new(
"Ready\r\nfor <review>&",
"External\nCompletion [ready]",
&|line| line.len() as f32 * 8.0,
);
let label = routing::EdgeLabelGeometry {
text: "External\nCompletion [ready]".into(),
fraction: 0.5,
anchor: Position { x: 0.0, y: 0.0 },
center: Position { x: 0.0, y: 0.0 },
bounds: routing::RoutingBounds {
position: Position { x: 100.0, y: 200.0 },
size: plan.size(),
},
state_layout: Some(plan),
};
let svg = edge_label_svg(&label);
assert_eq!(svg.matches("<text ").count(), 4);
for (y, color, text) in [
(200, "#18212c", "Ready"),
(212, "#18212c", "for &lt;review&gt;&amp;"),
(224, "#4b5968", "External"),
(236, "#4b5968", "Completion [ready]"),
] {
assert!(svg.contains(&format!("<text x=\"105\" y=\"{y}\" dominant-baseline=\"text-before-edge\" xml:space=\"preserve\" font-family=\"sans-serif\" font-size=\"10\" fill=\"{color}\">{text}</text>")), "{svg}");
}
assert!(svg.contains("height=\"48\""));
assert!(!svg.contains("text-anchor=\"middle\""));
}
#[test]
fn state_export_routes_measured_multiline_label_above_nodes() {
let mut p = Project::empty();
let owner = p
.add_element(Kind::Entity, Layer::Oa, "Crew", None)
.unwrap();
let machine = p
.add_element(Kind::StateMachine, Layer::Oa, "Modes", Some(owner))
.unwrap();
let region = p
.add_element(Kind::Region, Layer::Oa, "Main", Some(machine))
.unwrap();
let a = p
.add_element(Kind::State, Layer::Oa, "Source state", Some(region))
.unwrap();
let b = p
.add_element(Kind::State, Layer::Oa, "Target state", Some(region))
.unwrap();
let edge = p.relate(RelationKind::StateTransition, "Ready\nfor <review>&", a, b);
let diagram = Id::new_v4();
p.diagrams.insert(
diagram,
Diagram {
id: diagram,
alias: "state_export".into(),
name: "State export".into(),
description: String::new(),
layer: Layer::Oa,
projection: ProjectionKind::StateMachine { machine },
view_options: Default::default(),
nodes: BTreeMap::new(),
layout: None,
routes: vec![],
},
);
p.place(diagram, a, Position { x: 100.0, y: 100.0 });
p.place(diagram, b, Position { x: 600.0, y: 100.0 });
let view = project_view(&p, diagram);
let routed = route_diagram(&p, &p.diagrams[&diagram], &view);
let label = &routed.edges[&edge].label;
let plan = label.state_layout.as_ref().unwrap();
assert_eq!(plan.title_lines, ["Ready", "for <review>&"]);
assert_eq!(plan.summary_lines.len(), 1);
assert_eq!(label.bounds.size.height, 36.0);
let svg = export_svg(&p, diagram).unwrap();
let label_svg = edge_label_svg(label);
assert!(svg.ends_with(&format!("{label_svg}</svg>")));
assert!(svg.find("Target state</text>").unwrap() < svg.find("Ready</text>").unwrap());
assert!(svg.contains("for &lt;review&gt;&amp;</text>"));
assert!(svg.contains(&format!(
"x=\"{}\" y=\"{}\" dominant-baseline=\"text-before-edge\"",
label.bounds.position.x + 5.0,
label.bounds.position.y + 24.0
)));
}
#[test]
fn routed_svg_has_same_polyline_label_and_bounds_as_canvas_scene() {
let (mut p, diagram, edge) = route_fixture();
@@ -196,27 +196,8 @@ impl DiagramCanvas<'_> {
let pointer = cursor.position()?;
let local = Point::new(pointer.x - bounds.x, pointer.y - bounds.y);
let scene = self.scene(state);
let world = self.world(local);
// Preserve foreground selected handles without bypassing Shift or the
// mixed-group admission/refusal lifecycle below.
let state_handle = self.project.diagrams[&self.diagram]
.projection
.state_machine()
.is_some()
&& scene.routed.edges.get(&self.selected).is_some_and(|edge| {
!edge.custom_suspended
&& (self.attachment_at(&scene, world).is_some()
|| edge
.pins
.iter()
.any(|pin| world.distance(point(*pin)) <= 8. / self.zoom))
});
let target = if self.allocation_surface() {
self.allocation_press_target(&scene, local)
} else if state_handle {
Some(Target::Edge(self.selected))
} else if let Some(id) = self.hit_state_label(&scene.routed, local) {
Some(Target::Edge(id))
} else if let Some(port) = self.hit_port(&scene.view, local) {
Some(Target::Port {
port: port.element,
@@ -1,230 +0,0 @@
use super::*;
use crate::{
app::multiselect::{Choice, Event, context},
diagram_selection::Selection,
diagram_usage::Target,
};
fn fixture() -> (Project, Id, Id, Id, Id) {
let mut p = Project::empty();
let owner = p
.add_element(Kind::Entity, Layer::Oa, "Crew", None)
.unwrap();
let machine = p
.add_element(Kind::StateMachine, Layer::Oa, "Modes", Some(owner))
.unwrap();
let region = p
.add_element(Kind::Region, Layer::Oa, "Main", Some(machine))
.unwrap();
let a = p
.add_element(Kind::State, Layer::Oa, "A", Some(region))
.unwrap();
let b = p
.add_element(Kind::State, Layer::Oa, "B", Some(region))
.unwrap();
let mut edges = [
p.relate(RelationKind::StateTransition, "Ready\nfor review", a, b),
p.relate(RelationKind::StateTransition, "Ready\nfor review", a, b),
];
edges.sort();
let diagram = Id::new_v4();
p.diagrams.insert(
diagram,
Diagram {
id: diagram,
alias: "state_input".into(),
name: "State input".into(),
description: String::new(),
layer: Layer::Oa,
projection: ProjectionKind::StateMachine { machine },
view_options: Default::default(),
nodes: BTreeMap::new(),
layout: None,
routes: edges
.iter()
.map(|edge| EdgeRoute {
edge: *edge,
source_attachment: None,
target_attachment: None,
waypoints: vec![Position { x: 200., y: 150. }],
label: None,
})
.collect(),
},
);
let node = p.place(diagram, a, Position { x: 100., y: 100. });
p.place(diagram, b, Position { x: 650., y: 100. });
let routed = route_diagram(&p, &p.diagrams[&diagram], &project_view(&p, diagram));
for route in &mut p.diagrams.get_mut(&diagram).unwrap().routes {
let label = &routed.edges[&route.edge].label;
route.label = Some(EdgeLabel {
fraction: label.fraction,
offset: Position {
x: 200. - label.anchor.x,
y: 150. - label.anchor.y,
},
});
}
(p, diagram, edges[0], edges[1], node)
}
fn canvas(p: &Project, diagram: Id, selected: Id, zoom: f32) -> DiagramCanvas<'_> {
DiagramCanvas {
selection: None,
project: p,
view_index: None,
diagram,
selected,
navigation_focus: None,
zoom,
pan: Vector::new(100., 100.),
context: Context {
document: p.id,
diagram,
revision: 0,
epoch: 0,
},
selected_bend: None,
selected_attachment: None,
editable: true,
placing: false,
connection: None,
allocation: None,
}
}
fn screen(canvas: &DiagramCanvas<'_>, y: f32) -> Point {
Point::new(
200. * canvas.zoom + canvas.pan.x,
y * canvas.zoom + canvas.pan.y,
)
}
fn pointer(
canvas: &DiagramCanvas<'_>,
state: &mut State,
event: mouse::Event,
at: Point,
) -> Option<Message> {
canvas::Program::update(
canvas,
state,
&canvas::Event::Mouse(event),
Rectangle::with_size(Size::new(1800., 1200.)),
mouse::Cursor::Available(at),
)
.and_then(|a| a.into_inner().0)
}
#[test]
fn state_generic_front_label_beats_node_and_selected_back_label_at_three_zooms() {
for zoom in [0.5, 1., 1.5] {
let (p, diagram, low, high, _) = fixture();
let mut canvas = canvas(&p, diagram, low, zoom);
// Ten world pixels below center remains on both labels but avoids bends.
let at = screen(&canvas, 160.);
let scene = canvas.scene(&State::default());
assert!(canvas.hit(&scene.view, at).is_some());
assert_eq!(canvas.hit_label(&scene.routed, at), Some(high));
// Selected bends have a screen radius: move further down at half zoom.
let at = if zoom == 0.5 {
screen(&canvas, 167.)
} else {
at
};
assert_eq!(
canvas
.context_request(
&State::default(),
at,
Rectangle::with_size(Size::new(1800., 1200.))
)
.object,
high
);
let mut state = State::default();
assert!(
matches!(pointer(&canvas, &mut state, mouse::Event::ButtonPressed(mouse::Button::Left), at), Some(Message::Select(id)) if id == high)
);
assert!(state.drag.is_none() && state.route_drag.is_none());
canvas.selected = high;
let mut state = State::default();
pointer(
&canvas,
&mut state,
mouse::Event::ButtonPressed(mouse::Button::Left),
at,
);
assert!(matches!(
state.route_drag.as_ref().map(|g| &g.handle),
Some(Handle::Label { .. })
));
canvas.editable = false;
let mut state = State::default();
assert!(
matches!(pointer(&canvas, &mut state, mouse::Event::ButtonPressed(mouse::Button::Left), at), Some(Message::Select(id)) if id == high)
);
assert!(state.drag.is_none() && state.route_drag.is_none());
}
}
#[test]
fn state_generic_shift_label_and_handle_keep_exact_targets_and_mixed_refusal() {
let (p, diagram, low, high, node) = fixture();
let base = canvas(&p, diagram, low, 1.);
let mut single_state = State::default();
assert!(
matches!(pointer(&base, &mut single_state, mouse::Event::ButtonPressed(mouse::Button::Left), screen(&base, 150.)), Some(Message::Route(RouteEvent::SelectBend(id, 0))) if id == low)
);
assert!(matches!(
single_state.route_drag.as_ref().map(|g| &g.handle),
Some(Handle::Bend(0))
));
let mut selection = Selection::new(context(base.context).scope);
selection.add(Target::Edge(low), |_| true);
selection.add(Target::Placement(node), |_| true);
let canvas = DiagramCanvas {
selection: Some(&selection),
..base
};
for (y, expected) in [(160., high), (150., low)] {
let mut state = State {
modifiers: iced::keyboard::Modifiers::SHIFT,
..State::default()
};
assert!(
matches!(pointer(&canvas, &mut state, mouse::Event::ButtonPressed(mouse::Button::Left), screen(&canvas,y)), Some(Message::DiagramSelection(Event::Choose(_, Target::Edge(id), Choice::Toggle))) if id == expected)
);
assert!(state.drag.is_none() && state.route_drag.is_none());
}
let mut state = State::default();
let at = screen(&canvas, 150.);
assert_eq!(
canvas
.context_request(&state, at, Rectangle::with_size(Size::new(1800., 1200.)))
.bend,
Some(0)
);
pointer(
&canvas,
&mut state,
mouse::Event::ButtonPressed(mouse::Button::Left),
at,
);
assert!(state.group.is_some() && state.route_drag.is_none());
let moved = at + Vector::new(20., 20.);
pointer(
&canvas,
&mut state,
mouse::Event::CursorMoved { position: moved },
moved,
);
assert!(matches!(
pointer(
&canvas,
&mut state,
mouse::Event::ButtonReleased(mouse::Button::Left),
moved
),
Some(Message::DiagramSelection(Event::Refuse(_, _)))
));
assert!(state.route_drag.is_none() && state.drag.is_none());
}
+1 -1
View File
@@ -6,7 +6,7 @@ impl DiagramCanvas<'_> {
pub(crate) fn work_dirty_point(&self, bounds: Rectangle, screen: Point) -> bool {
let diagram = &self.project.diagrams[&self.diagram];
let view = self.projected(diagram);
let routed = crate::state_label::route_diagram(self.project, diagram, &view);
let routed = routing::route_diagram(self.project, diagram, &view);
self.work_dirty_press(
&view,
&routed,
+2 -2
View File
@@ -327,7 +327,7 @@ pub(crate) fn saved_usages_for(p: &Project, subject: Id, only_diagram: Option<Id
"state machine view"
}
.into(),
bounds: routed_bounds(crate::state_label::route_diagram(p, diagram, &view).bounds),
bounds: routed_bounds(routing::route_diagram(p, diagram, &view).bounds),
});
}
for node in &view.nodes {
@@ -407,7 +407,7 @@ pub(crate) fn saved_usages_for(p: &Project, subject: Id, only_diagram: Option<Id
}
}
if view.edges.iter().any(|edge| edge.id == subject)
&& let Some(edge) = crate::state_label::route_diagram(p, diagram, &view)
&& let Some(edge) = routing::route_diagram(p, diagram, &view)
.edges
.get(&subject)
{
-1
View File
@@ -34,7 +34,6 @@ mod source_navigation;
mod source_rename;
mod source_tree;
mod source_workspace;
mod state_label;
mod style;
#[cfg(test)]
mod tests;
-81
View File
@@ -1,81 +0,0 @@
//! Desktop routing uses the same font/shaping defaults as canvas text.
use iced::advanced::{
graphics::text::Paragraph,
text::{self, Paragraph as _},
};
use oa_core::{
Diagram, Id, Project,
projection::ProjectedView,
routing::{self, RoutedView, StateLabelLayout},
};
fn measure_line(line: &str) -> f32 {
let defaults = iced::widget::canvas::Text::default();
Paragraph::with_text(text::Text {
content: line,
bounds: iced::Size::INFINITE,
size: StateLabelLayout::FONT_SIZE.into(),
line_height: text::LineHeight::Absolute(StateLabelLayout::LINE_HEIGHT.into()),
font: defaults.font,
align_x: defaults.align_x,
align_y: defaults.align_y,
shaping: defaults.shaping,
wrapping: text::Wrapping::None,
})
.min_width()
}
pub fn route_diagram(project: &Project, diagram: &Diagram, view: &ProjectedView) -> RoutedView {
routing::route_diagram_with_state_label_measurement(project, diagram, view, &measure_line)
}
pub fn route_edge_preview(
project: &Project,
diagram: &Diagram,
view: &ProjectedView,
baseline: &RoutedView,
edge: Id,
) -> RoutedView {
routing::route_edge_preview_with_state_label_measurement(
project,
diagram,
view,
baseline,
edge,
&measure_line,
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn wide_glyphs_use_shaped_width_instead_of_character_estimate() {
let wide = "W".repeat(40);
let narrow = "i".repeat(40);
let width = measure_line(&wide);
assert!(width > measure_line(&narrow) * 2.0);
assert!(width > 40.0 * 7.0);
let plan = StateLabelLayout::new(&wide, &wide, &measure_line);
assert_eq!(
plan.size().width,
width + 2.0 * StateLabelLayout::HORIZONTAL_PADDING
);
}
#[test]
fn unicode_fallback_and_combining_text_have_finite_measured_bounds() {
for line in ["漢字 Ελληνικά العربية", "e\u{301} cafe\u{301}", "🙂 🧭"]
{
let width = measure_line(line);
assert!(width.is_finite() && width > 0.0, "{line:?}: {width}");
let plan = StateLabelLayout::new(line, line, &measure_line);
assert_eq!(
plan.size().width,
width + 2.0 * StateLabelLayout::HORIZONTAL_PADDING
);
}
assert!(measure_line("e\u{301}") < measure_line("ee"));
}
}
-6
View File
@@ -498,9 +498,3 @@ editing remains separate from semantic reconnect. The [decision and evidence
map](edge-attachments-20260922.md) records alternatives, lifecycle rules,
independent falsifiers, evaluators and the Process/Scenario applicability limits.
This is branch-specific work; it does not establish an integrated release.
## External State transition label measurement — 2026-09-24
Issue #36's reproduced collision comes from a two-line title painted in space reserved for one line, with bounds sized from its summary. Adopt one derived hard-line plan measured before routing, shared by paint/hit/preview/focus/SVG. Preserve raw excerpt provenance, authored centers/routes and model/source bytes. Desktop measures with the canvas Paragraph defaults; core retains an explicit approximate fallback. Opaque State label backgrounds own covered hits in reverse paint order while selected handles and group admission retain precedence.
The [contract](state-label-layout-contract.md) is authoritative for exact rules and alternatives. The [verification](experiments/state-label-layout-20260924/README.md) records the width-estimate and generic-hit falsifiers, independent review, scoped Windows outcomes, restored-window input limitation and reasons not to infer universal font or collision-free layout support. Revisit if new ink-overhang, shaping, routing-cost, or authored-occlusion evidence invalidates the bounded design. Dynamic node/row sizing and source/model changes were deliberately excluded.
+1 -9
View File
@@ -1,12 +1,4 @@
# Verified branch checkpoint — State label follow-up
This branch's code through **70bdcdf8fec1728e971cd90ad7f79a1df99777ff** corrects external State transition title/summary layout and measured label hit areas. The [contract](state-label-layout-contract.md) and [verification](experiments/state-label-layout-20260924/README.md) identify exact source, commands, native fixtures, original evidence and limits. Windows focused core68, full desktop1540/7 existing ignores, formatting, strict workspace/all-target Clippy, builds, and six maximized-window B/W/U Save/reopen checks pass. Restored-window coordinate input remains an explicit native-test limitation. This is branch-specific evidence, not merged-main or complete-application acceptance; live integration status is [issue36](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/36).
The separate [September24 integrated prerelease](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/releases/tag/v0.2.0-preview.integrated.20260924) is published at **715036e132677dd2bc2fb37ed316d93dc9987aec** with owner publication receipt **76acfb11085ae36bd65971f5f1cf34f45d362ada**. The label follow-up does not replace that tag or its artifacts. Linux remains excluded. Later private analysis branch status must be read from Gitea and that branch, not inferred from this checkpoint.
## Historical source checkpoint inherited from715036e — 2026-09-24 UTC
The source-preparation statements below describe that earlier checkpoint. Its then-pending prerelease gates were subsequently completed in the publication linked above; its other scoped evidence retains its original code versions.
# Integrated prerelease source checkpoint — 2026-09-24 UTC
This branch assembles peer contributions for the Windows prerelease in issue37.
[PROJECT_GOAL.md](../PROJECT_GOAL.md) remains authoritative. The complete OA/SA
@@ -1,2 +0,0 @@
# Preserve receipt and review bytes exactly as bound by the evidence indexes.
* -text whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
@@ -1,85 +0,0 @@
# State transition multiline label verification
Issue [#36](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/36), Codex-ytr83r/root. Tested production/test source is **70bdcdf8fec1728e971cd90ad7f79a1df99777ff**, based on released **715036e132677dd2bc2fb37ed316d93dc9987aec**. Subsequent commits containing this evidence are documentation-only. The September 24 prerelease remains unchanged. Integration ownership and status belong to the issue.
## Outcome and boundary
The original `Ready\nfor review` title no longer collides with its summary. Routing prepares a shared, measured hard-line plan used by canvas paint, hit boxes, previews, focus/Fit and SVG. Opaque State labels receive hits before covered node/row pixels, in reverse paint order; exposed action rows retain their identity. Authored geometry and all semantic/source data remain unchanged. See the [contract](../../state-label-layout-contract.md) for the retained excerpt budgets, separators, measurement and scope.
The bounded Windows implementation passed its focused core gates, full desktop suite, formatting, strict workspace/all-target Clippy, product builds, and maximized-window native B/W/U Save/reopen checks. A later isolated trial also passed Home Open and all three transition text-row hits at restored1442×932/displayed79%, preserving all nine source files and the entire Project. The earlier unsuccessful restored1442×842 attempt and Home-button discrepancy remain explicit in [observations](observations.md) and [independent native review](native-review.md); the later success does not establish their cause. No all-window input or universal Unicode rendering claim follows. This is a follow-up contribution, not a replacement release or complete application acceptance.
## Automated checks
Windows x86_64-pc-windows-gnullvm, Rust1.98.1, locked/offline dependencies, one build job, no incremental compilation. All completed successful gates preserve identical source inventories before/after.
| Gate | Source | Result |
| --- | --- | --- |
| `cargo test --locked --offline -p oa-core --test state_label_layout -- --test-threads=1` | 2af40c7e | 4 passed |
| `cargo test --locked --offline -p oa-core --test group_movement --test release_routing --test release_states --test routing_geometry --test routing_labels --test state_diagrams -- --test-threads=1` | 2af40c7e | 64 passed |
| `cargo test --locked --offline -p oa-desktop --bin arcadia-studio -- --test-threads=1` | 70bdcdf8 | 1540 passed, 0 failed, 7 unchanged existing manual/diagnostic ignores |
| `cargo fmt --all -- --check` | 70bdcdf8 | passed |
| `cargo clippy --locked --offline --workspace --all-targets -- -D warnings` | 70bdcdf8 | passed, no warnings |
| `cargo build -p oa-desktop --bin arcadia-studio --locked --offline --message-format=json-render-diagnostics` | 70bdcdf8 | passed |
| `cargo build -p oa-core --example attachment_snapshot --locked --offline --message-format=json-render-diagnostics` | 70bdcdf8 | passed |
Core production/tests did not change after2af40c7e. Desktop adds12 passing regressions, with no removed or changed baseline outcomes. They cover width-dominating text and Unicode measurements, raw-prefix typed-reference provenance, covered/exposed row and overlapping-label selection, Shift/mixed-group refusal, generic fallback canvas, preview cancellation, fixed(+40,+40) complete-Project group commit/one-step Undo/Redo, and SVG line positions/order. These are scoped checks; the full workspace test suite was not repeated for this follow-up.
Preserved failure: desktop gate03 at66278ed3 failed compilation with E0382 in a new test; no tests ran. Commit70bdcdf8 adds `row.clone()` in that test only. Its failed receipt remains failed; later success does not relabel it. The [source review](source-review.md) also preserves and closes the earlier generic-fallback hit-order finding at the source-review level.
## Native trial
The exact original nine-file fixture comes from peerbed7f825fd00ec32299032a664a5f5d753aad86d, `harness/experiments/state-multiselect-20260923/native/evidence.zip`, SHA256`1d08c1bc6af4856a569ddd320ddf5403a302b8d9437750663a498541e489d663`.
B is original; W changes only the transition title to40 W characters; U changes only that title to CRLF/CJK/combining/ZWJ/trailing-newline text. Independent complete-Project oracles and exact source bytes are frozen before GUI input. At the actual maximized1605×872 window, displayed68% and82% scales show separated/contained lines. Inspector aliases establish label-versus-exposed-action selection. Native group movement M is unexecuted; the fixed movement/history regression supplies that separate evidence.
All six pure-layout checkpoints passed: initial Save and fresh-process reopen/Save for B/W/U. Each preserves the entire Project and all nine source files byte-for-byte. Two isolated-profile processes exited0 after parent-observed Alt+F4, with empty logs and immutable binaries/source inputs unchanged. The [independent review](native-review.md) checks original images, complete models, every source-file hash and both process logs. Recorded zoom percentages are rounded; no exact100% or DPI calibration is claimed.
Preserved GUI:119440896 bytes, SHA256`0401341388025544185455ad5520aa2c1b79ca1387d1a57c2bb0bddb8b23754a`. Runtime libunwind.dll SHA256`aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a`. The supplemental bundle reader was built from the same candidate/compiler and is separate from the Cargo product artifacts.
## Reusable evidence
### Supplemental restored-window trial, September 25
The [supplemental observations](restored-native-observations.md) record the same
preserved70bdcdf8 executable, rechecked before launch, with a fresh isolated copy
of B and a private recent-model profile. At1442×932/displayed79%, Home Open loaded
the fixture. First title, second title, and summary clicks each selected stable
transition alias `between`; the latter two followed independently observed
selection of `state_b`. Pure Save preserved all nine source files byte-for-byte
and the complete expected Project. Alt+F4 termination was observed and both GUI
logs were empty, but the watcher returned a null exit code; this is not exit0
evidence. The initial incorrect direct snapshot invocation rejected includes;
the established converter-then-snapshot verification subsequently passed.
That invocation error is preserved narratively; its original stderr was replaced
by the successful rerun's empty log. The [independent supplemental review](restored-native-review.md)
checks all ten original images, archive members, source/model comparisons and
tool hashes, and retains this evidence limitation.
[Supplemental ZIP](restored-native-evidence.zip):888553 bytes,
SHA256`f120509338fb0ac55480ce11929381fb1a46fecf7d3a1c8869c395335f0eba0a`.
Its45 evidence members plus manifest include original captures, source copies,
verification scripts/results and launch/close records. Executables/DLLs are
excluded. The [integrity receipt](restored-native-integrity.json) records successful
CRC and every member length/hash checks. Historical builder paths require local
relocation. Earlier failures remain unexplained; this bounded success does not
replace the previous evidence or establish acceptance at other window sizes.
A subsequent bounded attempt to obtain the original1442×842 size was
**unexecuted**: supported UI resizing yielded932→921→732 heights and tool
target/bounds errors. The fixture was never opened or saved. Its unchanged
bytes/model establish copied-fixture integrity only. [Exact observations and
errors](restored842-observations.md) preserve this outcome without diagnosing an
application defect. [Attempt ZIP](restored842-attempt.zip):661746 bytes,
SHA256`3efb41d79a9dab70d7026ba83a7f9ec60a319fab79a8f0a383f3ce7a71b0f42f`;
[integrity receipt](restored842-integrity.json). The original height-specific
acceptance gap remains open.
### Original trial and automated gates
- [Native evidence ZIP](native-evidence.zip):2886914 bytes, SHA256`039add524eb99ce855c2dc5680eec01c1d5b7f23024025c428125b9771a8e687`.
- [Native archive receipt](native-archive.json) and [member/relocation index](native-collection.json) preserve original paths and hashes; these paths describe the builder machine and are not peer-accessible dependencies. The ZIP carries original captures, metadata, source fixtures/oracles, checkpoint/process/helper receipts and hash-bound scripts, plus unchanged parent observations and review. Binary/cache payloads are excluded with their hashes retained.
- [Automated evidence ZIP](automated-evidence.zip):6244436 bytes, SHA256`7706302ef7ee5d160a23ff2d562bedb8911b4e6d7ad4c941544088974b539b6e`,113 verified members. Its [index](automated-index.json), [integrity receipt](automated-integrity.json), and [scope note](automated-README.md) retain both successful and failed command records, frozen build environment, exact source inventories, compiler/dependency receipts and reproducible helper sources. Consult original per-command results rather than adding counts from different scopes.
Native archive member bytes and exact member set were read back after creation; all six independent model comparisons and source-snapshot checks passed, both process receipts were clean, and no bound input changed. The collector establishes archive integrity, not visual correctness by itself.
To reproduce on another Windows machine: check out70bdcdf8, use the project Windows build instructions, run the commands above, obtain the pinned peer fixture, and use the preserved trial/launcher recipes with newly generated local build/admission paths. Never reuse the builder's historical absolute paths or claim its binaries were rebuilt locally. Linux remains excluded by the user's current instruction. External SVG viewer font substitution, authored label occlusion of nodes, dynamic State row/header sizing, and broader State/Process congestion remain limitations outside this fix.
@@ -1,11 +0,0 @@
# #36 automated evidence archive
Original gate01–09 and supplemental converter receipts/logs, preserved byte-for-byte.
Source attribution remains per gate:01/02 at2af40c7e,03 at66278ed3,04–09 and converter at70bdcdf8. Gate03 is the retained E0382 compile failure (exit101, no tests executed); gate04 is its later corrected run. Seven existing ignored desktop tests remain ignored. See raw command results and test-evidence note. No full-workspace, native GUI or overall acceptance claim is made here.
The ZIP includes source inventories, frozen environments, Cargo JSON artifact ownership, original compiler/library hash inventories, process-command logs, scripts and attributed review notes. Executable/runtime/rlib payloads are omitted; index.json records their exact hashes, sizes and original paths. Historical absolute paths inside receipts are unchanged. This archive is evidence, not a runnable distribution; reproduce against each identified source commit using the retained commands/environment/toolchain bindings.
Existing notes describe their own review scope/time and may identify findings resolved later; they are not silently rewritten by packaging. Parent-owned native observations and captures belong in their separate native evidence archive.
Packaging verifies exact ZIP member names/count and decompressed SHA256/length for every member, including this README and index. integrity.json outside ZIP identifies the final ZIP and confirms original gate/converter inventories unchanged. No build/helper/GUI was executed and no publication performed by packaging.
@@ -1,866 +0,0 @@
{
"created_utc": "2026-09-25T00:06:28.817849+00:00",
"gates": [
{
"name": "01-core-layout",
"source_commit": "2af40c7e27ed9750b9585c07369dbf17a046a92d",
"argv": [
"cargo",
"test",
"--locked",
"--offline",
"-p",
"oa-core",
"--test",
"state_label_layout",
"--",
"--test-threads=1"
],
"exit_code": 0,
"runner_failure": null,
"inputs_unchanged": true,
"result": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\command\\result.json",
"bytes": 4180,
"sha256": "902fe24f6304c830f90edb060004d9ffcc218102ee19615171aa82afd7fdfe1f"
},
"classification": "completed_command",
"scope": "Recorded scoped command outcome, not overall acceptance"
},
{
"name": "02-core-routing-state",
"source_commit": "2af40c7e27ed9750b9585c07369dbf17a046a92d",
"argv": [
"cargo",
"test",
"--locked",
"--offline",
"-p",
"oa-core",
"--test",
"group_movement",
"--test",
"release_routing",
"--test",
"release_states",
"--test",
"routing_geometry",
"--test",
"routing_labels",
"--test",
"state_diagrams",
"--",
"--test-threads=1"
],
"exit_code": 0,
"runner_failure": null,
"inputs_unchanged": true,
"result": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\command\\result.json",
"bytes": 4382,
"sha256": "6d102bf5b2e715316233f47756cb21215209045360ae736235974651435c6652"
},
"classification": "completed_command",
"scope": "Recorded scoped command outcome, not overall acceptance"
},
{
"name": "03-desktop-tests",
"source_commit": "66278ed33b95961d1c129e2ddc172c567effbf9b",
"argv": [
"cargo",
"test",
"--locked",
"--offline",
"-p",
"oa-desktop",
"--bin",
"arcadia-studio",
"--",
"--test-threads=1"
],
"exit_code": 101,
"runner_failure": null,
"inputs_unchanged": true,
"result": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\command\\result.json",
"bytes": 4185,
"sha256": "a8e98b66b01f9965f0d49d9f9a4b83fd25e543295c29d8cefc575e98d2346e2c"
},
"classification": "failed_compile_no_tests",
"scope": "Recorded scoped command outcome, not overall acceptance"
},
{
"name": "04-desktop-tests",
"source_commit": "70bdcdf8fec1728e971cd90ad7f79a1df99777ff",
"argv": [
"cargo",
"test",
"--locked",
"--offline",
"-p",
"oa-desktop",
"--bin",
"arcadia-studio",
"--",
"--test-threads=1"
],
"exit_code": 0,
"runner_failure": null,
"inputs_unchanged": true,
"result": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\command\\result.json",
"bytes": 4187,
"sha256": "868aeace11d5307be72c01db0bb64347aed700c70fac3efb3ae0ac92d5c32707"
},
"classification": "completed_command",
"scope": "Recorded scoped command outcome, not overall acceptance"
},
{
"name": "05-format",
"source_commit": "70bdcdf8fec1728e971cd90ad7f79a1df99777ff",
"argv": [
"cargo",
"fmt",
"--all",
"--",
"--check"
],
"exit_code": 0,
"runner_failure": null,
"inputs_unchanged": true,
"result": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\command\\result.json",
"bytes": 4066,
"sha256": "09bdbca3090cb92eab436b37f209440d394b4501a6f24ea55006fc3854dc2f07"
},
"classification": "completed_command",
"scope": "Recorded scoped command outcome, not overall acceptance"
},
{
"name": "06-clippy",
"source_commit": "70bdcdf8fec1728e971cd90ad7f79a1df99777ff",
"argv": [
"cargo",
"clippy",
"--locked",
"--offline",
"--workspace",
"--all-targets",
"--",
"-D",
"warnings"
],
"exit_code": 0,
"runner_failure": null,
"inputs_unchanged": true,
"result": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\command\\result.json",
"bytes": 4141,
"sha256": "226cf432707a66c7baf6d4b866ac101a39d00a46628b3b61162694add7d04a88"
},
"classification": "completed_command",
"scope": "Recorded scoped command outcome, not overall acceptance"
},
{
"name": "07-gui",
"source_commit": "70bdcdf8fec1728e971cd90ad7f79a1df99777ff",
"argv": [
"cargo",
"build",
"-p",
"oa-desktop",
"--bin",
"arcadia-studio",
"--locked",
"--offline",
"--message-format=json-render-diagnostics"
],
"exit_code": 0,
"runner_failure": null,
"inputs_unchanged": true,
"result": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\command\\result.json",
"bytes": 4171,
"sha256": "28a5726e4001652a59f1a8aab47539cf256a48a350b9749d9d3349d0950a80a1"
},
"classification": "completed_command",
"scope": "Recorded scoped command outcome, not overall acceptance"
},
{
"name": "08-snapshot",
"source_commit": "70bdcdf8fec1728e971cd90ad7f79a1df99777ff",
"argv": [
"cargo",
"build",
"-p",
"oa-core",
"--example",
"attachment_snapshot",
"--locked",
"--offline",
"--message-format=json-render-diagnostics"
],
"exit_code": 0,
"runner_failure": null,
"inputs_unchanged": true,
"result": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\command\\result.json",
"bytes": 4191,
"sha256": "cee7277ae91a41507481755755b2aacc85e3d0696db5bb30f9800a0c4c56e180"
},
"classification": "completed_command",
"scope": "Recorded scoped command outcome, not overall acceptance"
},
{
"name": "09-converter-wrapper",
"source_commit": "70bdcdf8fec1728e971cd90ad7f79a1df99777ff",
"argv": [
"C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe",
"C:/Users/User/Documents/Git/ARCADIA-Studio/.local/prerelease-native-preflight-20260924/build_converter-full-deps.py",
"--repo",
"C:/Users/User/Documents/Git/ARCADIA-Studio/.local/state-label-layout-20260924",
"--source-commit",
"70bdcdf8fec1728e971cd90ad7f79a1df99777ff",
"--environment",
"C:/Users/User/Documents/Git/ARCADIA-Studio/.local/state-label-checks-20260924/07-gui/environment.json",
"--output",
"C:/Users/User/Documents/Git/ARCADIA-Studio/.local/state-label-converter-70bdcdf8-20260924"
],
"exit_code": 0,
"runner_failure": null,
"inputs_unchanged": true,
"result": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\command\\result.json",
"bytes": 4670,
"sha256": "0c2a93749eb99e8c2e1456437bc65b07edf0ce20dd4731ec764711bea315fa03"
},
"classification": "completed_command",
"scope": "Recorded scoped command outcome, not overall acceptance"
}
],
"converter_source_commit": "70bdcdf8fec1728e971cd90ad7f79a1df99777ff",
"converter_summary": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\summary.json",
"bytes": 5561,
"sha256": "4772bd6f5025566fe41d0b03d69e9b5b9bd907e2cc72deb36bfed32d43becf8d"
},
"members": {
"gates/01-core-layout/environment.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\environment.json",
"bytes": 9477,
"sha256": "5ade2b585de0ba1e7471948d2b9a6fb7bb43cb3fc7ae3d92fda4d5bc682a4f83"
},
"gates/01-core-layout/orchestration.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\orchestration.log",
"bytes": 171,
"sha256": "4806d5c8b5392bbea0ed7797ffb84e215cd61636a4aa95a73435a102daeb5133"
},
"gates/02-core-routing-state/environment.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\environment.json",
"bytes": 9477,
"sha256": "5ade2b585de0ba1e7471948d2b9a6fb7bb43cb3fc7ae3d92fda4d5bc682a4f83"
},
"gates/02-core-routing-state/orchestration.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\orchestration.log",
"bytes": 178,
"sha256": "8a707fb3a4e2be95f733de9d229bf12c392749dc882123b61addbe6f9ed1b59b"
},
"gates/03-desktop-tests/environment.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\environment.json",
"bytes": 9477,
"sha256": "5ade2b585de0ba1e7471948d2b9a6fb7bb43cb3fc7ae3d92fda4d5bc682a4f83"
},
"gates/03-desktop-tests/orchestration.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\orchestration.log",
"bytes": 175,
"sha256": "fd4070b4fde5bdd51a4c3d1fd3201fb6c829aab6e17a4e228287e032679caafa"
},
"gates/04-desktop-tests/environment.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\environment.json",
"bytes": 9477,
"sha256": "5ade2b585de0ba1e7471948d2b9a6fb7bb43cb3fc7ae3d92fda4d5bc682a4f83"
},
"gates/04-desktop-tests/orchestration.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\orchestration.log",
"bytes": 173,
"sha256": "81e3d7ae505b357442a6844c9158822192dff18c3dbe565d64d9bfa451f03cc2"
},
"gates/05-format/environment.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\environment.json",
"bytes": 9477,
"sha256": "5ade2b585de0ba1e7471948d2b9a6fb7bb43cb3fc7ae3d92fda4d5bc682a4f83"
},
"gates/05-format/orchestration.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\orchestration.log",
"bytes": 166,
"sha256": "ecaeb74a7d9fb5897d9745c06a8976e4d84850e8b8db3ff86cb672fca21c2256"
},
"gates/06-clippy/environment.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\environment.json",
"bytes": 9477,
"sha256": "5ade2b585de0ba1e7471948d2b9a6fb7bb43cb3fc7ae3d92fda4d5bc682a4f83"
},
"gates/06-clippy/orchestration.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\orchestration.log",
"bytes": 166,
"sha256": "ecab94bc7c7fb6c367df2a0e26ebf8136b6dc78ced18a4517208e6364a88a37f"
},
"gates/07-gui/environment.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\environment.json",
"bytes": 9477,
"sha256": "5ade2b585de0ba1e7471948d2b9a6fb7bb43cb3fc7ae3d92fda4d5bc682a4f83"
},
"gates/07-gui/native-artifact-relocation.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\native-artifact-relocation.json",
"bytes": 5301,
"sha256": "11fde1495bcfe19d97e7e596705af09c5f9baa7e805029af0d362c68e3bcc2f3"
},
"gates/07-gui/orchestration.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\orchestration.log",
"bytes": 163,
"sha256": "bcaeb79c30f2249579b9fd8b31bc4d70cb8bba29d928f885eee87d0978beceae"
},
"gates/07-gui/summary.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\summary.json",
"bytes": 7825,
"sha256": "b5b5cf0d9e5518dbe1a37bbc665bdf968e762fc47634d89b095e48563664b964"
},
"gates/08-snapshot/environment.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\environment.json",
"bytes": 9477,
"sha256": "5ade2b585de0ba1e7471948d2b9a6fb7bb43cb3fc7ae3d92fda4d5bc682a4f83"
},
"gates/08-snapshot/orchestration.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\orchestration.log",
"bytes": 168,
"sha256": "1ef9cc7cc2fd057f21ea2a169137bfdcd6799745d23c4478005b549e6eb547a0"
},
"gates/09-converter-wrapper/environment.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\environment.json",
"bytes": 9477,
"sha256": "5ade2b585de0ba1e7471948d2b9a6fb7bb43cb3fc7ae3d92fda4d5bc682a4f83"
},
"gates/09-converter-wrapper/orchestration.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\orchestration.log",
"bytes": 177,
"sha256": "a2b44604b2e86a82212032893f57e3aef0905450a6fc3c7da7c90b632d9c08ed"
},
"gates/01-core-layout/command/changes.patch": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\command\\changes.patch",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/01-core-layout/command/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\command\\context.json",
"bytes": 3535,
"sha256": "84fabf0a67ff5903fa62928b271132acae52ab11b9af46992f14fa4c1c98db6a"
},
"gates/01-core-layout/command/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\command\\inputs-after.json",
"bytes": 1745987,
"sha256": "b96d7ae8c2c7dfc9533de522951ebd38b9b74ab13bfb000fdf723e52fc4ef6cb"
},
"gates/01-core-layout/command/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\command\\inputs-before.json",
"bytes": 1745987,
"sha256": "b96d7ae8c2c7dfc9533de522951ebd38b9b74ab13bfb000fdf723e52fc4ef6cb"
},
"gates/01-core-layout/command/output.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\command\\output.log",
"bytes": 441,
"sha256": "95fb11393f2d0ee4345644372501f1bb7d94059f7c7ec8c3e73f2742c5a1869f"
},
"gates/01-core-layout/command/result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\command\\result.json",
"bytes": 4180,
"sha256": "902fe24f6304c830f90edb060004d9ffcc218102ee19615171aa82afd7fdfe1f"
},
"gates/01-core-layout/command/stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\01-core-layout\\command\\stderr.log",
"bytes": 329,
"sha256": "ad6e55a7f9d133c1171d59895bb0b42dd9e8db249b77c711fc8e586c960afa38"
},
"gates/02-core-routing-state/command/changes.patch": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\command\\changes.patch",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/02-core-routing-state/command/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\command\\context.json",
"bytes": 3721,
"sha256": "3a9c2164e24755a1f8e677bbbaca9efa123c01a83688f2a7a1ece480be5d9051"
},
"gates/02-core-routing-state/command/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\command\\inputs-after.json",
"bytes": 1745987,
"sha256": "b96d7ae8c2c7dfc9533de522951ebd38b9b74ab13bfb000fdf723e52fc4ef6cb"
},
"gates/02-core-routing-state/command/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\command\\inputs-before.json",
"bytes": 1745987,
"sha256": "b96d7ae8c2c7dfc9533de522951ebd38b9b74ab13bfb000fdf723e52fc4ef6cb"
},
"gates/02-core-routing-state/command/output.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\command\\output.log",
"bytes": 5918,
"sha256": "e0d83aa7e2daf6a708ff05f270bfd42c62e7256c9bb021d0f82a89ce82e76a72"
},
"gates/02-core-routing-state/command/result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\command\\result.json",
"bytes": 4382,
"sha256": "6d102bf5b2e715316233f47756cb21215209045360ae736235974651435c6652"
},
"gates/02-core-routing-state/command/stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\02-core-routing-state\\command\\stderr.log",
"bytes": 1007,
"sha256": "7bab937f221dbe4bf6a814a2b4b96436ae6412a4abd63e227152cd039c725ede"
},
"gates/03-desktop-tests/command/changes.patch": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\command\\changes.patch",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/03-desktop-tests/command/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\command\\context.json",
"bytes": 3535,
"sha256": "65baf5817cf901ff2346f3ef4a0edc7782a66c36ccf299699fced70aec1cad1e"
},
"gates/03-desktop-tests/command/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\command\\inputs-after.json",
"bytes": 1746401,
"sha256": "927af387a86f8be0af148ea8d75a610c73d588b7056108d9b7199ae300ca977e"
},
"gates/03-desktop-tests/command/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\command\\inputs-before.json",
"bytes": 1746401,
"sha256": "927af387a86f8be0af148ea8d75a610c73d588b7056108d9b7199ae300ca977e"
},
"gates/03-desktop-tests/command/output.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\command\\output.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/03-desktop-tests/command/result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\command\\result.json",
"bytes": 4185,
"sha256": "a8e98b66b01f9965f0d49d9f9a4b83fd25e543295c29d8cefc575e98d2346e2c"
},
"gates/03-desktop-tests/command/stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\03-desktop-tests\\command\\stderr.log",
"bytes": 1530,
"sha256": "a572854597b1b47c5df352f769a3c785024f836107fade2300a5e6ed1ceee733"
},
"gates/04-desktop-tests/command/changes.patch": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\command\\changes.patch",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/04-desktop-tests/command/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\command\\context.json",
"bytes": 3535,
"sha256": "78622cb7fbd144369aae5932a464a79afc8a5c038063d93b59ddc8e21e6c5627"
},
"gates/04-desktop-tests/command/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\command\\inputs-after.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/04-desktop-tests/command/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\command\\inputs-before.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/04-desktop-tests/command/output.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\command\\output.log",
"bytes": 179631,
"sha256": "af4d05f303f7a68357992c7d7d893d7c8856389826c89118a0632e2a01fdf346"
},
"gates/04-desktop-tests/command/result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\command\\result.json",
"bytes": 4187,
"sha256": "868aeace11d5307be72c01db0bb64347aed700c70fac3efb3ae0ac92d5c32707"
},
"gates/04-desktop-tests/command/stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\04-desktop-tests\\command\\stderr.log",
"bytes": 325,
"sha256": "7b552c022264730769bb9855e876b15b60725dcc11775a5f312c683e439f1929"
},
"gates/05-format/command/changes.patch": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\command\\changes.patch",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/05-format/command/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\command\\context.json",
"bytes": 3435,
"sha256": "9503502416d1b1592711c0ff823ad86ffad43e32a26343195164e1a04ae90188"
},
"gates/05-format/command/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\command\\inputs-after.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/05-format/command/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\command\\inputs-before.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/05-format/command/output.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\command\\output.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/05-format/command/result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\command\\result.json",
"bytes": 4066,
"sha256": "09bdbca3090cb92eab436b37f209440d394b4501a6f24ea55006fc3854dc2f07"
},
"gates/05-format/command/stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\05-format\\command\\stderr.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/06-clippy/command/changes.patch": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\command\\changes.patch",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/06-clippy/command/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\command\\context.json",
"bytes": 3508,
"sha256": "b9ee7be690311f6be7d732b31a9b19842ff9611bdb02a659c16716e667ce7b0d"
},
"gates/06-clippy/command/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\command\\inputs-after.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/06-clippy/command/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\command\\inputs-before.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/06-clippy/command/output.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\command\\output.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/06-clippy/command/result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\command\\result.json",
"bytes": 4141,
"sha256": "226cf432707a66c7baf6d4b866ac101a39d00a46628b3b61162694add7d04a88"
},
"gates/06-clippy/command/stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\06-clippy\\command\\stderr.log",
"bytes": 726,
"sha256": "cee474909c10b670a53566563437d87cee181639e801e37b5a7b51e9692bffd3"
},
"gates/07-gui/command/changes.patch": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\command\\changes.patch",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/07-gui/command/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\command\\context.json",
"bytes": 3539,
"sha256": "8b96ad95af7fa2b35308f1aacca6342bc131aa7dfd863da5960ad7907f86abd0"
},
"gates/07-gui/command/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\command\\inputs-after.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/07-gui/command/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\command\\inputs-before.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/07-gui/command/output.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\command\\output.log",
"bytes": 276391,
"sha256": "f41e61dde1466a49effc3b88370f70edf3d9bca116bc6bfc2dfcf8d1c1143138"
},
"gates/07-gui/command/result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\command\\result.json",
"bytes": 4171,
"sha256": "28a5726e4001652a59f1a8aab47539cf256a48a350b9749d9d3349d0950a80a1"
},
"gates/07-gui/command/stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\command\\stderr.log",
"bytes": 478,
"sha256": "d82b0db404deaa998657bf13189afb5c9a88b29ea0fd63d3c3faa13d779b6119"
},
"gates/08-snapshot/command/changes.patch": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\command\\changes.patch",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/08-snapshot/command/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\command\\context.json",
"bytes": 3550,
"sha256": "8a69ae1c020d97a816fa6683f668850b3215fe2cfb9fb541b01a52d3367f294a"
},
"gates/08-snapshot/command/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\command\\inputs-after.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/08-snapshot/command/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\command\\inputs-before.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/08-snapshot/command/output.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\command\\output.log",
"bytes": 40990,
"sha256": "12bc7478c31cfae7544f807e65e7c2154eb5784b3dc369854065b2bd99c55956"
},
"gates/08-snapshot/command/result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\command\\result.json",
"bytes": 4191,
"sha256": "cee7277ae91a41507481755755b2aacc85e3d0696db5bb30f9800a0c4c56e180"
},
"gates/08-snapshot/command/stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\08-snapshot\\command\\stderr.log",
"bytes": 183,
"sha256": "89cc60ca015b395250b57c6495471245529c0f315e250841c83600b860a723b1"
},
"gates/09-converter-wrapper/command/changes.patch": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\command\\changes.patch",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"gates/09-converter-wrapper/command/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\command\\context.json",
"bytes": 4015,
"sha256": "9424a3d6e019730d3c3706c55dccf13a5273582a5add9d1827009fe084da86af"
},
"gates/09-converter-wrapper/command/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\command\\inputs-after.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/09-converter-wrapper/command/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\command\\inputs-before.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"gates/09-converter-wrapper/command/output.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\command\\output.log",
"bytes": 165,
"sha256": "105cd2a14d06c216616345dc02746661cbb2261fae230c1494154126d4758ad9"
},
"gates/09-converter-wrapper/command/result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\command\\result.json",
"bytes": 4670,
"sha256": "0c2a93749eb99e8c2e1456437bc65b07edf0ce20dd4731ec764711bea315fa03"
},
"gates/09-converter-wrapper/command/stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\09-converter-wrapper\\command\\stderr.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"converter/cargo-artifact.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\cargo-artifact.json",
"bytes": 1722,
"sha256": "6a03cadc613b4d5e4276f84154cc9097883c7621999635685b53d14d136228db"
},
"converter/cargo-lib.result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\cargo-lib.result.json",
"bytes": 1080,
"sha256": "9420b2f0830fcd5f3b7aa47389113f0207df632d4c571ed513f2b9dbc5fcaf17"
},
"converter/cargo-lib.stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\cargo-lib.stderr.log",
"bytes": 60,
"sha256": "bb76d746acf8827d33e2ea465a2a7e5fa1c6a4d49d77f76f98461f0764efb480"
},
"converter/cargo-lib.stdout.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\cargo-lib.stdout.log",
"bytes": 40032,
"sha256": "877b292ea6cc5c026a7d9636d806e994f2f740c7193314e483538d4cd7fd37e0"
},
"converter/context.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\context.json",
"bytes": 2799,
"sha256": "8e86beea2fa1092c41d6037f974ad28c0aef19a9393a68bcc8962a0bea3ffcf7"
},
"converter/converter-build.result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\converter-build.result.json",
"bytes": 1749,
"sha256": "4be9fbb3ba65f771e8c31b37bae750be2bc0445ec9734a582a19f2dd3fa1a38d"
},
"converter/converter-build.stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\converter-build.stderr.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"converter/converter-build.stdout.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\converter-build.stdout.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"converter/inputs-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\inputs-after.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"converter/inputs-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\inputs-before.json",
"bytes": 1746401,
"sha256": "3288e287198ae7fb322cfb35747506f27761119fb1f96f46ba39515a30e78c73"
},
"converter/libraries-after.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\libraries-after.json",
"bytes": 939193,
"sha256": "63019c6a891db6964ef0b4edaf3e3a6c9036b30d02693552d3a977f6cfb64913"
},
"converter/libraries-before.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\libraries-before.json",
"bytes": 939193,
"sha256": "63019c6a891db6964ef0b4edaf3e3a6c9036b30d02693552d3a977f6cfb64913"
},
"converter/rustc-version.result.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\rustc-version.result.json",
"bytes": 991,
"sha256": "a66a06c9ffa97e1563c07ffbd1a5efa4b2e1f888349bbac01f1948ab8f287471"
},
"converter/rustc-version.stderr.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\rustc-version.stderr.log",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"converter/rustc-version.stdout.log": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\rustc-version.stdout.log",
"bytes": 197,
"sha256": "cdaaa400be47332d69e678836251d4635b5ff2ecd34aa962b69d71f8961d274b"
},
"converter/summary.json": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\summary.json",
"bytes": 5561,
"sha256": "4772bd6f5025566fe41d0b03d69e9b5b9bd907e2cc72deb36bfed32d43becf8d"
},
"scripts/run-state-label-check-20260924.py": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\run-state-label-check-20260924.py",
"bytes": 2725,
"sha256": "4f5fd0845813a27a84921dee6b17391cd872a48f86e0d7659f5c727eb65f821b"
},
"scripts/prerelease-gates-v2-20260924/run.py": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\prerelease-gates-v2-20260924\\run.py",
"bytes": 13814,
"sha256": "698ed7182726c77fa4a1c85fc6dd08187ed20689941f57e749e3f0bc845f3252"
},
"scripts/prerelease-native-preflight-20260924/build_converter-full-deps.py": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\prerelease-native-preflight-20260924\\build_converter-full-deps.py",
"bytes": 12695,
"sha256": "048441adc856ef07a0f0b1bbbe0157a959bc00cbb0838a8ed18e735082602cb4"
},
"scripts/prerelease-native-preflight-20260924/bundle_converter.rs": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\prerelease-native-preflight-20260924\\bundle_converter.rs",
"bytes": 2279,
"sha256": "acbcc955e970e47b4e825f7880af2fa70ca679410ee4d765d28623ea646c4bf6"
},
"scripts/state-label-native-20260924/aggregate_builds.py": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-native-20260924\\aggregate_builds.py",
"bytes": 7965,
"sha256": "31023f1901ab49482f14ab103708e71cd34f24c1bed9d90124e40084304fffec"
},
"scripts/state-label-native-20260924/BUILD-ADMISSION.md": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-native-20260924\\BUILD-ADMISSION.md",
"bytes": 5697,
"sha256": "5bd950666db498014f3c21ccada768e8fa1e7f1ff965ae1a82b7b170128a024b"
},
"notes/state-label-test-evidence-20260924.md": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-test-evidence-20260924.md",
"bytes": 8810,
"sha256": "4894f1d48a4c1ebd34534073b79f6749ce788bfe93ae991d2b9b9bc37b3463de"
},
"notes/state-label-implementation-review-20260924.md": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-implementation-review-20260924.md",
"bytes": 9093,
"sha256": "78a98849d23cb75b46147b466d1de69944ef4b5c38a90948cccf08a55b38d04d"
},
"notes/state-label-layout-715-contract-review-20260924.md": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-layout-715-contract-review-20260924.md",
"bytes": 11671,
"sha256": "47873b0c1ed80ec3eb8511843b6a10e2be821cf19564bc702167798d10871868"
},
"notes/state-label-native-tooling-review-20260924.md": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-native-tooling-review-20260924.md",
"bytes": 4627,
"sha256": "c499c04b0166ec17d863d9ea076cdef1336d3b6d93cbb38b4840ed660c29fe28"
},
"notes/state-label-collector-review-20260924.md": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-collector-review-20260924.md",
"bytes": 2953,
"sha256": "80c0ce488a964144db9575db0aeecc4cd660b2aec0eeb5d7821c0879a088f1b7"
},
"packaging/archive.py": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-automated-evidence-20260924\\archive.py",
"bytes": 8048,
"sha256": "83e731923a78557c421c5185fb332aee7f096d01aba78fc03fa20ccddaca8900"
},
"README.md": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-automated-evidence-20260924\\README.md",
"bytes": 1598,
"sha256": "27309073da687f0a267e2ea445365f47f95313e49170789d56fce74a508ea0a5"
}
},
"omitted_binary_payloads": [
{
"origin": "gates/07-gui/artifacts/arcadia-studio.exe",
"record": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\artifacts\\arcadia-studio.exe",
"bytes": 119440896,
"sha256": "0401341388025544185455ad5520aa2c1b79ca1387d1a57c2bb0bddb8b23754a"
},
"reason": "Binary payload omitted; exact hash/path retained"
},
{
"origin": "gates/07-gui/artifacts/attachment_snapshot.exe",
"record": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\artifacts\\attachment_snapshot.exe",
"bytes": 19189248,
"sha256": "08a26d43257f6d611c8efce22551262234890995dbe49c2ee49df09d62eec091"
},
"reason": "Binary payload omitted; exact hash/path retained"
},
{
"origin": "gates/07-gui/artifacts/libunwind.dll",
"record": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-checks-20260924\\07-gui\\artifacts\\libunwind.dll",
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
},
"reason": "Binary payload omitted; exact hash/path retained"
},
{
"origin": "converter/artifacts/bundle_converter.exe",
"record": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\artifacts\\bundle_converter.exe",
"bytes": 24505856,
"sha256": "fbdd7c5696f879eb541516982cefc04bdc7fdf3adc8059b118a7992ea50f8085"
},
"reason": "Binary payload omitted; exact hash/path retained"
},
{
"origin": "converter/artifacts/liboa_core.rlib",
"record": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\artifacts\\liboa_core.rlib",
"bytes": 102318950,
"sha256": "a00033d489890443d4e5fcefb018d8b4c43d3027bc00d030bb8204fa62f3d362"
},
"reason": "Binary payload omitted; exact hash/path retained"
},
{
"origin": "converter/artifacts/libunwind.dll",
"record": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-converter-70bdcdf8-20260924\\artifacts\\libunwind.dll",
"bytes": 190464,
"sha256": "aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a"
},
"reason": "Binary payload omitted; exact hash/path retained"
}
],
"scope": "Byte packaging and existing receipt inspection only. Multiple source pins and failed03 remain explicit. No overall acceptance or publication."
}
@@ -1,22 +0,0 @@
{
"archive": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-automated-evidence-20260924\\evidence.zip",
"bytes": 6244436,
"sha256": "7706302ef7ee5d160a23ff2d562bedb8911b4e6d7ad4c941544088974b539b6e"
},
"index": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-automated-evidence-20260924\\index.json",
"bytes": 45295,
"sha256": "3c6d45fb0bffe33c35f1b46d3a2eabc2f89de18d5abc57db0a234dc34165b9f0"
},
"readme": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-automated-evidence-20260924\\README.md",
"bytes": 1598,
"sha256": "27309073da687f0a267e2ea445365f47f95313e49170789d56fce74a508ea0a5"
},
"members": 113,
"omitted_binary_payloads": 6,
"original_gate_and_converter_inventories_unchanged": true,
"recorded_gate_source_inventories_unchanged": true,
"scope": "Verified archive integrity and original evidence preservation only"
}
@@ -1,17 +0,0 @@
# #36 integration handoff review
Ready for the parent's documentation/evidence successor commit, within the stated limits. No actionable findings or material overclaim found. Read-only review on 2026-09-24; no compiler, GUI, model validator/helper or Gitea operation executed.
Reviewed the experiment README, STATE opening checkpoint, contract status and appended DECISIONS entry against packaged automated/native records, earlier test reconciliation, observations and independent native review. The documents identify tested implementation70bdcdf8fec1728e971cd90ad7f79a1df99777ff, distinguish core gates at2af40c7e27ed9750b9585c07369dbf17a046a92d, and preserve gate03's compile failure at66278ed33b95961d1c129e2ddc172c567effbf9b. Git confirms no oa-core changes between the focused core gate and tested desktop pin. Current tracked modifications are only three harness documents plus the new evidence folder; no source changes were found in this handoff.
Independent packaged-copy checks:
- native-evidence.zip:2886914 bytes; SHA256039add524eb99ce855c2dc5680eec01c1d5b7f23024025c428125b9771a8e687;293 members. ZIP CRC test, exact member-name set/no duplicates, every indexed member length/SHA256, and embedded collection.json equality with the external index all pass.
- automated-evidence.zip:6244436 bytes; SHA2567706302ef7ee5d160a23ff2d562bedb8911b4e6d7ad4c941544088974b539b6e;113 members. The same CRC/member/hash/index checks pass; embedded README equals its external published copy. All nine archived command-result records match the index, including failed03; successful gate claims retain their individual pins and scopes.
- All six archived B/W/U actual Projects independently equal their frozen expected Projects. All54 checkpoint source members match their recorded hashes and original variant bytes. Both archived run launch/close pairs agree on PID, record exit0/null failure/unchanged inputs, and contain empty stdout/stderr. Copied observations.md and native-review.md are exact archived payloads.
The earlier collector finding is closed by the executed archive: the embedded index is present, byte-identical and included in this independent full readback. Original receipt paths and hashes remain historical identities rather than silently rewritten peer-local paths.
Accepted limitations are visible and consistent: maximized1605×872 native observations only; unsuccessful restored-window label/Home attempts and their unproven cause retained; rounded68/82 scales; no native group M/Undo/Redo or generic-fallback GUI claim; mounted exact-group/history coverage separate; no universal Unicode/font or all-window guarantee. Linux and wider State/Process congestion remain excluded. No full workspace-test rerun, merged-main acceptance, replacement release, issue closure or broader application completion is implied.
This review checks handoff integrity and correspondence. It relies on the named independent visual review for screenshot interpretation rather than repeating its image inspection, and on parent observation for the specific Alt+F4 close cause. Independent-machine restored-window follow-up and integration remain with the issue owner.
@@ -1,15 +0,0 @@
{
"archive": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-native-evidence-20260924\\evidence.zip",
"bytes": 2886914,
"sha256": "039add524eb99ce855c2dc5680eec01c1d5b7f23024025c428125b9771a8e687"
},
"index": {
"path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-label-native-evidence-20260924\\collection.json",
"bytes": 154086,
"sha256": "5a5428a00919d9018123ccfd0644085f733a944545e912fee3bfa8b55371dd0d"
},
"source_commit": "70bdcdf8fec1728e971cd90ad7f79a1df99777ff",
"original_trial_unchanged": true,
"scope": "Archive integrity only; consult separate mechanical receipt findings and parent observations"
}
File diff suppressed because it is too large Load Diff
@@ -1,41 +0,0 @@
# #36 native visual review: 70bdcdf8
**Final scope update:** the addendum below completes the fresh-process reopen and process-exit review. The original snapshot's pending statements are retained as history; the unmaximized-input limitation remains open.
Independent read-only review of original JPG/JSON captures01–15 under `.local/state-label-trial-70bdcdf8-20260924/raw`, the frozen B/W/U inputs, completed save checkpoints and `harness/state-label-layout-contract.md`. All15 full application images were inspected at original resolution; the16×16 secondary captures are not useful application evidence. No GUI input, product/helper execution, build, source/tooling edit or Gitea operation was performed. Fresh-process reopen and final process closure are outside this review snapshot.
The recorded run01 launcher identifies source `70bdcdf8fec1728e971cd90ad7f79a1df99777ff`, PID5328, preserved GUI SHA256 `0401341388025544185455ad5520aa2c1b79ca1387d1a57c2bb0bddb8b23754a`. All15 capture metadata records identify that executable path. Independently reread manifest SHA256 is `7f1b6cfa8f6ca0c36b0b867f8a2ccf555cea292e8df878af629dac5b63d36ee6`. This is evidence attribution, not a newly rerun executable/build check.
## Observed result
No clear title/summary self-overlap, wrapping or ink clipping in the required B/W/U labels was visible in the maximized captures at displayed68% and82%. The text is small at those scales; these screenshots support the concrete cases, not universal glyph containment, perfect legibility at every scale, or pixel-exact font metrics.
- **B, captures03–07:** `Ready` and `for review` occupy separate rows, followed by the `External · Completion [request_ready]` summary. Captures04 and06 show State transition properties with stable alias `between`; capture05 shows State action properties with alias `action_a` and the exposed `entry / Record request` row selected. Thus the recorded sequence demonstrates distinct observable targets for the covered transition label and exposed row. Capture07 shows `All source files saved`. The broader authored diagram remains crowded and overlaps node territory; this is not evidence of global collision avoidance.
- **W, captures08–11:** the input is exactly40 `W` characters, verified from the pinned expected Project. The title occupies one visibly wider line at both scales, with the summary on the next line. Its rightmost ink appears within the visible white label extent; it is not shortened to the old scalar-width box. Capture09 shows `between` selected after the parent's described far-right/padding interaction. A static after-capture confirms the selected object, not the exact preceding pointer trajectory. Capture11 shows saved status.
- **U, captures12–15:** the input is exactly `Ready\r\n漢字 é 👩‍🔧\n` (combining acute, ZWJ sequence and terminal LF verified from the expected Project). The canvas shows two inked title rows and an extra blank cell before the summary, consistent with three title cells plus one summary cell. The second row's marks appear contained; capture13 shows `between` after the described blank-cell interaction, and15 shows `between` in the summary-selection sequence. At this screenshot size I do not claim independently verified shaping of every emoji/code point, nor infer preservation of CRLF from pixels.
**Preserved ambiguous observation:** captures01/02 are unmaximized1442×842 at displayed79%. Capture02 clearly has `state_a` selected after the parent's attempted click at(660,534). The coordinate/geometry cause has not been resolved by this review. This attempt must remain recorded as unresolved, not silently reclassified as a successful label hit or generalized into a demonstrated product defect. Successful maximized observations do not establish an all-window-size hit pass. Displayed percentages are rounded; no exact world-space movement oracle is inferred from them.
## Save evidence checked separately
At inspection, checkpoints `01-B-saved`, `02-W-saved`, and `03-U-saved` each have accepted receipts. I independently hashed the checkpoint `actual.json` and pinned expected file: each full Project file is byte-identical to its expected B/W/U file and the manifest/receipt hashes match. Each checkpoint has nine source files, matching the nine baseline members; every saved file's bytes match both its corresponding immutable baseline and its receipt SHA256. Consequently these pure saves preserve complete Project values and authored source bytes, including title separators and authored label geometry. This conclusion uses saved artifacts, not the screenshots' saved-status text. No claim is made for the unused M movement oracle.
## Limits and retained history
Parent reports core68 passes, desktop1540 passes/seven existing ignored, formatting and strict Clippy on the candidate; this visual review does not independently rerun or audit all gate logs. Preserve the earlier desktop gate03 E0382 failure: the initial Shift/mixed regression moved `row` into its selection and reused it. Candidate70bdcdf8 fixes that test-only ownership issue with `row.clone()`; the failed attempt is not a runtime failure and is not erased by the later pass.
The bounded maximized visual observations and three exact pure-save checkpoints support this label repair. Fresh-process reopen, final close/log evidence and any generic-canvas native claims require their own remaining evidence. Group(+40,+40), preview/settled equality and one-step history are assigned to the fixed-oracle production-input regression; no native group displacement is inferred post hoc. The unmaximized79% target ambiguity remains an explicit limitation unless independently resolved.
## Final addendum: fresh process, reopen and closure
Inspected all seven original full-size captures18–24 without repeating the earlier15-image review. Their metadata consistently identifies the pinned GUI path, window263106 and maximized1605×872 dimensions. Run02 launch records identify a fresh PID6100 with the same70bdcdf8 source and GUI hash as run01 PID5328.
Reopened B at displayed68% retains its separate two-line title and following summary in18;19 shows State transition properties with alias `between` after the parent's recorded summary click(737,518), and20 shows saved status. Reopened U in21/22 retains its two inked title rows and blank-cell separation before summary. Reopened W in23/24 retains the single wide title line and separate summary. No new visible required-case clipping or title/summary self-overlap was found. These are reopen observations in the second process; W/U are not additional fresh-process label-hit trials.
Independently reread and hashed checkpoints `04-B-reopened`, `05-U-reopened`, `06-W-reopened`: all accepted; each `actual.json` is byte-identical to its corresponding manifest-pinned expected full Project and receipt hash. Each saved source directory again contains nine files, equal in count to baseline and receipt; every file matches its baseline and receipt SHA256. Across the six reviewed save/reopen checkpoints, all complete Projects and source bytes remain exact. No semantic, authored route or title normalization change is inferred or permitted by these comparisons.
Both close receipts match their launch PID and source pin, report observed exit0, null failure, and `immutable_inputs_unchanged: true`. I independently checked all four stdout/stderr files are zero bytes; their recorded hashes are the empty-file SHA256. These receipts establish successful observed process exit and the launcher's unchanged-input check. The specific normal Alt+F4 close action is parent-observed evidence, not something this read-only reviewer performed or derives from exit0 alone.
The parent additionally reports that restored run02 Home Recent attempts at(1060,744) and the offset-hypothesis point(1052,713) did not open B; after maximizing, the actual Open point(1147,736) did. This broadens the unresolved observation beyond a State-label target, but does not prove a coordinate-mapping cause. Preserve all attempts. Native hit claims remain limited to the successful maximized trials; the initial79% attempt is still not passed or retrospectively diagnosed.
**Final bounded verdict:** no new actionable defect found in the reviewed maximized B/W/U presentation, six exact pure-save/reopen checkpoints, or recorded exits/logs. Fresh-process persistence evidence is now complete for these variants. Keep the restored-window input uncertainty, rounded-scale limitation, synthetic movement/history test scope, and absence of universal Unicode/all-window hit guarantees in the published evidence. This addendum does not certify a broader archive/collector or generic-canvas native trial.
@@ -1,25 +0,0 @@
# State label native observations
Parent observer: Codex-ytr83r/root, Windows native host, 2026-09-24. Candidate source `70bdcdf8fec1728e971cd90ad7f79a1df99777ff`; isolated profile and unrelated cwd per process. These are parent observations, separate from the machine-readable source/model checks. Original images and their bounds/timestamps are in `trial/raw/` in the collected archive.
## Inputs and method
The unchanged original peer fixture B has title `Ready\nfor review` and summary `External · Completion [request_ready]`. W changes only the title to 40 W characters. U changes only the title to `Ready\r\n漢字 é 👩‍🔧\n`. The stage independently validates their complete Projects and freezes their nine-file source closures. No model, route, or title editing occurred in the GUI. Save used Ctrl+S in place. Native movement M was not executed; exact movement/history remains covered by the mounted production-input regression.
Native trial used the actual public Fit and + controls. Displayed percentages are rounded, not exact scale measurements. Initial restored-window capture was 1442×842 at displayed79%; accepted coordinate-based checks used the maximized1605×872 window at displayed68% Fit and82% after one + click. No exact100% or DPI calibration claim is made.
## Observed outcomes
- B: captures01/03/06 show two title lines followed by a separate summary, without the reported title/summary collision. In the maximized window, click(737,518) at68% selected State transition alias `between` (04); exposed entry-row click(582,519) selected State action alias `action_a` (05). After +, summary click(732,499) at82% selected `between` (06). These targets were read from the actual inspector, not inferred from route color alone.
- W: captures08–10 show the long single-line title within the enlarged white label extent and a separate summary. Click(900,514) in the far-right lower label area over State B at68% selected `between` (09), demonstrating the width-dominating title's hit area. Capture10 records82% appearance. Authored labels may still cover node content; this fix preserves their authored centers and is not an automatic collision-free layout claim.
- U: captures12–15 show `Ready`, the Unicode line, a blank trailing title cell, and the summary below it. The visible ink fits the label extent at68/82 without a clear self-overlap. Blank-cell click(737,514) at68% selected `between` (13); summary click(731,504) at82% retained the transition (15). These small-font witnesses do not establish universal font/shaping correctness or arbitrary Unicode ink containment.
- Ctrl+S completed with `All source files saved` for B/W/U (07/11/16). Checkpoints01-B-saved,02-W-saved,03-U-saved each report accepted=true/failure=null, full Project equality, and byte-exact preservation of all nine original source files for that variant.
- Parent closed run01 using Alt+F4. The launcher recorded PID5328 exit0, empty stdout/stderr, and immutable inputs unchanged.
- Fresh run02 PID6100 opened with Recent models listing the three exact working paths (17). After maximizing, B reopened through Recent (18); click(737,518) selected `between` again (19), then Save (20). U and W reopened through Recent in this fresh process (21/23) and were saved (22/24). They retained the visible label presentation. Checkpoints04-B-reopened,05-U-reopened,06-W-reopened each report accepted=true/failure=null and the same complete-model/source conservation.
- Parent closed run02 using Alt+F4. Its launcher also recorded exit0, empty stdout/stderr, and immutable inputs unchanged. Neither process was terminated programmatically.
## Unsuccessful input attempts and limits
The initial restored-window click at requested(660,534), intended for B's summary, selected `state_a` instead (02). This attempt is not a passed label-hit check. On fresh run02, the restored-window Recent B Open button also did not respond to its screenshot-derived(1060,744) click. A one-off frame-offset hypothesis using(1052,713) likewise did not establish a successful Open. Maximizing through the observed accessibility control and clicking the newly observed Recent Open(1147,736) succeeded. This suggests a restored-window input-coordinate issue, but the cause is not proven; no product fix or universal restored-window hit correctness is claimed. The failed attempts are retained rather than recast as success.
Maximized checks, independent mounted hit regressions at multiple pan/zoom values, and complete Save/reopen comparisons form the scoped evidence. No native group drag, native Undo/Redo, exact1.0 scale, native generic-fallback-canvas interaction, Linux execution, or full-project usability acceptance is claimed here. The automated regressions separately exercise generic State targeting, fixed(+40,+40) group commit, exact Project history, and shared SVG positions. Wider State/Process congestion and dynamic row/header layout remain outside this bounded change.
@@ -1,10 +0,0 @@
{
"archive": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-restored-native-20260925.zip",
"bytes": 888553,
"sha256": "f120509338fb0ac55480ce11929381fb1a46fecf7d3a1c8869c395335f0eba0a",
"crc_ok": true,
"all_member_lengths_and_sha256_verified": true,
"payload_member_count": 45,
"total_member_count": 46,
"manifest_sha256": "f9a6997aa4e3b6358814d57b0da60f5d235ce81ac638e139a25bc7664b341624"
}
@@ -1,37 +0,0 @@
# #36 restored-window native observation
Local-only evidence, 2026-09-25 UTC. Parent owns publication/integration. No source code edits, commits, Gitea posts, model content edits, movement, deletion, or renaming were performed.
## Identity and isolation
Preserved source commit `70bdcdf8fec1728e971cd90ad7f79a1df99777ff`, earlier evidence commit `57b3fe4bff43a7df602f1567b8867bb1d31051d0`. Before launch rechecked GUI SHA256 `0401341388025544185455ad5520aa2c1b79ca1387d1a57c2bb0bddb8b23754a`; confirmed adjacent libunwind.dll. `launch.json` records executable, child-only LOCALAPPDATA profile, unrelated working directory and PID2892. Copied original immutable baseline B into this evidence directory's `working/B`; original inputs were never opened in the GUI. Seeded private recent-model list with only this copy. `original-source-hashes.json` was recorded before launch.
All UI input used `node_repl` plus `@oai/sky`, with one action then refresh. Raw original screenshot payloads were saved once under `raw/`, accompanied by metadata without payload duplication. Screenshots were inspected through the tool's original display, not re-emitted or transformed. No capture/input helper errors occurred.
## Observed sequence
The restored window remained 1442×932 throughout (screenshot dimensions), with displayed State zoom79%. No maximize, resize, pan or zoom was performed. The fixture opens directly to Behavior & scenarios, Request lifecycle, State multiselect - main.
| Capture | Action and observed outcome |
| --- | --- |
| 01-home | Home, private B recent-model card visible. |
| 02-open-attempt | Current observed Open clicked at(1061,574); title became State group native and Working status appeared. |
| 03-opened | Refreshed without another input; fixture loaded, 0 selected. Ready and for review have separate title rows followed by External · Completion [request_ready]. No observed self-overlap or clipping within this title/summary. |
| 04-title-hit | First title row clicked(652,515); inspector State transition, stable alias between. |
| 05-clear | Blank canvas click(990,630) did **not** clear selection. Retained as an observation; not counted as reset or transition hit. |
| 06-state-b | Click(798,596) selected State, stable alias state_b. |
| 07-second-title | Second title row clicked(656,525); inspector State transition, stable alias between. |
| 08-state-b | Click(798,596) again selected State, alias state_b. |
| 09-summary | Summary clicked(661,534); inspector State transition, stable alias between. |
| 10-save | Ctrl+S; bottom status All source files saved. |
| 11-close-windows.json | Alt+F4, then fresh list_windows returned no Arcadia windows. |
Text is small at this zoom. The authored diagram remains crowded, and this is not global collision-avoidance evidence. This new run establishes bounded successful restored-window Home Open and first-title/second-title/summary hits at1442×932/79%, not all-window acceptance. Earlier1442×842/79% and restored Home failures remain recorded in the prior review; their cause is not established or reinterpreted by this success. No exact-world-space movement claim is made.
## Save and close verification
`verification.json` and reproducible `verify.py` record all nine source members byte-identical to the immutable original baseline and full Project JSON byte/value-identical to pinned expected B, SHA256 `bf04d72167e8779940dec040f47c7ac0ca69cb7feea35272f2a382c3e73dceb7`. The preserved bundle_converter.exe and attachment_snapshot.exe both returned0 with their previously recorded hashes; their stderr logs are empty. GUI stdout/stderr are both zero bytes.
Preserved failed verification attempt: attachment_snapshot.exe was first invoked directly on project.arcadia and rejected includes with `Error: Text("4:5: An include requires a source bundle; single-string parsing never reads files.")`; no actual.json was created then. The correct established converter-then-snapshot flow above subsequently passed. This was a verification invocation error, not a GUI/model defect.
Normal Alt+F4 close was directly performed and disappearance observed. The attached PowerShell process watcher records has_exited=true in `close.json`, but ExitCode is null. Therefore this run claims observed process termination, **not** observed exit0. No warning or crash appeared; GUI logs remain empty.
@@ -1,27 +0,0 @@
# Independent review: #36 restored-window observation
Accept the bounded successful observation at 1442 x 932 / 79% as additional evidence. It does not resolve the earlier 1442 x 842 failures, establish their cause, certify arbitrary restored sizes, or establish GUI exit code 0. No material contradiction found in the bounded outcome.
Reviewed `.local/state-restored-native-20260925` and its sibling ZIP against original `.local/state-label-trial-70bdcdf8-20260924/baseline/B` and `expected/B.json`. Read REPORT, verification/launch/close receipts, package manifest, verification/package scripts, and raw screenshot metadata. No UI input, builds, model/source edits, publication or Gitea actions. This review file is the only write.
## Independently checked
- ZIP CRC test passed. Exact member set: 45 payload files plus PACKAGE-MANIFEST.json. Every payload length/SHA256 matched the manifest and current loose file bytes. Manifest bytes matched the ZIP copy and external receipt hash. ZIP is 888553 bytes; SHA256 `f120509338fb0ac55480ce11929381fb1a46fecf7d3a1c8869c395335f0eba0a`. Manifest SHA256 `f9a6997aa4e3b6358814d57b0da60f5d235ce81ac638e139a25bc7664b341624`.
- All nine saved source members, including their relative-path set, are byte-identical to the original trial's immutable baseline B. Captured actual.json is byte-identical and JSON-value-identical to original expected/B.json; SHA256 `bf04d72167e8779940dec040f47c7ac0ca69cb7feea35272f2a382c3e73dceb7`.
- Preserved converter and snapshot executable hashes match verification.json. GUI executable independently rehashed as `0401341388025544185455ad5520aa2c1b79ca1387d1a57c2bb0bddb8b23754a`, matching launch.json. No helpers were rerun; converter/snapshot exit results remain recorded receipts. Source-byte identity and full snapshot identity were independently recomputed.
- All ten raw JPEGs were independently viewed without editing/cropping. Their decoded dimensions are 1442 x 932, consistent with metadata. State captures display 79% and the restored-window titlebar control. Home Open progresses from the copied B recent entry, through Working, to the loaded fixture.
- Capture03 has no selection. Capture04 shows State transition / stable alias `between` after the first-title action. Capture05 retains that selection following the blank-canvas action, as the report explicitly states. Captures06/08 show State / `state_b`; captures07/09 return to State transition / `between`, making the second-title and summary observations nonvacuous. Capture10 shows All source files saved.
- The transition's two title rows and following summary are vertically distinct. Text is small and the diagram remains crowded; this is not a global readability or collision-avoidance pass. Screenshot state supports reported action outcomes, while exact input coordinates/action chronology come from the operator report, not independent replay.
- close.json says has_exited=true with exit_code=null; final window inventory is empty. GUI stdout/stderr are empty. This supports observed termination only. Alt+F4 cause is the operator's recorded action; empty logs do not prove exit0.
## Scope and handoff qualifications
The original source pin is reported as `70bdcdf8fec1728e971cd90ad7f79a1df99777ff`; executable-to-source provenance inherits the original trial's build/staging evidence. This review independently binds the executable bytes, not a new build.
This success at 1442 x 932 cannot falsify a failure at 1442 x 842 or explain prior restored Home failures. Preserve both observations and keep #36's wider acceptance open. Source save with no model content changes proves preservation in this run, not changed-content persistence or a fresh-process reopen.
The failed direct snapshot invocation is preserved narratively in REPORT; the packaged snapshot stderr is the successful rerun's empty log. Do not describe the package as containing an independently reviewed raw log of that failed attempt.
The package omits executables and the original baseline/expected inputs. Publication should retain explicit links to the original trial evidence/source pin for reproducible comparison. This review makes no publication or integration claim.
Audit method: read-only Python standard-library ZIP CRC/member checks, SHA256 and complete byte/JSON equality against original trial files; Pillow image dimension decoding; view_image inspection of all ten raw images; PowerShell file hashing. No production decoder or GUI rerun.
@@ -1,10 +0,0 @@
{
"archive": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\state-restored842-native-20260925.zip",
"bytes": 661746,
"sha256": "3efb41d79a9dab70d7026ba83a7f9ec60a319fab79a8f0a383f3ce7a71b0f42f",
"crc_ok": true,
"all_member_lengths_and_sha256_verified": true,
"payload_member_count": 43,
"total_member_count": 44,
"manifest_sha256": "d51dc48095ba881b99ab745267830402fe4a164a680d85415c7b5f7383f6a15d"
}
@@ -1,42 +0,0 @@
# #36 exact1442x842 trial: unexecuted after bounded resize failure
Local-only 2026-09-25 evidence; parent owns publication/integration. No production source changes, compiler runs, git, Gitea, model Open/Save, content changes, or diagram movement.
The requested1442x842 window was not obtained. Home recent Open and79% title/second-title/summary trials at that size are **unexecuted**, not passed. Earlier restored-window uncertainty remains open. These resize/tool outcomes are not attributed to an application defect.
## Identity and isolation
Same preserved70bdcdf8fec1728e971cd90ad7f79a1df99777ff GUI, SHA256 rechecked before launch: `0401341388025544185455ad5520aa2c1b79ca1387d1a57c2bb0bddb8b23754a`. Adjacent libunwind.dll confirmed. launch.json records PID7500, executable, private child-only LOCALAPPDATA and cwd. Immutable original B copied to working/B and private recent-model list seeded; original-source-hashes.json captured before launch.
UI used only supported @oai/sky through node_repl. Original screenshots saved once; no payload re-emission or transformation.
## Every action and observation
| Capture | Action / result |
| --- | --- |
| 01-initial | Home at1442x932; private recent B visible. |
| 02-resize | Bottom-area drag from(720,930) to(720,840); still1442x932. |
| 03-system-menu | Alt+Space; visible system menu with Size. |
| 04-size-mode | Press s; menu closes;1442x932. |
| 05-bottom-size-mode | Down;1442x932. |
| 06-size-up | Up; observed1442x921. |
| no07 capture | Attempted click(720,841) to set edge; tool rejected with exact error below. No claim click delivered. |
| 08-resize-recovery | Per skill, activate target and refresh; observed1442x732. This is observation, not diagnosis of why height changed. |
| 09-finish-size | Return; remains1442x732. |
| no10 capture | Final bounded drag from observed lower border(720,731) to(720,841) rejected with bounds error below. |
| 11-before-close | Fresh observation1442x732, still Untitled mission Home. |
| 12-close-windows.json | Normal Alt+F4, then list_windows returned no Arcadia windows. |
Exact first rejection:
`point (779, 893) is over ChatGPT.exe "Chrome Legacy Window", not target window arcadia-studio.exe "Untitled mission — Arcadia Studio"; activate the target or take a fresh screenshot before retrying`
Exact final rejection:
`point (720, 841) is outside window bounds { originX: 0, originY: 0, width: 1442, height: 732 }`
After both errors prior coordinates were discarded; final fresh observation preceded normal close. No other app was automated or intentionally targeted.
## Integrity and closure boundaries
verify.py/verification.json use the preserved converter and snapshot helpers to compare the **unopened, unsaved copy** to original immutable B. All9 source bytes and full Project bytes/values match. This is fixture integrity only, not native save evidence. Helpers both returned0; GUI stdout/stderr empty. Normal Alt+F4 and window disappearance directly observed; exit code was not captured. No exit0 claim.
The archive contains report, script/results, source copy/hashes, original screenshots/metadata, launch/profile and logs. Executables and DLLs excluded. No claim of842 interaction, reopened persistence, or universal window-size correctness.
@@ -1,36 +0,0 @@
# #36 implementation review at 2af40c7
Read-only source review of `2af40c7e27ed9750b9585c07369dbf17a046a92d` in `.local/state-label-layout-20260924`, confirmed clean after writers settled. This is a preliminary implementation review, not final acceptance. No independent compilation, GUI or runtime tests; parent owns execution. I authored the separate State canvas regression include earlier, so review of those tests is a consistency check, not independent authorship review.
**Follow-up status:** the P2 below is closed at source-review level by `1f471288284102f46f67075765568dbf5856474b`, inspected in clean `.local/state-label-hit-review-20260924` with exact parent `2af40c7e27ed9750b9585c07369dbf17a046a92d`. Integration and execution remain parent-owned; no native acceptance is claimed. No new actionable finding in this bounded follow-up.
## Actionable finding
**P2 — Generic diagram surface paints State labels above nodes but still selects the covered node.** This is a reachable surface: `views.rs:403` includes dedicated State diagrams in the saved-view picker (only Scenario is excluded), constructs `DiagramCanvas` at470, and `app.rs:3697` sends non-Scenario choices to `Page::Diagram`. The new generic painter defers State label rectangles/text until after nodes (`diagram.rs:1491`), matching their visible foreground position. However `diagram.rs:331` context targeting, `diagram.rs:999` ordinary press, and `diagram/multiselect.rs:206` production group/Shift targeting still resolve nodes before labels. Additionally `DiagramCanvas::hit_label` at428 chooses nearest center rather than the last painted overlapping State label. The same authored label over a State therefore looks selectable but returns the obscured placement in this supported view; two overlapping State labels can choose the obscured one.
Use one dedicated-State-plan background hit helper in the relevant generic target paths, before ordinary node targets but after existing explicit selected-handle decisions, with reverse actual label paint order. Keep non-State label/node priority unchanged. Cover generic ordinary click, context target and Shift target at a fixed label-over-node point; cover overlapping State labels with the lower label selected. The existing generic `detached_label_selects_connection_and_occluding_card_owns_its_hit` test describes non-State behavior and should continue to pass. Alternatively explicitly remove/restrict this supported surface, but that would be a larger product change than the local target fix.
**Repair constraint:** an unconditional non-Shift handle `return None` in generic `group_input` would bypass mixed-selection refusal: the ordinary route-edit path has no StateCanvas-style singleton gate. Instead resolve a dedicated-State selected attachment/bend to `Target::Edge(selected)` before the State-label prepass, then use existing Shift/group admission. The existing singleton/nonmember fallthrough already reaches ordinary handle editing where allowed. A selected Edge+Placement group must remain captured/refused, and Shift on a handle must toggle that handle's exact Edge even when another label overlaps it. This challenges the proposed follow-up design; it is not an additional defect introduced in the reviewed commit.
## Reviewed coherent behavior
- Core builds `StateLabelLayout` only for a StateTransition in a dedicated State projection. The raw global48 summary remains `EdgeLabelGeometry.text`; fixed title budget is computed from that raw excerpt before width measurement. LF/CRLF/CR and declared Unicode separators become explicit cells; blank/trailing cells survive; tab expansion is display-only. Title and summary positions share 12-unit cells, minimum24 height and five-unit horizontal padding.
- `state_label::measure_line` matches installed `iced_graphics-0.14.0/src/geometry/text.rs::Text::draw_with`: same Paragraph implementation, global font system, font/shaping/alignment defaults, font10, absolute12 and infinite bounds. Helper wrappingNone versus painter default wrapping cannot introduce width wrapping at infinite width for these already split lines. Paragraph advance plus padding still needs the declared native ink-containment checks; no universal Unicode claim follows from the source review.
- Production desktop routing consumers found by source search all call the measured wrapper, including ordinary/preview scene, Fit, State Fit, usage/focus, State bend setup, generic export and work/allocation geometry. Remaining direct core routing calls are tests. Measurement occurs before collision placement; core remains font-independent and derived plans are not serialized.
- Dedicated State hit order matches its opaque backgrounds and reverse stable edge paint order. Endpoint/bend checks and group admission remain at their existing input sites. Raw summary prefix, not normalized display lines, feeds typed-reference visibility, preventing CRLF byte-offset corruption. The State projection admits only non-Internal StateTransition edges, so the painter's plan-only branch does not suppress another supported label kind there.
- Settled SVG now emits the planned escaped lines and opaque backgrounds after nodes; the actual export test exercises this ordering, beyond the isolated string helper test. Non-State SVG label placement is preserved.
- The diff contains no semantic model/schema/serialization change and does not author node sizes, route fraction/offset or waypoints. Automatic label centers may change from corrected bounds as intended. Existing scene caching still avoids recomputation on unchanged hover/selection; shaping adds bounded work per retained line when routing actually occurs. No concrete performance blocker found in this bounded static review.
## Test assumptions and remaining evidence
The new State canvas fixed-point fixture is defensible from source, rather than adjusted to returned geometry: B at(760,180),224x94 has Bottom0.5 attachment(872,274); the shape inset is zero at the side midpoint. Fraction0 and offset(-432,-14) give center(440,260). A's single entry row occupies y244..270. Thus (440,260) exercises covered row ownership, (440,272) the summary over the State header, and (200,260) the exposed row. Moving both B/C by(0,320) moves the anchor/label center by the same amount with the original authored offset; no waypoints require translation. The assertions deliberately fail if these declared assumptions cease to hold.
Those tests cover synthetic dedicated-canvas interactions and cancelled group preview; they do not establish native glyph containment, generic-canvas targeting, actual peer-fixture pixels, settled-move equality, or save/reopen/Undo. Parent's focused/full tests and native acceptance still need to supply their assigned evidence. The transient syntax/duplicate-tail states observed while writers were active were corrected before this pinned review and are not open findings.
## Generic hit repair follow-up at 1f471288
Inspected the exact three-file commit diff and all230 lines of its new `diagram/state_label_input_tests.rs`; no source writes, compiler or product execution. `hit_state_label` now resolves only actually painted, nonempty State-plan rectangles in reverse stable paint order. Generic context targeting and ordinary click consult it before ports/nodes, while selected attachment/bend controls remain earlier. Selected label dragging requires that selected label to be the frontmost one; the lower selected label cannot steal the upper label's click. The existing nearest-center/non-State path stays intact.
Generic group input resolves a selected State attachment/bend to the exact Edge target before the label target and then passes through the existing Shift, singleton/nonmember, editability and mixed-group checks. It does not introduce the previously challenged unconditional handle fallthrough. For a selected Edge+Placement set, a handle press creates the existing unsupported group lifecycle and threshold release refuses; a singleton still falls through to the ordinary handle edit. Shift on the overlapped selected handle toggles that handle's Edge, while Shift away from handles toggles the front label. No global edge-first policy or non-State ordering change was introduced.
The added tests exercise the real generic Program path at three zooms/nonzero pan, plain/context selection above a node, lower-selected overlap, front-label drag, read-only selection, Shift label-versus-handle identity, selected bend continuation and mixed refusal. At half zoom the pointer is deliberately17 world units below the central bend, beyond its16-unit radius and still within the18-unit half-height; this is a valid independent separation of label and handle hit regions. Fixture setup uses routing only to author an offset placing both labels at the separately declared(200,150) target, not to choose the expected winning Edge. These tests remain unexecuted by this reviewer. Existing attachment tests still need their scheduled run; the new focused handle regression directly covers a bend rather than an attachment.
@@ -0,0 +1,36 @@
# Independent downloaded Windows package QA
Codex-9e8r6t /root, 2026-09-24. **PASS for the bounded package, State presentation/picker/reopen, built-in guide and packaged-server checks below.** No material blocker found in this scope. This evidence supports the release owner's admission decision; it does not claim completion of issue 37, the full checklist, or the user application goal.
## Exact artifact and source
- Draft release 7: `v0.2.0-preview.integrated.20260924`, source **`715036e132677dd2bc2fb37ed316d93dc9987aec`**.
- Studio asset 25: `ArcadiaStudio-0.2.0-preview.integrated.20260924-x86_64-pc-windows-gnullvm.zip`, 34,168,661 bytes, SHA256 **`5554e32533e3cb2c33fb4143a5a0902733d5a8d47577303cb2842d268e7bc76d`**; checksum asset 26 agrees. Companion assets 21–24 also downloaded and verified.
- Windows 11 build 26200, exact downloaded executables with bundled libunwind and system-only process PATH. Fresh extraction on a machine separate from the producer, unrelated desktop cwd, existing user profile. No local compilation or Linux checks; user explicitly excludes Linux for this prerelease.
- This branch only adds QA documentation/evidence. The tested product stays at 715036e; later documentation commit identities are not rebuilt-product identities. Release/tag/publication ownership remains Codex-956atf.
## Results
| Scope | Result and limits |
| --- | --- |
| Download/package | All 565 archive files equal extraction; 564 checksum entries and 559 package input pins pass. Independent PE imports identify only bundled libunwind outside system components, no delay imports. 18 local doc links, 66 shipped source documents/examples, 489 notice references and 529 recorded local inputs checked. |
| Build linkage | Both executable bytes equal the preserved **individual** final04 Cargo-identified builds for 715036e. All four BuildEvidence pins resolve to the published 206f3b9 gate evidence; all 462 archived evidence members verified. Supplemental combined-build hashes are distinct and excluded. No independent compiler rebuild claim. |
| Native desktop | Bundled walkthrough loads from unrelated cwd; State add-bend visual Undo/Redo, bend movement with exact whole-source Undo/Redo, independent view navigation, dropdown-only Escape, explicit form Cancel, Save, normal exit and fresh-process reopen pass. Only one authored waypoint is added; semantics, attachments, node positions and all other views remain original bytes. Both runs exit 0 with empty logs. |
| Built-in guide | Engineering guide and State topic render in the packaged app. A network-disabled environment was not tested. |
| Server | 23 explicit runtime checks and 11 captured HTTP exchanges: version/help, readiness, served OpenAPI, complete authored CRLF/Unicode source, conditional name-only revision 1→2, stale ETag 412, exact model/source/store and acknowledged-write restart persistence. Both owned processes stopped. Forced exit 1 was intentional; no graceful shutdown, in-flight or power-loss claim. |
Detailed reports: [package/build review](package-provenance-review.md), [native observations](native-observations.md), [independent native/source review](native-source-review.md), [picker-policy review](picker-policy-review.md), [server review](server-review.md).
At 56% Fit the State fixture's labels remain small/crowded. These results do not establish broad editing usability or accessibility, aggregate deletion, modifier gestures, every new-feature combination, authentication/load/TLS, Linux, or complete product acceptance. The fixture's 12 model checks are intentional incompleteness. The second Escape **kept** the ordinary State edit form; explicit Cancel closed it. Capture 26's optimistic filename is contradicted by its retained screenshot and corrected in the reports. No in-memory history-stack introspection was performed.
## Portable evidence and reproduction
[evidence.zip](evidence.zip) contains **190 original/helper/review records**, **3,425,348 bytes**, SHA256 **`cb084be5f316f1b3be45bc5493fe0cbd6076052198c09f9dbac441b8f2588e63`**. [manifest.json](manifest.json) binds every member's size/hash and the ZIP; [checksum](evidence.zip.sha256) is supplied separately. This is evidence only: runnable product remains the release asset, not duplicated in Git.
Extract the ZIP into a new directory. Run `python -B native-check.py` and `python -B server-readback-check.py` there for offline full-source and captured-HTTP reconciliation. Retained successful results are `native-check.json` and `server-readback-check.json`. Original captures/metadata and launch/exit records live in `native-2/` and `native-3/`; baseline and all five saved source snapshots are included. `server-smoke/` contains the exact helper, requests/responses, source, accepted envelope, isolated store and logs.
Static package audits require the same release assets extracted at the original relative layout under `.local/package-qa/download-1`, a source checkout at 715036e, and `scripts/package-artifacts.py`. The archived audit helpers retain their original checkout-relative paths. `package-audit/build-link.py` also requires fetched commit `206f3b969482241e01e2dfc6be955caf31747b89`. It resolves `harness/prerelease37-windows-gates-20260924/final04-complete`, whose archive is SHA256 `7cead0b6aa36a6af8fc9f8987186bfe0decd8fa2ebab094fc45387ae9daea632`. The initial static result's producer-local `available_on_this_machine:false` fields are historical; subsequent `build-link-records.json` resolves them using the published raw evidence. Native/server launch helpers describe the performed environment; use a fresh evidence directory for a new runtime trial rather than overwriting these records.
The reports retain harness-only corrections: environment-key casing before first launch, native dialog automation limitations, and explicit UTF-8 decoding in parent HTTP reconciliation. None changed product bytes or converted a failed product trial into a pass.
[Final independent archive review](final-evidence-review.md) verified all 190 members against retained originals, bound the baseline to the companion ZIP, and replayed both offline evaluators from a fresh extraction with unchanged files and exact recorded results. That review is outside the already-frozen evidence ZIP.
@@ -0,0 +1 @@
cb084be5f316f1b3be45bc5493fe0cbd6076052198c09f9dbac441b8f2588e63 evidence.zip
@@ -0,0 +1,28 @@
# Independent final evidence audit
2026-09-24. Reviewed `harness/prerelease37-independent-9e8r6t-20260924` before publication. **No material finding within this bounded audit.** The package preserves the original evidence, both advertised portable read-only replays pass from a fresh extraction, and the README/report claims remain appropriately scoped.
## Archive and original fidelity
Independently rehashed `evidence.zip`: 3,425,348 bytes, SHA256 `cb084be5f316f1b3be45bc5493fe0cbd6076052198c09f9dbac441b8f2588e63`. This exactly matches the manifest, adjacent checksum and README. There are 190 unique members with no case-insensitive duplicate, traversal, absolute or backslash-ambiguous paths. Every member size/hash matches the manifest. Every member also equals its retained original under `.local/package-qa`; the separately named baseline and package metadata were mapped to the original companion extraction and Studio extraction. All five outer detailed reports equal their archived and original copies.
The native baseline is 9,662 bytes, SHA256 `2dae785d63a940094d8052f3dcddcb988c024b38df9780e026bccd516264dbfe`. It exactly equals the fixture member inside the archived State/Traceability companion ZIP, whose checksum also passes. Thus the portable native evaluator's baseline is independently tied to the downloaded companion, rather than merely accepted as a newly authored expected file. Both native start receipts' download-proof and launcher pins match archived bytes, and their executable/runtime pins equal the actual retained downloaded Studio executable and libunwind bytes.
The earlier package provenance audit remains applicable: downloaded Studio archive `5554e325...`, source `715036e132677dd2bc2fb37ed316d93dc9987aec`, and both executables' linkage to the preserved individual final04 Cargo-identified outputs. The final README correctly describes the separately verified 206f3b9 evidence and does not substitute the supplemental combined-build bytes. Historical producer-local unavailable-path fields in the first static result are explained by the later build-link records.
## Independent portable replay
Created a new isolated extraction at `.local/package-qa/final-review-replay-xkq9rytf`, outside both the immutable published candidate and the original run directories. Ran each extracted script using the bundled Python with `-B`, with the extraction as working directory:
- `native-check.py`: exit 0, empty stderr, output JSON exactly equal to archived `native-check.json`.
- `server-readback-check.py`: exit 0, empty stderr, output JSON exactly equal to archived `server-readback-check.json`.
Rehashed every extracted file before and after each execution: no file changed or appeared. The scripts perform no product launch, network request or source build. The native replay compares all five full-source snapshots against baseline plus the single exact waypoint addition; movement Undo/Redo, explicit cancellation and fresh-process save retain the stated complete-file invariants. The HTTP replay checks all 11 captured response statuses, exact CRLF/Unicode source bundles, name-only model change, revisions/ETags, stale-write refusal, restart envelope and on-disk store equality. Its 23-check count describes the recorded runtime helper, not 23 newly executed runtime checks.
## Claims and selected visual review
Read the README and all five detailed reports, plus the two replay scripts and assembler. The top-level report clearly distinguishes visible add-bend Undo/Redo from saved full-source movement Undo/Redo, existing user profile from a clean OS/profile, rendered guide content from a network-disabled test, normal desktop exit from intentionally forced server termination, and scoped QA from full prerelease/product acceptance.
Manually inspected the original full-window `native-2/26-second-escape-cancels-form-1.jpg`: the ordinary State Edit transition form is visibly still present. The README and native/source/policy reports correctly override that optimistic filename with observed retention and identify explicit Cancel separately. Inspected `native-3/05-persisted-bend-selected-1.jpg`: the reopened edit-attachments view shows the selected Activate route and two square bend handles, including the downward bend. Its labels are small/crowded at 56%, consistently disclosed as a usability limitation. Exact coordinate and unrelated-source preservation claims come from the byte oracle, not pixel inference.
The server report preserves the two imposed exit-1 results and limits persistence to already acknowledged writes; it makes no graceful shutdown, in-flight write, power-loss, authentication, TLS, load or Linux claim. Helper-only corrections and the original capture labels remain disclosed. No product runtime/build, Git mutation, source edit or network action occurred in this audit. The only new artifacts are the fresh replay extraction and this review, outside the immutable evidence archive.
@@ -0,0 +1,775 @@
{
"source": "715036e132677dd2bc2fb37ed316d93dc9987aec",
"release": 7,
"studioAsset": 25,
"studioZip": {
"bytes": 34168661,
"sha256": "5554e32533e3cb2c33fb4143a5a0902733d5a8d47577303cb2842d268e7bc76d"
},
"members": {
"assemble.py": {
"bytes": 2742,
"sha256": "a44cc7f41cc92ca42e070a4913be989bfd35fa1e27b1665db66bc2d5502fc02b"
},
"download-1/ArcadiaStudio-0.2.0-preview.integrated.20260924-x86_64-pc-windows-gnullvm.zip.sha256": {
"bytes": 144,
"sha256": "41c7b1257660b66a44f27555e0e9613e7f6e4c0b119522347e3ccff54d60cea1"
},
"download-1/ArcadiaStudio-Allocation-Process-checks-20260924.zip": {
"bytes": 17190,
"sha256": "17327e563af333fd9913f6d8b8a7e6ad0e095cea33393a5cad7a8b3397ffb185"
},
"download-1/ArcadiaStudio-Allocation-Process-checks-20260924.zip.sha256": {
"bytes": 119,
"sha256": "9e1052b1d6cc04f081f5657f69c4e7e22be9abae8d64ec1e9eb210e4d1f34bbb"
},
"download-1/ArcadiaStudio-State-Traceability-checks-20260924.zip": {
"bytes": 9691,
"sha256": "6fda3606b4fe811906a60fbb8a3ba594f826d285dc2b4fc136ddccb64660d994"
},
"download-1/ArcadiaStudio-State-Traceability-checks-20260924.zip.sha256": {
"bytes": 119,
"sha256": "8d6ab2c2a4ffeda42616a737c3fa514c2c94b33032dff6b12666d6313e77e324"
},
"download-1/assets.json": {
"bytes": 2684,
"sha256": "3312039a6d86262672e7d0a073faf5bd7dc88807db0a34a0400fef2773a6ba8f"
},
"download-1/download-result.json": {
"bytes": 157695,
"sha256": "198685f4d1e338857b9c2a61f7c046a66618ff8b88e2064435d3652ae6f4f73f"
},
"download-1/release.json": {
"bytes": 5182,
"sha256": "037816d561ff6d75e6d45dc98a578a47f70f105f30da2e91d1d0dfe317d77c1e"
},
"download.py": {
"bytes": 3838,
"sha256": "4353f4bff5d1ecba90e70725384c9d5e6b6d3f8ce970d1f22a0faac5a338f1a2"
},
"native-2/01-home-0.jpg": {
"bytes": 103896,
"sha256": "7db5300ebe5a1eb9e7135d33975531f643e205601f669e3bf25fb9745b3994ff"
},
"native-2/01-home.json": {
"bytes": 981,
"sha256": "7a40f7186e468099d7e7837c3968a08ad4e13f12d08f58071fd102fbeaaf7a83"
},
"native-2/02-maximized-home-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/02-maximized-home-1.jpg": {
"bytes": 105249,
"sha256": "48ced23c34ac07509446511e700892478e3f9876004f7a5b5bd120cd65b75e22"
},
"native-2/02-maximized-home.json": {
"bytes": 1110,
"sha256": "d3487f8a4ee43932afed3c6cb6843334bff1f137e7d16463b3e14d9e458da1d1"
},
"native-2/03-bundled-walkthrough-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/03-bundled-walkthrough-1.jpg": {
"bytes": 103761,
"sha256": "e334cc9addc67390881d9b4629646643f6eb57b4aed8b488deea25503c00b7bd"
},
"native-2/03-bundled-walkthrough.json": {
"bytes": 1120,
"sha256": "161db29fd86461c77a4411ec7ea4e74d822ab54dcbfb86ceeeb6bab8337d00b9"
},
"native-2/04-walkthrough-loaded-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/04-walkthrough-loaded-1.jpg": {
"bytes": 142209,
"sha256": "d566beb4d45998de78ea57a01c39a92ac3cb3db5d268016247b9427694f3c8f9"
},
"native-2/04-walkthrough-loaded.json": {
"bytes": 1303,
"sha256": "d913fbee41d5e069a1f1eee227d1470ce752880b38c1f283d01bc931bf0c347f"
},
"native-2/05-state-fixture-open-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/05-state-fixture-open-1.jpg": {
"bytes": 110683,
"sha256": "b8fadad5f4f8cee676ef288131e336236531a7c7c9dc383c22b479fd19823d7c"
},
"native-2/05-state-fixture-open.json": {
"bytes": 1303,
"sha256": "cd991ce13b60ef70234950bb96efdecccb6c719ffb0b10cd377858e873f9b70a"
},
"native-2/06-system-perspective-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/06-system-perspective-1.jpg": {
"bytes": 129420,
"sha256": "4841b3d79220bfbc955a619ce0ddd81b4c75acc471c5f9f15860adb8d6f4bcba"
},
"native-2/06-system-perspective.json": {
"bytes": 1243,
"sha256": "4b2dd65851b41c33c4cdd26a7e0b98d16171d60aba52fe9851b9582ea1ac572a"
},
"native-2/07-activate-transition-selected-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/07-activate-transition-selected-1.jpg": {
"bytes": 129572,
"sha256": "3c176faf194ed25517fab1762ba2419c61777d8df78d27b43c85de252062fc8a"
},
"native-2/07-activate-transition-selected.json": {
"bytes": 1263,
"sha256": "3ecc247a8c0bae174df3ba4887213f0b77e4b0c48232a1aab2720ced81e68161"
},
"native-2/08-transition-actions-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/08-transition-actions-1.jpg": {
"bytes": 132017,
"sha256": "d33691c256cfe24eb910be9cda23cc851dae3ea42537a3b389dead0a9503a16c"
},
"native-2/08-transition-actions.json": {
"bytes": 1243,
"sha256": "9d4f6ebe683701a28ff4c2bb2941da680c3adbbd4526374ab35654d51ee2b23c"
},
"native-2/09-add-bend-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/09-add-bend-1.jpg": {
"bytes": 128200,
"sha256": "22a5382b80b22e5e7e8b539d5e1d3c1718a83fbe6d7c304c0efd9c068b7f22e8"
},
"native-2/09-add-bend.json": {
"bytes": 1231,
"sha256": "ccaebd7e516f9f02efa686b5ee3fcc3a00a64079e0bf3347a94e8990c7b790ba"
},
"native-2/10-undo-added-bend-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/10-undo-added-bend-1.jpg": {
"bytes": 126682,
"sha256": "f51fe83cb7796bb43bacd66119cc77f74f7508b71638c10b8594503517268044"
},
"native-2/10-undo-added-bend.json": {
"bytes": 1239,
"sha256": "f2a4233e6fdbeb35b44d79a76f3a0aacbe4775ac3254b792314ea0a2fb52a259"
},
"native-2/11-redo-added-bend-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/11-redo-added-bend-1.jpg": {
"bytes": 126800,
"sha256": "561f1e4524b7d6c4d33b00e3047fc3b48a79d3801933431f01df800ba0b92460"
},
"native-2/11-redo-added-bend.json": {
"bytes": 1245,
"sha256": "44c5184cd68b2ee319e913c02e67528aec78432317bddde5622b3a3d00508032"
},
"native-2/12-move-new-bend-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/12-move-new-bend-1.jpg": {
"bytes": 128606,
"sha256": "d99f2ff1e75f69181cc700f8c6ee71790b300f4e4eae37e48a70548335795aca"
},
"native-2/12-move-new-bend.json": {
"bytes": 1243,
"sha256": "544c719817b52d84e432161f90acc23248f753cec53dfc7093a4a460f6cd3604"
},
"native-2/13-save-bend-edit-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/13-save-bend-edit-1.jpg": {
"bytes": 126952,
"sha256": "1038eaf6e03d1b1652ad0d7a87fa3e4fde619e86dd2c31a1f81002783e482e9f"
},
"native-2/13-save-bend-edit.json": {
"bytes": 1237,
"sha256": "2fffb1f9fc0575db2157bd4b4facff13833a812237e826700269863d4c22dd54"
},
"native-2/14-undo-bend-move-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/14-undo-bend-move-1.jpg": {
"bytes": 126804,
"sha256": "15408b738a4508b64ef47151ff3b762ee1316db03837b2fba5ebd6044b290791"
},
"native-2/14-undo-bend-move.json": {
"bytes": 1243,
"sha256": "5d98c93c27ea062d4cebc15c26defcd3e6a5b21c793b5f6b1cea35a565f59938"
},
"native-2/15-save-undone-move-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/15-save-undone-move-1.jpg": {
"bytes": 126302,
"sha256": "26bd1d6d2dfb01667d756d93ba4e94f3023af65a8574707b8e9d894225bac546"
},
"native-2/15-save-undone-move.json": {
"bytes": 1241,
"sha256": "768cae7204c2bd0fb833b68eebdec718311b736803b0418477e26f6e21a4a1b9"
},
"native-2/16-redo-bend-move-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/16-redo-bend-move-1.jpg": {
"bytes": 127338,
"sha256": "4188744410f21061b4a3f09dd2e69566256a2a8f0cd82f23eea88f7bbcb12c9f"
},
"native-2/16-redo-bend-move.json": {
"bytes": 1243,
"sha256": "7bb46dc2c1318ff8ce0a134692d4567a0fba1cf468c44ca2389c6e62f8b2b5e2"
},
"native-2/17-save-redone-move-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/17-save-redone-move-1.jpg": {
"bytes": 126803,
"sha256": "7f29d34336c5fd7bc45677e542be6c7cbb9d5aa1255a5adb8e4f76453ffb8df2"
},
"native-2/17-save-redone-move.json": {
"bytes": 1241,
"sha256": "c4a1fb2ee1dd6c26be9bbfe2559813133cf7174d17622d5a8446160e3bd5b224"
},
"native-2/18-state-view-picker-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/18-state-view-picker-1.jpg": {
"bytes": 129077,
"sha256": "99f8ffd05b6cbc400712180d4749410aae4276dc288cc69d535021cc4d61b1a4"
},
"native-2/18-state-view-picker.json": {
"bytes": 1241,
"sha256": "81d52aca8a4870d10be4ee48459ebc940b5c9399817f74c03f7bb2c545b6370f"
},
"native-2/19-reference-view-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/19-reference-view-1.jpg": {
"bytes": 126293,
"sha256": "a3653870e1afcc8808b4627bc435938f97eb9487e00b91b2278fbc7265bf9cda"
},
"native-2/19-reference-view.json": {
"bytes": 1235,
"sha256": "625a6587819f203fa8b82ca86a32cbf6b1853de6d7ee8024177adbed8f7eee74"
},
"native-2/20-reference-picker-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/20-reference-picker-1.jpg": {
"bytes": 129268,
"sha256": "de07f6abf1df6ccfa2d1461f0e9d03dc5a8c59d1b999e99b47ad548ad0e33f3a"
},
"native-2/20-reference-picker.json": {
"bytes": 1239,
"sha256": "37d6b22eda964fc5d270c3699b42de77012ed91ae02b809320517eaa6414043f"
},
"native-2/21-edited-view-return-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/21-edited-view-return-1.jpg": {
"bytes": 126971,
"sha256": "c9ae903418fa95118ed00ebc17026e52224cefdb075740f38784f90d97a375be"
},
"native-2/21-edited-view-return.json": {
"bytes": 1243,
"sha256": "95bdfe3e5150e353be6bbc54722bf5d10b5ef526da2589d3c65771a10851119b"
},
"native-2/22-transition-actions-reopen-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/22-transition-actions-reopen-1.jpg": {
"bytes": 130710,
"sha256": "850d1ffe7e4ec1eafdcd9056c115f1c50d4f310112b2502c23c3e7ee7667c2fc"
},
"native-2/22-transition-actions-reopen.json": {
"bytes": 1257,
"sha256": "4c256bdee194721424a98bca0cc4ac5df259d45174ccfd6dc1a9275b4a959644"
},
"native-2/23-transition-edit-form-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/23-transition-edit-form-1.jpg": {
"bytes": 134465,
"sha256": "d6b2a6d00544c84eaaa66481621eb70281b22eabe86539d54489cd28b997f54e"
},
"native-2/23-transition-edit-form.json": {
"bytes": 1255,
"sha256": "0a8f47170b1e9c6ab183401ac94a6a7af56b98d6f18248e2cc88aa4dbf0ce09f"
},
"native-2/24-transition-source-picker-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/24-transition-source-picker-1.jpg": {
"bytes": 132783,
"sha256": "fcb23f584ecb4470122c4a2276dfe92d3e8b20754e0a641c6cf53c50a2cbe883"
},
"native-2/24-transition-source-picker.json": {
"bytes": 1265,
"sha256": "a2af6cde560ffe2ce114c1ba5019ebd81af45960249ef1af040b0d63f85fa996"
},
"native-2/25-first-escape-picker-only-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/25-first-escape-picker-only-1.jpg": {
"bytes": 134562,
"sha256": "a45837ea333a05b50be5c081378cdce51b9c302ca49ce956389063e83906b63d"
},
"native-2/25-first-escape-picker-only.json": {
"bytes": 1265,
"sha256": "2d153f32fcfa82171a4f9721b1148bdcca32560f93ab75d8bb9a46dfdf87d6fb"
},
"native-2/26-second-escape-cancels-form-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/26-second-escape-cancels-form-1.jpg": {
"bytes": 134562,
"sha256": "a45837ea333a05b50be5c081378cdce51b9c302ca49ce956389063e83906b63d"
},
"native-2/26-second-escape-cancels-form.json": {
"bytes": 1269,
"sha256": "38d9b72fd6a36a524ba281c798f4b3266d13c82761da3c62d32f804b1131a062"
},
"native-2/27-second-escape-settled-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/27-second-escape-settled-1.jpg": {
"bytes": 134562,
"sha256": "a45837ea333a05b50be5c081378cdce51b9c302ca49ce956389063e83906b63d"
},
"native-2/27-second-escape-settled.json": {
"bytes": 1259,
"sha256": "8c3ac677ba291dd3a3c59345e78d36844fb93e5be69c960f7e25c5fb23a19a9e"
},
"native-2/28-explicit-cancel-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/28-explicit-cancel-1.jpg": {
"bytes": 127338,
"sha256": "af811b0432a4dbf16c0312af2c4222ede3abccbed189d1ce238382abef0c4146"
},
"native-2/28-explicit-cancel.json": {
"bytes": 1239,
"sha256": "d1b45b5bd046acdff26737d9c3461f03383d2d5ec3f017afd4c1d4dcd01a9721"
},
"native-2/29-save-after-form-cancel-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-2/29-save-after-form-cancel-1.jpg": {
"bytes": 127312,
"sha256": "81228aae86327fbc8a937c93c6919424d9fdd9273f65d773964488fe7813a655"
},
"native-2/29-save-after-form-cancel.json": {
"bytes": 1251,
"sha256": "e8ac53acde40e4634e101bf199795bdec32448a94d065b55eb251e28bb53ccc2"
},
"native-2/after-cancel-saved.arcadia": {
"bytes": 9705,
"sha256": "ea05d0e409687c7943dda0b93bc34036eb524f5f5033b912e71ad2eaf643a158"
},
"native-2/bend-saved.arcadia": {
"bytes": 9705,
"sha256": "ea05d0e409687c7943dda0b93bc34036eb524f5f5033b912e71ad2eaf643a158"
},
"native-2/finished.json": {
"bytes": 354,
"sha256": "4094c500ce0668ef6f0cba4e8ac43e3630d483be3a1b4f94584ce004e7826f9e"
},
"native-2/move-redo-saved.arcadia": {
"bytes": 9705,
"sha256": "ea05d0e409687c7943dda0b93bc34036eb524f5f5033b912e71ad2eaf643a158"
},
"native-2/move-undo-saved.arcadia": {
"bytes": 9705,
"sha256": "7f1fc18265a79b7d452e4a3de3f17671684e38c0f727cbdec15833196f46f114"
},
"native-2/started.json": {
"bytes": 891,
"sha256": "cd12917f9016f3f6e271ddf0a8eec1bc2cfd4fc2c65389380f9ecb43aaca1643"
},
"native-2/stderr.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"native-2/stdout.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"native-3/01-fresh-home-0.jpg": {
"bytes": 101565,
"sha256": "1823169b7164d38e81c38b83f2c3927f9f4b37f6fb59732d3387fa1791dbaff4"
},
"native-3/01-fresh-home.json": {
"bytes": 988,
"sha256": "a1562b3b2d66aa3d25b88cd693a505f9db7cac07177088d0d529ba19ea4cc1a9"
},
"native-3/02-maximized-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-3/02-maximized-1.jpg": {
"bytes": 105356,
"sha256": "f12eb6b9e8ce8606ffffd89fdd916cd6562492de3e69a7f104163816580f4107"
},
"native-3/02-maximized.json": {
"bytes": 1101,
"sha256": "ec1750b82cd0ffb5964e265ec2d5a027225e374e3afd6d9616eff38f5b5ed398"
},
"native-3/03-open-saved-fixture-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-3/03-open-saved-fixture-1.jpg": {
"bytes": 110813,
"sha256": "7a187538b69c82907fe301d778acae5fdbed094d87d9646942f0c324ae44df79"
},
"native-3/03-open-saved-fixture.json": {
"bytes": 1119,
"sha256": "c22071d278a4c2f4b9fb614bee7f3f0a707a8e82ecf7f0a78765bf16dc6f562b"
},
"native-3/04-system-state-reopened-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-3/04-system-state-reopened-1.jpg": {
"bytes": 129878,
"sha256": "2db55e8cc7f603c08b151cc020214ddd7a103d0bdb59e6d04bf5cd6a42fc3119"
},
"native-3/04-system-state-reopened.json": {
"bytes": 1250,
"sha256": "356f04db8dfa782a5816d050fd8a7c9a09a9cb5f58f5619ee90eca96b759314c"
},
"native-3/05-persisted-bend-selected-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-3/05-persisted-bend-selected-1.jpg": {
"bytes": 129942,
"sha256": "118a7bfb22bff5099a6f7008e234f85102992834d80d66510ee898562a3844b7"
},
"native-3/05-persisted-bend-selected.json": {
"bytes": 1254,
"sha256": "0279ec95b15e265c770c5168c34412ead55a18fbd38b2f47169f5b325c51f28a"
},
"native-3/06-save-after-reopen-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-3/06-save-after-reopen-1.jpg": {
"bytes": 128388,
"sha256": "e9185c8e612020d05cce72f995d21f22e6e832f05a63c66bf4c56f02639a9905"
},
"native-3/06-save-after-reopen.json": {
"bytes": 1242,
"sha256": "d74f726ff589336db1772cc8d7988d8c73f3c6d63973e6871324a3a3232cd632"
},
"native-3/07-engineering-guide-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-3/07-engineering-guide-1.jpg": {
"bytes": 173028,
"sha256": "1e9a9cdc315c7e12901ba3a5bd1dec6cfc2f5c3628d40346ade986c19b4e4254"
},
"native-3/07-engineering-guide.json": {
"bytes": 1242,
"sha256": "53a5822d73022eaed8c73b1d763d2a89facbc1878bc06ab6eecb18890af2ca9a"
},
"native-3/08-state-guide-topic-0.jpg": {
"bytes": 722,
"sha256": "d89da17fb8517188426907d542e2b5f91098a2e8d121506b6e65506e40de865d"
},
"native-3/08-state-guide-topic-1.jpg": {
"bytes": 198585,
"sha256": "0bcab4102666a794fd791561a4ef4ff44add5bfbb377cb9e79fb0cae3e57cbc9"
},
"native-3/08-state-guide-topic.json": {
"bytes": 1242,
"sha256": "2d7ba83836ec93ad6ee7104a26754cd42edffda055c5fa7305926557827b3807"
},
"native-3/finished.json": {
"bytes": 354,
"sha256": "e6853bb83c949db2828bedc8d7763012673ccb378f8172cbee6dfeb7efa3043d"
},
"native-3/reopened-saved.arcadia": {
"bytes": 9705,
"sha256": "ea05d0e409687c7943dda0b93bc34036eb524f5f5033b912e71ad2eaf643a158"
},
"native-3/started.json": {
"bytes": 891,
"sha256": "776ea6df056bf0204c1db8849e59e46fde961abee98823e8fdb86e95faa197ea"
},
"native-3/stderr.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"native-3/stdout.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"native-baseline.arcadia": {
"bytes": 9662,
"sha256": "2dae785d63a940094d8052f3dcddcb988c024b38df9780e026bccd516264dbfe"
},
"native-check.json": {
"bytes": 1247,
"sha256": "70f2fce9d03809ca178c2e94f4bd9802168c6c93e920f091f5960d7c165a4e1d"
},
"native-check.py": {
"bytes": 2210,
"sha256": "5c1f6aaa22c2c1d5abc0339ab0186f65e0ef3e58555681cb7a0a493024a875a7"
},
"native-launch.py": {
"bytes": 2545,
"sha256": "c6338d2234db3453bccaa65c9e2df3b48b3eadc206605762afc11fd2ad11b895"
},
"native-observations.md": {
"bytes": 5929,
"sha256": "878369a46ed0ef58d92b00ca008bcb1729fee216a5a7aeb7b637130872ed5b42"
},
"native-source-review.md": {
"bytes": 6540,
"sha256": "4216547e3aa8902f7c9b6f66e5d2ef8f10f50d3b815b2abf9398edd8b942ab0c"
},
"package-audit/audit.py": {
"bytes": 7776,
"sha256": "bb2a3877d25952814654652f1f5b25f3e5e2ae95063c0c244b80e07c06a22580"
},
"package-audit/build-link-records.json": {
"bytes": 30112,
"sha256": "9e52981badd31675982c6d358cb193d1d074cff777a2974eef3109b8a90f78d7"
},
"package-audit/build-link.py": {
"bytes": 3781,
"sha256": "e56e98a1502033fb9349e8313e075083c78ff0ca0c65eea0f619ca21d701a2b3"
},
"package-audit/result.json": {
"bytes": 3458,
"sha256": "937eefdffdf70159d4aa58b7042c47e10bf823d96bdf082acecb7ff92e2937d0"
},
"package-metadata/README.md": {
"bytes": 1902,
"sha256": "597cfb8da873e019d2658420f18ec059f0185fa9106ff9eafe934dfdd6ed266b"
},
"package-metadata/SHA256SUMS.txt": {
"bytes": 67036,
"sha256": "5fb408d7279f733daddf84ae59e4187c935d40738e420ad5bb7fa01641cbc693"
},
"package-metadata/START-HERE.txt": {
"bytes": 676,
"sha256": "a549295cf57ac73673dc4fa6106463450f982122793cb9c7135ce4fc7087e9ed"
},
"package-metadata/documentation-check.json": {
"bytes": 43,
"sha256": "18a35f7022d6c180c42ad4fd7c7010e494bdff0d2ca395efac84ac545fe23627"
},
"package-metadata/package.json": {
"bytes": 76306,
"sha256": "daf412ef5bd6facfe471181cc4c57203c25bc2b952e533d0e170a06302d0ea32"
},
"package-provenance-review.md": {
"bytes": 6178,
"sha256": "9ce825b952172b8e6e3ab8652ded4e6d5ab8666fbd55ebc9a7d4dc5d3b02ec2d"
},
"picker-policy-review.md": {
"bytes": 5213,
"sha256": "58d0bfb810762b46660748436e7ca69235a834cae62bd1a960b6158881b4154f"
},
"server-readback-check.json": {
"bytes": 372,
"sha256": "160a5978a49d1765febe6fcca31c0dbf604d6275a4f4c78160c04f83b6243859"
},
"server-readback-check.py": {
"bytes": 2850,
"sha256": "4e20463f5b62f83e0908a7deb1204d37b2e89979be6c1dc06b4ea7daa7569820"
},
"server-review.md": {
"bytes": 4800,
"sha256": "bd02d4b12a29a6b71ec91f381073dde736e887793c57ea5127e5313088ede167"
},
"server-smoke/01.request.http": {
"bytes": 72,
"sha256": "98a7941518fa378830e47e212bcab4500ab3ae951d13b79911acc92e61742b08"
},
"server-smoke/01.response.http": {
"bytes": 219,
"sha256": "0cc33f39df17d6b4a5ca28402b8719455696a694e385e1898cc7ce403d2f364f"
},
"server-smoke/02.request.http": {
"bytes": 79,
"sha256": "52cab473c448bd13e88e2c866e05071c5ebba40058db73ced7fb37779683e4e7"
},
"server-smoke/02.response.http": {
"bytes": 349010,
"sha256": "faa794207009a9a2c7988e2b49f1ab07c0eac68c09de9baa96f2054aed8a8c16"
},
"server-smoke/03.request.http": {
"bytes": 474,
"sha256": "a24ed595021750bc44ece5c2d1366b56bfa86cf011c112ab2871107c3da0cc11"
},
"server-smoke/03.response.http": {
"bytes": 535,
"sha256": "16c3b7e6acca0d71cb2b20641fa8038c51329201bb4c9db78b35d8e3be26d854"
},
"server-smoke/04.request.http": {
"bytes": 112,
"sha256": "41c7650b095643b62e8e6024047dac7a24221859c4697257c0480864b186ed41"
},
"server-smoke/04.response.http": {
"bytes": 1070,
"sha256": "f8d46feb5f1fed3d336cfefb2c47b1cbad3108c80154a2f17e251d4ea081d88c"
},
"server-smoke/05.request.http": {
"bytes": 127,
"sha256": "0350f3adcfc326d86dbc6c73a9691027093e788ebc73478175ea824fbb347a6c"
},
"server-smoke/05.response.http": {
"bytes": 579,
"sha256": "24a3205e9ecfeef972e71dae666634d65d3892c644e63556171bc014e49f2b2c"
},
"server-smoke/06.request.http": {
"bytes": 556,
"sha256": "fc44c92bb375c80bd87fc2d8a5e2897481dba4fa05a2f9524a9b9277c1d01b7f"
},
"server-smoke/06.response.http": {
"bytes": 1219,
"sha256": "579d76a9f6bd3023aa3e1bb5c3b01baad83a40f2a2d7be6c177368fe4e4d436d"
},
"server-smoke/07.request.http": {
"bytes": 561,
"sha256": "33f43063a9a52dbe65f9b0a571a048bb351463098572a76339e9eb893fd2c10c"
},
"server-smoke/07.response.http": {
"bytes": 450,
"sha256": "9ec589caf67f59b80488ff308572ea67a7acc60d819b8342cc4506df50be97cf"
},
"server-smoke/08.request.http": {
"bytes": 112,
"sha256": "41c7650b095643b62e8e6024047dac7a24221859c4697257c0480864b186ed41"
},
"server-smoke/08.response.http": {
"bytes": 1066,
"sha256": "46e90ec83c926b2c702f8901a53da4e4a1a1943d25cc778c8e794b6876044cd9"
},
"server-smoke/09.request.http": {
"bytes": 72,
"sha256": "98a7941518fa378830e47e212bcab4500ab3ae951d13b79911acc92e61742b08"
},
"server-smoke/09.response.http": {
"bytes": 219,
"sha256": "80c9c431a2fdd254ae292358cbf8fb15ab50a09357c3a8c05bd9f2a155e12136"
},
"server-smoke/10.request.http": {
"bytes": 112,
"sha256": "41c7650b095643b62e8e6024047dac7a24221859c4697257c0480864b186ed41"
},
"server-smoke/10.response.http": {
"bytes": 1066,
"sha256": "12acd31db3adb0ef07bea483502f1b499e0bfbeda3a980366bcbed21a70ca83d"
},
"server-smoke/11.request.http": {
"bytes": 127,
"sha256": "0350f3adcfc326d86dbc6c73a9691027093e788ebc73478175ea824fbb347a6c"
},
"server-smoke/11.response.http": {
"bytes": 577,
"sha256": "07bc56fb0a7b1532f720c64e1444f95eb085578894d42c17fdcb56b73fa5f495"
},
"server-smoke/accepted-envelope.json": {
"bytes": 1051,
"sha256": "933a78f4cc01424942e37f146c679ff9a59ed470643ebae94553f9b51386dace"
},
"server-smoke/edited.arcadia": {
"bytes": 249,
"sha256": "e59acb5ed01e55057096b22a39667b40ddddb97227395d04c281686a73c6a14c"
},
"server-smoke/first.stderr.log": {
"bytes": 120,
"sha256": "3bcc24b254215618fd5aea59360a1a7b8f3c7eba3d98063f8ebd8b4234e971f6"
},
"server-smoke/first.stdout.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"server-smoke/help.stderr.txt": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"server-smoke/help.stdout.txt": {
"bytes": 350,
"sha256": "99c5cb07d451c6da829b835b66fce92ce5c2529508c8053030123df704d0610e"
},
"server-smoke/original.arcadia": {
"bytes": 251,
"sha256": "1f6b88cbcc3ac12995192feca91e07b9f6d536f2d21d0df6f42aa08f5c745ba9"
},
"server-smoke/package-provenance.json": {
"bytes": 76305,
"sha256": "bcd528f4bc722a89bdf565d46c1e2ac474ab16b7a17512365c194c8da1319d49"
},
"server-smoke/restart.stderr.log": {
"bytes": 120,
"sha256": "3bcc24b254215618fd5aea59360a1a7b8f3c7eba3d98063f8ebd8b4234e971f6"
},
"server-smoke/restart.stdout.log": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"server-smoke/result.json": {
"bytes": 4731,
"sha256": "1e564b40fd65a7de3d9c251f239f67586e8a2060f541b7fa06451f5e7cb375f7"
},
"server-smoke/run.py": {
"bytes": 9122,
"sha256": "62f173e6dd284589639ca85029b3d343e73f6f4548193a203db66769ae12e018"
},
"server-smoke/store/.arcadia.lock": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"server-smoke/store/230d7234-8150-4252-a4bd-85a3b7b2308c.json": {
"bytes": 810,
"sha256": "c928995daf0c1ff3963850aba9ad533196423fa2112ad99554758825f73fc5af"
},
"server-smoke/version.stderr.txt": {
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"server-smoke/version.stdout.txt": {
"bytes": 21,
"sha256": "af82a1126f98794babaa173139764cadbfb5143a235f9a887ef70d18d00a0d91"
}
},
"archive": {
"bytes": 3425348,
"sha256": "cb084be5f316f1b3be45bc5493fe0cbd6076052198c09f9dbac441b8f2588e63"
}
}
@@ -0,0 +1,34 @@
# Downloaded Windows Studio: direct native observations
Codex-9e8r6t /root, 2026-09-24. Tested the unmodified fresh extraction of release 7 asset 25 on Windows 11 build 26200. Product source is `715036e132677dd2bc2fb37ed316d93dc9987aec`; no Cargo/build or Linux operation occurred in this exercise. This is independent of the producer's machine and GUI exercise.
## Launch and workflows
`native-launch.py` launched the packaged executable directly with PATH `C:\Windows\System32;C:\Windows`, removed development-related environment variables, and used unrelated working directory `C:/arcadia-package-qa-9e8r6t`. It retained the ordinary Windows user profile, including existing recovery entries; this is not a fresh-OS/profile test. Python only orchestrated the launch and logging. The original extracted bundle was not edited. A whole companion kit and example directory were copied to the working directory before opening the copied State model. Both application sessions closed normally with Alt+F4, exit 0, empty stdout/stderr and unchanged executable/runtime hashes.
Original screenshots and their timestamps/window identity/accessibility trees are in `native-2/` and `native-3/`. Each capture includes a full-window JPEG, plus a tiny icon image in most captures. Native actions used Computer Use, without application-state injection. Visual acceptance below is bounded to the actual observed sequence.
| Captures | Observed behavior |
| --- | --- |
| native-2 01–04 | Home launched; bundled water-pressure walkthrough loaded from the unrelated cwd (94 objects, 62 links, 1 model check). |
| native-2 05–09 | Opened copied State fixture; selected System perspective, readiness view 03 and Activate transition; Actions → Add bend displayed an additional square handle. |
| native-2 10–11 | Undo removed the added handle; Redo restored it. These two observations are visual, not saved full-file snapshots. |
| native-2 12–17 | Dragged new square downward; Save, Undo movement/Save, Redo movement/Save. Whole-source checks establish one additional waypoint, original (500,310) retained, added point moving (526,310) → (530,385), and exact movement Undo/Redo. |
| native-2 18–21 | Switched to untouched reference view 04, then returned to edited view 03. Reference layout remained distinct; the authored edit returned. Whole-file comparison also leaves every reference-view byte unchanged. |
| native-2 22–29 | Opened Edit transition and its source-state dropdown without changing fields. First Escape closed the dropdown and kept the form. Second Escape kept the form too. Explicit Cancel closed it; saving preserved the complete edited source exactly. |
| native-3 01–06 | Fresh process; reopened the working model, returned to System/State view 03, selected Activate. Both authored handles and downward bend persisted. Save produced identical complete source bytes. |
| native-3 07–08 | Opened built-in Engineering guide and its States, modes & transitions topic; guide content rendered normally. No external network-disconnection test was performed. |
`native-check.py` is a read-only full-byte evaluator. It starts with the independently downloaded companion baseline and allows only one exact addition in Activate's waypoint list in readiness_view. Consequently semantics, IDs, node positions, endpoint attachments, labels, other routes and all other views retain their original bytes. Its output is `native-check.json`. The five accepted saved snapshots are retained. A separate source reviewer checks the oracle and key original images in `native-source-review.md`.
## Scope and observations that are not pass claims
The filename `native-2/26-second-escape-cancels-form` records the intended probe, not its outcome. Captures 26 and 27 show the form still open. Source review in `picker-policy-review.md` confirms that ordinary State edit drafts use explicit Cancel; #35 retains existing surrounding Escape policies. No second-Escape cancellation or direct inspection of the history stack is claimed. After explicit Cancel, exact source preservation was checked; no fields had been edited in that form.
At 56% Fit, this fixture's transition labels are small and crowded. That limits readability and remains within the existing label/layout follow-up; this run does not establish broad diagram ergonomics, accessibility, label clarity or aggregate editing acceptance. The fixture intentionally reports 12 model checks (14 objects/9 links); the modeling issues were not fixed as part of a presentation-only check. This exercise does not cover all release-checklist cases; producer and other reviewers retain their separate scopes.
The first launcher invocation (`native-1`) failed before product startup because the copied environment dictionary used the wrong case for SystemRoot. The helper was corrected to read the case-insensitive original environment; the empty native-1 directory contains no run evidence and is excluded. File-dialog automation needed direct visible Filename entry after UIA set_value was unsupported. On reopening, an undeclared JavaScript local caused one tool call to fail before its action; declaration then succeeded. These are harness/tool errors, not product crashes. Raw successful native-2/native-3 captures and receipts are preserved without renaming or overwriting.
No release/tag changes or publication are performed by this QA branch. Codex-956atf owns release admission and publication.
Parent read-only server evidence reconciliation initially used Python's Windows default text decoding for accepted-envelope.json and failed equality on the Unicode comment. Explicit UTF-8 decoding made the saved HTTP/envelope/store comparison pass. No runtime request, product file, or captured source was changed; `server-readback-check.py` and its result preserve the corrected evaluator. The original packaged-server runtime smoke itself passed on its first run.
@@ -0,0 +1,53 @@
# Independent native source and screenshot review
2026-09-24. Reviewed captured package-QA evidence in `C:/ar-prerelease-qa-9e8r6t/.local/package-qa`, for the run receipts identifying source `715036e132677dd2bc2fb37ed316d93dc9987aec`. No GUI control, application launch, build, Git operation or captured-evidence modification. This file is the only written artifact. This is bounded review of the State bend/picker/reopen trial, not general release acceptance.
## Complete-file oracle: PASS
Baseline: `download-1/companions-21/prerelease-human-checks-20260924/state/native-fixture.arcadia`, 9662 bytes, SHA256 `2dae785d63a940094d8052f3dcddcb988c024b38df9780e026bccd516264dbfe`.
Using the bundled Python standard library in read-only mode, I compared every byte of each captured file against the original baseline with exactly one expected replacement. The unique replacement target is:
```text
edge @activate; waypoints [{ x 500; y 310; }]
```
The expected replacement retains that original waypoint and appends exactly this new serialized object (LF line breaks):
```text
edge @activate; waypoints [{ x 500; y 310; }, {
x X.0;
y Y.0;
}]
```
The target occurs once, inside `diagram readiness_view`, ID `ea202922-0033-4000-8000-000000000200`. All five full-file comparisons passed, without normalizing whitespace, line endings, strings or numbers. My initial compact single-line serialization expectation differed only in the inserted object's formatting; after explicitly accounting for the actual multiline decimal serialization above, every byte of the complete expected files matched.
| Captured file | New point | Bytes | SHA256 |
| --- | --- | --- | --- |
| `native-2/bend-saved.arcadia` | (530,385) | 9705 | `ea05d0e409687c7943dda0b93bc34036eb524f5f5033b912e71ad2eaf643a158` |
| `native-2/move-undo-saved.arcadia` | (526,310) | 9705 | `7f1fc18265a79b7d452e4a3de3f17671684e38c0f727cbdec15833196f46f114` |
| `native-2/move-redo-saved.arcadia` | (530,385) | 9705 | `ea05d0e409687c7943dda0b93bc34036eb524f5f5033b912e71ad2eaf643a158` |
| `native-2/after-cancel-saved.arcadia` | (530,385) | 9705 | `ea05d0e409687c7943dda0b93bc34036eb524f5f5033b912e71ad2eaf643a158` |
| `native-3/reopened-saved.arcadia` | (530,385) | 9705 | `ea05d0e409687c7943dda0b93bc34036eb524f5f5033b912e71ad2eaf643a158` |
Consequently, all semantic declarations, IDs, references, names, comments, transition endpoints/kind/guard/effects, original waypoint, route label/attachments, other routes, nodes and all other views remain byte-for-byte original. The moved, redone, explicit-cancel-saved and fresh-reopen-saved files are mutually byte-identical. This is stronger than checking selected parsed fields; it does not rely on the application's own serializer as the oracle for unrelated content. No semantic parser or hidden model/history introspection was run.
## Original screenshots inspected
I opened these full 1605x872 original `-1.jpg` captures using view_image, rather than the 16x16 companion thumbnails:
- `native-2/09-add-bend-1.jpg`, `10-undo-added-bend-1.jpg`, `11-redo-added-bend-1.jpg`: selected Activate route visibly has two square bend handles, then one, then two; status text correspondingly shows the State update, model change undone, and model change redone. This supports visible add/undo/redo behavior, without proving internal history depth or exact command count.
- `native-2/14-undo-bend-move-1.jpg`, `16-redo-bend-move-1.jpg`: the added handle returns beside the original handle on the upper row, then moves below it again; status text shows undone/redone. The exact coordinates and preservation claims come from the full-file oracle, not pixel measurement.
- `native-2/19-reference-view-1.jpg`: the picker identifies “04 Readiness — untouched reference”; the selected Activate route has no authored square bends. Other-view preservation is independently established by the source oracle.
- `native-2/24-transition-source-picker-1.jpg`: the Edit transition form is present and the source-state dropdown is open. `25-first-escape-picker-only-1.jpg`: dropdown closed, form retained with Ready, Active, External and crew_assigned visible. `26-second-escape-cancels-form-1.jpg`: form is still present, despite that capture's optimistic filename. The retained evidence must not be cited as second-Escape cancellation. Its actual content matches the existing explicit-Cancel policy explained in `picker-policy-review.md`.
- `native-2/28-explicit-cancel-1.jpg`: form is closed and the moved route remains. `after-cancel-saved.arcadia` confirms no accepted source change after cancel. This does not directly prove a no-op on internal undo/redo stacks.
- `native-3/05-persisted-bend-selected-1.jpg`: the reopened “03 Readiness — edit attachments” view shows both square handles and the lower moved bend, with the Activate transition selected. `native-3/08-state-guide-topic-1.jpg`: Engineering guide is open on “States, modes & transitions” with readable workflow content.
The route labels remain small and crowded at the captured 56% scale, especially in the reference view. These captures do not establish general diagram readability or accessibility. The evidence remains useful for the bounded interaction/source checks above.
## Run records and limits
Read `started.json` and `finished.json` for both runs. They record the same packaged binary/source identity, distinct process IDs (8188 then 6904), separate start times, exitCode 0 and unchanged binary/runtime hashes. The run-3 start follows run-2 finish. I independently read all four stdout/stderr files: each is zero bytes with SHA256 `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`. I did not rehash the executable/runtime or independently observe the Alt-F4 key; normal termination and identity assertions are the retained launcher receipts.
No material contradiction was found between the saved source, the inspected screen states and the bounded trial description. The one evidence-label correction is capture 26: its filename says cancellation, but the form demonstrably remains. The explicit Cancel and subsequent saved/reopened equality are established separately. This review supports exact saved presentation change, reversible visible outcomes, untouched semantics/other views, picker-only first Escape, explicit form cancellation, and fresh-process persistence. It does not prove internal history depth, every intermediate in-memory state, complete State editing, or broader prerelease/native acceptance.
@@ -0,0 +1,32 @@
# Downloaded prerelease package provenance review
2026-09-24. Bounded independent static audit of draft release 7, Studio asset 25 and checksum asset 26, downloaded into `download-1`. No material package-integrity, build-linkage, or static portability defect found. Both packaged executables match the preserved individual Cargo-identified build receipts for exact source 715036e; this review does not establish native acceptance.
## Reproduction and exact package
Run `python -B .local/package-qa/package-audit/audit.py` from this worktree. The stdlib audit reuses only the read-only document checker from `scripts/package-artifacts.py`; it does not launch shipped executables, invoke Cargo, or contact a network. Machine-readable results are in `package-audit/result.json`. Initial read-only Git checks reported clean tracked work and HEAD `715036e132677dd2bc2fb37ed316d93dc9987aec`.
The Studio ZIP is 34,168,661 bytes, SHA256 `5554e32533e3cb2c33fb4143a5a0902733d5a8d47577303cb2842d268e7bc76d`, matching the downloaded checksum and download receipt. All 565 archived files equal their extracted bytes and recorded pins. Names have no traversal, absolute paths, backslash ambiguity, or case-insensitive duplicates; extraction has no extra files. All 564 `SHA256SUMS.txt` entries pass, covering every file except that checksum inventory itself. All 559 `package.json` input hashes pass.
The supplied BuildEvidence and release snapshot identify source `715036e132677dd2bc2fb37ed316d93dc9987aec`, development profile, Rust 1.98.1, and `x86_64-pc-windows-gnullvm`. Both executable hashes match the actual archive bytes:
- Studio: `2c03bd6cc3f1110c219e4f57ab94874a121590f83779239a93289b7170664399`.
- Server: `6cebacc117e46fdab023c6402a5cebd6929fb55993ae8ff6b89cd1c6c1170237`.
The four BuildEvidence references (mandatory gate, source manifest, environment, artifact relocation) retain producer-local path labels. Their bytes are independently available in versioned gate evidence linked by the downloaded release snapshot: `206f3b969482241e01e2dfc6be955caf31747b89:harness/prerelease37-windows-gates-20260924/final04-complete`. After the parent fetched those objects, this reviewer read them without checkout or mutation. `package-audit/build-link.py` verifies the complete 6,588,421-byte evidence ZIP (SHA256 `7cead0b6aa36a6af8fc9f8987186bfe0decd8fa2ebab094fc45387ae9daea632`), all 462 member hashes, and exact agreement with all four BuildEvidence pins. Results and pertinent original receipt records are retained in `package-audit/build-link-records.json`.
Both individual builds have exit 0 and unchanged input captures identical to the final04 source manifest. Their source, target, and profile agree with the package; the preserved output size/hash equals each actual downloaded executable. The relocation records' Cargo compiler-artifact objects exactly occur in the corresponding pinned raw Cargo JSON logs, identify the appropriate non-test binary target and output path, and both streams record successful build completion. The aggregate summary records a passed gate at the same source. This bridges the package to the owner's already admitted source/build evidence; it does not rerun the broader 3,709-input source audit. Supplemental combined-build output hashes differ and are correctly excluded from the package identity claim. Keep the versioned evidence link in the final release so recipients can resolve the historical local labels.
## Runtime and offline content
An independent PE32+ parser confirmed x86-64 architecture and reproduced every recorded import for Studio, Server, and `libunwind.dll`. The only ordinary non-system dependency is the shipped `libunwind.dll`, whose own imports resolve to Windows components/API sets. All three delay-import directories are empty. The runtime hash matches package inputs and notice inventory: `aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a`. Dynamic graphics loading, driver compatibility, and execution without development PATH remain runtime checks owned by the parent; static imports cannot establish them.
All 18 checked local Markdown/reST/HTML file links resolve. The two HTML specifications load no external script/style/image resources and contain inline styling. All 66 shipped documentation/example/deployment/license source files checked match this exact clean source checkout (README maps to `scripts/package-readme.md`). This includes the complete tracked `examples/release1` content. Built-in Help behavior and actual example opening require the parent's separate native exercise.
The notice inventory contains 268 dependency packages. All 489 referenced notice paths/hashes match shipped bytes; Cargo.lock and 529 recorded local source/build-input hashes match the exact checkout with no mismatch. Rust and libunwind notices are present and pinned. This verifies the recorded notice closure, not an independent universal license audit, registry recompilation, or proof of embedded asset completeness.
## Launch guidance and scope
Read START-HERE, package README, Windows packaging guide, server launch/configuration guidance, and preview human checks. They consistently require keeping the bundle together and the runtime DLL beside both executables; local modeling needs no Rust installation or server. They distinguish packaged executable launch from Cargo/Docker recipes requiring a separate source checkout, and recommend keeping server data outside the application folder. The Windows guide explicitly requires fresh extraction, unrelated working directory, restricted process PATH, actual workflows, logs/exit checks, and acknowledges a second machine as stronger portability evidence.
The human checklist presents expected exercises rather than claiming those exercises passed. It preserves aggregate deletion and broader acceptance limitations. The downloaded release snapshot remains draft/prerelease with packaged runtime acceptance pending; this audit does not upgrade that state. No GUI/server execution, Cargo, Linux checks, product/source changes, Git mutation, or network activity occurred. Only the requested local review/audit artifacts were written.
@@ -0,0 +1,27 @@
# State transition picker Escape policy review
2026-09-24. Read-only source/policy analysis in the package-QA checkout identified by the parent as `715036e`. Read AGENTS.md, PROJECT_GOAL.md (relevant keyboard/cancellation search), `docs/preview-human-checks.md`, `harness/picker-escape-20260923.md`, the combined integration review, and actual State form/App/Escape-wrapper source and relevant tests. No Cargo, Git, GUI or network operations. The native observation (first Escape closes dropdown, second retains State transition form, capture 26) is parent-reported; I did not inspect that capture.
## Conclusion
The reported behavior is consistent with the implemented ordinary State Edit transition policy. It is **not evidence of a regression in issue 35**. The current ordinary State draft has an explicit Cancel action; a generic second Escape is not wired to discard it. The checklist does not establish a new universal second-Escape cancellation requirement. This conclusion distinguishes the actual implementation and selected #35 contract from a broader usability preference; it does not claim that every modal's Escape behavior is consistent or ideal.
## Actual call paths
- `crates/oa-desktop/src/behavior/states.rs:247-282`: `Event::Edit(id)` constructs the editable transition draft in `states.draft`. The form's From state / To state pickers are at `:454-455`. The word source here denotes the transition endpoint; this is not a nested behavior source-authoring form.
- `states.rs:283` explicitly handles `Event::Cancel` by clearing the draft through acknowledge_commit. The visible Cancel button emits that event at `:576`. `behavior.rs:938-946` recognizes cancellation of the currently pending State draft and acknowledges it without returning a model command. The independent behavior-form test also checks that explicit Cancel discards the pending form (`behavior.rs:3560`).
- `behavior.rs:908-914` defines `source_active` from creation, Scenario and Process source forms; it does not include an ordinary State transition edit. `creation.has_pending()` is a separate editor from `states.draft`.
- `app.rs:2742-2760` handles generic Message::Escape: source_back first, then source_active cancellation, then behavior.creation cancellation, then State AdjustAttachment tool cancellation. It has no ordinary State draft cancellation branch. If an uncaptured second Escape reaches this handler, it can retire transient canvas state, but it does not clear the transition draft or commit model/source/history changes.
- The #35 root wrapper (`app/escape.rs:18-32`) forwards captured focused-input Escape only for the existing listed workflows: behavior.creation, diagram usages, behavior source forms and specified Text workflows, plus the separate architecture callback. It does not add ordinary State transition forms to that policy. Its popup preflight lets an open dropdown consume Escape before those surrounding actions (`:101-140`). The global subscription separately ignores captured Escape (`app.rs:1316-1320`). Thus both captured and uncaptured paths are compatible with the reported second-Escape retention.
## Contract and test limits
`harness/picker-escape-20260923.md:10-15` explicitly requires popup dismissal without changing the surrounding draft/model/source/history/selection/camera, followed by the existing surrounding workflow's policy on a later Escape. Its design preserves existing activation predicates and message priorities. The combined review repeats “next Escape follows existing modal priority” (`harness/reviews/prerelease37-integration-20260924.md:38`).
`docs/preview-human-checks.md:45-47` says a subsequent Escape follows the form's ordinary cancellation behavior. It does not say every form closes on that key. Read against the actual selected #35 contract, it should not be used to invent a second-Escape cancellation oracle for this State editor. If polishing the checklist later, “follows the surrounding workflow's existing Escape policy; use explicit Cancel where that form requires it” would remove the ambiguity without changing behavior.
`app/state_picker_escape_tests.rs` exercises the actual State missing-element picker, including close/reopen/place and exact unchanged document/selection/camera/history on dismissal; it is not a test that second Escape closes the transition editor. The composed pending-form cases in `app/escape/tests.rs` use behavior.creation/source workflows, whose existing Escape policy does cancel or go back. Those test results should not be generalized to ordinary State editing.
## Recommended package-QA disposition
Record first-Escape popup dismissal with unchanged transition form as the observed #35 success for this native control. Record second-Escape form retention as compatible with its current explicit-Cancel path, rather than a product regression inferred from the generic checklist. Use the visible Cancel button, verify the form closes and accepted model/source/history remain unchanged, and continue package QA. A future request to make ordinary State forms Escape-cancelable would be a separate product-policy change requiring consistent draft-loss/focus semantics and its own verification.
@@ -0,0 +1,35 @@
# Independent packaged server review — draft release 7
**PASS for the bounded Windows packaged-server HTTP/restart smoke.** 23 explicit checks passed on Windows 11 build 26200. The helper exited 0. This is runtime evidence for the downloaded packaged server, not a source build, native desktop acceptance, or release publication.
## Identity and execution isolation
- Reviewed source identity supplied by package build evidence: `715036e132677dd2bc2fb37ed316d93dc9987aec`. Package identifies `dev` profile, `x86_64-pc-windows-gnullvm`, rustc `1.98.1 (48a229cea 2026-09-01)`. These source/compiler/profile statements remain distributor assertions, not independently rebuilt provenance.
- Downloaded Studio ZIP: `ArcadiaStudio-0.2.0-preview.integrated.20260924-x86_64-pc-windows-gnullvm.zip`, 34,168,661 bytes, independently rehashed SHA-256 `5554e32533e3cb2c33fb4143a5a0902733d5a8d47577303cb2842d268e7bc76d`.
- Executed only its extracted `arcadia-server.exe`, SHA-256 `6cebacc117e46fdab023c6402a5cebd6929fb55993ae8ff6b89cd1c6c1170237`. `--version` returned `arcadia-server 0.2.0`; version/help exited 0. Bundled `libunwind.dll` hash `aa282fa47bb2c4e210cea5e470cdbdca58568f0be0bc73e404d86ab9cd95ef6a` is recorded.
- Child environment is an explicit Windows runtime whitelist, with PATH exactly `C:\Windows\System32;C:\Windows;C:\Windows\System32\Wbem`. No inherited Rust/development PATH or server bearer token. Python orchestrates HTTP and process lifetime only; it supplies no server runtime library.
- Working directory and fresh isolated store are under `.local/package-qa/server-smoke`; original extracted package files were not modified. Listener used newly available loopback port `127.0.0.1:61860`, never a non-loopback interface. No existing store or service was touched.
Literal helper launch:
```powershell
& C:/Users/User/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe .local/package-qa/server-smoke/run.py
```
Exact child argv arrays, environment, executable/runtime hashes, process IDs and exit results are in [server-smoke/result.json](server-smoke/result.json). The helper refuses a preexisting store, so reruns must use a fresh evidence directory rather than overwriting this run.
## Exercised behavior
1. Startup readiness returned 200. Served OpenAPI returned 200 and exactly equalled the packaged OpenAPI JSON contract.
2. Imported the complete authored source bundle with stable model/activity IDs, an explicit Unicode comment and CRLF text. POST returned 201; GET preserved the entry filename and exact file text, UUIDs and comment. Server resource ID was independently allocated and distinct from the model ID.
3. GET returned the same initial strong ETag; conditional source-project PUT changed only project name `Package QA original` to `Package QA edited`, returned changed=true, incremented revision exactly from 1 to 2 and returned a new ETag plus exact edited bundle.
4. A second PUT with the stale revision-1 ETag and a distinctive rejected name returned `412 revision_conflict`. Subsequent GET equalled the accepted edited model/source pair exactly; the expected model was independently constructed by changing only its name in the original model.
5. The acknowledged HTTP envelope exactly equalled the stored JSON envelope. The server was terminated, restarted from the same store and again passed readiness. Whole-envelope GET and source-project GET retained exact revision-2 ETag, all IDs, name, comment and CRLF text. Restart/readback did not change committed envelope bytes.
Resource: `230d7234-8150-4252-a4bd-85a3b7b2308c`; final revision 2; store SHA-256 `c928995daf0c1ff3963850aba9ad533196423fa2112ad99554758825f73fc5af`.
## Evidence and limits
[server-smoke/run.py](server-smoke/run.py) is the executable evaluator. Numbered `*.request.http` and `*.response.http` files contain literal requests/responses, including source bodies and ETags, without secrets. `original.arcadia`, `edited.arcadia`, `accepted-envelope.json`, isolated `store/`, copied `package-provenance.json`, help/version output and both process stdout/stderr logs are retained. Logs contain normal startup messages; no crash/error diagnostics were observed.
Both server processes were deliberately stopped with Windows TerminateProcess after completed, acknowledged requests (exit code 1 is the imposed termination result). This verifies restart recovery of acknowledged writes; **it does not establish graceful Ctrl+C shutdown, in-flight-write recovery or power-loss safety**. Both processes have been stopped. Authentication, remote networking/TLS, Linux/container operation, broad API semantics, concurrency/load and GUI behavior are outside this bounded run. No Cargo/build, source edits, Git mutations, Gitea messages or GUI operations occurred.
-5
View File
@@ -204,8 +204,3 @@ are recorded in release-routing-verification.md. The measured release full solve
is 119 ms, so the initial settled target is not claimed as passed. Current Linux
verification and broader release acceptance remain separate from the completed
routing workflows.
Dedicated State transition title/summary layout, measured desktop label bounds
and painted-label hit ownership are specified in
[the State label layout contract](state-label-layout-contract.md). This derived
presentation follow-up does not change authored routing metadata.
-37
View File
@@ -1,37 +0,0 @@
# State transition label layout
Derived presentation contract for [issue #36](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/36), based on source `715036e132677dd2bc2fb37ed316d93dc9987aec`. This follow-up is separate from the frozen September 24 prerelease. Implementation at `70bdcdf8fec1728e971cd90ad7f79a1df99777ff` has [scoped Windows test/build and native Save/reopen evidence](experiments/state-label-layout-20260924/README.md), including an explicit restored-window input limitation. Integration status belongs to the issue.
## Scope and decision
The reproduced external transition title `Ready\nfor review` occupies two lines, while the old painter reserved only one line before its summary `External · Completion [request_ready]`. Routing sized the box from the summary alone. The correction is one derived title/summary layout on routed labels in dedicated State projections. Other projections, State headers, action rows and internal-transition rows retain their existing layout.
The layout is prepared before label placement, so painting, collision avoidance, hit bounds, focus, previews and SVG share it. Core accepts a line-width measurement callback without a font dependency. Desktop consumers use the same Iced Paragraph font, size, shaping and line-height configuration as their canvas text. Core-only callers retain an explicitly approximate deterministic width fallback. No semantic model or serialized layout field is introduced.
Flattening line breaks would lose the authored presentation. Enlarging only the paint background would leave focus and selection inconsistent. A scalar-width estimate is insufficient for a width-dominating title such as 40 `W` characters. Dynamic node/row layout is outside this reproduced defect and would change unrelated State placement and group-editing contracts.
## Excerpts and display lines
Keep the existing summary excerpt: at most 48 Unicode scalars of the original summary, taking 47 and an ellipsis when longer. `EdgeLabelGeometry.text` retains this raw excerpt. Typed usage visibility compares this original prefix with the original summary; normalization must never change the field offsets or expose text after the cutoff.
For compatibility, the title budget is fixed from the old summary width, before new measurement: `floor((7*N+6)/6)`, where `N` is the retained raw summary's scalar count. Apply the existing whole-prefix-and-ellipsis rule to the raw title. This is a bounded excerpt, not a promise to retain breaks beyond its cutoff.
In each retained excerpt, CRLF is one display break; LF, bare CR, NEL, Unicode line separator and paragraph separator are also breaks. Tabs display as four spaces. These transformations do not modify source or raw usage provenance. Empty blocks have zero lines. Nonempty trailing and blank lines are preserved: `A\n` and `\n` each have two cells. A CR at an excerpt boundary is a break even if its LF was truncated.
Each line uses font size 10 and an explicit 12-unit line cell, without wrapping. The summary begins after all title cells. Width is the maximum measured displayed-line advance plus five units of padding on each side. Height is at least 24 units and otherwise 12 times the total line count. Lines start at `(5, 12*index)` relative to the shared box. Authored fraction, offset, center, attachments and waypoints remain unchanged. Automatic label positions may change because their obstacles are now accurate.
## Hit ownership and consumers
The dedicated State canvas paints opaque label backgrounds after nodes and rows. Its ordinary hit test therefore checks those same rectangles before nodes/rows, in reverse label paint order. Padding and blank cells belong to the rectangle. Existing selected endpoint/bend handling remains earlier; path-distance ties, group admission and `(placement, relation)` row identities remain unchanged. Exposed adjacent row pixels still select that exact row. This deliberately does not model every crossing route-stroke pixel.
Scene routing, edge/group previews, usage/focus queries, generic canvas paths receiving a State plan and SVG all consume the measured plan. SVG emits explicit positions for each line and the same font-size declaration; exact appearance under an external viewer's substituted font is not guaranteed.
## Acceptance
- Exact peer fixture: two title cells followed by one summary cell, readable and selectable at its last line, with full Project/source conservation.
- Bounds falsifiers: 40 `W` title characters and a fallback/combining-text case, plus blank lines and separators. Inspect actual native glyph containment; Paragraph advance alone is not a universal ink-overhang proof.
- Raw-prefix provenance across CRLF and multibyte text, typed fields at/after the cutoff, and duplicate names in unrelated prose.
- Label over node selects the Edge; adjacent exposed row keeps its StateRow identity; overlapping labels choose the last painted. Shift selection, mixed-group refusal and existing handles keep their contracts.
- Preview and settled scene bounds agree after movement; nonzero pan/zoom has no stale hit rectangle. Save/reopen and Undo/Redo preserve the independently declared source/model oracles.
Use meaningful automated checks and the actual Windows GUI. Linux is excluded by the user's current instructions. Publish verification and limitations with the implementation before closing #36.