diff --git a/crates/oa-desktop/src/app.rs b/crates/oa-desktop/src/app.rs index 7e5eee23..35359a84 100644 --- a/crates/oa-desktop/src/app.rs +++ b/crates/oa-desktop/src/app.rs @@ -424,6 +424,7 @@ pub enum Message { SourceSymbolsReady(crate::source_navigation::Completion), SourceForSelection, SourceNavigation(crate::source_navigation::Event), + SourceFindClose(crate::source_navigation::SymbolContext, Id), Save(bool), SavePath(Option), Saved(Result, SaveFailure>), @@ -497,6 +498,7 @@ pub struct App { pub source_jump: Option, source_select_line: bool, pub source_navigation: crate::source_navigation::State, + source_find_instance: Id, pub source_symbols: crate::source_navigation::SymbolState, pub model_issues: Vec, pub migration: Option, @@ -603,6 +605,7 @@ impl App { source_jump: None, source_select_line: false, source_navigation: crate::source_navigation::State::default(), + source_find_instance: Id::new_v4(), source_symbols: crate::source_navigation::SymbolState::default(), model_issues, migration: None, @@ -1058,7 +1061,7 @@ impl App { self.behavior.creation.has_pending() || self.behavior.source_active() || (self.page == Page::Text - && self.source_symbols.open + && (self.source_symbols.open || self.source_navigation.open) && self.architecture.is_none()), ) .map(|()| Message::Escape), @@ -1106,6 +1109,23 @@ impl App { ]) } pub fn update(&mut self, message: Message) -> Task { + let message = match message { + Message::SourceFindClose(context, instance) => { + if context != self.source_symbol_context() + || instance != self.source_find_instance + || !self.source_navigation.open + || !self.source_navigation_available() + { + return Task::none(); + } + // Only the checked envelope may enter the legacy Close handler. + Message::SourceNavigation(crate::source_navigation::Event::Close) + } + Message::SourceNavigation(crate::source_navigation::Event::Close) => { + return Task::none(); + } + message => message, + }; if let Message::SourceSymbols(context, _) = &message && (context.session != self.source_workspace.session() || context.path != self.source_workspace.active) @@ -1838,6 +1858,8 @@ impl App { return self.update(Message::Add(child)); } Message::Escape => { + let restore_source_focus = self.source_navigation_available() + && (self.source_navigation.open || self.source_symbols.open); if self.behavior.source_back() { self.status = "Returned to the unchanged parent form; no source was created.".into(); @@ -1857,6 +1879,9 @@ impl App { self.source_symbols.open = false; self.source_symbols.results = None; self.source_symbols.notice = None; + if restore_source_focus { + self.restore_source_editor_focus(); + } self.canvas_epoch = self.canvas_epoch.wrapping_add(1); self.selected_bend = None; } @@ -2971,6 +2996,7 @@ impl App { } Message::SourceRelated(location) => self.jump_to_source(location), Message::SourceViewport(ticket) => return self.source_viewport(ticket), + Message::SourceFindClose(..) => return Task::none(), // update checks and unwraps it Message::SourceSymbols(_, event) => return self.source_symbol_event(event), Message::SourceSymbolsReady(completion) => { return self.source_symbols_ready(completion); @@ -3019,6 +3045,7 @@ impl App { return Task::none(); } self.page = Page::Text; + self.source_find_instance = Id::new_v4(); self.source_navigation.open = true; self.source_navigation.refresh(&self.source_editor.text()); return iced::widget::operation::focus(if go_to_line { @@ -3027,7 +3054,13 @@ impl App { "source-find" }); } - Event::Close => self.source_navigation.open = false, + Event::Close => { + let was_open = self.source_navigation.open; + self.source_navigation.open = false; + if was_open { + self.restore_source_editor_focus(); + } + } Event::Query(query) => { self.source_navigation.query = query; self.source_navigation.refresh(&self.source_editor.text()); diff --git a/crates/oa-desktop/src/app/source_symbols.rs b/crates/oa-desktop/src/app/source_symbols.rs index 9516a2b3..20d0ce55 100644 --- a/crates/oa-desktop/src/app/source_symbols.rs +++ b/crates/oa-desktop/src/app/source_symbols.rs @@ -41,6 +41,10 @@ impl App { pub fn source_symbol_message(&self, event: nav::SymbolEvent) -> Message { Message::SourceSymbols(self.source_symbol_context(), event) } + + pub fn source_find_close_message(&self) -> Message { + Message::SourceFindClose(self.source_symbol_context(), self.source_find_instance) + } pub fn source_key(&self) -> query::SnapshotKey { query::SnapshotKey { workspace: self.source_workspace.session(), @@ -134,6 +138,15 @@ impl App { }); } + pub(super) fn restore_source_editor_focus(&mut self) { + let cursor = self.source_editor.cursor(); + if self.source_navigation_available() + && nav::exact_cursor(self.source_workspace.text(), cursor) + { + self.queue_source_reveal(cursor, false); + } + } + pub(super) fn source_viewport(&mut self, ticket: Option) -> Task { let Some(reveal) = &self.source_symbols.reveal else { return Task::none(); @@ -180,8 +193,10 @@ impl App { self.source_symbols.notice = None; } nav::SymbolEvent::Back => { - self.source_symbols.open = true; self.source_symbol_back(); + // A successful Back needs no empty results panel. Retain an + // already open panel, or reveal an actionable return notice. + self.source_symbols.open |= self.source_symbols.notice.is_some(); } nav::SymbolEvent::Choose { stamp, diff --git a/crates/oa-desktop/src/app/source_symbols/tests.rs b/crates/oa-desktop/src/app/source_symbols/tests.rs index 2c3f342c..6168e736 100644 --- a/crates/oa-desktop/src/app/source_symbols/tests.rs +++ b/crates/oa-desktop/src/app/source_symbols/tests.rs @@ -461,6 +461,10 @@ fn escape_dismisses_modal_before_underlying_source_results() { app.hosted.visible = true; send(&mut app, Message::Escape); assert!(!app.hosted.visible); + assert!( + app.source_reveal_ticket().is_none(), + "modal dismissal must not focus the editor" + ); assert!(app.source_symbols.open); assert!(Arc::ptr_eq( app.source_symbols.results.as_ref().unwrap(), @@ -473,6 +477,303 @@ fn escape_dismisses_modal_before_underlying_source_results() { assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); } +#[test] +fn closed_results_stay_closed_on_exact_back_and_reopen_only_for_a_return_notice() { + for changed in [false, true] { + let mut app = fixture(); + let accepted = app.document.snapshot(); + let origin = app.source_editor.cursor(); + finish(&mut app, query::Action::Definition); + reveal(&mut app); + symbol(&mut app, nav::SymbolEvent::Close); + assert!(!app.source_symbols.open && app.source_symbols.results.is_none()); + if changed { + // Use the workspace edit API to give the origin a new generation. + show(&mut app, USES); + let text = app.source_workspace.text().to_owned(); + send( + &mut app, + Message::SourceEdit(text_editor::Action::SelectAll), + ); + send( + &mut app, + Message::SourceEdit(text_editor::Action::Edit(text_editor::Edit::Paste( + Arc::new(format!("{text}// current cursor\r\n")), + ))), + ); + show(&mut app, DEFINITIONS); + } + let raw = app.source_workspace.bundle(); + symbol(&mut app, nav::SymbolEvent::Back); + assert_eq!(app.source_workspace.active, USES); + assert_eq!(app.source_symbols.open, changed); + assert_eq!(app.source_symbols.notice.is_some(), changed); + reveal(&mut app); + if !changed { + assert_eq!(app.source_editor.cursor(), origin); + } + assert_eq!(app.source_workspace.bundle(), raw); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + assert!(!app.document.can_undo() && !app.document.can_redo()); + } + let mut app = fixture(); + symbol(&mut app, nav::SymbolEvent::Back); + assert!(app.source_symbols.open && app.source_symbols.notice.is_some()); +} + +#[test] +fn find_only_captured_escape_closes_once_and_preserves_raw_query_and_selection() { + let mut app = fixture(); + let accepted = app.document.snapshot(); + let raw = app.source_workspace.bundle(); + let cursor = app.source_editor.cursor(); + app.source_navigation.open = true; + app.source_navigation.query = "送水 🚀".into(); + assert!(!app.source_symbols.open); + let mut messages = captured_input_subscription_messages(&app); + assert_eq!(messages.len(), 1); + assert!(matches!(messages[0], Message::Escape)); + send(&mut app, messages.remove(0)); + assert!(!app.source_navigation.open && !app.source_symbols.open); + assert_eq!(app.source_navigation.query, "送水 🚀"); + assert!(app.source_reveal_ticket().is_some()); + reveal(&mut app); + assert_eq!(app.source_editor.cursor(), cursor); + assert!(captured_input_subscription_messages(&app).is_empty()); + assert_eq!(app.source_workspace.bundle(), raw); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + assert!(!app.document.can_undo() && !app.document.can_redo()); +} + +#[test] +fn old_find_close_cannot_cancel_a_new_file_session_or_reopened_find_intent() { + for replacement in 0..3 { + let mut app = fixture(); + if replacement == 0 { + show(&mut app, "project.arcadia"); + } + send(&mut app, Message::SourceNavigation(nav::Event::Open(false))); + let old_context = app.source_symbol_context(); + let old_instance = app.source_find_instance; + let old_close = app.source_find_close_message(); + match replacement { + 0 => { + let project = app.project().clone(); + app.reset(project, None); + app.page = Page::Text; + assert_eq!(app.source_workspace.active, old_context.path); + assert_ne!(app.source_workspace.session(), old_context.session); + } + 1 => { + show(&mut app, DEFINITIONS); + assert_eq!(app.source_workspace.session(), old_context.session); + assert_ne!(app.source_workspace.active, old_context.path); + } + 2 => { + send(&mut app, old_close.clone()); + assert!(!app.source_navigation.open); + assert!(app.source_reveal_ticket().is_some()); + assert_eq!(app.source_symbol_context(), old_context); + } + _ => unreachable!(), + } + send(&mut app, Message::SourceNavigation(nav::Event::Open(false))); + assert_ne!(app.source_find_instance, old_instance); + send( + &mut app, + Message::SourceNavigation(nav::Event::Query("Current Find 雨".into())), + ); + let text = app.source_workspace.text(); + let (offset, len) = match replacement { + 0 => (text.find("project model").unwrap() + "project ".len(), 5), + 1 => ( + text.find("oa_activity pump").unwrap() + "oa_activity ".len(), + 4, + ), + _ => (text.find("source @pump").unwrap() + "source @".len(), 4), + }; + let cursor = selection(text, offset, offset + len, true); + app.source_editor.move_to(cursor); + let request = begin(&mut app, query::Action::References); + let ready = completion(&app, request); + app.queue_source_reveal(cursor, false); + let find_instance = app.source_find_instance; + let mut stale = vec![old_close, Message::SourceNavigation(nav::Event::Close)]; + if replacement != 2 { + // Independently require the session/path guard, even with a current + // invocation token. A token check alone is not the location contract. + stale.push(Message::SourceFindClose(old_context, find_instance)); + } + assert_stale_envelopes_preserve_current(&mut app, &stale); + assert!(app.source_navigation.open); + assert_eq!(app.source_navigation.query, "Current Find 雨"); + assert_eq!(app.source_find_instance, find_instance); + send(&mut app, Message::SourceSymbolsReady(ready)); + assert_stale_envelopes_preserve_current(&mut app, &stale); + assert!(app.source_navigation.open); + assert_eq!(app.source_navigation.query, "Current Find 雨"); + let current_close = app.source_find_close_message(); + send(&mut app, current_close); + assert!(!app.source_navigation.open); + assert_eq!(app.source_navigation.query, "Current Find 雨"); + assert!(app.source_reveal_ticket().is_some()); + reveal(&mut app); + assert_eq!(app.source_editor.cursor(), cursor); + } +} + +#[tokio::test] +async fn find_close_releases_removed_input_and_guarded_focus_respects_later_input() { + use iced::advanced::{Layout, layout, widget}; + use iced::futures::StreamExt; + use iced::widget::{column, text_input}; + + #[derive(Default)] + struct Focus(Vec<(Option, bool)>); + impl widget::Operation for Focus { + fn traverse(&mut self, visit: &mut dyn FnMut(&mut dyn widget::Operation)) { + visit(self); + } + fn focusable( + &mut self, + id: Option<&widget::Id>, + _: iced::Rectangle, + state: &mut dyn widget::operation::Focusable, + ) { + self.0.push((id.cloned(), state.is_focused())); + } + } + fn view(app: &App, later: bool) -> iced::Element<'static, Message, iced::Theme, ()> { + let mut content = column![ + text_input("Editor", "unchanged source") + .id(app.source_editor_id()) + .on_input(|s| Message::SourceNavigation(nav::Event::Query(s))) + ]; + if app.source_navigation.open { + content = content.push( + text_input("Find", "送水") + .id("source-find") + .on_input(|s| Message::SourceNavigation(nav::Event::Query(s))), + ); + } + if later { + content = content.push( + text_input("Other", "preserve focus") + .id("later-input") + .on_input(|s| Message::SourceNavigation(nav::Event::Query(s))), + ); + } + content.into() + } + fn run( + ui: &mut iced::Element<'_, Message, iced::Theme, ()>, + tree: &mut widget::Tree, + node: &layout::Node, + mut op: Box, + ) { + loop { + ui.as_widget_mut() + .operate(tree, Layout::new(node), &(), op.as_mut()); + match op.finish() { + widget::operation::Outcome::Chain(next) => op = next, + widget::operation::Outcome::None => break, + widget::operation::Outcome::Some(()) => panic!("focus must not produce a message"), + } + } + } + for escape in [false, true] { + for later in 0..3 { + let mut app = fixture(); + app.source_navigation.open = true; + let accepted = app.document.snapshot(); + let raw = app.source_workspace.bundle(); + let cursor = app.source_editor.cursor(); + let mut ui = view(&app, false); + let mut tree = widget::Tree::new(ui.as_widget()); + let limits = layout::Limits::new(iced::Size::ZERO, iced::Size::new(500., 250.)); + let node = ui.as_widget_mut().layout(&mut tree, &(), &limits); + run( + &mut ui, + &mut tree, + &node, + Box::new(widget::operation::focusable::focus(widget::Id::new( + "source-find", + ))), + ); + let mut focus = Focus::default(); + ui.as_widget_mut() + .operate(&mut tree, Layout::new(&node), &(), &mut focus); + assert!( + focus + .0 + .contains(&(Some(widget::Id::new("source-find")), true)) + ); + + let close = if escape { + Message::Escape + } else { + app.source_find_close_message() + }; + send(&mut app, close); + assert!(!app.source_navigation.open); + let ticket = app + .source_reveal_ticket() + .expect("closing an open Find queues focus"); + ui = view(&app, later != 0); + tree.diff(ui.as_widget()); + let node = ui.as_widget_mut().layout(&mut tree, &(), &limits); + let task = app.update(Message::SourceViewport(Some(ticket))); + if later != 0 { + run( + &mut ui, + &mut tree, + &node, + Box::new(widget::operation::focusable::focus(widget::Id::new( + "later-input", + ))), + ); + } + if later == 2 { + app.source_symbols + .raw_interaction + .fetch_add(1, Ordering::SeqCst); + } + let mut actions = + iced_runtime::task::into_stream(task).expect("guarded widget operation"); + while let Some(action) = actions.next().await { + let iced_runtime::Action::Widget(op) = action else { + panic!("focus-only task"); + }; + run(&mut ui, &mut tree, &node, op); + } + let mut focus = Focus::default(); + ui.as_widget_mut() + .operate(&mut tree, Layout::new(&node), &(), &mut focus); + assert!( + !focus + .0 + .iter() + .any(|(id, _)| id.as_ref() == Some(&widget::Id::new("source-find"))) + ); + assert!( + focus + .0 + .contains(&(Some(app.source_editor_id()), later == 0)) + ); + if later != 0 { + assert!( + focus + .0 + .contains(&(Some(widget::Id::new("later-input")), true)) + ); + } + assert_eq!(app.source_editor.cursor(), cursor); + assert_eq!(app.source_workspace.bundle(), raw); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + } + } +} + /// Feed the real App subscription recipes the status produced by a mounted /// TextInput. Poll only immediately available output: no timer wait, worker, /// file dialog or App task is executed by this helper. diff --git a/crates/oa-desktop/src/views.rs b/crates/oa-desktop/src/views.rs index 1a74bc65..e91892e3 100644 --- a/crates/oa-desktop/src/views.rs +++ b/crates/oa-desktop/src/views.rs @@ -1020,7 +1020,7 @@ fn source(app: &App) -> View<'_, Message> { ), action("Next", Message::SourceNavigation(SourceEvent::Next(false))), label(app.source_navigation.label()), - action("Close", Message::SourceNavigation(SourceEvent::Close)), + action("Close", app.source_find_close_message()), ] .spacing(6) .align_y(iced::Center), @@ -1208,8 +1208,18 @@ fn source(app: &App) -> View<'_, Message> { } else { container(editor).width(Fill).height(Fill).into() }; + source_layout(header.into(), workspace, app.window_size.height) +} + +fn source_layout<'a, Renderer: iced::advanced::text::Renderer + 'a>( + header: View<'a, Message, iced::Theme, Renderer>, + workspace: View<'a, Message, iced::Theme, Renderer>, + window_height: f32, +) -> View<'a, Message, iced::Theme, Renderer> { + // Lint clears and repopulates diagnostics asynchronously. Reserve the same + // outer slot so a pointer aimed at the editor cannot land in the header. column![ - container(scrollable(header)).max_height((app.window_size.height * 0.42).max(180.)), + container(scrollable(header).id("source-header")).height((window_height * 0.42).max(180.)), workspace, ] .height(Fill) @@ -1222,6 +1232,19 @@ fn source_binding( use crate::source_navigation::{SymbolEvent, query::Action}; use iced::keyboard::{Key, key::Named}; use widget::text_editor::{Binding, Status}; + // Windows owns Alt+Space for its window menu. Iced's default binding would + // otherwise insert a supplied space payload, even after that menu closes. + // Keep Ctrl+Alt (AltGr), shifted input, and ordinary Space unchanged. + #[cfg(target_os = "windows")] + if matches!(press.status, Status::Focused { .. }) + && press.modifiers == iced::keyboard::Modifiers::ALT + && matches!( + press.key.as_ref(), + Key::Named(Named::Space) | Key::Character(" ") + ) + { + return None; + } if matches!(press.status, Status::Focused { .. }) && !press.modifiers.control() && !press.modifiers.logo() @@ -1248,6 +1271,400 @@ fn source_binding( } Binding::from_key_press(press) } + +#[cfg(all(test, debug_assertions))] +mod source_tests { + use super::*; + use iced::advanced::{ + Layout, Shell, graphics, layout, renderer, text as shaped, widget as core_widget, + }; + use iced::widget::column; + use iced::{Background, Color, Pixels, Point, Rectangle, Size, Transformation, Vector}; + + // Measure real Iced paragraphs/editor text without constructing a window or GPU. + struct FontLayout; + impl renderer::Renderer for FontLayout { + fn start_layer(&mut self, _: Rectangle) {} + fn end_layer(&mut self) {} + fn start_transformation(&mut self, _: Transformation) {} + fn end_transformation(&mut self) {} + fn reset(&mut self, _: Rectangle) {} + fn fill_quad(&mut self, _: renderer::Quad, _: impl Into) {} + fn allocate_image( + &mut self, + handle: &iced::advanced::image::Handle, + callback: impl FnOnce( + Result, + ) + Send + + 'static, + ) { + renderer::Renderer::allocate_image(&mut (), handle, callback); + } + } + impl shaped::Renderer for FontLayout { + type Font = Font; + type Paragraph = graphics::text::Paragraph; + type Editor = graphics::text::Editor; + const ICON_FONT: Font = Font::DEFAULT; + const CHECKMARK_ICON: char = '0'; + const ARROW_DOWN_ICON: char = '0'; + const SCROLL_UP_ICON: char = '0'; + const SCROLL_DOWN_ICON: char = '0'; + const SCROLL_LEFT_ICON: char = '0'; + const SCROLL_RIGHT_ICON: char = '0'; + const ICED_LOGO: char = '0'; + fn default_font(&self) -> Font { + Font::DEFAULT + } + fn default_size(&self) -> Pixels { + Pixels(16.) + } + fn fill_paragraph(&mut self, _: &Self::Paragraph, _: Point, _: Color, _: Rectangle) {} + fn fill_editor(&mut self, _: &Self::Editor, _: Point, _: Color, _: Rectangle) {} + fn fill_text(&mut self, _: shaped::Text, _: Point, _: Color, _: Rectangle) {} + } + + #[derive(Default)] + struct Geometry { + header: Option<(Rectangle, Rectangle, Vector)>, + editor: Option, + } + impl core_widget::Operation for Geometry { + fn traverse(&mut self, visit: &mut dyn FnMut(&mut dyn core_widget::Operation)) { + visit(self); + } + fn container(&mut self, id: Option<&core_widget::Id>, bounds: Rectangle) { + if id == Some(&core_widget::Id::new("test-source-editor")) { + self.editor = Some(bounds); + } + } + fn scrollable( + &mut self, + id: Option<&core_widget::Id>, + bounds: Rectangle, + content: Rectangle, + offset: Vector, + _: &mut dyn core_widget::operation::Scrollable, + ) { + if id == Some(&core_widget::Id::new("source-header")) { + self.header = Some((bounds, content, offset)); + } + } + } + + fn mounted_source<'a>( + content: &'a widget::text_editor::Content, + diagnostics: usize, + find: bool, + window_height: f32, + ) -> View<'a, Message, iced::Theme, FontLayout> { + let mut notices = column![].spacing(5); + for index in 0..diagnostics { + notices = notices.push(button(text(format!( + "救援/assess.arcadia:{}:5 · Warning: verify this participant's engineering allocation", index + 1, + )).size(12)).padding([4, 6]).width(Fill)); + } + let find: View<'_, Message, iced::Theme, FontLayout> = if find { + column![ + text_input("Find literal text", "assess").on_input(|s| Message::SourceNavigation( + crate::source_navigation::Event::Query(s) + )), + text_input("Line", "1").on_input(|s| Message::SourceNavigation( + crate::source_navigation::Event::Line(s) + )), + ] + .spacing(8) + .into() + } else { + Space::new().into() + }; + let header = container( + column![ + text("Textual model").size(24), + text("Edit the current file. Apply text validates the complete included model.") + .size(11), + row![ + button(text("Apply text")), + button(text("Undo text")), + button(text("Model Undo")) + ] + .spacing(8), + text("救援/assess.arcadia · All files applied to the accepted model").size(11), + text("Undo text affects this draft. Model Undo restores accepted files together.") + .size(11), + find, + row![ + button(text("Definition · F12")), + button(text("References · Shift F12")), + button(text("Back")) + ] + .spacing(7), + scrollable(notices).height((diagnostics as f32 * 32.).min(132.)), + ] + .spacing(12), + ) + .padding(18); + let editor = container( + widget::text_editor(content) + .on_action(Message::SourceEdit) + .font(Font::MONOSPACE) + .size(14) + .padding(16) + .height(Fill), + ) + .id("test-source-editor") + .height(Fill) + .width(Fill); + source_layout(header.into(), editor.into(), window_height) + } + + #[test] + fn source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds() { + for (host, window_height) in [ + (Size::new(720., 540.), 700.), + (Size::new(1180., 890.), 1080.), + ] { + let content = widget::text_editor::Content::::with_text( + "// is excluded\r\n// 雨\r\n", + ); + let mut tree = core_widget::Tree::empty(); + let mut baseline = None; + for (diagnostics, find) in [ + (0, false), + (6, false), + (0, false), + (6, true), + (1, true), + (0, false), + ] { + let mut ui = mounted_source(&content, diagnostics, find, window_height); + tree.diff(ui.as_widget()); + let node = ui.as_widget_mut().layout( + &mut tree, + &FontLayout, + &layout::Limits::new(Size::ZERO, host), + ); + let mut geometry = Geometry::default(); + ui.as_widget_mut().operate( + &mut tree, + Layout::new(&node), + &FontLayout, + &mut geometry, + ); + let editor = geometry.editor.unwrap(); + let (header, _, _) = geometry.header.unwrap(); + let slot = node.children()[0].bounds(); + assert_eq!(slot.height, (window_height * 0.42).max(180.)); + assert!( + header.height <= slot.height, + "short content may shrink inside the fixed slot" + ); + assert!( + editor.height >= 240., + "remaining editor must stay usable: {editor:?}" + ); + assert_eq!(editor.y, slot.y + slot.height); + if let Some(expected) = baseline { + assert_eq!(editor, expected, "diagnostics={diagnostics}, find={find}"); + } else { + baseline = Some(editor); + } + } + } + } + + #[test] + fn source_header_remains_scrollable_and_preserves_offset_across_diagnostic_refresh() { + let content = widget::text_editor::Content::::with_text("// 雨\r\n"); + let host = Size::new(720., 540.); + let mut tree = core_widget::Tree::empty(); + let mut saved = None; + for diagnostics in [6, 7] { + let mut ui = mounted_source(&content, diagnostics, true, 700.); + tree.diff(ui.as_widget()); + let node = ui.as_widget_mut().layout( + &mut tree, + &FontLayout, + &layout::Limits::new(Size::ZERO, host), + ); + let mut geometry = Geometry::default(); + ui.as_widget_mut() + .operate(&mut tree, Layout::new(&node), &FontLayout, &mut geometry); + let (bounds, contents, _) = geometry.header.unwrap(); + assert!( + contents.height > bounds.height, + "fixture must actually overflow" + ); + if saved.is_none() { + let mut messages = Vec::new(); + let mut shell = Shell::new(&mut messages); + ui.as_widget_mut().update( + &mut tree, + &iced::Event::Mouse(iced::mouse::Event::WheelScrolled { + delta: iced::mouse::ScrollDelta::Pixels { x: 0., y: -45. }, + }), + Layout::new(&node), + iced::mouse::Cursor::Available(Point::new(bounds.x + 8., bounds.y + 8.)), + &FontLayout, + &mut iced::advanced::clipboard::Null, + &mut shell, + &Rectangle::with_size(host), + ); + assert!(shell.is_event_captured()); + } + let mut geometry = Geometry::default(); + ui.as_widget_mut() + .operate(&mut tree, Layout::new(&node), &FontLayout, &mut geometry); + let offset = geometry.header.unwrap().2; + assert!(offset.y > 0., "the actual mounted Scrollable must move"); + if let Some(before) = saved { + assert_eq!(offset, before); + } else { + saved = Some(offset); + } + } + } + + #[cfg(target_os = "windows")] + #[test] + fn source_editor_windows_menu_payload_is_inert_but_space_and_altgr_still_edit() { + use core_widget::operation::Focusable; + use iced::keyboard::{ + self, Key, Modifiers, + key::{Code, Named, Physical}, + }; + use widget::text_editor::{Binding, Content, KeyPress, State, Status}; + let baseline = "// is excluded\r\n// 雨\r\n"; + let context = crate::source_navigation::SymbolContext { + session: Id::new_v4(), + path: "救援/assess.arcadia".into(), + }; + for (key, physical_key, modifiers, payload, inserted) in [ + ( + Key::Named(Named::Space), + Physical::Code(Code::Space), + Modifiers::ALT, + " ", + false, + ), + ( + Key::Character(" ".into()), + Physical::Code(Code::Space), + Modifiers::ALT, + " ", + false, + ), + ( + Key::Named(Named::Space), + Physical::Code(Code::Space), + Modifiers::empty(), + " ", + true, + ), + ( + Key::Named(Named::Space), + Physical::Code(Code::Space), + Modifiers::CTRL | Modifiers::ALT, + " ", + true, + ), + ( + Key::Character("e".into()), + Physical::Code(Code::KeyE), + Modifiers::CTRL | Modifiers::ALT, + "€", + true, + ), + ( + Key::Named(Named::Space), + Physical::Code(Code::Space), + Modifiers::ALT | Modifiers::SHIFT, + " ", + true, + ), + ] { + let mut content = Content::::with_text(baseline); + content.move_to(widget::text_editor::Cursor { + position: widget::text_editor::Position { line: 0, column: 5 }, + selection: None, + }); + let press = KeyPress { + key: key.clone(), + modified_key: key.clone(), + physical_key, + modifiers, + text: Some(payload.into()), + status: Status::Focused { is_hovered: false }, + }; + assert!( + matches!( + Binding::::from_key_press(press), + Some(Binding::Insert(_)) + ), + "the supplied event must expose the default insertion path" + ); + let mut messages = Vec::new(); + { + let mut editor: View<'_, Message, iced::Theme, FontLayout> = + widget::text_editor(&content) + .on_action(Message::SourceEdit) + .font(Font::MONOSPACE) + .size(14) + .padding(16) + .height(Fill) + .key_binding(|press| source_binding(press, &context)) + .into(); + let mut tree = core_widget::Tree::new(editor.as_widget()); + let size = Size::new(600., 240.); + let node = editor.as_widget_mut().layout( + &mut tree, + &FontLayout, + &layout::Limits::new(Size::ZERO, size), + ); + tree.state + .downcast_mut::>() + .focus(); + let event = iced::Event::Keyboard(keyboard::Event::KeyPressed { + key: key.clone(), + modified_key: key, + physical_key, + location: keyboard::Location::Standard, + modifiers, + text: Some(payload.into()), + repeat: false, + }); + let mut shell = Shell::new(&mut messages); + editor.as_widget_mut().update( + &mut tree, + &event, + Layout::new(&node), + iced::mouse::Cursor::Unavailable, + &FontLayout, + &mut iced::advanced::clipboard::Null, + &mut shell, + &Rectangle::with_size(size), + ); + } + assert_eq!( + messages.len(), + usize::from(inserted), + "modifiers={modifiers:?}" + ); + for message in messages { + let Message::SourceEdit(action) = message else { + panic!("unexpected navigation action"); + }; + content.perform(action); + } + let expected = if inserted { + format!("// is{payload} excluded\r\n// 雨\r\n") + } else { + baseline.into() + }; + assert_eq!(content.text(), expected); + } + } +} fn checks(app: &App) -> View<'_, Message> { let issues = &app.model_issues; let mut out = column![heading( diff --git a/harness/STATE.md b/harness/STATE.md index bbe32312..164499fd 100644 --- a/harness/STATE.md +++ b/harness/STATE.md @@ -51,6 +51,9 @@ Clippy; a matching GUI build (`DF7126B8` prefix) passed. Its [initial native trial](release-text-navigation-native-initial-20260911.md), preserved at `2dedde2`, verified navigation and exact saved-source/model equality but found four interaction defects. Corrected native and packaged acceptance remain required. +The [four-file correction](release-text-navigation-native-corrections-20260911.md) +passed 188 focused tests and strict Clippy, with exact input readback and +independent review; its matching full-suite/build/native results remain separate. The [integrated evaluation](release-text-navigation-integrated-20260911.md) links exact input archives, earlier full-test scope and independent findings. The published contextual preview remains unchanged. diff --git a/harness/experiments/text-navigation-native-20260911/corrections/.gitattributes b/harness/experiments/text-navigation-native-20260911/corrections/.gitattributes new file mode 100644 index 00000000..fa1385d9 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/.gitattributes @@ -0,0 +1 @@ +* -text diff --git a/harness/experiments/text-navigation-native-20260911/corrections/README.md b/harness/experiments/text-navigation-native-20260911/corrections/README.md new file mode 100644 index 00000000..4512e8c5 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/README.md @@ -0,0 +1,21 @@ +# Navigation native corrections — private gate evidence + +Final local gates passed on inputs4: focused5 executed **188 passed, 0 failed, 1 ignored**, 562 filtered, in 41.73s after 1m35s compilation. Strict all-target Clippy5 with `-D warnings` passed at 19:40:12 UTC. Scoped rustfmt check and diff whitespace check passed. All **499 files / 9,470,838 bytes** matched after the gates; every source ZIP member also matched its manifest and the current workspace. Source ZIP SHA256: `7ff9e5703e33bd72e5c2186dd61125e965b82b8dfbf085961d514b005e716798`. `final-gate-result.json` records exact four-file hashes and terminal receipts. `test-binary.json` pins the executed test binary without copying it into this archive. + +These are uncommitted changes above `f4e426ae2a6971395e1ca7e6f094b0c20056cf93`. The root owns the subsequent commit, full desktop suite, matching GUI and native verification. No corrected native or release acceptance is implied here. Windows compilation used `.local/toolchain/env.ps1`, stable GNU/LLVM, `.local/target-gnullvm`, `CARGO_BUILD_JOBS=1`, and PowerShell 7.6.5 after the preserved initial launcher mistake. + +Codex-9e8r6t /root/behavior_audit. Bounded four-file correction after the root's preserved DF7126B8 native trial. No GUI was launched by this worker. Production scope: views.rs, app.rs, app/source_symbols.rs and its tests.rs. + +The original byte copies predate these edits. Inputs1 captures the first formatted candidate; gate logs/status record actual execution separately. Fixed-height outer header preserves its existing scrollable content; successful no-notice Back retains a closed panel; Find-only captured Escape uses the existing single bridge; Find Close and ordinary dismissing Escape request current selection through the existing guarded viewport/focus ticket. Modal dismissal does not request editor focus. + +The Windows-only Alt+Space guard blocks exactly Alt with Named Space or the literal space key. It preserves ordinary Space, shifted input, and Ctrl+Alt/AltGr. Root observed deferred space insertion after the OS menu closed and the next neutral pointer click. This worker's mounted TextEditor test supplies an explicit text-bearing event and does not instrument or claim the actual Windows OS payload. Corrected GUI native acceptance remains required. + +Mounted layout tests exercise the production source_layout function with real paragraph shaping, TextEditor, and Scrollable state, dynamic representative header content, minimum/wide host limits, and actual wheel input. They do not render the whole application view. Focus tests execute the real App subscription and emitted guarded widget operation across a mounted focus tree, removing the originating Find input and rejecting later foreign focus/raw input. Whole Project, raw SourceBundle, selection and history assertions remain in affected App tests. + +The first nested PowerShell 5 wrapper stopped at ordinary Cargo stderr; focused1-wrapper-failure.txt records that launcher failure. The corrected PowerShell 7 launch focused2 reached compilation and reported three E0659 macro-import errors in the new view tests. While it ran, independent review confirmed that unscoped Find Close could replay into a newer file/opening. At root request the owned rustc was stopped (focused2-stop-request.json); the terminal log preserves both the real diagnostics and final 0xffffffff/exit101. No test or Clippy pass is claimed for inputs1, whose complete 499-file readback nevertheless matched. + +Inputs2 adds the explicit macro import and scoped Find Close: session/path plus a token regenerated on every Find Open. The check runs before any source interaction invalidation. Only a valid envelope is translated to the existing Close handler; bare legacy Close is refused. New stale Close tests cover actual reset, same-session file switch, and Close/reopen at the same path, retaining the newer query, request, reveal, raw text, complete accepted model and history. A current envelope still closes and restores focus through the guarded ticket. Other legacy navigation events are unchanged. + +Focused3 then terminated normally with two related compile diagnostics (E0277/E0599): the renderer-generic source_layout helper needed Iced's text::Renderer bound for Scrollable. No tests or Clippy ran. The complete inputs2 readback matched. Inputs3 changes only that trait bound from the independently reviewed inputs2 source; the next run is focused4/Clippy4. + +Focused4 compiled in 6m58s and executed 189 selected tests: 187 passed, 1 failed, 1 ignored (46.57s). All new App guards/focus tests, mounted Windows key-payload controls, and real header scrolling passed. The sole failure was the anticipated evaluator mistake: the short inner Scrollable measured 243.70001px while the assertion demanded the 294px reserved outer slot. Production correctly allows that child to shrink. Inputs4 changes only this test to measure the actual first child node (the outer Container) and its boundary with the editor; the existing exact editor-rectangle equality and real overflow/offset regression remain. No production layout adjustment was made to satisfy the test. Inputs3 complete readback matched; Clippy4 did not run after test failure. diff --git a/harness/experiments/text-navigation-native-20260911/corrections/capture.py b/harness/experiments/text-navigation-native-20260911/corrections/capture.py new file mode 100644 index 00000000..3db5958e --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/capture.py @@ -0,0 +1,63 @@ +"""Preserve exact current source bytes before a gate and read them back after it.""" +import datetime +import hashlib +import json +import pathlib +import re +import subprocess +import sys +import zipfile + +root = pathlib.Path(__file__).resolve().parents[2] +evidence = pathlib.Path(__file__).resolve().parent +mode, label = sys.argv[1:] +assert re.fullmatch(r"inputs[0-9]+", label) + +def paths(): + result = subprocess.run(["git", "ls-files", "-z", "--cached", "--others", "--exclude-standard", "--", + "crates", ".cargo", "Cargo.toml", "Cargo.lock", "docs", "examples", "harness/fixtures"], + cwd=root, check=True, capture_output=True) + return sorted(set(p.decode("utf-8") for p in result.stdout.split(b"\0") if p)) + +def data(path): + target = (root / path).resolve() + assert target.is_relative_to(root) and target.is_file(), path + return target.read_bytes() + +def sha(raw): + return hashlib.sha256(raw).hexdigest() + +def write(path, value): + with path.open("x", encoding="utf-8", newline="\n") as out: + json.dump(value, out, indent=2, ensure_ascii=False) + out.write("\n") + +if mode == "capture": + entries = [] + archive = evidence / (label + ".zip") + with zipfile.ZipFile(archive, "x", zipfile.ZIP_DEFLATED) as out: + for path in paths(): + raw = data(path) + out.writestr(path, raw) + entries.append({"path": path, "bytes": len(raw), "sha256": sha(raw)}) + result = {"atUtc": datetime.datetime.now(datetime.timezone.utc).isoformat(), + "head": subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=root).decode().strip(), + "branch": subprocess.check_output(["git", "branch", "--show-current"], cwd=root).decode().strip(), + "scope": "Exact Windows gate source inputs; no compiler or native result implied.", + "archiveSha256": sha(archive.read_bytes()), "files": entries} + write(evidence / (label + ".json"), result) + print(json.dumps({"files": len(entries), "bytes": sum(e["bytes"] for e in entries), "archiveSha256": result["archiveSha256"]})) +elif mode == "verify": + before = json.loads((evidence / (label + ".json")).read_text(encoding="utf-8")) + current = paths() + expected = [e["path"] for e in before["files"]] + changed = [e["path"] for e in before["files"] if sha(data(e["path"])) != e["sha256"]] + result = {"atUtc": datetime.datetime.now(datetime.timezone.utc).isoformat(), + "changed": changed, "added": sorted(set(current) - set(expected)), + "removed": sorted(set(expected) - set(current))} + result["passed"] = not any(result[k] for k in ("changed", "added", "removed")) + write(evidence / (label + "-readback.json"), result) + print(json.dumps(result)) + sys.exit(0 if result["passed"] else 1) +else: + raise ValueError(mode) diff --git a/harness/experiments/text-navigation-native-20260911/corrections/clippy5-status.json b/harness/experiments/text-navigation-native-20260911/corrections/clippy5-status.json new file mode 100644 index 00000000..c5fc92a2 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/clippy5-status.json @@ -0,0 +1,17 @@ +{ + "started": "2026-09-11T19:38:11.8128387Z", + "finished": "2026-09-11T19:40:12.0873967Z", + "exitCode": 0, + "args": [ + "clippy", + "--locked", + "--offline", + "-p", + "oa-desktop", + "--all-targets", + "--", + "-D", + "warnings" + ], + "buildJobs": 1 +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/clippy5.log b/harness/experiments/text-navigation-native-20260911/corrections/clippy5.log new file mode 100644 index 00000000..d512c31f --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/clippy5.log @@ -0,0 +1,2 @@ + Checking oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop) + Finished `dev` profile [unoptimized] target(s) in 1m 59s diff --git a/harness/experiments/text-navigation-native-20260911/corrections/corrections.patch b/harness/experiments/text-navigation-native-20260911/corrections/corrections.patch new file mode 100644 index 00000000..a5f94e5f --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/corrections.patch @@ -0,0 +1,927 @@ +diff --git a/crates/oa-desktop/src/app.rs b/crates/oa-desktop/src/app.rs +index 7e5eee2..35359a8 100644 +--- a/crates/oa-desktop/src/app.rs ++++ b/crates/oa-desktop/src/app.rs +@@ -424,6 +424,7 @@ pub enum Message { + SourceSymbolsReady(crate::source_navigation::Completion), + SourceForSelection, + SourceNavigation(crate::source_navigation::Event), ++ SourceFindClose(crate::source_navigation::SymbolContext, Id), + Save(bool), + SavePath(Option), + Saved(Result, SaveFailure>), +@@ -497,6 +498,7 @@ pub struct App { + pub source_jump: Option, + source_select_line: bool, + pub source_navigation: crate::source_navigation::State, ++ source_find_instance: Id, + pub source_symbols: crate::source_navigation::SymbolState, + pub model_issues: Vec, + pub migration: Option, +@@ -603,6 +605,7 @@ impl App { + source_jump: None, + source_select_line: false, + source_navigation: crate::source_navigation::State::default(), ++ source_find_instance: Id::new_v4(), + source_symbols: crate::source_navigation::SymbolState::default(), + model_issues, + migration: None, +@@ -1058,7 +1061,7 @@ impl App { + self.behavior.creation.has_pending() + || self.behavior.source_active() + || (self.page == Page::Text +- && self.source_symbols.open ++ && (self.source_symbols.open || self.source_navigation.open) + && self.architecture.is_none()), + ) + .map(|()| Message::Escape), +@@ -1106,6 +1109,23 @@ impl App { + ]) + } + pub fn update(&mut self, message: Message) -> Task { ++ let message = match message { ++ Message::SourceFindClose(context, instance) => { ++ if context != self.source_symbol_context() ++ || instance != self.source_find_instance ++ || !self.source_navigation.open ++ || !self.source_navigation_available() ++ { ++ return Task::none(); ++ } ++ // Only the checked envelope may enter the legacy Close handler. ++ Message::SourceNavigation(crate::source_navigation::Event::Close) ++ } ++ Message::SourceNavigation(crate::source_navigation::Event::Close) => { ++ return Task::none(); ++ } ++ message => message, ++ }; + if let Message::SourceSymbols(context, _) = &message + && (context.session != self.source_workspace.session() + || context.path != self.source_workspace.active) +@@ -1838,6 +1858,8 @@ impl App { + return self.update(Message::Add(child)); + } + Message::Escape => { ++ let restore_source_focus = self.source_navigation_available() ++ && (self.source_navigation.open || self.source_symbols.open); + if self.behavior.source_back() { + self.status = + "Returned to the unchanged parent form; no source was created.".into(); +@@ -1857,6 +1879,9 @@ impl App { + self.source_symbols.open = false; + self.source_symbols.results = None; + self.source_symbols.notice = None; ++ if restore_source_focus { ++ self.restore_source_editor_focus(); ++ } + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + self.selected_bend = None; + } +@@ -2971,6 +2996,7 @@ impl App { + } + Message::SourceRelated(location) => self.jump_to_source(location), + Message::SourceViewport(ticket) => return self.source_viewport(ticket), ++ Message::SourceFindClose(..) => return Task::none(), // update checks and unwraps it + Message::SourceSymbols(_, event) => return self.source_symbol_event(event), + Message::SourceSymbolsReady(completion) => { + return self.source_symbols_ready(completion); +@@ -3019,6 +3045,7 @@ impl App { + return Task::none(); + } + self.page = Page::Text; ++ self.source_find_instance = Id::new_v4(); + self.source_navigation.open = true; + self.source_navigation.refresh(&self.source_editor.text()); + return iced::widget::operation::focus(if go_to_line { +@@ -3027,7 +3054,13 @@ impl App { + "source-find" + }); + } +- Event::Close => self.source_navigation.open = false, ++ Event::Close => { ++ let was_open = self.source_navigation.open; ++ self.source_navigation.open = false; ++ if was_open { ++ self.restore_source_editor_focus(); ++ } ++ } + Event::Query(query) => { + self.source_navigation.query = query; + self.source_navigation.refresh(&self.source_editor.text()); +diff --git a/crates/oa-desktop/src/app/source_symbols.rs b/crates/oa-desktop/src/app/source_symbols.rs +index 9516a2b..20d0ce5 100644 +--- a/crates/oa-desktop/src/app/source_symbols.rs ++++ b/crates/oa-desktop/src/app/source_symbols.rs +@@ -41,6 +41,10 @@ impl App { + pub fn source_symbol_message(&self, event: nav::SymbolEvent) -> Message { + Message::SourceSymbols(self.source_symbol_context(), event) + } ++ ++ pub fn source_find_close_message(&self) -> Message { ++ Message::SourceFindClose(self.source_symbol_context(), self.source_find_instance) ++ } + pub fn source_key(&self) -> query::SnapshotKey { + query::SnapshotKey { + workspace: self.source_workspace.session(), +@@ -134,6 +138,15 @@ impl App { + }); + } + ++ pub(super) fn restore_source_editor_focus(&mut self) { ++ let cursor = self.source_editor.cursor(); ++ if self.source_navigation_available() ++ && nav::exact_cursor(self.source_workspace.text(), cursor) ++ { ++ self.queue_source_reveal(cursor, false); ++ } ++ } ++ + pub(super) fn source_viewport(&mut self, ticket: Option) -> Task { + let Some(reveal) = &self.source_symbols.reveal else { + return Task::none(); +@@ -180,8 +193,10 @@ impl App { + self.source_symbols.notice = None; + } + nav::SymbolEvent::Back => { +- self.source_symbols.open = true; + self.source_symbol_back(); ++ // A successful Back needs no empty results panel. Retain an ++ // already open panel, or reveal an actionable return notice. ++ self.source_symbols.open |= self.source_symbols.notice.is_some(); + } + nav::SymbolEvent::Choose { + stamp, +diff --git a/crates/oa-desktop/src/app/source_symbols/tests.rs b/crates/oa-desktop/src/app/source_symbols/tests.rs +index 2c3f342..6168e73 100644 +--- a/crates/oa-desktop/src/app/source_symbols/tests.rs ++++ b/crates/oa-desktop/src/app/source_symbols/tests.rs +@@ -461,6 +461,10 @@ fn escape_dismisses_modal_before_underlying_source_results() { + app.hosted.visible = true; + send(&mut app, Message::Escape); + assert!(!app.hosted.visible); ++ assert!( ++ app.source_reveal_ticket().is_none(), ++ "modal dismissal must not focus the editor" ++ ); + assert!(app.source_symbols.open); + assert!(Arc::ptr_eq( + app.source_symbols.results.as_ref().unwrap(), +@@ -473,6 +477,303 @@ fn escape_dismisses_modal_before_underlying_source_results() { + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + } + ++#[test] ++fn closed_results_stay_closed_on_exact_back_and_reopen_only_for_a_return_notice() { ++ for changed in [false, true] { ++ let mut app = fixture(); ++ let accepted = app.document.snapshot(); ++ let origin = app.source_editor.cursor(); ++ finish(&mut app, query::Action::Definition); ++ reveal(&mut app); ++ symbol(&mut app, nav::SymbolEvent::Close); ++ assert!(!app.source_symbols.open && app.source_symbols.results.is_none()); ++ if changed { ++ // Use the workspace edit API to give the origin a new generation. ++ show(&mut app, USES); ++ let text = app.source_workspace.text().to_owned(); ++ send( ++ &mut app, ++ Message::SourceEdit(text_editor::Action::SelectAll), ++ ); ++ send( ++ &mut app, ++ Message::SourceEdit(text_editor::Action::Edit(text_editor::Edit::Paste( ++ Arc::new(format!("{text}// current cursor\r\n")), ++ ))), ++ ); ++ show(&mut app, DEFINITIONS); ++ } ++ let raw = app.source_workspace.bundle(); ++ symbol(&mut app, nav::SymbolEvent::Back); ++ assert_eq!(app.source_workspace.active, USES); ++ assert_eq!(app.source_symbols.open, changed); ++ assert_eq!(app.source_symbols.notice.is_some(), changed); ++ reveal(&mut app); ++ if !changed { ++ assert_eq!(app.source_editor.cursor(), origin); ++ } ++ assert_eq!(app.source_workspace.bundle(), raw); ++ assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); ++ assert!(!app.document.can_undo() && !app.document.can_redo()); ++ } ++ let mut app = fixture(); ++ symbol(&mut app, nav::SymbolEvent::Back); ++ assert!(app.source_symbols.open && app.source_symbols.notice.is_some()); ++} ++ ++#[test] ++fn find_only_captured_escape_closes_once_and_preserves_raw_query_and_selection() { ++ let mut app = fixture(); ++ let accepted = app.document.snapshot(); ++ let raw = app.source_workspace.bundle(); ++ let cursor = app.source_editor.cursor(); ++ app.source_navigation.open = true; ++ app.source_navigation.query = "送水 🚀".into(); ++ assert!(!app.source_symbols.open); ++ let mut messages = captured_input_subscription_messages(&app); ++ assert_eq!(messages.len(), 1); ++ assert!(matches!(messages[0], Message::Escape)); ++ send(&mut app, messages.remove(0)); ++ assert!(!app.source_navigation.open && !app.source_symbols.open); ++ assert_eq!(app.source_navigation.query, "送水 🚀"); ++ assert!(app.source_reveal_ticket().is_some()); ++ reveal(&mut app); ++ assert_eq!(app.source_editor.cursor(), cursor); ++ assert!(captured_input_subscription_messages(&app).is_empty()); ++ assert_eq!(app.source_workspace.bundle(), raw); ++ assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); ++ assert!(!app.document.can_undo() && !app.document.can_redo()); ++} ++ ++#[test] ++fn old_find_close_cannot_cancel_a_new_file_session_or_reopened_find_intent() { ++ for replacement in 0..3 { ++ let mut app = fixture(); ++ if replacement == 0 { ++ show(&mut app, "project.arcadia"); ++ } ++ send(&mut app, Message::SourceNavigation(nav::Event::Open(false))); ++ let old_context = app.source_symbol_context(); ++ let old_instance = app.source_find_instance; ++ let old_close = app.source_find_close_message(); ++ match replacement { ++ 0 => { ++ let project = app.project().clone(); ++ app.reset(project, None); ++ app.page = Page::Text; ++ assert_eq!(app.source_workspace.active, old_context.path); ++ assert_ne!(app.source_workspace.session(), old_context.session); ++ } ++ 1 => { ++ show(&mut app, DEFINITIONS); ++ assert_eq!(app.source_workspace.session(), old_context.session); ++ assert_ne!(app.source_workspace.active, old_context.path); ++ } ++ 2 => { ++ send(&mut app, old_close.clone()); ++ assert!(!app.source_navigation.open); ++ assert!(app.source_reveal_ticket().is_some()); ++ assert_eq!(app.source_symbol_context(), old_context); ++ } ++ _ => unreachable!(), ++ } ++ send(&mut app, Message::SourceNavigation(nav::Event::Open(false))); ++ assert_ne!(app.source_find_instance, old_instance); ++ send( ++ &mut app, ++ Message::SourceNavigation(nav::Event::Query("Current Find 雨".into())), ++ ); ++ let text = app.source_workspace.text(); ++ let (offset, len) = match replacement { ++ 0 => (text.find("project model").unwrap() + "project ".len(), 5), ++ 1 => ( ++ text.find("oa_activity pump").unwrap() + "oa_activity ".len(), ++ 4, ++ ), ++ _ => (text.find("source @pump").unwrap() + "source @".len(), 4), ++ }; ++ let cursor = selection(text, offset, offset + len, true); ++ app.source_editor.move_to(cursor); ++ let request = begin(&mut app, query::Action::References); ++ let ready = completion(&app, request); ++ app.queue_source_reveal(cursor, false); ++ let find_instance = app.source_find_instance; ++ let mut stale = vec![old_close, Message::SourceNavigation(nav::Event::Close)]; ++ if replacement != 2 { ++ // Independently require the session/path guard, even with a current ++ // invocation token. A token check alone is not the location contract. ++ stale.push(Message::SourceFindClose(old_context, find_instance)); ++ } ++ assert_stale_envelopes_preserve_current(&mut app, &stale); ++ assert!(app.source_navigation.open); ++ assert_eq!(app.source_navigation.query, "Current Find 雨"); ++ assert_eq!(app.source_find_instance, find_instance); ++ send(&mut app, Message::SourceSymbolsReady(ready)); ++ assert_stale_envelopes_preserve_current(&mut app, &stale); ++ assert!(app.source_navigation.open); ++ assert_eq!(app.source_navigation.query, "Current Find 雨"); ++ let current_close = app.source_find_close_message(); ++ send(&mut app, current_close); ++ assert!(!app.source_navigation.open); ++ assert_eq!(app.source_navigation.query, "Current Find 雨"); ++ assert!(app.source_reveal_ticket().is_some()); ++ reveal(&mut app); ++ assert_eq!(app.source_editor.cursor(), cursor); ++ } ++} ++ ++#[tokio::test] ++async fn find_close_releases_removed_input_and_guarded_focus_respects_later_input() { ++ use iced::advanced::{Layout, layout, widget}; ++ use iced::futures::StreamExt; ++ use iced::widget::{column, text_input}; ++ ++ #[derive(Default)] ++ struct Focus(Vec<(Option, bool)>); ++ impl widget::Operation for Focus { ++ fn traverse(&mut self, visit: &mut dyn FnMut(&mut dyn widget::Operation)) { ++ visit(self); ++ } ++ fn focusable( ++ &mut self, ++ id: Option<&widget::Id>, ++ _: iced::Rectangle, ++ state: &mut dyn widget::operation::Focusable, ++ ) { ++ self.0.push((id.cloned(), state.is_focused())); ++ } ++ } ++ fn view(app: &App, later: bool) -> iced::Element<'static, Message, iced::Theme, ()> { ++ let mut content = column![ ++ text_input("Editor", "unchanged source") ++ .id(app.source_editor_id()) ++ .on_input(|s| Message::SourceNavigation(nav::Event::Query(s))) ++ ]; ++ if app.source_navigation.open { ++ content = content.push( ++ text_input("Find", "送水") ++ .id("source-find") ++ .on_input(|s| Message::SourceNavigation(nav::Event::Query(s))), ++ ); ++ } ++ if later { ++ content = content.push( ++ text_input("Other", "preserve focus") ++ .id("later-input") ++ .on_input(|s| Message::SourceNavigation(nav::Event::Query(s))), ++ ); ++ } ++ content.into() ++ } ++ fn run( ++ ui: &mut iced::Element<'_, Message, iced::Theme, ()>, ++ tree: &mut widget::Tree, ++ node: &layout::Node, ++ mut op: Box, ++ ) { ++ loop { ++ ui.as_widget_mut() ++ .operate(tree, Layout::new(node), &(), op.as_mut()); ++ match op.finish() { ++ widget::operation::Outcome::Chain(next) => op = next, ++ widget::operation::Outcome::None => break, ++ widget::operation::Outcome::Some(()) => panic!("focus must not produce a message"), ++ } ++ } ++ } ++ for escape in [false, true] { ++ for later in 0..3 { ++ let mut app = fixture(); ++ app.source_navigation.open = true; ++ let accepted = app.document.snapshot(); ++ let raw = app.source_workspace.bundle(); ++ let cursor = app.source_editor.cursor(); ++ let mut ui = view(&app, false); ++ let mut tree = widget::Tree::new(ui.as_widget()); ++ let limits = layout::Limits::new(iced::Size::ZERO, iced::Size::new(500., 250.)); ++ let node = ui.as_widget_mut().layout(&mut tree, &(), &limits); ++ run( ++ &mut ui, ++ &mut tree, ++ &node, ++ Box::new(widget::operation::focusable::focus(widget::Id::new( ++ "source-find", ++ ))), ++ ); ++ let mut focus = Focus::default(); ++ ui.as_widget_mut() ++ .operate(&mut tree, Layout::new(&node), &(), &mut focus); ++ assert!( ++ focus ++ .0 ++ .contains(&(Some(widget::Id::new("source-find")), true)) ++ ); ++ ++ let close = if escape { ++ Message::Escape ++ } else { ++ app.source_find_close_message() ++ }; ++ send(&mut app, close); ++ assert!(!app.source_navigation.open); ++ let ticket = app ++ .source_reveal_ticket() ++ .expect("closing an open Find queues focus"); ++ ui = view(&app, later != 0); ++ tree.diff(ui.as_widget()); ++ let node = ui.as_widget_mut().layout(&mut tree, &(), &limits); ++ let task = app.update(Message::SourceViewport(Some(ticket))); ++ if later != 0 { ++ run( ++ &mut ui, ++ &mut tree, ++ &node, ++ Box::new(widget::operation::focusable::focus(widget::Id::new( ++ "later-input", ++ ))), ++ ); ++ } ++ if later == 2 { ++ app.source_symbols ++ .raw_interaction ++ .fetch_add(1, Ordering::SeqCst); ++ } ++ let mut actions = ++ iced_runtime::task::into_stream(task).expect("guarded widget operation"); ++ while let Some(action) = actions.next().await { ++ let iced_runtime::Action::Widget(op) = action else { ++ panic!("focus-only task"); ++ }; ++ run(&mut ui, &mut tree, &node, op); ++ } ++ let mut focus = Focus::default(); ++ ui.as_widget_mut() ++ .operate(&mut tree, Layout::new(&node), &(), &mut focus); ++ assert!( ++ !focus ++ .0 ++ .iter() ++ .any(|(id, _)| id.as_ref() == Some(&widget::Id::new("source-find"))) ++ ); ++ assert!( ++ focus ++ .0 ++ .contains(&(Some(app.source_editor_id()), later == 0)) ++ ); ++ if later != 0 { ++ assert!( ++ focus ++ .0 ++ .contains(&(Some(widget::Id::new("later-input")), true)) ++ ); ++ } ++ assert_eq!(app.source_editor.cursor(), cursor); ++ assert_eq!(app.source_workspace.bundle(), raw); ++ assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); ++ } ++ } ++} ++ + /// Feed the real App subscription recipes the status produced by a mounted + /// TextInput. Poll only immediately available output: no timer wait, worker, + /// file dialog or App task is executed by this helper. +diff --git a/crates/oa-desktop/src/views.rs b/crates/oa-desktop/src/views.rs +index 1a74bc6..e91892e 100644 +--- a/crates/oa-desktop/src/views.rs ++++ b/crates/oa-desktop/src/views.rs +@@ -1020,7 +1020,7 @@ fn source(app: &App) -> View<'_, Message> { + ), + action("Next", Message::SourceNavigation(SourceEvent::Next(false))), + label(app.source_navigation.label()), +- action("Close", Message::SourceNavigation(SourceEvent::Close)), ++ action("Close", app.source_find_close_message()), + ] + .spacing(6) + .align_y(iced::Center), +@@ -1208,8 +1208,18 @@ fn source(app: &App) -> View<'_, Message> { + } else { + container(editor).width(Fill).height(Fill).into() + }; ++ source_layout(header.into(), workspace, app.window_size.height) ++} ++ ++fn source_layout<'a, Renderer: iced::advanced::text::Renderer + 'a>( ++ header: View<'a, Message, iced::Theme, Renderer>, ++ workspace: View<'a, Message, iced::Theme, Renderer>, ++ window_height: f32, ++) -> View<'a, Message, iced::Theme, Renderer> { ++ // Lint clears and repopulates diagnostics asynchronously. Reserve the same ++ // outer slot so a pointer aimed at the editor cannot land in the header. + column![ +- container(scrollable(header)).max_height((app.window_size.height * 0.42).max(180.)), ++ container(scrollable(header).id("source-header")).height((window_height * 0.42).max(180.)), + workspace, + ] + .height(Fill) +@@ -1222,6 +1232,19 @@ fn source_binding( + use crate::source_navigation::{SymbolEvent, query::Action}; + use iced::keyboard::{Key, key::Named}; + use widget::text_editor::{Binding, Status}; ++ // Windows owns Alt+Space for its window menu. Iced's default binding would ++ // otherwise insert a supplied space payload, even after that menu closes. ++ // Keep Ctrl+Alt (AltGr), shifted input, and ordinary Space unchanged. ++ #[cfg(target_os = "windows")] ++ if matches!(press.status, Status::Focused { .. }) ++ && press.modifiers == iced::keyboard::Modifiers::ALT ++ && matches!( ++ press.key.as_ref(), ++ Key::Named(Named::Space) | Key::Character(" ") ++ ) ++ { ++ return None; ++ } + if matches!(press.status, Status::Focused { .. }) + && !press.modifiers.control() + && !press.modifiers.logo() +@@ -1248,6 +1271,400 @@ fn source_binding( + } + Binding::from_key_press(press) + } ++ ++#[cfg(all(test, debug_assertions))] ++mod source_tests { ++ use super::*; ++ use iced::advanced::{ ++ Layout, Shell, graphics, layout, renderer, text as shaped, widget as core_widget, ++ }; ++ use iced::widget::column; ++ use iced::{Background, Color, Pixels, Point, Rectangle, Size, Transformation, Vector}; ++ ++ // Measure real Iced paragraphs/editor text without constructing a window or GPU. ++ struct FontLayout; ++ impl renderer::Renderer for FontLayout { ++ fn start_layer(&mut self, _: Rectangle) {} ++ fn end_layer(&mut self) {} ++ fn start_transformation(&mut self, _: Transformation) {} ++ fn end_transformation(&mut self) {} ++ fn reset(&mut self, _: Rectangle) {} ++ fn fill_quad(&mut self, _: renderer::Quad, _: impl Into) {} ++ fn allocate_image( ++ &mut self, ++ handle: &iced::advanced::image::Handle, ++ callback: impl FnOnce( ++ Result, ++ ) + Send ++ + 'static, ++ ) { ++ renderer::Renderer::allocate_image(&mut (), handle, callback); ++ } ++ } ++ impl shaped::Renderer for FontLayout { ++ type Font = Font; ++ type Paragraph = graphics::text::Paragraph; ++ type Editor = graphics::text::Editor; ++ const ICON_FONT: Font = Font::DEFAULT; ++ const CHECKMARK_ICON: char = '0'; ++ const ARROW_DOWN_ICON: char = '0'; ++ const SCROLL_UP_ICON: char = '0'; ++ const SCROLL_DOWN_ICON: char = '0'; ++ const SCROLL_LEFT_ICON: char = '0'; ++ const SCROLL_RIGHT_ICON: char = '0'; ++ const ICED_LOGO: char = '0'; ++ fn default_font(&self) -> Font { ++ Font::DEFAULT ++ } ++ fn default_size(&self) -> Pixels { ++ Pixels(16.) ++ } ++ fn fill_paragraph(&mut self, _: &Self::Paragraph, _: Point, _: Color, _: Rectangle) {} ++ fn fill_editor(&mut self, _: &Self::Editor, _: Point, _: Color, _: Rectangle) {} ++ fn fill_text(&mut self, _: shaped::Text, _: Point, _: Color, _: Rectangle) {} ++ } ++ ++ #[derive(Default)] ++ struct Geometry { ++ header: Option<(Rectangle, Rectangle, Vector)>, ++ editor: Option, ++ } ++ impl core_widget::Operation for Geometry { ++ fn traverse(&mut self, visit: &mut dyn FnMut(&mut dyn core_widget::Operation)) { ++ visit(self); ++ } ++ fn container(&mut self, id: Option<&core_widget::Id>, bounds: Rectangle) { ++ if id == Some(&core_widget::Id::new("test-source-editor")) { ++ self.editor = Some(bounds); ++ } ++ } ++ fn scrollable( ++ &mut self, ++ id: Option<&core_widget::Id>, ++ bounds: Rectangle, ++ content: Rectangle, ++ offset: Vector, ++ _: &mut dyn core_widget::operation::Scrollable, ++ ) { ++ if id == Some(&core_widget::Id::new("source-header")) { ++ self.header = Some((bounds, content, offset)); ++ } ++ } ++ } ++ ++ fn mounted_source<'a>( ++ content: &'a widget::text_editor::Content, ++ diagnostics: usize, ++ find: bool, ++ window_height: f32, ++ ) -> View<'a, Message, iced::Theme, FontLayout> { ++ let mut notices = column![].spacing(5); ++ for index in 0..diagnostics { ++ notices = notices.push(button(text(format!( ++ "救援/assess.arcadia:{}:5 · Warning: verify this participant's engineering allocation", index + 1, ++ )).size(12)).padding([4, 6]).width(Fill)); ++ } ++ let find: View<'_, Message, iced::Theme, FontLayout> = if find { ++ column![ ++ text_input("Find literal text", "assess").on_input(|s| Message::SourceNavigation( ++ crate::source_navigation::Event::Query(s) ++ )), ++ text_input("Line", "1").on_input(|s| Message::SourceNavigation( ++ crate::source_navigation::Event::Line(s) ++ )), ++ ] ++ .spacing(8) ++ .into() ++ } else { ++ Space::new().into() ++ }; ++ let header = container( ++ column![ ++ text("Textual model").size(24), ++ text("Edit the current file. Apply text validates the complete included model.") ++ .size(11), ++ row![ ++ button(text("Apply text")), ++ button(text("Undo text")), ++ button(text("Model Undo")) ++ ] ++ .spacing(8), ++ text("救援/assess.arcadia · All files applied to the accepted model").size(11), ++ text("Undo text affects this draft. Model Undo restores accepted files together.") ++ .size(11), ++ find, ++ row![ ++ button(text("Definition · F12")), ++ button(text("References · Shift F12")), ++ button(text("Back")) ++ ] ++ .spacing(7), ++ scrollable(notices).height((diagnostics as f32 * 32.).min(132.)), ++ ] ++ .spacing(12), ++ ) ++ .padding(18); ++ let editor = container( ++ widget::text_editor(content) ++ .on_action(Message::SourceEdit) ++ .font(Font::MONOSPACE) ++ .size(14) ++ .padding(16) ++ .height(Fill), ++ ) ++ .id("test-source-editor") ++ .height(Fill) ++ .width(Fill); ++ source_layout(header.into(), editor.into(), window_height) ++ } ++ ++ #[test] ++ fn source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds() { ++ for (host, window_height) in [ ++ (Size::new(720., 540.), 700.), ++ (Size::new(1180., 890.), 1080.), ++ ] { ++ let content = widget::text_editor::Content::::with_text( ++ "// is excluded\r\n// 雨\r\n", ++ ); ++ let mut tree = core_widget::Tree::empty(); ++ let mut baseline = None; ++ for (diagnostics, find) in [ ++ (0, false), ++ (6, false), ++ (0, false), ++ (6, true), ++ (1, true), ++ (0, false), ++ ] { ++ let mut ui = mounted_source(&content, diagnostics, find, window_height); ++ tree.diff(ui.as_widget()); ++ let node = ui.as_widget_mut().layout( ++ &mut tree, ++ &FontLayout, ++ &layout::Limits::new(Size::ZERO, host), ++ ); ++ let mut geometry = Geometry::default(); ++ ui.as_widget_mut().operate( ++ &mut tree, ++ Layout::new(&node), ++ &FontLayout, ++ &mut geometry, ++ ); ++ let editor = geometry.editor.unwrap(); ++ let (header, _, _) = geometry.header.unwrap(); ++ let slot = node.children()[0].bounds(); ++ assert_eq!(slot.height, (window_height * 0.42).max(180.)); ++ assert!( ++ header.height <= slot.height, ++ "short content may shrink inside the fixed slot" ++ ); ++ assert!( ++ editor.height >= 240., ++ "remaining editor must stay usable: {editor:?}" ++ ); ++ assert_eq!(editor.y, slot.y + slot.height); ++ if let Some(expected) = baseline { ++ assert_eq!(editor, expected, "diagnostics={diagnostics}, find={find}"); ++ } else { ++ baseline = Some(editor); ++ } ++ } ++ } ++ } ++ ++ #[test] ++ fn source_header_remains_scrollable_and_preserves_offset_across_diagnostic_refresh() { ++ let content = widget::text_editor::Content::::with_text("// 雨\r\n"); ++ let host = Size::new(720., 540.); ++ let mut tree = core_widget::Tree::empty(); ++ let mut saved = None; ++ for diagnostics in [6, 7] { ++ let mut ui = mounted_source(&content, diagnostics, true, 700.); ++ tree.diff(ui.as_widget()); ++ let node = ui.as_widget_mut().layout( ++ &mut tree, ++ &FontLayout, ++ &layout::Limits::new(Size::ZERO, host), ++ ); ++ let mut geometry = Geometry::default(); ++ ui.as_widget_mut() ++ .operate(&mut tree, Layout::new(&node), &FontLayout, &mut geometry); ++ let (bounds, contents, _) = geometry.header.unwrap(); ++ assert!( ++ contents.height > bounds.height, ++ "fixture must actually overflow" ++ ); ++ if saved.is_none() { ++ let mut messages = Vec::new(); ++ let mut shell = Shell::new(&mut messages); ++ ui.as_widget_mut().update( ++ &mut tree, ++ &iced::Event::Mouse(iced::mouse::Event::WheelScrolled { ++ delta: iced::mouse::ScrollDelta::Pixels { x: 0., y: -45. }, ++ }), ++ Layout::new(&node), ++ iced::mouse::Cursor::Available(Point::new(bounds.x + 8., bounds.y + 8.)), ++ &FontLayout, ++ &mut iced::advanced::clipboard::Null, ++ &mut shell, ++ &Rectangle::with_size(host), ++ ); ++ assert!(shell.is_event_captured()); ++ } ++ let mut geometry = Geometry::default(); ++ ui.as_widget_mut() ++ .operate(&mut tree, Layout::new(&node), &FontLayout, &mut geometry); ++ let offset = geometry.header.unwrap().2; ++ assert!(offset.y > 0., "the actual mounted Scrollable must move"); ++ if let Some(before) = saved { ++ assert_eq!(offset, before); ++ } else { ++ saved = Some(offset); ++ } ++ } ++ } ++ ++ #[cfg(target_os = "windows")] ++ #[test] ++ fn source_editor_windows_menu_payload_is_inert_but_space_and_altgr_still_edit() { ++ use core_widget::operation::Focusable; ++ use iced::keyboard::{ ++ self, Key, Modifiers, ++ key::{Code, Named, Physical}, ++ }; ++ use widget::text_editor::{Binding, Content, KeyPress, State, Status}; ++ let baseline = "// is excluded\r\n// 雨\r\n"; ++ let context = crate::source_navigation::SymbolContext { ++ session: Id::new_v4(), ++ path: "救援/assess.arcadia".into(), ++ }; ++ for (key, physical_key, modifiers, payload, inserted) in [ ++ ( ++ Key::Named(Named::Space), ++ Physical::Code(Code::Space), ++ Modifiers::ALT, ++ " ", ++ false, ++ ), ++ ( ++ Key::Character(" ".into()), ++ Physical::Code(Code::Space), ++ Modifiers::ALT, ++ " ", ++ false, ++ ), ++ ( ++ Key::Named(Named::Space), ++ Physical::Code(Code::Space), ++ Modifiers::empty(), ++ " ", ++ true, ++ ), ++ ( ++ Key::Named(Named::Space), ++ Physical::Code(Code::Space), ++ Modifiers::CTRL | Modifiers::ALT, ++ " ", ++ true, ++ ), ++ ( ++ Key::Character("e".into()), ++ Physical::Code(Code::KeyE), ++ Modifiers::CTRL | Modifiers::ALT, ++ "€", ++ true, ++ ), ++ ( ++ Key::Named(Named::Space), ++ Physical::Code(Code::Space), ++ Modifiers::ALT | Modifiers::SHIFT, ++ " ", ++ true, ++ ), ++ ] { ++ let mut content = Content::::with_text(baseline); ++ content.move_to(widget::text_editor::Cursor { ++ position: widget::text_editor::Position { line: 0, column: 5 }, ++ selection: None, ++ }); ++ let press = KeyPress { ++ key: key.clone(), ++ modified_key: key.clone(), ++ physical_key, ++ modifiers, ++ text: Some(payload.into()), ++ status: Status::Focused { is_hovered: false }, ++ }; ++ assert!( ++ matches!( ++ Binding::::from_key_press(press), ++ Some(Binding::Insert(_)) ++ ), ++ "the supplied event must expose the default insertion path" ++ ); ++ let mut messages = Vec::new(); ++ { ++ let mut editor: View<'_, Message, iced::Theme, FontLayout> = ++ widget::text_editor(&content) ++ .on_action(Message::SourceEdit) ++ .font(Font::MONOSPACE) ++ .size(14) ++ .padding(16) ++ .height(Fill) ++ .key_binding(|press| source_binding(press, &context)) ++ .into(); ++ let mut tree = core_widget::Tree::new(editor.as_widget()); ++ let size = Size::new(600., 240.); ++ let node = editor.as_widget_mut().layout( ++ &mut tree, ++ &FontLayout, ++ &layout::Limits::new(Size::ZERO, size), ++ ); ++ tree.state ++ .downcast_mut::>() ++ .focus(); ++ let event = iced::Event::Keyboard(keyboard::Event::KeyPressed { ++ key: key.clone(), ++ modified_key: key, ++ physical_key, ++ location: keyboard::Location::Standard, ++ modifiers, ++ text: Some(payload.into()), ++ repeat: false, ++ }); ++ let mut shell = Shell::new(&mut messages); ++ editor.as_widget_mut().update( ++ &mut tree, ++ &event, ++ Layout::new(&node), ++ iced::mouse::Cursor::Unavailable, ++ &FontLayout, ++ &mut iced::advanced::clipboard::Null, ++ &mut shell, ++ &Rectangle::with_size(size), ++ ); ++ } ++ assert_eq!( ++ messages.len(), ++ usize::from(inserted), ++ "modifiers={modifiers:?}" ++ ); ++ for message in messages { ++ let Message::SourceEdit(action) = message else { ++ panic!("unexpected navigation action"); ++ }; ++ content.perform(action); ++ } ++ let expected = if inserted { ++ format!("// is{payload} excluded\r\n// 雨\r\n") ++ } else { ++ baseline.into() ++ }; ++ assert_eq!(content.text(), expected); ++ } ++ } ++} + fn checks(app: &App) -> View<'_, Message> { + let issues = &app.model_issues; + let mut out = column![heading( diff --git a/harness/experiments/text-navigation-native-20260911/corrections/final-gate-result.json b/harness/experiments/text-navigation-native-20260911/corrections/final-gate-result.json new file mode 100644 index 00000000..91ebf2ff --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/final-gate-result.json @@ -0,0 +1,86 @@ +{ + "atUtc": "2026-09-11T19:41:09.656362+00:00", + "scope": "Focused Windows desktop tests and strict all-target Clippy only; no corrected GUI, native OS payload, full desktop suite, Linux, or release acceptance.", + "sourceHead": "f4e426ae2a6971395e1ca7e6f094b0c20056cf93", + "uncommittedOwnedInputs": [ + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 67434, + "sha256": "e5ed7640fbd2653983c418b88fd2e3612b91f8f02fa2f50f1b5dfd31aab773b2" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 214840, + "sha256": "411007f8c192e0fc581f3c6bcfc49ab46b900a841ee20ae96203d4db64c9280f" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols.rs", + "bytes": 18627, + "sha256": "99370865b548b28f32f4c6ce7e9f8eeaa0c80268a644f2ebcc4bd1e11695e59c" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols/tests.rs", + "bytes": 57781, + "sha256": "33292a7ce9b61dbc134f74372caa93af9704e2f968cd698da13ea6a1b8cf3ea6" + } + ], + "inputs": "inputs4", + "inputFiles": 499, + "inputBytes": 9470838, + "archiveSha256": "7ff9e5703e33bd72e5c2186dd61125e965b82b8dfbf085961d514b005e716798", + "sourceZipAndCurrentBytesMatch": true, + "gates": { + "focused5": { + "started": "2026-09-11T19:35:53.3464146Z", + "finished": "2026-09-11T19:38:11.7593163Z", + "exitCode": 0, + "args": [ + "test", + "--locked", + "--offline", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio", + "source_", + "--", + "--test-threads=1" + ], + "buildJobs": 1 + }, + "clippy5": { + "started": "2026-09-11T19:38:11.8128387Z", + "finished": "2026-09-11T19:40:12.0873967Z", + "exitCode": 0, + "args": [ + "clippy", + "--locked", + "--offline", + "-p", + "oa-desktop", + "--all-targets", + "--", + "-D", + "warnings" + ], + "buildJobs": 1 + } + }, + "tests": { + "passed": 188, + "failed": 0, + "ignored": 1, + "measured": 0, + "filtered": 562 + }, + "testExecutionSeconds": 41.73, + "requiredRegressionTestsPassed": [ + "closed_results_stay_closed_on_exact_back_and_reopen_only_for_a_return_notice", + "find_only_captured_escape_closes_once_and_preserves_raw_query_and_selection", + "old_find_close_cannot_cancel_a_new_file_session_or_reopened_find_intent", + "find_close_releases_removed_input_and_guarded_focus_respects_later_input", + "source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds", + "source_header_remains_scrollable_and_preserves_offset_across_diagnostic_refresh", + "source_editor_windows_menu_payload_is_inert_but_space_and_altgr_still_edit" + ] +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/finalize.py b/harness/experiments/text-navigation-native-20260911/corrections/finalize.py new file mode 100644 index 00000000..58f4f471 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/finalize.py @@ -0,0 +1,80 @@ +"""Verify frozen gate receipts and source ZIP; never infer a native/full-suite pass.""" +import datetime +import hashlib +import json +from pathlib import Path +import re +import sys +import zipfile + +base = Path(__file__).resolve().parent +root = base.parents[1] +inputs, focused, clippy = sys.argv[1:] +assert re.fullmatch(r"inputs[0-9]+", inputs) +assert re.fullmatch(r"focused[0-9]+", focused) +assert re.fullmatch(r"clippy[0-9]+", clippy) + + +def read(name): + return json.loads((base / name).read_text(encoding="utf-8-sig")) + + +def sha(raw): + return hashlib.sha256(raw).hexdigest() + + +manifest = read(inputs + ".json") +readback = read(inputs + "-readback.json") +assert readback["passed"] and not any(readback[k] for k in ("changed", "added", "removed")) +archive = base / (inputs + ".zip") +assert sha(archive.read_bytes()) == manifest["archiveSha256"] +expected = {item["path"]: item for item in manifest["files"]} +with zipfile.ZipFile(archive) as bundle: + assert len(bundle.infolist()) == len(expected) + assert set(bundle.namelist()) == set(expected) + for path, item in expected.items(): + raw = bundle.read(path) + assert len(raw) == item["bytes"] and sha(raw) == item["sha256"], path + assert (root / path).read_bytes() == raw, path + +gates = {name: read(name + "-status.json") for name in (focused, clippy)} +assert all(gate["exitCode"] == 0 for gate in gates.values()) +log = (base / (focused + ".log")).read_text(encoding="utf-8-sig") +match = re.search(r"test result: ok\. (\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out; finished in ([0-9.]+)s", log) +assert match, "No executed successful Rust test summary" +counts = dict(zip(("passed", "failed", "ignored", "measured", "filtered"), map(int, match.groups()[:5]))) +assert counts["failed"] == 0 +required = [ + "closed_results_stay_closed_on_exact_back_and_reopen_only_for_a_return_notice", + "find_only_captured_escape_closes_once_and_preserves_raw_query_and_selection", + "old_find_close_cannot_cancel_a_new_file_session_or_reopened_find_intent", + "find_close_releases_removed_input_and_guarded_focus_respects_later_input", + "source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds", + "source_header_remains_scrollable_and_preserves_offset_across_diagnostic_refresh", + "source_editor_windows_menu_payload_is_inert_but_space_and_altgr_still_edit", +] +for name in required: + assert re.search(r"test [^\r\n]*::" + re.escape(name) + r" \.\.\. ok", log), name + +owned = ["crates/oa-desktop/src/" + path for path in ( + "views.rs", "app.rs", "app/source_symbols.rs", "app/source_symbols/tests.rs" +)] +result = { + "atUtc": datetime.datetime.now(datetime.timezone.utc).isoformat(), + "scope": "Focused Windows desktop tests and strict all-target Clippy only; no corrected GUI, native OS payload, full desktop suite, Linux, or release acceptance.", + "sourceHead": manifest["head"], + "uncommittedOwnedInputs": [expected[path] for path in owned], + "inputs": inputs, + "inputFiles": len(expected), + "inputBytes": sum(item["bytes"] for item in expected.values()), + "archiveSha256": manifest["archiveSha256"], + "sourceZipAndCurrentBytesMatch": True, + "gates": gates, + "tests": counts, + "testExecutionSeconds": float(match.group(6)), + "requiredRegressionTestsPassed": required, +} +with (base / "final-gate-result.json").open("x", encoding="utf-8", newline="\n") as stream: + json.dump(result, stream, indent=2, ensure_ascii=False) + stream.write("\n") +print(json.dumps(result, ensure_ascii=False, indent=2)) diff --git a/harness/experiments/text-navigation-native-20260911/corrections/fmt-final-status.json b/harness/experiments/text-navigation-native-20260911/corrections/fmt-final-status.json new file mode 100644 index 00000000..bb0f51fb --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/fmt-final-status.json @@ -0,0 +1,16 @@ +{ + "started": "2026-09-11T19:41:04.7974359Z", + "finished": "2026-09-11T19:41:06.4920379Z", + "exitCode": 0, + "args": [ + "--check", + "--edition", + "2024", + "--config", + "skip_children=true", + "crates/oa-desktop/src/views.rs", + "crates/oa-desktop/src/app.rs", + "crates/oa-desktop/src/app/source_symbols.rs", + "crates/oa-desktop/src/app/source_symbols/tests.rs" + ] +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused1-tool-result.json b/harness/experiments/text-navigation-native-20260911/corrections/focused1-tool-result.json new file mode 100644 index 00000000..9bea2f82 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused1-tool-result.json @@ -0,0 +1,6 @@ +{ + "scope": "Transcription of the completed functions exec session response; the failing PowerShell 5 wrapper did not reach its normal status/log writer. This is not a raw OS stderr byte capture.", + "sessionId": 39757, + "outerExitCode": 1, + "output": "cargo.exe : Compiling oa-desktop v0.2.0 (C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\crates\\oa-desktop)\r\nAt C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\text-navigation-native-fixes-20260911\\run-focused1.ps1:14 char:5\r\n+ & cargo @gateArgs 2>&1 | Tee-Object -FilePath $log\r\n+ ~~~~~~~~~~~~~~~~~~~~~~\r\n + CategoryInfo : NotSpecified: ( Compiling oa...tes\\oa-desktop):String) [], RemoteException\r\n + FullyQualifiedErrorId : NativeCommandError\r\n \r\n" +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused1-wrapper-failure.txt b/harness/experiments/text-navigation-native-20260911/corrections/focused1-wrapper-failure.txt new file mode 100644 index 00000000..53cb707b --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused1-wrapper-failure.txt @@ -0,0 +1,7 @@ +2026-09-11: the explicit nested Windows PowerShell invocation terminated at Cargo's first ordinary stderr compilation message, because ErrorActionPreference=Stop treated merged native stderr as NativeCommandError. functions exec session 39757 returned exit 1. No focused test or Clippy terminal result was produced. Subsequent process inventory found no remaining cargo/rustc/clippy process. Production inputs1 remain frozen; the correction is to the private launcher only. + +cargo.exe : Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop) +At ...\run-focused1.ps1:14 char:5 ++ & cargo @gateArgs 2>&1 | Tee-Object -FilePath $log +CategoryInfo: NotSpecified / RemoteException +FullyQualifiedErrorId: NativeCommandError diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused2-status.json b/harness/experiments/text-navigation-native-20260911/corrections/focused2-status.json new file mode 100644 index 00000000..625cee5a --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused2-status.json @@ -0,0 +1,18 @@ +{ + "started": "2026-09-11T19:15:25.1328926Z", + "finished": "2026-09-11T19:17:27.0373185Z", + "exitCode": 101, + "args": [ + "test", + "--locked", + "--offline", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio", + "source_", + "--", + "--test-threads=1" + ], + "buildJobs": 1 +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused2-stop-request.json b/harness/experiments/text-navigation-native-20260911/corrections/focused2-stop-request.json new file mode 100644 index 00000000..9672a713 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused2-stop-request.json @@ -0,0 +1,6 @@ +{ + "ProcessId": 6124, + "ParentProcessId": 7424, + "Name": "rustc.exe", + "CommandLine": "\"C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\rustup\\toolchains\\stable-x86_64-pc-windows-gnullvm\\bin\\rustc.exe\" --crate-name arcadia_studio --edition=2024 crates\\oa-desktop\\src\\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --emit=dep-info,link -C embed-bitcode=no --test --check-cfg cfg(docsrs,test) --check-cfg \"cfg(feature, values())\" -C metadata=e92d7ab29d07ce2a -C extra-filename=-58e30cee1fd51a8b --out-dir C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps -C linker=clang.exe -C incremental=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\incremental -C strip=debuginfo -L dependency=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps --extern axum=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libaxum-ccc7aea466db9258.rlib --extern iced=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libiced-ee73abd722c72024.rlib --extern iced_runtime=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libiced_runtime-97354eb606c5cbe8.rlib --extern oa_core=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\liboa_core-6c8da57367eec642.rlib --extern oa_server=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\liboa_server-69305e51c40cee45.rlib --extern reqwest=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libreqwest-31ac987472fa8038.rlib --extern rfd=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\librfd-17cc7ba2db223d7b.rlib --extern serde=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde-60a32311146a42e4.rlib --extern serde_json=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libserde_json-da2c4f333fc47818.rlib --extern tempfile=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libtempfile-86aac28d6be16d2f.rlib --extern tokio=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\libtokio-5e0ca96735e3073a.rlib -L native=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\ring-5f8d2d20440f09b4\\out -L native=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\toolchain\\cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows_x86_64_gnullvm-0.52.6\\lib -C link-arg=C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\build\\oa-desktop-664d65ac5124e646\\out\\normal-user-manifest.o" +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused2.log b/harness/experiments/text-navigation-native-20260911/corrections/focused2.log new file mode 100644 index 00000000..00c40fd9 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused2.log @@ -0,0 +1,56 @@ + Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop) +error[E0659]: `column` is ambiguous + --> crates\oa-desktop\src\views.rs:1360:27 + | +1360 | let mut notices = column![].spacing(5); + | ^^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and an outer scope during import or macro resolution +note: `column` could refer to the macro imported here + --> crates\oa-desktop\src\views.rs:1277:9 + | +1277 | use super::*; + | ^^^^^^^^ + = help: consider adding an explicit import of `column` to disambiguate + = help: or use `self::column` to refer to this macro unambiguously +note: `column` could also refer to a macro from prelude + --> /rustc/48a229ceaefd4985c50990b14116b6d856af0985/library\std\src\prelude\mod.rs:162:12 + +error[E0659]: `column` is ambiguous + --> crates\oa-desktop\src\views.rs:1367:13 + | +1367 | column![ + | ^^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and an outer scope during import or macro resolution +note: `column` could refer to the macro imported here + --> crates\oa-desktop\src\views.rs:1277:9 + | +1277 | use super::*; + | ^^^^^^^^ + = help: consider adding an explicit import of `column` to disambiguate + = help: or use `self::column` to refer to this macro unambiguously +note: `column` could also refer to a macro from prelude + --> /rustc/48a229ceaefd4985c50990b14116b6d856af0985/library\std\src\prelude\mod.rs:162:12 + +error[E0659]: `column` is ambiguous + --> crates\oa-desktop\src\views.rs:1381:13 + | +1381 | column![ + | ^^^^^^ ambiguous name + | + = note: ambiguous because of a conflict between a name from a glob import and an outer scope during import or macro resolution +note: `column` could refer to the macro imported here + --> crates\oa-desktop\src\views.rs:1277:9 + | +1277 | use super::*; + | ^^^^^^^^ + = help: consider adding an explicit import of `column` to disambiguate + = help: or use `self::column` to refer to this macro unambiguously +note: `column` could also refer to a macro from prelude + --> /rustc/48a229ceaefd4985c50990b14116b6d856af0985/library\std\src\prelude\mod.rs:162:12 + +error: could not compile `oa-desktop` (bin "arcadia-studio" test) due to 3 previous errors + +Caused by: + process didn't exit successfully: `C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\rustup\toolchains\stable-x86_64-pc-windows-gnullvm\bin\rustc.exe --crate-name arcadia_studio --edition=2024 crates\oa-desktop\src\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --emit=dep-info,link -C embed-bitcode=no --test --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=e92d7ab29d07ce2a -C extra-filename=-58e30cee1fd51a8b --out-dir C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps -C linker=clang.exe -C incremental=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\incremental -C strip=debuginfo -L dependency=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps --extern axum=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libaxum-ccc7aea466db9258.rlib --extern iced=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libiced-ee73abd722c72024.rlib --extern iced_runtime=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libiced_runtime-97354eb606c5cbe8.rlib --extern oa_core=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\liboa_core-6c8da57367eec642.rlib --extern oa_server=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\liboa_server-69305e51c40cee45.rlib --extern reqwest=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libreqwest-31ac987472fa8038.rlib --extern rfd=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\librfd-17cc7ba2db223d7b.rlib --extern serde=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libserde-60a32311146a42e4.rlib --extern serde_json=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libserde_json-da2c4f333fc47818.rlib --extern tempfile=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libtempfile-86aac28d6be16d2f.rlib --extern tokio=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\deps\libtokio-5e0ca96735e3073a.rlib -L native=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\build\ring-5f8d2d20440f09b4\out -L native=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\cargo\registry\src\index.crates.io-1949cf8c6b5b557f\windows_x86_64_gnullvm-0.52.6\lib -C link-arg=C:\Users\User\Documents\Git\ARCADIA-Studio\.local\target-gnullvm\debug\build\oa-desktop-664d65ac5124e646\out\normal-user-manifest.o` (exit code: 0xffffffff) diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused3-status.json b/harness/experiments/text-navigation-native-20260911/corrections/focused3-status.json new file mode 100644 index 00000000..61079568 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused3-status.json @@ -0,0 +1,18 @@ +{ + "started": "2026-09-11T19:24:58.0862693Z", + "finished": "2026-09-11T19:26:31.7992756Z", + "exitCode": 101, + "args": [ + "test", + "--locked", + "--offline", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio", + "source_", + "--", + "--test-threads=1" + ], + "buildJobs": 1 +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused3.log b/harness/experiments/text-navigation-native-20260911/corrections/focused3.log new file mode 100644 index 00000000..1f065468 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused3.log @@ -0,0 +1,37 @@ + Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop) +error[E0277]: the trait bound `Renderer: iced::advanced::text::Renderer` is not satisfied + --> crates\oa-desktop\src\views.rs:1222:19 + | +1222 | container(scrollable(header).id("source-header")).height((window_height * 0.42).max(180.)), + | ^^^^^^^^^^^^^^^^^^ the trait `iced::advanced::text::Renderer` is not implemented for `Renderer` + | + = note: `Renderer` implements similarly named trait `iced::advanced::Renderer`, but not `iced::advanced::text::Renderer` +note: required by a bound in `iced::widget::scrollable` + --> C:\Users\User\Documents\Git\ARCADIA-Studio\.local\toolchain\cargo\registry\src\index.crates.io-1949cf8c6b5b557f\iced_widget-0.14.2\src\helpers.rs:1051:15 + | +1046 | pub fn scrollable<'a, Message, Theme, Renderer>( + | ---------- required by a bound in this function +... +1051 | Renderer: core::text::Renderer, + | ^^^^^^^^^^^^^^^^^^^^ required by this bound in `scrollable` +help: consider further restricting type parameter `Renderer` with trait `Renderer` + | +1214 | fn source_layout<'a, Renderer: iced::advanced::Renderer + 'a + iced::advanced::text::Renderer>( + | ++++++++++++++++++++++++++++++++ + +error[E0599]: the method `id` exists for struct `iced::widget::Scrollable<'_, app::Message, iced::Theme, Renderer>`, but its trait bounds were not satisfied + --> crates\oa-desktop\src\views.rs:1222:38 + | +1222 | container(scrollable(header).id("source-header")).height((window_height * 0.42).max(180.)), + | ^^ private field, not a method + | + = note: the following trait bounds were not satisfied: + `Renderer: iced::advanced::text::Renderer` +help: consider restricting the type parameter to satisfy the trait bound + | +1218 | ) -> View<'a, Message, iced::Theme, Renderer> where Renderer: iced::advanced::text::Renderer { + | ++++++++++++++++++++++++++++++++++++++++++++++ + +Some errors have detailed explanations: E0277, E0599. +For more information about an error, try `rustc --explain E0277`. +error: could not compile `oa-desktop` (bin "arcadia-studio" test) due to 2 previous errors diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused4-status.json b/harness/experiments/text-navigation-native-20260911/corrections/focused4-status.json new file mode 100644 index 00000000..294c641f --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused4-status.json @@ -0,0 +1,18 @@ +{ + "started": "2026-09-11T19:27:12.6898804Z", + "finished": "2026-09-11T19:35:01.2568189Z", + "exitCode": 101, + "args": [ + "test", + "--locked", + "--offline", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio", + "source_", + "--", + "--test-threads=1" + ], + "buildJobs": 1 +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused4.log b/harness/experiments/text-navigation-native-20260911/corrections/focused4.log new file mode 100644 index 00000000..46e5802e --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused4.log @@ -0,0 +1,212 @@ + Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop) + Finished `test` profile [unoptimized] target(s) in 6m 58s + Running unittests src\main.rs (.local\target-gnullvm\debug\deps\arcadia_studio-58e30cee1fd51a8b.exe) + +running 189 tests +test app::behavior_lifecycle_tests::pending_behavior_blocks_source_creation_and_source_history_replay ... ok +test app::behavior_lifecycle_tests::source_writeback_failure_keeps_typed_behavior_form_for_repair_and_one_undo ... ok +test app::checkpoints::tests::home_resume_retains_invalid_source_and_property_drafts ... ok +test app::checkpoints::tests::walkthrough_request_keeps_unfinished_source_behind_the_normal_pending_guard ... ok +test app::direct_scenario_tests::direct_scenario_source_failure_and_navigation_keep_form_until_success ... ok +test app::hosted::tests::hosted_invalid_and_detached_source_drafts_never_start_network_writes ... ok +test app::hosted::tests::hosted_only_successful_source_save_as_changes_the_active_destination ... ok +test app::process_canvas::direct_process_dirty_source_blocks_canvas_creation_without_losing_text ... ok +test app::process_canvas::tests::direct_process_app_open_source_and_back_preserve_local_reference_identity ... ok +test app::process_canvas::tests::direct_process_app_source_failure_retains_form_then_commits_once_and_selects_occurrence ... ok +test app::process_canvas::tests::direct_process_app_stale_context_dirty_source_and_properties_never_mutate ... ok +test app::process_canvas::tests::direct_process_append_empty_first_second_exchange_has_exact_source_history ... ok +test app::review_navigation_tests::rejected_semantic_source_writeback_retains_review_camera_and_original_navigation ... ok +test app::save_as_tests::save_as_late_receipt_preserves_newer_raw_source_draft_and_destination ... ok +test app::source_project_tests::closed_detached_file_keeps_first_save_conflict_then_can_be_reloaded_fresh ... ok +test app::source_project_tests::inactive_invalid_draft_blocks_graphical_changes_and_diagnostic_switches_files ... ok +test app::source_project_tests::json_export_and_rejected_save_as_preserve_source_location_history_and_bytes ... ok +test app::source_project_tests::missing_include_open_keeps_old_model_and_can_be_repaired_and_saved ... ok +test app::source_project_tests::recovery_after_first_save_failure_retains_target_then_retries_without_reentering_path ... ok +test app::source_project_tests::recovery_of_previous_save_as_target_does_not_redirect_current_project ... ok +test app::source_project_tests::recovery_open_finds_first_save_journal_without_an_entry_file ... ok +test app::source_project_tests::recovery_target_survives_edit_lint_apply_and_rejected_recovery_until_success ... ok +test app::source_project_tests::source3_native_open_preserves_report_comments_nesting_and_save_reopen ... ok +test app::source_project_tests::two_file_apply_graphical_edit_exact_undo_save_as_and_reopen ... ok +test app::source_symbols::tests::back_after_origin_edit_uses_its_current_cursor_instead_of_the_old_range ... ok +test app::source_symbols::tests::back_keeps_the_latest_64_actual_locations_without_reusing_dropped_history ... ok +test app::source_symbols::tests::back_restores_exact_reversed_utf8_selection_and_crlf_source ... ok +test app::source_symbols::tests::captured_find_and_modal_escape_use_one_actual_subscription_and_preserve_pending_work ... ok +test app::source_symbols::tests::captured_subscription_does_not_duplicate_existing_behavior_or_architecture_routes ... ok +test app::source_symbols::tests::close_during_busy_hides_panel_and_completion_does_not_reopen_it ... ok +test app::source_symbols::tests::closed_results_stay_closed_on_exact_back_and_reopen_only_for_a_return_notice ... ok +test app::source_symbols::tests::completion_rejects_file_edit_session_cursor_interaction_and_raw_input_changes ... ok +test app::source_symbols::tests::detached_duplicate_requires_an_explicit_choice_even_when_included_source_is_validated ... ok +test app::source_symbols::tests::escape_dismisses_modal_before_underlying_source_results ... ok +test app::source_symbols::tests::escape_dismisses_results_and_cancels_busy_navigation_without_changing_sources ... ok +test app::source_symbols::tests::find_close_releases_removed_input_and_guarded_focus_respects_later_input ... ok +test app::source_symbols::tests::find_only_captured_escape_closes_once_and_preserves_raw_query_and_selection ... ok +test app::source_symbols::tests::invalid_unapplied_drafts_navigate_without_apply_or_losing_either_history ... ok +test app::source_symbols::tests::matching_reveal_ticket_is_required_and_raw_input_invalidates_pending_reveal ... ok +test app::source_symbols::tests::old_find_close_cannot_cancel_a_new_file_session_or_reopened_find_intent ... ok +test app::source_symbols::tests::old_symbol_widget_envelopes_after_file_switch_preserve_same_session_intent ... ok +test app::source_symbols::tests::old_symbol_widget_envelopes_after_reset_preserve_new_same_path_intent ... ok +test app::source_symbols::tests::reset_retains_worker_slot_until_old_completion_then_admits_new_session_query ... ok +test app::source_symbols::tests::saturated_raw_clock_never_authorizes_completion_or_reveal ... ok +test app::source_symbols::tests::source_symbols_100_modules_1000_definitions_10000_uses ... ignored, manual 100-module latency/process-memory trial; run alone with --ignored --nocapture --test-threads=1 +test app::source_symbols::tests::unknown_job_cannot_release_current_worker_and_old_duplicate_cannot_replace_new_results ... ok +test app::source_symbols::tests::valid_definition_and_reference_choice_keep_whole_model_and_source_unchanged ... ok +test app::state_diagram_tests::create_view_places_only_its_machine_and_restores_exact_source_in_one_undo ... ok +test app::state_diagram_tests::rejected_creation_keeps_source_and_selection_then_valid_owner_can_retry ... ok +test app::state_diagram_tests::state_diagram_routes_constructor_and_source_open_to_the_existing_workspace_without_edits ... ok +test app::transition_context_tests::rejected_source_writeback_keeps_review_and_navigation_and_invalid_draft_still_blocks_start ... ok +test app::view_copy_tests::copying_the_current_state_view_uses_its_own_identity_and_is_one_source_undo ... ok +test app::view_copy_tests::duplicate_rejection_preserves_an_incomplete_source_buffer ... ok +test behavior::contextual_source_tests::contextual_source_app_checkpoint_restores_inner_raw_draft_without_model_adoption ... ok +test behavior::contextual_source_tests::contextual_source_app_empty_actions_and_child_open_refuse_other_raw_editors ... ok +test behavior::contextual_source_tests::contextual_source_app_modal_escape_then_child_back_then_parent_cancel_preserve_accepted_source ... ok +test behavior::contextual_source_tests::contextual_source_back_remains_available_after_owner_deletion_and_with_dirty_editors ... ok +test behavior::contextual_source_tests::contextual_source_back_retains_parent_and_rejects_late_child_event ... ok +test behavior::contextual_source_tests::contextual_source_default_consumer_name_has_stable_alias_and_correlated_selection ... ok +test behavior::contextual_source_tests::contextual_source_deleted_owner_view_retains_draft_instead_of_panicking_or_using_fallback ... ok +test behavior::contextual_source_tests::contextual_source_empty_history_reports_no_change_and_success_requires_a_real_history_step ... ok +test behavior::contextual_source_tests::contextual_source_existing_choice_prunes_staged_dependency ... ok +test behavior::contextual_source_tests::contextual_source_failed_source_budget_preserves_both_drafts_and_accepted_bytes ... ok +test behavior::contextual_source_tests::contextual_source_incomplete_recovered_kind_reports_error_without_panicking ... ok +test behavior::contextual_source_tests::contextual_source_inserts_work_on_the_exact_guarded_link_and_refuses_exchange_identity_conflict ... ok +test behavior::contextual_source_tests::contextual_source_lifelines_stage_exact_separate_records_and_one_history_entry ... ok +test behavior::contextual_source_tests::contextual_source_machine_before_any_owner_creates_optional_view_atomically ... ok +test behavior::contextual_source_tests::contextual_source_mounted_small_editor_keeps_back_and_use_outside_field_scroll ... ok +test behavior::contextual_source_tests::contextual_source_nested_semantic_parent_is_explicit_and_revalidated ... ok +test behavior::contextual_source_tests::contextual_source_new_callee_lifeline_preserves_caller_bindings_as_an_explicit_warning ... ok +test behavior::contextual_source_tests::contextual_source_old_empty_action_cannot_open_a_previous_owner_or_layer ... ok +test behavior::contextual_source_tests::contextual_source_original_document_remains_bound_after_back_or_choosing_existing ... ok +test behavior::contextual_source_tests::contextual_source_owner_first_can_return_to_an_unnamed_machine_without_losing_source ... ok +test behavior::contextual_source_tests::contextual_source_recovery_keeps_inner_raw_fields_and_refuses_deleted_or_changed_owner ... ok +test behavior::contextual_source_tests::contextual_source_second_system_and_role_machine_owner_refuse_without_fallback ... ok +test behavior::contextual_source_tests::contextual_source_work_uses_reserved_contribution_and_link_ids_and_one_undo ... ok +test behavior::creation::app_tests::app_new_never_auto_applies_valid_or_invalid_property_and_source_drafts ... ok +test behavior::creation::tests::all_four_viewpoints_are_explicit_and_survive_source_history_reopen ... ok +test behavior::creation::tests::rejected_source_transaction_keeps_draft_and_every_accepted_source_byte ... ok +test behavior::scenario::direct_tests::direct_clicked_occurrences_use_root_and_operand_slots_with_exact_source_history ... ok +test behavior::scenario::direct_tests::direct_middle_pair_insertion_is_one_exact_source_and_model_undo ... ok +test behavior::scenario::tests::graphical_call_reply_is_atomic_correlated_and_source_equivalent ... ok +test behavior::source_draft::layout_tests::contextual_source_layout_initial_essentials_fit_short_composed_host_with_real_paragraphs ... ok +test behavior::source_draft::layout_tests::contextual_source_layout_long_parent_wraps_after_visible_name_without_losing_raw_data ... ok +test behavior::source_draft::layout_tests::contextual_source_layout_visible_kind_click_keeps_choice_explicit_and_name_input_works ... ok +test behavior::state_edit::tests::view_initializes_only_its_machine_in_one_source_and_model_history_entry ... ok +test behavior::topology::contextual::tests::qualified_link_gui_repeated_sources_remain_distinct_and_apply_has_exact_source_history ... ok +test behavior::topology::direct_tests::direct_process_nested_source_reopen_and_api_command_use_one_transaction ... ok +test behavior::topology::tests::guarded_branch_is_one_transaction_with_distinct_source_identities ... ok +test connection_tool::tests::direct_connections_share_exact_source_history_and_model_parity ... ok +test diagram::lifecycle_tests::middle_and_arrow_panning_preserve_source_and_history ... ok +test diagram::lifecycle_tests::motion_after_source_click_release_must_not_create_connection ... ok +test diagram::pointer_tests::coalesced_fe_ports_commit_once_through_app_and_source_history ... ok +test diagram::pointer_tests::coalesced_port_drag_commits_once_through_app_and_source_history ... ok +test diagram::pointer_tests::drag_from_already_selected_stationary_port_keeps_source_between_batches ... ok +test document::save_as_tests::save_as_preserves_explicit_source_entry_changes_in_history ... ok +test document::tests::nested_cross_file_reparent_and_source_edit_share_exact_history ... ok +test document::tests::no_op_command_or_source_apply_preserves_history_revision_and_redo ... ok +test document::tests::omitted_id_stabilization_remains_dirty_until_exact_source_is_saved ... ok +test document::tests::recreated_equal_record_does_not_inherit_deleted_source_ownership ... ok +test forms::history_fields::tests::history_every_descriptor_fact_choice_matches_actual_closed_types_and_source_contract ... ok +test hosted::client::tests::hosted_publication_retains_known_resource_after_failed_followup ... ok +test model_menu::tests::add_bend_here_uses_context_point_and_one_source_aware_history_change ... ok +test model_menu::tests::pending_source_allows_file_navigation_but_disables_model_actions ... ok +test recovery::source7_tests::source7_legacy_profiles_preserve_dirty_source_property_and_behavior_raw_fields ... ok +test recovery::tests::exact_source_and_unfinished_invalid_buffers_restore_without_model_overwrite ... ok +test semantic_review::artifacts_tests::artifact_creation_and_identified_source_deletion_follow_core_metadata_and_history_boundary_both_directions ... ok +test semantic_review::artifacts_tests::artifact_metadata_apply_and_exact_history_reset_are_one_source_preserving_undo_redo ... ok +test semantic_review::artifacts_tests::artifact_moved_source_absence_deletes_but_destination_only_take_retains_both_directions ... ok +test semantic_review::attachments::tests::attachment_apply_is_one_exact_source_and_history_undo_redo ... ok +test semantic_review::attachments::tests::functional_incident_source_requires_explicit_matching_port_review_in_one_atomic_candidate ... ok +test semantic_review::attachments::tests::source_only_absence_and_explicit_absent_endpoint_are_different ... ok +test semantic_review::batch_tests::batch_apply_is_one_exact_source_and_history_undo_redo_roundtrip ... ok +test semantic_review::constructor_tests::scenario_use_group_takes_typed_binding_references_and_preserves_source_text_both_directions ... ok +test semantic_review::keyed_rows_tests::keyed_rows_distinguish_unpaired_source_from_explicit_absence_and_require_exact_reset ... ok +test semantic_review::keyed_rows_tests::row_review_apply_preserves_exact_source_and_semantic_history_through_undo_redo ... ok +test semantic_review::keyed_tests::deleted_member_source_observation_removes_only_mapped_membership_both_directions ... ok +test semantic_review::keyed_tests::exact_reset_only_is_one_history_source_transaction_and_undo_redo_both_directions ... ok +test semantic_review::keyed_tests::stale_or_source_failed_reset_and_membership_apply_retain_exact_choices ... ok +test semantic_review::message_kind_tests::message_group_rejects_protected_edits_stale_plan_and_source_failure_without_losing_timer ... ok +test semantic_review::message_kind_tests::message_group_take_full_timer_and_scalar_candidate_are_one_source_history_change_both_directions ... ok +test semantic_review::ordered_tests::ordered_review_apply_is_exact_source_history_transaction_with_reopen_and_undo_redo ... ok +test semantic_review::ordered_tests::several_incoming_members_follow_source_order_despite_independent_identity_sorting ... ok +test semantic_review::tests::scalar_keep_take_candidate_commit_exact_source_and_history_in_both_directions ... ok +test semantic_review::tests::stale_plan_and_source_writeback_failure_do_not_lose_decisions_or_history ... ok +test source_navigation::interaction::tests::captured_find_click_invalidates_without_app_message_and_preserves_focus ... ok +test source_navigation::interaction::tests::focus_rechecks_clock_between_inspection_and_application_and_missing_target_is_inert ... ok +test source_navigation::interaction::tests::raw_navigation_inputs_advance_but_passive_geometry_does_not_and_exhaustion_refuses ... ok +test source_navigation::query::tests::comments_strings_and_comment_gap_are_not_navigation_hits ... ok +test source_navigation::query::tests::detached_alias_and_identity_collisions_never_auto_select ... ok +test source_navigation::query::tests::dirty_but_parseable_text_has_current_names_and_no_validated_fallback ... ok +test source_navigation::query::tests::exact_multifile_unicode_crlf_definition_and_repeated_lexical_references ... ok +test source_navigation::query::tests::exact_snapshot_readback_rejects_same_key_byte_membership_and_evidence_changes ... ok +test source_navigation::query::tests::include_cycle_depth_and_aggregate_edges_are_explicit_partial_outcomes ... ok +test source_navigation::query::tests::invalid_include_syntax_never_borrows_the_old_reachable_file_set ... ok +test source_navigation::query::tests::keyword_alias_and_loaded_path_case_collisions_use_reviewed_index_rules ... ok +test source_navigation::query::tests::large_display_name_cannot_escape_the_owned_row_string_budget ... ok +test source_navigation::query::tests::missing_and_noncanonical_authored_ids_remain_draft_spans_without_generated_anchors ... ok +test source_navigation::query::tests::missing_include_partial_scope_does_not_resurrect_witness_text ... ok +test source_navigation::query::tests::omitted_rows_are_counted_before_result_allocation_and_never_confer_uniqueness ... ok +test source_navigation::query::tests::owned_request_checks_raw_limits_immediately_and_extracts_only_on_worker ... ok +test source_navigation::query::tests::owned_request_moves_exact_text_into_worker_snapshot_and_matches_sync_results ... ok +test source_navigation::query::tests::owned_validation_proof_preserves_full_witness_count_and_partial_scope ... ok +test source_navigation::query::tests::raw_aggregate_limits_refuse_before_outline_or_copied_snapshot ... ok +test source_navigation::query::tests::sole_detached_candidate_and_unapplied_equal_bytes_require_choice ... ok +test source_navigation::query::tests::token_declaration_and_live_reference_limits_are_aggregate_not_per_file ... ok +test source_navigation::query::tests::validation_witness_must_match_entry_and_complete_included_file_set ... ok +test source_navigation::symbols::tests::admitted_unicode_path_budget_keeps_original_policy_after_single_fold ... ok +test source_navigation::symbols::tests::comment_separated_reference_keeps_crlf_unicode_and_disjoint_hit_spans ... ok +test source_navigation::symbols::tests::declaration_order_and_duplicate_roles_refuse_instead_of_corrupting_hit_search ... ok +test source_navigation::symbols::tests::detached_uuid_clone_disables_anchor_even_for_included_query ... ok +test source_navigation::symbols::tests::duplicate_aliases_are_candidates_without_false_reference_attribution ... ok +test source_navigation::symbols::tests::every_budget_admits_boundary_and_returns_no_index_one_below ... ok +test source_navigation::symbols::tests::header_metadata_must_match_current_token_boundaries_and_authored_id ... ok +test source_navigation::symbols::tests::incomplete_draft_is_lexical_and_error_token_does_not_leak_references ... ok +test source_navigation::symbols::tests::legal_keyword_classified_alias_is_not_discarded ... ok +test source_navigation::symbols::tests::missing_ids_produce_only_current_snapshot_locations_without_stabilization ... ok +test source_navigation::symbols::tests::nested_declaration_extents_do_not_turn_body_text_into_definition_hits ... ok +test source_navigation::symbols::tests::noncanonical_header_identity_cannot_enter_through_query_metadata ... ok +test source_navigation::symbols::tests::path_identity_rejects_normalization_and_case_collisions ... ok +test source_navigation::symbols::tests::query_header_admission_preserves_uppercase_and_json_escape_bytes ... ok +test source_navigation::symbols::tests::repeated_live_uses_are_distinct_and_strings_comments_history_are_excluded ... ok +test source_navigation::symbols::tests::reused_alias_cannot_steal_old_identity_and_old_locations_are_stale ... ok +test source_navigation::symbols::tests::scope_provenance_and_detached_alias_collision_are_explicit ... ok +test source_navigation::symbols::tests::stopped_outline_is_not_a_successful_empty_query ... ok +test source_navigation::symbols::tests::truncated_or_gapped_tokens_refuse_even_when_project_scope_is_partial ... ok +test source_navigation::symbols::tests::unicode_path_collisions_match_core_lowercase_policy ... ok +test source_navigation::tests::search_uses_utf8_columns_wraps_and_refreshes_after_edits ... ok +test source_tree::tests::active_scroll_offset_uses_the_visible_order_and_retains_ancestor_context ... ok +test source_tree::tests::collapsed_folders_retain_active_dirty_and_diagnostic_markers ... ok +test source_tree::tests::deep_paths_build_expand_and_drop_on_a_small_stack ... ok +test source_tree::tests::detached_buffers_keep_paths_and_only_clean_buffers_are_closable ... ok +test source_tree::tests::exact_unicode_spaces_and_file_folder_name_collisions_are_not_normalized ... ok +test source_tree::tests::folders_are_compact_and_sorted_before_files_without_losing_duplicate_basenames ... ok +test source_workspace::tests::draft_history_budget_covers_inactive_files_without_discarding_drafts ... ok +test source_workspace::tests::fresh_session_cannot_reuse_a_retained_buffer_generation ... ok +test source_workspace::tests::navigation_revision_wrap_cannot_reuse_an_old_workspace_key ... ok +test source_workspace::tests::navigation_scope_changes_invalidate_without_changing_unchanged_positions ... ok +test source_workspace::tests::navigation_versions_distinguish_reopened_recovered_and_changed_drafts ... ok +test source_workspace::tests::switching_retains_invalid_drafts_and_independent_history ... ok +test tests::malformed_source_preserves_model_and_is_recoverable ... ok +test tests::opening_legacy_source_surfaces_report_without_modifying_original_bytes ... ok +test tests::pending_source_prevents_property_draft_collision_and_preserves_both_if_present ... ok +test tests::source_find_navigates_an_invalid_draft_without_applying_or_losing_it ... ok +test tests::source_navigation_waits_for_editor_layout_and_cancels_on_edit ... ok +test views::source_tests::source_editor_windows_menu_payload_is_inert_but_space_and_altgr_still_edit ... ok +test views::source_tests::source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds ... FAILED +test views::source_tests::source_header_remains_scrollable_and_preserves_offset_across_diagnostic_refresh ... ok +test workflow::transition_tests::basic_transition_explicit_destination_appends_below_existing_bounds_and_is_one_source_edit ... ok + +failures: + +---- views::source_tests::source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds stdout ---- + +thread 'views::source_tests::source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds' (6596) panicked at crates\oa-desktop\src\views.rs:1456:17: +assertion `left == right` failed + left: 243.70001 + right: 294.0 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + +failures: + views::source_tests::source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds + +test result: FAILED. 187 passed; 1 failed; 1 ignored; 0 measured; 562 filtered out; finished in 46.57s + +error: test failed, to rerun pass `-p oa-desktop --bin arcadia-studio` diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused5-status.json b/harness/experiments/text-navigation-native-20260911/corrections/focused5-status.json new file mode 100644 index 00000000..4754ab8f --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused5-status.json @@ -0,0 +1,18 @@ +{ + "started": "2026-09-11T19:35:53.3464146Z", + "finished": "2026-09-11T19:38:11.7593163Z", + "exitCode": 0, + "args": [ + "test", + "--locked", + "--offline", + "-p", + "oa-desktop", + "--bin", + "arcadia-studio", + "source_", + "--", + "--test-threads=1" + ], + "buildJobs": 1 +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/focused5.log b/harness/experiments/text-navigation-native-20260911/corrections/focused5.log new file mode 100644 index 00000000..395f0dcd --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/focused5.log @@ -0,0 +1,197 @@ + Compiling oa-desktop v0.2.0 (C:\Users\User\Documents\Git\ARCADIA-Studio\crates\oa-desktop) + Finished `test` profile [unoptimized] target(s) in 1m 35s + Running unittests src\main.rs (.local\target-gnullvm\debug\deps\arcadia_studio-58e30cee1fd51a8b.exe) + +running 189 tests +test app::behavior_lifecycle_tests::pending_behavior_blocks_source_creation_and_source_history_replay ... ok +test app::behavior_lifecycle_tests::source_writeback_failure_keeps_typed_behavior_form_for_repair_and_one_undo ... ok +test app::checkpoints::tests::home_resume_retains_invalid_source_and_property_drafts ... ok +test app::checkpoints::tests::walkthrough_request_keeps_unfinished_source_behind_the_normal_pending_guard ... ok +test app::direct_scenario_tests::direct_scenario_source_failure_and_navigation_keep_form_until_success ... ok +test app::hosted::tests::hosted_invalid_and_detached_source_drafts_never_start_network_writes ... ok +test app::hosted::tests::hosted_only_successful_source_save_as_changes_the_active_destination ... ok +test app::process_canvas::direct_process_dirty_source_blocks_canvas_creation_without_losing_text ... ok +test app::process_canvas::tests::direct_process_app_open_source_and_back_preserve_local_reference_identity ... ok +test app::process_canvas::tests::direct_process_app_source_failure_retains_form_then_commits_once_and_selects_occurrence ... ok +test app::process_canvas::tests::direct_process_app_stale_context_dirty_source_and_properties_never_mutate ... ok +test app::process_canvas::tests::direct_process_append_empty_first_second_exchange_has_exact_source_history ... ok +test app::review_navigation_tests::rejected_semantic_source_writeback_retains_review_camera_and_original_navigation ... ok +test app::save_as_tests::save_as_late_receipt_preserves_newer_raw_source_draft_and_destination ... ok +test app::source_project_tests::closed_detached_file_keeps_first_save_conflict_then_can_be_reloaded_fresh ... ok +test app::source_project_tests::inactive_invalid_draft_blocks_graphical_changes_and_diagnostic_switches_files ... ok +test app::source_project_tests::json_export_and_rejected_save_as_preserve_source_location_history_and_bytes ... ok +test app::source_project_tests::missing_include_open_keeps_old_model_and_can_be_repaired_and_saved ... ok +test app::source_project_tests::recovery_after_first_save_failure_retains_target_then_retries_without_reentering_path ... ok +test app::source_project_tests::recovery_of_previous_save_as_target_does_not_redirect_current_project ... ok +test app::source_project_tests::recovery_open_finds_first_save_journal_without_an_entry_file ... ok +test app::source_project_tests::recovery_target_survives_edit_lint_apply_and_rejected_recovery_until_success ... ok +test app::source_project_tests::source3_native_open_preserves_report_comments_nesting_and_save_reopen ... ok +test app::source_project_tests::two_file_apply_graphical_edit_exact_undo_save_as_and_reopen ... ok +test app::source_symbols::tests::back_after_origin_edit_uses_its_current_cursor_instead_of_the_old_range ... ok +test app::source_symbols::tests::back_keeps_the_latest_64_actual_locations_without_reusing_dropped_history ... ok +test app::source_symbols::tests::back_restores_exact_reversed_utf8_selection_and_crlf_source ... ok +test app::source_symbols::tests::captured_find_and_modal_escape_use_one_actual_subscription_and_preserve_pending_work ... ok +test app::source_symbols::tests::captured_subscription_does_not_duplicate_existing_behavior_or_architecture_routes ... ok +test app::source_symbols::tests::close_during_busy_hides_panel_and_completion_does_not_reopen_it ... ok +test app::source_symbols::tests::closed_results_stay_closed_on_exact_back_and_reopen_only_for_a_return_notice ... ok +test app::source_symbols::tests::completion_rejects_file_edit_session_cursor_interaction_and_raw_input_changes ... ok +test app::source_symbols::tests::detached_duplicate_requires_an_explicit_choice_even_when_included_source_is_validated ... ok +test app::source_symbols::tests::escape_dismisses_modal_before_underlying_source_results ... ok +test app::source_symbols::tests::escape_dismisses_results_and_cancels_busy_navigation_without_changing_sources ... ok +test app::source_symbols::tests::find_close_releases_removed_input_and_guarded_focus_respects_later_input ... ok +test app::source_symbols::tests::find_only_captured_escape_closes_once_and_preserves_raw_query_and_selection ... ok +test app::source_symbols::tests::invalid_unapplied_drafts_navigate_without_apply_or_losing_either_history ... ok +test app::source_symbols::tests::matching_reveal_ticket_is_required_and_raw_input_invalidates_pending_reveal ... ok +test app::source_symbols::tests::old_find_close_cannot_cancel_a_new_file_session_or_reopened_find_intent ... ok +test app::source_symbols::tests::old_symbol_widget_envelopes_after_file_switch_preserve_same_session_intent ... ok +test app::source_symbols::tests::old_symbol_widget_envelopes_after_reset_preserve_new_same_path_intent ... ok +test app::source_symbols::tests::reset_retains_worker_slot_until_old_completion_then_admits_new_session_query ... ok +test app::source_symbols::tests::saturated_raw_clock_never_authorizes_completion_or_reveal ... ok +test app::source_symbols::tests::source_symbols_100_modules_1000_definitions_10000_uses ... ignored, manual 100-module latency/process-memory trial; run alone with --ignored --nocapture --test-threads=1 +test app::source_symbols::tests::unknown_job_cannot_release_current_worker_and_old_duplicate_cannot_replace_new_results ... ok +test app::source_symbols::tests::valid_definition_and_reference_choice_keep_whole_model_and_source_unchanged ... ok +test app::state_diagram_tests::create_view_places_only_its_machine_and_restores_exact_source_in_one_undo ... ok +test app::state_diagram_tests::rejected_creation_keeps_source_and_selection_then_valid_owner_can_retry ... ok +test app::state_diagram_tests::state_diagram_routes_constructor_and_source_open_to_the_existing_workspace_without_edits ... ok +test app::transition_context_tests::rejected_source_writeback_keeps_review_and_navigation_and_invalid_draft_still_blocks_start ... ok +test app::view_copy_tests::copying_the_current_state_view_uses_its_own_identity_and_is_one_source_undo ... ok +test app::view_copy_tests::duplicate_rejection_preserves_an_incomplete_source_buffer ... ok +test behavior::contextual_source_tests::contextual_source_app_checkpoint_restores_inner_raw_draft_without_model_adoption ... ok +test behavior::contextual_source_tests::contextual_source_app_empty_actions_and_child_open_refuse_other_raw_editors ... ok +test behavior::contextual_source_tests::contextual_source_app_modal_escape_then_child_back_then_parent_cancel_preserve_accepted_source ... ok +test behavior::contextual_source_tests::contextual_source_back_remains_available_after_owner_deletion_and_with_dirty_editors ... ok +test behavior::contextual_source_tests::contextual_source_back_retains_parent_and_rejects_late_child_event ... ok +test behavior::contextual_source_tests::contextual_source_default_consumer_name_has_stable_alias_and_correlated_selection ... ok +test behavior::contextual_source_tests::contextual_source_deleted_owner_view_retains_draft_instead_of_panicking_or_using_fallback ... ok +test behavior::contextual_source_tests::contextual_source_empty_history_reports_no_change_and_success_requires_a_real_history_step ... ok +test behavior::contextual_source_tests::contextual_source_existing_choice_prunes_staged_dependency ... ok +test behavior::contextual_source_tests::contextual_source_failed_source_budget_preserves_both_drafts_and_accepted_bytes ... ok +test behavior::contextual_source_tests::contextual_source_incomplete_recovered_kind_reports_error_without_panicking ... ok +test behavior::contextual_source_tests::contextual_source_inserts_work_on_the_exact_guarded_link_and_refuses_exchange_identity_conflict ... ok +test behavior::contextual_source_tests::contextual_source_lifelines_stage_exact_separate_records_and_one_history_entry ... ok +test behavior::contextual_source_tests::contextual_source_machine_before_any_owner_creates_optional_view_atomically ... ok +test behavior::contextual_source_tests::contextual_source_mounted_small_editor_keeps_back_and_use_outside_field_scroll ... ok +test behavior::contextual_source_tests::contextual_source_nested_semantic_parent_is_explicit_and_revalidated ... ok +test behavior::contextual_source_tests::contextual_source_new_callee_lifeline_preserves_caller_bindings_as_an_explicit_warning ... ok +test behavior::contextual_source_tests::contextual_source_old_empty_action_cannot_open_a_previous_owner_or_layer ... ok +test behavior::contextual_source_tests::contextual_source_original_document_remains_bound_after_back_or_choosing_existing ... ok +test behavior::contextual_source_tests::contextual_source_owner_first_can_return_to_an_unnamed_machine_without_losing_source ... ok +test behavior::contextual_source_tests::contextual_source_recovery_keeps_inner_raw_fields_and_refuses_deleted_or_changed_owner ... ok +test behavior::contextual_source_tests::contextual_source_second_system_and_role_machine_owner_refuse_without_fallback ... ok +test behavior::contextual_source_tests::contextual_source_work_uses_reserved_contribution_and_link_ids_and_one_undo ... ok +test behavior::creation::app_tests::app_new_never_auto_applies_valid_or_invalid_property_and_source_drafts ... ok +test behavior::creation::tests::all_four_viewpoints_are_explicit_and_survive_source_history_reopen ... ok +test behavior::creation::tests::rejected_source_transaction_keeps_draft_and_every_accepted_source_byte ... ok +test behavior::scenario::direct_tests::direct_clicked_occurrences_use_root_and_operand_slots_with_exact_source_history ... ok +test behavior::scenario::direct_tests::direct_middle_pair_insertion_is_one_exact_source_and_model_undo ... ok +test behavior::scenario::tests::graphical_call_reply_is_atomic_correlated_and_source_equivalent ... ok +test behavior::source_draft::layout_tests::contextual_source_layout_initial_essentials_fit_short_composed_host_with_real_paragraphs ... ok +test behavior::source_draft::layout_tests::contextual_source_layout_long_parent_wraps_after_visible_name_without_losing_raw_data ... ok +test behavior::source_draft::layout_tests::contextual_source_layout_visible_kind_click_keeps_choice_explicit_and_name_input_works ... ok +test behavior::state_edit::tests::view_initializes_only_its_machine_in_one_source_and_model_history_entry ... ok +test behavior::topology::contextual::tests::qualified_link_gui_repeated_sources_remain_distinct_and_apply_has_exact_source_history ... ok +test behavior::topology::direct_tests::direct_process_nested_source_reopen_and_api_command_use_one_transaction ... ok +test behavior::topology::tests::guarded_branch_is_one_transaction_with_distinct_source_identities ... ok +test connection_tool::tests::direct_connections_share_exact_source_history_and_model_parity ... ok +test diagram::lifecycle_tests::middle_and_arrow_panning_preserve_source_and_history ... ok +test diagram::lifecycle_tests::motion_after_source_click_release_must_not_create_connection ... ok +test diagram::pointer_tests::coalesced_fe_ports_commit_once_through_app_and_source_history ... ok +test diagram::pointer_tests::coalesced_port_drag_commits_once_through_app_and_source_history ... ok +test diagram::pointer_tests::drag_from_already_selected_stationary_port_keeps_source_between_batches ... ok +test document::save_as_tests::save_as_preserves_explicit_source_entry_changes_in_history ... ok +test document::tests::nested_cross_file_reparent_and_source_edit_share_exact_history ... ok +test document::tests::no_op_command_or_source_apply_preserves_history_revision_and_redo ... ok +test document::tests::omitted_id_stabilization_remains_dirty_until_exact_source_is_saved ... ok +test document::tests::recreated_equal_record_does_not_inherit_deleted_source_ownership ... ok +test forms::history_fields::tests::history_every_descriptor_fact_choice_matches_actual_closed_types_and_source_contract ... ok +test hosted::client::tests::hosted_publication_retains_known_resource_after_failed_followup ... ok +test model_menu::tests::add_bend_here_uses_context_point_and_one_source_aware_history_change ... ok +test model_menu::tests::pending_source_allows_file_navigation_but_disables_model_actions ... ok +test recovery::source7_tests::source7_legacy_profiles_preserve_dirty_source_property_and_behavior_raw_fields ... ok +test recovery::tests::exact_source_and_unfinished_invalid_buffers_restore_without_model_overwrite ... ok +test semantic_review::artifacts_tests::artifact_creation_and_identified_source_deletion_follow_core_metadata_and_history_boundary_both_directions ... ok +test semantic_review::artifacts_tests::artifact_metadata_apply_and_exact_history_reset_are_one_source_preserving_undo_redo ... ok +test semantic_review::artifacts_tests::artifact_moved_source_absence_deletes_but_destination_only_take_retains_both_directions ... ok +test semantic_review::attachments::tests::attachment_apply_is_one_exact_source_and_history_undo_redo ... ok +test semantic_review::attachments::tests::functional_incident_source_requires_explicit_matching_port_review_in_one_atomic_candidate ... ok +test semantic_review::attachments::tests::source_only_absence_and_explicit_absent_endpoint_are_different ... ok +test semantic_review::batch_tests::batch_apply_is_one_exact_source_and_history_undo_redo_roundtrip ... ok +test semantic_review::constructor_tests::scenario_use_group_takes_typed_binding_references_and_preserves_source_text_both_directions ... ok +test semantic_review::keyed_rows_tests::keyed_rows_distinguish_unpaired_source_from_explicit_absence_and_require_exact_reset ... ok +test semantic_review::keyed_rows_tests::row_review_apply_preserves_exact_source_and_semantic_history_through_undo_redo ... ok +test semantic_review::keyed_tests::deleted_member_source_observation_removes_only_mapped_membership_both_directions ... ok +test semantic_review::keyed_tests::exact_reset_only_is_one_history_source_transaction_and_undo_redo_both_directions ... ok +test semantic_review::keyed_tests::stale_or_source_failed_reset_and_membership_apply_retain_exact_choices ... ok +test semantic_review::message_kind_tests::message_group_rejects_protected_edits_stale_plan_and_source_failure_without_losing_timer ... ok +test semantic_review::message_kind_tests::message_group_take_full_timer_and_scalar_candidate_are_one_source_history_change_both_directions ... ok +test semantic_review::ordered_tests::ordered_review_apply_is_exact_source_history_transaction_with_reopen_and_undo_redo ... ok +test semantic_review::ordered_tests::several_incoming_members_follow_source_order_despite_independent_identity_sorting ... ok +test semantic_review::tests::scalar_keep_take_candidate_commit_exact_source_and_history_in_both_directions ... ok +test semantic_review::tests::stale_plan_and_source_writeback_failure_do_not_lose_decisions_or_history ... ok +test source_navigation::interaction::tests::captured_find_click_invalidates_without_app_message_and_preserves_focus ... ok +test source_navigation::interaction::tests::focus_rechecks_clock_between_inspection_and_application_and_missing_target_is_inert ... ok +test source_navigation::interaction::tests::raw_navigation_inputs_advance_but_passive_geometry_does_not_and_exhaustion_refuses ... ok +test source_navigation::query::tests::comments_strings_and_comment_gap_are_not_navigation_hits ... ok +test source_navigation::query::tests::detached_alias_and_identity_collisions_never_auto_select ... ok +test source_navigation::query::tests::dirty_but_parseable_text_has_current_names_and_no_validated_fallback ... ok +test source_navigation::query::tests::exact_multifile_unicode_crlf_definition_and_repeated_lexical_references ... ok +test source_navigation::query::tests::exact_snapshot_readback_rejects_same_key_byte_membership_and_evidence_changes ... ok +test source_navigation::query::tests::include_cycle_depth_and_aggregate_edges_are_explicit_partial_outcomes ... ok +test source_navigation::query::tests::invalid_include_syntax_never_borrows_the_old_reachable_file_set ... ok +test source_navigation::query::tests::keyword_alias_and_loaded_path_case_collisions_use_reviewed_index_rules ... ok +test source_navigation::query::tests::large_display_name_cannot_escape_the_owned_row_string_budget ... ok +test source_navigation::query::tests::missing_and_noncanonical_authored_ids_remain_draft_spans_without_generated_anchors ... ok +test source_navigation::query::tests::missing_include_partial_scope_does_not_resurrect_witness_text ... ok +test source_navigation::query::tests::omitted_rows_are_counted_before_result_allocation_and_never_confer_uniqueness ... ok +test source_navigation::query::tests::owned_request_checks_raw_limits_immediately_and_extracts_only_on_worker ... ok +test source_navigation::query::tests::owned_request_moves_exact_text_into_worker_snapshot_and_matches_sync_results ... ok +test source_navigation::query::tests::owned_validation_proof_preserves_full_witness_count_and_partial_scope ... ok +test source_navigation::query::tests::raw_aggregate_limits_refuse_before_outline_or_copied_snapshot ... ok +test source_navigation::query::tests::sole_detached_candidate_and_unapplied_equal_bytes_require_choice ... ok +test source_navigation::query::tests::token_declaration_and_live_reference_limits_are_aggregate_not_per_file ... ok +test source_navigation::query::tests::validation_witness_must_match_entry_and_complete_included_file_set ... ok +test source_navigation::symbols::tests::admitted_unicode_path_budget_keeps_original_policy_after_single_fold ... ok +test source_navigation::symbols::tests::comment_separated_reference_keeps_crlf_unicode_and_disjoint_hit_spans ... ok +test source_navigation::symbols::tests::declaration_order_and_duplicate_roles_refuse_instead_of_corrupting_hit_search ... ok +test source_navigation::symbols::tests::detached_uuid_clone_disables_anchor_even_for_included_query ... ok +test source_navigation::symbols::tests::duplicate_aliases_are_candidates_without_false_reference_attribution ... ok +test source_navigation::symbols::tests::every_budget_admits_boundary_and_returns_no_index_one_below ... ok +test source_navigation::symbols::tests::header_metadata_must_match_current_token_boundaries_and_authored_id ... ok +test source_navigation::symbols::tests::incomplete_draft_is_lexical_and_error_token_does_not_leak_references ... ok +test source_navigation::symbols::tests::legal_keyword_classified_alias_is_not_discarded ... ok +test source_navigation::symbols::tests::missing_ids_produce_only_current_snapshot_locations_without_stabilization ... ok +test source_navigation::symbols::tests::nested_declaration_extents_do_not_turn_body_text_into_definition_hits ... ok +test source_navigation::symbols::tests::noncanonical_header_identity_cannot_enter_through_query_metadata ... ok +test source_navigation::symbols::tests::path_identity_rejects_normalization_and_case_collisions ... ok +test source_navigation::symbols::tests::query_header_admission_preserves_uppercase_and_json_escape_bytes ... ok +test source_navigation::symbols::tests::repeated_live_uses_are_distinct_and_strings_comments_history_are_excluded ... ok +test source_navigation::symbols::tests::reused_alias_cannot_steal_old_identity_and_old_locations_are_stale ... ok +test source_navigation::symbols::tests::scope_provenance_and_detached_alias_collision_are_explicit ... ok +test source_navigation::symbols::tests::stopped_outline_is_not_a_successful_empty_query ... ok +test source_navigation::symbols::tests::truncated_or_gapped_tokens_refuse_even_when_project_scope_is_partial ... ok +test source_navigation::symbols::tests::unicode_path_collisions_match_core_lowercase_policy ... ok +test source_navigation::tests::search_uses_utf8_columns_wraps_and_refreshes_after_edits ... ok +test source_tree::tests::active_scroll_offset_uses_the_visible_order_and_retains_ancestor_context ... ok +test source_tree::tests::collapsed_folders_retain_active_dirty_and_diagnostic_markers ... ok +test source_tree::tests::deep_paths_build_expand_and_drop_on_a_small_stack ... ok +test source_tree::tests::detached_buffers_keep_paths_and_only_clean_buffers_are_closable ... ok +test source_tree::tests::exact_unicode_spaces_and_file_folder_name_collisions_are_not_normalized ... ok +test source_tree::tests::folders_are_compact_and_sorted_before_files_without_losing_duplicate_basenames ... ok +test source_workspace::tests::draft_history_budget_covers_inactive_files_without_discarding_drafts ... ok +test source_workspace::tests::fresh_session_cannot_reuse_a_retained_buffer_generation ... ok +test source_workspace::tests::navigation_revision_wrap_cannot_reuse_an_old_workspace_key ... ok +test source_workspace::tests::navigation_scope_changes_invalidate_without_changing_unchanged_positions ... ok +test source_workspace::tests::navigation_versions_distinguish_reopened_recovered_and_changed_drafts ... ok +test source_workspace::tests::switching_retains_invalid_drafts_and_independent_history ... ok +test tests::malformed_source_preserves_model_and_is_recoverable ... ok +test tests::opening_legacy_source_surfaces_report_without_modifying_original_bytes ... ok +test tests::pending_source_prevents_property_draft_collision_and_preserves_both_if_present ... ok +test tests::source_find_navigates_an_invalid_draft_without_applying_or_losing_it ... ok +test tests::source_navigation_waits_for_editor_layout_and_cancels_on_edit ... ok +test views::source_tests::source_editor_windows_menu_payload_is_inert_but_space_and_altgr_still_edit ... ok +test views::source_tests::source_header_keeps_editor_bounds_stable_through_lint_and_find_rebuilds ... ok +test views::source_tests::source_header_remains_scrollable_and_preserves_offset_across_diagnostic_refresh ... ok +test workflow::transition_tests::basic_transition_explicit_destination_appends_below_existing_bounds_and_is_one_source_edit ... ok + +test result: ok. 188 passed; 0 failed; 1 ignored; 0 measured; 562 filtered out; finished in 41.73s + diff --git a/harness/experiments/text-navigation-native-20260911/corrections/independent-review1.md b/harness/experiments/text-navigation-native-20260911/corrections/independent-review1.md new file mode 100644 index 00000000..52a72150 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/independent-review1.md @@ -0,0 +1,34 @@ +# Independent review of Text native corrections, inputs1 + +Codex-9e8r6t /root/release_audit, 2026-09-11. Read-only source review against HEAD fb16c420 and the frozen inputs1 archive SHA256 026cb5d112cbcb70e4690ab831a77e17906db329267df21423b7973f71774c36. Read Gitea #6 through comment 484 and the four-file diff. All four inspected raw hashes matched inputs1.json. No compiler, test execution, native input or production edit by this reviewer. Root reports the initial wrapper failed on PowerShell native stderr handling; this review claims no corrected gate pass. + +## Actionable finding: stale Find Close gains current-context focus + +At views.rs:1023, Find Close still emits the unscoped Message::SourceNavigation(Event::Close). At app.rs:3035-3040 it closes whichever Find is now open and calls restore_source_editor_focus. Unlike SourceSymbols, it bypasses the emitting-session/path check at app.rs:1109-1113. The helper (app/source_symbols.rs:137-144) captures the current context and raw clock, so its later guards cannot recognize that the initiating Close came from an older view. + +Counterexample: retain A's Close event; switch/reset to B, open Find and enter a new query; deliver A's event. It closes B's Find and queues a B focus ticket. The same path also needs a Close/reopen instance boundary. This is a verified source path, not a new native reproduction. Existing unscoped dismissal predates this patch; the additional editor-focus effect is new. + +Recommended narrow correction: stamp only the Find Close UI action with emitting workspace session, path and Find-open instance, reject mismatches before source_interaction, and retain the ordinary current Close path. Root accepted this finding and requested implementation by behavior_audit; no corrected version is included in this review. Regression controls should preserve the newly opened Find/query, existing reveal and interaction token, cursor, exact raw files and accepted snapshot on wrong workspace/path or old same-path instance. Current Close must still work. + +## Inspected corrections and evaluator limits + +* **Stable editor boundary:** source_layout at views.rs:1214 reserves the existing bounded header height and leaves overflow scrollable. The actual source view calls this helper, so this is a small, maintainable correction to the native diagnostic jump without retaining misleading stale diagnostics. The test at :1421 uses that production layout helper with real Iced Paragraph/Editor geometry and repeated tree diffs. It meaningfully verifies the boundary invariant; the header contents in mounted_source (:1354) are a separate simplified fixture, not the actual App header. It therefore does not prove real minimum-window toolbar reachability, full App editor height, diagnostic button hit routing or font readability. The scroll test (:1471) proves actual overflow and retained offset for six to seven diagnostics, both at the same capped inner height; it does not claim offset preservation through zero diagnostics or a shrinking scroll range. Native minimum-height lint-clear/refill and next-click confirmation remain required. + +* **Back:** app/source_symbols.rs:189-195 retains closed results after an exact successful return and opens only for a notice. The test at app/source_symbols/tests.rs:481 covers exact cursor return, changed-origin notice and empty history, preserving accepted/raw/model history. No additional finding in this path. + +* **Removed Find focus:** app.rs:1057-1064 extends the existing single captured bridge, retains architecture exclusion and ordinary modal priority. Close/Escape first removes Find, queues a reveal, and the changed sensor ticket causes a viewport message after rebuilding. Thus the originating focused Find is absent when guarded_focus scans the current tree; it does not silently veto normal restoration merely because it was focused before Close. The test at app/source_symbols/tests.rs:549 explicitly removes and diffs the old focused input before running the real viewport task/operation chain. Its target is a TextInput substitute with the actual editor ID, so this is operation/tree-lifetime evidence, not a full App/editor native test. A later focused widget vetoes the operation even without a clock change, and raw input is checked again at operation execution. Modal dismissal exits before requesting editor focus. No new unconditional focus operation was introduced. + +* **Raw-input controls:** the new mounted focus test combines later focus with the incremented-clock variant; that variant alone does not isolate the clock from the foreign-focus veto. Existing interaction tests are the separate primitive coverage. Retain a no-foreign-focus, clock-advanced control when claiming this specific end-to-end race. This is evaluator scope, not an established production defect. + +* **Windows Alt+Space:** views.rs:1237-1249 excludes only focused Windows events whose modifiers are exactly ALT and whose logical key is named/character Space. Ordinary Space, Ctrl+Alt input, shifted input and non-Windows defaults remain delegated. The mounted real-editor test (:1524) verifies supplied key payloads produce no SourceEdit for the two guarded variants and exact insertion for ordinary/international controls. It also establishes that the default binding would insert those payloads. It does not observe Windows event delivery and cannot establish that the delayed post-menu insertion uses those modifiers/logical keys. Native Alt+Space, Escape, subsequent neutral click, settled frames and exact raw-file checks are still mandatory; preserve the earlier immediate-clean counterevidence. + +## Frozen raw identities + +| Path under crates/oa-desktop/src | SHA256 | +| --- | --- | +| app.rs | 280b7080b5f940feb5d31d8b453168930e6f34c400dfc37f473756388b93d448 | +| views.rs | 1dae1d05a1b93cbb33f7d4fd941f01ff971b9b2f1c3eaecfd3e885c871168a42 | +| app/source_symbols.rs | 4766bc70ef2e163497fc1f48180d2598e77d85b5331617777b5afa93da3939e8 | +| app/source_symbols/tests.rs | 8babf11d897053eba7db7c4a2342aade8ac41b3a0cdd8b96f17b7537c9c067da | + +Disposition: correct the scoped Find Close replay before acceptance. No other actionable production defect established within this four-file review. All synthetic/inspection evidence remains distinct from a corrected Windows native pass. diff --git a/harness/experiments/text-navigation-native-20260911/corrections/independent-review2.md b/harness/experiments/text-navigation-native-20260911/corrections/independent-review2.md new file mode 100644 index 00000000..c4f5505d --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/independent-review2.md @@ -0,0 +1,28 @@ +# Find Close replay correction: narrow closure review + +Codex-9e8r6t /root/release_audit, 2026-09-11. READY for the producer's next frozen gate. This is source inspection, not a test/build/native pass. No production edits or compiler/native actions by this reviewer. Review1 remains the historical inputs1 finding and broader evaluator limitations. + +The four current raw hashes were measured and match the supplied freeze: + +| Path under crates/oa-desktop/src | SHA256 | +| --- | --- | +| app.rs | 411007F8C192E0FC581F3C6BCFC49AB46B900A841EE20AE96203D4DB64C9280F | +| views.rs | 32A4176305052CAEB3520C647EB9E981EBE702EE3099B2F1036037136FCD58BB | +| app/source_symbols.rs | 99370865B548B28F32F4C6CE7E9F8EEAA0C80268A644F2EBCC4BD1E11695E59C | +| app/source_symbols/tests.rs | 33292A7CE9B61DBC134F74372CAA93AF9704E2F968CD698DA13EA6A1B8CF3EA6 | + +## Closure + +At app.rs:1111-1128, SourceFindClose validates emitting workspace session/path, per-Open instance, currently open Find and source_navigation_available before source_interaction. Only a valid envelope is translated into the existing Close handler. An incoming bare SourceNavigation(Event::Close) returns immediately. The private handler also defensively refuses an untranslated SourceFindClose at :2999. + +The instance is initialized independently at :608, renewed through reset's fresh App construction (:938), and regenerated on every handled Find/Go-to Open (:3048). Thus an old same-path Close cannot dismiss a later opening. The helper at app/source_symbols.rs:45 captures the current session/path/instance; the actual Close button at views.rs:1023 uses it. A repository Rust search found no other live emitter of bare Find Close: remaining occurrences are the checked translation, refusal branch and negative test. Other legacy Find actions are intentionally unchanged. + +The unavailable/modal boundary also returns before changing interaction, query, reveal or focus state. This follows directly from the early source_navigation_available check, which includes page, busy, pending/file/delete/workflow/hosted/model-menu/architecture/behavior guards. Ordinary Escape retains its existing modal-first path. No new asynchronous unconditional focus operation is introduced. + +## Regression assessment + +The new test at app/source_symbols/tests.rs:549 exercises actual reset, active-file change, and same-path Close/reopen. For reset/file change, it additionally combines the *current* instance with the *old* context; therefore token mismatch alone cannot satisfy the session/path expectations. Same-path reopening isolates the instance boundary. Bare legacy Close is explicitly included among rejected inputs. The existing stale-state assertion snapshots interaction/raw clock, request, worker slot, reveal, cursor, raw bundle, accepted snapshot and history before dispatch; the new test additionally asserts Find open/query/instance. It checks both pending and completed query states, then demonstrates current Close still queues a reveal and restores the unchanged cursor. + +The mounted removed-input test at :626 now emits the valid envelope for Close. It retains the independent widget-tree focus observation: the originating Find is actually removed before running the real viewport focus task, and later foreign focus wins. No test was executed by this review. The new stale regression does not itself enumerate every modal/unavailable flag; those refusals are verified source logic, and existing modal Escape tests remain separate evidence. + +No remaining actionable defect established within this closure. The earlier geometry-fixture and Windows OS-event limitations remain: these source changes do not substitute for corrected native minimum-window lint/click and delayed Alt+Space trials. Ready was sent directly to root and behavior_audit before final capture/gates. diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs1-readback.json b/harness/experiments/text-navigation-native-20260911/corrections/inputs1-readback.json new file mode 100644 index 00000000..0c580cfb --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/inputs1-readback.json @@ -0,0 +1,7 @@ +{ + "atUtc": "2026-09-11T19:19:01.914478+00:00", + "changed": [], + "added": [], + "removed": [], + "passed": true +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs1.json b/harness/experiments/text-navigation-native-20260911/corrections/inputs1.json new file mode 100644 index 00000000..4f2bd1cb --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/inputs1.json @@ -0,0 +1,2504 @@ +{ + "atUtc": "2026-09-11T19:12:56.882369+00:00", + "head": "fb16c4200fa7a04bb7295134e3a528322684053d", + "branch": "codex/release1-9e8r6t", + "scope": "Exact Windows gate source inputs; no compiler or native result implied.", + "archiveSha256": "026cb5d112cbcb70e4690ab831a77e17906db329267df21423b7973f71774c36", + "files": [ + { + "path": "Cargo.lock", + "bytes": 119453, + "sha256": "2b960242c33eb839ff008d01731f6d5cdb4e047ca8cd6e13151cbf9c09913510" + }, + { + "path": "Cargo.toml", + "bytes": 400, + "sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62" + }, + { + "path": "crates/oa-cli/Cargo.toml", + "bytes": 279, + "sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde" + }, + { + "path": "crates/oa-cli/src/lib.rs", + "bytes": 15498, + "sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc" + }, + { + "path": "crates/oa-cli/src/main.rs", + "bytes": 2984, + "sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb" + }, + { + "path": "crates/oa-cli/tests/source_cli.rs", + "bytes": 16600, + "sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8" + }, + { + "path": "crates/oa-core/Cargo.toml", + "bytes": 342, + "sha256": "64824ec447be777841a972bf06c894ef2624a37e4725583bcfe0389deb9f00a3" + }, + { + "path": "crates/oa-core/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-core/examples/generate_demo.rs", + "bytes": 795, + "sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661" + }, + { + "path": "crates/oa-core/examples/generate_release1.rs", + "bytes": 1798, + "sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5" + }, + { + "path": "crates/oa-core/examples/release_dense_views.rs", + "bytes": 14664, + "sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412" + }, + { + "path": "crates/oa-core/examples/routing_workshop.rs", + "bytes": 17248, + "sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7" + }, + { + "path": "crates/oa-core/src/data.rs", + "bytes": 42696, + "sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a" + }, + { + "path": "crates/oa-core/src/demo.rs", + "bytes": 20657, + "sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c" + }, + { + "path": "crates/oa-core/src/language.rs", + "bytes": 105312, + "sha256": "34cbb144a111e6f0ddadfca7d40636a8e3323fe65ea8920fd2402f0352b41f57" + }, + { + "path": "crates/oa-core/src/language/semantic_source.rs", + "bytes": 7326, + "sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29" + }, + { + "path": "crates/oa-core/src/language_nesting_tests.rs", + "bytes": 20639, + "sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b" + }, + { + "path": "crates/oa-core/src/language_outline_tests.rs", + "bytes": 14877, + "sha256": "4c79a01e8aea243dd9ef66ce71b9fae263d0e79c319a46c51223679897e8b9df" + }, + { + "path": "crates/oa-core/src/lib.rs", + "bytes": 523, + "sha256": "52cb6ee7a4ffc00711ecf121c1a1b14ca154863f7ca27b0d2a8e239edce8aca7" + }, + { + "path": "crates/oa-core/src/migration_v2/README.md", + "bytes": 1515, + "sha256": "fb61d3faa33d7bdfba73415415a0882c0fbd3e0b45df42f972a19aec6da927b9" + }, + { + "path": "crates/oa-core/src/migration_v2/adapter.rs", + "bytes": 9490, + "sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5" + }, + { + "path": "crates/oa-core/src/migration_v2/mod.rs", + "bytes": 1158, + "sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9" + }, + { + "path": "crates/oa-core/src/migration_v2/model.rs", + "bytes": 52059, + "sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb" + }, + { + "path": "crates/oa-core/src/migration_v2/references.rs", + "bytes": 13369, + "sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20" + }, + { + "path": "crates/oa-core/src/migration_v2/source.rs", + "bytes": 21946, + "sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6" + }, + { + "path": "crates/oa-core/src/migration_v2/state_validation.rs", + "bytes": 15769, + "sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0" + }, + { + "path": "crates/oa-core/src/migration_v2/transitions.rs", + "bytes": 704, + "sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1" + }, + { + "path": "crates/oa-core/src/migration_v2/validation.rs", + "bytes": 98736, + "sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780" + }, + { + "path": "crates/oa-core/src/migration_v3/README.md", + "bytes": 2128, + "sha256": "3755a63f840d7f0eadf68afa7a9d587877a9468ff982d3610539e8a0bb067a82" + }, + { + "path": "crates/oa-core/src/migration_v3/mod.rs", + "bytes": 23023, + "sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722" + }, + { + "path": "crates/oa-core/src/migration_v4.rs", + "bytes": 4020, + "sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70" + }, + { + "path": "crates/oa-core/src/model.rs", + "bytes": 66352, + "sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb" + }, + { + "path": "crates/oa-core/src/operations.rs", + "bytes": 11405, + "sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41" + }, + { + "path": "crates/oa-core/src/persistence.rs", + "bytes": 31774, + "sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14" + }, + { + "path": "crates/oa-core/src/ports.rs", + "bytes": 45413, + "sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80" + }, + { + "path": "crates/oa-core/src/projection.rs", + "bytes": 21374, + "sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b" + }, + { + "path": "crates/oa-core/src/projection/port_layout.rs", + "bytes": 13474, + "sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079" + }, + { + "path": "crates/oa-core/src/projection/state.rs", + "bytes": 5233, + "sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28" + }, + { + "path": "crates/oa-core/src/references.rs", + "bytes": 21957, + "sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb" + }, + { + "path": "crates/oa-core/src/routing.rs", + "bytes": 50309, + "sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080" + }, + { + "path": "crates/oa-core/src/semantic.rs", + "bytes": 540, + "sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239" + }, + { + "path": "crates/oa-core/src/semantic/catalog.rs", + "bytes": 49407, + "sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4" + }, + { + "path": "crates/oa-core/src/semantic/historical.rs", + "bytes": 15271, + "sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb" + }, + { + "path": "crates/oa-core/src/semantic/linked.rs", + "bytes": 6035, + "sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2" + }, + { + "path": "crates/oa-core/src/semantic/mutate.rs", + "bytes": 22683, + "sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d" + }, + { + "path": "crates/oa-core/src/semantic/review.rs", + "bytes": 51116, + "sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e" + }, + { + "path": "crates/oa-core/src/semantic/types.rs", + "bytes": 10405, + "sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb" + }, + { + "path": "crates/oa-core/src/session.rs", + "bytes": 35237, + "sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00" + }, + { + "path": "crates/oa-core/src/source_files.rs", + "bytes": 74803, + "sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683" + }, + { + "path": "crates/oa-core/src/source_project.rs", + "bytes": 61843, + "sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466" + }, + { + "path": "crates/oa-core/src/source_project/source_migration.rs", + "bytes": 4700, + "sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95" + }, + { + "path": "crates/oa-core/src/source_project/source_structure.rs", + "bytes": 20225, + "sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f" + }, + { + "path": "crates/oa-core/src/state_validation.rs", + "bytes": 15665, + "sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18" + }, + { + "path": "crates/oa-core/src/topology_context.rs", + "bytes": 13734, + "sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d" + }, + { + "path": "crates/oa-core/src/topology_context/analysis.rs", + "bytes": 20036, + "sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65" + }, + { + "path": "crates/oa-core/src/topology_context/analysis_tests.rs", + "bytes": 5258, + "sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56" + }, + { + "path": "crates/oa-core/src/transitions.rs", + "bytes": 51998, + "sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d" + }, + { + "path": "crates/oa-core/src/transitions/communication.rs", + "bytes": 8634, + "sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028" + }, + { + "path": "crates/oa-core/src/validation.rs", + "bytes": 112792, + "sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e" + }, + { + "path": "crates/oa-core/src/validation/coverage.rs", + "bytes": 6478, + "sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f" + }, + { + "path": "crates/oa-core/src/view_options.rs", + "bytes": 24481, + "sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208" + }, + { + "path": "crates/oa-core/src/view_options_tests.rs", + "bytes": 21433, + "sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208" + }, + { + "path": "crates/oa-core/tests/communication_boundary_scenarios.rs", + "bytes": 8816, + "sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b" + }, + { + "path": "crates/oa-core/tests/communication_means.rs", + "bytes": 18102, + "sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4" + }, + { + "path": "crates/oa-core/tests/coverage_diagnostics.rs", + "bytes": 20527, + "sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.arcadia", + "bytes": 29220, + "sha256": "f0df129c1914bfc01d0b047b0cd4b520d8cf0c249ea9ced085de400c0be87ff3" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.json", + "bytes": 43990, + "sha256": "3ed53508eb544bbd788832f7bebea2ec31b3d66191f24f45098cc9750ec4c005" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.arcadia", + "bytes": 2450, + "sha256": "305f19d1b79f99f8d4cf627ba2e9ca6836bb7959cc0070227815937a699eafea" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.json", + "bytes": 8240, + "sha256": "1b41299c53204e6232397d25a58d5bccdbbc16e770c75e8edb55ce36ccfe58a2" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.arcadia", + "bytes": 1222, + "sha256": "5fa53a26a5ad010c8e59eb56d9b2b52003569e66c0377ffb58840590168ad0c1" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.json", + "bytes": 1734, + "sha256": "2808088afcc165f4bd6da5129151143411c997041c3de61d600ab76e05d24a47" + }, + { + "path": "crates/oa-core/tests/language.rs", + "bytes": 56482, + "sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e" + }, + { + "path": "crates/oa-core/tests/port_anchors.rs", + "bytes": 26893, + "sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa" + }, + { + "path": "crates/oa-core/tests/port_migration.rs", + "bytes": 15620, + "sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7" + }, + { + "path": "crates/oa-core/tests/port_source.rs", + "bytes": 4858, + "sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12" + }, + { + "path": "crates/oa-core/tests/prepared_commands.rs", + "bytes": 9555, + "sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b" + }, + { + "path": "crates/oa-core/tests/process_diagnostics.rs", + "bytes": 1104, + "sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906" + }, + { + "path": "crates/oa-core/tests/r3_constructor_ack.rs", + "bytes": 24163, + "sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0" + }, + { + "path": "crates/oa-core/tests/r3_migration.rs", + "bytes": 6590, + "sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd" + }, + { + "path": "crates/oa-core/tests/r3_semantic.rs", + "bytes": 77473, + "sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32" + }, + { + "path": "crates/oa-core/tests/r3_source.rs", + "bytes": 15311, + "sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408" + }, + { + "path": "crates/oa-core/tests/r6_data.rs", + "bytes": 41437, + "sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155" + }, + { + "path": "crates/oa-core/tests/r6_migration.rs", + "bytes": 9174, + "sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1" + }, + { + "path": "crates/oa-core/tests/r6_source.rs", + "bytes": 9519, + "sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6" + }, + { + "path": "crates/oa-core/tests/release1_teaching.rs", + "bytes": 10010, + "sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2" + }, + { + "path": "crates/oa-core/tests/release_capabilities.rs", + "bytes": 19422, + "sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30" + }, + { + "path": "crates/oa-core/tests/release_diagrams.rs", + "bytes": 7689, + "sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d" + }, + { + "path": "crates/oa-core/tests/release_language_limits.rs", + "bytes": 5204, + "sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806" + }, + { + "path": "crates/oa-core/tests/release_ports.rs", + "bytes": 32740, + "sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1" + }, + { + "path": "crates/oa-core/tests/release_routing.rs", + "bytes": 23165, + "sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462" + }, + { + "path": "crates/oa-core/tests/release_scenarios.rs", + "bytes": 41067, + "sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f" + }, + { + "path": "crates/oa-core/tests/release_states.rs", + "bytes": 26873, + "sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811" + }, + { + "path": "crates/oa-core/tests/release_topology.rs", + "bytes": 17643, + "sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9" + }, + { + "path": "crates/oa-core/tests/review_regressions.rs", + "bytes": 21823, + "sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1" + }, + { + "path": "crates/oa-core/tests/route_source.rs", + "bytes": 7270, + "sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb" + }, + { + "path": "crates/oa-core/tests/routing_geometry.rs", + "bytes": 31890, + "sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3" + }, + { + "path": "crates/oa-core/tests/routing_labels.rs", + "bytes": 5530, + "sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6" + }, + { + "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs", + "bytes": 4640, + "sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a" + }, + { + "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs", + "bytes": 14957, + "sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970" + }, + { + "path": "crates/oa-core/tests/source6_view_contract.rs", + "bytes": 14307, + "sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb" + }, + { + "path": "crates/oa-core/tests/source7_contract.rs", + "bytes": 43262, + "sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f" + }, + { + "path": "crates/oa-core/tests/source_files.rs", + "bytes": 13168, + "sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9" + }, + { + "path": "crates/oa-core/tests/source_identity_updates.rs", + "bytes": 5139, + "sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c" + }, + { + "path": "crates/oa-core/tests/source_nested_updates.rs", + "bytes": 16892, + "sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855" + }, + { + "path": "crates/oa-core/tests/source_project.rs", + "bytes": 45910, + "sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942" + }, + { + "path": "crates/oa-core/tests/state_diagrams.rs", + "bytes": 23973, + "sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5" + }, + { + "path": "crates/oa-core/tests/workflows.rs", + "bytes": 33426, + "sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b" + }, + { + "path": "crates/oa-desktop/Cargo.toml", + "bytes": 842, + "sha256": "f3547b2b924d5db6706c0a8e069014b440ff65315d82fc8aced0360af4b3cdc9" + }, + { + "path": "crates/oa-desktop/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 213772, + "sha256": "280b7080b5f940feb5d31d8b453168930e6f34c400dfc37f473756388b93d448" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring.rs", + "bytes": 27835, + "sha256": "37c7db33e99dd4adcc5a51f09ee4878af94fd32413359890a541690080885f65" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/palette.rs", + "bytes": 8887, + "sha256": "8f9937cb30b48b83759fd084a8a5990a2daa3920280f1210abe048560241985a" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/tests.rs", + "bytes": 14732, + "sha256": "ed864839940a1910c97537b6ee151b57ab115ece6f60bae602552b84f9af4a5d" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring_tests.rs", + "bytes": 18599, + "sha256": "77eb1a0038d038b989f7ac568760e16fe23c4b8d73cd9fbe32b70817ea23cfec" + }, + { + "path": "crates/oa-desktop/src/app/behavior_lifecycle_tests.rs", + "bytes": 13669, + "sha256": "1af2e290aa259a6af6b0585950cda93fe3a562c7b8be1e938fe1d80747b11808" + }, + { + "path": "crates/oa-desktop/src/app/checkpoints.rs", + "bytes": 29576, + "sha256": "55e5babdcabef767af3bc8be9cc3153b3f5cc0695701b890820ec0225643852e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_selection_tests.rs", + "bytes": 5582, + "sha256": "4fa507adbc23db3a6eb202d809c695ec0ebd6181356930c4fa7528a9a0c7be57" + }, + { + "path": "crates/oa-desktop/src/app/hosted.rs", + "bytes": 25905, + "sha256": "14e2fcd79558ff56d000571f1f576e5601818d702783634aa4017000d382c62a" + }, + { + "path": "crates/oa-desktop/src/app/hosted/tests.rs", + "bytes": 30344, + "sha256": "fa118f64d04b400ccc01e4e67adaf3541975288882afa265a9e7f092cdbda232" + }, + { + "path": "crates/oa-desktop/src/app/process_canvas.rs", + "bytes": 28640, + "sha256": "11e991afbce187ae633e01214b2509a13623c940f1f5e6416aaee204158bc5a4" + }, + { + "path": "crates/oa-desktop/src/app/review_navigation_tests.rs", + "bytes": 7049, + "sha256": "5ebba36092cc89fcba394578e69c9507ad5a369e9a26526761716b5d4ee3ad75" + }, + { + "path": "crates/oa-desktop/src/app/save_as_tests.rs", + "bytes": 4113, + "sha256": "f8b915793f1a36fd152569c4781a4bdc17f4af404a8ceb373330053413087a1c" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols.rs", + "bytes": 18473, + "sha256": "4766bc70ef2e163497fc1f48180d2598e77d85b5331617777b5afa93da3939e8" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols/tests.rs", + "bytes": 54250, + "sha256": "8babf11d897053eba7db7c4a2342aade8ac41b3a0cdd8b96f17b7537c9c067da" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram.rs", + "bytes": 9979, + "sha256": "f7fd50cc9a86adb794713958348af63afc7c698f74965e13188b7b8a9e735c55" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram_tests.rs", + "bytes": 39957, + "sha256": "612e414b1a2cab12cbfd8fce23745559ff27577700694d53af67ad1f2883ee2c" + }, + { + "path": "crates/oa-desktop/src/app/transition_context_tests.rs", + "bytes": 11508, + "sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d" + }, + { + "path": "crates/oa-desktop/src/app/view_copy_tests.rs", + "bytes": 7846, + "sha256": "296821c51dcde568e7d717039aa26bfc1b56a9074aa16051007bb351b33a4d44" + }, + { + "path": "crates/oa-desktop/src/behavior.rs", + "bytes": 131449, + "sha256": "c9e0aea6a24cc982d0d82ee2b9b66f250cdfac037b36bf6b1b9d7dd38246cd3c" + }, + { + "path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs", + "bytes": 49386, + "sha256": "5f05318a6533503b9d6febf1ec4dd7256f192394bc1b952a7904c8175bd8ddae" + }, + { + "path": "crates/oa-desktop/src/behavior/creation.rs", + "bytes": 30053, + "sha256": "0fb19be3a5688c4bd3ca3643c47a97da7e7f85add8a860cd046a0d9cb3ce9dfc" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/app_tests.rs", + "bytes": 13181, + "sha256": "e9c5bf2b07357b7a2f679ae0d8f6904c1c1461aaeb94fa0db478b54d4641ae3e" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/tests.rs", + "bytes": 22793, + "sha256": "a0d1daf9fb3920f7e6181a9802d84fbe056cbf0043b9e41dba5fdda687d9818a" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario.rs", + "bytes": 149092, + "sha256": "d12a4b1caa61c08f69c4d2a64bd15568c4b7158dea91aac5a52a58a35adb863c" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace.rs", + "bytes": 32785, + "sha256": "69c7ad32e4bdc39f42d2e6c7764cfe1fa7867cd7dbcf9b904dec805e6c912666" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace/tests.rs", + "bytes": 35390, + "sha256": "abfc7caefb0de5bd479eb4af1b159ca77b68e6a157f477939628c3d5c90b44b6" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_operation_tests.rs", + "bytes": 10087, + "sha256": "89fb71c690e07eac314f7a5e05862d5c1e2f9c21039673bf22c4ac894d21c977" + }, + { + "path": "crates/oa-desktop/src/behavior/source_draft.rs", + "bytes": 39485, + "sha256": "85d543cc288e48b4c13001e4e386b5b54d9b1e349a5ac31e4e307572f2d8fb3c" + }, + { + "path": "crates/oa-desktop/src/behavior/state_canvas.rs", + "bytes": 93561, + "sha256": "2e2ad57b86f4cc1cc0c4c4c230571ef19bcc2f052001a8bdcc44925e5103077a" + }, + { + "path": "crates/oa-desktop/src/behavior/state_edit.rs", + "bytes": 35736, + "sha256": "cb2289e727163626152fc2f11195c6ee824851cb9442c57496da97fe7aebfb7c" + }, + { + "path": "crates/oa-desktop/src/behavior/state_menu.rs", + "bytes": 7447, + "sha256": "cc87c5caa177e114e4d9a7f7367e37ec2b0d1e1c16b0b99709b05ea0e59cf894" + }, + { + "path": "crates/oa-desktop/src/behavior/state_view.rs", + "bytes": 6988, + "sha256": "1eb892a9139ecb0671784c879ee5114f27e598e5b3589f5cdad0abffd5909f24" + }, + { + "path": "crates/oa-desktop/src/behavior/states.rs", + "bytes": 26986, + "sha256": "8986ed9492960e20f1254e9dfe3ff91d79ce9fef66f3bda738f9933278043954" + }, + { + "path": "crates/oa-desktop/src/behavior/topology.rs", + "bytes": 83845, + "sha256": "d06b2f0fc39b4814e94200297e148f1d4d97e04cb167766030ac9df18689e3b0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual.rs", + "bytes": 29107, + "sha256": "edc84fc69d8d4a8f4ce81a4452c4e2e35cfaf98addeed10235f392506c74e8b0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual_routing.rs", + "bytes": 16731, + "sha256": "d914b0e82aa8d253fe64be2ef74443d1fd2e6cec26d1cf30620a57646e1d426c" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct.rs", + "bytes": 32036, + "sha256": "413aa2009ee4cba0941836b43e41f16a04c8fc8568b6e92db5bb08516e95c287" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct_tests.rs", + "bytes": 54304, + "sha256": "ac8c8023117e31723084adb06e3ca7fd4ea3f95ad229622ccc759fa19b50c27e" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/layout_tests.rs", + "bytes": 14815, + "sha256": "4529ac8b05de769a2ada112473146fbfa27b0467d97d3541b86c4446b6050b83" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/view.rs", + "bytes": 29176, + "sha256": "a7d806cd621bdf857c4e4861685cd3eb556b320de3985b9cc3d9d131dad370dc" + }, + { + "path": "crates/oa-desktop/src/connection_edit.rs", + "bytes": 5301, + "sha256": "020581e077f82b43c936b623cc51733b02b88428df4e5f25df74b9705819fa37" + }, + { + "path": "crates/oa-desktop/src/connection_tool.rs", + "bytes": 27023, + "sha256": "649da93677d52dae495b0e19bc32f3122ab05a6d84de8402578ff5ce3f6ee1d3" + }, + { + "path": "crates/oa-desktop/src/context_menu.rs", + "bytes": 52955, + "sha256": "629354b34dc232763700251f2695b4d4e53d6251c0b1432ecc0dfe424f7dfeac" + }, + { + "path": "crates/oa-desktop/src/data_values.rs", + "bytes": 23877, + "sha256": "e1deb1cad551f0a9fdef9653aad257cfb36e6d9c0f93b6245061ec3fab8fd365" + }, + { + "path": "crates/oa-desktop/src/data_view.rs", + "bytes": 38871, + "sha256": "158b852be5d3db450aa5cda8b68a35bd96bddce1d8d053a7a23582095c06362d" + }, + { + "path": "crates/oa-desktop/src/diagram.rs", + "bytes": 105256, + "sha256": "4580b170e264d14e5cfa874709f6d2e076a05155bfbe1809336a9d05f75e98ef" + }, + { + "path": "crates/oa-desktop/src/diagram/lifecycle_tests.rs", + "bytes": 9316, + "sha256": "d0e72cc0574657d5a31c3ce307b58401d0ed77eedccd1aa02377f55ab0bc03f0" + }, + { + "path": "crates/oa-desktop/src/diagram/pointer_tests.rs", + "bytes": 11833, + "sha256": "10ca5049034159205ac8f22805354f308b0ba0596f331568c26cd1393bc8cedc" + }, + { + "path": "crates/oa-desktop/src/diagram/port_hit_tests.rs", + "bytes": 5624, + "sha256": "d2d0647629bf725b4dddfc211f5a27d495ed093a79af87cdae6c196f09a97b93" + }, + { + "path": "crates/oa-desktop/src/diagram/port_labels.rs", + "bytes": 13408, + "sha256": "28782983b82e4fca5dd4410ac8bd562359943b7010c7b24ecc42f0c7ad7fb63e" + }, + { + "path": "crates/oa-desktop/src/diagram/view_options_tests.rs", + "bytes": 2815, + "sha256": "cf0c98a7715558baf17b59f67a80556f98ad30262b4434635e617c6601775433" + }, + { + "path": "crates/oa-desktop/src/document.rs", + "bytes": 31080, + "sha256": "2ecc2cd496d4a83fd7a32b9dc68e49f0f1cb31a06263dfd6939b4764da5b73e2" + }, + { + "path": "crates/oa-desktop/src/document_save_as_tests.rs", + "bytes": 5781, + "sha256": "83dc243a25f4e97674ff0d86c794a490cc923e98f1f9fb05bb038f622f11e20b" + }, + { + "path": "crates/oa-desktop/src/explorer.rs", + "bytes": 14764, + "sha256": "fa01c59219564ba9ae5553abc2b6f94e9849f9148d5812ef99b40318fe5dcf9a" + }, + { + "path": "crates/oa-desktop/src/explorer_view.rs", + "bytes": 13773, + "sha256": "a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f" + }, + { + "path": "crates/oa-desktop/src/forms.rs", + "bytes": 106002, + "sha256": "e5c0805b93daf0e8244d4be32e5a0dd3a1856c281a9d9fb5f98497dcc43c4da2" + }, + { + "path": "crates/oa-desktop/src/forms/context_fields.rs", + "bytes": 10831, + "sha256": "eaacd474f6500dd344d5a8b63ccb1d1dd86fe2aea78ab708afa8a80d62ce69bf" + }, + { + "path": "crates/oa-desktop/src/forms/data_fields.rs", + "bytes": 49285, + "sha256": "f56397886d74086d69783f18fab961e13b0af05a8bb0d10d0dfa187cdad05f5c" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields.rs", + "bytes": 27414, + "sha256": "e7100474cde18bdfe95562bcb3c055f29b4b15aa64788a578194464aebcd046e" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields/tests.rs", + "bytes": 33950, + "sha256": "16d3c308138c063f45986d53c621ad83c7dc2ce853edd31b7204e2939a382df9" + }, + { + "path": "crates/oa-desktop/src/forms/port_fields.rs", + "bytes": 30554, + "sha256": "3fe684d651d5be6203fd9db3979c772913e1af5ac1514e67be386ffd88dc8127" + }, + { + "path": "crates/oa-desktop/src/forms/view_fields.rs", + "bytes": 24987, + "sha256": "5184d438f0dfd4e29f284ff048e19da73e71be1f24a6e9f123c7e922aecb85fa" + }, + { + "path": "crates/oa-desktop/src/guide.rs", + "bytes": 115874, + "sha256": "64c782afebecad5489d3bf06b41f3273904222c18e3244990f2749c991c92b55" + }, + { + "path": "crates/oa-desktop/src/highlight.rs", + "bytes": 2751, + "sha256": "da7c254fff7052e5fd9ec7469f473b91a819406028d7c304f6e22c4169561600" + }, + { + "path": "crates/oa-desktop/src/home.rs", + "bytes": 17587, + "sha256": "f03c1071334894f586a5a7c86026602a694db3c2faf902822e1dbe5156a859c2" + }, + { + "path": "crates/oa-desktop/src/home/tests.rs", + "bytes": 8167, + "sha256": "3b03ccfc97dfb75954e1e0ed568bb87a632295c07b96cedc05ed381f87b378f3" + }, + { + "path": "crates/oa-desktop/src/hosted/client.rs", + "bytes": 21912, + "sha256": "54b24b4b50f8d87d7c92946ea5a2cff4c98760e70555b3ce3d90be27115e95d4" + }, + { + "path": "crates/oa-desktop/src/hosted/client_tests.rs", + "bytes": 23009, + "sha256": "3ef70907ca75e098d631c41b90badd4cff1e1eb1b3c78e15a9f811c13ba8ffbe" + }, + { + "path": "crates/oa-desktop/src/hosted/mod.rs", + "bytes": 3744, + "sha256": "1b75e11c80fcb38fd20bb3487e3f88729fdac73e471c5ae64da28c249f77c63b" + }, + { + "path": "crates/oa-desktop/src/hosted/view.rs", + "bytes": 9281, + "sha256": "fc0c7b7ce3a5f05c49713df6661067751f81e810af11c614ca265ea9490e6463" + }, + { + "path": "crates/oa-desktop/src/main.rs", + "bytes": 1511, + "sha256": "cb0a919fd0df0924591283da5b55d64d525d8461640441509350be840235e51a" + }, + { + "path": "crates/oa-desktop/src/model_menu.rs", + "bytes": 34680, + "sha256": "12994a5433a91f8295a59d4bf40f35f1edb8d8dbb497a11eae8760299627f1d4" + }, + { + "path": "crates/oa-desktop/src/navigation.rs", + "bytes": 8839, + "sha256": "71355a12e1b4791106426d83fe5ebf0b29bce8e1dc594f0655ab85695469669e" + }, + { + "path": "crates/oa-desktop/src/port_edit.rs", + "bytes": 7809, + "sha256": "70b99f577c4fdeda8780c8dc1ee7b1639fd77aaca06658f06d725139fb3efb6d" + }, + { + "path": "crates/oa-desktop/src/port_preview.rs", + "bytes": 35855, + "sha256": "069487c4ece737d52e8ae4a84dcfb132236aca6799e841c91c8e7244320cf871" + }, + { + "path": "crates/oa-desktop/src/port_workflow.rs", + "bytes": 40582, + "sha256": "ccc15f97c3272145a67bb5857b4faeaf7437561bd61912fa27ab26e8824146a0" + }, + { + "path": "crates/oa-desktop/src/recovery.rs", + "bytes": 21041, + "sha256": "57e22e5fbb0e994e64ae03e69450271fe9f04a951db1670c2a018abe99db4489" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/README.md", + "bytes": 1587, + "sha256": "a90002df1e087d2dac7be26926864243568a0de7c4103e4927435b34178e8016" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/profiles.json", + "bytes": 473, + "sha256": "2c12ae96b50e6da5d60ce2b7fa00204be71dfbe2fd51311fc337a0de6a4332ff" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-bundle.json", + "bytes": 80974, + "sha256": "12715995e6f7f35414aea53b3ad720b9b31873ffdeaf4444231db1a5ac3c463e" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-model.json", + "bytes": 86191, + "sha256": "5535a706df9ec21715e8b6a5aa6dbd79636ae461450aee61305559016167612b" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-bundle.json", + "bytes": 85286, + "sha256": "ea88890a33f47d67dfb06d6dbbcc179058cf28dad76ae7d615c00aaf30dbbbfe" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-model.json", + "bytes": 90629, + "sha256": "5bb8db0b6394276666323483f977ac3586f88554c81a148c6d508fca0ef4576f" + }, + { + "path": "crates/oa-desktop/src/recovery/source5.rs", + "bytes": 6956, + "sha256": "0f0a763f0c98c2c908d4c2b95d8a4c042b6a255ee1cc16260e5404669691f642" + }, + { + "path": "crates/oa-desktop/src/recovery/source5_tests.rs", + "bytes": 12146, + "sha256": "cfd17a742f1f27b523fce7cd9309f0a07a30413395f6c58659fb91d02834a7a3" + }, + { + "path": "crates/oa-desktop/src/recovery/source7_tests.rs", + "bytes": 18213, + "sha256": "7ee61de66c75bf949489ba51ddc9677e2b4efc68801cf27909c9b894bfdc9288" + }, + { + "path": "crates/oa-desktop/src/route_edit.rs", + "bytes": 2941, + "sha256": "457ae59c2761a43a8620b4d336a7cf0f54b965997110ecaf968756a88b6b0374" + }, + { + "path": "crates/oa-desktop/src/semantic_review.rs", + "bytes": 3240, + "sha256": "916192003637b60c12f6b3b3663a5b9c770ae4d10d51a415f6b3e4035e30fe13" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts.rs", + "bytes": 24201, + "sha256": "a79236a8150597ff808597e59cf4f1e9e61c74c4901d9c8cf42d3427bb52a9a8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_recovery_falsifier_tests.rs", + "bytes": 11034, + "sha256": "3f255d04e4bffa5a467b75e3cbf6f7149aa3269a02f2a89fbaa1db0e5df9ae62" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_tests.rs", + "bytes": 20798, + "sha256": "04d0dd2ac453705185663f705282aa4a3a31433466a5be305764248da1a03c32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_view.rs", + "bytes": 6594, + "sha256": "e8ce3d844d6230c20fe2fda4d0fb256af8043f9b586160a8d110665c45a79561" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments.rs", + "bytes": 18160, + "sha256": "de0ec0c740895b160ff5b847332c087c3f1a48931583464069470cc61315ed59" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_tests.rs", + "bytes": 29389, + "sha256": "8b26be0324e0f33b1e7cf7af340350df8ed98963002d6da8589ee0e6f6900bea" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_view.rs", + "bytes": 3111, + "sha256": "cd8c4418b43d207fcc55a82a2364cd84053643e5c09c96de008c94b8372653fa" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch.rs", + "bytes": 31771, + "sha256": "44830e1a9fa572493d423545336f76e79fa24ef29900e4f7927cbc83f9071d17" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch_tests.rs", + "bytes": 27546, + "sha256": "2a8131b81322e6a49b1348c6efec4526a3df53c8eefc0a2b25c746e2b7c6ead8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose.rs", + "bytes": 27155, + "sha256": "c6adcc9882dde65e9f04f6eda7f0c855c5cbb285cf421123029169112793ce9b" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose_diagnostic_tests.rs", + "bytes": 9809, + "sha256": "440daf8d43278ef981c620d1818d0daaed8fb83193b8e8ff67b2e42fbf882938" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructor_tests.rs", + "bytes": 54132, + "sha256": "85149521ad7df62918f6f2fab6da2b3346c342ab4bce7100de3f6206c1e81096" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructors.rs", + "bytes": 12258, + "sha256": "0982163439b06a42d9af1643530364109282e63f05b323a35a76d8241f3caa32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/history.rs", + "bytes": 3211, + "sha256": "df038c2464eab8093a983f3104f0d04ca8f602010a50e1d3eeb8e53f2309e201" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed.rs", + "bytes": 14525, + "sha256": "f8db8578ecff84526bda96c233b50e56f1cf1c5b8ab04cbbaa04f9b5e78300f0" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows.rs", + "bytes": 13567, + "sha256": "af9b137fe56ff3a71378e9998bfbb7b68f035bd542aa6fa90b83e04796cf4b38" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows_tests.rs", + "bytes": 30804, + "sha256": "1a3b09e7ed100411cdf8043f9a78defc664a873ee0201117709185c201a5c57f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_tests.rs", + "bytes": 31955, + "sha256": "112a2d50130407a4a1069827e4e5d5a8681e672dd3e54b559c6d3dde4302a298" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind.rs", + "bytes": 789, + "sha256": "4ed19952ea511d1b3226564a138e3322f994371d6b49794c14bc3689d1393e7f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind_tests.rs", + "bytes": 23424, + "sha256": "5fcf9930e949aebeb12eab0327264f32a2388d62dbf098bd2365711e22623c52" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered.rs", + "bytes": 9959, + "sha256": "8b809e8b0958e553896829b655684084bf2f0ca7df9d40c6acbdad8749cd6342" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered_tests.rs", + "bytes": 22383, + "sha256": "5c8ea3a69e3da3b94d13f50f12aa7dc53246ccba25ffcace9552a0eb76b0bf36" + }, + { + "path": "crates/oa-desktop/src/semantic_review/recovery.rs", + "bytes": 28769, + "sha256": "88e69044d90c481593bab7cc125f0401c05202fccdde07698cec9483947fe8be" + }, + { + "path": "crates/oa-desktop/src/semantic_review/row.rs", + "bytes": 36972, + "sha256": "ecde54540071fde82d8d580d0da2fccd16d6b8e0144bd5e129afe91455f73bb1" + }, + { + "path": "crates/oa-desktop/src/semantic_review/scalar.rs", + "bytes": 15153, + "sha256": "9ad202174934dd9a63fbf9cba43135aead571db60846c8b7b1d3019a11df26c2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/source7_tests.rs", + "bytes": 11665, + "sha256": "5e8221d77b068fa30c1571988448cb8829711735881d810f3d333cbc95d34a9f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/tests.rs", + "bytes": 32480, + "sha256": "8839e241cf81d1e66abe072728eee1870b42341fbbefae9f39bda1b1a020f4ba" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view.rs", + "bytes": 57336, + "sha256": "c391814442cd5e95040c6dab9d511a254181de56c68d5c266d879870001561ad" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view_reserved_artifact_tests.rs", + "bytes": 4737, + "sha256": "6c766b29c8664d15cb113d2cc71bba9b60ae4ccf7e44c9c5d3c41e1dc4b7ed90" + }, + { + "path": "crates/oa-desktop/src/source_navigation.rs", + "bytes": 4030, + "sha256": "3f7007bc3b3ef6266e92ea4121cfbdb32df2e97713797b403ce6649070a90517" + }, + { + "path": "crates/oa-desktop/src/source_navigation/controller.rs", + "bytes": 3374, + "sha256": "4ec54ce769f047d6e5c1de6bdbe81648ad63c75cfd04aea5356bd5663126d77c" + }, + { + "path": "crates/oa-desktop/src/source_navigation/interaction.rs", + "bytes": 8808, + "sha256": "c6efa6105b8ba46655e27a89b9fa59e6fc01a4c6f331f886e035af1e70cbf8a9" + }, + { + "path": "crates/oa-desktop/src/source_navigation/interaction/tests.rs", + "bytes": 6616, + "sha256": "6cf5c5944b9c46c275c9039f7166b627fa9176187b39348152f67040c92c95e1" + }, + { + "path": "crates/oa-desktop/src/source_navigation/query.rs", + "bytes": 35200, + "sha256": "aa8e8e9d446b57c30520c4b3ca1ae9fe524cecb2f4f4f4b229d930ea0377ecca" + }, + { + "path": "crates/oa-desktop/src/source_navigation/query_tests.rs", + "bytes": 29720, + "sha256": "a4ecc95a49d0a9325cbf1548cf95a8d367f758f8eb1f44346a2b71ef046f6668" + }, + { + "path": "crates/oa-desktop/src/source_navigation/symbols.rs", + "bytes": 68862, + "sha256": "d6c9325223fb3f18e887a63187b67aa59735d4e51f501c9e27ebb870944912ec" + }, + { + "path": "crates/oa-desktop/src/source_tree.rs", + "bytes": 21816, + "sha256": "4d55e0110a1eb128a5d26c28f3aae5853d79b7245812b7c82bd275f38440a5aa" + }, + { + "path": "crates/oa-desktop/src/source_workspace.rs", + "bytes": 24090, + "sha256": "388c71f63829c0c76526a1700ebf5f240c86c467a65aae4fca4cd6c6a88c468b" + }, + { + "path": "crates/oa-desktop/src/style.rs", + "bytes": 3015, + "sha256": "05d61bec16141612ccafa0988e8c4827f41754509efdb3b961eab69127ded896" + }, + { + "path": "crates/oa-desktop/src/tests.rs", + "bytes": 58663, + "sha256": "94e340b8ef7f9a3bb71fd2a2098dbb9c3d2bb3adba25b5949430b714e36fdfe1" + }, + { + "path": "crates/oa-desktop/src/view_copy.rs", + "bytes": 9043, + "sha256": "5630f31c942e1226aafd67eabdace6a5c5494875bdc6f7f077019e8110ba41a9" + }, + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 67199, + "sha256": "1dae1d05a1b93cbb33f7d4fd941f01ff971b9b2f1c3eaecfd3e885c871168a42" + }, + { + "path": "crates/oa-desktop/src/views/source_symbols.rs", + "bytes": 8819, + "sha256": "9cd536072e110803b6a592bcbcd595b6f9eb32fc1d0b4c9de741247c459abbe5" + }, + { + "path": "crates/oa-desktop/src/views/traceability.rs", + "bytes": 7501, + "sha256": "4c89dcf35c25e737d8cce4d543a5989ca104a5678e6cf40df47e457773d2ef94" + }, + { + "path": "crates/oa-desktop/src/workflow.rs", + "bytes": 82829, + "sha256": "a00ba19d6d23435d18c9e1f6a0ad2065f889bcfa97aa3840bcdfaa03cb2666aa" + }, + { + "path": "crates/oa-desktop/src/workflow/communication.rs", + "bytes": 11084, + "sha256": "34d121ad97706012722e4bb6210072ecc3a5b4718b0ceab0c3d0f14d4cd780a1" + }, + { + "path": "crates/oa-desktop/src/workflow/recovery.rs", + "bytes": 9859, + "sha256": "0849b0f34dba5e8761be5fa05784d134ac74e4e9db395d6b9b7d6cff71e3f3dc" + }, + { + "path": "crates/oa-desktop/src/workflow/transition_tests.rs", + "bytes": 8553, + "sha256": "589b1b2dbadca74a52c2cfcfd4fe620bd4790abd113ac02182e91616c52d793c" + }, + { + "path": "crates/oa-server/Cargo.toml", + "bytes": 778, + "sha256": "527ff5e15010a8b560a6659aa1ae4bf0c8df0d9e019f03c47529ec6a750c0982" + }, + { + "path": "crates/oa-server/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-server/src/error.rs", + "bytes": 5610, + "sha256": "93817f1502386e4662c96ee1c7d1c4afc4e33bda6fd64e46c86c8e1afd5a9368" + }, + { + "path": "crates/oa-server/src/lib.rs", + "bytes": 7743, + "sha256": "20bef350350ed6339588b23af684abf745f97916c7edf3853ee042abe687e664" + }, + { + "path": "crates/oa-server/src/main.rs", + "bytes": 4163, + "sha256": "d59a6a2b5c7034bd2e00a516d2d49abb16391bf0316c1c357ddafb9c82d2d1e3" + }, + { + "path": "crates/oa-server/src/preparation_http_tests.rs", + "bytes": 5523, + "sha256": "454b90d0055d35644c8d990cd7576ddf675a9b271ca07fe9b0efce25d8ddbc07" + }, + { + "path": "crates/oa-server/src/routes.rs", + "bytes": 46053, + "sha256": "3f9a0c22043dbf28f7a8e587d2fc3abf869f76f4d23a46fe0aeb9c4392454a4b" + }, + { + "path": "crates/oa-server/src/store.rs", + "bytes": 25524, + "sha256": "37dcfb845b7993d5bced2bcf25fedfcd2a9c20a748f9315afe6cca1f41f89ae5" + }, + { + "path": "crates/oa-server/src/store_preparation_gate.rs", + "bytes": 4440, + "sha256": "427c390da3c0281ba1fe115a93ea90800e3b45fce6bcb9185e71982ddd885fec" + }, + { + "path": "crates/oa-server/tests/http.rs", + "bytes": 71892, + "sha256": "50daa6a90e96ad6fe3c6a27df2eaebe486270599c203892d09769c547a194975" + }, + { + "path": "crates/oa-server/tests/http/communication_limits.rs", + "bytes": 5790, + "sha256": "ba5474dd8e494a0176fffb4548c8e3deb2081b15de33bfce82394c764e0a2c16" + }, + { + "path": "crates/oa-server/tests/http/data_contracts.rs", + "bytes": 25949, + "sha256": "8cd456db83f301baca380acf025a5a99db4edf7d8839537dfbd02c4307e10e6b" + }, + { + "path": "crates/oa-server/tests/http/port_anchors.rs", + "bytes": 15086, + "sha256": "7199d0a208ddad9e1518b6e3fb390d64da111716d7505ba5c995deae19ad1258" + }, + { + "path": "crates/oa-server/tests/http/semantic_transitions.rs", + "bytes": 22832, + "sha256": "856d1c9b633ffb581e3e631f4e5a607789a02181dbf060667f208a569bfa4920" + }, + { + "path": "crates/oa-server/tests/http/source6_views.rs", + "bytes": 13023, + "sha256": "867bccda0e030eeeb9976b4ceeb47b21ab5044d700278022d5fb495bbb64ca07" + }, + { + "path": "crates/oa-server/tests/http/source7_contracts.rs", + "bytes": 11000, + "sha256": "0e0a467186da7263c0754890aff69ebd0d92d36b5224e4865bb6854b18dab7e8" + }, + { + "path": "crates/oa-server/tests/http/source_projects.rs", + "bytes": 30907, + "sha256": "8ff580f317ec267d1cd72ae14d8638f74a77cdf99ca4c78f66f4290c2d77460a" + }, + { + "path": "crates/oa-server/tests/semantic_http_contract.py", + "bytes": 7251, + "sha256": "4737ff94f10761f94151a694414c5c62737e0391ec820bca132830652bc4cca2" + }, + { + "path": "crates/oa-server/tests/semantic_schema.py", + "bytes": 25038, + "sha256": "70c9d267268bd390680f290a585bd4ae0c6d8ef999ee2f32ece6e172293574f7" + }, + { + "path": "crates/oa-server/tests/state_representation.rs", + "bytes": 12241, + "sha256": "6686c826f28248ae4b63ec3f2112e193d4a347724b87974483217fcfee49cd61" + }, + { + "path": "docs/acceptance.md", + "bytes": 3463, + "sha256": "32ed3e4fed63f5c464e0937221f401d71623b276dd70f083531ac6ccebbf9050" + }, + { + "path": "docs/api.html", + "bytes": 73861, + "sha256": "6f18cfc2a35eba631dbc61d04cd2721e0e361efff1699bf56d2c450a30a17a0d" + }, + { + "path": "docs/api.rst", + "bytes": 42711, + "sha256": "7eb258088824efa5ac94311b07b73eb46edcac3c300a2aac78d3802111e338c4" + }, + { + "path": "docs/architecture.md", + "bytes": 10974, + "sha256": "a50bd1645222ef3e574fa07a6ab9aa213431ee8833c6c0158ad91ce0f799543c" + }, + { + "path": "docs/language.html", + "bytes": 179377, + "sha256": "739a5bb100c7cb0ed70e18afd1e363029757f3cfd6580bc9c5cf77faccb46940" + }, + { + "path": "docs/language.rst", + "bytes": 131984, + "sha256": "894a1a77f97d1aa94c11762fe4e84b4d95e181a77c630324c16c307637ed27e1" + }, + { + "path": "docs/linux-packaging.md", + "bytes": 8671, + "sha256": "41a1bb1095801df37a1411341c5791d55ea8c365739314d599a60269ac4bc7a0" + }, + { + "path": "docs/openapi.json", + "bytes": 359757, + "sha256": "c6ae512f791a939eaf6ec5e5e78e9468bdee0e028092d00098bd90ad9498d967" + }, + { + "path": "docs/research-v2-architecture.md", + "bytes": 40445, + "sha256": "1b3809f2dabe6b1805dbf3d3f2625c471cd21356c7bd603916466a8c4ced8090" + }, + { + "path": "docs/research-v2-semantics.md", + "bytes": 31535, + "sha256": "b7ec3677300248926a88b84da3e7ffe52f5b73524c7712c927a0e951569db04f" + }, + { + "path": "docs/research-v2-service.md", + "bytes": 36209, + "sha256": "4828df5bc679e7c71f49b4b85c9e7dacbec52f46d416fed48af70e08886d4e4e" + }, + { + "path": "docs/research-v2-ui.md", + "bytes": 3245, + "sha256": "894e721b59a8ca85f0d95b6706ed5f130a0372def460cf33aeefc9e5e38cde0a" + }, + { + "path": "docs/scope.md", + "bytes": 16260, + "sha256": "58b88a7f0b1c8a79edf23c375a141d7b1b821bca4f3212a80e29db5ea3fba796" + }, + { + "path": "docs/server.md", + "bytes": 23361, + "sha256": "4eb24937d424ba8b384e1734e02a6f8e963ae11d2715889c92b14b39ff2e4a48" + }, + { + "path": "docs/source-cli.md", + "bytes": 3374, + "sha256": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051" + }, + { + "path": "docs/v2-interface.md", + "bytes": 11807, + "sha256": "c7fbaf0ebd3fc9f6c11f818db2b0b9d68a33f580cfced22bde83ce08ae790bc7" + }, + { + "path": "docs/validation.md", + "bytes": 6505, + "sha256": "f46ea950ed1a54409aa07c4f9e90f39f8e2d00c1dd1b6cb805caa3993845967f" + }, + { + "path": "docs/windows-packaging.md", + "bytes": 10406, + "sha256": "2c852ff7041713ffbff3c951ac98df647c51fb70b0feba9000f7bfd5bc2703a8" + }, + { + "path": "examples/coastal-rescue.arcadia", + "bytes": 33107, + "sha256": "7e183ef9fd8154d3074303f1956cd0d9871c19e3ffc630d333b0bffbd6e30e17" + }, + { + "path": "examples/coastal-rescue.json", + "bytes": 49715, + "sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195" + }, + { + "path": "examples/legacy-v1-coastal-rescue.arcadia", + "bytes": 3449, + "sha256": "4dbbbdf8bc7e6cb8e0a81dd678069dae585a9e5187c59bc3665e1fdab3f1a86a" + }, + { + "path": "examples/legacy-v1-coastal-rescue.oa.json", + "bytes": 5976, + "sha256": "fd0e9dedfb7adb922dc0575cc2b820d40344d639f1d8052bd70363aa59de9c24" + }, + { + "path": "examples/release1/README.md", + "bytes": 11137, + "sha256": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5" + }, + { + "path": "examples/release1/evidence/repair-check.md", + "bytes": 1419, + "sha256": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5" + }, + { + "path": "examples/release1/expected-diagnostics.json", + "bytes": 288, + "sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e" + }, + { + "path": "examples/release1/model.json", + "bytes": 134520, + "sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727" + }, + { + "path": "examples/release1/model.rs", + "bytes": 28762, + "sha256": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5" + }, + { + "path": "examples/release1/oa/activities/activity_oa_restore_work.arcadia", + "bytes": 1307, + "sha256": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4" + }, + { + "path": "examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia", + "bytes": 697, + "sha256": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d" + }, + { + "path": "examples/release1/oa/behavior/process_oa_field_procedure.arcadia", + "bytes": 1781, + "sha256": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324" + }, + { + "path": "examples/release1/oa/behavior/process_oa_response.arcadia", + "bytes": 3225, + "sha256": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_conversation.arcadia", + "bytes": 1795, + "sha256": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia", + "bytes": 1261, + "sha256": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c" + }, + { + "path": "examples/release1/oa/behavior/state_machine_oa_monitor.arcadia", + "bytes": 2022, + "sha256": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5" + }, + { + "path": "examples/release1/oa/capabilities.arcadia", + "bytes": 781, + "sha256": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936" + }, + { + "path": "examples/release1/oa/model.arcadia", + "bytes": 661, + "sha256": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15" + }, + { + "path": "examples/release1/oa/participants.arcadia", + "bytes": 1834, + "sha256": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3" + }, + { + "path": "examples/release1/oa/types.arcadia", + "bytes": 788, + "sha256": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49" + }, + { + "path": "examples/release1/project.arcadia", + "bytes": 1958, + "sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda" + }, + { + "path": "examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia", + "bytes": 706, + "sha256": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088" + }, + { + "path": "examples/release1/sa/behavior/process_sa_field_procedure.arcadia", + "bytes": 1790, + "sha256": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768" + }, + { + "path": "examples/release1/sa/behavior/process_sa_response.arcadia", + "bytes": 3234, + "sha256": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_conversation.arcadia", + "bytes": 2127, + "sha256": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia", + "bytes": 1256, + "sha256": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74" + }, + { + "path": "examples/release1/sa/behavior/state_machine_sa_monitor.arcadia", + "bytes": 2022, + "sha256": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736" + }, + { + "path": "examples/release1/sa/capabilities.arcadia", + "bytes": 781, + "sha256": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_audit_thresholds.arcadia", + "bytes": 297, + "sha256": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_restore_work.arcadia", + "bytes": 2576, + "sha256": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6" + }, + { + "path": "examples/release1/sa/model.arcadia", + "bytes": 661, + "sha256": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4" + }, + { + "path": "examples/release1/sa/participants.arcadia", + "bytes": 4012, + "sha256": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8" + }, + { + "path": "examples/release1/sa/types.arcadia", + "bytes": 1227, + "sha256": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660" + }, + { + "path": "examples/release1/traceability.arcadia", + "bytes": 29506, + "sha256": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f" + }, + { + "path": "examples/release1/transition-before.json", + "bytes": 35801, + "sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d" + }, + { + "path": "examples/release1/transition-request.json", + "bytes": 4276, + "sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a" + }, + { + "path": "examples/release1/views/diagram_oa_allocation_view.arcadia", + "bytes": 2176, + "sha256": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7" + }, + { + "path": "examples/release1/views/diagram_sa_allocation_view.arcadia", + "bytes": 2173, + "sha256": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389" + }, + { + "path": "examples/release1/views/diagram_sa_capability_view.arcadia", + "bytes": 1620, + "sha256": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649" + }, + { + "path": "examples/release1/views/diagram_sa_service_view.arcadia", + "bytes": 2209, + "sha256": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b" + }, + { + "path": "examples/release1/views/diagram_sa_state_view.arcadia", + "bytes": 1931, + "sha256": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869" + }, + { + "path": "examples/routing-workshop.arcadia", + "bytes": 66431, + "sha256": "dc6b75da72884d399132ed9e300fa5a26b73d802bb526c9af986ae9eeb0a646a" + }, + { + "path": "examples/routing-workshop.json", + "bytes": 100281, + "sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14" + }, + { + "path": "examples/source-project/oa.arcadia", + "bytes": 2142, + "sha256": "5f60642f211b2d352a951092faeeb7503d4fb7f6f7fca99e810347231101d31c" + }, + { + "path": "examples/source-project/project.arcadia", + "bytes": 606, + "sha256": "787f6b67b179ffd221f7e5faf1a4edd74cfd116aa1e3b5e9ed9f22fbff612d8d" + }, + { + "path": "examples/source-project/sa/assurance.arcadia", + "bytes": 682, + "sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f" + }, + { + "path": "examples/source-project/sa/participants.arcadia", + "bytes": 1231, + "sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88" + }, + { + "path": "examples/source-project/sa/reporting.arcadia", + "bytes": 2839, + "sha256": "f0b7443f728912ca163de39b6055876b533a77feaa3219b2d40a2dd65712e058" + }, + { + "path": "examples/source-project/views.arcadia", + "bytes": 3508, + "sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f" + }, + { + "path": "examples/text-first/README.md", + "bytes": 1367, + "sha256": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e" + }, + { + "path": "examples/text-first/project.arcadia", + "bytes": 480, + "sha256": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a" + }, + { + "path": "harness/fixtures/basic-editing/README.md", + "bytes": 12012, + "sha256": "3545d9695e7c62e0caa818efd7f4dc426f04876a3626e0f3b1bad606b258cb26" + }, + { + "path": "harness/fixtures/basic-editing/base/expected-baseline.json", + "bytes": 4524, + "sha256": "f239e728d650b0af32bb8f3dcaf6b27c99b9c5041132ac14e51756ea6563d978" + }, + { + "path": "harness/fixtures/basic-editing/base/project.arcadia", + "bytes": 3077, + "sha256": "045cb047d7bfbca72c3fb30db4c81a30ad463d3af7fc51604906ad7fa75a1ff8" + }, + { + "path": "harness/fixtures/basic-editing/base/rationale.arcadia", + "bytes": 57, + "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f" + }, + { + "path": "harness/fixtures/basic-editing/manifest.json", + "bytes": 447, + "sha256": "d23c21b02064ddb85e051e10e16ff089daba8d9910bb1a695dfabe2db3757734" + }, + { + "path": "harness/fixtures/behavior-creation/README.md", + "bytes": 5954, + "sha256": "9e5fc751424d12cfe76a84abb1da45b2d38947409179451bb90ffe7e7ddc8723" + }, + { + "path": "harness/fixtures/interface-operation-probe/README.md", + "bytes": 2604, + "sha256": "088f0bdb3375deb8f2c7e3b749ca8d210ea828ca4dece69b3871b674e3110175" + }, + { + "path": "harness/fixtures/interface-operation-probe/hashes.json", + "bytes": 977, + "sha256": "f6d3e8aa42f40f64ce2ecba7b9cf112eb9091f3cccde3a592b0434e834cf2a6a" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.arcadia", + "bytes": 4218, + "sha256": "c0fe9570684c0061efc4cad65e339fede6961b04ca90c6f324c787bd65e61226" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.json", + "bytes": 7835, + "sha256": "93187f7a1b476a44185725c6b15f2e1767482b6911ab1280144348d033eb51f0" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.arcadia", + "bytes": 4771, + "sha256": "02f85e39957ebe6d56336fa729a5c8b10f51865face9d3b2c9679200571fcfc7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.json", + "bytes": 8840, + "sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.arcadia", + "bytes": 8635, + "sha256": "ac5b629ba5596464f9f8a975b8bc2764e3007ceb7342de3f828d4b18e4f069b7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.json", + "bytes": 16160, + "sha256": "78a47c978dc667aa1c45af711f06aa2a0d3c581003013e30c3e02fb0faae2e64" + }, + { + "path": "harness/fixtures/interface-operation-probe/probe.rs", + "bytes": 11274, + "sha256": "72b1b443e25eb20420dec4477b0fb5ef5d1c705e3882c81df88dd578ab96a426" + }, + { + "path": "harness/fixtures/release1-native/README.md", + "bytes": 2564, + "sha256": "5f5ba040fd2df9261a29bcab3f9a7ae27c3683265411ad3dda0b467d5df8590e" + }, + { + "path": "harness/fixtures/release1-native/artifacts/README.md", + "bytes": 4155, + "sha256": "24200c84ccc2ef3e17c029744074e5cea785188f5549ac54e44cf89682643f81" + }, + { + "path": "harness/fixtures/release1-native/artifacts/generate-semantic-artifacts.rs", + "bytes": 9275, + "sha256": "444f360b78df52c5e42046f77b148781e0c9bddc2a09c0b7bd65c7a4f376cfe6" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.arcadia", + "bytes": 7768, + "sha256": "84b22e95c213018612e6e8a84cad68b35a8b495ff3515b0f978c5e7a3d196d79" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.json", + "bytes": 7330, + "sha256": "13a6f99ec2df1dd35ee8b2613f183918cd9537eda4a5da085ad52e65c033db59" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.arcadia", + "bytes": 1446, + "sha256": "1e0d662ba33071b122ad9206d2d559a8e748c9431eb3ac1b759bde3760ca877c" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.json", + "bytes": 2216, + "sha256": "fa6a2e3643c0f909b92407abec3edc897033162eeaa501f8d4616f79d41fa044" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.manifest.json", + "bytes": 567, + "sha256": "65cb70b0d697a055363ba01bf30bed7e412d43c9978a033549c378d117719ae7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.request.json", + "bytes": 3991, + "sha256": "ed905267263e7f8a0cd2dbe833196b30118b6a246815216932fae661ad650699" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.arcadia", + "bytes": 6837, + "sha256": "e50fc462ec22dbf98011929931dd2489430001c3e6433608685b9d88bceb9acb" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.json", + "bytes": 6433, + "sha256": "f27a7b38d59c7cefe58cb36783d3d4dd8d8ae1168d9aed1eb61d343c18758908" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.arcadia", + "bytes": 1807, + "sha256": "eba2aec39e6efb405eace4bc8ab0c5563907c26d449e71a4aa750df9f73233b4" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.json", + "bytes": 2673, + "sha256": "2ef777f19b94f08b5e5ca2ef727777897e1018f1426eee291408b3c69101f596" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.manifest.json", + "bytes": 519, + "sha256": "3af7232ed3056ca84dcaf0f266ead3faaa512a0dc0051c7ba68791c20dbae0cf" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.request.json", + "bytes": 1246, + "sha256": "8af21b00b62e620256fbf50e47c6c5836cdb6922d9549cc4b3d86bc03b008073" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.arcadia", + "bytes": 4200, + "sha256": "20bb30473830e44228958e78fb7480269cdcc0580c6c90c718da75f34ca5a43f" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.json", + "bytes": 4552, + "sha256": "44f4b05db49758dcf344788f57cecc0250fd029099b1c54e4e1e3e972f6cf039" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.arcadia", + "bytes": 1808, + "sha256": "b0fd031671c9f755756922ec5c40a0ce3f40164d22c3c389aec9fd0705344da7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.json", + "bytes": 2673, + "sha256": "1acf81e08c51c85aceb14a3efbc39ec680552a19c7824aab4611ac3cf71b9c6d" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.manifest.json", + "bytes": 610, + "sha256": "a07978f4b0a3ca83e5ae5f35e7b66b26473b24431fc90e5889d755f1816d52dd" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.request.json", + "bytes": 2352, + "sha256": "5ff844a038b0030adb5a83d13d81e60f30627543388f6199b6a0e026fc42ea58" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-native.md", + "bytes": 4075, + "sha256": "a51ffbc45b6c172cbfed3b16c249296e6a28d457fea57393dd958cdcfbafbca1" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts.hashes.json", + "bytes": 2367, + "sha256": "3ad8b7428b3ed7585a91e7f5d9d5f4880caccfd0b08dca25d05af523e62e0a10" + }, + { + "path": "harness/fixtures/release1-native/communication-means/README.md", + "bytes": 15091, + "sha256": "015c16010c212af283f9def118c6d263ba65a3bc6e81a750f180624ca69bb311" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/entry.arcadia", + "bytes": 6098, + "sha256": "a6976e7c21031e7cc3cb731e20c3075cf89cf85144dc8d3f52930f8521ea196f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/expected.json", + "bytes": 10480, + "sha256": "60c4419415c546f06c9972ac7bb0e530ada7b30a200b59e75ddda231a24f9a3d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "3c41459f2b0706a767988738bf8126f76540415bb5940d9c5db19cbe8c18182d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.request.json", + "bytes": 1331, + "sha256": "b16e673b29c96b5aed681389ff7669110abe552939e86dd0ec6011c9a45ed860" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.arcadia", + "bytes": 5239, + "sha256": "a511a4d817d9c5c80233bce83e84a7056b7dce7afd9fcc25696e333f8f4df055" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.json", + "bytes": 8424, + "sha256": "7140114926228b1c378c450535f7a70992c71a879a8d2270c49e8d5f04a2f484" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/entry.arcadia", + "bytes": 5710, + "sha256": "910e6dfe609467047ce629ec9c626f4e927cada74bfbfa164414a8fe6783ea87" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/expected.json", + "bytes": 9868, + "sha256": "567259e20c9f6278776e8fa99b8b2fdbbc9a883ad875c5d39dae1b53de3a2924" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "997f72fe9258012df66e88344cf39c1a2cebf2327f604056b67f7f2a8ebcfbfa" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.request.json", + "bytes": 1127, + "sha256": "cb3fe05859cfffec6f8846c19983dc462413bc0ea4f6e19204f09c259919c4b1" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/cm-reverse-scenario.arcadia", + "bytes": 8209, + "sha256": "ec826b9b84616507490ac30e4d57100dd6338dba2f7071e879a8fb58820a85c5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/expected.json", + "bytes": 19735, + "sha256": "ef07e4d2d3fc36004ff01739838281581d9a703c747611eacc01bb9cc672489f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/entry.arcadia", + "bytes": 9827, + "sha256": "86dd8a355f6c9dadfea56d06e5247c9b0f820819d7df17ef5690671c7c81324b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/expected.json", + "bytes": 21877, + "sha256": "980489ec2c483d4f9efada61358c1f29bafb2572fd5b804c656b91b8e9bb4f9a" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.arcadia", + "bytes": 7698, + "sha256": "1abc4c4cac37cfb06ed3b12a115f9e7e6a2d3affd34b25c355309e5ee465fa40" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.json", + "bytes": 13130, + "sha256": "a5cf4cb2ef390113dd752f4054d43fb789da2ca77799efb5782805ae8aa2dfd5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.arcadia", + "bytes": 5454, + "sha256": "b761c4c2af5f7064aaf1f887ffd6094eb6ae834b2c8057ecdbc4aa97c042066b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.json", + "bytes": 8852, + "sha256": "2536b000de361fb131787e32b466b9123d4e98abf00c099ad32f6cb8e7fb530b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/generate-communication-means.rs", + "bytes": 28035, + "sha256": "003521404b702332082e01f2be7676fda1dd7b5bcf220bb81d25120c8984c75d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/hashes.json", + "bytes": 3133, + "sha256": "39b4dc02fc8b074015c59354fd1c1061c25832fde25065c7151f36eb0455e6f6" + }, + { + "path": "harness/fixtures/release1-native/communication-means/manifest.json", + "bytes": 1237, + "sha256": "fb921f42f2c4a4f8a67d1266f17f8c7750b6a2619554b713aa92b17918f0c43e" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40-oracle.json", + "bytes": 26264, + "sha256": "74edca148583f42c269e51f135662f65ef1c9ea1c94516d63e2a5091967dc99b" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.arcadia", + "bytes": 28947, + "sha256": "00b87736b82c5afd33b311df7aebe9a6c8c51b6de66221181b5ea8bc8ca221a3" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.json", + "bytes": 54938, + "sha256": "5dd4f22453330cab3abc059881660190e689a22619853f77cf6d0b52735d97ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments-native.md", + "bytes": 2624, + "sha256": "28906924b05f75bbf432389517aef65f1df474d2f2bff79a3586564f7f7328ef" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.arcadia", + "bytes": 6795, + "sha256": "9d084dd75a0251d349cc31f9ee98df58d0bc76859dc3cb1503f242e2f759888a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.json", + "bytes": 9618, + "sha256": "f09be41afd85c18fd52fdf997e9b81c4b7cb2c41e78d167abcd14caea8110333" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.arcadia", + "bytes": 4990, + "sha256": "8740f27be99624013d9be876639c0411e1b8c14f0f9a843f43dc71d769efd79a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.hashes.json", + "bytes": 963, + "sha256": "00fc9e2c709bdcd9ee98012176cb0edb635c112153d963cd169bf4bf69a9e010" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.json", + "bytes": 8146, + "sha256": "9c188f2890630c7feec2be719a7104af9690da7ea836df18fa78da3ff2acfc1b" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.manifest.json", + "bytes": 1045, + "sha256": "46b40f221ffad614733b615208814ace63947e96b80bbfdec63853ccd4f4e8c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.request.json", + "bytes": 3075, + "sha256": "b57f656f0b9cf2c595e83150c683301909e20f15684d35d108d3c57ee0dc5909" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch-native.md", + "bytes": 2637, + "sha256": "dddca2b85f892b05881c75ef3cd62437396cc086a09909b621e02bad0cbe56ff" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.arcadia", + "bytes": 3134, + "sha256": "d3315bba762395205ae761e6e64029e8b4070c15a1299c6114075581db7b0974" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.json", + "bytes": 3927, + "sha256": "8f36119c7e893a4af374b13b85b1c2cb3df0196df8d06a551386628fc8b8646d" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.arcadia", + "bytes": 1787, + "sha256": "5e1f433e04621424edac43e53411624059e873f88dd531bfdb39093953485ed7" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.hashes.json", + "bytes": 933, + "sha256": "1bd87700b04e4f169ab5f8aceaa3b0c3ec3a1cc43e1bce135a1cee506fc75d38" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.json", + "bytes": 2816, + "sha256": "1972242d2a8677d004dc3af1081feb292de65fe26128d877dded8661f9906619" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.manifest.json", + "bytes": 647, + "sha256": "1e440efa02e2ccc27585d9a49c7864d53e3e3e7645ccb219f040e00d95331b8e" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.request.json", + "bytes": 2197, + "sha256": "71f23474614aab90398ce24f00f2cf61d6cb9a3a34faa3e12e0c8104e0a71073" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.arcadia", + "bytes": 15635, + "sha256": "e3ce0347746584f503b825a8b6bd23a7eebf0827940112ef8f36d500c1d0a043" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.json", + "bytes": 25736, + "sha256": "29736f2a619f7f2d0e795229f6e8c3645a1b4eca6292043cd604aa01b1ec9170" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.arcadia", + "bytes": 15631, + "sha256": "9ab573c92be66e3bae659dd826923ba6066979b1651edda7bd469056632cd77e" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.json", + "bytes": 25736, + "sha256": "828c990c6129692cd31c7f6ed0dd6c952f9cfffdd90bc80171df82d4d929afba" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.arcadia", + "bytes": 15617, + "sha256": "49214be2ca9c8bb6195c3b39737c053847021839f70f0bb2921d35a1fbd2ac83" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid-request.json", + "bytes": 2225, + "sha256": "8b02d4739b1be2c8a64da76423b4a6cae7d89c60f4d30723b94f1da3779cbcca" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid.txt", + "bytes": 78, + "sha256": "aa536e18bc65325163e9b645a4ad031ab599fcb05948dcf741b725d0f0c8b602" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.json", + "bytes": 25722, + "sha256": "995dd72f5c1f07f998233ae9847e337cb82de0c2a9053d3905be021d5f8124b9" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.manifest.json", + "bytes": 1059, + "sha256": "ad315359bfd68ce0d265976dc9e4ea6a502ebbb87d7339dd1af5ef27dd01e433" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-plan.json", + "bytes": 15016, + "sha256": "27bf316ad66ffa91f6323e75b0c280baf5caec298645793dea72c5d42aa3b782" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-request.json", + "bytes": 2225, + "sha256": "f4f6b5480ec8927033ea469ea82c1e8411cb6dba95d2da680f15bc193914c9b4" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.steps.md", + "bytes": 3897, + "sha256": "7d7e38d93641a5f22a2738baa4dbacc392eebb477a855cdce0641961980a19ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-plan.json", + "bytes": 18557, + "sha256": "74dd68ba686b8928054480f0bfed55aad91f6f1208803399dc9878e894f57ecb" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-request.json", + "bytes": 1508, + "sha256": "d19a53002a6bf95af3123a3ef9f78baaf7ce1085d4f06f0f4a9d5e5d5accbc0e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.arcadia", + "bytes": 6935, + "sha256": "90277f1780d43a6f0b2184bf00b87e7a4f3518d67c6f10d4793daafe1aabf493" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.json", + "bytes": 11286, + "sha256": "5a3c8494f6976c23b990c14b40760fb2f32ca9973caf6f31dab5632310663591" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous-request.json", + "bytes": 1379, + "sha256": "6a86fde194faa55f2d1bdb982571e0e711e5401b53a960e6acb8cf3e17f506c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.arcadia", + "bytes": 6195, + "sha256": "e7c30c5a5c3ba7209c8e223f02da55821d7af10a2f09844a7065ae6cd8f22aa5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-plan.json", + "bytes": 19156, + "sha256": "d1e5c2ed08e0aa6274a0421a39876d1ba99f4e441c7a0a68660a83b9e017da14" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-request.json", + "bytes": 2418, + "sha256": "433f723252598994dac7184da61f95344b528156cc5a0fba1a7864b2ec9f002b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.json", + "bytes": 10441, + "sha256": "9e4e2ce1c7879935ad0860a3ae720506c929a8422b51491b719d88af3fd3ff2d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.manifest.json", + "bytes": 1042, + "sha256": "87e8899c7d4e54faedeef32afb7592fb65278d1bd7390850ab198dcf62068329" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.arcadia", + "bytes": 6280, + "sha256": "6c77ed42bbf9f4ebe08bfa233197a4020e5587ce33747f7914430aa0c662d9a3" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.json", + "bytes": 10009, + "sha256": "1dd7ca2bcfc84ac23369c506302b39569d2ebc41e5a4edc99378a1fe01923b7e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous-request.json", + "bytes": 1390, + "sha256": "e0ea7aeb25687ae63c65128f1aab78273f14030d179d3fbea63fe91ab5430136" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.arcadia", + "bytes": 5529, + "sha256": "563c36162050c8564ffa25a85c726462ecdaebdb87659b3f3610506bfd5581e6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-plan.json", + "bytes": 18821, + "sha256": "f96c43fc58dbe48a044b628b31bb3f0b59171dad5b6982ec6c34a5597e474130" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-request.json", + "bytes": 2438, + "sha256": "d38fdb13612b07254edad80848f79c1e097d5f868c020feae9ba072aa697a50d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.json", + "bytes": 9153, + "sha256": "2ed0daed118f2df13dcad738dab174ad34d44a15921cf8097415e707978b0968" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.manifest.json", + "bytes": 1058, + "sha256": "c79bd12a85d8d4f25cc3ee43581b3e5e74ae9ad7e4de0c72764975ba2b89c279" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.arcadia", + "bytes": 5026, + "sha256": "98020e048ac01f285c6ad8c10ce22bef05e193b5ba0f5558be1fb26a7bf82620" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.json", + "bytes": 7851, + "sha256": "ea3783992488bc6ee944eb91a26ccf3dbc05a3909528fc32ec8023a76765cee6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous-request.json", + "bytes": 1379, + "sha256": "ea3cfd25f7a50481805956fb88ab851516dcd602dd6564502a0cc55f7de6a54f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.arcadia", + "bytes": 4295, + "sha256": "2b7c3694623bbea3e36dcc6f674d4adcd91e23c8e1005ded21e5a69648a048e5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-plan.json", + "bytes": 17912, + "sha256": "95a23bd334cffcaef0c3b1012b7555efd2a077ef6f9140d58020910ef8a76723" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-request.json", + "bytes": 2081, + "sha256": "1e2433ed5821bf65443f56cb27381ee935db81b1955d3a539b7952898312a410" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.json", + "bytes": 7012, + "sha256": "0033f8780c2ba69779b811bca792340c25a092f887e5811c6839f0a691d744f2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.manifest.json", + "bytes": 1046, + "sha256": "e3b4a60a56abee779ca8356605c968aa2d99256a3bd3c5601b14b5c5502a1a05" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.arcadia", + "bytes": 5467, + "sha256": "e265cab35097acc46f5123107c13bc35b9f71931ff650557fc1c85779141b327" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.json", + "bytes": 8482, + "sha256": "9b777828d3681138de6bbd08de8bf922bed92c27be60b103d8ff73ce7ddd0a48" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous-request.json", + "bytes": 1379, + "sha256": "7d124256730bf2feee772c7d0118b87eb288e8aaa9179d69ceb9259dbceb2c71" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.arcadia", + "bytes": 4727, + "sha256": "87a5a3665dab2dd6e595867dcebb1586e93dd067c85d6e24b1a4d3ff0ad6d4ba" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-plan.json", + "bytes": 18803, + "sha256": "1888ca51e0923866a9afea99cad069fe5d3f19f0a1b24328e20ac1b9f52d8bad" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-request.json", + "bytes": 2294, + "sha256": "5070a5b85feb1bc7b1fc648cd5d35ef26663492c8666dcd471950c06ec3a6052" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.json", + "bytes": 7641, + "sha256": "725b35e36640c81c70c7efea5c3304bf61b49ef9664194ca0d491782cc62191a" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.manifest.json", + "bytes": 1038, + "sha256": "1b43abf8fed3061c65a7b7cb103d31ea7ece333a2da83c645f8d228448c4dbb2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.arcadia", + "bytes": 5019, + "sha256": "65a6217f474b5085f37b511151185c2c08ff7a1998e924f1fe01f29c410f6ced" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.json", + "bytes": 7835, + "sha256": "8a53bb9b43eab5b6dca5e08deef20c14c96e134b9ee816a99b7960bb5255e008" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous-request.json", + "bytes": 1379, + "sha256": "c704f99245f00d5c3be0562d91931b4e7f1fb3fb36f41991eb76656ffbd6129f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.arcadia", + "bytes": 4279, + "sha256": "c59ec1233d5a9fbb8e386f6d9b13f398be21baf813ba215efb51bfc1bb98db36" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-plan.json", + "bytes": 17938, + "sha256": "30c5c3f614a74708763df612016483623792f4c65e2ed2fa662ac417cfb852eb" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-request.json", + "bytes": 2098, + "sha256": "3b6c35ef78133f0980cb6fb53fbc29c5d3c4deb5dc4be01c2c3384e221987b9b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.json", + "bytes": 6996, + "sha256": "c159c60403abcf8fefab7f19cbad9989488e8ccc20b82c57597b22a0ae254802" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.manifest.json", + "bytes": 1038, + "sha256": "af8a314a9b1d85a8f98affa5a6649f43d252851158798e1ad687bb1b6966b14f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.steps.md", + "bytes": 4549, + "sha256": "6004894e9d9f478b7fe1c3c3e0706dcc546d5df8557cff91b4cf26f8a4badf24" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/15000000-0000-4000-8000-000000000010.json", + "bytes": 1933, + "sha256": "71cca2a59f36b2a07d11dedbe9101226aa1a4a00d8ac244b5565202e56709f51" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/generate.py", + "bytes": 1496, + "sha256": "e44986c1d563499f25917441220b23883fc9cb0f89faf409873191f0212fbd2f" + }, + { + "path": "harness/fixtures/release1-native/state-actions.arcadia", + "bytes": 6224, + "sha256": "9cde82608110e56aa9e14c9e33eb38976f53aed74ab013145d411d5743a0ec26" + }, + { + "path": "harness/fixtures/rest-coverage/README.md", + "bytes": 1870, + "sha256": "df4a391312e0c8b20ccdcc850199443b08547be1b10b1f2447a067bf4bf544e6" + }, + { + "path": "harness/fixtures/rest-coverage/coverage-probe.json", + "bytes": 8008, + "sha256": "699b868dd6c955f7ef02f2f061935471f3d21a406005fcdecba8cc719cc69a1f" + }, + { + "path": "harness/fixtures/rest-coverage/run-coverage-probe.ps1", + "bytes": 9381, + "sha256": "f24f19fca418b76a7249894a08c116e16b465a02f8f899d12b808ccfdd90a3bd" + }, + { + "path": "harness/fixtures/run-timed-bundle-oracle.ps1", + "bytes": 7466, + "sha256": "fab696486a574f9867c6e69a8a8b960e7e9722206441b9cc5f36d41f285f1a25" + }, + { + "path": "harness/fixtures/scenario-authoring/README.md", + "bytes": 14700, + "sha256": "6b651b180b76d10b00bc49d77a8f5e0b3ba0317446978f41b541f5bb23fedad8" + }, + { + "path": "harness/fixtures/scenario-authoring/base/expected-baseline.json", + "bytes": 38589, + "sha256": "abd8246c939ebb8a2162ef82e23d0fb322ee1a8b4d0d7c28a34037e42e86e841" + }, + { + "path": "harness/fixtures/scenario-authoring/base/project.arcadia", + "bytes": 19470, + "sha256": "9b1afbe96b0bf8fa613451b00929492f05a59b9eb2ca74c2c374a8b7bb7cba9e" + }, + { + "path": "harness/fixtures/scenario-authoring/base/rationale.arcadia", + "bytes": 86, + "sha256": "82df210f22f6aa336a3e7e00240977d671c7c3923db7bc58fb29e6d98b67ef49" + }, + { + "path": "harness/fixtures/source7-native/README.md", + "bytes": 7235, + "sha256": "7abccbc3da0980d1d099761d1a66d12c403a0f543954134537ecd4930d182b4b" + }, + { + "path": "harness/fixtures/source7-native/base/expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "harness/fixtures/source7-native/base/project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "harness/fixtures/source7-native/base/rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + }, + { + "path": "harness/fixtures/source7-native/manifest.json", + "bytes": 410, + "sha256": "6c57164a796234d83818d462d0a25f10e77062d405769e602ae2a7bec251e3b6" + }, + { + "path": "harness/fixtures/staged-source-authoring/README.md", + "bytes": 8380, + "sha256": "711910a12d5f3960f32da9aa7bc2e647f31d770c84b7fc26e232dcb3a76f8821" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/notes.arcadia", + "bytes": 63, + "sha256": "ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/project.arcadia", + "bytes": 593, + "sha256": "aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c" + } + ] +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs1.zip b/harness/experiments/text-navigation-native-20260911/corrections/inputs1.zip new file mode 100644 index 00000000..593dcebc Binary files /dev/null and b/harness/experiments/text-navigation-native-20260911/corrections/inputs1.zip differ diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs2-readback.json b/harness/experiments/text-navigation-native-20260911/corrections/inputs2-readback.json new file mode 100644 index 00000000..86bedadc --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/inputs2-readback.json @@ -0,0 +1,7 @@ +{ + "atUtc": "2026-09-11T19:26:35.492216+00:00", + "changed": [], + "added": [], + "removed": [], + "passed": true +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs2.json b/harness/experiments/text-navigation-native-20260911/corrections/inputs2.json new file mode 100644 index 00000000..6fe61ac9 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/inputs2.json @@ -0,0 +1,2504 @@ +{ + "atUtc": "2026-09-11T19:24:56.649727+00:00", + "head": "f4e426ae2a6971395e1ca7e6f094b0c20056cf93", + "branch": "codex/release1-9e8r6t", + "scope": "Exact Windows gate source inputs; no compiler or native result implied.", + "archiveSha256": "fa2fa9dfe4ae329abb9d01bd200a74fc829233824a896b4276942f4eb0f01cbc", + "files": [ + { + "path": "Cargo.lock", + "bytes": 119453, + "sha256": "2b960242c33eb839ff008d01731f6d5cdb4e047ca8cd6e13151cbf9c09913510" + }, + { + "path": "Cargo.toml", + "bytes": 400, + "sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62" + }, + { + "path": "crates/oa-cli/Cargo.toml", + "bytes": 279, + "sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde" + }, + { + "path": "crates/oa-cli/src/lib.rs", + "bytes": 15498, + "sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc" + }, + { + "path": "crates/oa-cli/src/main.rs", + "bytes": 2984, + "sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb" + }, + { + "path": "crates/oa-cli/tests/source_cli.rs", + "bytes": 16600, + "sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8" + }, + { + "path": "crates/oa-core/Cargo.toml", + "bytes": 342, + "sha256": "64824ec447be777841a972bf06c894ef2624a37e4725583bcfe0389deb9f00a3" + }, + { + "path": "crates/oa-core/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-core/examples/generate_demo.rs", + "bytes": 795, + "sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661" + }, + { + "path": "crates/oa-core/examples/generate_release1.rs", + "bytes": 1798, + "sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5" + }, + { + "path": "crates/oa-core/examples/release_dense_views.rs", + "bytes": 14664, + "sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412" + }, + { + "path": "crates/oa-core/examples/routing_workshop.rs", + "bytes": 17248, + "sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7" + }, + { + "path": "crates/oa-core/src/data.rs", + "bytes": 42696, + "sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a" + }, + { + "path": "crates/oa-core/src/demo.rs", + "bytes": 20657, + "sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c" + }, + { + "path": "crates/oa-core/src/language.rs", + "bytes": 105312, + "sha256": "34cbb144a111e6f0ddadfca7d40636a8e3323fe65ea8920fd2402f0352b41f57" + }, + { + "path": "crates/oa-core/src/language/semantic_source.rs", + "bytes": 7326, + "sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29" + }, + { + "path": "crates/oa-core/src/language_nesting_tests.rs", + "bytes": 20639, + "sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b" + }, + { + "path": "crates/oa-core/src/language_outline_tests.rs", + "bytes": 14877, + "sha256": "4c79a01e8aea243dd9ef66ce71b9fae263d0e79c319a46c51223679897e8b9df" + }, + { + "path": "crates/oa-core/src/lib.rs", + "bytes": 523, + "sha256": "52cb6ee7a4ffc00711ecf121c1a1b14ca154863f7ca27b0d2a8e239edce8aca7" + }, + { + "path": "crates/oa-core/src/migration_v2/README.md", + "bytes": 1515, + "sha256": "fb61d3faa33d7bdfba73415415a0882c0fbd3e0b45df42f972a19aec6da927b9" + }, + { + "path": "crates/oa-core/src/migration_v2/adapter.rs", + "bytes": 9490, + "sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5" + }, + { + "path": "crates/oa-core/src/migration_v2/mod.rs", + "bytes": 1158, + "sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9" + }, + { + "path": "crates/oa-core/src/migration_v2/model.rs", + "bytes": 52059, + "sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb" + }, + { + "path": "crates/oa-core/src/migration_v2/references.rs", + "bytes": 13369, + "sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20" + }, + { + "path": "crates/oa-core/src/migration_v2/source.rs", + "bytes": 21946, + "sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6" + }, + { + "path": "crates/oa-core/src/migration_v2/state_validation.rs", + "bytes": 15769, + "sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0" + }, + { + "path": "crates/oa-core/src/migration_v2/transitions.rs", + "bytes": 704, + "sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1" + }, + { + "path": "crates/oa-core/src/migration_v2/validation.rs", + "bytes": 98736, + "sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780" + }, + { + "path": "crates/oa-core/src/migration_v3/README.md", + "bytes": 2128, + "sha256": "3755a63f840d7f0eadf68afa7a9d587877a9468ff982d3610539e8a0bb067a82" + }, + { + "path": "crates/oa-core/src/migration_v3/mod.rs", + "bytes": 23023, + "sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722" + }, + { + "path": "crates/oa-core/src/migration_v4.rs", + "bytes": 4020, + "sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70" + }, + { + "path": "crates/oa-core/src/model.rs", + "bytes": 66352, + "sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb" + }, + { + "path": "crates/oa-core/src/operations.rs", + "bytes": 11405, + "sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41" + }, + { + "path": "crates/oa-core/src/persistence.rs", + "bytes": 31774, + "sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14" + }, + { + "path": "crates/oa-core/src/ports.rs", + "bytes": 45413, + "sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80" + }, + { + "path": "crates/oa-core/src/projection.rs", + "bytes": 21374, + "sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b" + }, + { + "path": "crates/oa-core/src/projection/port_layout.rs", + "bytes": 13474, + "sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079" + }, + { + "path": "crates/oa-core/src/projection/state.rs", + "bytes": 5233, + "sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28" + }, + { + "path": "crates/oa-core/src/references.rs", + "bytes": 21957, + "sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb" + }, + { + "path": "crates/oa-core/src/routing.rs", + "bytes": 50309, + "sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080" + }, + { + "path": "crates/oa-core/src/semantic.rs", + "bytes": 540, + "sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239" + }, + { + "path": "crates/oa-core/src/semantic/catalog.rs", + "bytes": 49407, + "sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4" + }, + { + "path": "crates/oa-core/src/semantic/historical.rs", + "bytes": 15271, + "sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb" + }, + { + "path": "crates/oa-core/src/semantic/linked.rs", + "bytes": 6035, + "sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2" + }, + { + "path": "crates/oa-core/src/semantic/mutate.rs", + "bytes": 22683, + "sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d" + }, + { + "path": "crates/oa-core/src/semantic/review.rs", + "bytes": 51116, + "sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e" + }, + { + "path": "crates/oa-core/src/semantic/types.rs", + "bytes": 10405, + "sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb" + }, + { + "path": "crates/oa-core/src/session.rs", + "bytes": 35237, + "sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00" + }, + { + "path": "crates/oa-core/src/source_files.rs", + "bytes": 74803, + "sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683" + }, + { + "path": "crates/oa-core/src/source_project.rs", + "bytes": 61843, + "sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466" + }, + { + "path": "crates/oa-core/src/source_project/source_migration.rs", + "bytes": 4700, + "sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95" + }, + { + "path": "crates/oa-core/src/source_project/source_structure.rs", + "bytes": 20225, + "sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f" + }, + { + "path": "crates/oa-core/src/state_validation.rs", + "bytes": 15665, + "sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18" + }, + { + "path": "crates/oa-core/src/topology_context.rs", + "bytes": 13734, + "sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d" + }, + { + "path": "crates/oa-core/src/topology_context/analysis.rs", + "bytes": 20036, + "sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65" + }, + { + "path": "crates/oa-core/src/topology_context/analysis_tests.rs", + "bytes": 5258, + "sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56" + }, + { + "path": "crates/oa-core/src/transitions.rs", + "bytes": 51998, + "sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d" + }, + { + "path": "crates/oa-core/src/transitions/communication.rs", + "bytes": 8634, + "sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028" + }, + { + "path": "crates/oa-core/src/validation.rs", + "bytes": 112792, + "sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e" + }, + { + "path": "crates/oa-core/src/validation/coverage.rs", + "bytes": 6478, + "sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f" + }, + { + "path": "crates/oa-core/src/view_options.rs", + "bytes": 24481, + "sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208" + }, + { + "path": "crates/oa-core/src/view_options_tests.rs", + "bytes": 21433, + "sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208" + }, + { + "path": "crates/oa-core/tests/communication_boundary_scenarios.rs", + "bytes": 8816, + "sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b" + }, + { + "path": "crates/oa-core/tests/communication_means.rs", + "bytes": 18102, + "sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4" + }, + { + "path": "crates/oa-core/tests/coverage_diagnostics.rs", + "bytes": 20527, + "sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.arcadia", + "bytes": 29220, + "sha256": "f0df129c1914bfc01d0b047b0cd4b520d8cf0c249ea9ced085de400c0be87ff3" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.json", + "bytes": 43990, + "sha256": "3ed53508eb544bbd788832f7bebea2ec31b3d66191f24f45098cc9750ec4c005" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.arcadia", + "bytes": 2450, + "sha256": "305f19d1b79f99f8d4cf627ba2e9ca6836bb7959cc0070227815937a699eafea" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.json", + "bytes": 8240, + "sha256": "1b41299c53204e6232397d25a58d5bccdbbc16e770c75e8edb55ce36ccfe58a2" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.arcadia", + "bytes": 1222, + "sha256": "5fa53a26a5ad010c8e59eb56d9b2b52003569e66c0377ffb58840590168ad0c1" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.json", + "bytes": 1734, + "sha256": "2808088afcc165f4bd6da5129151143411c997041c3de61d600ab76e05d24a47" + }, + { + "path": "crates/oa-core/tests/language.rs", + "bytes": 56482, + "sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e" + }, + { + "path": "crates/oa-core/tests/port_anchors.rs", + "bytes": 26893, + "sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa" + }, + { + "path": "crates/oa-core/tests/port_migration.rs", + "bytes": 15620, + "sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7" + }, + { + "path": "crates/oa-core/tests/port_source.rs", + "bytes": 4858, + "sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12" + }, + { + "path": "crates/oa-core/tests/prepared_commands.rs", + "bytes": 9555, + "sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b" + }, + { + "path": "crates/oa-core/tests/process_diagnostics.rs", + "bytes": 1104, + "sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906" + }, + { + "path": "crates/oa-core/tests/r3_constructor_ack.rs", + "bytes": 24163, + "sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0" + }, + { + "path": "crates/oa-core/tests/r3_migration.rs", + "bytes": 6590, + "sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd" + }, + { + "path": "crates/oa-core/tests/r3_semantic.rs", + "bytes": 77473, + "sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32" + }, + { + "path": "crates/oa-core/tests/r3_source.rs", + "bytes": 15311, + "sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408" + }, + { + "path": "crates/oa-core/tests/r6_data.rs", + "bytes": 41437, + "sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155" + }, + { + "path": "crates/oa-core/tests/r6_migration.rs", + "bytes": 9174, + "sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1" + }, + { + "path": "crates/oa-core/tests/r6_source.rs", + "bytes": 9519, + "sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6" + }, + { + "path": "crates/oa-core/tests/release1_teaching.rs", + "bytes": 10010, + "sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2" + }, + { + "path": "crates/oa-core/tests/release_capabilities.rs", + "bytes": 19422, + "sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30" + }, + { + "path": "crates/oa-core/tests/release_diagrams.rs", + "bytes": 7689, + "sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d" + }, + { + "path": "crates/oa-core/tests/release_language_limits.rs", + "bytes": 5204, + "sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806" + }, + { + "path": "crates/oa-core/tests/release_ports.rs", + "bytes": 32740, + "sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1" + }, + { + "path": "crates/oa-core/tests/release_routing.rs", + "bytes": 23165, + "sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462" + }, + { + "path": "crates/oa-core/tests/release_scenarios.rs", + "bytes": 41067, + "sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f" + }, + { + "path": "crates/oa-core/tests/release_states.rs", + "bytes": 26873, + "sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811" + }, + { + "path": "crates/oa-core/tests/release_topology.rs", + "bytes": 17643, + "sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9" + }, + { + "path": "crates/oa-core/tests/review_regressions.rs", + "bytes": 21823, + "sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1" + }, + { + "path": "crates/oa-core/tests/route_source.rs", + "bytes": 7270, + "sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb" + }, + { + "path": "crates/oa-core/tests/routing_geometry.rs", + "bytes": 31890, + "sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3" + }, + { + "path": "crates/oa-core/tests/routing_labels.rs", + "bytes": 5530, + "sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6" + }, + { + "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs", + "bytes": 4640, + "sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a" + }, + { + "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs", + "bytes": 14957, + "sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970" + }, + { + "path": "crates/oa-core/tests/source6_view_contract.rs", + "bytes": 14307, + "sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb" + }, + { + "path": "crates/oa-core/tests/source7_contract.rs", + "bytes": 43262, + "sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f" + }, + { + "path": "crates/oa-core/tests/source_files.rs", + "bytes": 13168, + "sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9" + }, + { + "path": "crates/oa-core/tests/source_identity_updates.rs", + "bytes": 5139, + "sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c" + }, + { + "path": "crates/oa-core/tests/source_nested_updates.rs", + "bytes": 16892, + "sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855" + }, + { + "path": "crates/oa-core/tests/source_project.rs", + "bytes": 45910, + "sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942" + }, + { + "path": "crates/oa-core/tests/state_diagrams.rs", + "bytes": 23973, + "sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5" + }, + { + "path": "crates/oa-core/tests/workflows.rs", + "bytes": 33426, + "sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b" + }, + { + "path": "crates/oa-desktop/Cargo.toml", + "bytes": 842, + "sha256": "f3547b2b924d5db6706c0a8e069014b440ff65315d82fc8aced0360af4b3cdc9" + }, + { + "path": "crates/oa-desktop/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 214840, + "sha256": "411007f8c192e0fc581f3c6bcfc49ab46b900a841ee20ae96203d4db64c9280f" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring.rs", + "bytes": 27835, + "sha256": "37c7db33e99dd4adcc5a51f09ee4878af94fd32413359890a541690080885f65" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/palette.rs", + "bytes": 8887, + "sha256": "8f9937cb30b48b83759fd084a8a5990a2daa3920280f1210abe048560241985a" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/tests.rs", + "bytes": 14732, + "sha256": "ed864839940a1910c97537b6ee151b57ab115ece6f60bae602552b84f9af4a5d" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring_tests.rs", + "bytes": 18599, + "sha256": "77eb1a0038d038b989f7ac568760e16fe23c4b8d73cd9fbe32b70817ea23cfec" + }, + { + "path": "crates/oa-desktop/src/app/behavior_lifecycle_tests.rs", + "bytes": 13669, + "sha256": "1af2e290aa259a6af6b0585950cda93fe3a562c7b8be1e938fe1d80747b11808" + }, + { + "path": "crates/oa-desktop/src/app/checkpoints.rs", + "bytes": 29576, + "sha256": "55e5babdcabef767af3bc8be9cc3153b3f5cc0695701b890820ec0225643852e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_selection_tests.rs", + "bytes": 5582, + "sha256": "4fa507adbc23db3a6eb202d809c695ec0ebd6181356930c4fa7528a9a0c7be57" + }, + { + "path": "crates/oa-desktop/src/app/hosted.rs", + "bytes": 25905, + "sha256": "14e2fcd79558ff56d000571f1f576e5601818d702783634aa4017000d382c62a" + }, + { + "path": "crates/oa-desktop/src/app/hosted/tests.rs", + "bytes": 30344, + "sha256": "fa118f64d04b400ccc01e4e67adaf3541975288882afa265a9e7f092cdbda232" + }, + { + "path": "crates/oa-desktop/src/app/process_canvas.rs", + "bytes": 28640, + "sha256": "11e991afbce187ae633e01214b2509a13623c940f1f5e6416aaee204158bc5a4" + }, + { + "path": "crates/oa-desktop/src/app/review_navigation_tests.rs", + "bytes": 7049, + "sha256": "5ebba36092cc89fcba394578e69c9507ad5a369e9a26526761716b5d4ee3ad75" + }, + { + "path": "crates/oa-desktop/src/app/save_as_tests.rs", + "bytes": 4113, + "sha256": "f8b915793f1a36fd152569c4781a4bdc17f4af404a8ceb373330053413087a1c" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols.rs", + "bytes": 18627, + "sha256": "99370865b548b28f32f4c6ce7e9f8eeaa0c80268a644f2ebcc4bd1e11695e59c" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols/tests.rs", + "bytes": 57781, + "sha256": "33292a7ce9b61dbc134f74372caa93af9704e2f968cd698da13ea6a1b8cf3ea6" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram.rs", + "bytes": 9979, + "sha256": "f7fd50cc9a86adb794713958348af63afc7c698f74965e13188b7b8a9e735c55" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram_tests.rs", + "bytes": 39957, + "sha256": "612e414b1a2cab12cbfd8fce23745559ff27577700694d53af67ad1f2883ee2c" + }, + { + "path": "crates/oa-desktop/src/app/transition_context_tests.rs", + "bytes": 11508, + "sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d" + }, + { + "path": "crates/oa-desktop/src/app/view_copy_tests.rs", + "bytes": 7846, + "sha256": "296821c51dcde568e7d717039aa26bfc1b56a9074aa16051007bb351b33a4d44" + }, + { + "path": "crates/oa-desktop/src/behavior.rs", + "bytes": 131449, + "sha256": "c9e0aea6a24cc982d0d82ee2b9b66f250cdfac037b36bf6b1b9d7dd38246cd3c" + }, + { + "path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs", + "bytes": 49386, + "sha256": "5f05318a6533503b9d6febf1ec4dd7256f192394bc1b952a7904c8175bd8ddae" + }, + { + "path": "crates/oa-desktop/src/behavior/creation.rs", + "bytes": 30053, + "sha256": "0fb19be3a5688c4bd3ca3643c47a97da7e7f85add8a860cd046a0d9cb3ce9dfc" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/app_tests.rs", + "bytes": 13181, + "sha256": "e9c5bf2b07357b7a2f679ae0d8f6904c1c1461aaeb94fa0db478b54d4641ae3e" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/tests.rs", + "bytes": 22793, + "sha256": "a0d1daf9fb3920f7e6181a9802d84fbe056cbf0043b9e41dba5fdda687d9818a" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario.rs", + "bytes": 149092, + "sha256": "d12a4b1caa61c08f69c4d2a64bd15568c4b7158dea91aac5a52a58a35adb863c" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace.rs", + "bytes": 32785, + "sha256": "69c7ad32e4bdc39f42d2e6c7764cfe1fa7867cd7dbcf9b904dec805e6c912666" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace/tests.rs", + "bytes": 35390, + "sha256": "abfc7caefb0de5bd479eb4af1b159ca77b68e6a157f477939628c3d5c90b44b6" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_operation_tests.rs", + "bytes": 10087, + "sha256": "89fb71c690e07eac314f7a5e05862d5c1e2f9c21039673bf22c4ac894d21c977" + }, + { + "path": "crates/oa-desktop/src/behavior/source_draft.rs", + "bytes": 39485, + "sha256": "85d543cc288e48b4c13001e4e386b5b54d9b1e349a5ac31e4e307572f2d8fb3c" + }, + { + "path": "crates/oa-desktop/src/behavior/state_canvas.rs", + "bytes": 93561, + "sha256": "2e2ad57b86f4cc1cc0c4c4c230571ef19bcc2f052001a8bdcc44925e5103077a" + }, + { + "path": "crates/oa-desktop/src/behavior/state_edit.rs", + "bytes": 35736, + "sha256": "cb2289e727163626152fc2f11195c6ee824851cb9442c57496da97fe7aebfb7c" + }, + { + "path": "crates/oa-desktop/src/behavior/state_menu.rs", + "bytes": 7447, + "sha256": "cc87c5caa177e114e4d9a7f7367e37ec2b0d1e1c16b0b99709b05ea0e59cf894" + }, + { + "path": "crates/oa-desktop/src/behavior/state_view.rs", + "bytes": 6988, + "sha256": "1eb892a9139ecb0671784c879ee5114f27e598e5b3589f5cdad0abffd5909f24" + }, + { + "path": "crates/oa-desktop/src/behavior/states.rs", + "bytes": 26986, + "sha256": "8986ed9492960e20f1254e9dfe3ff91d79ce9fef66f3bda738f9933278043954" + }, + { + "path": "crates/oa-desktop/src/behavior/topology.rs", + "bytes": 83845, + "sha256": "d06b2f0fc39b4814e94200297e148f1d4d97e04cb167766030ac9df18689e3b0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual.rs", + "bytes": 29107, + "sha256": "edc84fc69d8d4a8f4ce81a4452c4e2e35cfaf98addeed10235f392506c74e8b0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual_routing.rs", + "bytes": 16731, + "sha256": "d914b0e82aa8d253fe64be2ef74443d1fd2e6cec26d1cf30620a57646e1d426c" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct.rs", + "bytes": 32036, + "sha256": "413aa2009ee4cba0941836b43e41f16a04c8fc8568b6e92db5bb08516e95c287" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct_tests.rs", + "bytes": 54304, + "sha256": "ac8c8023117e31723084adb06e3ca7fd4ea3f95ad229622ccc759fa19b50c27e" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/layout_tests.rs", + "bytes": 14815, + "sha256": "4529ac8b05de769a2ada112473146fbfa27b0467d97d3541b86c4446b6050b83" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/view.rs", + "bytes": 29176, + "sha256": "a7d806cd621bdf857c4e4861685cd3eb556b320de3985b9cc3d9d131dad370dc" + }, + { + "path": "crates/oa-desktop/src/connection_edit.rs", + "bytes": 5301, + "sha256": "020581e077f82b43c936b623cc51733b02b88428df4e5f25df74b9705819fa37" + }, + { + "path": "crates/oa-desktop/src/connection_tool.rs", + "bytes": 27023, + "sha256": "649da93677d52dae495b0e19bc32f3122ab05a6d84de8402578ff5ce3f6ee1d3" + }, + { + "path": "crates/oa-desktop/src/context_menu.rs", + "bytes": 52955, + "sha256": "629354b34dc232763700251f2695b4d4e53d6251c0b1432ecc0dfe424f7dfeac" + }, + { + "path": "crates/oa-desktop/src/data_values.rs", + "bytes": 23877, + "sha256": "e1deb1cad551f0a9fdef9653aad257cfb36e6d9c0f93b6245061ec3fab8fd365" + }, + { + "path": "crates/oa-desktop/src/data_view.rs", + "bytes": 38871, + "sha256": "158b852be5d3db450aa5cda8b68a35bd96bddce1d8d053a7a23582095c06362d" + }, + { + "path": "crates/oa-desktop/src/diagram.rs", + "bytes": 105256, + "sha256": "4580b170e264d14e5cfa874709f6d2e076a05155bfbe1809336a9d05f75e98ef" + }, + { + "path": "crates/oa-desktop/src/diagram/lifecycle_tests.rs", + "bytes": 9316, + "sha256": "d0e72cc0574657d5a31c3ce307b58401d0ed77eedccd1aa02377f55ab0bc03f0" + }, + { + "path": "crates/oa-desktop/src/diagram/pointer_tests.rs", + "bytes": 11833, + "sha256": "10ca5049034159205ac8f22805354f308b0ba0596f331568c26cd1393bc8cedc" + }, + { + "path": "crates/oa-desktop/src/diagram/port_hit_tests.rs", + "bytes": 5624, + "sha256": "d2d0647629bf725b4dddfc211f5a27d495ed093a79af87cdae6c196f09a97b93" + }, + { + "path": "crates/oa-desktop/src/diagram/port_labels.rs", + "bytes": 13408, + "sha256": "28782983b82e4fca5dd4410ac8bd562359943b7010c7b24ecc42f0c7ad7fb63e" + }, + { + "path": "crates/oa-desktop/src/diagram/view_options_tests.rs", + "bytes": 2815, + "sha256": "cf0c98a7715558baf17b59f67a80556f98ad30262b4434635e617c6601775433" + }, + { + "path": "crates/oa-desktop/src/document.rs", + "bytes": 31080, + "sha256": "2ecc2cd496d4a83fd7a32b9dc68e49f0f1cb31a06263dfd6939b4764da5b73e2" + }, + { + "path": "crates/oa-desktop/src/document_save_as_tests.rs", + "bytes": 5781, + "sha256": "83dc243a25f4e97674ff0d86c794a490cc923e98f1f9fb05bb038f622f11e20b" + }, + { + "path": "crates/oa-desktop/src/explorer.rs", + "bytes": 14764, + "sha256": "fa01c59219564ba9ae5553abc2b6f94e9849f9148d5812ef99b40318fe5dcf9a" + }, + { + "path": "crates/oa-desktop/src/explorer_view.rs", + "bytes": 13773, + "sha256": "a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f" + }, + { + "path": "crates/oa-desktop/src/forms.rs", + "bytes": 106002, + "sha256": "e5c0805b93daf0e8244d4be32e5a0dd3a1856c281a9d9fb5f98497dcc43c4da2" + }, + { + "path": "crates/oa-desktop/src/forms/context_fields.rs", + "bytes": 10831, + "sha256": "eaacd474f6500dd344d5a8b63ccb1d1dd86fe2aea78ab708afa8a80d62ce69bf" + }, + { + "path": "crates/oa-desktop/src/forms/data_fields.rs", + "bytes": 49285, + "sha256": "f56397886d74086d69783f18fab961e13b0af05a8bb0d10d0dfa187cdad05f5c" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields.rs", + "bytes": 27414, + "sha256": "e7100474cde18bdfe95562bcb3c055f29b4b15aa64788a578194464aebcd046e" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields/tests.rs", + "bytes": 33950, + "sha256": "16d3c308138c063f45986d53c621ad83c7dc2ce853edd31b7204e2939a382df9" + }, + { + "path": "crates/oa-desktop/src/forms/port_fields.rs", + "bytes": 30554, + "sha256": "3fe684d651d5be6203fd9db3979c772913e1af5ac1514e67be386ffd88dc8127" + }, + { + "path": "crates/oa-desktop/src/forms/view_fields.rs", + "bytes": 24987, + "sha256": "5184d438f0dfd4e29f284ff048e19da73e71be1f24a6e9f123c7e922aecb85fa" + }, + { + "path": "crates/oa-desktop/src/guide.rs", + "bytes": 115874, + "sha256": "64c782afebecad5489d3bf06b41f3273904222c18e3244990f2749c991c92b55" + }, + { + "path": "crates/oa-desktop/src/highlight.rs", + "bytes": 2751, + "sha256": "da7c254fff7052e5fd9ec7469f473b91a819406028d7c304f6e22c4169561600" + }, + { + "path": "crates/oa-desktop/src/home.rs", + "bytes": 17587, + "sha256": "f03c1071334894f586a5a7c86026602a694db3c2faf902822e1dbe5156a859c2" + }, + { + "path": "crates/oa-desktop/src/home/tests.rs", + "bytes": 8167, + "sha256": "3b03ccfc97dfb75954e1e0ed568bb87a632295c07b96cedc05ed381f87b378f3" + }, + { + "path": "crates/oa-desktop/src/hosted/client.rs", + "bytes": 21912, + "sha256": "54b24b4b50f8d87d7c92946ea5a2cff4c98760e70555b3ce3d90be27115e95d4" + }, + { + "path": "crates/oa-desktop/src/hosted/client_tests.rs", + "bytes": 23009, + "sha256": "3ef70907ca75e098d631c41b90badd4cff1e1eb1b3c78e15a9f811c13ba8ffbe" + }, + { + "path": "crates/oa-desktop/src/hosted/mod.rs", + "bytes": 3744, + "sha256": "1b75e11c80fcb38fd20bb3487e3f88729fdac73e471c5ae64da28c249f77c63b" + }, + { + "path": "crates/oa-desktop/src/hosted/view.rs", + "bytes": 9281, + "sha256": "fc0c7b7ce3a5f05c49713df6661067751f81e810af11c614ca265ea9490e6463" + }, + { + "path": "crates/oa-desktop/src/main.rs", + "bytes": 1511, + "sha256": "cb0a919fd0df0924591283da5b55d64d525d8461640441509350be840235e51a" + }, + { + "path": "crates/oa-desktop/src/model_menu.rs", + "bytes": 34680, + "sha256": "12994a5433a91f8295a59d4bf40f35f1edb8d8dbb497a11eae8760299627f1d4" + }, + { + "path": "crates/oa-desktop/src/navigation.rs", + "bytes": 8839, + "sha256": "71355a12e1b4791106426d83fe5ebf0b29bce8e1dc594f0655ab85695469669e" + }, + { + "path": "crates/oa-desktop/src/port_edit.rs", + "bytes": 7809, + "sha256": "70b99f577c4fdeda8780c8dc1ee7b1639fd77aaca06658f06d725139fb3efb6d" + }, + { + "path": "crates/oa-desktop/src/port_preview.rs", + "bytes": 35855, + "sha256": "069487c4ece737d52e8ae4a84dcfb132236aca6799e841c91c8e7244320cf871" + }, + { + "path": "crates/oa-desktop/src/port_workflow.rs", + "bytes": 40582, + "sha256": "ccc15f97c3272145a67bb5857b4faeaf7437561bd61912fa27ab26e8824146a0" + }, + { + "path": "crates/oa-desktop/src/recovery.rs", + "bytes": 21041, + "sha256": "57e22e5fbb0e994e64ae03e69450271fe9f04a951db1670c2a018abe99db4489" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/README.md", + "bytes": 1587, + "sha256": "a90002df1e087d2dac7be26926864243568a0de7c4103e4927435b34178e8016" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/profiles.json", + "bytes": 473, + "sha256": "2c12ae96b50e6da5d60ce2b7fa00204be71dfbe2fd51311fc337a0de6a4332ff" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-bundle.json", + "bytes": 80974, + "sha256": "12715995e6f7f35414aea53b3ad720b9b31873ffdeaf4444231db1a5ac3c463e" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-model.json", + "bytes": 86191, + "sha256": "5535a706df9ec21715e8b6a5aa6dbd79636ae461450aee61305559016167612b" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-bundle.json", + "bytes": 85286, + "sha256": "ea88890a33f47d67dfb06d6dbbcc179058cf28dad76ae7d615c00aaf30dbbbfe" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-model.json", + "bytes": 90629, + "sha256": "5bb8db0b6394276666323483f977ac3586f88554c81a148c6d508fca0ef4576f" + }, + { + "path": "crates/oa-desktop/src/recovery/source5.rs", + "bytes": 6956, + "sha256": "0f0a763f0c98c2c908d4c2b95d8a4c042b6a255ee1cc16260e5404669691f642" + }, + { + "path": "crates/oa-desktop/src/recovery/source5_tests.rs", + "bytes": 12146, + "sha256": "cfd17a742f1f27b523fce7cd9309f0a07a30413395f6c58659fb91d02834a7a3" + }, + { + "path": "crates/oa-desktop/src/recovery/source7_tests.rs", + "bytes": 18213, + "sha256": "7ee61de66c75bf949489ba51ddc9677e2b4efc68801cf27909c9b894bfdc9288" + }, + { + "path": "crates/oa-desktop/src/route_edit.rs", + "bytes": 2941, + "sha256": "457ae59c2761a43a8620b4d336a7cf0f54b965997110ecaf968756a88b6b0374" + }, + { + "path": "crates/oa-desktop/src/semantic_review.rs", + "bytes": 3240, + "sha256": "916192003637b60c12f6b3b3663a5b9c770ae4d10d51a415f6b3e4035e30fe13" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts.rs", + "bytes": 24201, + "sha256": "a79236a8150597ff808597e59cf4f1e9e61c74c4901d9c8cf42d3427bb52a9a8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_recovery_falsifier_tests.rs", + "bytes": 11034, + "sha256": "3f255d04e4bffa5a467b75e3cbf6f7149aa3269a02f2a89fbaa1db0e5df9ae62" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_tests.rs", + "bytes": 20798, + "sha256": "04d0dd2ac453705185663f705282aa4a3a31433466a5be305764248da1a03c32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_view.rs", + "bytes": 6594, + "sha256": "e8ce3d844d6230c20fe2fda4d0fb256af8043f9b586160a8d110665c45a79561" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments.rs", + "bytes": 18160, + "sha256": "de0ec0c740895b160ff5b847332c087c3f1a48931583464069470cc61315ed59" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_tests.rs", + "bytes": 29389, + "sha256": "8b26be0324e0f33b1e7cf7af340350df8ed98963002d6da8589ee0e6f6900bea" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_view.rs", + "bytes": 3111, + "sha256": "cd8c4418b43d207fcc55a82a2364cd84053643e5c09c96de008c94b8372653fa" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch.rs", + "bytes": 31771, + "sha256": "44830e1a9fa572493d423545336f76e79fa24ef29900e4f7927cbc83f9071d17" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch_tests.rs", + "bytes": 27546, + "sha256": "2a8131b81322e6a49b1348c6efec4526a3df53c8eefc0a2b25c746e2b7c6ead8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose.rs", + "bytes": 27155, + "sha256": "c6adcc9882dde65e9f04f6eda7f0c855c5cbb285cf421123029169112793ce9b" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose_diagnostic_tests.rs", + "bytes": 9809, + "sha256": "440daf8d43278ef981c620d1818d0daaed8fb83193b8e8ff67b2e42fbf882938" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructor_tests.rs", + "bytes": 54132, + "sha256": "85149521ad7df62918f6f2fab6da2b3346c342ab4bce7100de3f6206c1e81096" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructors.rs", + "bytes": 12258, + "sha256": "0982163439b06a42d9af1643530364109282e63f05b323a35a76d8241f3caa32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/history.rs", + "bytes": 3211, + "sha256": "df038c2464eab8093a983f3104f0d04ca8f602010a50e1d3eeb8e53f2309e201" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed.rs", + "bytes": 14525, + "sha256": "f8db8578ecff84526bda96c233b50e56f1cf1c5b8ab04cbbaa04f9b5e78300f0" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows.rs", + "bytes": 13567, + "sha256": "af9b137fe56ff3a71378e9998bfbb7b68f035bd542aa6fa90b83e04796cf4b38" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows_tests.rs", + "bytes": 30804, + "sha256": "1a3b09e7ed100411cdf8043f9a78defc664a873ee0201117709185c201a5c57f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_tests.rs", + "bytes": 31955, + "sha256": "112a2d50130407a4a1069827e4e5d5a8681e672dd3e54b559c6d3dde4302a298" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind.rs", + "bytes": 789, + "sha256": "4ed19952ea511d1b3226564a138e3322f994371d6b49794c14bc3689d1393e7f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind_tests.rs", + "bytes": 23424, + "sha256": "5fcf9930e949aebeb12eab0327264f32a2388d62dbf098bd2365711e22623c52" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered.rs", + "bytes": 9959, + "sha256": "8b809e8b0958e553896829b655684084bf2f0ca7df9d40c6acbdad8749cd6342" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered_tests.rs", + "bytes": 22383, + "sha256": "5c8ea3a69e3da3b94d13f50f12aa7dc53246ccba25ffcace9552a0eb76b0bf36" + }, + { + "path": "crates/oa-desktop/src/semantic_review/recovery.rs", + "bytes": 28769, + "sha256": "88e69044d90c481593bab7cc125f0401c05202fccdde07698cec9483947fe8be" + }, + { + "path": "crates/oa-desktop/src/semantic_review/row.rs", + "bytes": 36972, + "sha256": "ecde54540071fde82d8d580d0da2fccd16d6b8e0144bd5e129afe91455f73bb1" + }, + { + "path": "crates/oa-desktop/src/semantic_review/scalar.rs", + "bytes": 15153, + "sha256": "9ad202174934dd9a63fbf9cba43135aead571db60846c8b7b1d3019a11df26c2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/source7_tests.rs", + "bytes": 11665, + "sha256": "5e8221d77b068fa30c1571988448cb8829711735881d810f3d333cbc95d34a9f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/tests.rs", + "bytes": 32480, + "sha256": "8839e241cf81d1e66abe072728eee1870b42341fbbefae9f39bda1b1a020f4ba" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view.rs", + "bytes": 57336, + "sha256": "c391814442cd5e95040c6dab9d511a254181de56c68d5c266d879870001561ad" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view_reserved_artifact_tests.rs", + "bytes": 4737, + "sha256": "6c766b29c8664d15cb113d2cc71bba9b60ae4ccf7e44c9c5d3c41e1dc4b7ed90" + }, + { + "path": "crates/oa-desktop/src/source_navigation.rs", + "bytes": 4030, + "sha256": "3f7007bc3b3ef6266e92ea4121cfbdb32df2e97713797b403ce6649070a90517" + }, + { + "path": "crates/oa-desktop/src/source_navigation/controller.rs", + "bytes": 3374, + "sha256": "4ec54ce769f047d6e5c1de6bdbe81648ad63c75cfd04aea5356bd5663126d77c" + }, + { + "path": "crates/oa-desktop/src/source_navigation/interaction.rs", + "bytes": 8808, + "sha256": "c6efa6105b8ba46655e27a89b9fa59e6fc01a4c6f331f886e035af1e70cbf8a9" + }, + { + "path": "crates/oa-desktop/src/source_navigation/interaction/tests.rs", + "bytes": 6616, + "sha256": "6cf5c5944b9c46c275c9039f7166b627fa9176187b39348152f67040c92c95e1" + }, + { + "path": "crates/oa-desktop/src/source_navigation/query.rs", + "bytes": 35200, + "sha256": "aa8e8e9d446b57c30520c4b3ca1ae9fe524cecb2f4f4f4b229d930ea0377ecca" + }, + { + "path": "crates/oa-desktop/src/source_navigation/query_tests.rs", + "bytes": 29720, + "sha256": "a4ecc95a49d0a9325cbf1548cf95a8d367f758f8eb1f44346a2b71ef046f6668" + }, + { + "path": "crates/oa-desktop/src/source_navigation/symbols.rs", + "bytes": 68862, + "sha256": "d6c9325223fb3f18e887a63187b67aa59735d4e51f501c9e27ebb870944912ec" + }, + { + "path": "crates/oa-desktop/src/source_tree.rs", + "bytes": 21816, + "sha256": "4d55e0110a1eb128a5d26c28f3aae5853d79b7245812b7c82bd275f38440a5aa" + }, + { + "path": "crates/oa-desktop/src/source_workspace.rs", + "bytes": 24090, + "sha256": "388c71f63829c0c76526a1700ebf5f240c86c467a65aae4fca4cd6c6a88c468b" + }, + { + "path": "crates/oa-desktop/src/style.rs", + "bytes": 3015, + "sha256": "05d61bec16141612ccafa0988e8c4827f41754509efdb3b961eab69127ded896" + }, + { + "path": "crates/oa-desktop/src/tests.rs", + "bytes": 58663, + "sha256": "94e340b8ef7f9a3bb71fd2a2098dbb9c3d2bb3adba25b5949430b714e36fdfe1" + }, + { + "path": "crates/oa-desktop/src/view_copy.rs", + "bytes": 9043, + "sha256": "5630f31c942e1226aafd67eabdace6a5c5494875bdc6f7f077019e8110ba41a9" + }, + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 67215, + "sha256": "32a4176305052caeb3520c647eb9e981ebe702ee3099b2f1036037136fcd58bb" + }, + { + "path": "crates/oa-desktop/src/views/source_symbols.rs", + "bytes": 8819, + "sha256": "9cd536072e110803b6a592bcbcd595b6f9eb32fc1d0b4c9de741247c459abbe5" + }, + { + "path": "crates/oa-desktop/src/views/traceability.rs", + "bytes": 7501, + "sha256": "4c89dcf35c25e737d8cce4d543a5989ca104a5678e6cf40df47e457773d2ef94" + }, + { + "path": "crates/oa-desktop/src/workflow.rs", + "bytes": 82829, + "sha256": "a00ba19d6d23435d18c9e1f6a0ad2065f889bcfa97aa3840bcdfaa03cb2666aa" + }, + { + "path": "crates/oa-desktop/src/workflow/communication.rs", + "bytes": 11084, + "sha256": "34d121ad97706012722e4bb6210072ecc3a5b4718b0ceab0c3d0f14d4cd780a1" + }, + { + "path": "crates/oa-desktop/src/workflow/recovery.rs", + "bytes": 9859, + "sha256": "0849b0f34dba5e8761be5fa05784d134ac74e4e9db395d6b9b7d6cff71e3f3dc" + }, + { + "path": "crates/oa-desktop/src/workflow/transition_tests.rs", + "bytes": 8553, + "sha256": "589b1b2dbadca74a52c2cfcfd4fe620bd4790abd113ac02182e91616c52d793c" + }, + { + "path": "crates/oa-server/Cargo.toml", + "bytes": 778, + "sha256": "527ff5e15010a8b560a6659aa1ae4bf0c8df0d9e019f03c47529ec6a750c0982" + }, + { + "path": "crates/oa-server/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-server/src/error.rs", + "bytes": 5610, + "sha256": "93817f1502386e4662c96ee1c7d1c4afc4e33bda6fd64e46c86c8e1afd5a9368" + }, + { + "path": "crates/oa-server/src/lib.rs", + "bytes": 7743, + "sha256": "20bef350350ed6339588b23af684abf745f97916c7edf3853ee042abe687e664" + }, + { + "path": "crates/oa-server/src/main.rs", + "bytes": 4163, + "sha256": "d59a6a2b5c7034bd2e00a516d2d49abb16391bf0316c1c357ddafb9c82d2d1e3" + }, + { + "path": "crates/oa-server/src/preparation_http_tests.rs", + "bytes": 5523, + "sha256": "454b90d0055d35644c8d990cd7576ddf675a9b271ca07fe9b0efce25d8ddbc07" + }, + { + "path": "crates/oa-server/src/routes.rs", + "bytes": 46053, + "sha256": "3f9a0c22043dbf28f7a8e587d2fc3abf869f76f4d23a46fe0aeb9c4392454a4b" + }, + { + "path": "crates/oa-server/src/store.rs", + "bytes": 25524, + "sha256": "37dcfb845b7993d5bced2bcf25fedfcd2a9c20a748f9315afe6cca1f41f89ae5" + }, + { + "path": "crates/oa-server/src/store_preparation_gate.rs", + "bytes": 4440, + "sha256": "427c390da3c0281ba1fe115a93ea90800e3b45fce6bcb9185e71982ddd885fec" + }, + { + "path": "crates/oa-server/tests/http.rs", + "bytes": 71892, + "sha256": "50daa6a90e96ad6fe3c6a27df2eaebe486270599c203892d09769c547a194975" + }, + { + "path": "crates/oa-server/tests/http/communication_limits.rs", + "bytes": 5790, + "sha256": "ba5474dd8e494a0176fffb4548c8e3deb2081b15de33bfce82394c764e0a2c16" + }, + { + "path": "crates/oa-server/tests/http/data_contracts.rs", + "bytes": 25949, + "sha256": "8cd456db83f301baca380acf025a5a99db4edf7d8839537dfbd02c4307e10e6b" + }, + { + "path": "crates/oa-server/tests/http/port_anchors.rs", + "bytes": 15086, + "sha256": "7199d0a208ddad9e1518b6e3fb390d64da111716d7505ba5c995deae19ad1258" + }, + { + "path": "crates/oa-server/tests/http/semantic_transitions.rs", + "bytes": 22832, + "sha256": "856d1c9b633ffb581e3e631f4e5a607789a02181dbf060667f208a569bfa4920" + }, + { + "path": "crates/oa-server/tests/http/source6_views.rs", + "bytes": 13023, + "sha256": "867bccda0e030eeeb9976b4ceeb47b21ab5044d700278022d5fb495bbb64ca07" + }, + { + "path": "crates/oa-server/tests/http/source7_contracts.rs", + "bytes": 11000, + "sha256": "0e0a467186da7263c0754890aff69ebd0d92d36b5224e4865bb6854b18dab7e8" + }, + { + "path": "crates/oa-server/tests/http/source_projects.rs", + "bytes": 30907, + "sha256": "8ff580f317ec267d1cd72ae14d8638f74a77cdf99ca4c78f66f4290c2d77460a" + }, + { + "path": "crates/oa-server/tests/semantic_http_contract.py", + "bytes": 7251, + "sha256": "4737ff94f10761f94151a694414c5c62737e0391ec820bca132830652bc4cca2" + }, + { + "path": "crates/oa-server/tests/semantic_schema.py", + "bytes": 25038, + "sha256": "70c9d267268bd390680f290a585bd4ae0c6d8ef999ee2f32ece6e172293574f7" + }, + { + "path": "crates/oa-server/tests/state_representation.rs", + "bytes": 12241, + "sha256": "6686c826f28248ae4b63ec3f2112e193d4a347724b87974483217fcfee49cd61" + }, + { + "path": "docs/acceptance.md", + "bytes": 3463, + "sha256": "32ed3e4fed63f5c464e0937221f401d71623b276dd70f083531ac6ccebbf9050" + }, + { + "path": "docs/api.html", + "bytes": 73861, + "sha256": "6f18cfc2a35eba631dbc61d04cd2721e0e361efff1699bf56d2c450a30a17a0d" + }, + { + "path": "docs/api.rst", + "bytes": 42711, + "sha256": "7eb258088824efa5ac94311b07b73eb46edcac3c300a2aac78d3802111e338c4" + }, + { + "path": "docs/architecture.md", + "bytes": 10974, + "sha256": "a50bd1645222ef3e574fa07a6ab9aa213431ee8833c6c0158ad91ce0f799543c" + }, + { + "path": "docs/language.html", + "bytes": 179377, + "sha256": "739a5bb100c7cb0ed70e18afd1e363029757f3cfd6580bc9c5cf77faccb46940" + }, + { + "path": "docs/language.rst", + "bytes": 131984, + "sha256": "894a1a77f97d1aa94c11762fe4e84b4d95e181a77c630324c16c307637ed27e1" + }, + { + "path": "docs/linux-packaging.md", + "bytes": 8671, + "sha256": "41a1bb1095801df37a1411341c5791d55ea8c365739314d599a60269ac4bc7a0" + }, + { + "path": "docs/openapi.json", + "bytes": 359757, + "sha256": "c6ae512f791a939eaf6ec5e5e78e9468bdee0e028092d00098bd90ad9498d967" + }, + { + "path": "docs/research-v2-architecture.md", + "bytes": 40445, + "sha256": "1b3809f2dabe6b1805dbf3d3f2625c471cd21356c7bd603916466a8c4ced8090" + }, + { + "path": "docs/research-v2-semantics.md", + "bytes": 31535, + "sha256": "b7ec3677300248926a88b84da3e7ffe52f5b73524c7712c927a0e951569db04f" + }, + { + "path": "docs/research-v2-service.md", + "bytes": 36209, + "sha256": "4828df5bc679e7c71f49b4b85c9e7dacbec52f46d416fed48af70e08886d4e4e" + }, + { + "path": "docs/research-v2-ui.md", + "bytes": 3245, + "sha256": "894e721b59a8ca85f0d95b6706ed5f130a0372def460cf33aeefc9e5e38cde0a" + }, + { + "path": "docs/scope.md", + "bytes": 16260, + "sha256": "58b88a7f0b1c8a79edf23c375a141d7b1b821bca4f3212a80e29db5ea3fba796" + }, + { + "path": "docs/server.md", + "bytes": 23361, + "sha256": "4eb24937d424ba8b384e1734e02a6f8e963ae11d2715889c92b14b39ff2e4a48" + }, + { + "path": "docs/source-cli.md", + "bytes": 3374, + "sha256": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051" + }, + { + "path": "docs/v2-interface.md", + "bytes": 11807, + "sha256": "c7fbaf0ebd3fc9f6c11f818db2b0b9d68a33f580cfced22bde83ce08ae790bc7" + }, + { + "path": "docs/validation.md", + "bytes": 6505, + "sha256": "f46ea950ed1a54409aa07c4f9e90f39f8e2d00c1dd1b6cb805caa3993845967f" + }, + { + "path": "docs/windows-packaging.md", + "bytes": 10406, + "sha256": "2c852ff7041713ffbff3c951ac98df647c51fb70b0feba9000f7bfd5bc2703a8" + }, + { + "path": "examples/coastal-rescue.arcadia", + "bytes": 33107, + "sha256": "7e183ef9fd8154d3074303f1956cd0d9871c19e3ffc630d333b0bffbd6e30e17" + }, + { + "path": "examples/coastal-rescue.json", + "bytes": 49715, + "sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195" + }, + { + "path": "examples/legacy-v1-coastal-rescue.arcadia", + "bytes": 3449, + "sha256": "4dbbbdf8bc7e6cb8e0a81dd678069dae585a9e5187c59bc3665e1fdab3f1a86a" + }, + { + "path": "examples/legacy-v1-coastal-rescue.oa.json", + "bytes": 5976, + "sha256": "fd0e9dedfb7adb922dc0575cc2b820d40344d639f1d8052bd70363aa59de9c24" + }, + { + "path": "examples/release1/README.md", + "bytes": 11137, + "sha256": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5" + }, + { + "path": "examples/release1/evidence/repair-check.md", + "bytes": 1419, + "sha256": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5" + }, + { + "path": "examples/release1/expected-diagnostics.json", + "bytes": 288, + "sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e" + }, + { + "path": "examples/release1/model.json", + "bytes": 134520, + "sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727" + }, + { + "path": "examples/release1/model.rs", + "bytes": 28762, + "sha256": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5" + }, + { + "path": "examples/release1/oa/activities/activity_oa_restore_work.arcadia", + "bytes": 1307, + "sha256": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4" + }, + { + "path": "examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia", + "bytes": 697, + "sha256": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d" + }, + { + "path": "examples/release1/oa/behavior/process_oa_field_procedure.arcadia", + "bytes": 1781, + "sha256": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324" + }, + { + "path": "examples/release1/oa/behavior/process_oa_response.arcadia", + "bytes": 3225, + "sha256": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_conversation.arcadia", + "bytes": 1795, + "sha256": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia", + "bytes": 1261, + "sha256": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c" + }, + { + "path": "examples/release1/oa/behavior/state_machine_oa_monitor.arcadia", + "bytes": 2022, + "sha256": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5" + }, + { + "path": "examples/release1/oa/capabilities.arcadia", + "bytes": 781, + "sha256": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936" + }, + { + "path": "examples/release1/oa/model.arcadia", + "bytes": 661, + "sha256": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15" + }, + { + "path": "examples/release1/oa/participants.arcadia", + "bytes": 1834, + "sha256": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3" + }, + { + "path": "examples/release1/oa/types.arcadia", + "bytes": 788, + "sha256": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49" + }, + { + "path": "examples/release1/project.arcadia", + "bytes": 1958, + "sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda" + }, + { + "path": "examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia", + "bytes": 706, + "sha256": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088" + }, + { + "path": "examples/release1/sa/behavior/process_sa_field_procedure.arcadia", + "bytes": 1790, + "sha256": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768" + }, + { + "path": "examples/release1/sa/behavior/process_sa_response.arcadia", + "bytes": 3234, + "sha256": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_conversation.arcadia", + "bytes": 2127, + "sha256": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia", + "bytes": 1256, + "sha256": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74" + }, + { + "path": "examples/release1/sa/behavior/state_machine_sa_monitor.arcadia", + "bytes": 2022, + "sha256": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736" + }, + { + "path": "examples/release1/sa/capabilities.arcadia", + "bytes": 781, + "sha256": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_audit_thresholds.arcadia", + "bytes": 297, + "sha256": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_restore_work.arcadia", + "bytes": 2576, + "sha256": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6" + }, + { + "path": "examples/release1/sa/model.arcadia", + "bytes": 661, + "sha256": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4" + }, + { + "path": "examples/release1/sa/participants.arcadia", + "bytes": 4012, + "sha256": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8" + }, + { + "path": "examples/release1/sa/types.arcadia", + "bytes": 1227, + "sha256": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660" + }, + { + "path": "examples/release1/traceability.arcadia", + "bytes": 29506, + "sha256": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f" + }, + { + "path": "examples/release1/transition-before.json", + "bytes": 35801, + "sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d" + }, + { + "path": "examples/release1/transition-request.json", + "bytes": 4276, + "sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a" + }, + { + "path": "examples/release1/views/diagram_oa_allocation_view.arcadia", + "bytes": 2176, + "sha256": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7" + }, + { + "path": "examples/release1/views/diagram_sa_allocation_view.arcadia", + "bytes": 2173, + "sha256": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389" + }, + { + "path": "examples/release1/views/diagram_sa_capability_view.arcadia", + "bytes": 1620, + "sha256": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649" + }, + { + "path": "examples/release1/views/diagram_sa_service_view.arcadia", + "bytes": 2209, + "sha256": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b" + }, + { + "path": "examples/release1/views/diagram_sa_state_view.arcadia", + "bytes": 1931, + "sha256": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869" + }, + { + "path": "examples/routing-workshop.arcadia", + "bytes": 66431, + "sha256": "dc6b75da72884d399132ed9e300fa5a26b73d802bb526c9af986ae9eeb0a646a" + }, + { + "path": "examples/routing-workshop.json", + "bytes": 100281, + "sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14" + }, + { + "path": "examples/source-project/oa.arcadia", + "bytes": 2142, + "sha256": "5f60642f211b2d352a951092faeeb7503d4fb7f6f7fca99e810347231101d31c" + }, + { + "path": "examples/source-project/project.arcadia", + "bytes": 606, + "sha256": "787f6b67b179ffd221f7e5faf1a4edd74cfd116aa1e3b5e9ed9f22fbff612d8d" + }, + { + "path": "examples/source-project/sa/assurance.arcadia", + "bytes": 682, + "sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f" + }, + { + "path": "examples/source-project/sa/participants.arcadia", + "bytes": 1231, + "sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88" + }, + { + "path": "examples/source-project/sa/reporting.arcadia", + "bytes": 2839, + "sha256": "f0b7443f728912ca163de39b6055876b533a77feaa3219b2d40a2dd65712e058" + }, + { + "path": "examples/source-project/views.arcadia", + "bytes": 3508, + "sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f" + }, + { + "path": "examples/text-first/README.md", + "bytes": 1367, + "sha256": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e" + }, + { + "path": "examples/text-first/project.arcadia", + "bytes": 480, + "sha256": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a" + }, + { + "path": "harness/fixtures/basic-editing/README.md", + "bytes": 12012, + "sha256": "3545d9695e7c62e0caa818efd7f4dc426f04876a3626e0f3b1bad606b258cb26" + }, + { + "path": "harness/fixtures/basic-editing/base/expected-baseline.json", + "bytes": 4524, + "sha256": "f239e728d650b0af32bb8f3dcaf6b27c99b9c5041132ac14e51756ea6563d978" + }, + { + "path": "harness/fixtures/basic-editing/base/project.arcadia", + "bytes": 3077, + "sha256": "045cb047d7bfbca72c3fb30db4c81a30ad463d3af7fc51604906ad7fa75a1ff8" + }, + { + "path": "harness/fixtures/basic-editing/base/rationale.arcadia", + "bytes": 57, + "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f" + }, + { + "path": "harness/fixtures/basic-editing/manifest.json", + "bytes": 447, + "sha256": "d23c21b02064ddb85e051e10e16ff089daba8d9910bb1a695dfabe2db3757734" + }, + { + "path": "harness/fixtures/behavior-creation/README.md", + "bytes": 5954, + "sha256": "9e5fc751424d12cfe76a84abb1da45b2d38947409179451bb90ffe7e7ddc8723" + }, + { + "path": "harness/fixtures/interface-operation-probe/README.md", + "bytes": 2604, + "sha256": "088f0bdb3375deb8f2c7e3b749ca8d210ea828ca4dece69b3871b674e3110175" + }, + { + "path": "harness/fixtures/interface-operation-probe/hashes.json", + "bytes": 977, + "sha256": "f6d3e8aa42f40f64ce2ecba7b9cf112eb9091f3cccde3a592b0434e834cf2a6a" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.arcadia", + "bytes": 4218, + "sha256": "c0fe9570684c0061efc4cad65e339fede6961b04ca90c6f324c787bd65e61226" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.json", + "bytes": 7835, + "sha256": "93187f7a1b476a44185725c6b15f2e1767482b6911ab1280144348d033eb51f0" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.arcadia", + "bytes": 4771, + "sha256": "02f85e39957ebe6d56336fa729a5c8b10f51865face9d3b2c9679200571fcfc7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.json", + "bytes": 8840, + "sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.arcadia", + "bytes": 8635, + "sha256": "ac5b629ba5596464f9f8a975b8bc2764e3007ceb7342de3f828d4b18e4f069b7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.json", + "bytes": 16160, + "sha256": "78a47c978dc667aa1c45af711f06aa2a0d3c581003013e30c3e02fb0faae2e64" + }, + { + "path": "harness/fixtures/interface-operation-probe/probe.rs", + "bytes": 11274, + "sha256": "72b1b443e25eb20420dec4477b0fb5ef5d1c705e3882c81df88dd578ab96a426" + }, + { + "path": "harness/fixtures/release1-native/README.md", + "bytes": 2564, + "sha256": "5f5ba040fd2df9261a29bcab3f9a7ae27c3683265411ad3dda0b467d5df8590e" + }, + { + "path": "harness/fixtures/release1-native/artifacts/README.md", + "bytes": 4155, + "sha256": "24200c84ccc2ef3e17c029744074e5cea785188f5549ac54e44cf89682643f81" + }, + { + "path": "harness/fixtures/release1-native/artifacts/generate-semantic-artifacts.rs", + "bytes": 9275, + "sha256": "444f360b78df52c5e42046f77b148781e0c9bddc2a09c0b7bd65c7a4f376cfe6" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.arcadia", + "bytes": 7768, + "sha256": "84b22e95c213018612e6e8a84cad68b35a8b495ff3515b0f978c5e7a3d196d79" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.json", + "bytes": 7330, + "sha256": "13a6f99ec2df1dd35ee8b2613f183918cd9537eda4a5da085ad52e65c033db59" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.arcadia", + "bytes": 1446, + "sha256": "1e0d662ba33071b122ad9206d2d559a8e748c9431eb3ac1b759bde3760ca877c" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.json", + "bytes": 2216, + "sha256": "fa6a2e3643c0f909b92407abec3edc897033162eeaa501f8d4616f79d41fa044" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.manifest.json", + "bytes": 567, + "sha256": "65cb70b0d697a055363ba01bf30bed7e412d43c9978a033549c378d117719ae7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.request.json", + "bytes": 3991, + "sha256": "ed905267263e7f8a0cd2dbe833196b30118b6a246815216932fae661ad650699" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.arcadia", + "bytes": 6837, + "sha256": "e50fc462ec22dbf98011929931dd2489430001c3e6433608685b9d88bceb9acb" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.json", + "bytes": 6433, + "sha256": "f27a7b38d59c7cefe58cb36783d3d4dd8d8ae1168d9aed1eb61d343c18758908" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.arcadia", + "bytes": 1807, + "sha256": "eba2aec39e6efb405eace4bc8ab0c5563907c26d449e71a4aa750df9f73233b4" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.json", + "bytes": 2673, + "sha256": "2ef777f19b94f08b5e5ca2ef727777897e1018f1426eee291408b3c69101f596" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.manifest.json", + "bytes": 519, + "sha256": "3af7232ed3056ca84dcaf0f266ead3faaa512a0dc0051c7ba68791c20dbae0cf" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.request.json", + "bytes": 1246, + "sha256": "8af21b00b62e620256fbf50e47c6c5836cdb6922d9549cc4b3d86bc03b008073" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.arcadia", + "bytes": 4200, + "sha256": "20bb30473830e44228958e78fb7480269cdcc0580c6c90c718da75f34ca5a43f" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.json", + "bytes": 4552, + "sha256": "44f4b05db49758dcf344788f57cecc0250fd029099b1c54e4e1e3e972f6cf039" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.arcadia", + "bytes": 1808, + "sha256": "b0fd031671c9f755756922ec5c40a0ce3f40164d22c3c389aec9fd0705344da7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.json", + "bytes": 2673, + "sha256": "1acf81e08c51c85aceb14a3efbc39ec680552a19c7824aab4611ac3cf71b9c6d" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.manifest.json", + "bytes": 610, + "sha256": "a07978f4b0a3ca83e5ae5f35e7b66b26473b24431fc90e5889d755f1816d52dd" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.request.json", + "bytes": 2352, + "sha256": "5ff844a038b0030adb5a83d13d81e60f30627543388f6199b6a0e026fc42ea58" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-native.md", + "bytes": 4075, + "sha256": "a51ffbc45b6c172cbfed3b16c249296e6a28d457fea57393dd958cdcfbafbca1" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts.hashes.json", + "bytes": 2367, + "sha256": "3ad8b7428b3ed7585a91e7f5d9d5f4880caccfd0b08dca25d05af523e62e0a10" + }, + { + "path": "harness/fixtures/release1-native/communication-means/README.md", + "bytes": 15091, + "sha256": "015c16010c212af283f9def118c6d263ba65a3bc6e81a750f180624ca69bb311" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/entry.arcadia", + "bytes": 6098, + "sha256": "a6976e7c21031e7cc3cb731e20c3075cf89cf85144dc8d3f52930f8521ea196f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/expected.json", + "bytes": 10480, + "sha256": "60c4419415c546f06c9972ac7bb0e530ada7b30a200b59e75ddda231a24f9a3d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "3c41459f2b0706a767988738bf8126f76540415bb5940d9c5db19cbe8c18182d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.request.json", + "bytes": 1331, + "sha256": "b16e673b29c96b5aed681389ff7669110abe552939e86dd0ec6011c9a45ed860" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.arcadia", + "bytes": 5239, + "sha256": "a511a4d817d9c5c80233bce83e84a7056b7dce7afd9fcc25696e333f8f4df055" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.json", + "bytes": 8424, + "sha256": "7140114926228b1c378c450535f7a70992c71a879a8d2270c49e8d5f04a2f484" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/entry.arcadia", + "bytes": 5710, + "sha256": "910e6dfe609467047ce629ec9c626f4e927cada74bfbfa164414a8fe6783ea87" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/expected.json", + "bytes": 9868, + "sha256": "567259e20c9f6278776e8fa99b8b2fdbbc9a883ad875c5d39dae1b53de3a2924" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "997f72fe9258012df66e88344cf39c1a2cebf2327f604056b67f7f2a8ebcfbfa" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.request.json", + "bytes": 1127, + "sha256": "cb3fe05859cfffec6f8846c19983dc462413bc0ea4f6e19204f09c259919c4b1" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/cm-reverse-scenario.arcadia", + "bytes": 8209, + "sha256": "ec826b9b84616507490ac30e4d57100dd6338dba2f7071e879a8fb58820a85c5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/expected.json", + "bytes": 19735, + "sha256": "ef07e4d2d3fc36004ff01739838281581d9a703c747611eacc01bb9cc672489f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/entry.arcadia", + "bytes": 9827, + "sha256": "86dd8a355f6c9dadfea56d06e5247c9b0f820819d7df17ef5690671c7c81324b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/expected.json", + "bytes": 21877, + "sha256": "980489ec2c483d4f9efada61358c1f29bafb2572fd5b804c656b91b8e9bb4f9a" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.arcadia", + "bytes": 7698, + "sha256": "1abc4c4cac37cfb06ed3b12a115f9e7e6a2d3affd34b25c355309e5ee465fa40" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.json", + "bytes": 13130, + "sha256": "a5cf4cb2ef390113dd752f4054d43fb789da2ca77799efb5782805ae8aa2dfd5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.arcadia", + "bytes": 5454, + "sha256": "b761c4c2af5f7064aaf1f887ffd6094eb6ae834b2c8057ecdbc4aa97c042066b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.json", + "bytes": 8852, + "sha256": "2536b000de361fb131787e32b466b9123d4e98abf00c099ad32f6cb8e7fb530b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/generate-communication-means.rs", + "bytes": 28035, + "sha256": "003521404b702332082e01f2be7676fda1dd7b5bcf220bb81d25120c8984c75d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/hashes.json", + "bytes": 3133, + "sha256": "39b4dc02fc8b074015c59354fd1c1061c25832fde25065c7151f36eb0455e6f6" + }, + { + "path": "harness/fixtures/release1-native/communication-means/manifest.json", + "bytes": 1237, + "sha256": "fb921f42f2c4a4f8a67d1266f17f8c7750b6a2619554b713aa92b17918f0c43e" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40-oracle.json", + "bytes": 26264, + "sha256": "74edca148583f42c269e51f135662f65ef1c9ea1c94516d63e2a5091967dc99b" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.arcadia", + "bytes": 28947, + "sha256": "00b87736b82c5afd33b311df7aebe9a6c8c51b6de66221181b5ea8bc8ca221a3" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.json", + "bytes": 54938, + "sha256": "5dd4f22453330cab3abc059881660190e689a22619853f77cf6d0b52735d97ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments-native.md", + "bytes": 2624, + "sha256": "28906924b05f75bbf432389517aef65f1df474d2f2bff79a3586564f7f7328ef" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.arcadia", + "bytes": 6795, + "sha256": "9d084dd75a0251d349cc31f9ee98df58d0bc76859dc3cb1503f242e2f759888a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.json", + "bytes": 9618, + "sha256": "f09be41afd85c18fd52fdf997e9b81c4b7cb2c41e78d167abcd14caea8110333" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.arcadia", + "bytes": 4990, + "sha256": "8740f27be99624013d9be876639c0411e1b8c14f0f9a843f43dc71d769efd79a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.hashes.json", + "bytes": 963, + "sha256": "00fc9e2c709bdcd9ee98012176cb0edb635c112153d963cd169bf4bf69a9e010" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.json", + "bytes": 8146, + "sha256": "9c188f2890630c7feec2be719a7104af9690da7ea836df18fa78da3ff2acfc1b" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.manifest.json", + "bytes": 1045, + "sha256": "46b40f221ffad614733b615208814ace63947e96b80bbfdec63853ccd4f4e8c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.request.json", + "bytes": 3075, + "sha256": "b57f656f0b9cf2c595e83150c683301909e20f15684d35d108d3c57ee0dc5909" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch-native.md", + "bytes": 2637, + "sha256": "dddca2b85f892b05881c75ef3cd62437396cc086a09909b621e02bad0cbe56ff" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.arcadia", + "bytes": 3134, + "sha256": "d3315bba762395205ae761e6e64029e8b4070c15a1299c6114075581db7b0974" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.json", + "bytes": 3927, + "sha256": "8f36119c7e893a4af374b13b85b1c2cb3df0196df8d06a551386628fc8b8646d" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.arcadia", + "bytes": 1787, + "sha256": "5e1f433e04621424edac43e53411624059e873f88dd531bfdb39093953485ed7" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.hashes.json", + "bytes": 933, + "sha256": "1bd87700b04e4f169ab5f8aceaa3b0c3ec3a1cc43e1bce135a1cee506fc75d38" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.json", + "bytes": 2816, + "sha256": "1972242d2a8677d004dc3af1081feb292de65fe26128d877dded8661f9906619" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.manifest.json", + "bytes": 647, + "sha256": "1e440efa02e2ccc27585d9a49c7864d53e3e3e7645ccb219f040e00d95331b8e" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.request.json", + "bytes": 2197, + "sha256": "71f23474614aab90398ce24f00f2cf61d6cb9a3a34faa3e12e0c8104e0a71073" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.arcadia", + "bytes": 15635, + "sha256": "e3ce0347746584f503b825a8b6bd23a7eebf0827940112ef8f36d500c1d0a043" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.json", + "bytes": 25736, + "sha256": "29736f2a619f7f2d0e795229f6e8c3645a1b4eca6292043cd604aa01b1ec9170" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.arcadia", + "bytes": 15631, + "sha256": "9ab573c92be66e3bae659dd826923ba6066979b1651edda7bd469056632cd77e" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.json", + "bytes": 25736, + "sha256": "828c990c6129692cd31c7f6ed0dd6c952f9cfffdd90bc80171df82d4d929afba" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.arcadia", + "bytes": 15617, + "sha256": "49214be2ca9c8bb6195c3b39737c053847021839f70f0bb2921d35a1fbd2ac83" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid-request.json", + "bytes": 2225, + "sha256": "8b02d4739b1be2c8a64da76423b4a6cae7d89c60f4d30723b94f1da3779cbcca" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid.txt", + "bytes": 78, + "sha256": "aa536e18bc65325163e9b645a4ad031ab599fcb05948dcf741b725d0f0c8b602" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.json", + "bytes": 25722, + "sha256": "995dd72f5c1f07f998233ae9847e337cb82de0c2a9053d3905be021d5f8124b9" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.manifest.json", + "bytes": 1059, + "sha256": "ad315359bfd68ce0d265976dc9e4ea6a502ebbb87d7339dd1af5ef27dd01e433" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-plan.json", + "bytes": 15016, + "sha256": "27bf316ad66ffa91f6323e75b0c280baf5caec298645793dea72c5d42aa3b782" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-request.json", + "bytes": 2225, + "sha256": "f4f6b5480ec8927033ea469ea82c1e8411cb6dba95d2da680f15bc193914c9b4" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.steps.md", + "bytes": 3897, + "sha256": "7d7e38d93641a5f22a2738baa4dbacc392eebb477a855cdce0641961980a19ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-plan.json", + "bytes": 18557, + "sha256": "74dd68ba686b8928054480f0bfed55aad91f6f1208803399dc9878e894f57ecb" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-request.json", + "bytes": 1508, + "sha256": "d19a53002a6bf95af3123a3ef9f78baaf7ce1085d4f06f0f4a9d5e5d5accbc0e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.arcadia", + "bytes": 6935, + "sha256": "90277f1780d43a6f0b2184bf00b87e7a4f3518d67c6f10d4793daafe1aabf493" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.json", + "bytes": 11286, + "sha256": "5a3c8494f6976c23b990c14b40760fb2f32ca9973caf6f31dab5632310663591" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous-request.json", + "bytes": 1379, + "sha256": "6a86fde194faa55f2d1bdb982571e0e711e5401b53a960e6acb8cf3e17f506c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.arcadia", + "bytes": 6195, + "sha256": "e7c30c5a5c3ba7209c8e223f02da55821d7af10a2f09844a7065ae6cd8f22aa5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-plan.json", + "bytes": 19156, + "sha256": "d1e5c2ed08e0aa6274a0421a39876d1ba99f4e441c7a0a68660a83b9e017da14" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-request.json", + "bytes": 2418, + "sha256": "433f723252598994dac7184da61f95344b528156cc5a0fba1a7864b2ec9f002b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.json", + "bytes": 10441, + "sha256": "9e4e2ce1c7879935ad0860a3ae720506c929a8422b51491b719d88af3fd3ff2d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.manifest.json", + "bytes": 1042, + "sha256": "87e8899c7d4e54faedeef32afb7592fb65278d1bd7390850ab198dcf62068329" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.arcadia", + "bytes": 6280, + "sha256": "6c77ed42bbf9f4ebe08bfa233197a4020e5587ce33747f7914430aa0c662d9a3" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.json", + "bytes": 10009, + "sha256": "1dd7ca2bcfc84ac23369c506302b39569d2ebc41e5a4edc99378a1fe01923b7e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous-request.json", + "bytes": 1390, + "sha256": "e0ea7aeb25687ae63c65128f1aab78273f14030d179d3fbea63fe91ab5430136" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.arcadia", + "bytes": 5529, + "sha256": "563c36162050c8564ffa25a85c726462ecdaebdb87659b3f3610506bfd5581e6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-plan.json", + "bytes": 18821, + "sha256": "f96c43fc58dbe48a044b628b31bb3f0b59171dad5b6982ec6c34a5597e474130" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-request.json", + "bytes": 2438, + "sha256": "d38fdb13612b07254edad80848f79c1e097d5f868c020feae9ba072aa697a50d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.json", + "bytes": 9153, + "sha256": "2ed0daed118f2df13dcad738dab174ad34d44a15921cf8097415e707978b0968" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.manifest.json", + "bytes": 1058, + "sha256": "c79bd12a85d8d4f25cc3ee43581b3e5e74ae9ad7e4de0c72764975ba2b89c279" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.arcadia", + "bytes": 5026, + "sha256": "98020e048ac01f285c6ad8c10ce22bef05e193b5ba0f5558be1fb26a7bf82620" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.json", + "bytes": 7851, + "sha256": "ea3783992488bc6ee944eb91a26ccf3dbc05a3909528fc32ec8023a76765cee6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous-request.json", + "bytes": 1379, + "sha256": "ea3cfd25f7a50481805956fb88ab851516dcd602dd6564502a0cc55f7de6a54f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.arcadia", + "bytes": 4295, + "sha256": "2b7c3694623bbea3e36dcc6f674d4adcd91e23c8e1005ded21e5a69648a048e5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-plan.json", + "bytes": 17912, + "sha256": "95a23bd334cffcaef0c3b1012b7555efd2a077ef6f9140d58020910ef8a76723" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-request.json", + "bytes": 2081, + "sha256": "1e2433ed5821bf65443f56cb27381ee935db81b1955d3a539b7952898312a410" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.json", + "bytes": 7012, + "sha256": "0033f8780c2ba69779b811bca792340c25a092f887e5811c6839f0a691d744f2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.manifest.json", + "bytes": 1046, + "sha256": "e3b4a60a56abee779ca8356605c968aa2d99256a3bd3c5601b14b5c5502a1a05" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.arcadia", + "bytes": 5467, + "sha256": "e265cab35097acc46f5123107c13bc35b9f71931ff650557fc1c85779141b327" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.json", + "bytes": 8482, + "sha256": "9b777828d3681138de6bbd08de8bf922bed92c27be60b103d8ff73ce7ddd0a48" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous-request.json", + "bytes": 1379, + "sha256": "7d124256730bf2feee772c7d0118b87eb288e8aaa9179d69ceb9259dbceb2c71" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.arcadia", + "bytes": 4727, + "sha256": "87a5a3665dab2dd6e595867dcebb1586e93dd067c85d6e24b1a4d3ff0ad6d4ba" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-plan.json", + "bytes": 18803, + "sha256": "1888ca51e0923866a9afea99cad069fe5d3f19f0a1b24328e20ac1b9f52d8bad" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-request.json", + "bytes": 2294, + "sha256": "5070a5b85feb1bc7b1fc648cd5d35ef26663492c8666dcd471950c06ec3a6052" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.json", + "bytes": 7641, + "sha256": "725b35e36640c81c70c7efea5c3304bf61b49ef9664194ca0d491782cc62191a" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.manifest.json", + "bytes": 1038, + "sha256": "1b43abf8fed3061c65a7b7cb103d31ea7ece333a2da83c645f8d228448c4dbb2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.arcadia", + "bytes": 5019, + "sha256": "65a6217f474b5085f37b511151185c2c08ff7a1998e924f1fe01f29c410f6ced" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.json", + "bytes": 7835, + "sha256": "8a53bb9b43eab5b6dca5e08deef20c14c96e134b9ee816a99b7960bb5255e008" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous-request.json", + "bytes": 1379, + "sha256": "c704f99245f00d5c3be0562d91931b4e7f1fb3fb36f41991eb76656ffbd6129f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.arcadia", + "bytes": 4279, + "sha256": "c59ec1233d5a9fbb8e386f6d9b13f398be21baf813ba215efb51bfc1bb98db36" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-plan.json", + "bytes": 17938, + "sha256": "30c5c3f614a74708763df612016483623792f4c65e2ed2fa662ac417cfb852eb" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-request.json", + "bytes": 2098, + "sha256": "3b6c35ef78133f0980cb6fb53fbc29c5d3c4deb5dc4be01c2c3384e221987b9b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.json", + "bytes": 6996, + "sha256": "c159c60403abcf8fefab7f19cbad9989488e8ccc20b82c57597b22a0ae254802" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.manifest.json", + "bytes": 1038, + "sha256": "af8a314a9b1d85a8f98affa5a6649f43d252851158798e1ad687bb1b6966b14f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.steps.md", + "bytes": 4549, + "sha256": "6004894e9d9f478b7fe1c3c3e0706dcc546d5df8557cff91b4cf26f8a4badf24" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/15000000-0000-4000-8000-000000000010.json", + "bytes": 1933, + "sha256": "71cca2a59f36b2a07d11dedbe9101226aa1a4a00d8ac244b5565202e56709f51" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/generate.py", + "bytes": 1496, + "sha256": "e44986c1d563499f25917441220b23883fc9cb0f89faf409873191f0212fbd2f" + }, + { + "path": "harness/fixtures/release1-native/state-actions.arcadia", + "bytes": 6224, + "sha256": "9cde82608110e56aa9e14c9e33eb38976f53aed74ab013145d411d5743a0ec26" + }, + { + "path": "harness/fixtures/rest-coverage/README.md", + "bytes": 1870, + "sha256": "df4a391312e0c8b20ccdcc850199443b08547be1b10b1f2447a067bf4bf544e6" + }, + { + "path": "harness/fixtures/rest-coverage/coverage-probe.json", + "bytes": 8008, + "sha256": "699b868dd6c955f7ef02f2f061935471f3d21a406005fcdecba8cc719cc69a1f" + }, + { + "path": "harness/fixtures/rest-coverage/run-coverage-probe.ps1", + "bytes": 9381, + "sha256": "f24f19fca418b76a7249894a08c116e16b465a02f8f899d12b808ccfdd90a3bd" + }, + { + "path": "harness/fixtures/run-timed-bundle-oracle.ps1", + "bytes": 7466, + "sha256": "fab696486a574f9867c6e69a8a8b960e7e9722206441b9cc5f36d41f285f1a25" + }, + { + "path": "harness/fixtures/scenario-authoring/README.md", + "bytes": 14700, + "sha256": "6b651b180b76d10b00bc49d77a8f5e0b3ba0317446978f41b541f5bb23fedad8" + }, + { + "path": "harness/fixtures/scenario-authoring/base/expected-baseline.json", + "bytes": 38589, + "sha256": "abd8246c939ebb8a2162ef82e23d0fb322ee1a8b4d0d7c28a34037e42e86e841" + }, + { + "path": "harness/fixtures/scenario-authoring/base/project.arcadia", + "bytes": 19470, + "sha256": "9b1afbe96b0bf8fa613451b00929492f05a59b9eb2ca74c2c374a8b7bb7cba9e" + }, + { + "path": "harness/fixtures/scenario-authoring/base/rationale.arcadia", + "bytes": 86, + "sha256": "82df210f22f6aa336a3e7e00240977d671c7c3923db7bc58fb29e6d98b67ef49" + }, + { + "path": "harness/fixtures/source7-native/README.md", + "bytes": 7235, + "sha256": "7abccbc3da0980d1d099761d1a66d12c403a0f543954134537ecd4930d182b4b" + }, + { + "path": "harness/fixtures/source7-native/base/expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "harness/fixtures/source7-native/base/project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "harness/fixtures/source7-native/base/rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + }, + { + "path": "harness/fixtures/source7-native/manifest.json", + "bytes": 410, + "sha256": "6c57164a796234d83818d462d0a25f10e77062d405769e602ae2a7bec251e3b6" + }, + { + "path": "harness/fixtures/staged-source-authoring/README.md", + "bytes": 8380, + "sha256": "711910a12d5f3960f32da9aa7bc2e647f31d770c84b7fc26e232dcb3a76f8821" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/notes.arcadia", + "bytes": 63, + "sha256": "ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/project.arcadia", + "bytes": 593, + "sha256": "aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c" + } + ] +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs2.zip b/harness/experiments/text-navigation-native-20260911/corrections/inputs2.zip new file mode 100644 index 00000000..865ef50b Binary files /dev/null and b/harness/experiments/text-navigation-native-20260911/corrections/inputs2.zip differ diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs3-readback.json b/harness/experiments/text-navigation-native-20260911/corrections/inputs3-readback.json new file mode 100644 index 00000000..5af9b4b0 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/inputs3-readback.json @@ -0,0 +1,7 @@ +{ + "atUtc": "2026-09-11T19:35:48.305081+00:00", + "changed": [], + "added": [], + "removed": [], + "passed": true +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs3.json b/harness/experiments/text-navigation-native-20260911/corrections/inputs3.json new file mode 100644 index 00000000..ee1281d0 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/inputs3.json @@ -0,0 +1,2504 @@ +{ + "atUtc": "2026-09-11T19:27:10.653501+00:00", + "head": "f4e426ae2a6971395e1ca7e6f094b0c20056cf93", + "branch": "codex/release1-9e8r6t", + "scope": "Exact Windows gate source inputs; no compiler or native result implied.", + "archiveSha256": "7dcbf323348f214bbd6052f253831810af1562cc5ec4eb8aa46f9c212559b2b3", + "files": [ + { + "path": "Cargo.lock", + "bytes": 119453, + "sha256": "2b960242c33eb839ff008d01731f6d5cdb4e047ca8cd6e13151cbf9c09913510" + }, + { + "path": "Cargo.toml", + "bytes": 400, + "sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62" + }, + { + "path": "crates/oa-cli/Cargo.toml", + "bytes": 279, + "sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde" + }, + { + "path": "crates/oa-cli/src/lib.rs", + "bytes": 15498, + "sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc" + }, + { + "path": "crates/oa-cli/src/main.rs", + "bytes": 2984, + "sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb" + }, + { + "path": "crates/oa-cli/tests/source_cli.rs", + "bytes": 16600, + "sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8" + }, + { + "path": "crates/oa-core/Cargo.toml", + "bytes": 342, + "sha256": "64824ec447be777841a972bf06c894ef2624a37e4725583bcfe0389deb9f00a3" + }, + { + "path": "crates/oa-core/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-core/examples/generate_demo.rs", + "bytes": 795, + "sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661" + }, + { + "path": "crates/oa-core/examples/generate_release1.rs", + "bytes": 1798, + "sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5" + }, + { + "path": "crates/oa-core/examples/release_dense_views.rs", + "bytes": 14664, + "sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412" + }, + { + "path": "crates/oa-core/examples/routing_workshop.rs", + "bytes": 17248, + "sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7" + }, + { + "path": "crates/oa-core/src/data.rs", + "bytes": 42696, + "sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a" + }, + { + "path": "crates/oa-core/src/demo.rs", + "bytes": 20657, + "sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c" + }, + { + "path": "crates/oa-core/src/language.rs", + "bytes": 105312, + "sha256": "34cbb144a111e6f0ddadfca7d40636a8e3323fe65ea8920fd2402f0352b41f57" + }, + { + "path": "crates/oa-core/src/language/semantic_source.rs", + "bytes": 7326, + "sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29" + }, + { + "path": "crates/oa-core/src/language_nesting_tests.rs", + "bytes": 20639, + "sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b" + }, + { + "path": "crates/oa-core/src/language_outline_tests.rs", + "bytes": 14877, + "sha256": "4c79a01e8aea243dd9ef66ce71b9fae263d0e79c319a46c51223679897e8b9df" + }, + { + "path": "crates/oa-core/src/lib.rs", + "bytes": 523, + "sha256": "52cb6ee7a4ffc00711ecf121c1a1b14ca154863f7ca27b0d2a8e239edce8aca7" + }, + { + "path": "crates/oa-core/src/migration_v2/README.md", + "bytes": 1515, + "sha256": "fb61d3faa33d7bdfba73415415a0882c0fbd3e0b45df42f972a19aec6da927b9" + }, + { + "path": "crates/oa-core/src/migration_v2/adapter.rs", + "bytes": 9490, + "sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5" + }, + { + "path": "crates/oa-core/src/migration_v2/mod.rs", + "bytes": 1158, + "sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9" + }, + { + "path": "crates/oa-core/src/migration_v2/model.rs", + "bytes": 52059, + "sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb" + }, + { + "path": "crates/oa-core/src/migration_v2/references.rs", + "bytes": 13369, + "sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20" + }, + { + "path": "crates/oa-core/src/migration_v2/source.rs", + "bytes": 21946, + "sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6" + }, + { + "path": "crates/oa-core/src/migration_v2/state_validation.rs", + "bytes": 15769, + "sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0" + }, + { + "path": "crates/oa-core/src/migration_v2/transitions.rs", + "bytes": 704, + "sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1" + }, + { + "path": "crates/oa-core/src/migration_v2/validation.rs", + "bytes": 98736, + "sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780" + }, + { + "path": "crates/oa-core/src/migration_v3/README.md", + "bytes": 2128, + "sha256": "3755a63f840d7f0eadf68afa7a9d587877a9468ff982d3610539e8a0bb067a82" + }, + { + "path": "crates/oa-core/src/migration_v3/mod.rs", + "bytes": 23023, + "sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722" + }, + { + "path": "crates/oa-core/src/migration_v4.rs", + "bytes": 4020, + "sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70" + }, + { + "path": "crates/oa-core/src/model.rs", + "bytes": 66352, + "sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb" + }, + { + "path": "crates/oa-core/src/operations.rs", + "bytes": 11405, + "sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41" + }, + { + "path": "crates/oa-core/src/persistence.rs", + "bytes": 31774, + "sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14" + }, + { + "path": "crates/oa-core/src/ports.rs", + "bytes": 45413, + "sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80" + }, + { + "path": "crates/oa-core/src/projection.rs", + "bytes": 21374, + "sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b" + }, + { + "path": "crates/oa-core/src/projection/port_layout.rs", + "bytes": 13474, + "sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079" + }, + { + "path": "crates/oa-core/src/projection/state.rs", + "bytes": 5233, + "sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28" + }, + { + "path": "crates/oa-core/src/references.rs", + "bytes": 21957, + "sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb" + }, + { + "path": "crates/oa-core/src/routing.rs", + "bytes": 50309, + "sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080" + }, + { + "path": "crates/oa-core/src/semantic.rs", + "bytes": 540, + "sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239" + }, + { + "path": "crates/oa-core/src/semantic/catalog.rs", + "bytes": 49407, + "sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4" + }, + { + "path": "crates/oa-core/src/semantic/historical.rs", + "bytes": 15271, + "sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb" + }, + { + "path": "crates/oa-core/src/semantic/linked.rs", + "bytes": 6035, + "sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2" + }, + { + "path": "crates/oa-core/src/semantic/mutate.rs", + "bytes": 22683, + "sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d" + }, + { + "path": "crates/oa-core/src/semantic/review.rs", + "bytes": 51116, + "sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e" + }, + { + "path": "crates/oa-core/src/semantic/types.rs", + "bytes": 10405, + "sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb" + }, + { + "path": "crates/oa-core/src/session.rs", + "bytes": 35237, + "sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00" + }, + { + "path": "crates/oa-core/src/source_files.rs", + "bytes": 74803, + "sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683" + }, + { + "path": "crates/oa-core/src/source_project.rs", + "bytes": 61843, + "sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466" + }, + { + "path": "crates/oa-core/src/source_project/source_migration.rs", + "bytes": 4700, + "sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95" + }, + { + "path": "crates/oa-core/src/source_project/source_structure.rs", + "bytes": 20225, + "sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f" + }, + { + "path": "crates/oa-core/src/state_validation.rs", + "bytes": 15665, + "sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18" + }, + { + "path": "crates/oa-core/src/topology_context.rs", + "bytes": 13734, + "sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d" + }, + { + "path": "crates/oa-core/src/topology_context/analysis.rs", + "bytes": 20036, + "sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65" + }, + { + "path": "crates/oa-core/src/topology_context/analysis_tests.rs", + "bytes": 5258, + "sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56" + }, + { + "path": "crates/oa-core/src/transitions.rs", + "bytes": 51998, + "sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d" + }, + { + "path": "crates/oa-core/src/transitions/communication.rs", + "bytes": 8634, + "sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028" + }, + { + "path": "crates/oa-core/src/validation.rs", + "bytes": 112792, + "sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e" + }, + { + "path": "crates/oa-core/src/validation/coverage.rs", + "bytes": 6478, + "sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f" + }, + { + "path": "crates/oa-core/src/view_options.rs", + "bytes": 24481, + "sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208" + }, + { + "path": "crates/oa-core/src/view_options_tests.rs", + "bytes": 21433, + "sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208" + }, + { + "path": "crates/oa-core/tests/communication_boundary_scenarios.rs", + "bytes": 8816, + "sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b" + }, + { + "path": "crates/oa-core/tests/communication_means.rs", + "bytes": 18102, + "sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4" + }, + { + "path": "crates/oa-core/tests/coverage_diagnostics.rs", + "bytes": 20527, + "sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.arcadia", + "bytes": 29220, + "sha256": "f0df129c1914bfc01d0b047b0cd4b520d8cf0c249ea9ced085de400c0be87ff3" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.json", + "bytes": 43990, + "sha256": "3ed53508eb544bbd788832f7bebea2ec31b3d66191f24f45098cc9750ec4c005" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.arcadia", + "bytes": 2450, + "sha256": "305f19d1b79f99f8d4cf627ba2e9ca6836bb7959cc0070227815937a699eafea" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.json", + "bytes": 8240, + "sha256": "1b41299c53204e6232397d25a58d5bccdbbc16e770c75e8edb55ce36ccfe58a2" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.arcadia", + "bytes": 1222, + "sha256": "5fa53a26a5ad010c8e59eb56d9b2b52003569e66c0377ffb58840590168ad0c1" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.json", + "bytes": 1734, + "sha256": "2808088afcc165f4bd6da5129151143411c997041c3de61d600ab76e05d24a47" + }, + { + "path": "crates/oa-core/tests/language.rs", + "bytes": 56482, + "sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e" + }, + { + "path": "crates/oa-core/tests/port_anchors.rs", + "bytes": 26893, + "sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa" + }, + { + "path": "crates/oa-core/tests/port_migration.rs", + "bytes": 15620, + "sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7" + }, + { + "path": "crates/oa-core/tests/port_source.rs", + "bytes": 4858, + "sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12" + }, + { + "path": "crates/oa-core/tests/prepared_commands.rs", + "bytes": 9555, + "sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b" + }, + { + "path": "crates/oa-core/tests/process_diagnostics.rs", + "bytes": 1104, + "sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906" + }, + { + "path": "crates/oa-core/tests/r3_constructor_ack.rs", + "bytes": 24163, + "sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0" + }, + { + "path": "crates/oa-core/tests/r3_migration.rs", + "bytes": 6590, + "sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd" + }, + { + "path": "crates/oa-core/tests/r3_semantic.rs", + "bytes": 77473, + "sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32" + }, + { + "path": "crates/oa-core/tests/r3_source.rs", + "bytes": 15311, + "sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408" + }, + { + "path": "crates/oa-core/tests/r6_data.rs", + "bytes": 41437, + "sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155" + }, + { + "path": "crates/oa-core/tests/r6_migration.rs", + "bytes": 9174, + "sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1" + }, + { + "path": "crates/oa-core/tests/r6_source.rs", + "bytes": 9519, + "sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6" + }, + { + "path": "crates/oa-core/tests/release1_teaching.rs", + "bytes": 10010, + "sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2" + }, + { + "path": "crates/oa-core/tests/release_capabilities.rs", + "bytes": 19422, + "sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30" + }, + { + "path": "crates/oa-core/tests/release_diagrams.rs", + "bytes": 7689, + "sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d" + }, + { + "path": "crates/oa-core/tests/release_language_limits.rs", + "bytes": 5204, + "sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806" + }, + { + "path": "crates/oa-core/tests/release_ports.rs", + "bytes": 32740, + "sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1" + }, + { + "path": "crates/oa-core/tests/release_routing.rs", + "bytes": 23165, + "sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462" + }, + { + "path": "crates/oa-core/tests/release_scenarios.rs", + "bytes": 41067, + "sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f" + }, + { + "path": "crates/oa-core/tests/release_states.rs", + "bytes": 26873, + "sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811" + }, + { + "path": "crates/oa-core/tests/release_topology.rs", + "bytes": 17643, + "sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9" + }, + { + "path": "crates/oa-core/tests/review_regressions.rs", + "bytes": 21823, + "sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1" + }, + { + "path": "crates/oa-core/tests/route_source.rs", + "bytes": 7270, + "sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb" + }, + { + "path": "crates/oa-core/tests/routing_geometry.rs", + "bytes": 31890, + "sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3" + }, + { + "path": "crates/oa-core/tests/routing_labels.rs", + "bytes": 5530, + "sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6" + }, + { + "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs", + "bytes": 4640, + "sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a" + }, + { + "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs", + "bytes": 14957, + "sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970" + }, + { + "path": "crates/oa-core/tests/source6_view_contract.rs", + "bytes": 14307, + "sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb" + }, + { + "path": "crates/oa-core/tests/source7_contract.rs", + "bytes": 43262, + "sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f" + }, + { + "path": "crates/oa-core/tests/source_files.rs", + "bytes": 13168, + "sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9" + }, + { + "path": "crates/oa-core/tests/source_identity_updates.rs", + "bytes": 5139, + "sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c" + }, + { + "path": "crates/oa-core/tests/source_nested_updates.rs", + "bytes": 16892, + "sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855" + }, + { + "path": "crates/oa-core/tests/source_project.rs", + "bytes": 45910, + "sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942" + }, + { + "path": "crates/oa-core/tests/state_diagrams.rs", + "bytes": 23973, + "sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5" + }, + { + "path": "crates/oa-core/tests/workflows.rs", + "bytes": 33426, + "sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b" + }, + { + "path": "crates/oa-desktop/Cargo.toml", + "bytes": 842, + "sha256": "f3547b2b924d5db6706c0a8e069014b440ff65315d82fc8aced0360af4b3cdc9" + }, + { + "path": "crates/oa-desktop/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 214840, + "sha256": "411007f8c192e0fc581f3c6bcfc49ab46b900a841ee20ae96203d4db64c9280f" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring.rs", + "bytes": 27835, + "sha256": "37c7db33e99dd4adcc5a51f09ee4878af94fd32413359890a541690080885f65" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/palette.rs", + "bytes": 8887, + "sha256": "8f9937cb30b48b83759fd084a8a5990a2daa3920280f1210abe048560241985a" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/tests.rs", + "bytes": 14732, + "sha256": "ed864839940a1910c97537b6ee151b57ab115ece6f60bae602552b84f9af4a5d" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring_tests.rs", + "bytes": 18599, + "sha256": "77eb1a0038d038b989f7ac568760e16fe23c4b8d73cd9fbe32b70817ea23cfec" + }, + { + "path": "crates/oa-desktop/src/app/behavior_lifecycle_tests.rs", + "bytes": 13669, + "sha256": "1af2e290aa259a6af6b0585950cda93fe3a562c7b8be1e938fe1d80747b11808" + }, + { + "path": "crates/oa-desktop/src/app/checkpoints.rs", + "bytes": 29576, + "sha256": "55e5babdcabef767af3bc8be9cc3153b3f5cc0695701b890820ec0225643852e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_selection_tests.rs", + "bytes": 5582, + "sha256": "4fa507adbc23db3a6eb202d809c695ec0ebd6181356930c4fa7528a9a0c7be57" + }, + { + "path": "crates/oa-desktop/src/app/hosted.rs", + "bytes": 25905, + "sha256": "14e2fcd79558ff56d000571f1f576e5601818d702783634aa4017000d382c62a" + }, + { + "path": "crates/oa-desktop/src/app/hosted/tests.rs", + "bytes": 30344, + "sha256": "fa118f64d04b400ccc01e4e67adaf3541975288882afa265a9e7f092cdbda232" + }, + { + "path": "crates/oa-desktop/src/app/process_canvas.rs", + "bytes": 28640, + "sha256": "11e991afbce187ae633e01214b2509a13623c940f1f5e6416aaee204158bc5a4" + }, + { + "path": "crates/oa-desktop/src/app/review_navigation_tests.rs", + "bytes": 7049, + "sha256": "5ebba36092cc89fcba394578e69c9507ad5a369e9a26526761716b5d4ee3ad75" + }, + { + "path": "crates/oa-desktop/src/app/save_as_tests.rs", + "bytes": 4113, + "sha256": "f8b915793f1a36fd152569c4781a4bdc17f4af404a8ceb373330053413087a1c" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols.rs", + "bytes": 18627, + "sha256": "99370865b548b28f32f4c6ce7e9f8eeaa0c80268a644f2ebcc4bd1e11695e59c" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols/tests.rs", + "bytes": 57781, + "sha256": "33292a7ce9b61dbc134f74372caa93af9704e2f968cd698da13ea6a1b8cf3ea6" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram.rs", + "bytes": 9979, + "sha256": "f7fd50cc9a86adb794713958348af63afc7c698f74965e13188b7b8a9e735c55" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram_tests.rs", + "bytes": 39957, + "sha256": "612e414b1a2cab12cbfd8fce23745559ff27577700694d53af67ad1f2883ee2c" + }, + { + "path": "crates/oa-desktop/src/app/transition_context_tests.rs", + "bytes": 11508, + "sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d" + }, + { + "path": "crates/oa-desktop/src/app/view_copy_tests.rs", + "bytes": 7846, + "sha256": "296821c51dcde568e7d717039aa26bfc1b56a9074aa16051007bb351b33a4d44" + }, + { + "path": "crates/oa-desktop/src/behavior.rs", + "bytes": 131449, + "sha256": "c9e0aea6a24cc982d0d82ee2b9b66f250cdfac037b36bf6b1b9d7dd38246cd3c" + }, + { + "path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs", + "bytes": 49386, + "sha256": "5f05318a6533503b9d6febf1ec4dd7256f192394bc1b952a7904c8175bd8ddae" + }, + { + "path": "crates/oa-desktop/src/behavior/creation.rs", + "bytes": 30053, + "sha256": "0fb19be3a5688c4bd3ca3643c47a97da7e7f85add8a860cd046a0d9cb3ce9dfc" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/app_tests.rs", + "bytes": 13181, + "sha256": "e9c5bf2b07357b7a2f679ae0d8f6904c1c1461aaeb94fa0db478b54d4641ae3e" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/tests.rs", + "bytes": 22793, + "sha256": "a0d1daf9fb3920f7e6181a9802d84fbe056cbf0043b9e41dba5fdda687d9818a" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario.rs", + "bytes": 149092, + "sha256": "d12a4b1caa61c08f69c4d2a64bd15568c4b7158dea91aac5a52a58a35adb863c" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace.rs", + "bytes": 32785, + "sha256": "69c7ad32e4bdc39f42d2e6c7764cfe1fa7867cd7dbcf9b904dec805e6c912666" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace/tests.rs", + "bytes": 35390, + "sha256": "abfc7caefb0de5bd479eb4af1b159ca77b68e6a157f477939628c3d5c90b44b6" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_operation_tests.rs", + "bytes": 10087, + "sha256": "89fb71c690e07eac314f7a5e05862d5c1e2f9c21039673bf22c4ac894d21c977" + }, + { + "path": "crates/oa-desktop/src/behavior/source_draft.rs", + "bytes": 39485, + "sha256": "85d543cc288e48b4c13001e4e386b5b54d9b1e349a5ac31e4e307572f2d8fb3c" + }, + { + "path": "crates/oa-desktop/src/behavior/state_canvas.rs", + "bytes": 93561, + "sha256": "2e2ad57b86f4cc1cc0c4c4c230571ef19bcc2f052001a8bdcc44925e5103077a" + }, + { + "path": "crates/oa-desktop/src/behavior/state_edit.rs", + "bytes": 35736, + "sha256": "cb2289e727163626152fc2f11195c6ee824851cb9442c57496da97fe7aebfb7c" + }, + { + "path": "crates/oa-desktop/src/behavior/state_menu.rs", + "bytes": 7447, + "sha256": "cc87c5caa177e114e4d9a7f7367e37ec2b0d1e1c16b0b99709b05ea0e59cf894" + }, + { + "path": "crates/oa-desktop/src/behavior/state_view.rs", + "bytes": 6988, + "sha256": "1eb892a9139ecb0671784c879ee5114f27e598e5b3589f5cdad0abffd5909f24" + }, + { + "path": "crates/oa-desktop/src/behavior/states.rs", + "bytes": 26986, + "sha256": "8986ed9492960e20f1254e9dfe3ff91d79ce9fef66f3bda738f9933278043954" + }, + { + "path": "crates/oa-desktop/src/behavior/topology.rs", + "bytes": 83845, + "sha256": "d06b2f0fc39b4814e94200297e148f1d4d97e04cb167766030ac9df18689e3b0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual.rs", + "bytes": 29107, + "sha256": "edc84fc69d8d4a8f4ce81a4452c4e2e35cfaf98addeed10235f392506c74e8b0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual_routing.rs", + "bytes": 16731, + "sha256": "d914b0e82aa8d253fe64be2ef74443d1fd2e6cec26d1cf30620a57646e1d426c" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct.rs", + "bytes": 32036, + "sha256": "413aa2009ee4cba0941836b43e41f16a04c8fc8568b6e92db5bb08516e95c287" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct_tests.rs", + "bytes": 54304, + "sha256": "ac8c8023117e31723084adb06e3ca7fd4ea3f95ad229622ccc759fa19b50c27e" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/layout_tests.rs", + "bytes": 14815, + "sha256": "4529ac8b05de769a2ada112473146fbfa27b0467d97d3541b86c4446b6050b83" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/view.rs", + "bytes": 29176, + "sha256": "a7d806cd621bdf857c4e4861685cd3eb556b320de3985b9cc3d9d131dad370dc" + }, + { + "path": "crates/oa-desktop/src/connection_edit.rs", + "bytes": 5301, + "sha256": "020581e077f82b43c936b623cc51733b02b88428df4e5f25df74b9705819fa37" + }, + { + "path": "crates/oa-desktop/src/connection_tool.rs", + "bytes": 27023, + "sha256": "649da93677d52dae495b0e19bc32f3122ab05a6d84de8402578ff5ce3f6ee1d3" + }, + { + "path": "crates/oa-desktop/src/context_menu.rs", + "bytes": 52955, + "sha256": "629354b34dc232763700251f2695b4d4e53d6251c0b1432ecc0dfe424f7dfeac" + }, + { + "path": "crates/oa-desktop/src/data_values.rs", + "bytes": 23877, + "sha256": "e1deb1cad551f0a9fdef9653aad257cfb36e6d9c0f93b6245061ec3fab8fd365" + }, + { + "path": "crates/oa-desktop/src/data_view.rs", + "bytes": 38871, + "sha256": "158b852be5d3db450aa5cda8b68a35bd96bddce1d8d053a7a23582095c06362d" + }, + { + "path": "crates/oa-desktop/src/diagram.rs", + "bytes": 105256, + "sha256": "4580b170e264d14e5cfa874709f6d2e076a05155bfbe1809336a9d05f75e98ef" + }, + { + "path": "crates/oa-desktop/src/diagram/lifecycle_tests.rs", + "bytes": 9316, + "sha256": "d0e72cc0574657d5a31c3ce307b58401d0ed77eedccd1aa02377f55ab0bc03f0" + }, + { + "path": "crates/oa-desktop/src/diagram/pointer_tests.rs", + "bytes": 11833, + "sha256": "10ca5049034159205ac8f22805354f308b0ba0596f331568c26cd1393bc8cedc" + }, + { + "path": "crates/oa-desktop/src/diagram/port_hit_tests.rs", + "bytes": 5624, + "sha256": "d2d0647629bf725b4dddfc211f5a27d495ed093a79af87cdae6c196f09a97b93" + }, + { + "path": "crates/oa-desktop/src/diagram/port_labels.rs", + "bytes": 13408, + "sha256": "28782983b82e4fca5dd4410ac8bd562359943b7010c7b24ecc42f0c7ad7fb63e" + }, + { + "path": "crates/oa-desktop/src/diagram/view_options_tests.rs", + "bytes": 2815, + "sha256": "cf0c98a7715558baf17b59f67a80556f98ad30262b4434635e617c6601775433" + }, + { + "path": "crates/oa-desktop/src/document.rs", + "bytes": 31080, + "sha256": "2ecc2cd496d4a83fd7a32b9dc68e49f0f1cb31a06263dfd6939b4764da5b73e2" + }, + { + "path": "crates/oa-desktop/src/document_save_as_tests.rs", + "bytes": 5781, + "sha256": "83dc243a25f4e97674ff0d86c794a490cc923e98f1f9fb05bb038f622f11e20b" + }, + { + "path": "crates/oa-desktop/src/explorer.rs", + "bytes": 14764, + "sha256": "fa01c59219564ba9ae5553abc2b6f94e9849f9148d5812ef99b40318fe5dcf9a" + }, + { + "path": "crates/oa-desktop/src/explorer_view.rs", + "bytes": 13773, + "sha256": "a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f" + }, + { + "path": "crates/oa-desktop/src/forms.rs", + "bytes": 106002, + "sha256": "e5c0805b93daf0e8244d4be32e5a0dd3a1856c281a9d9fb5f98497dcc43c4da2" + }, + { + "path": "crates/oa-desktop/src/forms/context_fields.rs", + "bytes": 10831, + "sha256": "eaacd474f6500dd344d5a8b63ccb1d1dd86fe2aea78ab708afa8a80d62ce69bf" + }, + { + "path": "crates/oa-desktop/src/forms/data_fields.rs", + "bytes": 49285, + "sha256": "f56397886d74086d69783f18fab961e13b0af05a8bb0d10d0dfa187cdad05f5c" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields.rs", + "bytes": 27414, + "sha256": "e7100474cde18bdfe95562bcb3c055f29b4b15aa64788a578194464aebcd046e" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields/tests.rs", + "bytes": 33950, + "sha256": "16d3c308138c063f45986d53c621ad83c7dc2ce853edd31b7204e2939a382df9" + }, + { + "path": "crates/oa-desktop/src/forms/port_fields.rs", + "bytes": 30554, + "sha256": "3fe684d651d5be6203fd9db3979c772913e1af5ac1514e67be386ffd88dc8127" + }, + { + "path": "crates/oa-desktop/src/forms/view_fields.rs", + "bytes": 24987, + "sha256": "5184d438f0dfd4e29f284ff048e19da73e71be1f24a6e9f123c7e922aecb85fa" + }, + { + "path": "crates/oa-desktop/src/guide.rs", + "bytes": 115874, + "sha256": "64c782afebecad5489d3bf06b41f3273904222c18e3244990f2749c991c92b55" + }, + { + "path": "crates/oa-desktop/src/highlight.rs", + "bytes": 2751, + "sha256": "da7c254fff7052e5fd9ec7469f473b91a819406028d7c304f6e22c4169561600" + }, + { + "path": "crates/oa-desktop/src/home.rs", + "bytes": 17587, + "sha256": "f03c1071334894f586a5a7c86026602a694db3c2faf902822e1dbe5156a859c2" + }, + { + "path": "crates/oa-desktop/src/home/tests.rs", + "bytes": 8167, + "sha256": "3b03ccfc97dfb75954e1e0ed568bb87a632295c07b96cedc05ed381f87b378f3" + }, + { + "path": "crates/oa-desktop/src/hosted/client.rs", + "bytes": 21912, + "sha256": "54b24b4b50f8d87d7c92946ea5a2cff4c98760e70555b3ce3d90be27115e95d4" + }, + { + "path": "crates/oa-desktop/src/hosted/client_tests.rs", + "bytes": 23009, + "sha256": "3ef70907ca75e098d631c41b90badd4cff1e1eb1b3c78e15a9f811c13ba8ffbe" + }, + { + "path": "crates/oa-desktop/src/hosted/mod.rs", + "bytes": 3744, + "sha256": "1b75e11c80fcb38fd20bb3487e3f88729fdac73e471c5ae64da28c249f77c63b" + }, + { + "path": "crates/oa-desktop/src/hosted/view.rs", + "bytes": 9281, + "sha256": "fc0c7b7ce3a5f05c49713df6661067751f81e810af11c614ca265ea9490e6463" + }, + { + "path": "crates/oa-desktop/src/main.rs", + "bytes": 1511, + "sha256": "cb0a919fd0df0924591283da5b55d64d525d8461640441509350be840235e51a" + }, + { + "path": "crates/oa-desktop/src/model_menu.rs", + "bytes": 34680, + "sha256": "12994a5433a91f8295a59d4bf40f35f1edb8d8dbb497a11eae8760299627f1d4" + }, + { + "path": "crates/oa-desktop/src/navigation.rs", + "bytes": 8839, + "sha256": "71355a12e1b4791106426d83fe5ebf0b29bce8e1dc594f0655ab85695469669e" + }, + { + "path": "crates/oa-desktop/src/port_edit.rs", + "bytes": 7809, + "sha256": "70b99f577c4fdeda8780c8dc1ee7b1639fd77aaca06658f06d725139fb3efb6d" + }, + { + "path": "crates/oa-desktop/src/port_preview.rs", + "bytes": 35855, + "sha256": "069487c4ece737d52e8ae4a84dcfb132236aca6799e841c91c8e7244320cf871" + }, + { + "path": "crates/oa-desktop/src/port_workflow.rs", + "bytes": 40582, + "sha256": "ccc15f97c3272145a67bb5857b4faeaf7437561bd61912fa27ab26e8824146a0" + }, + { + "path": "crates/oa-desktop/src/recovery.rs", + "bytes": 21041, + "sha256": "57e22e5fbb0e994e64ae03e69450271fe9f04a951db1670c2a018abe99db4489" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/README.md", + "bytes": 1587, + "sha256": "a90002df1e087d2dac7be26926864243568a0de7c4103e4927435b34178e8016" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/profiles.json", + "bytes": 473, + "sha256": "2c12ae96b50e6da5d60ce2b7fa00204be71dfbe2fd51311fc337a0de6a4332ff" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-bundle.json", + "bytes": 80974, + "sha256": "12715995e6f7f35414aea53b3ad720b9b31873ffdeaf4444231db1a5ac3c463e" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-model.json", + "bytes": 86191, + "sha256": "5535a706df9ec21715e8b6a5aa6dbd79636ae461450aee61305559016167612b" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-bundle.json", + "bytes": 85286, + "sha256": "ea88890a33f47d67dfb06d6dbbcc179058cf28dad76ae7d615c00aaf30dbbbfe" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-model.json", + "bytes": 90629, + "sha256": "5bb8db0b6394276666323483f977ac3586f88554c81a148c6d508fca0ef4576f" + }, + { + "path": "crates/oa-desktop/src/recovery/source5.rs", + "bytes": 6956, + "sha256": "0f0a763f0c98c2c908d4c2b95d8a4c042b6a255ee1cc16260e5404669691f642" + }, + { + "path": "crates/oa-desktop/src/recovery/source5_tests.rs", + "bytes": 12146, + "sha256": "cfd17a742f1f27b523fce7cd9309f0a07a30413395f6c58659fb91d02834a7a3" + }, + { + "path": "crates/oa-desktop/src/recovery/source7_tests.rs", + "bytes": 18213, + "sha256": "7ee61de66c75bf949489ba51ddc9677e2b4efc68801cf27909c9b894bfdc9288" + }, + { + "path": "crates/oa-desktop/src/route_edit.rs", + "bytes": 2941, + "sha256": "457ae59c2761a43a8620b4d336a7cf0f54b965997110ecaf968756a88b6b0374" + }, + { + "path": "crates/oa-desktop/src/semantic_review.rs", + "bytes": 3240, + "sha256": "916192003637b60c12f6b3b3663a5b9c770ae4d10d51a415f6b3e4035e30fe13" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts.rs", + "bytes": 24201, + "sha256": "a79236a8150597ff808597e59cf4f1e9e61c74c4901d9c8cf42d3427bb52a9a8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_recovery_falsifier_tests.rs", + "bytes": 11034, + "sha256": "3f255d04e4bffa5a467b75e3cbf6f7149aa3269a02f2a89fbaa1db0e5df9ae62" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_tests.rs", + "bytes": 20798, + "sha256": "04d0dd2ac453705185663f705282aa4a3a31433466a5be305764248da1a03c32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_view.rs", + "bytes": 6594, + "sha256": "e8ce3d844d6230c20fe2fda4d0fb256af8043f9b586160a8d110665c45a79561" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments.rs", + "bytes": 18160, + "sha256": "de0ec0c740895b160ff5b847332c087c3f1a48931583464069470cc61315ed59" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_tests.rs", + "bytes": 29389, + "sha256": "8b26be0324e0f33b1e7cf7af340350df8ed98963002d6da8589ee0e6f6900bea" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_view.rs", + "bytes": 3111, + "sha256": "cd8c4418b43d207fcc55a82a2364cd84053643e5c09c96de008c94b8372653fa" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch.rs", + "bytes": 31771, + "sha256": "44830e1a9fa572493d423545336f76e79fa24ef29900e4f7927cbc83f9071d17" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch_tests.rs", + "bytes": 27546, + "sha256": "2a8131b81322e6a49b1348c6efec4526a3df53c8eefc0a2b25c746e2b7c6ead8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose.rs", + "bytes": 27155, + "sha256": "c6adcc9882dde65e9f04f6eda7f0c855c5cbb285cf421123029169112793ce9b" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose_diagnostic_tests.rs", + "bytes": 9809, + "sha256": "440daf8d43278ef981c620d1818d0daaed8fb83193b8e8ff67b2e42fbf882938" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructor_tests.rs", + "bytes": 54132, + "sha256": "85149521ad7df62918f6f2fab6da2b3346c342ab4bce7100de3f6206c1e81096" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructors.rs", + "bytes": 12258, + "sha256": "0982163439b06a42d9af1643530364109282e63f05b323a35a76d8241f3caa32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/history.rs", + "bytes": 3211, + "sha256": "df038c2464eab8093a983f3104f0d04ca8f602010a50e1d3eeb8e53f2309e201" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed.rs", + "bytes": 14525, + "sha256": "f8db8578ecff84526bda96c233b50e56f1cf1c5b8ab04cbbaa04f9b5e78300f0" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows.rs", + "bytes": 13567, + "sha256": "af9b137fe56ff3a71378e9998bfbb7b68f035bd542aa6fa90b83e04796cf4b38" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows_tests.rs", + "bytes": 30804, + "sha256": "1a3b09e7ed100411cdf8043f9a78defc664a873ee0201117709185c201a5c57f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_tests.rs", + "bytes": 31955, + "sha256": "112a2d50130407a4a1069827e4e5d5a8681e672dd3e54b559c6d3dde4302a298" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind.rs", + "bytes": 789, + "sha256": "4ed19952ea511d1b3226564a138e3322f994371d6b49794c14bc3689d1393e7f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind_tests.rs", + "bytes": 23424, + "sha256": "5fcf9930e949aebeb12eab0327264f32a2388d62dbf098bd2365711e22623c52" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered.rs", + "bytes": 9959, + "sha256": "8b809e8b0958e553896829b655684084bf2f0ca7df9d40c6acbdad8749cd6342" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered_tests.rs", + "bytes": 22383, + "sha256": "5c8ea3a69e3da3b94d13f50f12aa7dc53246ccba25ffcace9552a0eb76b0bf36" + }, + { + "path": "crates/oa-desktop/src/semantic_review/recovery.rs", + "bytes": 28769, + "sha256": "88e69044d90c481593bab7cc125f0401c05202fccdde07698cec9483947fe8be" + }, + { + "path": "crates/oa-desktop/src/semantic_review/row.rs", + "bytes": 36972, + "sha256": "ecde54540071fde82d8d580d0da2fccd16d6b8e0144bd5e129afe91455f73bb1" + }, + { + "path": "crates/oa-desktop/src/semantic_review/scalar.rs", + "bytes": 15153, + "sha256": "9ad202174934dd9a63fbf9cba43135aead571db60846c8b7b1d3019a11df26c2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/source7_tests.rs", + "bytes": 11665, + "sha256": "5e8221d77b068fa30c1571988448cb8829711735881d810f3d333cbc95d34a9f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/tests.rs", + "bytes": 32480, + "sha256": "8839e241cf81d1e66abe072728eee1870b42341fbbefae9f39bda1b1a020f4ba" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view.rs", + "bytes": 57336, + "sha256": "c391814442cd5e95040c6dab9d511a254181de56c68d5c266d879870001561ad" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view_reserved_artifact_tests.rs", + "bytes": 4737, + "sha256": "6c766b29c8664d15cb113d2cc71bba9b60ae4ccf7e44c9c5d3c41e1dc4b7ed90" + }, + { + "path": "crates/oa-desktop/src/source_navigation.rs", + "bytes": 4030, + "sha256": "3f7007bc3b3ef6266e92ea4121cfbdb32df2e97713797b403ce6649070a90517" + }, + { + "path": "crates/oa-desktop/src/source_navigation/controller.rs", + "bytes": 3374, + "sha256": "4ec54ce769f047d6e5c1de6bdbe81648ad63c75cfd04aea5356bd5663126d77c" + }, + { + "path": "crates/oa-desktop/src/source_navigation/interaction.rs", + "bytes": 8808, + "sha256": "c6efa6105b8ba46655e27a89b9fa59e6fc01a4c6f331f886e035af1e70cbf8a9" + }, + { + "path": "crates/oa-desktop/src/source_navigation/interaction/tests.rs", + "bytes": 6616, + "sha256": "6cf5c5944b9c46c275c9039f7166b627fa9176187b39348152f67040c92c95e1" + }, + { + "path": "crates/oa-desktop/src/source_navigation/query.rs", + "bytes": 35200, + "sha256": "aa8e8e9d446b57c30520c4b3ca1ae9fe524cecb2f4f4f4b229d930ea0377ecca" + }, + { + "path": "crates/oa-desktop/src/source_navigation/query_tests.rs", + "bytes": 29720, + "sha256": "a4ecc95a49d0a9325cbf1548cf95a8d367f758f8eb1f44346a2b71ef046f6668" + }, + { + "path": "crates/oa-desktop/src/source_navigation/symbols.rs", + "bytes": 68862, + "sha256": "d6c9325223fb3f18e887a63187b67aa59735d4e51f501c9e27ebb870944912ec" + }, + { + "path": "crates/oa-desktop/src/source_tree.rs", + "bytes": 21816, + "sha256": "4d55e0110a1eb128a5d26c28f3aae5853d79b7245812b7c82bd275f38440a5aa" + }, + { + "path": "crates/oa-desktop/src/source_workspace.rs", + "bytes": 24090, + "sha256": "388c71f63829c0c76526a1700ebf5f240c86c467a65aae4fca4cd6c6a88c468b" + }, + { + "path": "crates/oa-desktop/src/style.rs", + "bytes": 3015, + "sha256": "05d61bec16141612ccafa0988e8c4827f41754509efdb3b961eab69127ded896" + }, + { + "path": "crates/oa-desktop/src/tests.rs", + "bytes": 58663, + "sha256": "94e340b8ef7f9a3bb71fd2a2098dbb9c3d2bb3adba25b5949430b714e36fdfe1" + }, + { + "path": "crates/oa-desktop/src/view_copy.rs", + "bytes": 9043, + "sha256": "5630f31c942e1226aafd67eabdace6a5c5494875bdc6f7f077019e8110ba41a9" + }, + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 67221, + "sha256": "f306f5326bee0ddd54c9f9da406d8d45115b04f2546f31286846714d71dbbb32" + }, + { + "path": "crates/oa-desktop/src/views/source_symbols.rs", + "bytes": 8819, + "sha256": "9cd536072e110803b6a592bcbcd595b6f9eb32fc1d0b4c9de741247c459abbe5" + }, + { + "path": "crates/oa-desktop/src/views/traceability.rs", + "bytes": 7501, + "sha256": "4c89dcf35c25e737d8cce4d543a5989ca104a5678e6cf40df47e457773d2ef94" + }, + { + "path": "crates/oa-desktop/src/workflow.rs", + "bytes": 82829, + "sha256": "a00ba19d6d23435d18c9e1f6a0ad2065f889bcfa97aa3840bcdfaa03cb2666aa" + }, + { + "path": "crates/oa-desktop/src/workflow/communication.rs", + "bytes": 11084, + "sha256": "34d121ad97706012722e4bb6210072ecc3a5b4718b0ceab0c3d0f14d4cd780a1" + }, + { + "path": "crates/oa-desktop/src/workflow/recovery.rs", + "bytes": 9859, + "sha256": "0849b0f34dba5e8761be5fa05784d134ac74e4e9db395d6b9b7d6cff71e3f3dc" + }, + { + "path": "crates/oa-desktop/src/workflow/transition_tests.rs", + "bytes": 8553, + "sha256": "589b1b2dbadca74a52c2cfcfd4fe620bd4790abd113ac02182e91616c52d793c" + }, + { + "path": "crates/oa-server/Cargo.toml", + "bytes": 778, + "sha256": "527ff5e15010a8b560a6659aa1ae4bf0c8df0d9e019f03c47529ec6a750c0982" + }, + { + "path": "crates/oa-server/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-server/src/error.rs", + "bytes": 5610, + "sha256": "93817f1502386e4662c96ee1c7d1c4afc4e33bda6fd64e46c86c8e1afd5a9368" + }, + { + "path": "crates/oa-server/src/lib.rs", + "bytes": 7743, + "sha256": "20bef350350ed6339588b23af684abf745f97916c7edf3853ee042abe687e664" + }, + { + "path": "crates/oa-server/src/main.rs", + "bytes": 4163, + "sha256": "d59a6a2b5c7034bd2e00a516d2d49abb16391bf0316c1c357ddafb9c82d2d1e3" + }, + { + "path": "crates/oa-server/src/preparation_http_tests.rs", + "bytes": 5523, + "sha256": "454b90d0055d35644c8d990cd7576ddf675a9b271ca07fe9b0efce25d8ddbc07" + }, + { + "path": "crates/oa-server/src/routes.rs", + "bytes": 46053, + "sha256": "3f9a0c22043dbf28f7a8e587d2fc3abf869f76f4d23a46fe0aeb9c4392454a4b" + }, + { + "path": "crates/oa-server/src/store.rs", + "bytes": 25524, + "sha256": "37dcfb845b7993d5bced2bcf25fedfcd2a9c20a748f9315afe6cca1f41f89ae5" + }, + { + "path": "crates/oa-server/src/store_preparation_gate.rs", + "bytes": 4440, + "sha256": "427c390da3c0281ba1fe115a93ea90800e3b45fce6bcb9185e71982ddd885fec" + }, + { + "path": "crates/oa-server/tests/http.rs", + "bytes": 71892, + "sha256": "50daa6a90e96ad6fe3c6a27df2eaebe486270599c203892d09769c547a194975" + }, + { + "path": "crates/oa-server/tests/http/communication_limits.rs", + "bytes": 5790, + "sha256": "ba5474dd8e494a0176fffb4548c8e3deb2081b15de33bfce82394c764e0a2c16" + }, + { + "path": "crates/oa-server/tests/http/data_contracts.rs", + "bytes": 25949, + "sha256": "8cd456db83f301baca380acf025a5a99db4edf7d8839537dfbd02c4307e10e6b" + }, + { + "path": "crates/oa-server/tests/http/port_anchors.rs", + "bytes": 15086, + "sha256": "7199d0a208ddad9e1518b6e3fb390d64da111716d7505ba5c995deae19ad1258" + }, + { + "path": "crates/oa-server/tests/http/semantic_transitions.rs", + "bytes": 22832, + "sha256": "856d1c9b633ffb581e3e631f4e5a607789a02181dbf060667f208a569bfa4920" + }, + { + "path": "crates/oa-server/tests/http/source6_views.rs", + "bytes": 13023, + "sha256": "867bccda0e030eeeb9976b4ceeb47b21ab5044d700278022d5fb495bbb64ca07" + }, + { + "path": "crates/oa-server/tests/http/source7_contracts.rs", + "bytes": 11000, + "sha256": "0e0a467186da7263c0754890aff69ebd0d92d36b5224e4865bb6854b18dab7e8" + }, + { + "path": "crates/oa-server/tests/http/source_projects.rs", + "bytes": 30907, + "sha256": "8ff580f317ec267d1cd72ae14d8638f74a77cdf99ca4c78f66f4290c2d77460a" + }, + { + "path": "crates/oa-server/tests/semantic_http_contract.py", + "bytes": 7251, + "sha256": "4737ff94f10761f94151a694414c5c62737e0391ec820bca132830652bc4cca2" + }, + { + "path": "crates/oa-server/tests/semantic_schema.py", + "bytes": 25038, + "sha256": "70c9d267268bd390680f290a585bd4ae0c6d8ef999ee2f32ece6e172293574f7" + }, + { + "path": "crates/oa-server/tests/state_representation.rs", + "bytes": 12241, + "sha256": "6686c826f28248ae4b63ec3f2112e193d4a347724b87974483217fcfee49cd61" + }, + { + "path": "docs/acceptance.md", + "bytes": 3463, + "sha256": "32ed3e4fed63f5c464e0937221f401d71623b276dd70f083531ac6ccebbf9050" + }, + { + "path": "docs/api.html", + "bytes": 73861, + "sha256": "6f18cfc2a35eba631dbc61d04cd2721e0e361efff1699bf56d2c450a30a17a0d" + }, + { + "path": "docs/api.rst", + "bytes": 42711, + "sha256": "7eb258088824efa5ac94311b07b73eb46edcac3c300a2aac78d3802111e338c4" + }, + { + "path": "docs/architecture.md", + "bytes": 10974, + "sha256": "a50bd1645222ef3e574fa07a6ab9aa213431ee8833c6c0158ad91ce0f799543c" + }, + { + "path": "docs/language.html", + "bytes": 179377, + "sha256": "739a5bb100c7cb0ed70e18afd1e363029757f3cfd6580bc9c5cf77faccb46940" + }, + { + "path": "docs/language.rst", + "bytes": 131984, + "sha256": "894a1a77f97d1aa94c11762fe4e84b4d95e181a77c630324c16c307637ed27e1" + }, + { + "path": "docs/linux-packaging.md", + "bytes": 8671, + "sha256": "41a1bb1095801df37a1411341c5791d55ea8c365739314d599a60269ac4bc7a0" + }, + { + "path": "docs/openapi.json", + "bytes": 359757, + "sha256": "c6ae512f791a939eaf6ec5e5e78e9468bdee0e028092d00098bd90ad9498d967" + }, + { + "path": "docs/research-v2-architecture.md", + "bytes": 40445, + "sha256": "1b3809f2dabe6b1805dbf3d3f2625c471cd21356c7bd603916466a8c4ced8090" + }, + { + "path": "docs/research-v2-semantics.md", + "bytes": 31535, + "sha256": "b7ec3677300248926a88b84da3e7ffe52f5b73524c7712c927a0e951569db04f" + }, + { + "path": "docs/research-v2-service.md", + "bytes": 36209, + "sha256": "4828df5bc679e7c71f49b4b85c9e7dacbec52f46d416fed48af70e08886d4e4e" + }, + { + "path": "docs/research-v2-ui.md", + "bytes": 3245, + "sha256": "894e721b59a8ca85f0d95b6706ed5f130a0372def460cf33aeefc9e5e38cde0a" + }, + { + "path": "docs/scope.md", + "bytes": 16260, + "sha256": "58b88a7f0b1c8a79edf23c375a141d7b1b821bca4f3212a80e29db5ea3fba796" + }, + { + "path": "docs/server.md", + "bytes": 23361, + "sha256": "4eb24937d424ba8b384e1734e02a6f8e963ae11d2715889c92b14b39ff2e4a48" + }, + { + "path": "docs/source-cli.md", + "bytes": 3374, + "sha256": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051" + }, + { + "path": "docs/v2-interface.md", + "bytes": 11807, + "sha256": "c7fbaf0ebd3fc9f6c11f818db2b0b9d68a33f580cfced22bde83ce08ae790bc7" + }, + { + "path": "docs/validation.md", + "bytes": 6505, + "sha256": "f46ea950ed1a54409aa07c4f9e90f39f8e2d00c1dd1b6cb805caa3993845967f" + }, + { + "path": "docs/windows-packaging.md", + "bytes": 10406, + "sha256": "2c852ff7041713ffbff3c951ac98df647c51fb70b0feba9000f7bfd5bc2703a8" + }, + { + "path": "examples/coastal-rescue.arcadia", + "bytes": 33107, + "sha256": "7e183ef9fd8154d3074303f1956cd0d9871c19e3ffc630d333b0bffbd6e30e17" + }, + { + "path": "examples/coastal-rescue.json", + "bytes": 49715, + "sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195" + }, + { + "path": "examples/legacy-v1-coastal-rescue.arcadia", + "bytes": 3449, + "sha256": "4dbbbdf8bc7e6cb8e0a81dd678069dae585a9e5187c59bc3665e1fdab3f1a86a" + }, + { + "path": "examples/legacy-v1-coastal-rescue.oa.json", + "bytes": 5976, + "sha256": "fd0e9dedfb7adb922dc0575cc2b820d40344d639f1d8052bd70363aa59de9c24" + }, + { + "path": "examples/release1/README.md", + "bytes": 11137, + "sha256": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5" + }, + { + "path": "examples/release1/evidence/repair-check.md", + "bytes": 1419, + "sha256": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5" + }, + { + "path": "examples/release1/expected-diagnostics.json", + "bytes": 288, + "sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e" + }, + { + "path": "examples/release1/model.json", + "bytes": 134520, + "sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727" + }, + { + "path": "examples/release1/model.rs", + "bytes": 28762, + "sha256": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5" + }, + { + "path": "examples/release1/oa/activities/activity_oa_restore_work.arcadia", + "bytes": 1307, + "sha256": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4" + }, + { + "path": "examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia", + "bytes": 697, + "sha256": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d" + }, + { + "path": "examples/release1/oa/behavior/process_oa_field_procedure.arcadia", + "bytes": 1781, + "sha256": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324" + }, + { + "path": "examples/release1/oa/behavior/process_oa_response.arcadia", + "bytes": 3225, + "sha256": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_conversation.arcadia", + "bytes": 1795, + "sha256": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia", + "bytes": 1261, + "sha256": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c" + }, + { + "path": "examples/release1/oa/behavior/state_machine_oa_monitor.arcadia", + "bytes": 2022, + "sha256": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5" + }, + { + "path": "examples/release1/oa/capabilities.arcadia", + "bytes": 781, + "sha256": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936" + }, + { + "path": "examples/release1/oa/model.arcadia", + "bytes": 661, + "sha256": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15" + }, + { + "path": "examples/release1/oa/participants.arcadia", + "bytes": 1834, + "sha256": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3" + }, + { + "path": "examples/release1/oa/types.arcadia", + "bytes": 788, + "sha256": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49" + }, + { + "path": "examples/release1/project.arcadia", + "bytes": 1958, + "sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda" + }, + { + "path": "examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia", + "bytes": 706, + "sha256": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088" + }, + { + "path": "examples/release1/sa/behavior/process_sa_field_procedure.arcadia", + "bytes": 1790, + "sha256": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768" + }, + { + "path": "examples/release1/sa/behavior/process_sa_response.arcadia", + "bytes": 3234, + "sha256": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_conversation.arcadia", + "bytes": 2127, + "sha256": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia", + "bytes": 1256, + "sha256": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74" + }, + { + "path": "examples/release1/sa/behavior/state_machine_sa_monitor.arcadia", + "bytes": 2022, + "sha256": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736" + }, + { + "path": "examples/release1/sa/capabilities.arcadia", + "bytes": 781, + "sha256": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_audit_thresholds.arcadia", + "bytes": 297, + "sha256": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_restore_work.arcadia", + "bytes": 2576, + "sha256": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6" + }, + { + "path": "examples/release1/sa/model.arcadia", + "bytes": 661, + "sha256": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4" + }, + { + "path": "examples/release1/sa/participants.arcadia", + "bytes": 4012, + "sha256": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8" + }, + { + "path": "examples/release1/sa/types.arcadia", + "bytes": 1227, + "sha256": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660" + }, + { + "path": "examples/release1/traceability.arcadia", + "bytes": 29506, + "sha256": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f" + }, + { + "path": "examples/release1/transition-before.json", + "bytes": 35801, + "sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d" + }, + { + "path": "examples/release1/transition-request.json", + "bytes": 4276, + "sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a" + }, + { + "path": "examples/release1/views/diagram_oa_allocation_view.arcadia", + "bytes": 2176, + "sha256": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7" + }, + { + "path": "examples/release1/views/diagram_sa_allocation_view.arcadia", + "bytes": 2173, + "sha256": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389" + }, + { + "path": "examples/release1/views/diagram_sa_capability_view.arcadia", + "bytes": 1620, + "sha256": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649" + }, + { + "path": "examples/release1/views/diagram_sa_service_view.arcadia", + "bytes": 2209, + "sha256": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b" + }, + { + "path": "examples/release1/views/diagram_sa_state_view.arcadia", + "bytes": 1931, + "sha256": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869" + }, + { + "path": "examples/routing-workshop.arcadia", + "bytes": 66431, + "sha256": "dc6b75da72884d399132ed9e300fa5a26b73d802bb526c9af986ae9eeb0a646a" + }, + { + "path": "examples/routing-workshop.json", + "bytes": 100281, + "sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14" + }, + { + "path": "examples/source-project/oa.arcadia", + "bytes": 2142, + "sha256": "5f60642f211b2d352a951092faeeb7503d4fb7f6f7fca99e810347231101d31c" + }, + { + "path": "examples/source-project/project.arcadia", + "bytes": 606, + "sha256": "787f6b67b179ffd221f7e5faf1a4edd74cfd116aa1e3b5e9ed9f22fbff612d8d" + }, + { + "path": "examples/source-project/sa/assurance.arcadia", + "bytes": 682, + "sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f" + }, + { + "path": "examples/source-project/sa/participants.arcadia", + "bytes": 1231, + "sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88" + }, + { + "path": "examples/source-project/sa/reporting.arcadia", + "bytes": 2839, + "sha256": "f0b7443f728912ca163de39b6055876b533a77feaa3219b2d40a2dd65712e058" + }, + { + "path": "examples/source-project/views.arcadia", + "bytes": 3508, + "sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f" + }, + { + "path": "examples/text-first/README.md", + "bytes": 1367, + "sha256": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e" + }, + { + "path": "examples/text-first/project.arcadia", + "bytes": 480, + "sha256": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a" + }, + { + "path": "harness/fixtures/basic-editing/README.md", + "bytes": 12012, + "sha256": "3545d9695e7c62e0caa818efd7f4dc426f04876a3626e0f3b1bad606b258cb26" + }, + { + "path": "harness/fixtures/basic-editing/base/expected-baseline.json", + "bytes": 4524, + "sha256": "f239e728d650b0af32bb8f3dcaf6b27c99b9c5041132ac14e51756ea6563d978" + }, + { + "path": "harness/fixtures/basic-editing/base/project.arcadia", + "bytes": 3077, + "sha256": "045cb047d7bfbca72c3fb30db4c81a30ad463d3af7fc51604906ad7fa75a1ff8" + }, + { + "path": "harness/fixtures/basic-editing/base/rationale.arcadia", + "bytes": 57, + "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f" + }, + { + "path": "harness/fixtures/basic-editing/manifest.json", + "bytes": 447, + "sha256": "d23c21b02064ddb85e051e10e16ff089daba8d9910bb1a695dfabe2db3757734" + }, + { + "path": "harness/fixtures/behavior-creation/README.md", + "bytes": 5954, + "sha256": "9e5fc751424d12cfe76a84abb1da45b2d38947409179451bb90ffe7e7ddc8723" + }, + { + "path": "harness/fixtures/interface-operation-probe/README.md", + "bytes": 2604, + "sha256": "088f0bdb3375deb8f2c7e3b749ca8d210ea828ca4dece69b3871b674e3110175" + }, + { + "path": "harness/fixtures/interface-operation-probe/hashes.json", + "bytes": 977, + "sha256": "f6d3e8aa42f40f64ce2ecba7b9cf112eb9091f3cccde3a592b0434e834cf2a6a" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.arcadia", + "bytes": 4218, + "sha256": "c0fe9570684c0061efc4cad65e339fede6961b04ca90c6f324c787bd65e61226" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.json", + "bytes": 7835, + "sha256": "93187f7a1b476a44185725c6b15f2e1767482b6911ab1280144348d033eb51f0" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.arcadia", + "bytes": 4771, + "sha256": "02f85e39957ebe6d56336fa729a5c8b10f51865face9d3b2c9679200571fcfc7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.json", + "bytes": 8840, + "sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.arcadia", + "bytes": 8635, + "sha256": "ac5b629ba5596464f9f8a975b8bc2764e3007ceb7342de3f828d4b18e4f069b7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.json", + "bytes": 16160, + "sha256": "78a47c978dc667aa1c45af711f06aa2a0d3c581003013e30c3e02fb0faae2e64" + }, + { + "path": "harness/fixtures/interface-operation-probe/probe.rs", + "bytes": 11274, + "sha256": "72b1b443e25eb20420dec4477b0fb5ef5d1c705e3882c81df88dd578ab96a426" + }, + { + "path": "harness/fixtures/release1-native/README.md", + "bytes": 2564, + "sha256": "5f5ba040fd2df9261a29bcab3f9a7ae27c3683265411ad3dda0b467d5df8590e" + }, + { + "path": "harness/fixtures/release1-native/artifacts/README.md", + "bytes": 4155, + "sha256": "24200c84ccc2ef3e17c029744074e5cea785188f5549ac54e44cf89682643f81" + }, + { + "path": "harness/fixtures/release1-native/artifacts/generate-semantic-artifacts.rs", + "bytes": 9275, + "sha256": "444f360b78df52c5e42046f77b148781e0c9bddc2a09c0b7bd65c7a4f376cfe6" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.arcadia", + "bytes": 7768, + "sha256": "84b22e95c213018612e6e8a84cad68b35a8b495ff3515b0f978c5e7a3d196d79" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.json", + "bytes": 7330, + "sha256": "13a6f99ec2df1dd35ee8b2613f183918cd9537eda4a5da085ad52e65c033db59" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.arcadia", + "bytes": 1446, + "sha256": "1e0d662ba33071b122ad9206d2d559a8e748c9431eb3ac1b759bde3760ca877c" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.json", + "bytes": 2216, + "sha256": "fa6a2e3643c0f909b92407abec3edc897033162eeaa501f8d4616f79d41fa044" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.manifest.json", + "bytes": 567, + "sha256": "65cb70b0d697a055363ba01bf30bed7e412d43c9978a033549c378d117719ae7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.request.json", + "bytes": 3991, + "sha256": "ed905267263e7f8a0cd2dbe833196b30118b6a246815216932fae661ad650699" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.arcadia", + "bytes": 6837, + "sha256": "e50fc462ec22dbf98011929931dd2489430001c3e6433608685b9d88bceb9acb" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.json", + "bytes": 6433, + "sha256": "f27a7b38d59c7cefe58cb36783d3d4dd8d8ae1168d9aed1eb61d343c18758908" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.arcadia", + "bytes": 1807, + "sha256": "eba2aec39e6efb405eace4bc8ab0c5563907c26d449e71a4aa750df9f73233b4" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.json", + "bytes": 2673, + "sha256": "2ef777f19b94f08b5e5ca2ef727777897e1018f1426eee291408b3c69101f596" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.manifest.json", + "bytes": 519, + "sha256": "3af7232ed3056ca84dcaf0f266ead3faaa512a0dc0051c7ba68791c20dbae0cf" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.request.json", + "bytes": 1246, + "sha256": "8af21b00b62e620256fbf50e47c6c5836cdb6922d9549cc4b3d86bc03b008073" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.arcadia", + "bytes": 4200, + "sha256": "20bb30473830e44228958e78fb7480269cdcc0580c6c90c718da75f34ca5a43f" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.json", + "bytes": 4552, + "sha256": "44f4b05db49758dcf344788f57cecc0250fd029099b1c54e4e1e3e972f6cf039" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.arcadia", + "bytes": 1808, + "sha256": "b0fd031671c9f755756922ec5c40a0ce3f40164d22c3c389aec9fd0705344da7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.json", + "bytes": 2673, + "sha256": "1acf81e08c51c85aceb14a3efbc39ec680552a19c7824aab4611ac3cf71b9c6d" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.manifest.json", + "bytes": 610, + "sha256": "a07978f4b0a3ca83e5ae5f35e7b66b26473b24431fc90e5889d755f1816d52dd" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.request.json", + "bytes": 2352, + "sha256": "5ff844a038b0030adb5a83d13d81e60f30627543388f6199b6a0e026fc42ea58" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-native.md", + "bytes": 4075, + "sha256": "a51ffbc45b6c172cbfed3b16c249296e6a28d457fea57393dd958cdcfbafbca1" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts.hashes.json", + "bytes": 2367, + "sha256": "3ad8b7428b3ed7585a91e7f5d9d5f4880caccfd0b08dca25d05af523e62e0a10" + }, + { + "path": "harness/fixtures/release1-native/communication-means/README.md", + "bytes": 15091, + "sha256": "015c16010c212af283f9def118c6d263ba65a3bc6e81a750f180624ca69bb311" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/entry.arcadia", + "bytes": 6098, + "sha256": "a6976e7c21031e7cc3cb731e20c3075cf89cf85144dc8d3f52930f8521ea196f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/expected.json", + "bytes": 10480, + "sha256": "60c4419415c546f06c9972ac7bb0e530ada7b30a200b59e75ddda231a24f9a3d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "3c41459f2b0706a767988738bf8126f76540415bb5940d9c5db19cbe8c18182d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.request.json", + "bytes": 1331, + "sha256": "b16e673b29c96b5aed681389ff7669110abe552939e86dd0ec6011c9a45ed860" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.arcadia", + "bytes": 5239, + "sha256": "a511a4d817d9c5c80233bce83e84a7056b7dce7afd9fcc25696e333f8f4df055" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.json", + "bytes": 8424, + "sha256": "7140114926228b1c378c450535f7a70992c71a879a8d2270c49e8d5f04a2f484" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/entry.arcadia", + "bytes": 5710, + "sha256": "910e6dfe609467047ce629ec9c626f4e927cada74bfbfa164414a8fe6783ea87" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/expected.json", + "bytes": 9868, + "sha256": "567259e20c9f6278776e8fa99b8b2fdbbc9a883ad875c5d39dae1b53de3a2924" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "997f72fe9258012df66e88344cf39c1a2cebf2327f604056b67f7f2a8ebcfbfa" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.request.json", + "bytes": 1127, + "sha256": "cb3fe05859cfffec6f8846c19983dc462413bc0ea4f6e19204f09c259919c4b1" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/cm-reverse-scenario.arcadia", + "bytes": 8209, + "sha256": "ec826b9b84616507490ac30e4d57100dd6338dba2f7071e879a8fb58820a85c5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/expected.json", + "bytes": 19735, + "sha256": "ef07e4d2d3fc36004ff01739838281581d9a703c747611eacc01bb9cc672489f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/entry.arcadia", + "bytes": 9827, + "sha256": "86dd8a355f6c9dadfea56d06e5247c9b0f820819d7df17ef5690671c7c81324b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/expected.json", + "bytes": 21877, + "sha256": "980489ec2c483d4f9efada61358c1f29bafb2572fd5b804c656b91b8e9bb4f9a" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.arcadia", + "bytes": 7698, + "sha256": "1abc4c4cac37cfb06ed3b12a115f9e7e6a2d3affd34b25c355309e5ee465fa40" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.json", + "bytes": 13130, + "sha256": "a5cf4cb2ef390113dd752f4054d43fb789da2ca77799efb5782805ae8aa2dfd5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.arcadia", + "bytes": 5454, + "sha256": "b761c4c2af5f7064aaf1f887ffd6094eb6ae834b2c8057ecdbc4aa97c042066b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.json", + "bytes": 8852, + "sha256": "2536b000de361fb131787e32b466b9123d4e98abf00c099ad32f6cb8e7fb530b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/generate-communication-means.rs", + "bytes": 28035, + "sha256": "003521404b702332082e01f2be7676fda1dd7b5bcf220bb81d25120c8984c75d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/hashes.json", + "bytes": 3133, + "sha256": "39b4dc02fc8b074015c59354fd1c1061c25832fde25065c7151f36eb0455e6f6" + }, + { + "path": "harness/fixtures/release1-native/communication-means/manifest.json", + "bytes": 1237, + "sha256": "fb921f42f2c4a4f8a67d1266f17f8c7750b6a2619554b713aa92b17918f0c43e" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40-oracle.json", + "bytes": 26264, + "sha256": "74edca148583f42c269e51f135662f65ef1c9ea1c94516d63e2a5091967dc99b" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.arcadia", + "bytes": 28947, + "sha256": "00b87736b82c5afd33b311df7aebe9a6c8c51b6de66221181b5ea8bc8ca221a3" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.json", + "bytes": 54938, + "sha256": "5dd4f22453330cab3abc059881660190e689a22619853f77cf6d0b52735d97ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments-native.md", + "bytes": 2624, + "sha256": "28906924b05f75bbf432389517aef65f1df474d2f2bff79a3586564f7f7328ef" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.arcadia", + "bytes": 6795, + "sha256": "9d084dd75a0251d349cc31f9ee98df58d0bc76859dc3cb1503f242e2f759888a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.json", + "bytes": 9618, + "sha256": "f09be41afd85c18fd52fdf997e9b81c4b7cb2c41e78d167abcd14caea8110333" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.arcadia", + "bytes": 4990, + "sha256": "8740f27be99624013d9be876639c0411e1b8c14f0f9a843f43dc71d769efd79a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.hashes.json", + "bytes": 963, + "sha256": "00fc9e2c709bdcd9ee98012176cb0edb635c112153d963cd169bf4bf69a9e010" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.json", + "bytes": 8146, + "sha256": "9c188f2890630c7feec2be719a7104af9690da7ea836df18fa78da3ff2acfc1b" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.manifest.json", + "bytes": 1045, + "sha256": "46b40f221ffad614733b615208814ace63947e96b80bbfdec63853ccd4f4e8c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.request.json", + "bytes": 3075, + "sha256": "b57f656f0b9cf2c595e83150c683301909e20f15684d35d108d3c57ee0dc5909" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch-native.md", + "bytes": 2637, + "sha256": "dddca2b85f892b05881c75ef3cd62437396cc086a09909b621e02bad0cbe56ff" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.arcadia", + "bytes": 3134, + "sha256": "d3315bba762395205ae761e6e64029e8b4070c15a1299c6114075581db7b0974" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.json", + "bytes": 3927, + "sha256": "8f36119c7e893a4af374b13b85b1c2cb3df0196df8d06a551386628fc8b8646d" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.arcadia", + "bytes": 1787, + "sha256": "5e1f433e04621424edac43e53411624059e873f88dd531bfdb39093953485ed7" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.hashes.json", + "bytes": 933, + "sha256": "1bd87700b04e4f169ab5f8aceaa3b0c3ec3a1cc43e1bce135a1cee506fc75d38" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.json", + "bytes": 2816, + "sha256": "1972242d2a8677d004dc3af1081feb292de65fe26128d877dded8661f9906619" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.manifest.json", + "bytes": 647, + "sha256": "1e440efa02e2ccc27585d9a49c7864d53e3e3e7645ccb219f040e00d95331b8e" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.request.json", + "bytes": 2197, + "sha256": "71f23474614aab90398ce24f00f2cf61d6cb9a3a34faa3e12e0c8104e0a71073" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.arcadia", + "bytes": 15635, + "sha256": "e3ce0347746584f503b825a8b6bd23a7eebf0827940112ef8f36d500c1d0a043" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.json", + "bytes": 25736, + "sha256": "29736f2a619f7f2d0e795229f6e8c3645a1b4eca6292043cd604aa01b1ec9170" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.arcadia", + "bytes": 15631, + "sha256": "9ab573c92be66e3bae659dd826923ba6066979b1651edda7bd469056632cd77e" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.json", + "bytes": 25736, + "sha256": "828c990c6129692cd31c7f6ed0dd6c952f9cfffdd90bc80171df82d4d929afba" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.arcadia", + "bytes": 15617, + "sha256": "49214be2ca9c8bb6195c3b39737c053847021839f70f0bb2921d35a1fbd2ac83" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid-request.json", + "bytes": 2225, + "sha256": "8b02d4739b1be2c8a64da76423b4a6cae7d89c60f4d30723b94f1da3779cbcca" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid.txt", + "bytes": 78, + "sha256": "aa536e18bc65325163e9b645a4ad031ab599fcb05948dcf741b725d0f0c8b602" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.json", + "bytes": 25722, + "sha256": "995dd72f5c1f07f998233ae9847e337cb82de0c2a9053d3905be021d5f8124b9" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.manifest.json", + "bytes": 1059, + "sha256": "ad315359bfd68ce0d265976dc9e4ea6a502ebbb87d7339dd1af5ef27dd01e433" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-plan.json", + "bytes": 15016, + "sha256": "27bf316ad66ffa91f6323e75b0c280baf5caec298645793dea72c5d42aa3b782" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-request.json", + "bytes": 2225, + "sha256": "f4f6b5480ec8927033ea469ea82c1e8411cb6dba95d2da680f15bc193914c9b4" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.steps.md", + "bytes": 3897, + "sha256": "7d7e38d93641a5f22a2738baa4dbacc392eebb477a855cdce0641961980a19ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-plan.json", + "bytes": 18557, + "sha256": "74dd68ba686b8928054480f0bfed55aad91f6f1208803399dc9878e894f57ecb" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-request.json", + "bytes": 1508, + "sha256": "d19a53002a6bf95af3123a3ef9f78baaf7ce1085d4f06f0f4a9d5e5d5accbc0e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.arcadia", + "bytes": 6935, + "sha256": "90277f1780d43a6f0b2184bf00b87e7a4f3518d67c6f10d4793daafe1aabf493" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.json", + "bytes": 11286, + "sha256": "5a3c8494f6976c23b990c14b40760fb2f32ca9973caf6f31dab5632310663591" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous-request.json", + "bytes": 1379, + "sha256": "6a86fde194faa55f2d1bdb982571e0e711e5401b53a960e6acb8cf3e17f506c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.arcadia", + "bytes": 6195, + "sha256": "e7c30c5a5c3ba7209c8e223f02da55821d7af10a2f09844a7065ae6cd8f22aa5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-plan.json", + "bytes": 19156, + "sha256": "d1e5c2ed08e0aa6274a0421a39876d1ba99f4e441c7a0a68660a83b9e017da14" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-request.json", + "bytes": 2418, + "sha256": "433f723252598994dac7184da61f95344b528156cc5a0fba1a7864b2ec9f002b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.json", + "bytes": 10441, + "sha256": "9e4e2ce1c7879935ad0860a3ae720506c929a8422b51491b719d88af3fd3ff2d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.manifest.json", + "bytes": 1042, + "sha256": "87e8899c7d4e54faedeef32afb7592fb65278d1bd7390850ab198dcf62068329" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.arcadia", + "bytes": 6280, + "sha256": "6c77ed42bbf9f4ebe08bfa233197a4020e5587ce33747f7914430aa0c662d9a3" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.json", + "bytes": 10009, + "sha256": "1dd7ca2bcfc84ac23369c506302b39569d2ebc41e5a4edc99378a1fe01923b7e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous-request.json", + "bytes": 1390, + "sha256": "e0ea7aeb25687ae63c65128f1aab78273f14030d179d3fbea63fe91ab5430136" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.arcadia", + "bytes": 5529, + "sha256": "563c36162050c8564ffa25a85c726462ecdaebdb87659b3f3610506bfd5581e6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-plan.json", + "bytes": 18821, + "sha256": "f96c43fc58dbe48a044b628b31bb3f0b59171dad5b6982ec6c34a5597e474130" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-request.json", + "bytes": 2438, + "sha256": "d38fdb13612b07254edad80848f79c1e097d5f868c020feae9ba072aa697a50d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.json", + "bytes": 9153, + "sha256": "2ed0daed118f2df13dcad738dab174ad34d44a15921cf8097415e707978b0968" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.manifest.json", + "bytes": 1058, + "sha256": "c79bd12a85d8d4f25cc3ee43581b3e5e74ae9ad7e4de0c72764975ba2b89c279" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.arcadia", + "bytes": 5026, + "sha256": "98020e048ac01f285c6ad8c10ce22bef05e193b5ba0f5558be1fb26a7bf82620" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.json", + "bytes": 7851, + "sha256": "ea3783992488bc6ee944eb91a26ccf3dbc05a3909528fc32ec8023a76765cee6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous-request.json", + "bytes": 1379, + "sha256": "ea3cfd25f7a50481805956fb88ab851516dcd602dd6564502a0cc55f7de6a54f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.arcadia", + "bytes": 4295, + "sha256": "2b7c3694623bbea3e36dcc6f674d4adcd91e23c8e1005ded21e5a69648a048e5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-plan.json", + "bytes": 17912, + "sha256": "95a23bd334cffcaef0c3b1012b7555efd2a077ef6f9140d58020910ef8a76723" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-request.json", + "bytes": 2081, + "sha256": "1e2433ed5821bf65443f56cb27381ee935db81b1955d3a539b7952898312a410" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.json", + "bytes": 7012, + "sha256": "0033f8780c2ba69779b811bca792340c25a092f887e5811c6839f0a691d744f2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.manifest.json", + "bytes": 1046, + "sha256": "e3b4a60a56abee779ca8356605c968aa2d99256a3bd3c5601b14b5c5502a1a05" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.arcadia", + "bytes": 5467, + "sha256": "e265cab35097acc46f5123107c13bc35b9f71931ff650557fc1c85779141b327" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.json", + "bytes": 8482, + "sha256": "9b777828d3681138de6bbd08de8bf922bed92c27be60b103d8ff73ce7ddd0a48" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous-request.json", + "bytes": 1379, + "sha256": "7d124256730bf2feee772c7d0118b87eb288e8aaa9179d69ceb9259dbceb2c71" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.arcadia", + "bytes": 4727, + "sha256": "87a5a3665dab2dd6e595867dcebb1586e93dd067c85d6e24b1a4d3ff0ad6d4ba" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-plan.json", + "bytes": 18803, + "sha256": "1888ca51e0923866a9afea99cad069fe5d3f19f0a1b24328e20ac1b9f52d8bad" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-request.json", + "bytes": 2294, + "sha256": "5070a5b85feb1bc7b1fc648cd5d35ef26663492c8666dcd471950c06ec3a6052" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.json", + "bytes": 7641, + "sha256": "725b35e36640c81c70c7efea5c3304bf61b49ef9664194ca0d491782cc62191a" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.manifest.json", + "bytes": 1038, + "sha256": "1b43abf8fed3061c65a7b7cb103d31ea7ece333a2da83c645f8d228448c4dbb2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.arcadia", + "bytes": 5019, + "sha256": "65a6217f474b5085f37b511151185c2c08ff7a1998e924f1fe01f29c410f6ced" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.json", + "bytes": 7835, + "sha256": "8a53bb9b43eab5b6dca5e08deef20c14c96e134b9ee816a99b7960bb5255e008" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous-request.json", + "bytes": 1379, + "sha256": "c704f99245f00d5c3be0562d91931b4e7f1fb3fb36f41991eb76656ffbd6129f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.arcadia", + "bytes": 4279, + "sha256": "c59ec1233d5a9fbb8e386f6d9b13f398be21baf813ba215efb51bfc1bb98db36" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-plan.json", + "bytes": 17938, + "sha256": "30c5c3f614a74708763df612016483623792f4c65e2ed2fa662ac417cfb852eb" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-request.json", + "bytes": 2098, + "sha256": "3b6c35ef78133f0980cb6fb53fbc29c5d3c4deb5dc4be01c2c3384e221987b9b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.json", + "bytes": 6996, + "sha256": "c159c60403abcf8fefab7f19cbad9989488e8ccc20b82c57597b22a0ae254802" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.manifest.json", + "bytes": 1038, + "sha256": "af8a314a9b1d85a8f98affa5a6649f43d252851158798e1ad687bb1b6966b14f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.steps.md", + "bytes": 4549, + "sha256": "6004894e9d9f478b7fe1c3c3e0706dcc546d5df8557cff91b4cf26f8a4badf24" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/15000000-0000-4000-8000-000000000010.json", + "bytes": 1933, + "sha256": "71cca2a59f36b2a07d11dedbe9101226aa1a4a00d8ac244b5565202e56709f51" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/generate.py", + "bytes": 1496, + "sha256": "e44986c1d563499f25917441220b23883fc9cb0f89faf409873191f0212fbd2f" + }, + { + "path": "harness/fixtures/release1-native/state-actions.arcadia", + "bytes": 6224, + "sha256": "9cde82608110e56aa9e14c9e33eb38976f53aed74ab013145d411d5743a0ec26" + }, + { + "path": "harness/fixtures/rest-coverage/README.md", + "bytes": 1870, + "sha256": "df4a391312e0c8b20ccdcc850199443b08547be1b10b1f2447a067bf4bf544e6" + }, + { + "path": "harness/fixtures/rest-coverage/coverage-probe.json", + "bytes": 8008, + "sha256": "699b868dd6c955f7ef02f2f061935471f3d21a406005fcdecba8cc719cc69a1f" + }, + { + "path": "harness/fixtures/rest-coverage/run-coverage-probe.ps1", + "bytes": 9381, + "sha256": "f24f19fca418b76a7249894a08c116e16b465a02f8f899d12b808ccfdd90a3bd" + }, + { + "path": "harness/fixtures/run-timed-bundle-oracle.ps1", + "bytes": 7466, + "sha256": "fab696486a574f9867c6e69a8a8b960e7e9722206441b9cc5f36d41f285f1a25" + }, + { + "path": "harness/fixtures/scenario-authoring/README.md", + "bytes": 14700, + "sha256": "6b651b180b76d10b00bc49d77a8f5e0b3ba0317446978f41b541f5bb23fedad8" + }, + { + "path": "harness/fixtures/scenario-authoring/base/expected-baseline.json", + "bytes": 38589, + "sha256": "abd8246c939ebb8a2162ef82e23d0fb322ee1a8b4d0d7c28a34037e42e86e841" + }, + { + "path": "harness/fixtures/scenario-authoring/base/project.arcadia", + "bytes": 19470, + "sha256": "9b1afbe96b0bf8fa613451b00929492f05a59b9eb2ca74c2c374a8b7bb7cba9e" + }, + { + "path": "harness/fixtures/scenario-authoring/base/rationale.arcadia", + "bytes": 86, + "sha256": "82df210f22f6aa336a3e7e00240977d671c7c3923db7bc58fb29e6d98b67ef49" + }, + { + "path": "harness/fixtures/source7-native/README.md", + "bytes": 7235, + "sha256": "7abccbc3da0980d1d099761d1a66d12c403a0f543954134537ecd4930d182b4b" + }, + { + "path": "harness/fixtures/source7-native/base/expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "harness/fixtures/source7-native/base/project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "harness/fixtures/source7-native/base/rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + }, + { + "path": "harness/fixtures/source7-native/manifest.json", + "bytes": 410, + "sha256": "6c57164a796234d83818d462d0a25f10e77062d405769e602ae2a7bec251e3b6" + }, + { + "path": "harness/fixtures/staged-source-authoring/README.md", + "bytes": 8380, + "sha256": "711910a12d5f3960f32da9aa7bc2e647f31d770c84b7fc26e232dcb3a76f8821" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/notes.arcadia", + "bytes": 63, + "sha256": "ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/project.arcadia", + "bytes": 593, + "sha256": "aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c" + } + ] +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs3.zip b/harness/experiments/text-navigation-native-20260911/corrections/inputs3.zip new file mode 100644 index 00000000..4136436c Binary files /dev/null and b/harness/experiments/text-navigation-native-20260911/corrections/inputs3.zip differ diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs4-readback.json b/harness/experiments/text-navigation-native-20260911/corrections/inputs4-readback.json new file mode 100644 index 00000000..3aa3bf1e --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/inputs4-readback.json @@ -0,0 +1,7 @@ +{ + "atUtc": "2026-09-11T19:41:08.550906+00:00", + "changed": [], + "added": [], + "removed": [], + "passed": true +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs4.json b/harness/experiments/text-navigation-native-20260911/corrections/inputs4.json new file mode 100644 index 00000000..a854c0f7 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/inputs4.json @@ -0,0 +1,2504 @@ +{ + "atUtc": "2026-09-11T19:35:52.916704+00:00", + "head": "f4e426ae2a6971395e1ca7e6f094b0c20056cf93", + "branch": "codex/release1-9e8r6t", + "scope": "Exact Windows gate source inputs; no compiler or native result implied.", + "archiveSha256": "7ff9e5703e33bd72e5c2186dd61125e965b82b8dfbf085961d514b005e716798", + "files": [ + { + "path": "Cargo.lock", + "bytes": 119453, + "sha256": "2b960242c33eb839ff008d01731f6d5cdb4e047ca8cd6e13151cbf9c09913510" + }, + { + "path": "Cargo.toml", + "bytes": 400, + "sha256": "369f5b4b2b60705a94623c8c0b68f8e0b048f263280ce07ae0629ad353797d62" + }, + { + "path": "crates/oa-cli/Cargo.toml", + "bytes": 279, + "sha256": "49c567f1af74a826683b4d96845feb3806fd9bcb7dc2767e16b5509d4e5e1cde" + }, + { + "path": "crates/oa-cli/src/lib.rs", + "bytes": 15498, + "sha256": "97bebab63b4a611a1d36ad0c20fe452cbe1985fe3a6fbd39c954603da11410fc" + }, + { + "path": "crates/oa-cli/src/main.rs", + "bytes": 2984, + "sha256": "de964f9b6c59c0f31c080afbd3b31d442b07b1b44f6a187a248d3409c45d35fb" + }, + { + "path": "crates/oa-cli/tests/source_cli.rs", + "bytes": 16600, + "sha256": "a3a1b856c7a9fd3d80bc8074150a24fbb0ef0e9ddf736c7cea036725fc3dc2b8" + }, + { + "path": "crates/oa-core/Cargo.toml", + "bytes": 342, + "sha256": "64824ec447be777841a972bf06c894ef2624a37e4725583bcfe0389deb9f00a3" + }, + { + "path": "crates/oa-core/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-core/examples/generate_demo.rs", + "bytes": 795, + "sha256": "e26f432c95331aeca50985dbb3ad2c558affd43023b585811f0f7bfaa59f6661" + }, + { + "path": "crates/oa-core/examples/generate_release1.rs", + "bytes": 1798, + "sha256": "1d5f11165d74893e4bc18dbf3a2f2111f4026bd89fd06ee7f0bae69e45c4d4b5" + }, + { + "path": "crates/oa-core/examples/release_dense_views.rs", + "bytes": 14664, + "sha256": "a83158488ef9b7394f136c52b1496719be935c4e5bdfe457cab5c9894f5f9412" + }, + { + "path": "crates/oa-core/examples/routing_workshop.rs", + "bytes": 17248, + "sha256": "571307b18b6d4fa04700c5a4d4b0c2154c419e93a21292b2028e7b6f46a2faa7" + }, + { + "path": "crates/oa-core/src/data.rs", + "bytes": 42696, + "sha256": "7f9c7c7dd8353cb5a38597b92cde6d3e890203d392473187eb387d41ff37414a" + }, + { + "path": "crates/oa-core/src/demo.rs", + "bytes": 20657, + "sha256": "ad62123f96c20ff023cafc1a9849b0fa06bc62edd1fb9701799e4599b458600c" + }, + { + "path": "crates/oa-core/src/language.rs", + "bytes": 105312, + "sha256": "34cbb144a111e6f0ddadfca7d40636a8e3323fe65ea8920fd2402f0352b41f57" + }, + { + "path": "crates/oa-core/src/language/semantic_source.rs", + "bytes": 7326, + "sha256": "584b5bb59d87a7b8d44d5dd2d124c3a1323b21492b138a17bc9526c0087c9e29" + }, + { + "path": "crates/oa-core/src/language_nesting_tests.rs", + "bytes": 20639, + "sha256": "bd061611e8cb6f28ab203c73e544ac98bf275eb464cd314ad5fbd25f773df33b" + }, + { + "path": "crates/oa-core/src/language_outline_tests.rs", + "bytes": 14877, + "sha256": "4c79a01e8aea243dd9ef66ce71b9fae263d0e79c319a46c51223679897e8b9df" + }, + { + "path": "crates/oa-core/src/lib.rs", + "bytes": 523, + "sha256": "52cb6ee7a4ffc00711ecf121c1a1b14ca154863f7ca27b0d2a8e239edce8aca7" + }, + { + "path": "crates/oa-core/src/migration_v2/README.md", + "bytes": 1515, + "sha256": "fb61d3faa33d7bdfba73415415a0882c0fbd3e0b45df42f972a19aec6da927b9" + }, + { + "path": "crates/oa-core/src/migration_v2/adapter.rs", + "bytes": 9490, + "sha256": "66741b4c8354a23b8a932ecc5bf1bc3bb6e74279558757b8c35bc2157a7e51b5" + }, + { + "path": "crates/oa-core/src/migration_v2/mod.rs", + "bytes": 1158, + "sha256": "857d8bb13b6814daba6780ca770c16352943c01cb130245d055f11b3b957b3e9" + }, + { + "path": "crates/oa-core/src/migration_v2/model.rs", + "bytes": 52059, + "sha256": "8ac63eb59b2e57bdecff2477ee0634096090924d3dd1851e1c454880a889dacb" + }, + { + "path": "crates/oa-core/src/migration_v2/references.rs", + "bytes": 13369, + "sha256": "33a6819abc83139fdaebeebd1b553238a328637106cce7dd5a535f1791d43e20" + }, + { + "path": "crates/oa-core/src/migration_v2/source.rs", + "bytes": 21946, + "sha256": "74fee9b24e7c912182c998ab9d9aeec125e2009c3214959229e844c67afe2bf6" + }, + { + "path": "crates/oa-core/src/migration_v2/state_validation.rs", + "bytes": 15769, + "sha256": "e29ef071bab0a68460ddf55c46131c6f66c022d52c3c602c37c013c3649da1b0" + }, + { + "path": "crates/oa-core/src/migration_v2/transitions.rs", + "bytes": 704, + "sha256": "f74174c532ba56b57c80b719a11fb4adea0a78ccc2828fff72fe2b9eda5a10b1" + }, + { + "path": "crates/oa-core/src/migration_v2/validation.rs", + "bytes": 98736, + "sha256": "6d5e4a4e2805ae5045bf789a0485e14a61c63346587bace2b4a91173a688f780" + }, + { + "path": "crates/oa-core/src/migration_v3/README.md", + "bytes": 2128, + "sha256": "3755a63f840d7f0eadf68afa7a9d587877a9468ff982d3610539e8a0bb067a82" + }, + { + "path": "crates/oa-core/src/migration_v3/mod.rs", + "bytes": 23023, + "sha256": "f4edb6a0b50ecfe8670973776d703047b064420cb1f05913129c00fc656b3722" + }, + { + "path": "crates/oa-core/src/migration_v4.rs", + "bytes": 4020, + "sha256": "50c652964f0f309e7f3f54b6ef12c40d42fcecc0490f005995c713df1179af70" + }, + { + "path": "crates/oa-core/src/model.rs", + "bytes": 66352, + "sha256": "4585c895c64c4a183941c92cf047a9e52ff0cbe41971e16e78d229ea9dc101fb" + }, + { + "path": "crates/oa-core/src/operations.rs", + "bytes": 11405, + "sha256": "a5ffbbf54cd440316a106d1188bfb699b57dae59f466edcb33618c333cd19f41" + }, + { + "path": "crates/oa-core/src/persistence.rs", + "bytes": 31774, + "sha256": "1c01474f906a63e552c0d590b272c95821c00a100b3e79e58e67dbbeac341a14" + }, + { + "path": "crates/oa-core/src/ports.rs", + "bytes": 45413, + "sha256": "5cac12eea70a54ebebbd6be77b63ce92e3195325c4bc7d27705c518686cbac80" + }, + { + "path": "crates/oa-core/src/projection.rs", + "bytes": 21374, + "sha256": "69ed12bace2cc5024e151752a174ab14034ac2d05eb741fcf13e9a27521c059b" + }, + { + "path": "crates/oa-core/src/projection/port_layout.rs", + "bytes": 13474, + "sha256": "a08d17d10a58bb8b206dd001b19b91d5aa3a9f743b298a4da57d503223c20079" + }, + { + "path": "crates/oa-core/src/projection/state.rs", + "bytes": 5233, + "sha256": "73a607bac713ec7ff49a509fefb1a53c7686dca93ee241ffc835564d743afb28" + }, + { + "path": "crates/oa-core/src/references.rs", + "bytes": 21957, + "sha256": "93553c234f32da35f1f41a7b83ad81c471c9803efa78ca222cf7de3c2f86c0bb" + }, + { + "path": "crates/oa-core/src/routing.rs", + "bytes": 50309, + "sha256": "c5ebb350ba76f731f5c48d968bfbba4b6ef68ec046eb5893d116c4637ef15080" + }, + { + "path": "crates/oa-core/src/semantic.rs", + "bytes": 540, + "sha256": "f9895dd5b8fb27d10d4cfbb41c3542ef2018365a589b8d5778e5674ae5a1f239" + }, + { + "path": "crates/oa-core/src/semantic/catalog.rs", + "bytes": 49407, + "sha256": "1ff74fcca18084d178681d7ff38ee1ccac632c27c4de0595ba1ceab8067ab3a4" + }, + { + "path": "crates/oa-core/src/semantic/historical.rs", + "bytes": 15271, + "sha256": "eaf3284bf234312698514cdb636bc8348e1b5d746cb16b18df777e77d312abfb" + }, + { + "path": "crates/oa-core/src/semantic/linked.rs", + "bytes": 6035, + "sha256": "6f335b14e809aecfc35defcaf77cb821b080d1506dbc46297912b25af98c07a2" + }, + { + "path": "crates/oa-core/src/semantic/mutate.rs", + "bytes": 22683, + "sha256": "dc2b4c4a6eb156fe468eaa8c85fd37a505c0cd8ea1f226cb69cd01689afd3d9d" + }, + { + "path": "crates/oa-core/src/semantic/review.rs", + "bytes": 51116, + "sha256": "0c157d2c327e72e89cca3b423e71ee73798105c5bb7271439c1a101642c91e3e" + }, + { + "path": "crates/oa-core/src/semantic/types.rs", + "bytes": 10405, + "sha256": "6922fe35089f12fad43ab0ce1c6886d01a3855f90b8e2543e99802ac5e6f1bbb" + }, + { + "path": "crates/oa-core/src/session.rs", + "bytes": 35237, + "sha256": "1eb77b329b2986fc6f5dc0171e77fd860375cdfd8c769a1367b445d6c49ebe00" + }, + { + "path": "crates/oa-core/src/source_files.rs", + "bytes": 74803, + "sha256": "669491dbddb8e8e6556161426dffa1a49ac1c826d31020bff0956d81a4d84683" + }, + { + "path": "crates/oa-core/src/source_project.rs", + "bytes": 61843, + "sha256": "1394370bcc5908873b830c2c11312e6e1611af41f46c4f43ca0a6bcb713bb466" + }, + { + "path": "crates/oa-core/src/source_project/source_migration.rs", + "bytes": 4700, + "sha256": "add463ae85c420f853d324b00a221f0f874164cc3f3ed6bbb07557a9ed7a8c95" + }, + { + "path": "crates/oa-core/src/source_project/source_structure.rs", + "bytes": 20225, + "sha256": "9f1f83315856a7025fe662c0fbb13452f31613224a03663150d6225d1ddc162f" + }, + { + "path": "crates/oa-core/src/state_validation.rs", + "bytes": 15665, + "sha256": "e28d7f74385e2a78763716b34491bd73a00bfeccc085970ceb130627e3faee18" + }, + { + "path": "crates/oa-core/src/topology_context.rs", + "bytes": 13734, + "sha256": "16de69b297de95d93c73808621607833b713af811dd082f0169186ae1e5c3e2d" + }, + { + "path": "crates/oa-core/src/topology_context/analysis.rs", + "bytes": 20036, + "sha256": "dead6194f0aa60cc46045c0e5ee10dbdbb689158c38634dfbbbc45d2ba88ac65" + }, + { + "path": "crates/oa-core/src/topology_context/analysis_tests.rs", + "bytes": 5258, + "sha256": "17839263410815e96fe027d4eba3aae0a9ab3b82b16947e2b29ebe0d09782b56" + }, + { + "path": "crates/oa-core/src/transitions.rs", + "bytes": 51998, + "sha256": "fadd1b07b89cae4117b91abb4f1ac9ea81ff818ef20f2175e76ee8cf21fb708d" + }, + { + "path": "crates/oa-core/src/transitions/communication.rs", + "bytes": 8634, + "sha256": "2b476630a88edd9021b9156ca12a5402e01604095f0d4002afb452671903a028" + }, + { + "path": "crates/oa-core/src/validation.rs", + "bytes": 112792, + "sha256": "7c1b4ae5e4ebba13e99af9158ccde138dfc5e9a7afb580e76fba72d0b64ba74e" + }, + { + "path": "crates/oa-core/src/validation/coverage.rs", + "bytes": 6478, + "sha256": "b08e4b344ecad055714168c83beff7fe29ba4edc53edbffa2eae04e5580a4d5f" + }, + { + "path": "crates/oa-core/src/view_options.rs", + "bytes": 24481, + "sha256": "421ede0a04c593ca1df0e6e0d06fabcfcc8113cdbcfb0adc7f5c8ef4d1724208" + }, + { + "path": "crates/oa-core/src/view_options_tests.rs", + "bytes": 21433, + "sha256": "64aac44de2df42a1012239a3dd75c473daf0c8990b3170b7bf7e78a556080208" + }, + { + "path": "crates/oa-core/tests/communication_boundary_scenarios.rs", + "bytes": 8816, + "sha256": "e1100b8f363910a487d90c73acc7df543dc6d532158c3c63ad11cd3d40d8e12b" + }, + { + "path": "crates/oa-core/tests/communication_means.rs", + "bytes": 18102, + "sha256": "a25f2749180bc6f4beb1445bfad3351eedf0669131a7439b633ab804439e95a4" + }, + { + "path": "crates/oa-core/tests/coverage_diagnostics.rs", + "bytes": 20527, + "sha256": "e2e9c3996daab47f2bd23f5d8c48b4e372af33331152f5fc85b76f06d04fcdf4" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.arcadia", + "bytes": 29220, + "sha256": "f0df129c1914bfc01d0b047b0cd4b520d8cf0c249ea9ced085de400c0be87ff3" + }, + { + "path": "crates/oa-core/tests/fixtures/v2-coastal-rescue.json", + "bytes": 43990, + "sha256": "3ed53508eb544bbd788832f7bebea2ec31b3d66191f24f45098cc9750ec4c005" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.arcadia", + "bytes": 2450, + "sha256": "305f19d1b79f99f8d4cf627ba2e9ca6836bb7959cc0070227815937a699eafea" + }, + { + "path": "crates/oa-core/tests/fixtures/v3-data-contract.json", + "bytes": 8240, + "sha256": "1b41299c53204e6232397d25a58d5bccdbbc16e770c75e8edb55ce36ccfe58a2" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.arcadia", + "bytes": 1222, + "sha256": "5fa53a26a5ad010c8e59eb56d9b2b52003569e66c0377ffb58840590168ad0c1" + }, + { + "path": "crates/oa-core/tests/fixtures/v4-reviewed-prose.json", + "bytes": 1734, + "sha256": "2808088afcc165f4bd6da5129151143411c997041c3de61d600ab76e05d24a47" + }, + { + "path": "crates/oa-core/tests/language.rs", + "bytes": 56482, + "sha256": "77f6cb2a69976bfb5f60b243b71c07fb0edc7505002c1e9e73fcd6ddf6d9496e" + }, + { + "path": "crates/oa-core/tests/port_anchors.rs", + "bytes": 26893, + "sha256": "efbc0fa18733b1aaac501f9785a4c392fc49c05c45a5778d26e9b5dd951ca6fa" + }, + { + "path": "crates/oa-core/tests/port_migration.rs", + "bytes": 15620, + "sha256": "1801c376a5435ac7efb2a8342348b2c7ffef930bba65deca4acb66b06e0483d7" + }, + { + "path": "crates/oa-core/tests/port_source.rs", + "bytes": 4858, + "sha256": "8d2ddaca4045d330f6eda2591561497b858aad53769a823249d0bea4f5916e12" + }, + { + "path": "crates/oa-core/tests/prepared_commands.rs", + "bytes": 9555, + "sha256": "52cab1c668064777412df0a6a3c20d74d579b33794b4b00525b9f151c06eac9b" + }, + { + "path": "crates/oa-core/tests/process_diagnostics.rs", + "bytes": 1104, + "sha256": "1dbbc590239ef7542be4a2bdc9543aaa64d108417b03dd312a0894e364745906" + }, + { + "path": "crates/oa-core/tests/r3_constructor_ack.rs", + "bytes": 24163, + "sha256": "e5c44676ea0aab97f2e091ddac2f4bc4a4a90f5877f7bbf08b61229600944dd0" + }, + { + "path": "crates/oa-core/tests/r3_migration.rs", + "bytes": 6590, + "sha256": "ebd04120f5215b3956fdc79ee78f6e38734c7d13392f1fc28aaba957912265bd" + }, + { + "path": "crates/oa-core/tests/r3_semantic.rs", + "bytes": 77473, + "sha256": "49c3763eaf2131070a7c46cc23a84f917d292d41610b6404510e5607f8890c32" + }, + { + "path": "crates/oa-core/tests/r3_source.rs", + "bytes": 15311, + "sha256": "f31f60659df3c7ef601650d1cff140589d8729f01a3f65a4a6a6c2272f15c408" + }, + { + "path": "crates/oa-core/tests/r6_data.rs", + "bytes": 41437, + "sha256": "5f7ffb3bc73c3c85423623fe56f8680646dc97040327bdbead9d47a37e80f155" + }, + { + "path": "crates/oa-core/tests/r6_migration.rs", + "bytes": 9174, + "sha256": "81519bc1512f5e069432e9a1cdad04c10216d492df01b4b75b02102480ebd6a1" + }, + { + "path": "crates/oa-core/tests/r6_source.rs", + "bytes": 9519, + "sha256": "88a0aa087a7678e2898ff6057538072ca92072190712f05fff08372cc56ebed6" + }, + { + "path": "crates/oa-core/tests/release1_teaching.rs", + "bytes": 10010, + "sha256": "be179290d871125dc97cfd2a3067c7ac89c8a538fdb0afafc5b825bcdfb2bef2" + }, + { + "path": "crates/oa-core/tests/release_capabilities.rs", + "bytes": 19422, + "sha256": "b92cba2a562e78287ddd7dc3e94557848d17faa0c8a102601b50286b9af48a30" + }, + { + "path": "crates/oa-core/tests/release_diagrams.rs", + "bytes": 7689, + "sha256": "cefcc0582d91266d5de6ee5daefcfe41b606ab971ab235b59034a8e1dbc24b7d" + }, + { + "path": "crates/oa-core/tests/release_language_limits.rs", + "bytes": 5204, + "sha256": "8578da4f76bbd2d0e1bfe295ab1259e2162a3fe3d0d2ba8901915d7a40942806" + }, + { + "path": "crates/oa-core/tests/release_ports.rs", + "bytes": 32740, + "sha256": "506e62beab0c7ec0cece83e9e0c1a810fa1f99285c9e1cab0c77f06de55a40e1" + }, + { + "path": "crates/oa-core/tests/release_routing.rs", + "bytes": 23165, + "sha256": "ae168faaba23769b7ca1fd65f217b9db671726e67276eb5a04e5e72b1447a462" + }, + { + "path": "crates/oa-core/tests/release_scenarios.rs", + "bytes": 41067, + "sha256": "0f5d876badeec653fc7b12610a77d867e9a53582e605253deff8d379da21572f" + }, + { + "path": "crates/oa-core/tests/release_states.rs", + "bytes": 26873, + "sha256": "b1a26acee95eaba7f9920f9da738a1e33606552eb078e6d298895daff7e3d811" + }, + { + "path": "crates/oa-core/tests/release_topology.rs", + "bytes": 17643, + "sha256": "c51dbe5aa5a038f9ed830daa02aa67714472179eb7fd6da5ce36dc6931c8b3a9" + }, + { + "path": "crates/oa-core/tests/review_regressions.rs", + "bytes": 21823, + "sha256": "f154e5c88d35e31512e2b07733a1327ea3e2fcfd1ef8eb23066a4e9573f387c1" + }, + { + "path": "crates/oa-core/tests/route_source.rs", + "bytes": 7270, + "sha256": "1a73fdbac0d0ae0e84d8d67b6ad398e11223958f5dca007f73757c91827decfb" + }, + { + "path": "crates/oa-core/tests/routing_geometry.rs", + "bytes": 31890, + "sha256": "2d8eea4a2bba535ed0ea6daabccdaf87b375828c404baa10518c7bd7fd6253d3" + }, + { + "path": "crates/oa-core/tests/routing_labels.rs", + "bytes": 5530, + "sha256": "dff884d799c3c5c9257210248c55767e294e3cb317c605cbd0ddc9600c216eb6" + }, + { + "path": "crates/oa-core/tests/semantic_artifact_absence_oracle.rs", + "bytes": 4640, + "sha256": "d93eaf9667f4221232168bef0fe9f069e5be1b1f23410bda5dd67010b96e5c8a" + }, + { + "path": "crates/oa-core/tests/semantic_attachments_gui_oracle.rs", + "bytes": 14957, + "sha256": "7f526d363ba05e7ac89faf0fead0796e419c34ee204edf44a1b46c78308b0970" + }, + { + "path": "crates/oa-core/tests/source6_view_contract.rs", + "bytes": 14307, + "sha256": "fa566de53946d40bbbd9033edfeed177180c4dc44afa2f2f4667ffdc622eb3bb" + }, + { + "path": "crates/oa-core/tests/source7_contract.rs", + "bytes": 43262, + "sha256": "cad4f1a135ddbd947bdf3c71d1b44f1e438725095ea8c4d893464bc721c2363f" + }, + { + "path": "crates/oa-core/tests/source_files.rs", + "bytes": 13168, + "sha256": "f0429a0b89a443458ea9af7083c1e4e7411417a7e6b47e618bfbb9266dc164f9" + }, + { + "path": "crates/oa-core/tests/source_identity_updates.rs", + "bytes": 5139, + "sha256": "f52aa38b4d317e532c641ad7463472e4b40e802e60052cf0017556ffc63da06c" + }, + { + "path": "crates/oa-core/tests/source_nested_updates.rs", + "bytes": 16892, + "sha256": "9ac3390936c0d250651ea94a1b8faf0adfb680f061ececc56f2a52909b5ba855" + }, + { + "path": "crates/oa-core/tests/source_project.rs", + "bytes": 45910, + "sha256": "cef58adb16aa4d2527ddc0628aec3e26f0b42b4be70014a7e360fafdac13a942" + }, + { + "path": "crates/oa-core/tests/state_diagrams.rs", + "bytes": 23973, + "sha256": "6b02b387a3ae559cb3ad72de24292a5abcb76aaac0adbab5d2aa5211b22cd2e5" + }, + { + "path": "crates/oa-core/tests/workflows.rs", + "bytes": 33426, + "sha256": "bd843dfddbd5724ec08f657571f887496203056fe2fa5864ef50a168a613b89b" + }, + { + "path": "crates/oa-desktop/Cargo.toml", + "bytes": 842, + "sha256": "f3547b2b924d5db6706c0a8e069014b440ff65315d82fc8aced0360af4b3cdc9" + }, + { + "path": "crates/oa-desktop/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-desktop/src/app.rs", + "bytes": 214840, + "sha256": "411007f8c192e0fc581f3c6bcfc49ab46b900a841ee20ae96203d4db64c9280f" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring.rs", + "bytes": 27835, + "sha256": "37c7db33e99dd4adcc5a51f09ee4878af94fd32413359890a541690080885f65" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/palette.rs", + "bytes": 8887, + "sha256": "8f9937cb30b48b83759fd084a8a5990a2daa3920280f1210abe048560241985a" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring/tests.rs", + "bytes": 14732, + "sha256": "ed864839940a1910c97537b6ee151b57ab115ece6f60bae602552b84f9af4a5d" + }, + { + "path": "crates/oa-desktop/src/app/architecture_authoring_tests.rs", + "bytes": 18599, + "sha256": "77eb1a0038d038b989f7ac568760e16fe23c4b8d73cd9fbe32b70817ea23cfec" + }, + { + "path": "crates/oa-desktop/src/app/behavior_lifecycle_tests.rs", + "bytes": 13669, + "sha256": "1af2e290aa259a6af6b0585950cda93fe3a562c7b8be1e938fe1d80747b11808" + }, + { + "path": "crates/oa-desktop/src/app/checkpoints.rs", + "bytes": 29576, + "sha256": "55e5babdcabef767af3bc8be9cc3153b3f5cc0695701b890820ec0225643852e" + }, + { + "path": "crates/oa-desktop/src/app/diagram_selection_tests.rs", + "bytes": 5582, + "sha256": "4fa507adbc23db3a6eb202d809c695ec0ebd6181356930c4fa7528a9a0c7be57" + }, + { + "path": "crates/oa-desktop/src/app/hosted.rs", + "bytes": 25905, + "sha256": "14e2fcd79558ff56d000571f1f576e5601818d702783634aa4017000d382c62a" + }, + { + "path": "crates/oa-desktop/src/app/hosted/tests.rs", + "bytes": 30344, + "sha256": "fa118f64d04b400ccc01e4e67adaf3541975288882afa265a9e7f092cdbda232" + }, + { + "path": "crates/oa-desktop/src/app/process_canvas.rs", + "bytes": 28640, + "sha256": "11e991afbce187ae633e01214b2509a13623c940f1f5e6416aaee204158bc5a4" + }, + { + "path": "crates/oa-desktop/src/app/review_navigation_tests.rs", + "bytes": 7049, + "sha256": "5ebba36092cc89fcba394578e69c9507ad5a369e9a26526761716b5d4ee3ad75" + }, + { + "path": "crates/oa-desktop/src/app/save_as_tests.rs", + "bytes": 4113, + "sha256": "f8b915793f1a36fd152569c4781a4bdc17f4af404a8ceb373330053413087a1c" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols.rs", + "bytes": 18627, + "sha256": "99370865b548b28f32f4c6ce7e9f8eeaa0c80268a644f2ebcc4bd1e11695e59c" + }, + { + "path": "crates/oa-desktop/src/app/source_symbols/tests.rs", + "bytes": 57781, + "sha256": "33292a7ce9b61dbc134f74372caa93af9704e2f968cd698da13ea6a1b8cf3ea6" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram.rs", + "bytes": 9979, + "sha256": "f7fd50cc9a86adb794713958348af63afc7c698f74965e13188b7b8a9e735c55" + }, + { + "path": "crates/oa-desktop/src/app/state_diagram_tests.rs", + "bytes": 39957, + "sha256": "612e414b1a2cab12cbfd8fce23745559ff27577700694d53af67ad1f2883ee2c" + }, + { + "path": "crates/oa-desktop/src/app/transition_context_tests.rs", + "bytes": 11508, + "sha256": "47002fb025f3a2f8c53871f9509bfe8611a61db6fb0e1b3125eb6e875425cb1d" + }, + { + "path": "crates/oa-desktop/src/app/view_copy_tests.rs", + "bytes": 7846, + "sha256": "296821c51dcde568e7d717039aa26bfc1b56a9074aa16051007bb351b33a4d44" + }, + { + "path": "crates/oa-desktop/src/behavior.rs", + "bytes": 131449, + "sha256": "c9e0aea6a24cc982d0d82ee2b9b66f250cdfac037b36bf6b1b9d7dd38246cd3c" + }, + { + "path": "crates/oa-desktop/src/behavior/contextual_source_tests.rs", + "bytes": 49386, + "sha256": "5f05318a6533503b9d6febf1ec4dd7256f192394bc1b952a7904c8175bd8ddae" + }, + { + "path": "crates/oa-desktop/src/behavior/creation.rs", + "bytes": 30053, + "sha256": "0fb19be3a5688c4bd3ca3643c47a97da7e7f85add8a860cd046a0d9cb3ce9dfc" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/app_tests.rs", + "bytes": 13181, + "sha256": "e9c5bf2b07357b7a2f679ae0d8f6904c1c1461aaeb94fa0db478b54d4641ae3e" + }, + { + "path": "crates/oa-desktop/src/behavior/creation/tests.rs", + "bytes": 22793, + "sha256": "a0d1daf9fb3920f7e6181a9802d84fbe056cbf0043b9e41dba5fdda687d9818a" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario.rs", + "bytes": 149092, + "sha256": "d12a4b1caa61c08f69c4d2a64bd15568c4b7158dea91aac5a52a58a35adb863c" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace.rs", + "bytes": 32785, + "sha256": "69c7ad32e4bdc39f42d2e6c7764cfe1fa7867cd7dbcf9b904dec805e6c912666" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario/workspace/tests.rs", + "bytes": 35390, + "sha256": "abfc7caefb0de5bd479eb4af1b159ca77b68e6a157f477939628c3d5c90b44b6" + }, + { + "path": "crates/oa-desktop/src/behavior/scenario_operation_tests.rs", + "bytes": 10087, + "sha256": "89fb71c690e07eac314f7a5e05862d5c1e2f9c21039673bf22c4ac894d21c977" + }, + { + "path": "crates/oa-desktop/src/behavior/source_draft.rs", + "bytes": 39485, + "sha256": "85d543cc288e48b4c13001e4e386b5b54d9b1e349a5ac31e4e307572f2d8fb3c" + }, + { + "path": "crates/oa-desktop/src/behavior/state_canvas.rs", + "bytes": 93561, + "sha256": "2e2ad57b86f4cc1cc0c4c4c230571ef19bcc2f052001a8bdcc44925e5103077a" + }, + { + "path": "crates/oa-desktop/src/behavior/state_edit.rs", + "bytes": 35736, + "sha256": "cb2289e727163626152fc2f11195c6ee824851cb9442c57496da97fe7aebfb7c" + }, + { + "path": "crates/oa-desktop/src/behavior/state_menu.rs", + "bytes": 7447, + "sha256": "cc87c5caa177e114e4d9a7f7367e37ec2b0d1e1c16b0b99709b05ea0e59cf894" + }, + { + "path": "crates/oa-desktop/src/behavior/state_view.rs", + "bytes": 6988, + "sha256": "1eb892a9139ecb0671784c879ee5114f27e598e5b3589f5cdad0abffd5909f24" + }, + { + "path": "crates/oa-desktop/src/behavior/states.rs", + "bytes": 26986, + "sha256": "8986ed9492960e20f1254e9dfe3ff91d79ce9fef66f3bda738f9933278043954" + }, + { + "path": "crates/oa-desktop/src/behavior/topology.rs", + "bytes": 83845, + "sha256": "d06b2f0fc39b4814e94200297e148f1d4d97e04cb167766030ac9df18689e3b0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual.rs", + "bytes": 29107, + "sha256": "edc84fc69d8d4a8f4ce81a4452c4e2e35cfaf98addeed10235f392506c74e8b0" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/contextual_routing.rs", + "bytes": 16731, + "sha256": "d914b0e82aa8d253fe64be2ef74443d1fd2e6cec26d1cf30620a57646e1d426c" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct.rs", + "bytes": 32036, + "sha256": "413aa2009ee4cba0941836b43e41f16a04c8fc8568b6e92db5bb08516e95c287" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/direct_tests.rs", + "bytes": 54304, + "sha256": "ac8c8023117e31723084adb06e3ca7fd4ea3f95ad229622ccc759fa19b50c27e" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/layout_tests.rs", + "bytes": 14815, + "sha256": "4529ac8b05de769a2ada112473146fbfa27b0467d97d3541b86c4446b6050b83" + }, + { + "path": "crates/oa-desktop/src/behavior/topology/view.rs", + "bytes": 29176, + "sha256": "a7d806cd621bdf857c4e4861685cd3eb556b320de3985b9cc3d9d131dad370dc" + }, + { + "path": "crates/oa-desktop/src/connection_edit.rs", + "bytes": 5301, + "sha256": "020581e077f82b43c936b623cc51733b02b88428df4e5f25df74b9705819fa37" + }, + { + "path": "crates/oa-desktop/src/connection_tool.rs", + "bytes": 27023, + "sha256": "649da93677d52dae495b0e19bc32f3122ab05a6d84de8402578ff5ce3f6ee1d3" + }, + { + "path": "crates/oa-desktop/src/context_menu.rs", + "bytes": 52955, + "sha256": "629354b34dc232763700251f2695b4d4e53d6251c0b1432ecc0dfe424f7dfeac" + }, + { + "path": "crates/oa-desktop/src/data_values.rs", + "bytes": 23877, + "sha256": "e1deb1cad551f0a9fdef9653aad257cfb36e6d9c0f93b6245061ec3fab8fd365" + }, + { + "path": "crates/oa-desktop/src/data_view.rs", + "bytes": 38871, + "sha256": "158b852be5d3db450aa5cda8b68a35bd96bddce1d8d053a7a23582095c06362d" + }, + { + "path": "crates/oa-desktop/src/diagram.rs", + "bytes": 105256, + "sha256": "4580b170e264d14e5cfa874709f6d2e076a05155bfbe1809336a9d05f75e98ef" + }, + { + "path": "crates/oa-desktop/src/diagram/lifecycle_tests.rs", + "bytes": 9316, + "sha256": "d0e72cc0574657d5a31c3ce307b58401d0ed77eedccd1aa02377f55ab0bc03f0" + }, + { + "path": "crates/oa-desktop/src/diagram/pointer_tests.rs", + "bytes": 11833, + "sha256": "10ca5049034159205ac8f22805354f308b0ba0596f331568c26cd1393bc8cedc" + }, + { + "path": "crates/oa-desktop/src/diagram/port_hit_tests.rs", + "bytes": 5624, + "sha256": "d2d0647629bf725b4dddfc211f5a27d495ed093a79af87cdae6c196f09a97b93" + }, + { + "path": "crates/oa-desktop/src/diagram/port_labels.rs", + "bytes": 13408, + "sha256": "28782983b82e4fca5dd4410ac8bd562359943b7010c7b24ecc42f0c7ad7fb63e" + }, + { + "path": "crates/oa-desktop/src/diagram/view_options_tests.rs", + "bytes": 2815, + "sha256": "cf0c98a7715558baf17b59f67a80556f98ad30262b4434635e617c6601775433" + }, + { + "path": "crates/oa-desktop/src/document.rs", + "bytes": 31080, + "sha256": "2ecc2cd496d4a83fd7a32b9dc68e49f0f1cb31a06263dfd6939b4764da5b73e2" + }, + { + "path": "crates/oa-desktop/src/document_save_as_tests.rs", + "bytes": 5781, + "sha256": "83dc243a25f4e97674ff0d86c794a490cc923e98f1f9fb05bb038f622f11e20b" + }, + { + "path": "crates/oa-desktop/src/explorer.rs", + "bytes": 14764, + "sha256": "fa01c59219564ba9ae5553abc2b6f94e9849f9148d5812ef99b40318fe5dcf9a" + }, + { + "path": "crates/oa-desktop/src/explorer_view.rs", + "bytes": 13773, + "sha256": "a720d7484bcc3a24729332a00e005d1cc6f5f945a9cc3965134e0024dffb581f" + }, + { + "path": "crates/oa-desktop/src/forms.rs", + "bytes": 106002, + "sha256": "e5c0805b93daf0e8244d4be32e5a0dd3a1856c281a9d9fb5f98497dcc43c4da2" + }, + { + "path": "crates/oa-desktop/src/forms/context_fields.rs", + "bytes": 10831, + "sha256": "eaacd474f6500dd344d5a8b63ccb1d1dd86fe2aea78ab708afa8a80d62ce69bf" + }, + { + "path": "crates/oa-desktop/src/forms/data_fields.rs", + "bytes": 49285, + "sha256": "f56397886d74086d69783f18fab961e13b0af05a8bb0d10d0dfa187cdad05f5c" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields.rs", + "bytes": 27414, + "sha256": "e7100474cde18bdfe95562bcb3c055f29b4b15aa64788a578194464aebcd046e" + }, + { + "path": "crates/oa-desktop/src/forms/history_fields/tests.rs", + "bytes": 33950, + "sha256": "16d3c308138c063f45986d53c621ad83c7dc2ce853edd31b7204e2939a382df9" + }, + { + "path": "crates/oa-desktop/src/forms/port_fields.rs", + "bytes": 30554, + "sha256": "3fe684d651d5be6203fd9db3979c772913e1af5ac1514e67be386ffd88dc8127" + }, + { + "path": "crates/oa-desktop/src/forms/view_fields.rs", + "bytes": 24987, + "sha256": "5184d438f0dfd4e29f284ff048e19da73e71be1f24a6e9f123c7e922aecb85fa" + }, + { + "path": "crates/oa-desktop/src/guide.rs", + "bytes": 115874, + "sha256": "64c782afebecad5489d3bf06b41f3273904222c18e3244990f2749c991c92b55" + }, + { + "path": "crates/oa-desktop/src/highlight.rs", + "bytes": 2751, + "sha256": "da7c254fff7052e5fd9ec7469f473b91a819406028d7c304f6e22c4169561600" + }, + { + "path": "crates/oa-desktop/src/home.rs", + "bytes": 17587, + "sha256": "f03c1071334894f586a5a7c86026602a694db3c2faf902822e1dbe5156a859c2" + }, + { + "path": "crates/oa-desktop/src/home/tests.rs", + "bytes": 8167, + "sha256": "3b03ccfc97dfb75954e1e0ed568bb87a632295c07b96cedc05ed381f87b378f3" + }, + { + "path": "crates/oa-desktop/src/hosted/client.rs", + "bytes": 21912, + "sha256": "54b24b4b50f8d87d7c92946ea5a2cff4c98760e70555b3ce3d90be27115e95d4" + }, + { + "path": "crates/oa-desktop/src/hosted/client_tests.rs", + "bytes": 23009, + "sha256": "3ef70907ca75e098d631c41b90badd4cff1e1eb1b3c78e15a9f811c13ba8ffbe" + }, + { + "path": "crates/oa-desktop/src/hosted/mod.rs", + "bytes": 3744, + "sha256": "1b75e11c80fcb38fd20bb3487e3f88729fdac73e471c5ae64da28c249f77c63b" + }, + { + "path": "crates/oa-desktop/src/hosted/view.rs", + "bytes": 9281, + "sha256": "fc0c7b7ce3a5f05c49713df6661067751f81e810af11c614ca265ea9490e6463" + }, + { + "path": "crates/oa-desktop/src/main.rs", + "bytes": 1511, + "sha256": "cb0a919fd0df0924591283da5b55d64d525d8461640441509350be840235e51a" + }, + { + "path": "crates/oa-desktop/src/model_menu.rs", + "bytes": 34680, + "sha256": "12994a5433a91f8295a59d4bf40f35f1edb8d8dbb497a11eae8760299627f1d4" + }, + { + "path": "crates/oa-desktop/src/navigation.rs", + "bytes": 8839, + "sha256": "71355a12e1b4791106426d83fe5ebf0b29bce8e1dc594f0655ab85695469669e" + }, + { + "path": "crates/oa-desktop/src/port_edit.rs", + "bytes": 7809, + "sha256": "70b99f577c4fdeda8780c8dc1ee7b1639fd77aaca06658f06d725139fb3efb6d" + }, + { + "path": "crates/oa-desktop/src/port_preview.rs", + "bytes": 35855, + "sha256": "069487c4ece737d52e8ae4a84dcfb132236aca6799e841c91c8e7244320cf871" + }, + { + "path": "crates/oa-desktop/src/port_workflow.rs", + "bytes": 40582, + "sha256": "ccc15f97c3272145a67bb5857b4faeaf7437561bd61912fa27ab26e8824146a0" + }, + { + "path": "crates/oa-desktop/src/recovery.rs", + "bytes": 21041, + "sha256": "57e22e5fbb0e994e64ae03e69450271fe9f04a951db1670c2a018abe99db4489" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/README.md", + "bytes": 1587, + "sha256": "a90002df1e087d2dac7be26926864243568a0de7c4103e4927435b34178e8016" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/profiles.json", + "bytes": 473, + "sha256": "2c12ae96b50e6da5d60ce2b7fa00204be71dfbe2fd51311fc337a0de6a4332ff" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-bundle.json", + "bytes": 80974, + "sha256": "12715995e6f7f35414aea53b3ad720b9b31873ffdeaf4444231db1a5ac3c463e" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source5-model.json", + "bytes": 86191, + "sha256": "5535a706df9ec21715e8b6a5aa6dbd79636ae461450aee61305559016167612b" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-bundle.json", + "bytes": 85286, + "sha256": "ea88890a33f47d67dfb06d6dbbcc179058cf28dad76ae7d615c00aaf30dbbbfe" + }, + { + "path": "crates/oa-desktop/src/recovery/fixtures/source6-model.json", + "bytes": 90629, + "sha256": "5bb8db0b6394276666323483f977ac3586f88554c81a148c6d508fca0ef4576f" + }, + { + "path": "crates/oa-desktop/src/recovery/source5.rs", + "bytes": 6956, + "sha256": "0f0a763f0c98c2c908d4c2b95d8a4c042b6a255ee1cc16260e5404669691f642" + }, + { + "path": "crates/oa-desktop/src/recovery/source5_tests.rs", + "bytes": 12146, + "sha256": "cfd17a742f1f27b523fce7cd9309f0a07a30413395f6c58659fb91d02834a7a3" + }, + { + "path": "crates/oa-desktop/src/recovery/source7_tests.rs", + "bytes": 18213, + "sha256": "7ee61de66c75bf949489ba51ddc9677e2b4efc68801cf27909c9b894bfdc9288" + }, + { + "path": "crates/oa-desktop/src/route_edit.rs", + "bytes": 2941, + "sha256": "457ae59c2761a43a8620b4d336a7cf0f54b965997110ecaf968756a88b6b0374" + }, + { + "path": "crates/oa-desktop/src/semantic_review.rs", + "bytes": 3240, + "sha256": "916192003637b60c12f6b3b3663a5b9c770ae4d10d51a415f6b3e4035e30fe13" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts.rs", + "bytes": 24201, + "sha256": "a79236a8150597ff808597e59cf4f1e9e61c74c4901d9c8cf42d3427bb52a9a8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_recovery_falsifier_tests.rs", + "bytes": 11034, + "sha256": "3f255d04e4bffa5a467b75e3cbf6f7149aa3269a02f2a89fbaa1db0e5df9ae62" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_tests.rs", + "bytes": 20798, + "sha256": "04d0dd2ac453705185663f705282aa4a3a31433466a5be305764248da1a03c32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/artifacts_view.rs", + "bytes": 6594, + "sha256": "e8ce3d844d6230c20fe2fda4d0fb256af8043f9b586160a8d110665c45a79561" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments.rs", + "bytes": 18160, + "sha256": "de0ec0c740895b160ff5b847332c087c3f1a48931583464069470cc61315ed59" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_tests.rs", + "bytes": 29389, + "sha256": "8b26be0324e0f33b1e7cf7af340350df8ed98963002d6da8589ee0e6f6900bea" + }, + { + "path": "crates/oa-desktop/src/semantic_review/attachments_view.rs", + "bytes": 3111, + "sha256": "cd8c4418b43d207fcc55a82a2364cd84053643e5c09c96de008c94b8372653fa" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch.rs", + "bytes": 31771, + "sha256": "44830e1a9fa572493d423545336f76e79fa24ef29900e4f7927cbc83f9071d17" + }, + { + "path": "crates/oa-desktop/src/semantic_review/batch_tests.rs", + "bytes": 27546, + "sha256": "2a8131b81322e6a49b1348c6efec4526a3df53c8eefc0a2b25c746e2b7c6ead8" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose.rs", + "bytes": 27155, + "sha256": "c6adcc9882dde65e9f04f6eda7f0c855c5cbb285cf421123029169112793ce9b" + }, + { + "path": "crates/oa-desktop/src/semantic_review/compose_diagnostic_tests.rs", + "bytes": 9809, + "sha256": "440daf8d43278ef981c620d1818d0daaed8fb83193b8e8ff67b2e42fbf882938" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructor_tests.rs", + "bytes": 54132, + "sha256": "85149521ad7df62918f6f2fab6da2b3346c342ab4bce7100de3f6206c1e81096" + }, + { + "path": "crates/oa-desktop/src/semantic_review/constructors.rs", + "bytes": 12258, + "sha256": "0982163439b06a42d9af1643530364109282e63f05b323a35a76d8241f3caa32" + }, + { + "path": "crates/oa-desktop/src/semantic_review/history.rs", + "bytes": 3211, + "sha256": "df038c2464eab8093a983f3104f0d04ca8f602010a50e1d3eeb8e53f2309e201" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed.rs", + "bytes": 14525, + "sha256": "f8db8578ecff84526bda96c233b50e56f1cf1c5b8ab04cbbaa04f9b5e78300f0" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows.rs", + "bytes": 13567, + "sha256": "af9b137fe56ff3a71378e9998bfbb7b68f035bd542aa6fa90b83e04796cf4b38" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_rows_tests.rs", + "bytes": 30804, + "sha256": "1a3b09e7ed100411cdf8043f9a78defc664a873ee0201117709185c201a5c57f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/keyed_tests.rs", + "bytes": 31955, + "sha256": "112a2d50130407a4a1069827e4e5d5a8681e672dd3e54b559c6d3dde4302a298" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind.rs", + "bytes": 789, + "sha256": "4ed19952ea511d1b3226564a138e3322f994371d6b49794c14bc3689d1393e7f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/message_kind_tests.rs", + "bytes": 23424, + "sha256": "5fcf9930e949aebeb12eab0327264f32a2388d62dbf098bd2365711e22623c52" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered.rs", + "bytes": 9959, + "sha256": "8b809e8b0958e553896829b655684084bf2f0ca7df9d40c6acbdad8749cd6342" + }, + { + "path": "crates/oa-desktop/src/semantic_review/ordered_tests.rs", + "bytes": 22383, + "sha256": "5c8ea3a69e3da3b94d13f50f12aa7dc53246ccba25ffcace9552a0eb76b0bf36" + }, + { + "path": "crates/oa-desktop/src/semantic_review/recovery.rs", + "bytes": 28769, + "sha256": "88e69044d90c481593bab7cc125f0401c05202fccdde07698cec9483947fe8be" + }, + { + "path": "crates/oa-desktop/src/semantic_review/row.rs", + "bytes": 36972, + "sha256": "ecde54540071fde82d8d580d0da2fccd16d6b8e0144bd5e129afe91455f73bb1" + }, + { + "path": "crates/oa-desktop/src/semantic_review/scalar.rs", + "bytes": 15153, + "sha256": "9ad202174934dd9a63fbf9cba43135aead571db60846c8b7b1d3019a11df26c2" + }, + { + "path": "crates/oa-desktop/src/semantic_review/source7_tests.rs", + "bytes": 11665, + "sha256": "5e8221d77b068fa30c1571988448cb8829711735881d810f3d333cbc95d34a9f" + }, + { + "path": "crates/oa-desktop/src/semantic_review/tests.rs", + "bytes": 32480, + "sha256": "8839e241cf81d1e66abe072728eee1870b42341fbbefae9f39bda1b1a020f4ba" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view.rs", + "bytes": 57336, + "sha256": "c391814442cd5e95040c6dab9d511a254181de56c68d5c266d879870001561ad" + }, + { + "path": "crates/oa-desktop/src/semantic_review/view_reserved_artifact_tests.rs", + "bytes": 4737, + "sha256": "6c766b29c8664d15cb113d2cc71bba9b60ae4ccf7e44c9c5d3c41e1dc4b7ed90" + }, + { + "path": "crates/oa-desktop/src/source_navigation.rs", + "bytes": 4030, + "sha256": "3f7007bc3b3ef6266e92ea4121cfbdb32df2e97713797b403ce6649070a90517" + }, + { + "path": "crates/oa-desktop/src/source_navigation/controller.rs", + "bytes": 3374, + "sha256": "4ec54ce769f047d6e5c1de6bdbe81648ad63c75cfd04aea5356bd5663126d77c" + }, + { + "path": "crates/oa-desktop/src/source_navigation/interaction.rs", + "bytes": 8808, + "sha256": "c6efa6105b8ba46655e27a89b9fa59e6fc01a4c6f331f886e035af1e70cbf8a9" + }, + { + "path": "crates/oa-desktop/src/source_navigation/interaction/tests.rs", + "bytes": 6616, + "sha256": "6cf5c5944b9c46c275c9039f7166b627fa9176187b39348152f67040c92c95e1" + }, + { + "path": "crates/oa-desktop/src/source_navigation/query.rs", + "bytes": 35200, + "sha256": "aa8e8e9d446b57c30520c4b3ca1ae9fe524cecb2f4f4f4b229d930ea0377ecca" + }, + { + "path": "crates/oa-desktop/src/source_navigation/query_tests.rs", + "bytes": 29720, + "sha256": "a4ecc95a49d0a9325cbf1548cf95a8d367f758f8eb1f44346a2b71ef046f6668" + }, + { + "path": "crates/oa-desktop/src/source_navigation/symbols.rs", + "bytes": 68862, + "sha256": "d6c9325223fb3f18e887a63187b67aa59735d4e51f501c9e27ebb870944912ec" + }, + { + "path": "crates/oa-desktop/src/source_tree.rs", + "bytes": 21816, + "sha256": "4d55e0110a1eb128a5d26c28f3aae5853d79b7245812b7c82bd275f38440a5aa" + }, + { + "path": "crates/oa-desktop/src/source_workspace.rs", + "bytes": 24090, + "sha256": "388c71f63829c0c76526a1700ebf5f240c86c467a65aae4fca4cd6c6a88c468b" + }, + { + "path": "crates/oa-desktop/src/style.rs", + "bytes": 3015, + "sha256": "05d61bec16141612ccafa0988e8c4827f41754509efdb3b961eab69127ded896" + }, + { + "path": "crates/oa-desktop/src/tests.rs", + "bytes": 58663, + "sha256": "94e340b8ef7f9a3bb71fd2a2098dbb9c3d2bb3adba25b5949430b714e36fdfe1" + }, + { + "path": "crates/oa-desktop/src/view_copy.rs", + "bytes": 9043, + "sha256": "5630f31c942e1226aafd67eabdace6a5c5494875bdc6f7f077019e8110ba41a9" + }, + { + "path": "crates/oa-desktop/src/views.rs", + "bytes": 67434, + "sha256": "e5ed7640fbd2653983c418b88fd2e3612b91f8f02fa2f50f1b5dfd31aab773b2" + }, + { + "path": "crates/oa-desktop/src/views/source_symbols.rs", + "bytes": 8819, + "sha256": "9cd536072e110803b6a592bcbcd595b6f9eb32fc1d0b4c9de741247c459abbe5" + }, + { + "path": "crates/oa-desktop/src/views/traceability.rs", + "bytes": 7501, + "sha256": "4c89dcf35c25e737d8cce4d543a5989ca104a5678e6cf40df47e457773d2ef94" + }, + { + "path": "crates/oa-desktop/src/workflow.rs", + "bytes": 82829, + "sha256": "a00ba19d6d23435d18c9e1f6a0ad2065f889bcfa97aa3840bcdfaa03cb2666aa" + }, + { + "path": "crates/oa-desktop/src/workflow/communication.rs", + "bytes": 11084, + "sha256": "34d121ad97706012722e4bb6210072ecc3a5b4718b0ceab0c3d0f14d4cd780a1" + }, + { + "path": "crates/oa-desktop/src/workflow/recovery.rs", + "bytes": 9859, + "sha256": "0849b0f34dba5e8761be5fa05784d134ac74e4e9db395d6b9b7d6cff71e3f3dc" + }, + { + "path": "crates/oa-desktop/src/workflow/transition_tests.rs", + "bytes": 8553, + "sha256": "589b1b2dbadca74a52c2cfcfd4fe620bd4790abd113ac02182e91616c52d793c" + }, + { + "path": "crates/oa-server/Cargo.toml", + "bytes": 778, + "sha256": "527ff5e15010a8b560a6659aa1ae4bf0c8df0d9e019f03c47529ec6a750c0982" + }, + { + "path": "crates/oa-server/build.rs", + "bytes": 45, + "sha256": "ab1be6ae1fd8bf3ebaeef6348347a9d5e666bde693126f199e041659e0b094a9" + }, + { + "path": "crates/oa-server/src/error.rs", + "bytes": 5610, + "sha256": "93817f1502386e4662c96ee1c7d1c4afc4e33bda6fd64e46c86c8e1afd5a9368" + }, + { + "path": "crates/oa-server/src/lib.rs", + "bytes": 7743, + "sha256": "20bef350350ed6339588b23af684abf745f97916c7edf3853ee042abe687e664" + }, + { + "path": "crates/oa-server/src/main.rs", + "bytes": 4163, + "sha256": "d59a6a2b5c7034bd2e00a516d2d49abb16391bf0316c1c357ddafb9c82d2d1e3" + }, + { + "path": "crates/oa-server/src/preparation_http_tests.rs", + "bytes": 5523, + "sha256": "454b90d0055d35644c8d990cd7576ddf675a9b271ca07fe9b0efce25d8ddbc07" + }, + { + "path": "crates/oa-server/src/routes.rs", + "bytes": 46053, + "sha256": "3f9a0c22043dbf28f7a8e587d2fc3abf869f76f4d23a46fe0aeb9c4392454a4b" + }, + { + "path": "crates/oa-server/src/store.rs", + "bytes": 25524, + "sha256": "37dcfb845b7993d5bced2bcf25fedfcd2a9c20a748f9315afe6cca1f41f89ae5" + }, + { + "path": "crates/oa-server/src/store_preparation_gate.rs", + "bytes": 4440, + "sha256": "427c390da3c0281ba1fe115a93ea90800e3b45fce6bcb9185e71982ddd885fec" + }, + { + "path": "crates/oa-server/tests/http.rs", + "bytes": 71892, + "sha256": "50daa6a90e96ad6fe3c6a27df2eaebe486270599c203892d09769c547a194975" + }, + { + "path": "crates/oa-server/tests/http/communication_limits.rs", + "bytes": 5790, + "sha256": "ba5474dd8e494a0176fffb4548c8e3deb2081b15de33bfce82394c764e0a2c16" + }, + { + "path": "crates/oa-server/tests/http/data_contracts.rs", + "bytes": 25949, + "sha256": "8cd456db83f301baca380acf025a5a99db4edf7d8839537dfbd02c4307e10e6b" + }, + { + "path": "crates/oa-server/tests/http/port_anchors.rs", + "bytes": 15086, + "sha256": "7199d0a208ddad9e1518b6e3fb390d64da111716d7505ba5c995deae19ad1258" + }, + { + "path": "crates/oa-server/tests/http/semantic_transitions.rs", + "bytes": 22832, + "sha256": "856d1c9b633ffb581e3e631f4e5a607789a02181dbf060667f208a569bfa4920" + }, + { + "path": "crates/oa-server/tests/http/source6_views.rs", + "bytes": 13023, + "sha256": "867bccda0e030eeeb9976b4ceeb47b21ab5044d700278022d5fb495bbb64ca07" + }, + { + "path": "crates/oa-server/tests/http/source7_contracts.rs", + "bytes": 11000, + "sha256": "0e0a467186da7263c0754890aff69ebd0d92d36b5224e4865bb6854b18dab7e8" + }, + { + "path": "crates/oa-server/tests/http/source_projects.rs", + "bytes": 30907, + "sha256": "8ff580f317ec267d1cd72ae14d8638f74a77cdf99ca4c78f66f4290c2d77460a" + }, + { + "path": "crates/oa-server/tests/semantic_http_contract.py", + "bytes": 7251, + "sha256": "4737ff94f10761f94151a694414c5c62737e0391ec820bca132830652bc4cca2" + }, + { + "path": "crates/oa-server/tests/semantic_schema.py", + "bytes": 25038, + "sha256": "70c9d267268bd390680f290a585bd4ae0c6d8ef999ee2f32ece6e172293574f7" + }, + { + "path": "crates/oa-server/tests/state_representation.rs", + "bytes": 12241, + "sha256": "6686c826f28248ae4b63ec3f2112e193d4a347724b87974483217fcfee49cd61" + }, + { + "path": "docs/acceptance.md", + "bytes": 3463, + "sha256": "32ed3e4fed63f5c464e0937221f401d71623b276dd70f083531ac6ccebbf9050" + }, + { + "path": "docs/api.html", + "bytes": 73861, + "sha256": "6f18cfc2a35eba631dbc61d04cd2721e0e361efff1699bf56d2c450a30a17a0d" + }, + { + "path": "docs/api.rst", + "bytes": 42711, + "sha256": "7eb258088824efa5ac94311b07b73eb46edcac3c300a2aac78d3802111e338c4" + }, + { + "path": "docs/architecture.md", + "bytes": 10974, + "sha256": "a50bd1645222ef3e574fa07a6ab9aa213431ee8833c6c0158ad91ce0f799543c" + }, + { + "path": "docs/language.html", + "bytes": 179377, + "sha256": "739a5bb100c7cb0ed70e18afd1e363029757f3cfd6580bc9c5cf77faccb46940" + }, + { + "path": "docs/language.rst", + "bytes": 131984, + "sha256": "894a1a77f97d1aa94c11762fe4e84b4d95e181a77c630324c16c307637ed27e1" + }, + { + "path": "docs/linux-packaging.md", + "bytes": 8671, + "sha256": "41a1bb1095801df37a1411341c5791d55ea8c365739314d599a60269ac4bc7a0" + }, + { + "path": "docs/openapi.json", + "bytes": 359757, + "sha256": "c6ae512f791a939eaf6ec5e5e78e9468bdee0e028092d00098bd90ad9498d967" + }, + { + "path": "docs/research-v2-architecture.md", + "bytes": 40445, + "sha256": "1b3809f2dabe6b1805dbf3d3f2625c471cd21356c7bd603916466a8c4ced8090" + }, + { + "path": "docs/research-v2-semantics.md", + "bytes": 31535, + "sha256": "b7ec3677300248926a88b84da3e7ffe52f5b73524c7712c927a0e951569db04f" + }, + { + "path": "docs/research-v2-service.md", + "bytes": 36209, + "sha256": "4828df5bc679e7c71f49b4b85c9e7dacbec52f46d416fed48af70e08886d4e4e" + }, + { + "path": "docs/research-v2-ui.md", + "bytes": 3245, + "sha256": "894e721b59a8ca85f0d95b6706ed5f130a0372def460cf33aeefc9e5e38cde0a" + }, + { + "path": "docs/scope.md", + "bytes": 16260, + "sha256": "58b88a7f0b1c8a79edf23c375a141d7b1b821bca4f3212a80e29db5ea3fba796" + }, + { + "path": "docs/server.md", + "bytes": 23361, + "sha256": "4eb24937d424ba8b384e1734e02a6f8e963ae11d2715889c92b14b39ff2e4a48" + }, + { + "path": "docs/source-cli.md", + "bytes": 3374, + "sha256": "34f12b72cc6d6ead4f47c7818c1897db592f8ad493c70776db2ab48c24d8f051" + }, + { + "path": "docs/v2-interface.md", + "bytes": 11807, + "sha256": "c7fbaf0ebd3fc9f6c11f818db2b0b9d68a33f580cfced22bde83ce08ae790bc7" + }, + { + "path": "docs/validation.md", + "bytes": 6505, + "sha256": "f46ea950ed1a54409aa07c4f9e90f39f8e2d00c1dd1b6cb805caa3993845967f" + }, + { + "path": "docs/windows-packaging.md", + "bytes": 10406, + "sha256": "2c852ff7041713ffbff3c951ac98df647c51fb70b0feba9000f7bfd5bc2703a8" + }, + { + "path": "examples/coastal-rescue.arcadia", + "bytes": 33107, + "sha256": "7e183ef9fd8154d3074303f1956cd0d9871c19e3ffc630d333b0bffbd6e30e17" + }, + { + "path": "examples/coastal-rescue.json", + "bytes": 49715, + "sha256": "242f0b031229a87af5c4ebe5d651defe59c191a6b7a69dc0a77f7e203411f195" + }, + { + "path": "examples/legacy-v1-coastal-rescue.arcadia", + "bytes": 3449, + "sha256": "4dbbbdf8bc7e6cb8e0a81dd678069dae585a9e5187c59bc3665e1fdab3f1a86a" + }, + { + "path": "examples/legacy-v1-coastal-rescue.oa.json", + "bytes": 5976, + "sha256": "fd0e9dedfb7adb922dc0575cc2b820d40344d639f1d8052bd70363aa59de9c24" + }, + { + "path": "examples/release1/README.md", + "bytes": 11137, + "sha256": "113cfb1cf38a98b51bff60442d86a35d636a3d80ef206bece7d53d0aae67f2d5" + }, + { + "path": "examples/release1/evidence/repair-check.md", + "bytes": 1419, + "sha256": "f4db17bdca4ecbb1bf0caef01b2da5f1f7f798ab3152b648ce6dd8696a6a68e5" + }, + { + "path": "examples/release1/expected-diagnostics.json", + "bytes": 288, + "sha256": "3700393d76b940cfc076bf52861bd7b1f43370f8eabce3594531bd0bf1fc851e" + }, + { + "path": "examples/release1/model.json", + "bytes": 134520, + "sha256": "ef0ef4006c3e09d5db6e1b621256b3f7d6642f3a7b09cc34607cfbcca830c727" + }, + { + "path": "examples/release1/model.rs", + "bytes": 28762, + "sha256": "15f30f6bde655808fe754665c26d560e36f2a9bad340f346b09137d0d05045f5" + }, + { + "path": "examples/release1/oa/activities/activity_oa_restore_work.arcadia", + "bytes": 1307, + "sha256": "83e73d0a013d5c3e1a4af0d9139ab0cfa362d25a846671fc2dac59181061a9d4" + }, + { + "path": "examples/release1/oa/behavior/process_oa_assessment_procedure.arcadia", + "bytes": 697, + "sha256": "172c32c044ef4b5bc58a1f4635cc81f48dabb4014479b47dce7b25fedf2dbd0d" + }, + { + "path": "examples/release1/oa/behavior/process_oa_field_procedure.arcadia", + "bytes": 1781, + "sha256": "d2552dc5383e2e91cb302a790364e197f663c2edc013a2ab1978789825c9c324" + }, + { + "path": "examples/release1/oa/behavior/process_oa_response.arcadia", + "bytes": 3225, + "sha256": "cf86f46fa5c5d70592ef43f1bc1cb4d968efd8add384ba88036bef6b88aa4abc" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_conversation.arcadia", + "bytes": 1795, + "sha256": "b25be524e98a35ebac5e4481b7609c027b32baf9605e8097f807560f94a77ca6" + }, + { + "path": "examples/release1/oa/behavior/scenario_oa_full_scenario.arcadia", + "bytes": 1261, + "sha256": "00a1edf2c9707a0eb62ac070c2d02467874f2c9c1f273cc6ddb53d6d65999a1c" + }, + { + "path": "examples/release1/oa/behavior/state_machine_oa_monitor.arcadia", + "bytes": 2022, + "sha256": "447c9ad1359f4a31ecf975ad07c0b08d8e7e03191fb0858e2fc56f377b223cd5" + }, + { + "path": "examples/release1/oa/capabilities.arcadia", + "bytes": 781, + "sha256": "fc8012e5554350b12e1cb80080f8feab80d933c9b33c0f2a7bb500cb7d609936" + }, + { + "path": "examples/release1/oa/model.arcadia", + "bytes": 661, + "sha256": "f7cf914766ea73ec53b85e32d117ea9a9dba52d3e038246863541ae7069b1a15" + }, + { + "path": "examples/release1/oa/participants.arcadia", + "bytes": 1834, + "sha256": "951764c14179f27c10e315acf2ea37d1fff54c77b8441e23addd239e8c715ce3" + }, + { + "path": "examples/release1/oa/types.arcadia", + "bytes": 788, + "sha256": "9d0396fb82dd5733edd8d1cf52f968ca84906927c704f9cf0944a7fae215cf49" + }, + { + "path": "examples/release1/project.arcadia", + "bytes": 1958, + "sha256": "b2674e6bf77cfe0f6f0ba79c81d2e96d92f39c02ca2c6266d80e91723bfb9fda" + }, + { + "path": "examples/release1/sa/behavior/process_sa_assessment_procedure.arcadia", + "bytes": 706, + "sha256": "73928ced61c06cbc08728d7956676a50fd4c05aa5b7f1ff4f29ce27a0b0f2088" + }, + { + "path": "examples/release1/sa/behavior/process_sa_field_procedure.arcadia", + "bytes": 1790, + "sha256": "886d462af83110cbfa55dd232a667ea1446761234471357cbb878794e98e8768" + }, + { + "path": "examples/release1/sa/behavior/process_sa_response.arcadia", + "bytes": 3234, + "sha256": "041785fc22842423822431bd5e6e8d16094ebd0716965e7c765fb8c1d7549e8a" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_conversation.arcadia", + "bytes": 2127, + "sha256": "97276f5757ee9aa12a0dbd9d3ccd58174b3091162bb8bcce357cec20a45f5d85" + }, + { + "path": "examples/release1/sa/behavior/scenario_sa_full_scenario.arcadia", + "bytes": 1256, + "sha256": "e12fc406b99d60a2f7768aaa0b25ba560e8605f0b8e37f3a7cdd3b8443562b74" + }, + { + "path": "examples/release1/sa/behavior/state_machine_sa_monitor.arcadia", + "bytes": 2022, + "sha256": "05ce29af99424c491c47fe2450dc6f5f8ce995511c01ec7e17bb5855be3c9736" + }, + { + "path": "examples/release1/sa/capabilities.arcadia", + "bytes": 781, + "sha256": "b6912fb3ece439912345fa71724acd462e716a1e5a88203a1058a5c3b2c20a4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_audit_thresholds.arcadia", + "bytes": 297, + "sha256": "e5a04325d52183956dca814dd90f4e56c96c6b7db0f4f202f203ecb49c3e0f4f" + }, + { + "path": "examples/release1/sa/functions/function_sa_restore_work.arcadia", + "bytes": 2576, + "sha256": "fddeb67308051325041fee641fe758ddf43345b7c47b66d433616ad07fdccdd6" + }, + { + "path": "examples/release1/sa/model.arcadia", + "bytes": 661, + "sha256": "d431509251acb859fbb98733b6d18add952495e10a78703fbe8f31e40bc083c4" + }, + { + "path": "examples/release1/sa/participants.arcadia", + "bytes": 4012, + "sha256": "780d2eb08b217b67b55febb3d34846f727b8ee9018df6c5741748647e36b2ff8" + }, + { + "path": "examples/release1/sa/types.arcadia", + "bytes": 1227, + "sha256": "101fc0fbd99f1101514aa7b6da4f8e535aae0bb94c9e2b9e7e6c151135b28660" + }, + { + "path": "examples/release1/traceability.arcadia", + "bytes": 29506, + "sha256": "48a96f543456c9b5a5798fc795594e4119147fe45f11a6f109f141b7f514560f" + }, + { + "path": "examples/release1/transition-before.json", + "bytes": 35801, + "sha256": "2253e6434f741687e22327c37d520ed15c043bc36025498650bc2366bb6a874d" + }, + { + "path": "examples/release1/transition-request.json", + "bytes": 4276, + "sha256": "43b9a22e5f95ad3bc0ebd2478ead0e14406854abc989ae94ded9367b013d812a" + }, + { + "path": "examples/release1/views/diagram_oa_allocation_view.arcadia", + "bytes": 2176, + "sha256": "dfc0eb61e0e2aa5bda45524571fbfa3494f44ce19696f3e15e07438074a07bc7" + }, + { + "path": "examples/release1/views/diagram_sa_allocation_view.arcadia", + "bytes": 2173, + "sha256": "b78b43a26a82efb8fbd5374b09c329fa341f57b29f635d397b9ef8aede71d389" + }, + { + "path": "examples/release1/views/diagram_sa_capability_view.arcadia", + "bytes": 1620, + "sha256": "75e8dc9fb30f25d6f8fd3c6b595593ab4f98958a25798f961e336e0fac557649" + }, + { + "path": "examples/release1/views/diagram_sa_service_view.arcadia", + "bytes": 2209, + "sha256": "b08c84f3ea633e7c78dfdad3272f75415f6256cf3614b6d99bfd4f0269076c9b" + }, + { + "path": "examples/release1/views/diagram_sa_state_view.arcadia", + "bytes": 1931, + "sha256": "5f42f4c605e57b817d8400ed21f2b14bfc4e1592aebe941ff113767504c2b869" + }, + { + "path": "examples/routing-workshop.arcadia", + "bytes": 66431, + "sha256": "dc6b75da72884d399132ed9e300fa5a26b73d802bb526c9af986ae9eeb0a646a" + }, + { + "path": "examples/routing-workshop.json", + "bytes": 100281, + "sha256": "8592714f75b271133f21ce017d87896b6cf91ea0e4837f1c2ed453e21be26b14" + }, + { + "path": "examples/source-project/oa.arcadia", + "bytes": 2142, + "sha256": "5f60642f211b2d352a951092faeeb7503d4fb7f6f7fca99e810347231101d31c" + }, + { + "path": "examples/source-project/project.arcadia", + "bytes": 606, + "sha256": "787f6b67b179ffd221f7e5faf1a4edd74cfd116aa1e3b5e9ed9f22fbff612d8d" + }, + { + "path": "examples/source-project/sa/assurance.arcadia", + "bytes": 682, + "sha256": "ab76044836e4dcd42a82d316846ec87da2108939aa2037640c5bca1d2ecdee0f" + }, + { + "path": "examples/source-project/sa/participants.arcadia", + "bytes": 1231, + "sha256": "1abad579812e77877b45a3d8e3c3e9da734be2d04a0254cc730a5257ebd2dc88" + }, + { + "path": "examples/source-project/sa/reporting.arcadia", + "bytes": 2839, + "sha256": "f0b7443f728912ca163de39b6055876b533a77feaa3219b2d40a2dd65712e058" + }, + { + "path": "examples/source-project/views.arcadia", + "bytes": 3508, + "sha256": "e29ad3f406a6a50d2f0ae2ca2a53ee3b0c18222cd4098704a46d4f48b64ea17f" + }, + { + "path": "examples/text-first/README.md", + "bytes": 1367, + "sha256": "4ec8250d5ed556f1d496e8c85137e973e802ecb11df1a36488411e8cdc5a9f9e" + }, + { + "path": "examples/text-first/project.arcadia", + "bytes": 480, + "sha256": "f441535c623e0cf20e1875eb2cd33b587ed00e078c37af39cb36d89bb5edc19a" + }, + { + "path": "harness/fixtures/basic-editing/README.md", + "bytes": 12012, + "sha256": "3545d9695e7c62e0caa818efd7f4dc426f04876a3626e0f3b1bad606b258cb26" + }, + { + "path": "harness/fixtures/basic-editing/base/expected-baseline.json", + "bytes": 4524, + "sha256": "f239e728d650b0af32bb8f3dcaf6b27c99b9c5041132ac14e51756ea6563d978" + }, + { + "path": "harness/fixtures/basic-editing/base/project.arcadia", + "bytes": 3077, + "sha256": "045cb047d7bfbca72c3fb30db4c81a30ad463d3af7fc51604906ad7fa75a1ff8" + }, + { + "path": "harness/fixtures/basic-editing/base/rationale.arcadia", + "bytes": 57, + "sha256": "c01867c9dc0d40726853119fac3c6ad24a40d8d362a93a8b9d20df04ec2e273f" + }, + { + "path": "harness/fixtures/basic-editing/manifest.json", + "bytes": 447, + "sha256": "d23c21b02064ddb85e051e10e16ff089daba8d9910bb1a695dfabe2db3757734" + }, + { + "path": "harness/fixtures/behavior-creation/README.md", + "bytes": 5954, + "sha256": "9e5fc751424d12cfe76a84abb1da45b2d38947409179451bb90ffe7e7ddc8723" + }, + { + "path": "harness/fixtures/interface-operation-probe/README.md", + "bytes": 2604, + "sha256": "088f0bdb3375deb8f2c7e3b749ca8d210ea828ca4dece69b3871b674e3110175" + }, + { + "path": "harness/fixtures/interface-operation-probe/hashes.json", + "bytes": 977, + "sha256": "f6d3e8aa42f40f64ce2ecba7b9cf112eb9091f3cccde3a592b0434e834cf2a6a" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.arcadia", + "bytes": 4218, + "sha256": "c0fe9570684c0061efc4cad65e339fede6961b04ca90c6f324c787bd65e61226" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/after-reset-deletion.json", + "bytes": 7835, + "sha256": "93187f7a1b476a44185725c6b15f2e1767482b6911ab1280144348d033eb51f0" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.arcadia", + "bytes": 4771, + "sha256": "02f85e39957ebe6d56336fa729a5c8b10f51865face9d3b2c9679200571fcfc7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/boundary-only.json", + "bytes": 8840, + "sha256": "756f9710336e6734ce3592ca774c6f104bba5a37c9e165540eb39326682393d1" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.arcadia", + "bytes": 8635, + "sha256": "ac5b629ba5596464f9f8a975b8bc2764e3007ceb7342de3f828d4b18e4f069b7" + }, + { + "path": "harness/fixtures/interface-operation-probe/output/explicit-functional-refinement.json", + "bytes": 16160, + "sha256": "78a47c978dc667aa1c45af711f06aa2a0d3c581003013e30c3e02fb0faae2e64" + }, + { + "path": "harness/fixtures/interface-operation-probe/probe.rs", + "bytes": 11274, + "sha256": "72b1b443e25eb20420dec4477b0fb5ef5d1c705e3882c81df88dd578ab96a426" + }, + { + "path": "harness/fixtures/release1-native/README.md", + "bytes": 2564, + "sha256": "5f5ba040fd2df9261a29bcab3f9a7ae27c3683265411ad3dda0b467d5df8590e" + }, + { + "path": "harness/fixtures/release1-native/artifacts/README.md", + "bytes": 4155, + "sha256": "24200c84ccc2ef3e17c029744074e5cea785188f5549ac54e44cf89682643f81" + }, + { + "path": "harness/fixtures/release1-native/artifacts/generate-semantic-artifacts.rs", + "bytes": 9275, + "sha256": "444f360b78df52c5e42046f77b148781e0c9bddc2a09c0b7bd65c7a4f376cfe6" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.arcadia", + "bytes": 7768, + "sha256": "84b22e95c213018612e6e8a84cad68b35a8b495ff3515b0f978c5e7a3d196d79" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.after.json", + "bytes": 7330, + "sha256": "13a6f99ec2df1dd35ee8b2613f183918cd9537eda4a5da085ad52e65c033db59" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.arcadia", + "bytes": 1446, + "sha256": "1e0d662ba33071b122ad9206d2d559a8e748c9431eb3ac1b759bde3760ca877c" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.json", + "bytes": 2216, + "sha256": "fa6a2e3643c0f909b92407abec3edc897033162eeaa501f8d4616f79d41fa044" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.manifest.json", + "bytes": 567, + "sha256": "65cb70b0d697a055363ba01bf30bed7e412d43c9978a033549c378d117719ae7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-create.request.json", + "bytes": 3991, + "sha256": "ed905267263e7f8a0cd2dbe833196b30118b6a246815216932fae661ad650699" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.arcadia", + "bytes": 6837, + "sha256": "e50fc462ec22dbf98011929931dd2489430001c3e6433608685b9d88bceb9acb" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.after.json", + "bytes": 6433, + "sha256": "f27a7b38d59c7cefe58cb36783d3d4dd8d8ae1168d9aed1eb61d343c18758908" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.arcadia", + "bytes": 1807, + "sha256": "eba2aec39e6efb405eace4bc8ab0c5563907c26d449e71a4aa750df9f73233b4" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.json", + "bytes": 2673, + "sha256": "2ef777f19b94f08b5e5ca2ef727777897e1018f1426eee291408b3c69101f596" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.manifest.json", + "bytes": 519, + "sha256": "3af7232ed3056ca84dcaf0f266ead3faaa512a0dc0051c7ba68791c20dbae0cf" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-delete.request.json", + "bytes": 1246, + "sha256": "8af21b00b62e620256fbf50e47c6c5836cdb6922d9549cc4b3d86bc03b008073" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.arcadia", + "bytes": 4200, + "sha256": "20bb30473830e44228958e78fb7480269cdcc0580c6c90c718da75f34ca5a43f" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.after.json", + "bytes": 4552, + "sha256": "44f4b05db49758dcf344788f57cecc0250fd029099b1c54e4e1e3e972f6cf039" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.arcadia", + "bytes": 1808, + "sha256": "b0fd031671c9f755756922ec5c40a0ce3f40164d22c3c389aec9fd0705344da7" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.json", + "bytes": 2673, + "sha256": "1acf81e08c51c85aceb14a3efbc39ec680552a19c7824aab4611ac3cf71b9c6d" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.manifest.json", + "bytes": 610, + "sha256": "a07978f4b0a3ca83e5ae5f35e7b66b26473b24431fc90e5889d755f1816d52dd" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-move.request.json", + "bytes": 2352, + "sha256": "5ff844a038b0030adb5a83d13d81e60f30627543388f6199b6a0e026fc42ea58" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts-native.md", + "bytes": 4075, + "sha256": "a51ffbc45b6c172cbfed3b16c249296e6a28d457fea57393dd958cdcfbafbca1" + }, + { + "path": "harness/fixtures/release1-native/artifacts/semantic-artifacts.hashes.json", + "bytes": 2367, + "sha256": "3ad8b7428b3ed7585a91e7f5d9d5f4880caccfd0b08dca25d05af523e62e0a10" + }, + { + "path": "harness/fixtures/release1-native/communication-means/README.md", + "bytes": 15091, + "sha256": "015c16010c212af283f9def118c6d263ba65a3bc6e81a750f180624ca69bb311" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/entry.arcadia", + "bytes": 6098, + "sha256": "a6976e7c21031e7cc3cb731e20c3075cf89cf85144dc8d3f52930f8521ea196f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/expected.json", + "bytes": 10480, + "sha256": "60c4419415c546f06c9972ac7bb0e530ada7b30a200b59e75ddda231a24f9a3d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "3c41459f2b0706a767988738bf8126f76540415bb5940d9c5db19cbe8c18182d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-create.request.json", + "bytes": 1331, + "sha256": "b16e673b29c96b5aed681389ff7669110abe552939e86dd0ec6011c9a45ed860" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.arcadia", + "bytes": 5239, + "sha256": "a511a4d817d9c5c80233bce83e84a7056b7dce7afd9fcc25696e333f8f4df055" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-draw.json", + "bytes": 8424, + "sha256": "7140114926228b1c378c450535f7a70992c71a879a8d2270c49e8d5f04a2f484" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/entry.arcadia", + "bytes": 5710, + "sha256": "910e6dfe609467047ce629ec9c626f4e927cada74bfbfa164414a8fe6783ea87" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/expected.json", + "bytes": 9868, + "sha256": "567259e20c9f6278776e8fa99b8b2fdbbc9a883ad875c5d39dae1b53de3a2924" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.after-template/traceability.arcadia", + "bytes": 407, + "sha256": "997f72fe9258012df66e88344cf39c1a2cebf2327f604056b67f7f2a8ebcfbfa" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reuse.request.json", + "bytes": 1127, + "sha256": "cb3fe05859cfffec6f8846c19983dc462413bc0ea4f6e19204f09c259919c4b1" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/cm-reverse-scenario.arcadia", + "bytes": 8209, + "sha256": "ec826b9b84616507490ac30e4d57100dd6338dba2f7071e879a8fb58820a85c5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/expected.json", + "bytes": 19735, + "sha256": "ef07e4d2d3fc36004ff01739838281581d9a703c747611eacc01bb9cc672489f" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-behavior.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/entry.arcadia", + "bytes": 9827, + "sha256": "86dd8a355f6c9dadfea56d06e5247c9b0f820819d7df17ef5690671c7c81324b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/expected.json", + "bytes": 21877, + "sha256": "980489ec2c483d4f9efada61358c1f29bafb2572fd5b804c656b91b8e9bb4f9a" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/oa/behavior/scenario_oa_cm_200.arcadia", + "bytes": 1488, + "sha256": "0ec8d7e38f5a5cd56ccf3979757b3a9f412ad0ae36ee6c2690b7872129046d70" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.after-template/traceability.arcadia", + "bytes": 2068, + "sha256": "dd5d356390089e4ec474374956f6219502733987e60ef8ff32920d8b33dce858" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.arcadia", + "bytes": 7698, + "sha256": "1abc4c4cac37cfb06ed3b12a115f9e7e6a2d3affd34b25c355309e5ee465fa40" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.json", + "bytes": 13130, + "sha256": "a5cf4cb2ef390113dd752f4054d43fb789da2ca77799efb5782805ae8aa2dfd5" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-reverse-scenario.request.json", + "bytes": 1090, + "sha256": "c0ac99ee186d126fe3ec57f2c0a4072984d39d36ad21ead357ab66a08ac0065c" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.arcadia", + "bytes": 5454, + "sha256": "b761c4c2af5f7064aaf1f887ffd6094eb6ae834b2c8057ecdbc4aa97c042066b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/cm-transition-ready.json", + "bytes": 8852, + "sha256": "2536b000de361fb131787e32b466b9123d4e98abf00c099ad32f6cb8e7fb530b" + }, + { + "path": "harness/fixtures/release1-native/communication-means/generate-communication-means.rs", + "bytes": 28035, + "sha256": "003521404b702332082e01f2be7676fda1dd7b5bcf220bb81d25120c8984c75d" + }, + { + "path": "harness/fixtures/release1-native/communication-means/hashes.json", + "bytes": 3133, + "sha256": "39b4dc02fc8b074015c59354fd1c1061c25832fde25065c7151f36eb0455e6f6" + }, + { + "path": "harness/fixtures/release1-native/communication-means/manifest.json", + "bytes": 1237, + "sha256": "fb921f42f2c4a4f8a67d1266f17f8c7750b6a2619554b713aa92b17918f0c43e" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40-oracle.json", + "bytes": 26264, + "sha256": "74edca148583f42c269e51f135662f65ef1c9ea1c94516d63e2a5091967dc99b" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.arcadia", + "bytes": 28947, + "sha256": "00b87736b82c5afd33b311df7aebe9a6c8c51b6de66221181b5ea8bc8ca221a3" + }, + { + "path": "harness/fixtures/release1-native/dense-40/dense-40.json", + "bytes": 54938, + "sha256": "5dd4f22453330cab3abc059881660190e689a22619853f77cf6d0b52735d97ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments-native.md", + "bytes": 2624, + "sha256": "28906924b05f75bbf432389517aef65f1df474d2f2bff79a3586564f7f7328ef" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.arcadia", + "bytes": 6795, + "sha256": "9d084dd75a0251d349cc31f9ee98df58d0bc76859dc3cb1503f242e2f759888a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.after.json", + "bytes": 9618, + "sha256": "f09be41afd85c18fd52fdf997e9b81c4b7cb2c41e78d167abcd14caea8110333" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.arcadia", + "bytes": 4990, + "sha256": "8740f27be99624013d9be876639c0411e1b8c14f0f9a843f43dc71d769efd79a" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.hashes.json", + "bytes": 963, + "sha256": "00fc9e2c709bdcd9ee98012176cb0edb635c112153d963cd169bf4bf69a9e010" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.json", + "bytes": 8146, + "sha256": "9c188f2890630c7feec2be719a7104af9690da7ea836df18fa78da3ff2acfc1b" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.manifest.json", + "bytes": 1045, + "sha256": "46b40f221ffad614733b615208814ace63947e96b80bbfdec63853ccd4f4e8c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-attachments.request.json", + "bytes": 3075, + "sha256": "b57f656f0b9cf2c595e83150c683301909e20f15684d35d108d3c57ee0dc5909" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch-native.md", + "bytes": 2637, + "sha256": "dddca2b85f892b05881c75ef3cd62437396cc086a09909b621e02bad0cbe56ff" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.arcadia", + "bytes": 3134, + "sha256": "d3315bba762395205ae761e6e64029e8b4070c15a1299c6114075581db7b0974" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.after.json", + "bytes": 3927, + "sha256": "8f36119c7e893a4af374b13b85b1c2cb3df0196df8d06a551386628fc8b8646d" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.arcadia", + "bytes": 1787, + "sha256": "5e1f433e04621424edac43e53411624059e873f88dd531bfdb39093953485ed7" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.hashes.json", + "bytes": 933, + "sha256": "1bd87700b04e4f169ab5f8aceaa3b0c3ec3a1cc43e1bce135a1cee506fc75d38" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.json", + "bytes": 2816, + "sha256": "1972242d2a8677d004dc3af1081feb292de65fe26128d877dded8661f9906619" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.manifest.json", + "bytes": 647, + "sha256": "1e440efa02e2ccc27585d9a49c7864d53e3e3e7645ccb219f040e00d95331b8e" + }, + { + "path": "harness/fixtures/release1-native/semantic-batch.request.json", + "bytes": 2197, + "sha256": "71f23474614aab90398ce24f00f2cf61d6cb9a3a34faa3e12e0c8104e0a71073" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.arcadia", + "bytes": 15635, + "sha256": "e3ce0347746584f503b825a8b6bd23a7eebf0827940112ef8f36d500c1d0a043" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-repair.json", + "bytes": 25736, + "sha256": "29736f2a619f7f2d0e795229f6e8c3645a1b4eca6292043cd604aa01b1ec9170" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.arcadia", + "bytes": 15631, + "sha256": "9ab573c92be66e3bae659dd826923ba6066979b1651edda7bd469056632cd77e" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.after-take.json", + "bytes": 25736, + "sha256": "828c990c6129692cd31c7f6ed0dd6c952f9cfffdd90bc80171df82d4d929afba" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.arcadia", + "bytes": 15617, + "sha256": "49214be2ca9c8bb6195c3b39737c053847021839f70f0bb2921d35a1fbd2ac83" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid-request.json", + "bytes": 2225, + "sha256": "8b02d4739b1be2c8a64da76423b4a6cae7d89c60f4d30723b94f1da3779cbcca" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.invalid.txt", + "bytes": 78, + "sha256": "aa536e18bc65325163e9b645a4ad031ab599fcb05948dcf741b725d0f0c8b602" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.json", + "bytes": 25722, + "sha256": "995dd72f5c1f07f998233ae9847e337cb82de0c2a9053d3905be021d5f8124b9" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.manifest.json", + "bytes": 1059, + "sha256": "ad315359bfd68ce0d265976dc9e4ea6a502ebbb87d7339dd1af5ef27dd01e433" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-plan.json", + "bytes": 15016, + "sha256": "27bf316ad66ffa91f6323e75b0c280baf5caec298645793dea72c5d42aa3b782" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.repair-request.json", + "bytes": 2225, + "sha256": "f4f6b5480ec8927033ea469ea82c1e8411cb6dba95d2da680f15bc193914c9b4" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.steps.md", + "bytes": 3897, + "sha256": "7d7e38d93641a5f22a2738baa4dbacc392eebb477a855cdce0641961980a19ad" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-plan.json", + "bytes": 18557, + "sha256": "74dd68ba686b8928054480f0bfed55aad91f6f1208803399dc9878e894f57ecb" + }, + { + "path": "harness/fixtures/release1-native/semantic-keyed.take-request.json", + "bytes": 1508, + "sha256": "d19a53002a6bf95af3123a3ef9f78baaf7ce1085d4f06f0f4a9d5e5d5accbc0e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.arcadia", + "bytes": 6935, + "sha256": "90277f1780d43a6f0b2184bf00b87e7a4f3518d67c6f10d4793daafe1aabf493" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.after-order.json", + "bytes": 11286, + "sha256": "5a3c8494f6976c23b990c14b40760fb2f32ca9973caf6f31dab5632310663591" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous-request.json", + "bytes": 1379, + "sha256": "6a86fde194faa55f2d1bdb982571e0e711e5401b53a960e6acb8cf3e17f506c8" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.arcadia", + "bytes": 6195, + "sha256": "e7c30c5a5c3ba7209c8e223f02da55821d7af10a2f09844a7065ae6cd8f22aa5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-plan.json", + "bytes": 19156, + "sha256": "d1e5c2ed08e0aa6274a0421a39876d1ba99f4e441c7a0a68660a83b9e017da14" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.final-request.json", + "bytes": 2418, + "sha256": "433f723252598994dac7184da61f95344b528156cc5a0fba1a7864b2ec9f002b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.json", + "bytes": 10441, + "sha256": "9e4e2ce1c7879935ad0860a3ae720506c929a8422b51491b719d88af3fd3ff2d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-branch-steps.manifest.json", + "bytes": 1042, + "sha256": "87e8899c7d4e54faedeef32afb7592fb65278d1bd7390850ab198dcf62068329" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.arcadia", + "bytes": 6280, + "sha256": "6c77ed42bbf9f4ebe08bfa233197a4020e5587ce33747f7914430aa0c662d9a3" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.after-order.json", + "bytes": 10009, + "sha256": "1dd7ca2bcfc84ac23369c506302b39569d2ebc41e5a4edc99378a1fe01923b7e" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous-request.json", + "bytes": 1390, + "sha256": "e0ea7aeb25687ae63c65128f1aab78273f14030d179d3fbea63fe91ab5430136" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.arcadia", + "bytes": 5529, + "sha256": "563c36162050c8564ffa25a85c726462ecdaebdb87659b3f3610506bfd5581e6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-plan.json", + "bytes": 18821, + "sha256": "f96c43fc58dbe48a044b628b31bb3f0b59171dad5b6982ec6c34a5597e474130" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.final-request.json", + "bytes": 2438, + "sha256": "d38fdb13612b07254edad80848f79c1e097d5f868c020feae9ba072aa697a50d" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.json", + "bytes": 9153, + "sha256": "2ed0daed118f2df13dcad738dab174ad34d44a15921cf8097415e707978b0968" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-fragment.manifest.json", + "bytes": 1058, + "sha256": "c79bd12a85d8d4f25cc3ee43581b3e5e74ae9ad7e4de0c72764975ba2b89c279" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.arcadia", + "bytes": 5026, + "sha256": "98020e048ac01f285c6ad8c10ce22bef05e193b5ba0f5558be1fb26a7bf82620" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.after-order.json", + "bytes": 7851, + "sha256": "ea3783992488bc6ee944eb91a26ccf3dbc05a3909528fc32ec8023a76765cee6" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous-request.json", + "bytes": 1379, + "sha256": "ea3cfd25f7a50481805956fb88ab851516dcd602dd6564502a0cc55f7de6a54f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.arcadia", + "bytes": 4295, + "sha256": "2b7c3694623bbea3e36dcc6f674d4adcd91e23c8e1005ded21e5a69648a048e5" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-plan.json", + "bytes": 17912, + "sha256": "95a23bd334cffcaef0c3b1012b7555efd2a077ef6f9140d58020910ef8a76723" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.final-request.json", + "bytes": 2081, + "sha256": "1e2433ed5821bf65443f56cb27381ee935db81b1955d3a539b7952898312a410" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.json", + "bytes": 7012, + "sha256": "0033f8780c2ba69779b811bca792340c25a092f887e5811c6839f0a691d744f2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-reverse.manifest.json", + "bytes": 1046, + "sha256": "e3b4a60a56abee779ca8356605c968aa2d99256a3bd3c5601b14b5c5502a1a05" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.arcadia", + "bytes": 5467, + "sha256": "e265cab35097acc46f5123107c13bc35b9f71931ff650557fc1c85779141b327" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.after-order.json", + "bytes": 8482, + "sha256": "9b777828d3681138de6bbd08de8bf922bed92c27be60b103d8ff73ce7ddd0a48" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous-request.json", + "bytes": 1379, + "sha256": "7d124256730bf2feee772c7d0118b87eb288e8aaa9179d69ceb9259dbceb2c71" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.arcadia", + "bytes": 4727, + "sha256": "87a5a3665dab2dd6e595867dcebb1586e93dd067c85d6e24b1a4d3ff0ad6d4ba" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-plan.json", + "bytes": 18803, + "sha256": "1888ca51e0923866a9afea99cad069fe5d3f19f0a1b24328e20ac1b9f52d8bad" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.final-request.json", + "bytes": 2294, + "sha256": "5070a5b85feb1bc7b1fc648cd5d35ef26663492c8666dcd471950c06ec3a6052" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.json", + "bytes": 7641, + "sha256": "725b35e36640c81c70c7efea5c3304bf61b49ef9664194ca0d491782cc62191a" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered-scenario.manifest.json", + "bytes": 1038, + "sha256": "1b43abf8fed3061c65a7b7cb103d31ea7ece333a2da83c645f8d228448c4dbb2" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.arcadia", + "bytes": 5019, + "sha256": "65a6217f474b5085f37b511151185c2c08ff7a1998e924f1fe01f29c410f6ced" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.after-order.json", + "bytes": 7835, + "sha256": "8a53bb9b43eab5b6dca5e08deef20c14c96e134b9ee816a99b7960bb5255e008" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous-request.json", + "bytes": 1379, + "sha256": "c704f99245f00d5c3be0562d91931b4e7f1fb3fb36f41991eb76656ffbd6129f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.ambiguous.txt", + "bytes": 94, + "sha256": "0f938b23fcfce776a61a57de5a2c82b4a0720b5e5af6780fdb96f5f92b3edd21" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.arcadia", + "bytes": 4279, + "sha256": "c59ec1233d5a9fbb8e386f6d9b13f398be21baf813ba215efb51bfc1bb98db36" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-plan.json", + "bytes": 17938, + "sha256": "30c5c3f614a74708763df612016483623792f4c65e2ed2fa662ac417cfb852eb" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.final-request.json", + "bytes": 2098, + "sha256": "3b6c35ef78133f0980cb6fb53fbc29c5d3c4deb5dc4be01c2c3384e221987b9b" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.json", + "bytes": 6996, + "sha256": "c159c60403abcf8fefab7f19cbad9989488e8ccc20b82c57597b22a0ae254802" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.manifest.json", + "bytes": 1038, + "sha256": "af8a314a9b1d85a8f98affa5a6649f43d252851158798e1ad687bb1b6966b14f" + }, + { + "path": "harness/fixtures/release1-native/semantic-ordered.steps.md", + "bytes": 4549, + "sha256": "6004894e9d9f478b7fe1c3c3e0706dcc546d5df8557cff91b4cf26f8a4badf24" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/15000000-0000-4000-8000-000000000010.json", + "bytes": 1933, + "sha256": "71cca2a59f36b2a07d11dedbe9101226aa1a4a00d8ac244b5565202e56709f51" + }, + { + "path": "harness/fixtures/release1-native/source5-recovery/generate.py", + "bytes": 1496, + "sha256": "e44986c1d563499f25917441220b23883fc9cb0f89faf409873191f0212fbd2f" + }, + { + "path": "harness/fixtures/release1-native/state-actions.arcadia", + "bytes": 6224, + "sha256": "9cde82608110e56aa9e14c9e33eb38976f53aed74ab013145d411d5743a0ec26" + }, + { + "path": "harness/fixtures/rest-coverage/README.md", + "bytes": 1870, + "sha256": "df4a391312e0c8b20ccdcc850199443b08547be1b10b1f2447a067bf4bf544e6" + }, + { + "path": "harness/fixtures/rest-coverage/coverage-probe.json", + "bytes": 8008, + "sha256": "699b868dd6c955f7ef02f2f061935471f3d21a406005fcdecba8cc719cc69a1f" + }, + { + "path": "harness/fixtures/rest-coverage/run-coverage-probe.ps1", + "bytes": 9381, + "sha256": "f24f19fca418b76a7249894a08c116e16b465a02f8f899d12b808ccfdd90a3bd" + }, + { + "path": "harness/fixtures/run-timed-bundle-oracle.ps1", + "bytes": 7466, + "sha256": "fab696486a574f9867c6e69a8a8b960e7e9722206441b9cc5f36d41f285f1a25" + }, + { + "path": "harness/fixtures/scenario-authoring/README.md", + "bytes": 14700, + "sha256": "6b651b180b76d10b00bc49d77a8f5e0b3ba0317446978f41b541f5bb23fedad8" + }, + { + "path": "harness/fixtures/scenario-authoring/base/expected-baseline.json", + "bytes": 38589, + "sha256": "abd8246c939ebb8a2162ef82e23d0fb322ee1a8b4d0d7c28a34037e42e86e841" + }, + { + "path": "harness/fixtures/scenario-authoring/base/project.arcadia", + "bytes": 19470, + "sha256": "9b1afbe96b0bf8fa613451b00929492f05a59b9eb2ca74c2c374a8b7bb7cba9e" + }, + { + "path": "harness/fixtures/scenario-authoring/base/rationale.arcadia", + "bytes": 86, + "sha256": "82df210f22f6aa336a3e7e00240977d671c7c3923db7bc58fb29e6d98b67ef49" + }, + { + "path": "harness/fixtures/source7-native/README.md", + "bytes": 7235, + "sha256": "7abccbc3da0980d1d099761d1a66d12c403a0f543954134537ecd4930d182b4b" + }, + { + "path": "harness/fixtures/source7-native/base/expected-baseline.json", + "bytes": 26428, + "sha256": "e2882a58f841f460f45d9d67db1606440e0d7997b9b29a784569ae48e4b23bfb" + }, + { + "path": "harness/fixtures/source7-native/base/project.arcadia", + "bytes": 13616, + "sha256": "5474d8ca05fd1375220dc0ad40d913631fde51159e9632bb9f290d1ecdab8dd7" + }, + { + "path": "harness/fixtures/source7-native/base/rationale.arcadia", + "bytes": 59, + "sha256": "e6a600e13036d4ad594a65380ed1b3d82d1772d583041bb0a624c9588a73047a" + }, + { + "path": "harness/fixtures/source7-native/manifest.json", + "bytes": 410, + "sha256": "6c57164a796234d83818d462d0a25f10e77062d405769e602ae2a7bec251e3b6" + }, + { + "path": "harness/fixtures/staged-source-authoring/README.md", + "bytes": 8380, + "sha256": "711910a12d5f3960f32da9aa7bc2e647f31d770c84b7fc26e232dcb3a76f8821" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/notes.arcadia", + "bytes": 63, + "sha256": "ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd" + }, + { + "path": "harness/fixtures/staged-source-authoring/base/project.arcadia", + "bytes": 593, + "sha256": "aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c" + } + ] +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/inputs4.zip b/harness/experiments/text-navigation-native-20260911/corrections/inputs4.zip new file mode 100644 index 00000000..e06b5b12 Binary files /dev/null and b/harness/experiments/text-navigation-native-20260911/corrections/inputs4.zip differ diff --git a/harness/experiments/text-navigation-native-20260911/corrections/manifest.json b/harness/experiments/text-navigation-native-20260911/corrections/manifest.json new file mode 100644 index 00000000..4cbb9c7c --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/manifest.json @@ -0,0 +1,227 @@ +{ + "atUtc": "2026-09-11T19:42:17.551496+00:00", + "baseCommit": "f4e426ae2a6971395e1ca7e6f094b0c20056cf93", + "scope": "Four corrected desktop files with exact input ZIPs, failed runs, independent review, focused tests and strict Clippy. Corrected full-suite, GUI and native acceptance are separate.", + "files": [ + { + "path": "capture.py", + "bytes": 2789, + "sha256": "c8ba5b85829c0d1b704ea984eb83a2830e66cffcb86736da32d8cd0c09fe6183" + }, + { + "path": "clippy5-status.json", + "bytes": 294, + "sha256": "57c535b7d5dc81466f9aea20ddb0d7a05428371a367f87ec901f59b90b411159" + }, + { + "path": "clippy5.log", + "bytes": 157, + "sha256": "66690537d431b19659d6d2c932275605cde048ae43d45f2eca00cd4d2b23c34b" + }, + { + "path": "final-gate-result.json", + "bytes": 2722, + "sha256": "d65edfbeb1ac210832974d5d78a964af00eef8e67ca342b103e7a9f39b00c1c2" + }, + { + "path": "finalize.py", + "bytes": 3571, + "sha256": "4658124e48215cd1e32662fcedcd22554cf979759f1ddd840f6125d0a9c830c6" + }, + { + "path": "fmt-final-status.json", + "bytes": 411, + "sha256": "deeb1c3fcfd130891a5f836bfc16d4becbea43890dedb3d689c72c89193d7c9f" + }, + { + "path": "focused1-tool-result.json", + "bytes": 765, + "sha256": "b9cd259f5d2dd0915da4202f8187db239b333aad981f2b6f3708e06819b814d8" + }, + { + "path": "focused1-wrapper-failure.txt", + "bytes": 759, + "sha256": "79d1b7f38bee64841f726224977ac7c1d1a60a2cddd0dff94f735c6e0144c702" + }, + { + "path": "focused2-status.json", + "bytes": 322, + "sha256": "e57ca06ce248d86bb02a48e5067cb1a8d22d557db7c20aa41be40908bbd8f72c" + }, + { + "path": "focused2-stop-request.json", + "bytes": 2855, + "sha256": "d9b71ceea78580c5783591901643a37badd62f59b9c03477fb73a2a4f8a627a6" + }, + { + "path": "focused2.log", + "bytes": 5176, + "sha256": "41cfd3637799aac0d6edfffe7662362e5722a455640dd2c846c6adf5b7a34857" + }, + { + "path": "focused3-status.json", + "bytes": 322, + "sha256": "41836702a94284aacade462a2d4b9449825145dc77b43b8fbb64adf2c1c7b655" + }, + { + "path": "focused3.log", + "bytes": 2412, + "sha256": "746ce65623b2bc88154295c50d259adba92e18fb50b8d1862d36176ba8d1f7f6" + }, + { + "path": "focused4-status.json", + "bytes": 322, + "sha256": "db512cf983989afa7d2103832917596f984550edf96e18ccc7f61dc31928e518" + }, + { + "path": "focused4.log", + "bytes": 22811, + "sha256": "572ae28ba9b722694b1f70320012a4037c8939df4def7e66d06a1bfbcfb80950" + }, + { + "path": "focused5-status.json", + "bytes": 320, + "sha256": "282b0c49e162660e4677598ef140d24a7ada9769543f1b332a27b54db9a7405c" + }, + { + "path": "focused5.log", + "bytes": 22181, + "sha256": "3be2383aa7bf25a92b55b7b6e178c05819559248a88f3ecf245e78266e63d311" + }, + { + "path": "independent-review1.md", + "bytes": 6301, + "sha256": "0fa5a19ffe8db0b4cb0a41ac48672f52a76818cbb3c0311649a480a3ade9f37b" + }, + { + "path": "independent-review2.md", + "bytes": 3822, + "sha256": "6be168f48475c000262326af2a56e3f606c60ec365129a21d535c86e17a38035" + }, + { + "path": "inputs1-readback.json", + "bytes": 117, + "sha256": "8c862514228baa8fd34da0d4457b8f5dafe3b87eb54eeabd3fca828fff183216" + }, + { + "path": "inputs1.json", + "bytes": 93343, + "sha256": "1c328363248f4f7867d0faa2aeabb114fcc918c5bcd022324e03d89d50c9ae40" + }, + { + "path": "inputs1.zip", + "bytes": 2083588, + "sha256": "026cb5d112cbcb70e4690ab831a77e17906db329267df21423b7973f71774c36" + }, + { + "path": "inputs2-readback.json", + "bytes": 117, + "sha256": "d53f076feae1487af7e3d2172f4930e929817573077da0d955f298ad11b50109" + }, + { + "path": "inputs2.json", + "bytes": 93343, + "sha256": "b2c2b102fc7bdeff15114940d236290a893457c6abf853f1c3710d61aa8fe833" + }, + { + "path": "inputs2.zip", + "bytes": 2084416, + "sha256": "fa2fa9dfe4ae329abb9d01bd200a74fc829233824a896b4276942f4eb0f01cbc" + }, + { + "path": "inputs3-readback.json", + "bytes": 117, + "sha256": "939e2c541167068d72981b784c4207824bb6ae6685033d2d956f2678f241dbdf" + }, + { + "path": "inputs3.json", + "bytes": 93343, + "sha256": "eb2a202cd5988bc0ea51a09507525459f76b9db6c391a08a3a26a1725bb3d900" + }, + { + "path": "inputs3.zip", + "bytes": 2084416, + "sha256": "7dcbf323348f214bbd6052f253831810af1562cc5ec4eb8aa46f9c212559b2b3" + }, + { + "path": "inputs4-readback.json", + "bytes": 117, + "sha256": "d153dda1959fcc65e613770f8cb45a253f6c20d1d73b5aad97078e5dba6a9752" + }, + { + "path": "inputs4.json", + "bytes": 93343, + "sha256": "72c2e8154f9945aa87d0cbf9cc148934a84614e15576673496aa5a5907c12154" + }, + { + "path": "inputs4.zip", + "bytes": 2084486, + "sha256": "7ff9e5703e33bd72e5c2186dd61125e965b82b8dfbf085961d514b005e716798" + }, + { + "path": "original-hashes.json", + "bytes": 910, + "sha256": "927aed406f454b0fb2cde8dd3a717e337a620fc6e3c4a0160ba3c7ee3d419ed3" + }, + { + "path": "originals/crates/oa-desktop/src/app/source_symbols/tests.rs", + "bytes": 45457, + "sha256": "ed82648dc6e7a69eb55be6134cbd78452addd250aaeb759f94530c95601d840d" + }, + { + "path": "originals/crates/oa-desktop/src/app/source_symbols.rs", + "bytes": 17979, + "sha256": "00d21572b36d15908e75f0bc954951229fb42c640c6b81b7c424e6b931407d20" + }, + { + "path": "originals/crates/oa-desktop/src/app.rs", + "bytes": 213219, + "sha256": "370c2ce1b58f5aad4cfbbbae4a774670a20c6f4f5f1a77305daf8ce221f80dbe" + }, + { + "path": "originals/crates/oa-desktop/src/views.rs", + "bytes": 51197, + "sha256": "3d57ff54d159d4bbb4fe0b6a368f8dad0c70b5a4d40a6c19fd0f2197cb06624e" + }, + { + "path": "README.md", + "bytes": 5226, + "sha256": "e97cfac491c3545d05e4143a0153b91e3970c339fba8be4bdb71d1a151cdeb9d" + }, + { + "path": "run-focused1.ps1", + "bytes": 1034, + "sha256": "7f64f42e5a45a4780f5487902ac5d201015a10435b1a57c3adc8053c3b21f440" + }, + { + "path": "run-focused2.ps1", + "bytes": 1034, + "sha256": "a45331c664756652f3b52d4c2ffe1dca0942861cd0d9d74645b293570bbe386b" + }, + { + "path": "run-focused3.ps1", + "bytes": 1034, + "sha256": "5b187d24778bbafd31edae96267ff4e773082751a9a5ca35b7cc12a0a72d5374" + }, + { + "path": "run-focused4.ps1", + "bytes": 1034, + "sha256": "54b4232f4df45bb2ae76597aca6060b106c1cf194196b3bcface2d8f14f60084" + }, + { + "path": "run-focused5.ps1", + "bytes": 1034, + "sha256": "bd14bb9955d15d33fdab771c481a899014eb1abfa5061b25f8b0fa10bf79c671" + }, + { + "path": "test-binary.json", + "bytes": 343, + "sha256": "af2ebfa351a216f1a7be96c1de983abbcc346ef845138e87c0f16225b11e15ec" + }, + { + "path": "corrections.patch", + "bytes": 39037, + "sha256": "037581f957f619728bffbf024e9b99cbc78d7a03994108c4e08bbfcb9a49f81e" + } + ] +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/original-hashes.json b/harness/experiments/text-navigation-native-20260911/corrections/original-hashes.json new file mode 100644 index 00000000..d0965275 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/original-hashes.json @@ -0,0 +1,22 @@ +[ + { + "Algorithm": "SHA256", + "Hash": "3D57FF54D159D4BBB4FE0B6A368F8DAD0C70B5A4D40A6C19FD0F2197CB06624E", + "Path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\crates\\oa-desktop\\src\\views.rs" + }, + { + "Algorithm": "SHA256", + "Hash": "370C2CE1B58F5AAD4CFBBBAE4A774670A20C6F4F5F1A77305DAF8CE221F80DBE", + "Path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\crates\\oa-desktop\\src\\app.rs" + }, + { + "Algorithm": "SHA256", + "Hash": "00D21572B36D15908E75F0BC954951229FB42C640C6B81B7C424E6B931407D20", + "Path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\crates\\oa-desktop\\src\\app\\source_symbols.rs" + }, + { + "Algorithm": "SHA256", + "Hash": "ED82648DC6E7A69EB55BE6134CBD78452ADDD250AAEB759F94530C95601D840D", + "Path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\crates\\oa-desktop\\src\\app\\source_symbols\\tests.rs" + } +] diff --git a/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/app.rs b/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/app.rs new file mode 100644 index 00000000..7e5eee23 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/app.rs @@ -0,0 +1,5106 @@ +pub(crate) mod architecture_authoring; +#[cfg(test)] +mod architecture_authoring_tests; +mod checkpoints; +#[cfg(test)] +mod diagram_selection_tests; +mod hosted; +#[cfg(test)] +mod review_navigation_tests; +mod source_symbols; +#[cfg(test)] +mod transition_context_tests; +#[cfg(test)] +mod view_copy_tests; +use crate::forms::Draft; +use crate::{ + behavior, + document::Document, + source_workspace::{self, LIMITS, Workspace}, +}; +use iced::{Element, Subscription, Task, keyboard, widget::text_editor, window}; +use oa_core::{projection::project_view, validation::validate, *}; +use oa_core::{ + source_files::{self, DiskProject}, + source_project::{CompiledSourceProject, SourceDiagnostic, SourceLocation}, +}; +use serde_json::{Value, json}; +use std::{collections::BTreeSet, path::PathBuf, sync::Arc}; + +#[cfg(test)] +mod direct_scenario_tests { + use super::*; + use crate::behavior::{ + self, + scenario::{self, CanvasEvent, Event, MessageStyle, Slot}, + }; + fn setup() -> (App, scenario::direct_tests::Fixture) { + let f = scenario::direct_tests::fixture(); + let mut app = App::with_project(f.project.clone()); + let _ = app.update(Message::Select(f.owner)); + let _ = app.update(Message::Page(Page::Behavior)); + assert_eq!(app.scenario_context().unwrap().scenario, f.owner); + (app, f) + } + fn form(app: &mut App, event: Event) { + let _ = app.update(Message::Behavior(behavior::Event::Scenario(event))); + } + fn begin(app: &App, f: &scenario::direct_tests::Fixture) -> CanvasEvent { + CanvasEvent::Begin { + context: app.scenario_context().unwrap(), + slot: Slot { + parent: f.owner, + before: None, + }, + sender: f.sender, + receiver: f.receiver, + style: MessageStyle::Asynchronous, + } + } + #[test] + fn direct_scenario_scroll_and_real_resize_invalidate_only_pointer_context() { + let (mut app, f) = setup(); + let original = app.document.bundle().clone(); + let event = begin(&app, &f); + let context = app.scenario_context().unwrap(); + let size = app.window_size; + let _ = app.update(Message::WindowResized(size)); + assert_eq!(app.scenario_context(), Some(context)); + let _ = app.update(Message::WindowResized(iced::Size::new( + size.width + 20., + size.height, + ))); + assert_ne!(app.scenario_context(), Some(context)); + let _ = app.update(Message::ScenarioCanvas(event)); + assert!(!app.behavior.has_pending()); + let context = app.scenario_context().unwrap(); + for (area, offset) in [ + (scenario::ScrollArea::Canvas, iced::Vector::new(30., 150.)), + (scenario::ScrollArea::Page, iced::Vector::new(0., 90.)), + ] { + let before = app.scenario_context().unwrap(); + let _ = app.update(Message::ScenarioCanvas(CanvasEvent::Scrolled( + context, area, offset, + ))); + assert_ne!(app.scenario_context(), Some(before)); + let current = app.scenario_context().unwrap(); + let _ = app.update(Message::ScenarioCanvas(CanvasEvent::Scrolled( + context, area, offset, + ))); + assert_eq!( + app.scenario_context(), + Some(current), + "unchanged redraw notification retains context" + ); + } + let event = begin(&app, &f); + let _ = app.update(Message::ScenarioCanvas(event)); + form(&mut app, Event::Name("Keep my draft".into())); + let context = app.scenario_context().unwrap(); + let _ = app.update(Message::ScenarioCanvas(CanvasEvent::Scrolled( + context, + scenario::ScrollArea::Page, + iced::Vector::new(0., 200.), + ))); + assert!(app.behavior.has_pending()); + assert_eq!(app.document.bundle(), &original); + let current = app.scenario_context().unwrap(); + for dimension in 0..3 { + let mut stale = current; + match dimension { + 0 => stale.document = Id::new_v4(), + 1 => stale.scenario = Id::new_v4(), + _ => stale.revision += 1, + } + let _ = app.update(Message::ScenarioCanvas(CanvasEvent::Scrolled( + stale, + scenario::ScrollArea::Canvas, + iced::Vector::new(0., 900.), + ))); + assert_eq!(app.scenario_context(), Some(current)); + } + assert!(!app.document.can_undo()); + } + #[test] + fn direct_scenario_rejects_every_stale_context_and_preserves_property_drafts() { + let (mut app, f) = setup(); + let before = app.document.snapshot(); + for dimension in 0..4 { + let mut event = begin(&app, &f); + let CanvasEvent::Begin { context, .. } = &mut event else { + unreachable!() + }; + match dimension { + 0 => context.document = Id::new_v4(), + 1 => context.scenario = Id::new_v4(), + 2 => context.revision += 1, + _ => context.epoch += 1, + } + let _ = app.update(Message::ScenarioCanvas(event)); + assert!(!app.behavior.has_pending()); + assert!(Arc::ptr_eq(&before, &app.document.snapshot())); + } + let _ = app.update(Message::Field( + "/name".into(), + "Pending scenario name".into(), + )); + assert!(app.draft_dirty()); + let event = begin(&app, &f); + let _ = app.update(Message::ScenarioCanvas(event)); + assert!(!app.behavior.has_pending()); + assert!(app.draft_dirty()); + assert!(Arc::ptr_eq(&before, &app.document.snapshot())); + } + #[test] + fn direct_scenario_creation_and_reorder_preserve_selection_and_each_undo_once() { + let (mut app, f) = setup(); + let original = app.document.bundle().clone(); + let event = begin(&app, &f); + let _ = app.update(Message::ScenarioCanvas(event)); + form( + &mut app, + Event::Exchange(Choice { + id: f.exchange, + label: "Contract".into(), + }), + ); + form(&mut app, Event::Submit); + assert!(!app.behavior.has_pending()); + let created = app.selected; + assert_ne!(created, f.owner); + assert_eq!( + app.project().elements[&f.owner].steps().unwrap(), + &[f.call, f.reply, created] + ); + let before_reorder = app.document.bundle().clone(); + let context = app.scenario_context().unwrap(); + let _ = app.update(Message::ScenarioCanvas(CanvasEvent::Select( + context, f.sender, + ))); + assert_eq!( + app.scenario_context(), + Some(context), + "same-owner selection retains gesture context" + ); + let _ = app.update(Message::ScenarioCanvas(CanvasEvent::Reorder { + context, + occurrence: created, + slot: Slot { + parent: f.owner, + before: Some(f.call), + }, + })); + assert_eq!(app.selected, created); + assert_eq!( + app.project().elements[&f.owner].steps().unwrap(), + &[created, f.call, f.reply] + ); + let _ = app.update(Message::Undo); + assert_eq!(app.document.bundle(), &before_reorder); + let _ = app.update(Message::Undo); + assert_eq!(app.document.bundle(), &original); + assert_eq!(app.project(), &f.project); + assert!(!app.document.can_undo()); + } + #[test] + fn direct_scenario_source_failure_and_navigation_keep_form_until_success() { + let (mut app, f) = setup(); + let bundle = app.document.bundle().clone(); + let mut limits = oa_core::source_project::ProjectLimits::default(); + limits.model.max_source_bytes = + bundle.files.values().map(String::len).sum::() + 4000; + app.document = Document::from_bundle(bundle.clone(), limits).unwrap(); + app.sync(); + let event = begin(&app, &f); + let _ = app.update(Message::ScenarioCanvas(event)); + form( + &mut app, + Event::Exchange(Choice { + id: f.exchange, + label: "Contract".into(), + }), + ); + form(&mut app, Event::Name("Long message".repeat(1024))); + let _ = app.update(Message::Page(Page::Catalog)); + assert_eq!(app.page, Page::Behavior); + form(&mut app, Event::Submit); + assert!(app.behavior.has_pending()); + assert_eq!(app.document.bundle(), &bundle); + assert!(!app.document.can_undo()); + form(&mut app, Event::Name("Recovered message".into())); + form(&mut app, Event::Submit); + assert!(!app.behavior.has_pending()); + assert_eq!(app.project().named(app.selected), "Recovered message"); + let _ = app.update(Message::Undo); + assert_eq!(app.document.bundle(), &bundle); + assert!(!app.document.can_undo()); + } +} + +#[cfg(test)] +mod behavior_lifecycle_tests; +mod process_canvas; +mod state_diagram; +#[cfg(test)] +mod state_diagram_tests; + +#[derive(Debug, Clone)] +pub enum LoadedSnapshot { + Source(DiskProject), + Legacy(PathBuf, Box, Arc<[u8]>), +} +#[derive(Debug, Clone)] +pub struct FileSnapshot { + pub document: Id, + pub revision: u64, + pub snapshot: Arc, + pub disk: Option, + pub path: PathBuf, +} + +#[derive(Debug, Clone)] +pub struct SaveFailure { + pub document: Id, + pub message: String, + pub recovery: Option, +} + +#[derive(Debug, Clone)] +pub struct RecoverySnapshot { + pub target: PathBuf, + /// Recovery already succeeded even when reloading its files fails. + pub disk: Result, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Page { + Home, + Diagram, + Catalog, + Behavior, + Data, + Traces, + Text, + Validation, + Guide, +} +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Choice { + pub id: Id, + pub label: String, +} +impl std::fmt::Display for Choice { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&self.label) + } +} +#[derive(Debug, Clone, Copy)] +pub enum Pending { + Recent, + Recover(Id), + HostedOpen, + New, + Demo, + Walkthrough, + Open, + Close(window::Id), +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum FileOperation { + Open, + Save, + Export, +} +pub struct FilePrompt { + pub operation: FileOperation, + pub path: String, + pub overwrite: bool, +} + +#[derive(Debug, Clone)] +pub enum Message { + Architecture(architecture_authoring::Event), + Home(crate::home::Event), + CheckpointTick, + CheckpointWritten(Id, Result<(), String>), + CheckpointLoaded(Result, String>), + Hosted(crate::hosted::Event), + PortAnchor(crate::port_edit::Event), + Connection(crate::connection_edit::Event), + Menu(crate::model_menu::Event), + CreateContextElement(Kind, bool), + SourceTree(crate::source_tree::Event), + SourceTreeCollapse, + SourceTreeLocate, + ExactStrings(bool), + Page(Page), + Guide(crate::guide::Event), + Traceability(crate::views::traceability::Event), + Behavior(crate::behavior::Event), + Layer(Layer), + Select(Id), + EditProperties(Id), + SelectNode(Id), + SelectProject, + Search(String), + StartTransition, + StartSemanticReview(Id), + Workflow(crate::workflow::Event), + CollapseExplorer(Id), + ExplorerGroup(crate::explorer::Group), + ExplorerCollapseAll, + ExplorerLocate, + Explore(Option), + BrowseGroup(crate::explorer::Group), + ExplorerPage(usize), + CreateKind(Kind), + Data(crate::data_view::Event), + Add(bool), + AddRelation, + PortAction(crate::port_workflow::Action), + AddRelationKind(RelationKind, bool), + InspectorTab(crate::navigation::InspectorTab), + RevealInDiagram(Id, Id), + AddDiagram, + DuplicateDiagram(Id), + AddArtifact, + AddTrace, + Field(String, String), + FieldText(String, text_editor::Action), + FieldShape(String, Value), + FieldAppend(String, Value), + FieldValuePath(String, crate::data_values::FieldPathKey), + FieldValueBrowse(String, Option, usize), + FieldReferenceBrowse(String, String, usize), + FieldVariant(String, Value), + FieldArray(String, Option, i32), + Apply, + RevertProperties, + ElementKind(Kind), + RelationKind(RelationKind), + Command(Command), + Delete, + ConfirmDelete, + CancelDelete, + Undo, + Redo, + Diagram(Choice), + Projection(ProjectionKind), + BehaviorOwner(Choice), + BehaviorDiagram(Choice), + StateDiagram(crate::behavior::state_edit::Event), + ScenarioCanvas(crate::behavior::scenario::CanvasEvent), + TopologyCanvas(crate::behavior::topology::CanvasEvent), + PlaceSelected, + HideSelected, + ToggleCollapse, + MoveNode(Id, Position), + Route(crate::route_edit::Event), + Zoom(f32), + Pan(iced::Vector), + Fit, + SourceEdit(text_editor::Action), + ApplySource, + RevertSource, + SourceUndo, + SourceRedo, + SourceFile(String), + SourceNewPath(String), + SourceCreateFile, + SourceCloseFile(String), + SourceLoadIncludes, + SourceRecover, + SourceRecovered(Result), + IncludesLoaded(u64, Result), + Lint(u64), + Linted(u64, Result, String>), + SourceDiagnostic(usize), + SourceRelated(SourceLocation), + SourceViewport(Option), + SourceSymbols( + crate::source_navigation::SymbolContext, + crate::source_navigation::SymbolEvent, + ), + SourceSymbolsReady(crate::source_navigation::Completion), + SourceForSelection, + SourceNavigation(crate::source_navigation::Event), + Save(bool), + SavePath(Option), + Saved(Result, SaveFailure>), + Loaded(Result, String>), + Request(Pending), + Discard, + Cancel, + SaveAndContinue, + FilePath(String), + SubmitFile, + CancelFile, + Export, + Exported(Result), + WindowResized(iced::Size), + CanvasResized(iced::Size), + ShortcutUndo(bool), + Escape, +} + +pub struct App { + pub home: crate::home::State, + pub recovery: crate::recovery::State, + recent_target: Option, + checkpoint_close: Option, + pub hosted: crate::hosted::State, + pub connection: Option, + pub model_menu: Option, + pub source_tree: crate::source_tree::State, + menu_sequence: u64, + pub canvas_document: Id, + pub canvas_epoch: u64, + pub selected_bend: Option<(Id, usize)>, + pub exact_strings: bool, + pub document: Document, + pub page: Page, + /// Home resumes this page; explicit Architecture navigation remains separate. + last_workspace_page: Page, + pub guide: crate::guide::State, + pub traceability: crate::views::traceability::State, + pub behavior: crate::behavior::State, + pub data_state: crate::data_view::State, + pub inspector_tab: crate::navigation::InspectorTab, + pub layer: Layer, + pub selected: Id, + pub selected_node: Option, + pub draft: Option, + pub active_diagram: Option, + pub search: String, + pub create_kind: Kind, + pub architecture: Option, + pub architecture_palette_expanded: bool, + pub status: String, + pub busy: bool, + pub pending: Option, + pub delete_pending: bool, + pub path: Option, + /// A disk transaction requiring an explicit action, independent of lint. + pub pending_recovery: Option, + disk_project: Option, + pub file_prompt: Option, + continue_after_save: bool, + pub zoom: f32, + pub pan: iced::Vector, + pub window_size: iced::Size, + canvas_size: Option, + fit_to_view: bool, + pub source_editor: text_editor::Content, + pub source_workspace: Workspace, + pub source_snapshot: Arc, + pub source_diagnostics: Vec, + pub source_jump: Option, + source_select_line: bool, + pub source_navigation: crate::source_navigation::State, + pub source_symbols: crate::source_navigation::SymbolState, + pub model_issues: Vec, + pub migration: Option, + source_version: u64, + lint_running: Option, + lint_requested: Option, + pub explorer_collapsed: BTreeSet, + pub explorer_groups_collapsed: BTreeSet, + pub explorer_index: crate::explorer::Index, + pub explorer_focus: Option, + pub explorer_group: Option, + pub explorer_page: usize, + pub workflow: Option, +} + +impl App { + pub fn new() -> Self { + let mut app = Self::with_project(Project::empty()); + app.home = crate::home::State::load_default(); + app.recovery = crate::recovery::State::load_default(); + app.page = Page::Home; + app.status = "Create a model, open a project or explore the example.".into(); + app.fit(); + app + } + pub fn with_project(project: Project) -> Self { + let document = Document::from_project(project.clone(), LIMITS) + .expect("Application models are valid source projects"); + let source_workspace = Workspace::new(document.bundle(), true); + let source = source_workspace.text().to_owned(); + let model_issues = validate(&project); + let selected = project.id; + let populated = |layer| { + project.elements.values().any(|e| e.layer() == layer) + || project.diagrams.values().any(|d| d.layer == layer) + }; + let layer = if !populated(Layer::Oa) && populated(Layer::Sa) { + Layer::Sa + } else { + Layer::Oa + }; + let active_diagram = project + .diagrams + .values() + .filter(|d| d.layer == layer) + .min_by_key(|d| (d.projection != ProjectionKind::Allocation, d.id)) + .map(|d| d.id); + let draft = Draft::from_project(&project, selected); + let explorer_index = crate::explorer::Index::new(&project, layer); + let explorer_collapsed = project.elements.values().filter_map(|e| e.parent).collect(); + let mut app = Self { + home: Default::default(), + recovery: Default::default(), + recent_target: None, + checkpoint_close: None, + connection: None, + model_menu: None, + source_tree: Default::default(), + menu_sequence: 0, + canvas_document: Id::new_v4(), + canvas_epoch: 0, + selected_bend: None, + exact_strings: false, + document, + page: Page::Diagram, + last_workspace_page: Page::Diagram, + guide: crate::guide::State::default(), + traceability: Default::default(), + behavior: Default::default(), + data_state: Default::default(), + inspector_tab: Default::default(), + layer, + selected, + selected_node: None, + draft, + active_diagram, + search: String::new(), + architecture: None, + architecture_palette_expanded: false, + create_kind: if layer == Layer::Sa { + Kind::Function + } else { + Kind::Activity + }, + status: "Coastal rescue example · explore both engineering perspectives".into(), + hosted: Default::default(), + busy: false, + pending: None, + delete_pending: false, + path: None, + pending_recovery: None, + disk_project: None, + file_prompt: None, + continue_after_save: false, + zoom: 0.65, + pan: iced::Vector::new(24., 48.), + window_size: iced::Size::new(1440., 900.), + canvas_size: None, + fit_to_view: true, + source_editor: text_editor::Content::with_text(&source), + source_workspace, + source_snapshot: Arc::from(source), + source_diagnostics: vec![], + source_jump: None, + source_select_line: false, + source_navigation: crate::source_navigation::State::default(), + source_symbols: crate::source_navigation::SymbolState::default(), + model_issues, + migration: None, + source_version: 0, + lint_running: None, + lint_requested: None, + explorer_collapsed, + explorer_groups_collapsed: BTreeSet::new(), + explorer_index, + explorer_focus: None, + explorer_group: None, + explorer_page: 0, + workflow: None, + }; + app.route_state_diagram_workspace(); + app.last_workspace_page = app.page; + app + } + pub fn project(&self) -> &Project { + self.document.project() + } + pub fn title(&self) -> String { + format!( + "{}{} — Arcadia Studio", + self.project() + .name + .split_whitespace() + .collect::>() + .join(" "), + if self.dirty() { " *" } else { "" } + ) + } + pub fn source_dirty(&self) -> bool { + self.source_workspace.dirty() + } + pub fn draft_dirty(&self) -> bool { + self.draft.as_ref().is_some_and(Draft::dirty) + } + pub fn dirty(&self) -> bool { + self.document.dirty() + || self.architecture.is_some() + || self.workflow.is_some() + || self.draft_dirty() + || self.source_dirty() + || self.behavior.has_pending() + } + fn sync_source(&mut self) { + self.source_workspace.accept(self.document.bundle()); + self.show_source_file(false); + self.source_diagnostics = self.document.compiled().diagnostics.clone(); + self.source_version += 1; + self.lint_requested = None; + } + fn show_source_file(&mut self, restore_cursor: bool) { + self.source_symbols.reveal = None; + self.source_tree.reveal(&self.source_workspace.active); + self.source_select_line = false; + let source = self.source_workspace.text().to_owned(); + self.source_navigation.refresh(&source); + self.source_editor = text_editor::Content::with_text(&source); + self.source_snapshot = Arc::from(source); + self.source_jump = restore_cursor + .then(|| { + self.source_workspace + .files + .get(&self.source_workspace.active) + .map(|b| b.cursor) + }) + .flatten(); + if let Some(cursor) = self.source_jump { + self.queue_source_reveal(cursor, false); + } + } + fn selected_architecture_placement(&self) -> Option { + self.active_diagram + .and_then(|id| self.project().diagrams.get(&id)) + .and_then(|d| { + d.nodes + .values() + .find(|n| n.id == self.selected || n.element == self.selected) + }) + .map(|n| n.id) + } + fn refresh_draft(&mut self) { + self.selected_node = if self.page == Page::Behavior { + None + } else { + self.selected_architecture_placement() + }; + if let Some(context) = self.state_context() { + self.behavior.diagram.placement = self.project().diagrams[&context.diagram] + .nodes + .values() + .find(|n| n.id == self.selected || n.element == self.selected) + .map(|n| n.id); + } + self.draft = Draft::from_project(self.project(), self.selected); + if self.exact_strings + && let Some(d) = &mut self.draft + { + let _ = d.set_exact(true); + } + } + fn sync(&mut self) { + self.explorer_index = crate::explorer::Index::new(self.project(), self.layer); + self.model_issues = validate(self.project()); + self.normalize_creation(); + if !self.project().contains(self.selected) { + self.selected = self.project().id; + self.selected_node = None; + } + if let Some(focus) = self.explorer_focus { + self.explorer_group = self.explorer_index.group(focus); + if self.explorer_group.is_none() { + self.explorer_focus = None; + } + } + self.reveal_explorer_selection(); + if self.active_diagram.is_none_or(|id| { + self.project() + .diagrams + .get(&id) + .is_none_or(|d| d.layer != self.layer) + }) { + self.active_diagram = self + .project() + .diagrams + .values() + .filter(|d| d.layer == self.layer) + .min_by_key(|d| (d.projection != ProjectionKind::Allocation, d.id)) + .map(|d| d.id); + } + self.refresh_draft(); + self.sync_source(); + } + fn normalize_creation(&mut self) { + if !self.create_kind.supports(self.layer) { + self.create_kind = if self.layer == Layer::Oa { + Kind::Activity + } else { + Kind::Function + }; + } + } + pub fn apply_source(&mut self) -> bool { + if self.behavior.has_pending() { + self.status = + "Apply or cancel the behavior form before applying source changes.".into(); + return false; + } + if !self.source_dirty() { + return true; + } + if self.draft_dirty() { + self.status = "Property and source drafts both exist. Revert one draft before applying the other; both are retained.".into(); + return false; + } + match source_workspace::compile(&self.source_workspace.bundle()) { + Ok(compiled) => { + match self.document.apply_compiled(compiled) { + Ok(_) => { + self.sync(); + self.status = if self.source_workspace.detached_dirty() { "Reachable files applied. Reattach or revert detached drafts before saving." } else { "All source files applied as one model change" }.into(); + true + } + Err(e) => { + self.status = e.to_string(); + false + } + } + } + Err(issues) => { + self.source_diagnostics = issues; + self.status = "Source contains errors. Your draft is preserved.".into(); + self.page = Page::Text; + false + } + } + } + pub fn apply(&mut self) -> bool { + if self.behavior.has_pending() { + self.status = "Apply or cancel the behavior form before changing the model.".into(); + return false; + } + if self.source_dirty() { + self.status = + "Apply all source drafts or revert them before changing the model.".into(); + return false; + } + if !self.draft_dirty() { + return true; + } + let original = self.selected; + let result = self + .draft + .as_ref() + .ok_or("No selection.".to_string()) + .and_then(|d| Ok((d.command()?, d.resulting_id()?))); + match result.and_then(|(command, id)| { + self.document + .execute(crate::port_edit::repair_owner_change( + self.document.project(), + command, + )) + .map(|_| id) + .map_err(|e| e.to_string()) + }) { + Ok(id) => { + if self.active_diagram == Some(original) { + self.active_diagram = Some(id); + } + if self.behavior.active_owner == Some(original) { + self.behavior.active_owner = Some(id); + } + if self.behavior.diagram.diagram == Some(original) { + self.behavior.diagram.diagram = Some(id); + } + if self.selected_node == Some(original) { + self.selected_node = Some(id); + } + if self.explorer_collapsed.remove(&original) { + self.explorer_collapsed.insert(id); + } + self.selected = id; + if let Some(layer) = self.project().layer_of(id) { + self.layer = layer; + } + if let Some((diagram, layer, node)) = self + .project() + .diagrams + .values() + .find(|d| d.id == id || d.nodes.contains_key(&id)) + .map(|d| (d.id, d.layer, d.nodes.contains_key(&id).then_some(id))) + { + self.layer = layer; + if self.page == Page::Behavior + && let Some(machine) = + self.project().diagrams[&diagram].projection.state_machine() + { + self.behavior.active_owner = Some(machine); + self.behavior.diagram.diagram = Some(diagram); + self.behavior.diagram.placement = node; + } else { + self.active_diagram = Some(diagram); + self.selected_node = node; + } + } + self.sync(); + self.status = "Properties applied".into(); + true + } + Err(e) => { + self.status = e; + false + } + } + } + fn execute(&mut self, command: Command) -> bool { + let command = crate::port_edit::repair_owner_change(self.project(), command); + let created = self.behavior.creation.created_by(self.project(), &command); + let scenario_selection = self + .behavior + .scenario + .created_selection(self.project(), &command) + .or_else(|| { + self.behavior + .topology + .created_selection(self.project(), &command) + }); + match self.document.execute(command) { + Ok(selected) => { + if let Some(created) = created { + self.layer = created.layer; + self.selected = created.behavior; + self.selected_node = None; + self.behavior.active_owner = Some(created.behavior); + self.behavior.diagram = behavior::state_view::State::default(); + self.behavior.diagram.diagram = created.diagram; + self.page = Page::Behavior; + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } else if let Some(id) = scenario_selection.or(selected) { + self.selected = id; + } + self.sync(); + self.status = "Model updated".into(); + true + } + Err(e) => { + self.status = e.to_string(); + false + } + } + } + fn apply_behavior(&mut self) -> bool { + if !self.behavior.has_pending() { + return true; + } + if self.source_dirty() || self.draft_dirty() { + self.status = "Property, source and behavior drafts are retained. Revert the other drafts before applying the behavior form.".into(); + return false; + } + match self.behavior.prepare_pending(self.project()) { + Ok(Some(command)) => { + if self.execute(command) { + self.behavior.acknowledge_commit(); + true + } else { + false + } + } + Ok(None) => true, + Err(error) => { + self.status = error; + false + } + } + } + fn reset(&mut self, project: Project, path: Option) { + self.retire_checkpoint(); + let home = std::mem::take(&mut self.home); + let recovery = std::mem::take(&mut self.recovery); + let window_size = self.window_size; + let canvas_size = self.canvas_size; + let source_version = self.source_version + 1; + let lint_running = self.lint_running; + let navigation_in_flight = self.source_symbols.in_flight; + let guide = std::mem::take(&mut self.guide); + let mut hosted = std::mem::take(&mut self.hosted); + hosted.leave_document(); + *self = Self::with_project(project); + self.home = home; + self.recovery = recovery; + self.hosted = hosted; + self.window_size = window_size; + self.canvas_size = canvas_size; + self.source_version = source_version; + self.lint_running = lint_running; + self.source_symbols.in_flight = navigation_in_flight; + self.guide = guide; + self.path = path; + self.status = "Project ready".into(); + self.fit(); + } + fn diagram_for(&self, layer: Layer, element: Id) -> Option { + preferred_diagram(self.project(), self.active_diagram, layer, element) + } + /// Navigation after an accepted review is not another model operation. + /// Callers retain their workspace policy; keep an already visible target's + /// camera and never leave an old-layer diagram behind after counterpart focus. + fn focus_after_review(&mut self, target: Id, destination: Option) -> bool { + if !self.project().contains(target) { + return false; + } + let previous = (self.layer, self.active_diagram); + self.selected = target; + self.selected_node = None; + if let Some(layer) = self.project().layer_of(target) { + let retained = self.active_diagram.filter(|id| { + self.project().diagrams.get(id).is_some_and(|d| { + d.layer == layer + && (d.nodes.values().any(|n| n.element == target) + || self.project().elements.get(&target).is_some_and(|e| { + e.kind() == Kind::Port + && project_view(self.project(), *id) + .ports + .iter() + .any(|port| port.element == target) + })) + }) + }); + self.layer = layer; + self.active_diagram = destination + .filter(|id| { + self.project() + .diagrams + .get(id) + .is_some_and(|d| d.layer == layer) + }) + .or(retained) + .or_else(|| self.diagram_for(layer, target)); + } + self.refresh_draft(); + previous != (self.layer, self.active_diagram) + } + fn select(&mut self, id: Id) { + if self.selected == id { + return; + } + if !self.apply() { + return; + } + if !self.project().contains(id) { + return; + } + let previous_state_view = self.state_view_identity(); + self.selected = id; + self.selected_node = None; + if let Some(layer) = self.project().layer_of(id) + && layer != self.layer + { + self.layer = layer; + self.active_diagram = self.diagram_for(layer, id); + self.fit(); + } + if self.page == Page::Behavior + && let Some(owner) = crate::behavior::selected_behavior(self.project(), id) + { + self.behavior.active_owner = Some(owner); + } + if self.reset_state_view_after_navigation(previous_state_view) + && self.page == Page::Behavior + { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + self.refresh_draft(); + } + fn reveal_explorer_selection(&mut self) { + if let Some(group) = self.explorer_index.group(self.selected) { + self.explorer_groups_collapsed.remove(&group); + for id in self.explorer_index.ancestry(self.selected) { + if id != self.selected { + self.explorer_collapsed.remove(&id); + } + } + } + if self + .explorer_focus + .is_some_and(|id| !self.project().elements.contains_key(&id)) + { + self.explorer_focus = None; + } + } + pub fn view(&self) -> Element<'_, Message> { + let base = crate::context_menu::Popup::new( + crate::views::view(self), + crate::model_menu::popup(self), + ) + .into(); + crate::source_navigation::interaction::observe( + crate::hosted::view::overlay(self, base), + self.source_symbols.raw_interaction.clone(), + ) + } + pub fn subscription(&self) -> Subscription { + Subscription::batch([ + iced::time::every(std::time::Duration::from_secs(10)).map(|_| Message::CheckpointTick), + window::close_requests().map(|id| Message::Request(Pending::Close(id))), + window::resize_events().map(|(_, size)| Message::WindowResized(size)), + architecture_authoring::subscription(self), + // Use one captured-Escape bridge: a focused Find input consumes + // Escape, while modal priority remains in the ordinary handler. + behavior::creation::subscription( + self.behavior.creation.has_pending() + || self.behavior.source_active() + || (self.page == Page::Text + && self.source_symbols.open + && self.architecture.is_none()), + ) + .map(|()| Message::Escape), + iced::event::listen_with(|event, status, _| { + let iced::Event::Keyboard(keyboard::Event::KeyPressed { + key, + modifiers: mods, + .. + }) = event + else { + return None; + }; + if key == keyboard::Key::Named(keyboard::key::Named::Escape) { + if status == iced::event::Status::Captured { + return None; + } + return Some(Message::Escape); + } + if key == keyboard::Key::Named(keyboard::key::Named::F1) { + return Some(Message::Page(Page::Guide)); + } + if key == keyboard::Key::Named(keyboard::key::Named::F3) { + return Some(Message::SourceNavigation( + crate::source_navigation::Event::Next(mods.shift()), + )); + } + if !mods.command() { + return None; + } + match key.as_ref() { + keyboard::Key::Character("s") => Some(Message::Save(mods.shift())), + keyboard::Key::Character("o") => Some(Message::Request(Pending::Open)), + keyboard::Key::Character("n") => Some(Message::Request(Pending::New)), + keyboard::Key::Character("z") => Some(Message::ShortcutUndo(mods.shift())), + keyboard::Key::Character("y") => Some(Message::ShortcutUndo(true)), + keyboard::Key::Character("f") => Some(Message::SourceNavigation( + crate::source_navigation::Event::Open(false), + )), + keyboard::Key::Character("g") => Some(Message::SourceNavigation( + crate::source_navigation::Event::Open(true), + )), + _ => None, + } + }), + ]) + } + pub fn update(&mut self, message: Message) -> Task { + if let Message::SourceSymbols(context, _) = &message + && (context.session != self.source_workspace.session() + || context.path != self.source_workspace.active) + { + return Task::none(); + } + // Internal results and geometry do not constitute a new user intent. + // Process query completion even behind a modal to release its worker slot; + // its handler independently refuses navigation outside the live editor. + if let Message::SourceSymbolsReady(completion) = message { + return self.source_symbols_ready(completion); + } + if !matches!( + &message, + Message::CheckpointTick + | Message::CheckpointWritten(..) + | Message::Lint(_) + | Message::Linted(..) + | Message::SourceViewport(_) + | Message::WindowResized(_) + | Message::CanvasResized(_) + ) { + self.source_interaction(); + } + if matches!(&message, Message::Connection(_)) + && self + .architecture + .as_ref() + .is_some_and(architecture_authoring::State::unnamed_tool) + { + self.architecture = None; + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + // Named placement owns input. Passive geometry/checkpoints continue; + // navigation and close retain raw input until explicit completion/cancel. + if self.architecture.is_some() { + if matches!(message, Message::Escape) { + return self.architecture_event(architecture_authoring::Event::Cancel); + } + let placing = self.architecture.as_ref().is_some_and(|s| s.saved.placing); + if !matches!( + &message, + Message::Architecture(_) + | Message::CheckpointTick + | Message::CheckpointWritten(..) + | Message::Lint(_) + | Message::Linted(..) + | Message::WindowResized(_) + | Message::CanvasResized(_) + ) && !(placing && matches!(&message, Message::Pan(_) | Message::Zoom(_))) + { + self.status = "Finish placing this element or Cancel (Esc) before leaving. Your name is retained.".into(); + return Task::none(); + } + } + // Scrollable geometry can change while async work or an overlay blocks + // commands. Keep the observed translation current; its passive handler + // still validates document, scenario and revision before accepting it. + if matches!( + &message, + Message::ScenarioCanvas( + crate::behavior::scenario::CanvasEvent::Scrolled(..) + | crate::behavior::scenario::CanvasEvent::Restored(..) + | crate::behavior::scenario::CanvasEvent::Viewport(..) + ) | Message::TopologyCanvas( + crate::behavior::topology::CanvasEvent::Scrolled(..) + | crate::behavior::topology::CanvasEvent::Viewport(..) + ) + ) { + return self.handle(message); + } + // Global subscriptions also receive keys consumed by an overlay. + if self.model_menu.is_some() && matches!(message, Message::Escape) { + self.model_menu = None; + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + return Task::none(); + } + if self.model_menu.is_some() + && !matches!( + message, + Message::Menu(_) + | Message::CheckpointWritten(..) + | Message::CheckpointLoaded(..) + | Message::CheckpointTick + | Message::WindowResized(_) + | Message::CanvasResized(_) + | Message::Lint(_) + | Message::Linted(_, _) + | Message::SourceViewport(_) + | Message::Request(Pending::Close(_)) + ) + { + return Task::none(); + } + if matches!( + message, + Message::WindowResized(_) | Message::Request(Pending::Close(_)) + ) { + self.model_menu = None; + } + if (self.source_dirty() || self.behavior.has_pending()) + && matches!( + message, + Message::Field(..) + | Message::FieldText(..) + | Message::FieldShape(..) + | Message::FieldAppend(..) + | Message::FieldValuePath(..) + | Message::FieldVariant(..) + | Message::FieldArray(..) + | Message::ElementKind(_) + | Message::RelationKind(_) + ) + { + self.status = + "Apply or cancel pending source and behavior drafts before editing properties." + .into(); + return Task::none(); + } + if self.busy + && !matches!( + message, + Message::CheckpointWritten(..) + | Message::CheckpointLoaded(..) + | Message::Saved(_) + | Message::Hosted(crate::hosted::Event::Completed(..)) + | Message::Loaded(_) + | Message::IncludesLoaded(_, _) + | Message::SavePath(_) + | Message::SourceRecovered(_) + | Message::Linted(_, _) + | Message::Exported(_) + | Message::WindowResized(_) + | Message::CanvasResized(_) + | Message::SourceViewport(_) + ) + { + return Task::none(); + } + // A modal owns input until it is dismissed. This also protects against + // global shortcuts and controls that were focused before it opened. + if matches!( + message, + Message::Escape | Message::Request(Pending::Close(_)) + ) { + if self.hosted.visible { + self.hosted.visible = false; + return Task::none(); + } + if self.workflow.take().is_some() { + return Task::none(); + } + if self.file_prompt.take().is_some() { + self.continue_after_save = false; + return Task::none(); + } + if self.delete_pending { + self.delete_pending = false; + return Task::none(); + } + if self.pending.take().is_some() { + self.continue_after_save = false; + return Task::none(); + } + } + let modal_event = matches!( + message, + Message::CheckpointWritten(..) + | Message::CheckpointTick + | Message::CheckpointLoaded(..) + | Message::WindowResized(_) + | Message::CanvasResized(_) + | Message::SourceViewport(_) + | Message::Lint(_) + | Message::Linted(_, _) + | Message::Saved(_) + | Message::Hosted(crate::hosted::Event::Completed(..)) + | Message::Loaded(_) + | Message::IncludesLoaded(_, _) + | Message::SavePath(_) + | Message::SourceRecovered(_) + | Message::Exported(_) + ); + if !modal_event + && ((self.hosted.visible && !matches!(message, Message::Hosted(_))) + || (self.workflow.is_some() && !matches!(message, Message::Workflow(_))) + || (self.file_prompt.is_some() + && !matches!( + message, + Message::FilePath(_) | Message::SubmitFile | Message::CancelFile + )) + || (self.delete_pending + && !matches!(message, Message::ConfirmDelete | Message::CancelDelete)) + || (self.pending.is_some() + && self.file_prompt.is_none() + && !matches!( + message, + Message::Cancel | Message::Discard | Message::SaveAndContinue + ))) + { + return Task::none(); + } + if matches!( + message, + Message::Page(_) | Message::Layer(_) | Message::Diagram(_) + ) { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + self.selected_bend = None; + } + if self.behavior.has_pending() + && matches!( + message, + Message::Page(page) if page != Page::Behavior + ) + { + self.status = "Apply or cancel the behavior form before leaving this view.".into(); + return Task::none(); + } + if self.behavior.has_pending() + && matches!( + message, + Message::BrowseGroup(_) + | Message::SourceEdit(_) + | Message::SourceCreateFile + | Message::SourceCloseFile(_) + | Message::SourceUndo + | Message::SourceRedo + | Message::SourceRecover + | Message::SourceLoadIncludes + | Message::Menu(_) + | Message::Connection(_) + | Message::PortAnchor(_) + | Message::Route(_) + ) + { + self.status = "Apply or cancel the behavior form before changing another view.".into(); + return Task::none(); + } + let previous = self.selected; + let previous_layer = self.layer; + let entering_catalog = + self.page != Page::Catalog && matches!(message, Message::Page(Page::Catalog)); + if self.page != Page::Home { + self.last_workspace_page = self.page; + } + let mut task = self.handle(message); + self.route_state_diagram_workspace(); + if self.page != Page::Home { + self.last_workspace_page = self.page; + } + if let Some(context) = self.topology_context() { + self.behavior + .topology + .enter(context.document, context.owner); + } + if let Some(context) = self.scenario_context() { + self.behavior + .scenario + .enter(context.document, context.scenario); + } + if self.connection.as_ref().is_some_and(|session| { + Some(session.context) != self.route_context() + || self.page != Page::Diagram + || self.draft_dirty() + || self.source_dirty() + }) { + self.connection = None; + } + if previous_layer != self.layer { + self.data_state = Default::default(); + self.explorer_index = crate::explorer::Index::new(self.project(), self.layer); + self.explorer_focus = None; + self.explorer_group = None; + self.explorer_page = 0; + task = task.chain(Task::batch(["model-explorer", "model-browser"].map(|id| { + iced::widget::operation::snap_to( + id, + iced::widget::scrollable::RelativeOffset::START, + ) + }))); + } + self.normalize_creation(); + if self.page == Page::Catalog && (self.selected != previous || entering_catalog) { + self.explorer_focus = self + .project() + .elements + .get(&self.selected) + .filter(|element| element.layer() == self.layer) + .map(|element| element.id); + self.explorer_group = self.explorer_index.group(self.selected); + self.explorer_page = 0; + } + if self.selected != previous { + self.reveal_explorer_selection(); + task.chain(iced::widget::operation::snap_to( + "inspector", + iced::widget::scrollable::RelativeOffset::START, + )) + } else { + task + } + } + pub(crate) fn scenario_context(&self) -> Option { + let scenario = crate::behavior::selected_owner(self)?; + (self.page == Page::Behavior + && self.project().elements.get(&scenario)?.kind() == Kind::Scenario) + .then_some(crate::behavior::scenario::Context { + document: self.canvas_document, + scenario, + revision: self.document.revision(), + epoch: self.canvas_epoch, + }) + } + fn handle(&mut self, message: Message) -> Task { + match message { + Message::Architecture(event) => return self.architecture_event(event), + Message::Home(event) => return self.home_event(event), + Message::CheckpointTick => return self.checkpoint_tick(), + Message::CheckpointWritten(id, result) => { + self.checkpoint_written(id, result); + if let Some(window) = self.checkpoint_close.take() { + self.retire_checkpoint(); + return window::close(window); + } + } + Message::CheckpointLoaded(result) => return self.checkpoint_loaded(result), + Message::Hosted(event) => return self.hosted_event(event), + Message::ScenarioCanvas(event) => { + use crate::behavior::scenario::{self, CanvasEvent}; + let context = event.context(); + if let CanvasEvent::Viewport(_, size) = event { + if self.scenario_context().is_some_and(|current| { + current.document == context.document + && current.scenario == context.scenario + && current.revision == context.revision + }) && self.behavior.scenario.viewport(size) + { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + return Task::none(); + } + if let CanvasEvent::Restored(_, token, area, offset) = event { + if self.scenario_context().is_some_and(|current| { + current.document == context.document && current.scenario == context.scenario + }) && self + .behavior + .scenario + .restored(context, token, area, offset) + { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + return Task::none(); + } + if let CanvasEvent::Scrolled(_, area, offset) = event { + // Canvas and outline notifications may come from the + // same frame. Accept both across the first epoch bump, + // while still rejecting another owner/document/revision. + if self.scenario_context().is_some_and(|current| { + current.document == context.document + && current.scenario == context.scenario + && current.revision == context.revision + }) && self.behavior.scenario.scrolled(area, offset) + { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + return Task::none(); + } + if self.scenario_context() != Some(context) { + return Task::none(); + } + match event { + CanvasEvent::Focus(_) => { + self.behavior.scenario.toggle_focus(); + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + CanvasEvent::Shelf(_, shelf) => { + self.behavior.scenario.toggle_shelf(shelf); + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + CanvasEvent::Zoom(_, scale) => { + if self.behavior.scenario.zoom(scale) { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + } + CanvasEvent::OpenUse(_, occurrence) => { + if self.behavior.has_pending() || self.draft_dirty() || self.source_dirty() + { + self.status = "Apply or cancel pending edits before opening a referenced scenario.".into(); + return Task::none(); + } + let mut state = std::mem::take(&mut self.behavior.scenario); + let target = state.open_use(self.project(), context, occurrence); + self.behavior.scenario = state; + match target { + Ok(target) => { + // A command can preselect this target while the + // caller remains visible, bypassing select below. + self.behavior.active_owner = Some(target); + self.select(target); + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + Err(error) => self.status = error, + } + } + CanvasEvent::Back(_) => { + if self.behavior.has_pending() || self.draft_dirty() || self.source_dirty() + { + self.status = + "Apply or cancel pending edits before returning to the caller." + .into(); + return Task::none(); + } + let mut state = std::mem::take(&mut self.behavior.scenario); + let caller = state.back(self.project(), context); + self.behavior.scenario = state; + if let Some(caller) = caller { + // A command may already have selected this UUID while + // leaving the referenced definition open. select's + // same-UUID fast path must not keep that old owner. + self.behavior.active_owner = Some(caller.owner); + self.select(caller.occurrence); + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + if let Some(context) = self.scenario_context() { + self.behavior.scenario.restore_caller(context, caller); + } + } else { + // An edit can select a retargeted caller outside the + // definition that remains visible after rejected Back. + if crate::behavior::selected_behavior(self.project(), self.selected) + != Some(context.scenario) + { + self.select(context.scenario); + } + self.status = + "The calling scenario reference is no longer available.".into(); + } + } + CanvasEvent::Select(_, id) => { + if !self.behavior.has_pending() + && crate::behavior::selected_behavior(self.project(), id) + == Some(context.scenario) + { + self.select(id); + self.selected_node = None; + } + } + CanvasEvent::Choose(_, tool) => { + if self.behavior.has_pending() || self.draft_dirty() || self.source_dirty() + { + self.status = + "Apply or cancel pending edits before choosing a scenario tool." + .into(); + return Task::none(); + } + self.behavior.scenario.choose_tool(context.scenario, tool); + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + mutation => { + if self.behavior.has_pending() || self.draft_dirty() || self.source_dirty() + { + self.status = + "Apply or cancel pending edits before changing the scenario." + .into(); + return Task::none(); + } + match mutation { + CanvasEvent::First(_, tool) => { + let empty = match tool { + scenario::Tool::Lifeline => !self + .project() + .children(context.scenario) + .any(|e| e.kind() == Kind::Lifeline), + scenario::Tool::Message | scenario::Tool::Action => { + self.project() + .children(context.scenario) + .any(|e| e.kind() == Kind::Lifeline) + && !self + .project() + .children(context.scenario) + .any(|e| e.kind() == Kind::Occurrence) + } + _ => false, + }; + if !empty { + self.status="This scenario already has content. Use its current authoring tools.".into(); + return Task::none(); + } + let mut state = std::mem::take(&mut self.behavior.scenario); + let result = state.update( + self.project(), + scenario::Event::Start(context.scenario, tool), + ); + self.behavior.scenario = state; + if let Err(error) = result { + self.status = error; + } + } + CanvasEvent::BeginOccurrence { + tool, + slot, + lifeline, + .. + } => { + let mut state = std::mem::take(&mut self.behavior.scenario); + let result = state.begin_occurrence( + self.project(), + context, + tool, + slot, + lifeline, + ); + self.behavior.scenario = state; + match result { + Ok(()) => { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + self.status = "Complete the selected behavior at the highlighted sequence position.".into(); + } + Err(error) => self.status = error, + } + } + CanvasEvent::Begin { + slot, + sender, + receiver, + style, + .. + } => { + let mut state = std::mem::take(&mut self.behavior.scenario); + let result = state.begin_message( + self.project(), + context, + slot, + sender, + receiver, + style, + ); + self.behavior.scenario = state; + match result { + Ok(()) => { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + self.status = "Choose the message exchange and apply at the highlighted sequence position.".into(); + } + Err(error) => self.status = error, + } + } + CanvasEvent::Reorder { + occurrence, slot, .. + } => { + match scenario::reorder( + self.project(), + context.scenario, + occurrence, + slot, + ) { + Ok(command) => { + if self.execute(command) { + self.selected = occurrence; + self.selected_node = None; + self.refresh_draft(); + self.status = "Occurrence reordered within its sequence · Undo restores the previous order".into(); + } + } + Err(error) => self.status = error, + } + } + _ => unreachable!(), + } + } + } + } + Message::TopologyCanvas(event) => return self.edit_process_canvas(event), + Message::StateDiagram(event) => return self.edit_state_diagram(event), + Message::BehaviorOwner(choice) => { + if self.apply() + && self.project().elements.get(&choice.id).is_some_and(|e| { + e.layer() == self.layer + && (e.kind().is_sequence() || e.kind() == Kind::StateMachine) + }) + { + self.behavior.active_owner = Some(choice.id); + self.behavior.diagram = Default::default(); + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + self.select(choice.id); + self.page = Page::Behavior; + } + } + Message::BehaviorDiagram(choice) => { + if self.apply() + && let Some(owner) = crate::behavior::selected_owner(self) + && self + .project() + .diagrams + .get(&choice.id) + .is_some_and(|d| d.projection.state_machine() == Some(owner)) + { + self.behavior.diagram.diagram = Some(choice.id); + self.behavior.diagram.tool = crate::behavior::state_edit::Tool::Select; + self.behavior.diagram.fit = true; + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + self.fit_state_diagram(); + } + } + Message::PortAnchor(event) => { + use crate::port_edit::Event; + let (captured, node, port, command) = match event { + Event::Commit(c, node, anchor) => ( + c, + node, + anchor.port, + Command::SetPortAnchor { + diagram: c.diagram, + node, + anchor, + }, + ), + Event::Reset(c, node, port) => ( + c, + node, + port, + Command::RemovePortAnchor { + diagram: c.diagram, + node, + port, + }, + ), + }; + if self.route_context() != Some(captured) + || self.page != Page::Diagram + || self.draft_dirty() + || self.source_dirty() + || self.connection.is_some() + { + return Task::none(); + } + let view = project_view(self.project(), captured.diagram); + if !view + .ports + .iter() + .any(|p| p.element == port && p.owner == node) + { + return Task::none(); + } + if self.execute(command) { + self.selected_node = None; + self.status = "Port position updated in this diagram · Undo restores its previous position".into(); + } + } + Message::Connection(event) => self.edit_connection(event), + Message::SourceTree(event) => match event { + crate::source_tree::Event::ToggleFolder(path) => self.source_tree.toggle(&path), + crate::source_tree::Event::OpenFile(path) => { + return self.update(Message::SourceFile(path)); + } + crate::source_tree::Event::FileMenu(path, anchor) => { + let mut request = crate::model_menu::Request::object(self.project().id, anchor); + request.source_file = Some(path); + return self.update(Message::Menu(crate::model_menu::Event::Open(request))); + } + }, + Message::SourceTreeCollapse => self.source_tree.collapse_all(), + Message::SourceTreeLocate => { + self.source_tree.reveal(&self.source_workspace.active); + return iced::widget::operation::scroll_to( + "source-files", + crate::source_tree::active_offset( + &self.source_workspace, + &self.source_diagnostics, + &self.source_tree, + ), + ); + } + Message::Menu(crate::model_menu::Event::Open(request)) => { + // Validate the originating canvas before advancing its input + // epoch. Actions are then generated with the refreshed context, + // while pointer history hidden behind the menu becomes stale. + let Some(opened) = crate::model_menu::Opened::new( + self, + request, + self.menu_sequence.wrapping_add(1), + ) else { + return Task::none(); + }; + self.connection = None; + self.menu_sequence = opened.token; + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + let mut request = opened.request; + if request.canvas.is_some() { + request.canvas = if self.page == Page::Behavior { + self.state_context() + } else { + self.route_context() + }; + } + self.model_menu = crate::model_menu::Opened::new(self, request, self.menu_sequence); + } + Message::Menu(crate::model_menu::Event::Close) => { + if self.model_menu.take().is_some() { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + } + Message::Menu(crate::model_menu::Event::Invoke(token, action)) => { + if self + .model_menu + .as_ref() + .is_none_or(|menu| menu.token != token) + { + return Task::none(); + } + let Some(menu) = self.model_menu.take() else { + return Task::none(); + }; + if menu.token != token || !menu.valid(self) { + return Task::none(); + } + if menu.request.source_file.is_some() { + return self.update(*action); + } + if self.draft_dirty() || self.source_dirty() { + self.status = + "Apply or revert pending edits before using modeling actions.".into(); + return Task::none(); + } + self.select(menu.request.object); + self.selected_node = menu.request.placement; + self.selected_bend = menu.request.bend.map(|i| (menu.request.object, i)); + return self.update(*action); + } + Message::CreateContextElement(kind, child) => { + self.create_kind = kind; + return self.update(Message::Add(child)); + } + Message::Escape => { + if self.behavior.source_back() { + self.status = + "Returned to the unchanged parent form; no source was created.".into(); + return Task::none(); + } + if self.behavior.source_active() { + self.behavior.acknowledge_commit(); + self.status = "Behavior form cancelled; no staged source was created.".into(); + } else if self.behavior.creation.has_pending() { + self.behavior.creation.acknowledge_commit(); + self.status = "Behavior creation cancelled".into(); + } + if self.connection.take().is_some() { + self.status = "Drawing cancelled · Select / move is active".into(); + } + self.source_navigation.open = false; + self.source_symbols.open = false; + self.source_symbols.results = None; + self.source_symbols.notice = None; + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + self.selected_bend = None; + } + Message::Guide(event) => { + if self.guide.update(event) { + return iced::widget::operation::snap_to( + crate::guide::ARTICLE_SCROLL_ID, + iced::widget::scrollable::RelativeOffset::START, + ); + } + } + Message::ExactStrings(enabled) => { + if let Some(d) = &mut self.draft { + match d.set_exact(enabled) { + Ok(()) => self.exact_strings = enabled, + Err(e) => self.status = e, + } + } + } + Message::Field(path, value) => { + if let Some(d) = &mut self.draft { + d.input(&path, value) + } + } + Message::FieldText(path, action) => { + if let Some(d) = &mut self.draft { + d.edit_text(&path, action) + } + } + Message::FieldShape(path, value) => { + if let Some(d) = &mut self.draft + && let Err(e) = d.shape(&path, value) + { + self.status = e; + } + } + Message::FieldAppend(path, value) => { + if let Some(draft) = &mut self.draft + && let Err(error) = draft.append(&path, value) + { + self.status = error; + } + } + Message::FieldValueBrowse(path, scope, page) => { + if let Some(draft) = &mut self.draft + && draft + .value + .pointer(&path) + .is_some_and(|row| row.get("expression").is_some()) + { + draft + .value_browsers + .insert(path, crate::forms::ValueBrowser { scope, page }); + } + } + Message::FieldReferenceBrowse(path, query, page) => { + if let Some(draft) = &mut self.draft { + let page = if draft + .reference_browsers + .get(&path) + .is_some_and(|b| b.query == query) + { + page + } else { + 0 + }; + draft + .reference_browsers + .insert(path, crate::forms::ReferenceBrowser { query, page }); + } + } + Message::FieldValuePath(path, key) => { + if let Some(draft) = &mut self.draft + && let Err(error) = draft.value_path(&path, key) + { + self.status = error; + } + } + Message::FieldVariant(path, value) => { + if let Some(d) = &mut self.draft { + let result = d.materialize().and_then(|current| { + if current + .pointer(&path) + .is_some_and(|v| crate::forms::same_variant(v, &value)) + { + Ok(()) + } else { + d.shape(&path, value) + } + }); + if let Err(e) = result { + self.status = e; + } + } + } + Message::FieldArray(path, index, direction) => { + if let Some(d) = &mut self.draft + && let Err(e) = d.array(&path, index, direction) + { + self.status = e; + } + } + Message::Apply => { + self.apply(); + } + Message::RevertProperties => { + self.refresh_draft(); + self.status = "Property draft reverted".into(); + } + Message::Select(id) => self.select(id), + Message::EditProperties(id) => { + self.select(id); + self.inspector_tab = crate::navigation::InspectorTab::Properties; + } + Message::SelectProject => self.select(self.project().id), + Message::SelectNode(id) => { + if (self.selected_node == Some(id) + && self.active_diagram + .and_then(|diagram| self.project().diagrams.get(&diagram)) + .and_then(|diagram| diagram.nodes.get(&id)) + .is_some_and(|node| self.selected == node.element)) + // Defer a placement draft until release: it may change the + // identity captured by the just-started canvas gesture. + || (self.selected == id && self.draft.as_ref().is_some_and(Draft::dirty)) + { + return Task::none(); + } + let original = self.selected; + if !self.apply() { + return Task::none(); + } + let id = if id == original { self.selected } else { id }; + if let Some(d) = self + .active_diagram + .and_then(|d| self.project().diagrams.get(&d)) + && let Some(node) = d.nodes.get(&id) + { + self.selected = node.element; + self.selected_node = Some(id); + self.refresh_draft(); + } + } + Message::Traceability(event) => { + self.traceability.update(event); + return iced::widget::operation::snap_to( + "traceability-list", + iced::widget::scrollable::RelativeOffset::START, + ); + } + Message::Search(value) => { + self.search = value; + self.explorer_page = 0; + return Task::batch(["model-browser", "model-explorer"].map(|id| { + iced::widget::operation::snap_to( + id, + iced::widget::scrollable::RelativeOffset::START, + ) + })); + } + Message::Page(page) => { + if page != Page::Text || !self.draft_dirty() || self.apply() { + if page == Page::Diagram + && self.active_diagram.is_some_and(|id| { + self.project() + .diagrams + .get(&id) + .is_some_and(|d| d.projection.state_machine().is_some()) + }) + { + // Architecture remains reachable from a state workspace. + // Its picker can still open a saved state view explicitly. + self.active_diagram = self + .project() + .diagrams + .values() + .filter(|d| { + d.layer == self.layer && d.projection.state_machine().is_none() + }) + .min_by_key(|d| (d.projection != ProjectionKind::Allocation, d.id)) + .map(|d| d.id); + self.fit(); + } + if page == Page::Behavior && self.page != Page::Behavior { + let previous_state_view = self.state_view_identity(); + if let Some(owner) = + crate::behavior::selected_behavior(self.project(), self.selected) + { + self.behavior.active_owner = Some(owner); + } + self.behavior.active_owner = crate::behavior::selected_owner(self); + self.reset_state_view_after_navigation(previous_state_view); + } + self.page = page; + self.selected_node = if page == Page::Behavior { + None + } else { + self.selected_architecture_placement() + }; + if page == Page::Text { + return self.request_lint(); + } + } + } + Message::CollapseExplorer(id) => { + if !self.explorer_collapsed.remove(&id) { + self.explorer_collapsed.insert(id); + } + } + Message::ExplorerGroup(group) => { + if !self.explorer_groups_collapsed.remove(&group) { + self.explorer_groups_collapsed.insert(group); + } + } + Message::ExplorerCollapseAll => { + self.explorer_collapsed = self + .project() + .elements + .values() + .filter_map(|e| e.parent) + .collect(); + self.explorer_groups_collapsed = crate::explorer::Group::ALL.into_iter().collect(); + self.search.clear(); + return iced::widget::operation::snap_to( + "model-explorer", + iced::widget::scrollable::RelativeOffset::START, + ); + } + Message::ExplorerLocate => { + self.search.clear(); + self.reveal_explorer_selection(); + let offset = crate::explorer_view::selection_offset(self); + return iced::widget::operation::scroll_to("model-explorer", offset); + } + Message::Explore(id) => { + if self.apply() { + self.explorer_focus = id.filter(|id| self.project().elements.contains_key(id)); + self.explorer_group = self + .explorer_focus + .and_then(|id| self.explorer_index.group(id)); + self.search.clear(); + self.explorer_page = 0; + self.page = Page::Catalog; + self.select(self.explorer_focus.unwrap_or(self.project().id)); + return iced::widget::operation::snap_to( + "model-browser", + iced::widget::scrollable::RelativeOffset::START, + ); + } + } + Message::BrowseGroup(group) => { + self.explorer_focus = None; + self.explorer_group = Some(group); + self.search.clear(); + self.explorer_page = 0; + self.page = Page::Catalog; + return iced::widget::operation::snap_to( + "model-browser", + iced::widget::scrollable::RelativeOffset::START, + ); + } + Message::ExplorerPage(page) => { + self.explorer_page = page; + return iced::widget::operation::snap_to( + "model-browser", + iced::widget::scrollable::RelativeOffset::START, + ); + } + Message::StartTransition => { + if self.apply() { + match crate::workflow::Workflow::transition(self.project(), self.selected) { + Ok(w) => self.workflow = Some(w), + Err(e) => self.status = e, + } + } + } + Message::StartSemanticReview(selected) => { + if self.apply() { + match crate::semantic_review::State::new(self.project(), selected) { + Ok(state) => { + self.workflow = + Some(crate::workflow::Workflow::Semantic(Box::new(state))) + } + Err(error) => self.status = error, + } + } + } + Message::Workflow(event) => { + if matches!(event, crate::workflow::Event::Cancel) { + self.workflow = None; + return Task::none(); + } + if let Some(mut workflow) = self.workflow.take() { + if let crate::workflow::Workflow::Semantic(state) = &mut workflow { + match event { + crate::workflow::Event::Semantic(event) => { + state.update(self.project(), event) + } + crate::workflow::Event::Apply => { + let focus = state.target(self.project()); + match state.command(self.project()) { + Ok(command) => { + if self.execute(command) { + if let Some(target) = focus + && self.focus_after_review(target, None) + && self.page == Page::Diagram + { + self.fit(); + } + self.status = "Semantic review applied · model, source and baseline form one undoable change".into(); + return Task::none(); + } + state.error = Some(self.status.clone()); + } + Err(error) => { + self.status = error.clone(); + state.error = Some(error); + } + } + } + _ => {} + } + self.workflow = Some(workflow); + return Task::none(); + } + let stay_in_catalog = self.page == Page::Catalog + && matches!(&workflow, crate::workflow::Workflow::Ports(_)); + let transition_focus = match &workflow { + crate::workflow::Workflow::Ports(state) => Some(state.focus()), + crate::workflow::Workflow::Transition(t) => t + .request + .sources + .first() + .and_then(|source| t.plan.changes.iter().find(|c| c.source == *source)) + .map(|c| c.target), + _ => None, + }; + let behavior_transition = matches!(&workflow, + crate::workflow::Workflow::Transition(t) + if t.request.sources.first().is_some_and(|source| + crate::behavior::selected_behavior(self.project(), *source).is_some())); + let previous_behavior_context = self.state_view_identity(); + let requested_destination = match &workflow { + crate::workflow::Workflow::Transition(t) => t.request.destination_diagram, + _ => None, + }; + match workflow.update(self.project(), event) { + Ok(Some(mut candidate)) => { + let focus = transition_focus + .or_else(|| { + candidate + .relations + .keys() + .find(|id| !self.project().relations.contains_key(id)) + .copied() + }) + .or_else(|| { + candidate + .traces + .keys() + .find(|id| !self.project().traces.contains_key(id)) + .copied() + }); + let behavior_owner = focus + .filter(|_| behavior_transition) + .and_then(|id| crate::behavior::selected_behavior(&candidate, id)); + let destination = focus.and_then(|id| { + candidate.layer_of(id).and_then(|layer| { + requested_destination + .filter(|view| { + candidate.diagrams.get(view).is_some_and(|d| { + (d.layer == layer + || d.projection == ProjectionKind::Traceability) + && d.nodes + .values() + .any(|node| node.element == id) + }) + }) + .or_else(|| { + preferred_diagram( + &candidate, + self.active_diagram, + layer, + id, + ) + }) + }) + }); + if let (None, Some(id), Some(diagram)) = + (behavior_owner, focus, destination) + { + reveal_port_owner(&mut candidate, diagram, id); + } + if self.execute(Command::Replace(candidate)) { + if let Some(id) = focus { + self.focus_after_review(id, destination); + } + if let Some(owner) = behavior_owner { + self.selected_node = None; + self.behavior.active_owner = Some(owner); + self.page = Page::Behavior; + if self.reset_state_view_after_navigation( + previous_behavior_context, + ) { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + } else if !stay_in_catalog { + self.page = Page::Diagram; + self.fit(); + } + self.status="Reviewed change applied · Undo restores the complete operation".into(); + } else { + self.workflow = Some(workflow); + } + } + Ok(None) => self.workflow = Some(workflow), + Err(e) => { + self.status = e; + self.workflow = Some(workflow); + } + } + } + } + Message::Layer(layer) => { + if self.apply() { + let previous_state_view = self.state_view_identity(); + self.layer = layer; + self.create_kind = if layer == Layer::Oa { + Kind::Activity + } else { + Kind::Function + }; + self.active_diagram = self + .project() + .diagrams + .values() + .filter(|d| d.layer == layer) + .min_by_key(|d| (d.projection != ProjectionKind::Allocation, d.id)) + .map(|d| d.id); + self.selected = self.project().id; + self.selected_node = None; + self.behavior.active_owner = crate::behavior::selected_owner(self); + self.reset_state_view_after_navigation(previous_state_view); + self.refresh_draft(); + self.fit(); + } + } + Message::Data(event) => { + if self.data_state.update(&event) { + return Task::none(); + } + if self.apply() { + match crate::data_view::command(self.project(), self.layer, event) { + Ok(command) => { + self.execute(command); + } + Err(error) => self.status = error, + } + } + } + Message::CreateKind(kind) => self.create_kind = kind, + Message::Add(child) => { + if self.apply() { + self.add_element(child); + } + } + Message::ElementKind(kind) => { + if let Some(d) = &mut self.draft { + let result = d + .materialize() + .and_then(|v| { + serde_json::from_value::(v).map_err(|e| e.to_string()) + }) + .and_then(|element| { + if element.kind() == kind { + return Ok(()); + } + let body = ElementBody::new(kind, element.layer()) + .ok_or("Kind is unavailable in this layer.")?; + d.shape("/body", json!(body)) + }); + if let Err(e) = result { + self.status = e; + } + } + } + Message::RelationKind(kind) => { + if let Some(d) = &mut self.draft { + let result = d + .materialize() + .and_then(|v| { + serde_json::from_value::(v).map_err(|e| e.to_string()) + }) + .and_then(|relation| { + if relation.kind() == kind { + return Ok(()); + } + d.shape( + "/body", + json!(RelationBody::new( + kind, + relation.source(), + relation.target() + )), + ) + }); + if let Err(e) = result { + self.status = e; + } + } + } + Message::AddRelation => { + if self.apply() { + self.add_relation(); + } + } + Message::PortAction(action) => { + if self.apply() { + match crate::port_workflow::State::new(self.project(), self.selected, action) { + Ok(state) => { + self.inspector_tab = crate::navigation::InspectorTab::Properties; + self.workflow = Some(crate::workflow::Workflow::Ports(Box::new(state))) + } + Err(error) => self.status = error, + } + } + } + Message::AddRelationKind(kind, incoming) => { + if self.apply() { + self.workflow = Some(crate::workflow::Workflow::relationship_kind( + self.project(), + self.selected, + self.layer, + kind, + incoming, + )); + } + } + Message::InspectorTab(tab) => self.inspector_tab = tab, + Message::Behavior(event) => { + if matches!(&event, behavior::Event::Creation(behavior::creation::Event::Open(layer)) if *layer != self.layer) + { + self.status = + "The active layer changed. Choose New in the current layer.".into(); + return Task::none(); + } + let creating = matches!( + &event, + behavior::Event::Creation(behavior::creation::Event::Open(..)) + ); + let focus_name = matches!( + &event, + behavior::Event::Creation(behavior::creation::Event::Choose(..)) + ); + if creating + && (self.behavior.has_pending() || self.source_dirty() || self.draft_dirty()) + { + self.status = "Apply or cancel the current draft before starting a new behavior. Your inputs are retained.".into(); + return Task::none(); + } + if (event.starts_form() || (event.is_source() && !event.is_source_back())) + && (self.source_dirty() || self.draft_dirty()) + { + self.status="Apply or cancel the other editors before starting this form. Your inputs are retained.".into(); + return Task::none(); + } + let source_was_open = self.behavior.source_open(); + if event.is_submit() && (self.source_dirty() || self.draft_dirty()) { + self.status = "Revert the other drafts before applying the behavior form. Your inputs are retained.".into(); + return Task::none(); + } + let mut state = std::mem::take(&mut self.behavior); + let result = state.update(self.project(), event); + self.behavior = state; + match result { + Ok(Some(command)) => { + if self.execute(command) { + self.behavior.acknowledge_commit(); + if self.topology_context().is_some() { + return self.reveal_process_selection(); + } + } + } + Ok(None) => { + if !source_was_open && self.behavior.source_open() { + return iced::widget::operation::focus( + behavior::source_draft::NAME_INPUT, + ); + } + if focus_name { + return iced::widget::operation::focus(behavior::creation::NAME_INPUT); + } + } + Err(error) => self.status = error, + } + } + Message::RevealInDiagram(diagram, selected) => { + let original = self.selected; + if !self.apply() { + return Task::none(); + } + let selected = if selected == original { + self.selected + } else { + selected + }; + let Some(view) = self.project().diagrams.get(&diagram) else { + return Task::none(); + }; + let layer = view.layer; + let endpoints = self + .project() + .relations + .get(&selected) + .map(|r| vec![r.source(), r.target()]) + .unwrap_or_else(|| vec![selected]) + .into_iter() + .map(|id| { + self.project() + .elements + .get(&id) + .filter(|e| e.kind() == Kind::Port) + .and_then(|e| e.parent) + .unwrap_or(id) + }) + .collect::>(); + let nodes = view + .nodes + .values() + .filter(|n| endpoints.contains(&n.element) || n.id == selected) + .map(|n| n.id) + .collect::>(); + let commands = view + .nodes + .values() + .filter(|n| { + n.collapsed && { + let children = oa_core::projection::descendant_nodes( + self.project(), + diagram, + n.id, + ); + nodes.iter().any(|id| children.contains(id)) + } + }) + .map(|n| { + let mut node = n.clone(); + node.collapsed = false; + Command::EditNode { + diagram, + original: node.id, + node, + } + }) + .collect::>(); + if !commands.is_empty() && !self.execute(Command::Batch(commands)) { + return Task::none(); + } + self.active_diagram = Some(diagram); + self.layer = layer; + self.selected = selected; + self.page = Page::Diagram; + self.refresh_draft(); + self.fit(); + } + Message::AddDiagram => { + if self.apply() { + let id = Id::new_v4(); + let p = self.project(); + let d = Diagram { + id, + alias: p.fresh_alias(&format!("{}_view", self.layer), "view", id), + name: format!("{} architecture", self.layer), + description: String::new(), + layer: self.layer, + projection: ProjectionKind::Allocation, + routes: Vec::new(), + view_options: Default::default(), + nodes: Default::default(), + }; + if self.execute(Command::CreateDiagram(d)) { + self.active_diagram = Some(id); + self.page = Page::Diagram; + } + } + } + Message::DuplicateDiagram(source) => { + if !self.project().diagrams.contains_key(&source) { + self.status = "The saved view to duplicate no longer exists.".into(); + return Task::none(); + } + let original = self.selected; + if self.apply() { + let source = if source == original { + self.selected + } else { + source + }; + match crate::view_copy::command(self.project(), source) { + Ok(command) => { + if self.execute(command) { + self.active_diagram = Some(self.selected); + self.layer = self.project().diagrams[&self.selected].layer; + self.selected_node = None; + self.selected_bend = None; + self.page = Page::Diagram; + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + self.route_state_diagram_workspace(); + if self.page == Page::Diagram { + self.fit(); + } + self.status = + "View copied; engineering elements are shared.".into(); + } + } + Err(error) => self.status = error, + } + } + } + Message::AddArtifact => { + if self.apply() { + let id = Id::new_v4(); + let p = self.project(); + let a = ArtifactLink { + id, + alias: p.fresh_alias("artifact", "artifact", id), + name: "Development artifact".into(), + description: String::new(), + owner: self.selected, + relation: ArtifactRelation::References, + uri: "./artifacts/design.md".into(), + revision: None, + fragment: None, + }; + self.execute(Command::CreateArtifact(a)); + } + } + Message::AddTrace => { + if self.apply() { + self.add_trace(); + } + } + Message::Command(command) => { + let semantic_selection = match &command { + Command::EditNode { diagram, node, .. } + if self.state_context().is_some_and(|c| c.diagram == *diagram) => + { + Some(node.element) + } + _ => None, + }; + let original = self.selected; + if self.apply() { + let command = match command { + Command::Layout(id) if id == original => Command::Layout(self.selected), + Command::MoveStep(id, from, to) if id == original => { + Command::MoveStep(self.selected, from, to) + } + command => command, + }; + if self.execute(command) + && let Some(element) = semantic_selection + { + self.selected = element; + self.refresh_draft(); + } + } + } + Message::Delete => { + if self.selected != self.project().id && self.apply() { + self.delete_pending = true; + } + } + Message::ConfirmDelete => { + if !self.delete_pending || self.behavior.has_pending() { + return Task::none(); + } + self.delete_pending = false; + self.execute(Command::Delete(self.selected)); + } + Message::CancelDelete => self.delete_pending = false, + Message::Undo | Message::Redo => { + let redo = matches!(message, Message::Redo); + if self.apply() { + let changed = if redo { + self.document.redo() + } else { + self.document.undo() + }; + if changed { + self.sync(); + } + self.status = if !changed && redo { + "Nothing to redo" + } else if !changed { + "Nothing to undo" + } else if redo { + "Model change redone" + } else { + "Model change undone" + } + .into(); + } + } + Message::ShortcutUndo(redo) => { + return self.handle(if self.page == Page::Text { + if redo { + Message::SourceRedo + } else { + Message::SourceUndo + } + } else if redo { + Message::Redo + } else { + Message::Undo + }); + } + Message::Diagram(choice) => { + // Reject a stale picker event before applying unrelated property input. + if !self.project().diagrams.contains_key(&choice.id) { + self.status = "Diagram no longer exists.".into(); + return Task::none(); + } + let previous_diagram = self.active_diagram; + let follow_view = previous_diagram == Some(self.selected); + if self.apply() { + // Apply may have changed the current diagram's UUID. A picker + // event for that same view must follow its new identity. + let diagram = if previous_diagram == Some(choice.id) { + self.active_diagram.unwrap_or(choice.id) + } else { + choice.id + }; + self.active_diagram = Some(diagram); + if let Some(d) = self.project().diagrams.get(&diagram) { + self.layer = d.layer; + } + if follow_view { + self.selected = diagram; + } + self.selected_node = None; + self.refresh_draft(); + self.fit(); + } + } + Message::Projection(projection) => { + if self.apply() + && let Some(mut d) = self + .active_diagram + .and_then(|id| self.project().diagrams.get(&id)) + .cloned() + { + d.projection = projection; + self.execute(Command::EditDiagram(d.id, d)); + self.fit(); + } + } + Message::PlaceSelected => { + if self.apply() + && let Some(diagram) = self.active_diagram + { + let selected = self.selected; + if let Some(node) = self + .project() + .diagrams + .get(&diagram) + .and_then(|d| d.nodes.values().find(|n| n.element == self.selected)) + .map(|n| n.id) + { + self.selected_node = Some(node); + self.status = "Element is already shown in this diagram".into(); + return self.handle(Message::RevealInDiagram(diagram, selected)); + } + let mut p = self.project().clone(); + let node = p.place(diagram, self.selected, Position { x: 60., y: 60. }); + if let Some(n) = p + .diagrams + .get(&diagram) + .and_then(|d| d.nodes.get(&node)) + .cloned() + { + let mut commands = vec![Command::CreateNode { diagram, node: n }]; + for owner in p.diagrams[&diagram].nodes.values().filter(|n| { + n.collapsed + && projection::descendant_nodes(&p, diagram, n.id).contains(&node) + }) { + let mut expanded = owner.clone(); + expanded.collapsed = false; + commands.push(Command::EditNode { + diagram, + original: owner.id, + node: expanded, + }); + } + if self.execute(Command::Batch(commands)) { + self.selected_node = Some(node); + return self.handle(Message::RevealInDiagram(diagram, selected)); + } + } + } + } + Message::HideSelected => { + if self.apply() + && let Some(node) = self.selected_node + { + self.execute(Command::Delete(node)); + self.selected_node = None; + } + } + Message::ToggleCollapse => { + if self.apply() + && let Some(diagram) = self.active_diagram + && let Some(mut n) = self + .selected_node + .and_then(|id| self.project().diagrams.get(&diagram)?.nodes.get(&id)) + .cloned() + { + n.collapsed = !n.collapsed; + let selected = self.selected; + if self.execute(Command::EditNode { + diagram, + original: n.id, + node: n, + }) { + self.selected = selected; + self.refresh_draft(); + } + } + } + Message::Route(event) => self.edit_route(event), + Message::MoveNode(node, position) => { + let original = self.selected; + if self.apply() + && let Some(diagram) = self.active_diagram + { + let node = if node == original { + self.selected + } else { + node + }; + if self.execute(Command::MoveNode { + diagram, + node, + position, + with_descendants: true, + }) && let Some(placement) = + self.project().diagrams[&diagram].nodes.get(&node) + { + // A drag edits a placement, but the canvas still selects + // the engineering element represented by that placement. + self.selected = placement.element; + self.refresh_draft(); + } + } + } + Message::Zoom(factor) => { + self.fit_to_view = false; + self.zoom = (self.zoom * factor).clamp(0.0001, 3.); + } + Message::Pan(delta) => { + self.fit_to_view = false; + self.pan += delta; + } + Message::Fit => self.fit(), + Message::SourceEdit(action) => { + self.source_jump = None; + let before = self.source_editor.text(); + self.source_editor.perform(action); + let after = self.source_editor.text(); + if after != before { + self.source_navigation.refresh(&after); + self.source_workspace + .edit(after.clone(), self.source_editor.cursor()); + self.source_snapshot = Arc::from(after); + self.source_version += 1; + self.source_diagnostics.clear(); + let version = self.source_version; + return Task::perform( + async move { + tokio::time::sleep(std::time::Duration::from_millis(350)).await; + version + }, + Message::Lint, + ); + } + } + Message::SourceFile(path) => { + if self + .source_workspace + .switch(&path, self.source_editor.cursor()) + { + self.show_source_file(true); + } + } + Message::SourceNewPath(path) => self.source_workspace.new_path = path, + Message::SourceCreateFile => { + if let Err(error) = self.create_source_file() { + self.status = error; + } else { + return self.request_lint(); + } + } + Message::SourceCloseFile(path) => { + if self.source_workspace.discard_detached(&path) { + self.source_version += 1; + self.prune_closed_files(!self.document.dirty()); + self.show_source_file(true); + } + } + Message::SourceLoadIncludes => return self.load_includes(), + Message::SourceRecover => { + if !self.source_workspace.applied && self.source_workspace.has_edits() { + self.status = + "Revert or preserve your source drafts before reloading recovered files." + .into(); + return Task::none(); + } + if let Some(path) = self.pending_recovery.clone() { + self.busy = true; + return Task::perform( + async move { + tokio::task::spawn_blocking(move || recover_snapshot(path)) + .await + .map_err(|e| e.to_string())? + }, + Message::SourceRecovered, + ); + } + } + Message::SourceRecovered(result) => { + self.busy = false; + match result { + Ok(receipt) => { + if self.pending_recovery.as_ref() != Some(&receipt.target) { + return Task::none(); + } + self.pending_recovery = None; + self.source_diagnostics + .retain(|issue| issue.diagnostic.code != "pending_save"); + match receipt.disk { + Ok(disk) if !self.source_workspace.applied => { + self.open_source_project(disk) + } + Ok(disk) => { + // Recovering an old Save As target must not redirect + // the source project that was subsequently saved elsewhere. + if self.path.is_none() + || self.path.as_ref() == Some(&receipt.target) + { + if self.path.as_ref() != Some(&receipt.target) { + self.source_workspace.reset_navigation_session(); + } + self.path = Some(receipt.target); + self.disk_project = Some(disk); + } + self.status = "Interrupted disk save recovered. Current model and drafts are retained; Save all can be retried.".into(); + } + Err(error) => { + self.status = format!( + "Disk recovery completed; files could not be reloaded: {error}" + ) + } + } + } + Err(error) => self.status = error, + } + } + Message::IncludesLoaded(version, result) => { + self.busy = false; + if version == self.source_version { + match result { + Ok(disk) => { + if let Some(target) = recovery_target(&disk) { + self.pending_recovery = Some(target); + } + self.source_workspace + .discovered(&disk.bundle, disk.reachable.clone()); + self.source_version += 1; + self.source_diagnostics = disk.diagnostics.clone(); + self.disk_project = Some(disk); + self.status = "Included files loaded; existing drafts retained.".into(); + return self.request_lint(); + } + Err(error) => self.status = error, + } + } + } + Message::Lint(version) => { + if version == self.source_version { + return self.request_lint(); + } + } + Message::Linted(version, result) => { + if self.lint_running != Some(version) { + return Task::none(); + } + self.lint_running = None; + if version == self.source_version { + match result { + Ok(diagnostics) => self.source_diagnostics = diagnostics, + Err(error) => self.status = format!("Source checks failed: {error}"), + } + } + return self.start_pending_lint(); + } + Message::SourceDiagnostic(index) => { + if let Some(issue) = self.source_diagnostics.get(index) { + self.jump_to_source(SourceLocation { + path: issue.path.clone(), + span: issue.diagnostic.span, + }); + } + } + Message::SourceRelated(location) => self.jump_to_source(location), + Message::SourceViewport(ticket) => return self.source_viewport(ticket), + Message::SourceSymbols(_, event) => return self.source_symbol_event(event), + Message::SourceSymbolsReady(completion) => { + return self.source_symbols_ready(completion); + } + Message::ApplySource => { + self.apply_source(); + } + Message::RevertSource => { + self.source_workspace.revert_active(); + self.show_source_file(true); + self.source_version += 1; + self.status = "This file's draft reverted; other files retained.".into(); + return self.request_lint(); + } + Message::SourceUndo | Message::SourceRedo => { + let redo = matches!(message, Message::SourceRedo); + if self.source_workspace.undo(redo) { + self.show_source_file(true); + self.source_version += 1; + self.source_diagnostics.clear(); + return self.request_lint(); + } + } + Message::SourceForSelection => { + if self.apply() { + self.page = Page::Text; + if let Some(location) = self + .document + .compiled() + .index + .declarations + .get(&self.selected) + .cloned() + { + self.jump_to_source(location); + self.status = "Source declaration selected.".into(); + } + return self.request_lint(); + } + } + Message::SourceNavigation(event) => { + use crate::source_navigation::Event; + match event { + Event::Open(go_to_line) => { + if self.page != Page::Text && !self.apply() { + return Task::none(); + } + self.page = Page::Text; + self.source_navigation.open = true; + self.source_navigation.refresh(&self.source_editor.text()); + return iced::widget::operation::focus(if go_to_line { + "source-line" + } else { + "source-find" + }); + } + Event::Close => self.source_navigation.open = false, + Event::Query(query) => { + self.source_navigation.query = query; + self.source_navigation.refresh(&self.source_editor.text()); + } + Event::Next(backwards) if self.page == Page::Text => { + self.source_jump = self.source_navigation.next(backwards); + if let Some(cursor) = self.source_jump { + self.queue_source_reveal(cursor, false); + } + if self.source_jump.is_none() { + self.status = "No matching source text.".into(); + } + } + Event::Line(line) => self.source_navigation.line = line, + Event::Go => match self + .source_navigation + .destination(self.source_editor.line_count()) + { + Ok(cursor) => { + self.queue_source_reveal(cursor, true); + } + Err(error) => self.status = error, + }, + _ => {} + } + } + Message::Request(pending) => { + if self.dirty() { + self.pending = Some(pending); + } else { + return self.proceed(pending); + } + } + Message::Cancel => { + self.pending = None; + self.continue_after_save = false; + } + Message::Discard => { + if let Some(p) = self.pending.take() { + return self.proceed(p); + } + } + Message::SaveAndContinue => { + self.continue_after_save = true; + return self.handle(Message::Save(false)); + } + Message::Save(save_as) => { + if !save_as && self.hosted.session.is_some() { + return self.save_hosted(); + } + if !self.apply_behavior() || !self.apply_source() || !self.apply() { + self.continue_after_save = false; + self.pending = None; + return Task::none(); + } + if !save_as && let Some(path) = self.path.clone() { + return self.save_to(path); + } + return self.choose_file(FileOperation::Save); + } + Message::SavePath(path) => { + self.busy = false; + if let Some(path) = path { + return self.save_to(path); + } + self.continue_after_save = false; + self.status = "Save cancelled".into(); + } + Message::Saved(result) => { + self.busy = false; + match result { + Ok(Some(receipt)) => { + if receipt.document != self.canvas_document { + return Task::none(); + } + if let Some(disk) = receipt.disk { + if self.pending_recovery.as_ref() + == Some(&disk.root.join(&disk.bundle.entry)) + { + self.pending_recovery = None; + } + if receipt.snapshot.bundle.entry != self.document.bundle().entry { + if receipt.revision != self.document.revision() + || self.source_dirty() + { + self.status = format!( + "Snapshot saved to {}. Newer edits retain the current source location.", + receipt.path.display() + ); + self.continue_after_save = false; + return Task::none(); + } + if let Err(error) = self + .document + .adopt_saved_entry(&receipt.snapshot, receipt.revision) + { + self.status = error.to_string(); + self.continue_after_save = false; + return Task::none(); + } + self.sync_source(); + } + if self.path.as_ref() != Some(&receipt.path) { + self.source_workspace.reset_navigation_session(); + } + self.disk_project = Some(disk); + self.path = Some(receipt.path); + self.hosted.session = None; + self.hosted.review = None; + self.hosted.uncertain = None; + self.document.mark_saved(receipt.snapshot); + self.remember_local(); + if !self.dirty() { + self.retire_checkpoint(); + } + self.prune_closed_files(!self.document.dirty()); + self.status = "All source files saved".into(); + } else { + self.status = format!( + "JSON exported to {}. Source files and their save state are retained.", + receipt.path.display() + ); + self.continue_after_save = false; + } + if self.continue_after_save { + self.continue_after_save = false; + if let Some(p) = self.pending.take() { + return self.proceed(p); + } + } + } + Ok(None) => { + self.status = "Save cancelled".into(); + self.continue_after_save = false; + } + Err(e) => { + if e.document != self.canvas_document { + return Task::none(); + } + if let Some(target) = e.recovery { + self.pending_recovery = Some(target); + } + self.status = e.message; + if self.pending_recovery.is_some() { + self.page = Page::Text; + } + self.continue_after_save = false; + } + } + } + Message::Loaded(result) => { + self.busy = false; + match result { + Ok(Some(LoadedSnapshot::Legacy(path, decoded, _bytes))) => { + self.reset(decoded.project, None); + let name = self.project().name.clone(); + if let Err(error) = self.home.remember(&path, &name) { + self.home.notice = Some(error); + } + self.migration = decoded.migration; + if self.migration.is_some() { + self.status = "Imported earlier schema · review migration details in Model checks before saving".into(); + self.page = Page::Validation; + } else { + self.status = format!( + "Imported {}. Save as an Arcadia source project to retain file structure and comments.", + path.display() + ); + } + } + Ok(Some(LoadedSnapshot::Source(disk))) => self.open_source_project(disk), + Ok(None) => self.status = "Open cancelled".into(), + Err(e) => self.status = e, + } + } + Message::FilePath(value) => { + if let Some(p) = &mut self.file_prompt { + p.path = value; + p.overwrite = false; + } + } + Message::CancelFile => { + self.file_prompt = None; + self.continue_after_save = false; + } + Message::SubmitFile => { + if let Some(prompt) = &mut self.file_prompt { + if prompt.path.trim().is_empty() { + self.status = "Enter a file path.".into(); + return Task::none(); + } + let path = PathBuf::from(prompt.path.trim()); + if prompt.operation == FileOperation::Export + && path.exists() + && !prompt.overwrite + { + prompt.overwrite = true; + return Task::none(); + } + let operation = prompt.operation; + self.file_prompt = None; + return match operation { + FileOperation::Open => self.load_from(path), + FileOperation::Save => self.save_to(path), + FileOperation::Export => self.export_to(path), + }; + } + } + Message::Export => { + if self.apply() { + return self.choose_file(FileOperation::Export); + } + } + Message::Exported(result) => { + self.busy = false; + self.status = match result { + Ok(true) => "Diagram exported as SVG".into(), + Ok(false) => "Export cancelled".into(), + Err(e) => e, + }; + } + Message::WindowResized(size) => { + // The canvas can retain its capped size during a real window + // resize. Invalidate any sequence pointer/slot gesture anyway. + if self.window_size != size + && (self.scenario_context().is_some() || self.topology_context().is_some()) + { + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + } + self.window_size = size; + } + Message::CanvasResized(size) => { + let first_measurement = self.canvas_size.is_none(); + let size_changed = self.canvas_size != Some(size); + self.canvas_size = Some(size); + // Modal overlays can remount the sensor and repeat on_show at + // the same size. Keep the viewport stable after model edits. + if first_measurement || (size_changed && self.fit_to_view) { + self.fit(); + } + } + } + Task::none() + } + fn add_element(&mut self, child: bool) { + if self.create_kind == Kind::Port { + self.status = "Select an SA function or participant, then choose a typed port action in Properties.".into(); + return; + } + let allocated = child + && self.create_kind.is_work() + && self + .project() + .elements + .get(&self.selected) + .is_some_and(|e| e.layer() == self.layer && e.kind().is_performer()); + let parent = if child && !allocated { + Some(self.selected) + } else { + None + }; + let Some(e) = self.project().make_element( + self.create_kind, + self.layer, + &format!("New {}", self.create_kind.label().to_lowercase()), + parent, + ) else { + return; + }; + let id = e.id; + let mut commands = vec![Command::CreateElement(e)]; + let mut diagram_target = self.active_diagram; + let preferred = if self.create_kind.is_work() || self.create_kind.is_performer() { + Some(ProjectionKind::Allocation) + } else if ProjectionKind::Capabilities.includes(self.create_kind) { + Some(ProjectionKind::Capabilities) + } else { + None + }; + if self.page == Page::Diagram + && self + .active_diagram + .and_then(|id| self.project().diagrams.get(&id)) + .is_some_and(|d| !d.projection.includes(self.create_kind)) + && let Some(preferred) = preferred + { + diagram_target = self + .project() + .diagrams + .values() + .find(|d| d.layer == self.layer && d.projection == preferred) + .map(|d| d.id); + if diagram_target.is_none() { + let view = Id::new_v4(); + commands.push(Command::CreateDiagram(Diagram { + id: view, + alias: self.project().fresh_alias("engineering_view", "view", view), + name: format!("{} {preferred}", self.layer), + description: String::new(), + layer: self.layer, + projection: preferred, + routes: Vec::new(), + view_options: Default::default(), + nodes: Default::default(), + })); + diagram_target = Some(view); + } + } + if allocated { + commands.push(Command::Connect( + RelationKind::Allocation, + "Performs".into(), + self.selected, + id, + )); + } + if self.create_kind == Kind::Occurrence + && let Some(owner) = parent.and_then(|id| self.project().elements.get(&id)) + && let Some(steps) = owner.steps() + { + let mut steps = steps.clone(); + steps.push(id); + commands.push(Command::SetSteps(owner.id, steps)); + } + if self.page == Page::Diagram + && self.create_kind != Kind::Port + && let Some(diagram) = diagram_target + && self + .project() + .diagrams + .get(&diagram) + .is_none_or(|d| d.projection.includes(self.create_kind)) + { + let mut p = self.project().clone(); + for command in &commands { + if let Command::CreateDiagram(d) = command { + p.diagrams.insert(d.id, d.clone()); + } + } + p.elements.insert( + id, + match &commands[0] { + Command::CreateElement(e) => e.clone(), + _ => unreachable!(), + }, + ); + let owner = if allocated { + Some(self.selected) + } else { + parent + }; + // Insertion measures an expanded owner path and commits that reveal + // with the new child, so folded contents cannot overlap the new row. + if let Some(owner) = owner { + let mut expanded = p.diagrams[&diagram].clone(); + for node in expanded.nodes.values_mut() { + node.collapsed = false; + } + let expanded_view = oa_core::projection::project_diagram(&p, &expanded); + let mut current = expanded_view + .nodes + .iter() + .find(|n| n.element == owner) + .map(|n| n.id); + while let Some(id) = current { + let node = p + .diagrams + .get_mut(&diagram) + .unwrap() + .nodes + .get_mut(&id) + .unwrap(); + if node.collapsed { + node.collapsed = false; + commands.push(Command::EditNode { + diagram, + original: id, + node: node.clone(), + }); + } + current = expanded_view + .nodes + .iter() + .find(|n| n.id == id) + .and_then(|n| n.visual_parent); + } + } + // Reserve the expanded size of folded child containers so inserting + // a sibling does not overlap their contents when they are unfolded. + let mut expanded = p.diagrams[&diagram].clone(); + for node in expanded.nodes.values_mut() { + node.collapsed = false; + } + let view = oa_core::projection::project_diagram(&p, &expanded); + let position = + if let Some(container) = view.nodes.iter().find(|n| Some(n.element) == owner) { + let y = view + .nodes + .iter() + .filter(|n| n.visual_parent == Some(container.id)) + .map(|n| n.position.y + n.size.height + 16.) + .fold(container.position.y + 64., f32::max); + Position { + x: container.position.x + 24., + y, + } + } else { + Position { + x: view + .nodes + .iter() + .map(|n| n.position.x + n.size.width + 240.) + .fold(60., f32::max), + y: 60., + } + }; + let node = p.place(diagram, id, position); + commands.push(Command::CreateNode { + diagram, + node: p.diagrams[&diagram].nodes[&node].clone(), + }); + } + if self.page == Page::Diagram + && let Some(diagram) = diagram_target + && let Ok(candidate) = execute_batch(self.project(), &commands) + { + commands.extend(crate::diagram::insertion_adjustments( + &candidate, diagram, id, + )); + } + if self.execute(Command::Batch(commands)) { + self.active_diagram = diagram_target; + self.selected = id; + self.inspector_tab = crate::navigation::InspectorTab::Properties; + self.refresh_draft(); + if self.page == Page::Diagram { + self.fit(); + } + self.status = "Element created · enter its engineering name and properties".into(); + } + } + fn add_relation(&mut self) { + self.workflow = Some(crate::workflow::Workflow::relationship( + self.project(), + self.selected, + self.layer, + )); + } + fn add_trace(&mut self) { + match crate::workflow::Workflow::manual_trace(self.project(), self.selected) { + Ok(workflow) => self.workflow = Some(workflow), + Err(e) => self.status = e, + } + } + fn proceed(&mut self, pending: Pending) -> Task { + self.pending = None; + match pending { + Pending::Recent => self + .recent_target + .take() + .map_or_else(Task::none, |path| self.load_from(path)), + Pending::Recover(id) => self.load_checkpoint(id), + Pending::HostedOpen => self.open_hosted(), + Pending::New => { + self.reset(Project::empty(), None); + Task::none() + } + Pending::Demo => { + self.reset(Project::demo(), None); + Task::none() + } + Pending::Walkthrough => match crate::home::walkthrough_path() { + Ok(path) => self.load_from(path), + Err(error) => { + self.status = error; + Task::none() + } + }, + Pending::Open => self.choose_file(FileOperation::Open), + Pending::Close(id) => { + self.retire_checkpoint(); + if self.recovery.writing { + self.checkpoint_close = Some(id); + self.busy = true; + Task::none() + } else { + window::close(id) + } + } + } + } + fn choose_file(&mut self, operation: FileOperation) -> Task { + if cfg!(target_os = "linux") || operation == FileOperation::Export { + self.file_prompt = Some(FilePrompt { + operation, + path: self + .path + .clone() + .unwrap_or_else(|| { + PathBuf::from(if operation == FileOperation::Export { + "architecture.svg" + } else { + "system.arcadia" + }) + }) + .with_extension(if operation == FileOperation::Export { + "svg" + } else { + "arcadia" + }) + .to_string_lossy() + .into_owned(), + overwrite: false, + }); + return Task::none(); + } + self.busy = true; + if operation == FileOperation::Open { + return Task::perform( + async { + let file = rfd::AsyncFileDialog::new() + .add_filter("Arcadia model", &["arcadia", "json"]) + .pick_file() + .await; + match file { + None => Ok(None), + Some(file) => { + let path = file.path().to_path_buf(); + tokio::task::spawn_blocking(move || read_snapshot(path).map(Some)) + .await + .map_err(|e| e.to_string())? + } + } + }, + Message::Loaded, + ); + } + let name = self.source_workspace.entry.clone(); + Task::perform( + async move { + let file = rfd::AsyncFileDialog::new() + .add_filter("Arcadia source", &["arcadia"]) + .add_filter("Model JSON", &["json"]) + .set_file_name(name) + .save_file() + .await; + file.map(|file| file.path().to_path_buf()) + }, + Message::SavePath, + ) + } + fn load_from(&mut self, path: PathBuf) -> Task { + self.busy = true; + Task::perform( + async move { + tokio::task::spawn_blocking(move || read_snapshot(path).map(Some)) + .await + .map_err(|e| e.to_string())? + }, + Message::Loaded, + ) + } + fn save_to(&mut self, path: PathBuf) -> Task { + if !path + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("json")) + { + let result = path + .file_name() + .and_then(|name| name.to_str()) + .ok_or_else(|| "Choose a portable .arcadia entry file name.".to_owned()) + .and_then(|entry| { + self.document + .check_save_entry(entry) + .map_err(|e| e.to_string()) + }); + if let Err(error) = result { + self.status = error; + self.continue_after_save = false; + return Task::none(); + } + } + self.busy = true; + let snapshot = self.document.snapshot(); + let document = self.canvas_document; + let revision = self.document.revision(); + let previous = self.disk_project.clone(); + let failed_target = path.clone(); + Task::perform( + async move { + tokio::task::spawn_blocking(move || { + write_snapshot(document, revision, snapshot, path, previous).map(Some) + }) + .await + .map_err(|e| save_failure(document, &failed_target, e.to_string()))? + }, + Message::Saved, + ) + } + fn export_to(&mut self, path: PathBuf) -> Task { + let Some(diagram) = self.active_diagram else { + self.status = "Create a diagram first.".into(); + return Task::none(); + }; + let svg = crate::diagram::export_svg(self.project(), diagram); + self.busy = true; + Task::perform( + async move { + tokio::task::spawn_blocking(move || { + std::fs::write(path, svg) + .map(|()| true) + .map_err(|e| e.to_string()) + }) + .await + .map_err(|e| e.to_string())? + }, + Message::Exported, + ) + } + pub fn issue_count(&self) -> usize { + self.model_issues.len() + } + + fn open_source_project(&mut self, disk: DiskProject) { + let pending_recovery = recovery_target(&disk); + let path = disk.root.join(&disk.bundle.entry); + let candidate = if !disk + .diagnostics + .iter() + .any(|issue| issue.diagnostic.severity == oa_core::validation::Severity::Error) + { + Document::from_bundle(disk.reachable_bundle(), LIMITS) + } else { + Err(crate::document::DocumentError::Source( + disk.diagnostics.clone(), + )) + }; + match candidate { + Ok(document) => { + self.reset(document.project().clone(), Some(path)); + self.document = document; + self.source_workspace = Workspace::new(self.document.bundle(), true); + self.source_workspace + .discovered(&disk.bundle, disk.reachable.clone()); + self.show_source_file(false); + self.source_diagnostics = self.document.compiled().diagnostics.clone(); + self.migration = self.document.compiled().decoded.migration.clone(); + if self.migration.is_some() { + self.status = "Imported earlier source schema. Review Model checks; Save all explicitly writes the upgraded source while retaining comments and includes.".into(); + self.page = Page::Validation; + } else { + self.status = + "Source project opened. Included files and comments are preserved.".into(); + } + } + Err(error) => { + // Installing a local repair workspace changes its destination, + // even while the last valid graphical model stays visible. A + // failed/cancelled Open that installs nothing retains its binding. + self.hosted.leave_document(); + self.canvas_document = Id::new_v4(); + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + self.path = Some(path); + self.source_workspace = Workspace::new(&disk.bundle, false); + self.source_workspace.set_reachable(disk.reachable.clone()); + self.show_source_file(false); + self.source_diagnostics = error.diagnostics().to_vec(); + self.source_version += 1; + self.lint_requested = None; + self.page = Page::Text; + self.refresh_draft(); + self.status = "Source needs repair. Loaded drafts are retained; the graphical model is unchanged.".into(); + } + } + self.pending_recovery = pending_recovery; + self.disk_project = Some(disk); + if self.source_workspace.applied { + self.remember_local(); + } + } + + fn prune_closed_files(&mut self, prune_expectations: bool) { + if let Some(disk) = &mut self.disk_project { + let retain = |path: &String| { + self.document.bundle().files.contains_key(path) + || self.source_workspace.files.contains_key(path) + }; + disk.bundle.files.retain(|path, _| retain(path)); + if prune_expectations { + disk.expectations.retain(|path, _| retain(path)); + disk.reachable.retain(retain); + } + } + } + + fn jump_to_source(&mut self, location: SourceLocation) { + self.source_workspace + .switch(&location.path, self.source_editor.cursor()); + if self.source_workspace.active != location.path { + self.status = format!( + "{} has not been loaded. Use Load includes or create the missing file.", + location.path + ); + return; + } + self.show_source_file(false); + let source = self.source_workspace.text(); + let mut offset = location.span.start.min(source.len()); + while !source.is_char_boundary(offset) { + offset -= 1; + } + let prefix = &source[..offset]; + let line = prefix.bytes().filter(|b| *b == b'\n').count(); + let column = prefix + .rfind('\n') + .map_or(offset, |start| offset - start - 1); + self.queue_source_reveal( + text_editor::Cursor { + position: text_editor::Position { line, column }, + selection: None, + }, + true, + ); + } + + fn create_source_file(&mut self) -> Result<(), String> { + let path = self.source_workspace.new_path.trim().to_owned(); + if source_project::resolve_include("", &path).as_deref() != Ok(path.as_str()) { + return Err("Use a relative portable path such as sa/functions.arcadia.".into()); + } + if self.source_workspace.files.contains_key(&path) { + return Err("This file is already open.".into()); + } + if self.source_workspace.files.len() >= LIMITS.max_files { + return Err("The project file limit has been reached.".into()); + } + let bundle = self.source_workspace.bundle(); + let already_included = bundle.files.iter().any(|(p, t)| { + source_project::inspect_includes(p, t, p == &bundle.entry, LIMITS) + .is_ok_and(|includes| includes.iter().any(|include| include.target == path)) + }); + let mut changed = bundle.clone(); + if !already_included { + if self.source_dirty() { + return Err( + "Apply current drafts first, or add an include for the new file in the entry." + .into(), + ); + } + let at = self.document.compiled().index.project_body.span.end; + let entry = changed + .files + .get_mut(&changed.entry) + .ok_or("The entry file is missing.")?; + entry.insert_str( + at, + &format!( + "\n include {};\n", + serde_json::to_string(&path).map_err(|e| e.to_string())? + ), + ); + self.source_workspace + .switch(&bundle.entry, self.source_editor.cursor()); + self.source_workspace + .edit(entry.clone(), self.source_editor.cursor()); + } + changed.files.insert(path.clone(), String::new()); + self.source_workspace + .discovered(&changed, changed.files.keys().cloned().collect()); + self.source_workspace + .switch(&path, self.source_editor.cursor()); + self.source_workspace.new_path.clear(); + self.show_source_file(true); + self.source_version += 1; + self.status = "Source file created. Add declarations, then Apply all.".into(); + Ok(()) + } + + fn load_includes(&mut self) -> Task { + let Some(disk) = self.disk_project.clone() else { + self.status = "Save the source project first to establish its include directory. New files can be created here.".into(); + return Task::none(); + }; + let overlays = self.source_workspace.bundle().files; + let version = self.source_version; + self.busy = true; + Task::perform( + async move { + tokio::task::spawn_blocking(move || { + source_files::discover_missing(&disk, &overlays, LIMITS) + .map_err(|e| e.to_string()) + }) + .await + .map_err(|e| e.to_string())? + }, + move |result| Message::IncludesLoaded(version, result), + ) + } + + fn request_lint(&mut self) -> Task { + self.lint_requested = Some(self.source_version); + self.start_pending_lint() + } + + fn start_pending_lint(&mut self) -> Task { + if self.lint_running.is_some() { + return Task::none(); + } + let Some(version) = self.lint_requested.take() else { + return Task::none(); + }; + if version != self.source_version { + return Task::none(); + } + self.lint_running = Some(version); + let source = self.source_workspace.bundle(); + Task::perform( + async move { + tokio::task::spawn_blocking(move || source_workspace::lint(&source)) + .await + .map_err(|error| error.to_string()) + }, + move |result| Message::Linted(version, result), + ) + } + pub fn route_context(&self) -> Option { + Some(crate::route_edit::Context { + document: self.canvas_document, + diagram: self.active_diagram?, + revision: self.document.revision(), + epoch: self.canvas_epoch, + }) + } + fn edit_connection(&mut self, event: crate::connection_edit::Event) { + use crate::connection_edit::{Event, Session}; + let Some(context) = self.route_context() else { + return; + }; + if matches!(event, Event::Choose(None)) { + self.connection = None; + self.status = + "Select · drag elements, ports and connection routes to arrange the diagram".into(); + return; + } + if self.page != Page::Diagram || self.source_dirty() || self.draft_dirty() { + self.status = "Apply or revert pending edits before drawing a connection.".into(); + return; + } + match event { + Event::Begin(tool, source) => { + self.edit_connection(Event::Choose(Some(tool))); + if let Some(context) = self.route_context() { + self.edit_connection(Event::Endpoint(context, source)); + } + } + Event::Choose(Some(tool)) => { + if !crate::connection_tool::Tool::for_layer(self.layer).contains(&tool) { + return; + } + self.canvas_epoch = self.canvas_epoch.wrapping_add(1); + let context = self.route_context().unwrap(); + self.connection = Some(Session::new( + self.project(), + &project_view(self.project(), context.diagram), + context, + tool, + )); + self.selected_bend = None; + self.status = tool.hint().into(); + } + Event::Endpoint(captured, id) => { + if captured != context { + return; + } + let Some(mut session) = self.connection.take() else { + return; + }; + if session.context != context { + return; + } + if !session.candidates.contains(&id) { + self.status = + "Choose a highlighted compatible endpoint · Esc cancels drawing".into(); + self.connection = Some(session); + return; + } + if let Some(source) = session.source { + match session.tool.command(self.project(), source, id) { + Ok(command) => { + if self.execute(command) { + self.selected_node = None; + self.inspector_tab = Default::default(); + self.status = format!( + "{} created · edit its name and carried items in Properties · Undo restores the complete operation", + session.tool.label() + ); + } else { + self.connection = Some(session); + } + } + Err(error) => { + self.status = error.to_string(); + self.connection = Some(session); + } + } + } else { + session.start( + self.project(), + &project_view(self.project(), context.diagram), + id, + ); + self.select(id); + self.status = if session.candidates.is_empty() { + "No compatible targets are visible. Expand containers or show a compatible endpoint in this view; Esc cancels drawing.".into() + } else { + format!( + "From {} · choose a highlighted target · Esc cancels", + self.project().named(id) + ) + }; + self.connection = Some(session); + } + } + Event::Restart(captured) => { + if captured == context + && let Some(session) = &self.connection + { + self.edit_connection(Event::Choose(Some(session.tool))); + } + } + Event::Choose(None) => {} + } + } + fn edit_route(&mut self, event: crate::route_edit::Event) { + use crate::route_edit::{Event, insert_pin, stored_route}; + if self.connection.is_some() { + return; + } + let Some(context) = self.route_context() else { + return; + }; + if self.source_dirty() || self.draft_dirty() { + self.status = "Apply or revert your draft before editing a connection route.".into(); + return; + } + let diagram = &self.project().diagrams[&context.diagram]; + let view = project_view(self.project(), context.diagram); + let Some(projected_edge) = view.edges.iter().find(|e| e.id == self.selected) else { + return; + }; + if projection::edge_endpoint_placements(self.project(), diagram, self.selected).is_some_and( + |(source, target)| source != projected_edge.source || target != projected_edge.target, + ) { + self.status = + "Expand the endpoint containers to edit this connection’s saved route.".into(); + return; + } + let mut route = stored_route(diagram, self.selected); + let mut selected_bend = self + .selected_bend + .filter(|(id, _)| *id == self.selected) + .map(|(_, i)| i); + let command = match event { + Event::SelectBend(id, index) => { + if id == self.selected && index < route.waypoints.len() { + self.selected_bend = Some((id, index)); + } + return; + } + Event::Commit(expected, changed, bend) => { + if expected != context || changed.edge != self.selected { + self.status = + "Route gesture cancelled because the model or view changed.".into(); + return; + } + route = changed; + selected_bend = bend; + Command::SetEdgeRoute { + diagram: context.diagram, + route, + } + } + Event::AddBend | Event::AddBendAt(_) => { + if route.waypoints.len() >= 128 { + return; + } + 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. + let segment = edge + .points + .windows(2) + .enumerate() + .filter(|(index, _)| *index > 0 && index + 2 < edge.points.len()) + .map(|(_, span)| span) + .max_by(|a, b| { + let len = + |s: &[Position]| (s[1].x - s[0].x).abs() + (s[1].y - s[0].y).abs(); + len(a).total_cmp(&len(b)) + }); + let point = if let Event::AddBendAt(point) = event { + if !point.x.is_finite() || !point.y.is_finite() { + return; + } + point + } else if let Some(segment) = segment { + Position { + x: (segment[0].x + segment[1].x) / 2., + y: (segment[0].y + segment[1].y) / 2., + } + } else if let Some(stub) = edge.points.get(1) { + *stub + } else { + return; + }; + selected_bend = Some(insert_pin(&mut route, edge, point)); + Command::SetEdgeRoute { + diagram: context.diagram, + route, + } + } + Event::RemoveBend => { + let Some(index) = selected_bend.filter(|i| *i < route.waypoints.len()) else { + return; + }; + route.waypoints.remove(index); + selected_bend = None; + Command::SetEdgeRoute { + diagram: context.diagram, + route, + } + } + Event::Reset => { + selected_bend = None; + Command::RemoveEdgeRoute { + diagram: context.diagram, + edge: self.selected, + } + } + }; + let selected = self.selected; + if self.execute(command) { + self.selected = selected; + self.selected_bend = selected_bend.map(|index| (selected, index)); + self.refresh_draft(); + self.status = "Connection route updated · Undo restores the previous route".into(); + } + } + pub fn fit(&mut self) { + self.fit_to_view = true; + let view = self + .active_diagram + .map(|id| project_view(self.project(), id)) + .unwrap_or_default(); + if view.nodes.is_empty() { + self.zoom = 1.; + self.pan = iced::Vector::new(30., 30.); + return; + } + let geometry = oa_core::routing::route_diagram( + self.project(), + &self.project().diagrams[&self.active_diagram.unwrap()], + &view, + ); + let left = geometry.bounds.position.x; + let top = geometry.bounds.position.y; + let right = left + geometry.bounds.size.width; + let bottom = top + geometry.bounds.size.height; + let size = self.canvas_size.unwrap_or_else(|| { + iced::Size::new( + self.window_size.width - 230. - 320., + self.window_size.height - 284., + ) + }); + let width = (size.width - 48.).max(1.); + let height = (size.height - 48.).max(1.); + self.zoom = (width / (right - left).max(1.)) + .min(height / (bottom - top).max(1.)) + .clamp(0.0001, 1.5); + self.pan = iced::Vector::new( + 24. + (width - (right - left) * self.zoom) / 2. - left * self.zoom, + 24. + (height - (bottom - top) * self.zoom) / 2. - top * self.zoom, + ); + } +} + +fn preferred_diagram(p: &Project, active: Option, layer: Layer, element: Id) -> Option { + if let Some(owner) = p + .elements + .get(&element) + .filter(|e| e.kind() == Kind::Port) + .and_then(|e| e.parent) + { + return p + .diagrams + .values() + .filter(|d| d.layer == layer) + .min_by_key(|d| { + let view = project_view(p, d.id); + ( + !d.projection.includes(p.elements[&owner].kind()), + !view.ports.iter().any(|port| port.element == element), + !d.nodes.values().any(|node| node.element == owner), + active != Some(d.id), + ) + }) + .map(|d| d.id); + } + p.diagrams + .values() + .filter(|d| d.layer == layer) + .min_by_key(|d| { + ( + !p.elements + .get(&element) + .is_none_or(|e| d.projection.includes(e.kind())), + !d.nodes.values().any(|n| n.element == element), + d.projection != ProjectionKind::Allocation, + ) + }) + .map(|d| d.id) +} +fn reveal_port_owner(p: &mut Project, diagram: Id, element: Id) { + let Some(owner) = p + .elements + .get(&element) + .filter(|e| e.kind() == Kind::Port) + .and_then(|e| e.parent) + else { + return; + }; + let Some(owner_node) = p.diagrams[&diagram] + .nodes + .values() + .find(|n| n.element == owner) + .map(|n| n.id) + else { + return; + }; + let unfold: Vec<_> = p.diagrams[&diagram] + .nodes + .values() + .filter(|n| { + n.collapsed && projection::descendant_nodes(p, diagram, n.id).contains(&owner_node) + }) + .map(|n| n.id) + .collect(); + for id in unfold { + p.diagrams + .get_mut(&diagram) + .unwrap() + .nodes + .get_mut(&id) + .unwrap() + .collapsed = false; + } +} + +fn write_snapshot( + document: Id, + revision: u64, + snapshot: Arc, + path: PathBuf, + previous: Option, +) -> Result { + let target = path.clone(); + write_snapshot_inner(document, revision, snapshot, path, previous) + .map_err(|message| save_failure(document, &target, message)) +} + +fn save_failure(document: Id, path: &std::path::Path, message: String) -> SaveFailure { + // Discovery is read-only, bounded and checks physical source ownership. Do + // not infer journal names from an error string or recover inside a save. + let recovery = path + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("arcadia")) + .then(|| source_files::load_project(path, LIMITS).ok()) + .flatten() + .and_then(|disk| recovery_target(&disk)); + SaveFailure { + document, + message, + recovery, + } +} + +fn recovery_target(disk: &DiskProject) -> Option { + disk.diagnostics + .iter() + .any(|issue| issue.diagnostic.code == "pending_save") + .then(|| disk.root.join(&disk.bundle.entry)) +} + +fn recover_snapshot(target: PathBuf) -> Result { + if !source_files::recover_project(&target, LIMITS).map_err(|e| e.to_string())? { + return Err(format!( + "No pending save was found at {}. Your model and drafts are retained.", + target.display() + )); + } + let disk = source_files::load_project(&target, LIMITS).map_err(|e| e.to_string()); + Ok(RecoverySnapshot { target, disk }) +} + +fn write_snapshot_inner( + document: Id, + revision: u64, + mut snapshot: Arc, + path: PathBuf, + previous: Option, +) -> Result { + let is_json = path + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("json")); + let disk = if is_json { + if path.exists() { + return Err( + "The JSON destination already exists. Choose a new file to preserve it.".into(), + ); + } + persistence::save_checked(&path, &snapshot.decoded.project, None) + .map_err(|e| e.to_string())?; + None + } else { + let entry = path + .file_name() + .and_then(|p| p.to_str()) + .ok_or("Choose a portable .arcadia entry file name.")?; + if source_project::resolve_include("", entry).as_deref() != Ok(entry) { + return Err("Choose a portable .arcadia entry file name.".into()); + } + if entry != snapshot.bundle.entry { + let mut bundle = snapshot.bundle.clone(); + if bundle.files.contains_key(entry) { + return Err("That entry name is already used by an included file.".into()); + } + let text = bundle + .files + .remove(&bundle.entry) + .ok_or("The accepted entry is missing.")?; + bundle.entry = entry.into(); + bundle.files.insert(entry.into(), text); + snapshot = Arc::new( + source_project::compile_bundle(&bundle, LIMITS) + .map_err(|errors| crate::document::DocumentError::Source(errors).to_string())?, + ); + } + let previous = previous.filter(|disk| { + path.parent() + .filter(|p| !p.as_os_str().is_empty()) + .unwrap_or(std::path::Path::new(".")) + .canonicalize() + .ok() + .as_ref() + == Some(&disk.root) + && entry == disk.bundle.entry + }); + let mut disk = match previous { + Some(disk) => disk, + None => source_files::new_project(&path, LIMITS).map_err(|e| e.to_string())?, + }; + for path in snapshot.bundle.files.keys() { + if !disk.expectations.contains_key(path) { + source_files::expect_new_file(&mut disk, path, LIMITS) + .map_err(|e| e.to_string())?; + } + } + Some(source_files::save_project(&disk, &snapshot, LIMITS).map_err(|e| e.to_string())?) + }; + Ok(FileSnapshot { + document, + revision, + snapshot, + disk, + path, + }) +} + +fn read_snapshot(path: PathBuf) -> Result { + use std::io::Read; + let is_source = path + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("arcadia")); + if is_source { + // The entry is written last. An interrupted first save can therefore + // have a valid journal without an entry file to open yet. + let disk = source_files::load_project(&path, LIMITS).map_err(|e| e.to_string())?; + if recovery_target(&disk).is_none() + && let Some(source_files::DiskExpectation::Bytes(bytes)) = + disk.expectations.get(&disk.bundle.entry) + && let Ok(decoded) = persistence::decode_with_report_limited(bytes, LIMITS.model) + // Source1/2 require the historical single-document adapters. + // Source3+ must retain its authored bundle and token migration. + && decoded.migration.as_ref().is_some_and(|report| report.from_schema <= 2) + { + return Ok(LoadedSnapshot::Legacy( + path, + Box::new(decoded), + Arc::from(bytes.clone()), + )); + } + return Ok(LoadedSnapshot::Source(disk)); + } + if !std::fs::symlink_metadata(&path) + .map_err(|e| e.to_string())? + .is_file() + { + return Err("Open a regular model file; links and special files are not supported.".into()); + } + let mut bytes = Vec::new(); + std::fs::File::open(&path) + .map_err(|e| e.to_string())? + .take(LIMITS.model.max_source_bytes as u64 + 1) + .read_to_end(&mut bytes) + .map_err(|e| e.to_string())?; + if bytes.len() > LIMITS.model.max_source_bytes { + return Err("The model exceeds the source byte limit.".into()); + } + let decoded = + persistence::decode_with_report_limited(&bytes, LIMITS.model).map_err(|e| e.to_string())?; + Ok(LoadedSnapshot::Legacy( + path, + Box::new(decoded), + Arc::from(bytes), + )) +} + +#[cfg(test)] +#[path = "app/save_as_tests.rs"] +mod save_as_tests; + +#[cfg(test)] +mod source_project_tests { + use super::*; + + struct Directory(PathBuf); + impl Directory { + fn new() -> Self { + let path = std::env::temp_dir().join(format!("arcadia-source-ui-{}", Id::new_v4())); + std::fs::create_dir(&path).unwrap(); + Self(path.canonicalize().unwrap()) + } + } + impl Drop for Directory { + fn drop(&mut self) { + let temp = std::env::temp_dir().canonicalize().unwrap(); + assert_eq!(self.0.parent(), Some(temp.as_path())); + assert!( + self.0 + .file_name() + .unwrap() + .to_string_lossy() + .starts_with("arcadia-source-ui-") + ); + std::fs::remove_dir_all(&self.0).unwrap(); + } + } + fn send(app: &mut App, message: Message) { + let _ = app.update(message); + } + fn edit(app: &mut App, text: &str) { + send(app, Message::SourceEdit(text_editor::Action::SelectAll)); + send( + app, + Message::SourceEdit(text_editor::Action::Edit(text_editor::Edit::Paste( + Arc::new(text.into()), + ))), + ); + } + fn save(app: &mut App, path: PathBuf) -> Result<(), String> { + let receipt = write_snapshot( + app.canvas_document, + app.document.revision(), + app.document.snapshot(), + path, + app.disk_project.clone(), + ) + .map_err(|error| error.message)?; + send(app, Message::Saved(Ok(Some(receipt)))); + Ok(()) + } + + #[test] + fn source3_native_open_preserves_report_comments_nesting_and_save_reopen() { + let original = include_str!("../../oa-core/tests/fixtures/v3-data-contract.arcadia"); + for split in [false, true] { + let directory = Directory::new(); + let path = directory.0.join("project.arcadia"); + let mut authored = std::collections::BTreeMap::new(); + if split { + let start = original.find("{\n").unwrap() + 2; + let end = original.rfind('}').unwrap(); + authored.insert( + "project.arcadia", + format!( + "{} include \"dictionary.arcadia\";\n}}\n", + &original[..start] + ), + ); + authored.insert("dictionary.arcadia", original[start..end].to_owned()); + } else { + authored.insert("project.arcadia", original.to_owned()); + } + for (file, source) in &authored { + std::fs::write(directory.0.join(file), source).unwrap(); + } + let mut app = App::with_project(Project::empty()); + send( + &mut app, + Message::Loaded(Ok(Some(read_snapshot(path.clone()).unwrap()))), + ); + assert_eq!(app.migration.as_ref().unwrap().from_schema, 3); + assert_eq!(app.page, Page::Validation); + assert_eq!(app.path, Some(path.clone())); + assert_eq!(app.document.bundle().files.len(), authored.len()); + assert!( + app.dirty(), + "accepted source migration needs explicit saving" + ); + for (file, source) in &authored { + assert_eq!( + std::fs::read_to_string(directory.0.join(file)).unwrap(), + *source + ); + } + let text = app + .document + .bundle() + .files + .values() + .cloned() + .collect::(); + assert!(text.contains("// Reused record parameters retain their own identities.")); + assert!(text.contains("// Frozen authored schema3 compatibility input.")); + let packet = app + .project() + .elements + .values() + .find(|e| e.alias == "packet") + .unwrap() + .id; + let origin = app + .project() + .elements + .values() + .find(|e| e.alias == "origin") + .unwrap() + .id; + assert_eq!( + app.document.compiled().index.lexical_owners.get(&origin), + Some(&packet) + ); + let before = app.document.snapshot(); + save(&mut app, path.clone()).unwrap(); + assert!(!app.dirty()); + for (file, source) in &before.bundle.files { + assert_eq!( + std::fs::read_to_string(directory.0.join(file)).unwrap(), + *source + ); + } + let mut reopened = App::with_project(Project::empty()); + send( + &mut reopened, + Message::Loaded(Ok(Some(read_snapshot(path).unwrap()))), + ); + assert!(reopened.migration.is_none()); + assert_eq!(reopened.project(), app.project()); + assert_eq!(reopened.document.bundle(), app.document.bundle()); + assert!(!reopened.dirty()); + } + } + + fn pending_journal(directory: &Directory, before: Option<&str>) -> (PathBuf, PathBuf) { + let path = directory.0.join("project.arcadia"); + let journal = directory.0.join(".arcadia-save-project.arcadia.journal"); + std::fs::create_dir(&journal).unwrap(); + let metadata = json!({"version":1,"entry":"project.arcadia","files":[{ + "path":"project.arcadia","before":before.is_some(),"write":true + }]}); + std::fs::write( + journal.join("journal.json"), + serde_json::to_vec(&metadata).unwrap(), + ) + .unwrap(); + if let Some(before) = before { + std::fs::write(&path, before).unwrap(); + std::fs::write(journal.join("0.before"), before).unwrap(); + } + std::fs::write( + journal.join("0.after"), + "arcadia 3; project p \"After\" {}\n", + ) + .unwrap(); + (path, journal) + } + + #[test] + fn recovery_open_finds_first_save_journal_without_an_entry_file() { + let directory = Directory::new(); + let (path, journal) = pending_journal(&directory, None); + let mut app = App::with_project(Project::empty()); + let before = app.document.snapshot(); + send( + &mut app, + Message::Loaded(Ok(Some(read_snapshot(path.clone()).unwrap()))), + ); + assert_eq!(app.pending_recovery.as_ref(), Some(&path)); + assert_eq!(app.page, Page::Text); + assert!(!app.source_workspace.applied); + assert!(Arc::ptr_eq(&before, &app.document.snapshot())); + assert!(journal.exists()); + send(&mut app, Message::SourceRecover); + assert!(app.busy); + send( + &mut app, + Message::SourceRecovered(recover_snapshot(path.clone())), + ); + assert!(app.pending_recovery.is_none()); + assert!(!journal.exists()); + assert!(!path.exists()); + assert!(Arc::ptr_eq(&before, &app.document.snapshot())); + } + + #[test] + fn recovery_after_first_save_failure_retains_target_then_retries_without_reentering_path() { + let directory = Directory::new(); + let (path, journal) = pending_journal(&directory, None); + let mut app = App::with_project(Project::empty()); + let before = app.document.snapshot(); + let error = write_snapshot( + app.canvas_document, + app.document.revision(), + app.document.snapshot(), + path.clone(), + None, + ) + .unwrap_err(); + assert_eq!(error.recovery.as_ref(), Some(&path)); + send(&mut app, Message::Saved(Err(error))); + assert!(app.path.is_none()); + assert_eq!(app.pending_recovery.as_ref(), Some(&path)); + assert_eq!(app.page, Page::Text); + send(&mut app, Message::SourceRecover); + assert!( + app.busy, + "Recovery must use its own target when App.path is absent" + ); + send( + &mut app, + Message::SourceRecovered(recover_snapshot(path.clone())), + ); + assert_eq!(app.path.as_ref(), Some(&path)); + assert!(app.pending_recovery.is_none()); + assert!(!journal.exists()); + assert!(Arc::ptr_eq(&before, &app.document.snapshot())); + save(&mut app, path.clone()).unwrap(); + assert!(path.is_file()); + assert!(!app.dirty()); + } + + #[test] + fn recovery_target_survives_edit_lint_apply_and_rejected_recovery_until_success() { + let directory = Directory::new(); + let initial = "arcadia 3; project p \"Before\" {}\n"; + let (path, journal) = pending_journal(&directory, Some(initial)); + let mut app = App::with_project(Project::empty()); + send( + &mut app, + Message::Loaded(Ok(Some(read_snapshot(path.clone()).unwrap()))), + ); + edit(&mut app, &format!("{initial}// Added rationale\n")); + assert!(app.source_diagnostics.is_empty()); + assert_eq!(app.pending_recovery.as_ref(), Some(&path)); + let version = app.source_version; + send(&mut app, Message::Lint(version)); + let diagnostics = source_workspace::lint(&app.source_workspace.bundle()); + send(&mut app, Message::Linted(version, Ok(diagnostics))); + assert_eq!(app.pending_recovery.as_ref(), Some(&path)); + assert!(app.apply_source()); + let accepted = app.document.snapshot(); + assert_eq!(app.pending_recovery.as_ref(), Some(&path)); + std::fs::write(&path, "External file edit that must survive").unwrap(); + send( + &mut app, + Message::SourceRecovered(recover_snapshot(path.clone())), + ); + assert_eq!(app.pending_recovery.as_ref(), Some(&path)); + assert!(journal.exists()); + assert_eq!( + std::fs::read_to_string(&path).unwrap(), + "External file edit that must survive" + ); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + std::fs::write(&path, initial).unwrap(); + send( + &mut app, + Message::SourceRecovered(recover_snapshot(path.clone())), + ); + assert!(app.pending_recovery.is_none()); + assert!(!journal.exists()); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + assert!(app.source_editor.text().contains("Added rationale")); + } + + #[test] + fn recovery_of_previous_save_as_target_does_not_redirect_current_project() { + let directory = Directory::new(); + let (target, journal) = pending_journal(&directory, None); + let mut app = App::with_project(Project::empty()); + let error = write_snapshot( + app.canvas_document, + app.document.revision(), + app.document.snapshot(), + target.clone(), + None, + ) + .unwrap_err(); + send(&mut app, Message::Saved(Err(error))); + let destination = directory.0.join("another.arcadia"); + save(&mut app, destination.clone()).unwrap(); + assert_eq!(app.pending_recovery.as_ref(), Some(&target)); + let saved = app.document.snapshot(); + send(&mut app, Message::SourceRecovered(recover_snapshot(target))); + assert!(app.pending_recovery.is_none()); + assert!(!journal.exists()); + assert_eq!(app.path.as_ref(), Some(&destination)); + assert_eq!( + app.disk_project.as_ref().unwrap().bundle.entry, + "another.arcadia" + ); + assert!(Arc::ptr_eq(&saved, &app.document.snapshot())); + save(&mut app, destination).unwrap(); + } + #[test] + fn two_file_apply_graphical_edit_exact_undo_save_as_and_reopen() { + let directory = Directory::new(); + let mut project = Project::empty(); + let activity = project + .add_element(Kind::Activity, Layer::Oa, "Assess incident", None) + .unwrap(); + let mut app = App::with_project(project); + let fragment = app.document.compiled().index.declarations[&activity] + .path + .clone(); + send(&mut app, Message::SourceFile(fragment.clone())); + let edited = format!( + "// Engineering rationale: preserve this comment.\n{}", + app.source_editor + .text() + .replace("Assess incident", "Review incident") + ); + edit(&mut app, &edited); + let entry = app.source_workspace.entry.clone(); + send(&mut app, Message::SourceFile(entry.clone())); + let entry_text = format!("{}\n// Project rationale.\n", app.source_editor.text()); + edit(&mut app, &entry_text); + assert!(app.apply_source(), "{}", app.status); + let accepted = app.document.snapshot(); + send( + &mut app, + Message::Command(Command::Rename(activity, "Evaluate incident".into())), + ); + assert_eq!(app.project().elements[&activity].name, "Evaluate incident"); + assert!(app.document.bundle().files[&fragment].starts_with("// Engineering rationale")); + send(&mut app, Message::Undo); + assert_eq!(app.document.bundle(), &accepted.bundle); + send(&mut app, Message::Redo); + let model = app.project().clone(); + let path = directory.0.join("study.arcadia"); + save(&mut app, path.clone()).unwrap(); + assert!(!app.dirty()); + assert_eq!(app.source_workspace.entry, "study.arcadia"); + assert!(!app.source_workspace.files.contains_key(&entry)); + let mut reopened = App::with_project(Project::empty()); + send( + &mut reopened, + Message::Loaded(Ok(Some(read_snapshot(path).unwrap()))), + ); + assert_eq!( + reopened.project(), + &model, + "{}: {:?}", + reopened.status, + reopened.source_diagnostics + ); + assert_eq!(reopened.document.bundle(), app.document.bundle()); + assert!(!reopened.dirty()); + } + #[test] + fn inactive_invalid_draft_blocks_graphical_changes_and_diagnostic_switches_files() { + let mut project = Project::empty(); + let activity = project + .add_element(Kind::Activity, Layer::Oa, "Assess incident", None) + .unwrap(); + let mut app = App::with_project(project.clone()); + let fragment = app.document.compiled().index.declarations[&activity] + .path + .clone(); + send(&mut app, Message::SourceFile(fragment.clone())); + edit(&mut app, "? invalid source"); + let entry = app.source_workspace.entry.clone(); + send(&mut app, Message::SourceFile(entry)); + send(&mut app, Message::Page(Page::Diagram)); + send( + &mut app, + Message::Command(Command::Rename(activity, "Must not happen".into())), + ); + assert_eq!(app.project(), &project); + assert!(!app.apply_source()); + assert_eq!(app.source_diagnostics[0].path, fragment); + send(&mut app, Message::SourceDiagnostic(0)); + assert_eq!(app.source_workspace.active, fragment); + assert_eq!(app.source_editor.text(), "? invalid source"); + send(&mut app, Message::RevertSource); + assert!(!app.source_dirty()); + assert_eq!(app.project(), &project); + } + #[test] + fn missing_include_open_keeps_old_model_and_can_be_repaired_and_saved() { + let directory = Directory::new(); + let compiled = source_project::compile_bundle( + &source_project::format_bundle(&Project::empty()), + LIMITS, + ) + .unwrap(); + let mut entry = compiled.bundle.files[&compiled.bundle.entry].clone(); + entry.insert_str( + compiled.index.project_body.span.end, + "\n include \"missing.arcadia\";\n", + ); + let path = directory.0.join(&compiled.bundle.entry); + std::fs::write(&path, &entry).unwrap(); + let mut app = App::with_project(Project::demo()); + let original = app.project().clone(); + send( + &mut app, + Message::Loaded(Ok(Some(read_snapshot(path.clone()).unwrap()))), + ); + assert_eq!(app.project(), &original); + assert!(!app.source_workspace.applied); + assert_eq!(app.source_editor.text(), entry); + send(&mut app, Message::SourceNewPath("missing.arcadia".into())); + send(&mut app, Message::SourceCreateFile); + assert!(app.apply_source(), "{}", app.status); + assert_eq!(app.project(), &compiled.decoded.project); + save(&mut app, path).unwrap(); + assert_eq!( + std::fs::read(directory.0.join("missing.arcadia")).unwrap(), + Vec::::new() + ); + assert!(!app.dirty()); + } + #[test] + fn closed_detached_file_keeps_first_save_conflict_then_can_be_reloaded_fresh() { + let directory = Directory::new(); + let mut app = App::with_project(Project::empty()); + send(&mut app, Message::SourceNewPath("spare.arcadia".into())); + send(&mut app, Message::SourceCreateFile); + assert!(app.apply_source()); + let path = directory.0.join("project.arcadia"); + save(&mut app, path.clone()).unwrap(); + send(&mut app, Message::SourceFile("project.arcadia".into())); + let removed = app + .source_editor + .text() + .replace(" include \"spare.arcadia\";\n", ""); + edit(&mut app, &removed); + assert!(app.apply_source()); + send(&mut app, Message::SourceCloseFile("spare.arcadia".into())); + assert!(!app.source_workspace.files.contains_key("spare.arcadia")); + assert!( + app.disk_project + .as_ref() + .unwrap() + .expectations + .contains_key("spare.arcadia") + ); + std::fs::write(directory.0.join("spare.arcadia"), "// external edit\n").unwrap(); + assert!(save(&mut app, path.clone()).is_err()); + assert!( + std::fs::read_to_string(&path) + .unwrap() + .contains("include \"spare.arcadia\"") + ); + std::fs::write(directory.0.join("spare.arcadia"), "").unwrap(); + save(&mut app, path.clone()).unwrap(); + assert!( + !app.disk_project + .as_ref() + .unwrap() + .expectations + .contains_key("spare.arcadia") + ); + std::fs::write(directory.0.join("spare.arcadia"), "// new external text\n").unwrap(); + let id = app.project().id; + send( + &mut app, + Message::Command(Command::Rename(id, "New project name".into())), + ); + save(&mut app, path).unwrap(); + let mut entry = app.source_editor.text(); + entry.insert_str( + app.document.compiled().index.project_body.span.end, + "\n include \"spare.arcadia\";\n", + ); + edit(&mut app, &entry); + let disk = source_files::discover_missing( + app.disk_project.as_ref().unwrap(), + &app.source_workspace.bundle().files, + LIMITS, + ) + .unwrap(); + let version = app.source_version; + send(&mut app, Message::IncludesLoaded(version, Ok(disk))); + assert_eq!( + app.source_workspace.files["spare.arcadia"].text, + "// new external text\n" + ); + assert!(app.apply_source()); + } + #[test] + fn json_export_and_rejected_save_as_preserve_source_location_history_and_bytes() { + let directory = Directory::new(); + let mut app = App::with_project(Project::empty()); + let id = app.project().id; + send( + &mut app, + Message::Command(Command::Rename(id, "Unsaved model".into())), + ); + let before = app.document.snapshot(); + let revision = app.document.revision(); + save(&mut app, directory.0.join("export.json")).unwrap(); + assert!(app.path.is_none()); + assert!(app.dirty()); + assert!(Arc::ptr_eq(&before, &app.document.snapshot())); + let path = directory.0.join("collision.arcadia"); + std::fs::write(&path, "Preserve existing file").unwrap(); + assert!(save(&mut app, path.clone()).is_err()); + assert_eq!( + std::fs::read_to_string(path).unwrap(), + "Preserve existing file" + ); + assert_eq!(app.document.revision(), revision); + assert!(Arc::ptr_eq(&before, &app.document.snapshot())); + } +} + +#[cfg(test)] +mod port_view_tests { + use super::*; + + #[test] + fn catalog_creation_follows_the_new_port_and_keeps_group_browsing_explicit() { + let mut project = Project::empty(); + let actor = project + .add_element(Kind::SystemActor, Layer::Sa, "External operator", None) + .unwrap(); + let mut app = App::with_project(project); + let _ = app.update(Message::Explore(Some(actor))); + app.explorer_page = 3; + app.inspector_tab = crate::navigation::InspectorTab::Connections; + let _ = app.update(Message::PortAction(crate::port_workflow::Action::Component)); + let _ = app.update(Message::Workflow(crate::workflow::Event::Apply)); + assert_eq!(app.page, Page::Catalog); + assert_eq!(app.project().elements[&app.selected].parent, Some(actor)); + assert_eq!(app.explorer_focus, Some(app.selected)); + assert_eq!(app.explorer_group, app.explorer_index.group(app.selected)); + assert_eq!(app.explorer_page, 0); + assert_eq!( + app.inspector_tab, + crate::navigation::InspectorTab::Properties + ); + let selected = app.selected; + let group = app.explorer_group.unwrap(); + let _ = app.update(Message::BrowseGroup(group)); + assert_eq!(app.selected, selected); + assert_eq!(app.explorer_group, Some(group)); + assert!(app.explorer_focus.is_none()); + let _ = app.update(Message::Page(Page::Guide)); + let _ = app.update(Message::Page(Page::Catalog)); + assert_eq!(app.explorer_focus, Some(selected)); + assert_eq!(app.explorer_page, 0); + } + + #[test] + fn filtered_active_view_cannot_hide_a_created_port_when_eligible_owner_view_is_folded() { + let mut p = Project::empty(); + let system = p + .add_element(Kind::System, Layer::Sa, "System", None) + .unwrap(); + let function = p + .add_element(Kind::Function, Layer::Sa, "Function", None) + .unwrap(); + p.relate(RelationKind::Allocation, "Performs", system, function); + let architecture = p.ensure_diagram(Layer::Sa); + p.diagrams.get_mut(&architecture).unwrap().projection = ProjectionKind::Allocation; + let container = p.place(architecture, system, Position { x: 40., y: 40. }); + p.place(architecture, function, Position { x: 70., y: 130. }); + let capabilities = Id::new_v4(); + p.diagrams.insert( + capabilities, + Diagram { + id: capabilities, + alias: "filtered_view".into(), + name: "Filtered view".into(), + description: String::new(), + layer: Layer::Sa, + projection: ProjectionKind::Capabilities, + routes: Vec::new(), + view_options: Default::default(), + nodes: Default::default(), + }, + ); + p.place(capabilities, system, Position { x: 40., y: 40. }); + p.place(capabilities, function, Position { x: 70., y: 130. }); + p.diagrams + .get_mut(&architecture) + .unwrap() + .nodes + .get_mut(&container) + .unwrap() + .collapsed = true; + let mut app = App::with_project(p.clone()); + let _ = app.update(Message::Select(function)); + app.active_diagram = Some(capabilities); + app.refresh_draft(); + app.inspector_tab = crate::navigation::InspectorTab::Connections; + let _ = app.update(Message::PortAction(crate::port_workflow::Action::Output)); + let _ = app.update(Message::Workflow(crate::workflow::Event::Apply)); + assert!(app.workflow.is_none(), "{}", app.status); + assert_eq!( + app.inspector_tab, + crate::navigation::InspectorTab::Properties + ); + assert_eq!(app.active_diagram, Some(architecture)); + assert!( + project_view(app.project(), architecture) + .ports + .iter() + .any(|port| port.element == app.selected) + ); + assert!(!app.project().diagrams[&architecture].nodes[&container].collapsed); + let _ = app.update(Message::Undo); + assert_eq!( + app.project(), + &p, + "Creation and the eligible owner reveal remain one transaction" + ); + } +} + +#[cfg(test)] +mod lint_tests { + use super::*; + + fn edit(app: &mut App, value: &str) { + let _ = app.update(Message::SourceEdit(text_editor::Action::SelectAll)); + let _ = app.update(Message::SourceEdit(text_editor::Action::Edit( + text_editor::Edit::Paste(Arc::new(value.into())), + ))); + } + + #[test] + fn lint_coalesces_work_and_rejects_obsolete_results() { + let mut app = App::with_project(Project::empty()); + let _ = app.request_lint(); + let first = app.source_version; + edit(&mut app, "?"); + let latest = app.source_version; + let _ = app.update(Message::Lint(latest)); + assert_eq!(app.lint_running, Some(first)); + assert_eq!(app.lint_requested, Some(latest)); + + let errors = source_workspace::lint(&app.source_workspace.bundle()); + let _ = app.update(Message::Linted(first, Ok(errors.clone()))); + assert!(app.source_diagnostics.is_empty()); + assert_eq!(app.lint_running, Some(latest)); + let _ = app.update(Message::Linted(latest, Ok(errors.clone()))); + assert_eq!(app.source_diagnostics, errors); + assert_eq!(app.lint_running, None); + assert_eq!(app.source_editor.text(), "?"); + } + + #[test] + fn prior_document_lint_cannot_enter_reopened_model_or_block_next_checks() { + let mut app = App::with_project(Project::empty()); + edit(&mut app, "?"); + let _ = app.request_lint(); + let old_version = app.source_version; + app.reset(Project::empty(), None); + assert!(app.source_version > old_version); + let _ = app.request_lint(); + app.busy = true; + let _ = app.update(Message::Linted( + old_version, + Ok(source_workspace::lint(&app.source_workspace.bundle())), + )); + assert!(app.source_diagnostics.is_empty()); + assert_eq!(app.lint_running, Some(app.source_version)); + let _ = app.update(Message::Linted(app.source_version, Ok(vec![]))); + assert_eq!(app.lint_running, None); + } + + #[test] + fn committed_check_cache_follows_edit_and_undo_while_drafts_stay_separate() { + let mut app = App::with_project(Project::empty()); + let original = app.issue_count(); + let element = app + .project() + .make_element(Kind::Function, Layer::Sa, "Assess request", None) + .unwrap(); + let _ = app.update(Message::Command(Command::CreateElement(element))); + assert!( + app.model_issues + .iter() + .any(|issue| issue.code == "missing_system") + ); + assert_eq!(app.issue_count(), validate(app.project()).len()); + let after = app.issue_count(); + edit(&mut app, "?"); + assert_eq!(app.issue_count(), after); + let _ = app.update(Message::RevertSource); + let _ = app.update(Message::Undo); + assert_eq!(app.issue_count(), original); + assert!(app.project().elements.is_empty()); + } +} + +#[cfg(test)] +mod data_paging_lifecycle_tests { + use super::*; + #[test] + fn paging_preserves_same_context_and_resets_on_layer_or_document_replacement() { + let mut p = Project::empty(); + let mut oa = None; + for layer in [Layer::Oa, Layer::Sa] { + for index in 0..70 { + let id = p + .add_element( + Kind::Interface, + layer, + &format!("Interface {layer} {index}"), + None, + ) + .unwrap(); + if layer == Layer::Oa { + oa = Some(id); + } + } + } + let mut app = App::with_project(p.clone()); + let page = Message::Data(crate::data_view::Event::Page { + section: crate::data_view::Section::Catalog, + owner: None, + page: 2, + }); + let _ = app.update(Message::Page(Page::Data)); + let _ = app.update(page.clone()); + let retained = app.data_state.clone(); + let _ = app.update(Message::Page(Page::Catalog)); + let _ = app.update(Message::Page(Page::Data)); + let _ = app.update(Message::Layer(Layer::Oa)); + assert_eq!(app.data_state, retained); + let _ = app.update(Message::Layer(Layer::Sa)); + assert_eq!(app.data_state, crate::data_view::State::default()); + let _ = app.update(page.clone()); + let _ = app.update(Message::Select(oa.unwrap())); + assert_eq!(app.layer, Layer::Oa); + assert_eq!(app.data_state, crate::data_view::State::default()); + let _ = app.update(page); + app.reset(p, None); + assert_eq!(app.data_state, crate::data_view::State::default()); + } +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/app/source_symbols.rs b/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/app/source_symbols.rs new file mode 100644 index 00000000..9516a2b3 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/app/source_symbols.rs @@ -0,0 +1,448 @@ +//! Current draft navigation, isolated from model application and disk discovery. +use super::*; +use crate::source_navigation::{self as nav, query}; +use std::sync::atomic::Ordering; + +fn admission_notice(error: query::AdmissionError) -> String { + use nav::symbols::{BuildError, InputProblem, Resource}; + let (limit, resource) = match error { + query::AdmissionError::Index(BuildError::Limit { limit, resource, .. }) => (limit, resource), + query::AdmissionError::Outline { error, .. } => (error.limit, match error.resource { + language::OutlineResource::SourceBytes => Resource::SourceBytes, + language::OutlineResource::Tokens => Resource::Tokens, + language::OutlineResource::Declarations => Resource::Records, + }), + query::AdmissionError::Index(BuildError::Input { problem, .. }) => return match problem { + InputProblem::NonCanonicalPath | InputProblem::DuplicateOrCaseCollidingPath => + "Navigation needs distinct relative source paths. Check file names and include paths.".into(), + _ => "Navigation could not verify the current source locations. Correct source errors and try again.".into(), + }, + }; + let unit = match resource { + Resource::Files => "loaded files", + Resource::SourceBytes => "source bytes", + Resource::PathBytes => "bytes in file paths", + Resource::Tokens => "source tokens", + Resource::Records => "declarations and references", + }; + format!( + "Navigation reached its limit of {limit} {unit}. Reduce the loaded source size and try again." + ) +} + +impl App { + pub fn source_symbol_context(&self) -> nav::SymbolContext { + nav::SymbolContext { + session: self.source_workspace.session(), + path: self.source_workspace.active.clone(), + } + } + + pub fn source_symbol_message(&self, event: nav::SymbolEvent) -> Message { + Message::SourceSymbols(self.source_symbol_context(), event) + } + pub fn source_key(&self) -> query::SnapshotKey { + query::SnapshotKey { + workspace: self.source_workspace.session(), + revision: self.source_workspace.revision(), + } + } + + fn with_source_input(&self, use_input: impl FnOnce(query::Input<'_>) -> T) -> T { + let files: Vec<_> = self + .source_workspace + .files + .iter() + .map(|(path, buffer)| query::DraftFile { + path, + text: &buffer.text, + }) + .collect(); + let accepted = self.document.bundle(); + let validated: Vec<_> = accepted + .files + .iter() + .map(|(path, text)| query::DraftFile { path, text }) + .collect(); + use_input(query::Input { + key: self.source_key(), + entry: &self.source_workspace.entry, + files: &files, + applied: self.source_workspace.applied, + validation: self + .source_workspace + .applied + .then_some(query::ValidatedSources { + entry: &accepted.entry, + files: &validated, + }), + }) + } + + fn source_snapshot_matches(&self, snapshot: &query::Snapshot) -> bool { + snapshot.key() == self.source_key() + && self.with_source_input(|input| snapshot.matches(input)) + } + + pub fn source_navigation_available(&self) -> bool { + self.page == Page::Text + && !self.busy + && self.pending.is_none() + && self.file_prompt.is_none() + && !self.delete_pending + && self.workflow.is_none() + && !self.hosted.visible + && self.model_menu.is_none() + && self.architecture.is_none() + && !self.behavior.has_pending() + } + + /// Mounted widget IDs change when another interaction supersedes a reveal. + /// A queued focus operation therefore cannot find a subsequently reused editor. + pub fn source_editor_id(&self) -> iced::widget::Id { + iced::widget::Id::from(format!( + "source-editor-{}-{}-{}", + self.source_workspace.session(), + self.source_workspace.active, + self.source_symbols.interaction + )) + } + + pub fn source_reveal_ticket(&self) -> Option { + self.source_symbols + .reveal + .as_ref() + .map(|reveal| reveal.ticket) + } + + pub(super) fn source_interaction(&mut self) { + self.source_symbols.interaction = Id::new_v4(); + self.source_symbols.request = None; + self.source_symbols.reveal = None; + self.source_jump = None; + } + + pub(super) fn queue_source_reveal(&mut self, cursor: text_editor::Cursor, select_line: bool) { + self.source_jump = Some(cursor); + self.source_select_line = select_line; + self.source_symbols.reveal = Some(nav::Reveal { + ticket: Id::new_v4(), + interaction: self.source_symbols.interaction, + raw_interaction: self.source_symbols.raw_interaction.load(Ordering::SeqCst), + snapshot: self.source_key(), + path: self.source_workspace.active.clone(), + }); + } + + pub(super) fn source_viewport(&mut self, ticket: Option) -> Task { + let Some(reveal) = &self.source_symbols.reveal else { + return Task::none(); + }; + if Some(reveal.ticket) != ticket + || reveal.interaction != self.source_symbols.interaction + || !nav::interaction::is_current( + &self.source_symbols.raw_interaction, + reveal.raw_interaction, + ) + || reveal.snapshot != self.source_key() + || reveal.path != self.source_workspace.active + || !self.source_navigation_available() + { + return Task::none(); + } + let raw_interaction = reveal.raw_interaction; + self.source_symbols.reveal = None; + if let Some(cursor) = self.source_jump.take() { + if !nav::exact_cursor(self.source_workspace.text(), cursor) { + return Task::none(); + } + self.source_editor.move_to(cursor); + if self.source_select_line && cursor.selection.is_none() { + self.source_editor.perform(text_editor::Action::SelectLine); + } + return nav::interaction::guarded_focus( + self.source_editor_id(), + self.source_symbols.raw_interaction.clone(), + raw_interaction, + ); + } + Task::none() + } + + pub(super) fn source_symbol_event(&mut self, event: nav::SymbolEvent) -> Task { + if !self.source_navigation_available() { + return Task::none(); + } + match event { + nav::SymbolEvent::Close => { + self.source_symbols.open = false; + self.source_symbols.results = None; + self.source_symbols.notice = None; + } + nav::SymbolEvent::Back => { + self.source_symbols.open = true; + self.source_symbol_back(); + } + nav::SymbolEvent::Choose { + stamp, + reference, + index, + } => { + let Some(results) = self.source_symbols.results.clone() else { + return Task::none(); + }; + if results.stamp != stamp + || stamp.snapshot != self.source_key() + || self + .source_symbols + .cache + .as_ref() + .is_none_or(|cache| !self.source_snapshot_matches(cache)) + { + self.source_symbols.notice = + Some("Source changed. Run navigation again for current locations.".into()); + return Task::none(); + } + let destination = if reference { + results + .references + .get(index) + .map(|row| (&row.path, row.position, row.end_position)) + } else { + results + .definitions + .get(index) + .map(|row| (&row.path, row.position, row.end_position)) + }; + if let Some((path, start, end)) = destination { + self.source_symbol_jump(path, start, end); + } + } + nav::SymbolEvent::Query(action) => return self.start_source_query(action), + } + Task::none() + } + + fn start_source_query(&mut self, action: query::Action) -> Task { + self.source_symbols.open = true; + if !nav::interaction::is_current( + &self.source_symbols.raw_interaction, + self.source_symbols.raw_interaction.load(Ordering::SeqCst), + ) { + self.source_symbols.notice = Some("Reopen this workspace to reset navigation.".into()); + return Task::none(); + } + if self.source_symbols.in_flight.is_some() { + self.source_symbols.notice = Some("Navigation is finishing. Try again shortly.".into()); + return Task::none(); + } + let cursor = self.source_editor.cursor(); + let Some(offset) = nav::cursor_offset(self.source_workspace.text(), cursor) else { + self.source_symbols.notice = + Some("Place the cursor on an alias or its @ reference.".into()); + return Task::none(); + }; + self.source_symbols.serial = match self.source_symbols.serial.checked_add(1) { + Some(serial) => serial, + None => { + self.source_workspace.reset_navigation_session(); + self.source_symbols.back.clear(); + self.source_symbols.cache = None; + 0 + } + }; + let request = nav::Request { + job: Id::new_v4(), + interaction: self.source_symbols.interaction, + raw_interaction: self.source_symbols.raw_interaction.load(Ordering::SeqCst), + stamp: query::QueryStamp { + snapshot: self.source_key(), + serial: self.source_symbols.serial, + }, + path: self.source_workspace.active.clone(), + offset, + cursor, + action, + }; + let cache = self + .source_symbols + .cache + .as_ref() + .filter(|cache| self.source_snapshot_matches(cache)) + .cloned(); + let input = if cache.is_none() { + match self + .with_source_input(|input| query::admit_owned(input, query::Limits::default())) + { + Ok(input) => Some(input), + Err(error) => { + self.source_symbols.notice = Some(admission_notice(error)); + return Task::none(); + } + } + } else { + None + }; + self.source_symbols.in_flight = Some(request.job); + self.source_symbols.request = Some(request.clone()); + self.source_symbols.results = None; + self.source_symbols.notice = None; + Task::perform( + async move { + let worker_request = request.clone(); + let result = tokio::task::spawn_blocking(move || { + let snapshot = match cache { + Some(cache) => cache, + None => Arc::new( + input + .expect("admitted input for uncached request") + .capture() + .map_err(admission_notice)?, + ), + }; + let results = snapshot + .query(query::Query { + stamp: worker_request.stamp, + path: &worker_request.path, + byte_offset: worker_request.offset, + action: worker_request.action, + }) + .map_err(|error| match error { + query::QueryError::ResultEnvelopeLimit => "These result details exceed the display limit. Try literal Find for this alias.".to_owned(), + _ => "Navigation could not verify this location. Place the cursor on an alias and try again.".to_owned(), + })?; + Ok((snapshot, Arc::new(results))) + }) + .await + .unwrap_or_else(|error| Err(format!("Navigation task failed: {error}"))); + nav::Completion { request, result } + }, + Message::SourceSymbolsReady, + ) + } + + pub(super) fn source_symbols_ready(&mut self, completion: nav::Completion) -> Task { + let request = completion.request; + if self.source_symbols.in_flight != Some(request.job) { + return Task::none(); + } + self.source_symbols.in_flight = None; + let wanted = self + .source_symbols + .request + .take() + .is_some_and(|current| current.job == request.job) + && request.interaction == self.source_symbols.interaction + && request.stamp.snapshot == self.source_key() + && nav::interaction::is_current( + &self.source_symbols.raw_interaction, + request.raw_interaction, + ) + && request.path == self.source_workspace.active + && request.cursor == self.source_editor.cursor() + && self.source_navigation_available(); + if !wanted { + return Task::none(); + } + match completion.result { + Ok((snapshot, results)) if self.source_snapshot_matches(&snapshot) => { + self.source_symbols.cache = Some(snapshot); + self.source_symbols.results = Some(results.clone()); + if results.disposition == query::Disposition::Direct + && let Some(row) = results.definitions.first() + { + self.source_symbol_jump(&row.path, row.position, row.end_position); + } + } + Ok(_) => { + self.source_symbols.notice = Some("Source changed. Run navigation again.".into()) + } + Err(error) => self.source_symbols.notice = Some(error), + } + Task::none() + } + + fn source_symbol_jump(&mut self, path: &str, start: query::Position, end: query::Position) { + let cursor = text_editor::Cursor { + position: text_editor::Position { + line: start.line, + column: start.byte_column, + }, + selection: Some(text_editor::Position { + line: end.line, + column: end.byte_column, + }), + }; + if self + .source_workspace + .files + .get(path) + .is_none_or(|buffer| !nav::exact_cursor(&buffer.text, cursor)) + { + self.source_symbols.notice = + Some("That source location is no longer available. Run navigation again.".into()); + return; + } + if let Some(buffer) = self + .source_workspace + .files + .get(&self.source_workspace.active) + { + let origin = nav::HistoryEntry { + session: self.source_workspace.session(), + path: self.source_workspace.active.clone(), + generation: buffer.generation(), + cursor: self.source_editor.cursor(), + }; + self.source_symbols + .back + .retain(|entry| entry.session == origin.session); + if self.source_symbols.back.len() == 64 { + self.source_symbols.back.remove(0); + } + self.source_symbols.back.push(origin); + } + self.source_workspace + .switch(path, self.source_editor.cursor()); + self.show_source_file(false); + self.queue_source_reveal(cursor, false); + } + + fn source_symbol_back(&mut self) { + while let Some(origin) = self.source_symbols.back.pop() { + if origin.session != self.source_workspace.session() { + continue; + } + let Some(buffer) = self.source_workspace.files.get(&origin.path) else { + self.source_symbols.notice = Some("The previous file is no longer loaded.".into()); + return; + }; + let unchanged = origin.generation == buffer.generation(); + let cursor = if unchanged { + origin.cursor + } else if origin.path == self.source_workspace.active { + self.source_editor.cursor() + } else { + buffer.cursor + }; + if !nav::exact_cursor(&buffer.text, cursor) { + self.source_symbols.notice = Some( + "The previous location changed. Open the file to choose a current position." + .into(), + ); + return; + } + self.source_workspace + .switch(&origin.path, self.source_editor.cursor()); + self.show_source_file(false); + self.queue_source_reveal(cursor, false); + self.source_symbols.notice = + (!unchanged).then(|| "This draft changed; its current cursor was restored.".into()); + return; + } + self.source_symbols.notice = Some("No previous source location in this workspace.".into()); + } +} + +#[cfg(test)] +mod tests; diff --git a/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/app/source_symbols/tests.rs b/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/app/source_symbols/tests.rs new file mode 100644 index 00000000..2c3f342c --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/app/source_symbols/tests.rs @@ -0,0 +1,1201 @@ +use super::*; +use crate::source_workspace::Workspace; +use oa_core::source_project::SourceBundle; +use std::collections::BTreeMap; +use std::time::Instant; + +const DEFINITIONS: &str = "defs/活動.arcadia"; +const USES: &str = "uses.arcadia"; + +fn fixture_bundle() -> SourceBundle { + SourceBundle { + entry: "project.arcadia".into(), + files: BTreeMap::from([ + ("project.arcadia".into(), concat!( + "arcadia 7;\r\nproject model \"Navigation\" id \"00000000-0000-0000-0000-000000000001\" {\r\n", + " include \"defs/活動.arcadia\";\r\n include \"uses.arcadia\";\r\n}\r\n" + ).into()), + (DEFINITIONS.into(), concat!( + "// 船 and exact CRLF\r\n", + "oa_activity pump \"送水 🚀\" id \"00000000-0000-0000-0000-000000000002\" {}\r\n", + "oa_activity backup \"送水 🚀\" id \"00000000-0000-0000-0000-000000000004\" {}\r\n" + ).into()), + (USES.into(), concat!( + "// Reference names remain lexical\r\n", + "interaction first \"先\" id \"00000000-0000-0000-0000-000000000003\" {\r\n", + " description \"船 @pump\"; source @pump; target @backup;\r\n}\r\n", + "interaction second \"後\" id \"00000000-0000-0000-0000-000000000005\" {\r\n", + " source @backup; target @ // @pump is a comment\r\n pump;\r\n}\r\n" + ).into()), + ]), + } +} + +fn fixture() -> App { + let mut app = App::with_project(Project::empty()); + app.document = Document::from_bundle(fixture_bundle(), LIMITS).unwrap(); + app.source_workspace = Workspace::new(app.document.bundle(), true); + app.selected = app.project().id; + app.refresh_draft(); + app.page = Page::Text; + app.show_source_file(false); + show(&mut app, USES); + let text = app.source_workspace.text(); + let offset = text.find("source @pump").unwrap() + "source @".len(); + app.source_editor + .move_to(selection(text, offset, offset + 4, true)); + assert!(app.source_navigation_available()); + app +} + +fn send(app: &mut App, message: Message) { + // Dropping the returned Task does not poll its worker/lint future. Completion + // below is deterministic and still traverses the real App message handler. + let _ = app.update(message); +} + +fn symbol(app: &mut App, event: nav::SymbolEvent) { + let message = app.source_symbol_message(event); + send(app, message); +} + +fn show(app: &mut App, path: &str) { + send(app, Message::SourceFile(path.into())); + reveal(app); +} + +fn reveal(app: &mut App) { + if let Some(ticket) = app.source_reveal_ticket() { + send(app, Message::SourceViewport(Some(ticket))); + } +} + +fn position(text: &str, offset: usize) -> text_editor::Position { + assert!(text.is_char_boundary(offset)); + let prefix = &text[..offset]; + text_editor::Position { + line: prefix.bytes().filter(|byte| *byte == b'\n').count(), + column: prefix + .rsplit_once('\n') + .map_or(prefix.len(), |(_, tail)| tail.len()), + } +} + +fn selection(text: &str, start: usize, end: usize, reversed: bool) -> text_editor::Cursor { + let (start, end) = (position(text, start), position(text, end)); + text_editor::Cursor { + position: if reversed { end } else { start }, + selection: Some(if reversed { start } else { end }), + } +} + +fn begin(app: &mut App, action: query::Action) -> nav::Request { + symbol(app, nav::SymbolEvent::Query(action)); + let request = app + .source_symbols + .request + .clone() + .expect("request admitted"); + assert_eq!(app.source_symbols.in_flight, Some(request.job)); + request +} + +fn completion(app: &App, request: nav::Request) -> nav::Completion { + let snapshot = Arc::new(app.with_source_input(|input| { + query::admit_owned(input, query::Limits::default()) + .unwrap() + .capture() + .unwrap() + })); + let result = Arc::new( + snapshot + .query(query::Query { + stamp: request.stamp, + path: &request.path, + byte_offset: request.offset, + action: request.action, + }) + .unwrap(), + ); + nav::Completion { + request, + result: Ok((snapshot, result)), + } +} + +fn finish(app: &mut App, action: query::Action) -> Arc { + let request = begin(app, action); + let ready = completion(app, request); + let results = ready.result.as_ref().unwrap().1.clone(); + send(app, Message::SourceSymbolsReady(ready)); + assert!(app.source_symbols.in_flight.is_none()); + results +} + +#[test] +fn valid_definition_and_reference_choice_keep_whole_model_and_source_unchanged() { + let mut app = fixture(); + let accepted = app.document.snapshot(); + let raw = app.source_workspace.bundle(); + let results = finish(&mut app, query::Action::Definition); + assert_eq!(results.disposition, query::Disposition::Direct); + assert_eq!(results.total_definitions, 1); + assert_eq!(app.source_workspace.active, DEFINITIONS); + assert_eq!(app.source_symbols.back.len(), 1); + let row = &results.definitions[0]; + assert_eq!(row.declaration.alias, "pump"); + assert_eq!(row.declaration.name.as_deref(), Some("送水 🚀")); + let expected = selection(&raw.files[DEFINITIONS], row.span.start, row.span.end, false); + assert_eq!( + app.source_jump, + Some(expected), + "jump waits for the matching viewport" + ); + reveal(&mut app); + assert_eq!(app.source_editor.cursor(), expected); + let uses = finish(&mut app, query::Action::References); + assert_eq!( + uses.total_references, 2, + "comment/string references must not leak into App results" + ); + assert_eq!( + app.source_workspace.active, DEFINITIONS, + "references require a choice" + ); + let second = uses.references[1].clone(); + symbol( + &mut app, + nav::SymbolEvent::Choose { + stamp: uses.stamp, + reference: true, + index: 1, + }, + ); + reveal(&mut app); + assert_eq!(app.source_workspace.active, USES); + assert_eq!( + app.source_editor.cursor(), + selection(&raw.files[USES], second.span.start, second.span.end, false) + ); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + assert_eq!(app.source_workspace.bundle(), raw); + assert_eq!(app.document.revision(), 0); + assert!(!app.document.can_undo() && !app.document.can_redo()); +} + +#[test] +fn detached_duplicate_requires_an_explicit_choice_even_when_included_source_is_validated() { + let mut app = fixture(); + let mut loaded = app.source_workspace.bundle(); + loaded.files.insert( + "detached.arcadia".into(), + "oa_activity pump \"Different source\" id \"00000000-0000-0000-0000-000000000099\" {}\r\n" + .into(), + ); + let cursor = app.source_editor.cursor(); + app.source_workspace = Workspace::new(&loaded, true); + app.source_workspace.active = USES.into(); + app.show_source_file(false); + app.source_editor.move_to(cursor); + let results = finish(&mut app, query::Action::Definition); + assert_eq!(results.total_definitions, 2); + assert_eq!(results.disposition, query::Disposition::Choices); + assert_eq!(app.source_workspace.active, USES); + assert!(app.source_symbols.back.is_empty()); + let index = results + .definitions + .iter() + .position(|row| row.path == "detached.arcadia") + .unwrap(); + assert_eq!( + results.definitions[index].membership, + query::Membership::Detached + ); + symbol( + &mut app, + nav::SymbolEvent::Choose { + stamp: results.stamp, + reference: false, + index, + }, + ); + reveal(&mut app); + assert_eq!(app.source_workspace.active, "detached.arcadia"); + assert_eq!(app.source_workspace.bundle(), loaded); + assert_eq!( + app.document.bundle().files.len(), + 3, + "choice must not adopt the detached source" + ); +} + +#[test] +fn invalid_unapplied_drafts_navigate_without_apply_or_losing_either_history() { + let mut app = fixture(); + let base = app.document.snapshot(); + let id = app.project().id; + app.document + .execute(Command::Rename(id, "Accepted one".into())) + .unwrap(); + let one = app.document.snapshot(); + app.document + .execute(Command::Rename(id, "Accepted two".into())) + .unwrap(); + let two = app.document.snapshot(); + assert!(app.document.undo()); + app.sync_source(); + show(&mut app, USES); + let prior_raw = app.source_workspace.text().to_owned(); + let invalid = format!("{prior_raw}\r\n? unfinished raw edit 雨\r\n"); + let _ = app.update(Message::SourceEdit(text_editor::Action::SelectAll)); + let _ = app.update(Message::SourceEdit(text_editor::Action::Edit( + text_editor::Edit::Paste(Arc::new(invalid)), + ))); + app.source_workspace.applied = false; + let text = app.source_workspace.text(); + let alias = text.find("source @pump").unwrap() + "source @".len(); + app.source_editor + .move_to(selection(text, alias, alias + 4, true)); + let raw = app.source_workspace.bundle(); + let revision = app.document.revision(); + let results = finish(&mut app, query::Action::Definition); + assert_eq!(results.disposition, query::Disposition::Choices); + assert!(results.scope.partial() && !results.scope.validated); + let index = results + .definitions + .iter() + .position(|row| row.declaration.alias == "pump") + .unwrap(); + symbol( + &mut app, + nav::SymbolEvent::Choose { + stamp: results.stamp, + reference: false, + index, + }, + ); + reveal(&mut app); + symbol(&mut app, nav::SymbolEvent::Back); + reveal(&mut app); + assert!(Arc::ptr_eq(&one, &app.document.snapshot())); + assert_eq!(app.project(), &one.decoded.project); + assert_eq!(app.document.bundle(), &one.bundle); + assert_eq!(app.document.revision(), revision); + assert_eq!(app.source_workspace.bundle(), raw); + assert!(!app.source_workspace.applied); + assert!(app.document.can_undo() && app.document.can_redo()); + // Actual round trips, not only Boolean history flags. + assert!(app.document.undo()); + assert_eq!(app.document.bundle(), &base.bundle); + assert!(app.document.redo()); + assert_eq!(app.document.bundle(), &one.bundle); + assert!(app.document.redo()); + assert_eq!(app.document.bundle(), &two.bundle); + assert!(app.source_workspace.undo(false)); + assert_eq!(app.source_workspace.text(), prior_raw); + assert!(app.source_workspace.undo(true)); + assert_eq!(app.source_workspace.bundle(), raw); +} + +#[test] +fn completion_rejects_file_edit_session_cursor_interaction_and_raw_input_changes() { + for change in 0..7 { + let mut app = fixture(); + let request = begin(&mut app, query::Action::Definition); + let ready = completion(&app, request.clone()); + let accepted = app.document.snapshot(); + match change { + 0 => show(&mut app, "project.arcadia"), + 1 => send( + &mut app, + Message::SourceEdit(text_editor::Action::Edit(text_editor::Edit::Insert('x'))), + ), + 2 => app.source_workspace.reset_navigation_session(), + 3 => app.source_editor.move_to(text_editor::Cursor { + position: text_editor::Position { line: 0, column: 0 }, + selection: None, + }), + 4 => app.source_interaction(), + 5 => { + app.source_symbols + .raw_interaction + .fetch_add(1, Ordering::SeqCst); + } + _ => app.page = Page::Diagram, + } + let after = app.source_workspace.bundle(); + let active = app.source_workspace.active.clone(); + let cursor = app.source_editor.cursor(); + send(&mut app, Message::SourceSymbolsReady(ready)); + assert!( + app.source_symbols.in_flight.is_none(), + "case {change}: release worker slot" + ); + assert!( + app.source_symbols.results.is_none(), + "case {change}: stale result surfaced" + ); + assert!(app.source_symbols.back.is_empty()); + assert_eq!(app.source_workspace.active, active); + assert_eq!(app.source_editor.cursor(), cursor); + assert_eq!(app.source_workspace.bundle(), after); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + } +} + +#[test] +fn unknown_job_cannot_release_current_worker_and_old_duplicate_cannot_replace_new_results() { + let mut app = fixture(); + let request = begin(&mut app, query::Action::References); + let ready = completion(&app, request.clone()); + let mut unrelated = ready.clone(); + unrelated.request.job = Id::new_v4(); + send(&mut app, Message::SourceSymbolsReady(unrelated)); + assert_eq!(app.source_symbols.in_flight, Some(request.job)); + assert!(app.source_symbols.results.is_none()); + send(&mut app, Message::SourceSymbolsReady(ready.clone())); + let newer = begin(&mut app, query::Action::References); + let newer_ready = completion(&app, newer.clone()); + send(&mut app, Message::SourceSymbolsReady(ready)); + assert_eq!(app.source_symbols.in_flight, Some(newer.job)); + send(&mut app, Message::SourceSymbolsReady(newer_ready)); + assert_eq!( + app.source_symbols.results.as_ref().unwrap().stamp, + newer.stamp + ); +} + +#[test] +fn close_during_busy_hides_panel_and_completion_does_not_reopen_it() { + let mut app = fixture(); + let request = begin(&mut app, query::Action::Definition); + let ready = completion(&app, request.clone()); + assert!(app.source_symbols.open); + symbol(&mut app, nav::SymbolEvent::Close); + assert!(!app.source_symbols.open); + assert_eq!(app.source_symbols.in_flight, Some(request.job)); + assert!(app.source_symbols.request.is_none()); + send(&mut app, Message::SourceSymbolsReady(ready)); + assert!(!app.source_symbols.open); + assert!(app.source_symbols.in_flight.is_none()); + assert!(app.source_symbols.results.is_none()); + assert_eq!(app.source_workspace.active, USES); + let next = begin(&mut app, query::Action::References); + assert_ne!(next.job, request.job); + assert!(app.source_symbols.open); +} + +#[test] +fn matching_reveal_ticket_is_required_and_raw_input_invalidates_pending_reveal() { + let mut app = fixture(); + finish(&mut app, query::Action::Definition); + let ticket = app.source_reveal_ticket().unwrap(); + let destination = app.source_jump.unwrap(); + let before = app.source_editor.cursor(); + assert_ne!(before, destination); + for wrong in [None, Some(Id::new_v4())] { + send(&mut app, Message::SourceViewport(wrong)); + assert_eq!(app.source_editor.cursor(), before); + assert_eq!(app.source_reveal_ticket(), Some(ticket)); + } + app.source_symbols + .raw_interaction + .fetch_add(1, Ordering::SeqCst); + send(&mut app, Message::SourceViewport(Some(ticket))); + assert_eq!( + app.source_editor.cursor(), + before, + "raw input arrived before App event dispatch" + ); + app.queue_source_reveal(destination, false); + let fresh = app.source_reveal_ticket().unwrap(); + assert_ne!(ticket, fresh); + send(&mut app, Message::SourceViewport(Some(ticket))); + assert_eq!(app.source_editor.cursor(), before); + send(&mut app, Message::SourceViewport(Some(fresh))); + assert_eq!(app.source_editor.cursor(), destination); + assert!(app.source_reveal_ticket().is_none() && app.source_jump.is_none()); +} + +#[test] +fn escape_dismisses_results_and_cancels_busy_navigation_without_changing_sources() { + for pending in [false, true] { + let mut app = fixture(); + let accepted = app.document.snapshot(); + let raw = app.source_workspace.bundle(); + let cursor = app.source_editor.cursor(); + let request = begin(&mut app, query::Action::References); + let ready = completion(&app, request.clone()); + if !pending { + send(&mut app, Message::SourceSymbolsReady(ready.clone())); + assert!(app.source_symbols.results.is_some()); + } + app.source_navigation.open = true; + send(&mut app, Message::Escape); + assert!(!app.source_symbols.open && !app.source_navigation.open); + assert!(app.source_symbols.results.is_none()); + assert!(app.source_symbols.notice.is_none()); + assert!(app.source_symbols.request.is_none()); + if pending { + assert_eq!(app.source_symbols.in_flight, Some(request.job)); + send(&mut app, Message::SourceSymbolsReady(ready)); + } + assert!(app.source_symbols.in_flight.is_none()); + assert!(!app.source_symbols.open); + assert!(app.source_symbols.results.is_none()); + assert_eq!(app.source_workspace.active, USES); + assert_eq!(app.source_editor.cursor(), cursor); + assert_eq!(app.source_workspace.bundle(), raw); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + assert!(app.source_symbols.back.is_empty()); + assert!(!app.document.can_undo() && !app.document.can_redo()); + } +} + +#[test] +fn escape_dismisses_modal_before_underlying_source_results() { + let mut app = fixture(); + let accepted = app.document.snapshot(); + let raw = app.source_workspace.bundle(); + let results = finish(&mut app, query::Action::References); + app.hosted.visible = true; + send(&mut app, Message::Escape); + assert!(!app.hosted.visible); + assert!(app.source_symbols.open); + assert!(Arc::ptr_eq( + app.source_symbols.results.as_ref().unwrap(), + &results + )); + send(&mut app, Message::Escape); + assert!(!app.source_symbols.open); + assert!(app.source_symbols.results.is_none()); + assert_eq!(app.source_workspace.bundle(), raw); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); +} + +/// Feed the real App subscription recipes the status produced by a mounted +/// TextInput. Poll only immediately available output: no timer wait, worker, +/// file dialog or App task is executed by this helper. +fn captured_input_subscription_messages(app: &App) -> Vec { + use iced::advanced::{Layout, Shell, layout, subscription, widget}; + use iced::futures::{StreamExt, stream, task::noop_waker_ref}; + use iced::keyboard::{self, key::Named}; + use std::task::{Context, Poll}; + + let mut input: iced::Element<'_, (), iced::Theme, ()> = + iced::widget::text_input("Find / modal input", "Retain exact text 雨") + .on_input(|_| ()) + .into(); + let mut tree = widget::Tree::new(input.as_widget()); + let size = iced::Size::new(300., 40.); + let node = + input + .as_widget_mut() + .layout(&mut tree, &(), &layout::Limits::new(iced::Size::ZERO, size)); + tree.state + .downcast_mut::>() + .focus(); + let event = iced::Event::Keyboard(keyboard::Event::KeyPressed { + key: keyboard::Key::Named(Named::Escape), + modified_key: keyboard::Key::Named(Named::Escape), + physical_key: keyboard::key::Physical::Code(keyboard::key::Code::Escape), + location: keyboard::Location::Standard, + modifiers: keyboard::Modifiers::empty(), + text: None, + repeat: false, + }); + let mut input_messages = Vec::new(); + let mut shell = Shell::new(&mut input_messages); + input.as_widget_mut().update( + &mut tree, + &event, + Layout::new(&node), + iced::mouse::Cursor::Unavailable, + &(), + &mut iced::advanced::clipboard::Null, + &mut shell, + &iced::Rectangle::new(iced::Point::ORIGIN, size), + ); + assert!(shell.is_event_captured()); + assert!(input_messages.is_empty()); + assert!( + !tree + .state + .downcast_ref::>() + .is_focused() + ); + let event = subscription::Event::Interaction { + window: iced::window::Id::unique(), + event, + status: iced::event::Status::Captured, + }; + let runtime = tokio::runtime::Builder::new_current_thread() + .enable_time() + .build() + .unwrap(); + let _entered = runtime.enter(); + let mut messages = Vec::new(); + for recipe in subscription::into_recipes(app.subscription()) { + let mut output = recipe.stream(Box::pin(stream::iter([event.clone()]))); + let mut context = Context::from_waker(noop_waker_ref()); + while let Poll::Ready(Some(message)) = output.poll_next_unpin(&mut context) { + assert!( + !matches!(message, Message::CheckpointTick), + "timer must remain pending" + ); + messages.push(message); + } + } + messages +} + +#[test] +fn captured_find_and_modal_escape_use_one_actual_subscription_and_preserve_pending_work() { + for pending in [false, true] { + for modal in 0..4 { + let mut app = fixture(); + let accepted = app.document.snapshot(); + let raw = app.source_workspace.bundle(); + let cursor = app.source_editor.cursor(); + let request = begin(&mut app, query::Action::References); + let ready = completion(&app, request.clone()); + if !pending { + send(&mut app, Message::SourceSymbolsReady(ready.clone())); + } + let results = app.source_symbols.results.clone(); + app.source_navigation.open = true; + match modal { + 0 => {} + 1 => app.hosted.visible = true, + 2 => { + app.file_prompt = Some(FilePrompt { + operation: FileOperation::Save, + path: "unchanged-destination.arcadia".into(), + overwrite: false, + }) + } + 3 => app.pending = Some(Pending::Walkthrough), + _ => unreachable!(), + } + let mut messages = captured_input_subscription_messages(&app); + assert_eq!(messages.len(), 1, "pending={pending}, modal={modal}"); + assert!(matches!(messages[0], Message::Escape)); + send(&mut app, messages.remove(0)); + if modal != 0 { + assert!(!app.hosted.visible && app.file_prompt.is_none() && app.pending.is_none()); + assert!(app.source_symbols.open && app.source_navigation.open); + match (&results, &app.source_symbols.results) { + (Some(before), Some(after)) => assert!(Arc::ptr_eq(before, after)), + (None, None) => {} + _ => panic!("modal Escape must retain the underlying results"), + } + let mut messages = captured_input_subscription_messages(&app); + assert_eq!(messages.len(), 1); + assert!(matches!(messages[0], Message::Escape)); + send(&mut app, messages.remove(0)); + } + assert!(!app.source_symbols.open && !app.source_navigation.open); + assert!(app.source_symbols.results.is_none() && app.source_symbols.request.is_none()); + if pending { + assert_eq!(app.source_symbols.in_flight, Some(request.job)); + send(&mut app, Message::SourceSymbolsReady(ready)); + } + assert!(app.source_symbols.in_flight.is_none()); + assert!(!app.source_symbols.open && app.source_symbols.results.is_none()); + assert_eq!(app.source_workspace.active, USES); + assert_eq!(app.source_editor.cursor(), cursor); + assert_eq!(app.source_workspace.bundle(), raw); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + assert!(!app.document.can_undo() && !app.document.can_redo()); + assert!( + captured_input_subscription_messages(&app).is_empty(), + "closed panel opts out" + ); + } + } +} + +#[test] +fn captured_subscription_does_not_duplicate_existing_behavior_or_architecture_routes() { + let mut app = fixture(); + app.source_symbols.open = true; + let project = app.project().clone(); + assert!( + app.behavior + .creation + .update(&project, crate::behavior::creation::Event::Open(Layer::Oa)) + .unwrap() + .is_none() + ); + assert!(app.behavior.creation.has_pending()); + let messages = captured_input_subscription_messages(&app); + assert_eq!( + messages.len(), + 1, + "behavior and symbols share the same bridge" + ); + assert!(matches!(messages[0], Message::Escape)); + + let mut app = App::with_project(Project::empty()); + send(&mut app, Message::AddDiagram); + send( + &mut app, + Message::Architecture(crate::app::architecture_authoring::Event::Start( + Kind::Actor, + Some(oa_core::Position { x: 120., y: 160. }), + )), + ); + assert!(app.architecture.as_ref().unwrap().inline()); + // A retained Text panel must not add a second route to inline architecture. + app.page = Page::Text; + app.source_symbols.open = true; + let messages = captured_input_subscription_messages(&app); + assert_eq!(messages.len(), 1); + assert!(matches!( + messages[0], + Message::Architecture(crate::app::architecture_authoring::Event::CapturedEscape) + )); + app.architecture = None; + app.page = Page::Behavior; + assert!( + captured_input_subscription_messages(&app).is_empty(), + "off-page symbols opt out" + ); +} + +#[test] +fn saturated_raw_clock_never_authorizes_completion_or_reveal() { + let mut app = fixture(); + app.source_symbols + .raw_interaction + .store(u64::MAX, Ordering::SeqCst); + symbol(&mut app, nav::SymbolEvent::Query(query::Action::Definition)); + if let Some(request) = app.source_symbols.request.clone() { + let ready = completion(&app, request); + send(&mut app, Message::SourceSymbolsReady(ready)); + } + assert!(app.source_symbols.results.is_none()); + assert_eq!(app.source_workspace.active, USES); + let before = app.source_editor.cursor(); + let cursor = text_editor::Cursor { + position: text_editor::Position { line: 0, column: 0 }, + selection: None, + }; + app.queue_source_reveal(cursor, false); + reveal(&mut app); + assert_eq!(app.source_editor.cursor(), before); +} + +#[test] +fn back_restores_exact_reversed_utf8_selection_and_crlf_source() { + let mut app = fixture(); + let origin = app.source_editor.cursor(); + assert!( + origin.position.column > origin.selection.unwrap().column, + "reverse selection fixture" + ); + let raw = app.source_workspace.bundle(); + assert!(raw.files[USES].contains("\r\n")); + finish(&mut app, query::Action::Definition); + reveal(&mut app); + symbol(&mut app, nav::SymbolEvent::Back); + assert_eq!(app.source_workspace.active, USES); + assert_eq!(app.source_jump, Some(origin)); + reveal(&mut app); + assert_eq!(app.source_editor.cursor(), origin); + assert_eq!(app.source_workspace.bundle(), raw); + assert!(app.source_symbols.back.is_empty()); +} + +#[test] +fn back_after_origin_edit_uses_its_current_cursor_instead_of_the_old_range() { + let mut app = fixture(); + let old_origin = app.source_editor.cursor(); + finish(&mut app, query::Action::Definition); + reveal(&mut app); + show(&mut app, USES); + send( + &mut app, + Message::SourceEdit(text_editor::Action::SelectAll), + ); + send( + &mut app, + Message::SourceEdit(text_editor::Action::Edit(text_editor::Edit::Paste( + Arc::new("// changed\n@pump\n".into()), + ))), + ); + let current = text_editor::Cursor { + position: text_editor::Position { line: 1, column: 5 }, + selection: Some(text_editor::Position { line: 1, column: 1 }), + }; + app.source_editor.move_to(current); + show(&mut app, DEFINITIONS); + assert_ne!(old_origin, current); + let changed = app.source_workspace.bundle(); + symbol(&mut app, nav::SymbolEvent::Back); + assert_eq!(app.source_jump, Some(current)); + reveal(&mut app); + assert_eq!(app.source_editor.cursor(), current); + assert_eq!(app.source_workspace.bundle(), changed); + assert!( + app.source_symbols + .notice + .as_deref() + .is_some_and(|notice| notice.contains("changed")) + ); +} + +#[test] +fn reset_retains_worker_slot_until_old_completion_then_admits_new_session_query() { + let mut app = fixture(); + let request = begin(&mut app, query::Action::Definition); + let ready = completion(&app, request.clone()); + let old_session = app.source_workspace.session(); + let project = app.project().clone(); + app.reset(project, None); + assert_ne!(app.source_workspace.session(), old_session); + assert_eq!(app.source_symbols.in_flight, Some(request.job)); + assert!(app.source_symbols.request.is_none()); + app.page = Page::Text; + let text = app.source_workspace.text(); + let alias = text.find("project model").unwrap() + "project ".len(); + app.source_editor + .move_to(selection(text, alias, alias + 5, false)); + symbol(&mut app, nav::SymbolEvent::Query(query::Action::Definition)); + assert_eq!(app.source_symbols.in_flight, Some(request.job)); + assert!( + app.source_symbols.request.is_none(), + "reset must not create a second active worker" + ); + send(&mut app, Message::SourceSymbolsReady(ready)); + assert!(app.source_symbols.in_flight.is_none()); + assert!(app.source_symbols.results.is_none()); + let fresh = begin(&mut app, query::Action::Definition); + assert_eq!( + fresh.stamp.snapshot.workspace, + app.source_workspace.session() + ); + assert_ne!(fresh.stamp.snapshot.workspace, old_session); + let ready = completion(&app, fresh); + send(&mut app, Message::SourceSymbolsReady(ready)); + assert!(app.source_symbols.results.is_some()); +} + +#[test] +fn back_keeps_the_latest_64_actual_locations_without_reusing_dropped_history() { + let mut app = fixture(); + let text: String = (0..80).map(|line| format!("// 行 {line}\r\n")).collect(); + let loaded = SourceBundle { + entry: "trail.arcadia".into(), + files: BTreeMap::from([("trail.arcadia".into(), text)]), + }; + app.source_workspace = Workspace::new(&loaded, false); + app.show_source_file(false); + let cursor = |line| text_editor::Cursor { + position: text_editor::Position { line, column: 0 }, + selection: Some(text_editor::Position { line, column: 1 }), + }; + app.source_editor.move_to(cursor(0)); + for line in 1..=66 { + app.source_symbol_jump( + "trail.arcadia", + query::Position { + line, + byte_column: 0, + }, + query::Position { + line, + byte_column: 1, + }, + ); + reveal(&mut app); + assert_eq!(app.source_editor.cursor(), cursor(line)); + } + assert_eq!(app.source_symbols.back.len(), 64); + assert_eq!(app.source_symbols.back.first().unwrap().cursor, cursor(2)); + for line in (2..=65).rev() { + symbol(&mut app, nav::SymbolEvent::Back); + reveal(&mut app); + assert_eq!(app.source_editor.cursor(), cursor(line)); + } + assert!(app.source_symbols.back.is_empty()); + symbol(&mut app, nav::SymbolEvent::Back); + assert_eq!(app.source_editor.cursor(), cursor(2)); + assert_eq!(app.source_workspace.bundle(), loaded); +} + +/// Replay frozen widget messages without rebuilding their context. In a real +/// Iced batch these can follow a reset or file switch before the next view diff. +fn assert_stale_envelopes_preserve_current(app: &mut App, messages: &[Message]) { + let interaction = app.source_symbols.interaction; + let raw_interaction = app.source_symbols.raw_interaction.load(Ordering::SeqCst); + let request = app.source_symbols.request.as_ref().map(|request| { + ( + request.job, + request.interaction, + request.raw_interaction, + request.stamp, + request.path.clone(), + request.offset, + request.cursor, + request.action, + ) + }); + let in_flight = app.source_symbols.in_flight; + let serial = app.source_symbols.serial; + let reveal = app.source_symbols.reveal.as_ref().map(|reveal| { + ( + reveal.ticket, + reveal.interaction, + reveal.raw_interaction, + reveal.snapshot, + reveal.path.clone(), + ) + }); + let jump = (app.source_jump, app.source_select_line); + let back: Vec<_> = app + .source_symbols + .back + .iter() + .map(|entry| { + ( + entry.session, + entry.path.clone(), + entry.generation, + entry.cursor, + ) + }) + .collect(); + let results = app.source_symbols.results.clone(); + let cache = app.source_symbols.cache.clone(); + let panel = (app.source_symbols.open, app.source_symbols.notice.clone()); + let key = app.source_key(); + let active = app.source_workspace.active.clone(); + let cursor = app.source_editor.cursor(); + let editor = app.source_editor.text(); + let raw = app.source_workspace.bundle(); + let accepted = app.document.snapshot(); + let history = ( + app.document.revision(), + app.document.can_undo(), + app.document.can_redo(), + app.document.dirty(), + ); + for message in messages.iter().cloned() { + send(app, message); + assert_eq!( + app.source_symbols.interaction, interaction, + "reject stale context before invalidating current intent" + ); + assert_eq!( + app.source_symbols.raw_interaction.load(Ordering::SeqCst), + raw_interaction + ); + assert_eq!( + app.source_symbols.request.as_ref().map(|request| ( + request.job, + request.interaction, + request.raw_interaction, + request.stamp, + request.path.clone(), + request.offset, + request.cursor, + request.action, + )), + request + ); + assert_eq!( + (app.source_symbols.in_flight, app.source_symbols.serial), + (in_flight, serial) + ); + assert_eq!( + app.source_symbols.reveal.as_ref().map(|reveal| ( + reveal.ticket, + reveal.interaction, + reveal.raw_interaction, + reveal.snapshot, + reveal.path.clone(), + )), + reveal + ); + assert_eq!((app.source_jump, app.source_select_line), jump); + assert_eq!( + app.source_symbols + .back + .iter() + .map(|entry| ( + entry.session, + entry.path.clone(), + entry.generation, + entry.cursor, + )) + .collect::>(), + back + ); + assert_eq!( + (app.source_symbols.open, app.source_symbols.notice.clone()), + panel + ); + match (&results, &app.source_symbols.results) { + (Some(before), Some(after)) => assert!(Arc::ptr_eq(before, after)), + (None, None) => {} + _ => panic!("stale envelope replaced or cleared current results"), + } + match (&cache, &app.source_symbols.cache) { + (Some(before), Some(after)) => assert!(Arc::ptr_eq(before, after)), + (None, None) => {} + _ => panic!("stale envelope replaced or cleared current snapshot"), + } + assert_eq!(app.source_key(), key); + assert_eq!(app.source_workspace.active, active); + assert_eq!(app.source_editor.cursor(), cursor); + assert_eq!(app.source_editor.text(), editor); + assert_eq!(app.source_workspace.bundle(), raw); + assert!(Arc::ptr_eq(&accepted, &app.document.snapshot())); + assert_eq!(app.project(), &accepted.decoded.project); + assert_eq!(app.document.bundle(), &accepted.bundle); + assert_eq!( + ( + app.document.revision(), + app.document.can_undo(), + app.document.can_redo(), + app.document.dirty() + ), + history + ); + } +} + +fn stale_envelope_trial(reset: bool) { + let mut app = fixture(); + if reset { + show(&mut app, "project.arcadia"); + let text = app.source_workspace.text(); + let alias = text.find("project model").unwrap() + "project ".len(); + app.source_editor + .move_to(selection(text, alias, alias + 5, false)); + } + let old_results = finish(&mut app, query::Action::References); + let old_context = app.source_symbol_context(); + let old_messages = [ + app.source_symbol_message(nav::SymbolEvent::Query(query::Action::Definition)), + app.source_symbol_message(nav::SymbolEvent::Back), + app.source_symbol_message(nav::SymbolEvent::Close), + app.source_symbol_message(nav::SymbolEvent::Choose { + stamp: old_results.stamp, + reference: false, + index: 0, + }), + ]; + if reset { + let project = app.project().clone(); + app.reset(project, None); + app.page = Page::Text; + let new_context = app.source_symbol_context(); + assert_eq!( + new_context.path, old_context.path, + "same path isolates the session guard" + ); + assert_ne!(new_context.session, old_context.session); + } else { + show(&mut app, DEFINITIONS); + let new_context = app.source_symbol_context(); + assert_ne!(new_context.path, old_context.path); + assert_eq!( + new_context.session, old_context.session, + "file switch isolates the path guard" + ); + assert_eq!(app.source_key(), old_results.stamp.snapshot); + } + let text = app.source_workspace.text(); + let (alias, length) = if reset { + (text.find("project model").unwrap() + "project ".len(), 5) + } else { + ( + text.find("oa_activity pump").unwrap() + "oa_activity ".len(), + 4, + ) + }; + let cursor = selection(text, alias, alias + length, false); + app.source_editor.move_to(cursor); + // A real jump creates useful current Back history before the next request. + let path = app.source_workspace.active.clone(); + app.source_symbol_jump( + &path, + query::Position { + line: cursor.position.line, + byte_column: cursor.position.column, + }, + query::Position { + line: cursor.selection.unwrap().line, + byte_column: cursor.selection.unwrap().column, + }, + ); + reveal(&mut app); + let current = begin(&mut app, query::Action::References); + let ready = completion(&app, current.clone()); + app.queue_source_reveal(cursor, false); + assert_stale_envelopes_preserve_current(&mut app, &old_messages); + send(&mut app, Message::SourceSymbolsReady(ready)); + assert_eq!( + app.source_symbols.results.as_ref().unwrap().stamp, + current.stamp + ); + assert!(app.source_symbols.in_flight.is_none()); + // Replay once more with no busy-slot fallback and visible current results. + assert_stale_envelopes_preserve_current(&mut app, &old_messages); + let interaction = app.source_symbols.interaction; + symbol(&mut app, nav::SymbolEvent::Close); + assert_ne!(app.source_symbols.interaction, interaction); + assert!(!app.source_symbols.open && app.source_symbols.results.is_none()); + let next = begin(&mut app, query::Action::References); + assert_ne!( + next.job, current.job, + "a freshly wrapped current-context Query remains usable" + ); + let ready = completion(&app, next); + send(&mut app, Message::SourceSymbolsReady(ready)); + assert!(app.source_symbols.results.is_some()); +} + +#[test] +fn old_symbol_widget_envelopes_after_reset_preserve_new_same_path_intent() { + stale_envelope_trial(true); +} + +#[test] +fn old_symbol_widget_envelopes_after_file_switch_preserve_same_session_intent() { + stale_envelope_trial(false); +} + +#[test] +#[ignore = "manual 100-module latency/process-memory trial; run alone with --ignored --nocapture --test-threads=1"] +fn source_symbols_100_modules_1000_definitions_10000_uses() { + let mut files = BTreeMap::new(); + let mut entry = "arcadia 7; project performance \"Current text trial\" {\n".to_owned(); + for module in 0..100 { + let path = format!("modules/m{module:03}.arcadia"); + entry.push_str(&format!(" include \"{path}\";\n")); + let mut text = String::new(); + for declaration in 0..10 { + text.push_str(&format!("oa_process p_{module}_{declaration} \"Process {module}/{declaration} 雨\" {{ steps [")); + for reference in 0..10 { + if reference != 0 { + text.push_str(", "); + } + text.push_str("@p_0_0"); + } + text.push_str("]; description \"@p_0_0 is literal documentation\"; }\n"); + } + files.insert(path, text); + } + entry.push_str("}\n"); + files.insert("project.arcadia".into(), entry); + let original = files.clone(); + let input_bytes: usize = files.values().map(String::len).sum(); + let drafts: Vec<_> = files + .iter() + .map(|(path, text)| query::DraftFile { path, text }) + .collect(); + let key = query::SnapshotKey { + workspace: Id::new_v4(), + revision: 1, + }; + let memory_before = process_memory(); + let started = Instant::now(); + let owned = query::admit_owned( + query::Input { + key, + entry: "project.arcadia", + files: &drafts, + applied: false, + validation: None, + }, + query::Limits::default(), + ) + .unwrap(); + let admitted = started.elapsed(); + let started = Instant::now(); + let snapshot = owned.capture().unwrap(); + let captured = started.elapsed(); + let path = "modules/m000.arcadia"; + let offset = files[path].find("p_0_0").unwrap(); + let started = Instant::now(); + let result = snapshot + .query(query::Query { + stamp: query::QueryStamp { + snapshot: key, + serial: 1, + }, + path, + byte_offset: offset, + action: query::Action::References, + }) + .unwrap(); + let queried = started.elapsed(); + let memory_after = process_memory(); + assert_eq!(files.len(), 101, "100 modules plus entry"); + assert_eq!( + files + .values() + .map(|text| text.matches("oa_process ").count()) + .sum::(), + 1000 + ); + assert_eq!(result.total_definitions, 1); + assert_eq!(result.total_references, 10_000); + assert_eq!(result.references.len() + result.omitted_references, 10_000); + assert!( + result.definitions.len() + result.references.len() <= query::Limits::default().result_rows + ); + assert!(result.scope.closure_complete && !result.scope.validated); + assert_eq!(files, original); + eprintln!( + "100-module current-draft trial: bytes={input_bytes}, admission={admitted:?}, capture={captured:?}, references={queried:?}, rows={}, omitted={}, process_memory_before={memory_before:?}, process_memory_after={memory_after:?}", + result.references.len(), + result.omitted_references + ); + // This fixture intentionally has process-to-process placeholder steps. It + // measures lexical draft navigation, not engineering validity or GUI latency. +} + +#[cfg(not(windows))] +fn process_memory() -> Option<(usize, usize)> { + None +} + +#[cfg(windows)] +fn process_memory() -> Option<(usize, usize)> { + #[repr(C)] + #[derive(Default)] + struct Counters { + cb: u32, + page_fault_count: u32, + peak_working_set: usize, + working_set: usize, + quota_peak_paged_pool: usize, + quota_paged_pool: usize, + quota_peak_non_paged_pool: usize, + quota_non_paged_pool: usize, + pagefile_usage: usize, + peak_pagefile_usage: usize, + } + #[link(name = "kernel32")] + unsafe extern "system" { + fn GetCurrentProcess() -> *mut std::ffi::c_void; + fn K32GetProcessMemoryInfo( + process: *mut std::ffi::c_void, + counters: *mut Counters, + size: u32, + ) -> i32; + } + let size = u32::try_from(std::mem::size_of::()).unwrap(); + let mut counters = Counters { + cb: size, + ..Counters::default() + }; + // Windows writes one correctly sized PROCESS_MEMORY_COUNTERS for this + // process. These are process-wide resident/peak bytes, not exact allocations. + let ok = unsafe { K32GetProcessMemoryInfo(GetCurrentProcess(), &mut counters, size) }; + (ok != 0).then_some((counters.working_set, counters.peak_working_set)) +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/views.rs b/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/views.rs new file mode 100644 index 00000000..1a74bc65 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/originals/crates/oa-desktop/src/views.rs @@ -0,0 +1,1362 @@ +mod source_symbols; +pub(crate) mod traceability; +use crate::{ + app::{App, Choice, FileOperation, Message, Page, Pending}, + diagram::DiagramCanvas, + forms, style, +}; +use iced::{ + Element as View, Fill, Font, + widget::{ + self, Space, button, column, container, pick_list, row, scrollable, text, text_input, + tooltip, + }, +}; +use oa_core::*; + +pub fn label<'a>(s: impl Into) -> widget::Text<'a> { + text(s.into()).size(11).color(style::MUTED) +} +pub fn action<'a>(s: &str, m: Message) -> widget::Button<'a, Message> { + button(text(s.to_owned()).size(12)) + .padding([8, 10]) + .on_press(m) + .style(style::nav) +} +pub fn short(s: &str, limit: usize) -> String { + let s = s.split_whitespace().collect::>().join(" "); + if s.chars().count() > limit { + format!( + "{}…", + s.chars().take(limit.saturating_sub(1)).collect::() + ) + } else { + s + } +} +pub fn heading<'a>(title: &str, subtitle: &str) -> View<'a, Message> { + column![ + text(title.to_owned()).size(24).color(style::INK), + label(subtitle) + ] + .spacing(6) + .into() +} + +pub fn view(app: &App) -> View<'_, Message> { + let p = app.project(); + let header = container( + row![ + row![ + text("◈").size(28).color(style::TEAL), + column![ + text("ARCADIA STUDIO").size(14), + label("SYSTEMS ENGINEERING · V2") + ] + .spacing(3) + ] + .spacing(10) + .width(220), + column![text(short(&p.name, 46)).size(17), label(app.hosted_label())] + .spacing(3) + .width(Fill), + action("New", Message::Request(Pending::New)), + crate::hosted::view::header_action(), + action("Open", Message::Request(Pending::Open)), + action("Save as", Message::Save(true)), + button(text(app.save_label()).size(12)) + .padding([10, 16]) + .on_press(Message::Save(false)) + ] + .spacing(8) + .align_y(iced::Center), + ) + .padding([14, 18]) + .style(style::panel); + let mut nav = column![ + label("ENGINEERING PERSPECTIVE"), + row![ + button(text("01 Operational").size(11)) + .padding(9) + .width(Fill) + .on_press(Message::Layer(Layer::Oa)) + .style(if app.layer == Layer::Oa { + button::primary + } else { + style::nav + }), + button(text("02 System").size(11)) + .padding(9) + .width(Fill) + .on_press(Message::Layer(Layer::Sa)) + .style(if app.layer == Layer::Sa { + button::primary + } else { + style::nav + }) + ] + .spacing(3), + Space::new().height(5) + ] + .spacing(8); + let mut task_nav = row![].spacing(2); + for (page, name) in [ + (Page::Home, "Home"), + (Page::Diagram, "Architecture"), + (Page::Catalog, "Model explorer"), + (Page::Behavior, "Behavior & scenarios"), + (Page::Data, "Data & interfaces"), + (Page::Traces, "Traceability"), + (Page::Text, "Textual model"), + (Page::Validation, "Model checks"), + (Page::Guide, "Engineering guide"), + ] { + task_nav = task_nav.push( + button(text(name).size(12)) + .padding([9, 11]) + .on_press(Message::Page(page)) + .style(if app.page == page { + style::selected + } else { + style::nav + }), + ); + } + let task_nav = container(task_nav.wrap()) + .width(Fill) + .padding([4, 14]) + .style(style::panel); + let mut creation = column![label("CREATE ELEMENT")].spacing(8); + let kinds = Kind::ALL + .into_iter() + .filter(|k| k.supports(app.layer) && *k != Kind::Port) + .collect::>(); + creation = creation.push( + pick_list(kinds, Some(app.create_kind), Message::CreateKind) + .text_size(12) + .padding(8) + .width(Fill), + ); + let allocated = app.create_kind.is_work() + && p.elements + .get(&app.selected) + .is_some_and(|e| e.layer() == app.layer && e.kind().is_performer()); + if crate::port_workflow::actions(p, app.selected) + .contains(&crate::port_workflow::Action::Component) + { + creation = creation.push( + button(text("+ Add port to selected…").size(12)) + .padding(9) + .width(Fill) + .on_press(Message::PortAction(crate::port_workflow::Action::Component)), + ); + } + creation = creation.push( + row![ + button(text("+ At root").size(11)) + .padding(8) + .style(style::nav) + .width(Fill) + .on_press_maybe( + validation::can_parent(p, app.create_kind, app.layer, None) + .then_some(Message::Add(false)) + ), + button( + text(if allocated { + "+ Allocated" + } else { + "+ In selected" + }) + .size(11) + ) + .padding(8) + .style(style::nav) + .width(Fill) + .on_press_maybe( + (allocated + || validation::can_parent(p, app.create_kind, app.layer, Some(app.selected))) + .then_some(Message::Add(true)) + ) + ] + .spacing(3), + ); + nav = nav.push( + text_input("Search names or @aliases…", &app.search) + .on_input(Message::Search) + .size(12) + .padding(9), + ); + nav = nav + .push( + row![ + action("Collapse all", Message::ExplorerCollapseAll), + action("Locate", Message::ExplorerLocate) + ] + .spacing(3), + ) + .push(crate::explorer_view::sidebar(app)); + if app.page != Page::Diagram { + nav = nav.push(creation); + } + nav = nav.push(action("Project properties", Message::SelectProject).width(Fill)); + let sidebar = container(if app.page == Page::Text { + source_files(app) + } else { + nav.into() + }) + .padding(14) + .width(260) + .height(Fill) + .style(style::panel); + let main = match app.page { + Page::Home => crate::home::view( + &app.home, + (app.dirty() + || !p.elements.is_empty() + || app.path.is_some() + || app.hosted.session.is_some()) + .then_some((p.name.as_str(), app.dirty())), + &app.recovery, + ) + .map(Message::Home), + Page::Diagram => diagram(app), + Page::Catalog => crate::explorer_view::catalog(app), + Page::Data => data_catalog(app), + Page::Behavior => crate::behavior::view(app), + Page::Traces => traces(app), + Page::Text => source(app), + Page::Validation => checks(app), + Page::Guide => crate::guide::view(&app.guide), + }; + let process_layout = app.topology_context().is_some(); + let scenario_layout = app.scenario_context().is_some(); + let focus_behavior = (process_layout && app.behavior.topology.focused) + || (scenario_layout && app.behavior.scenario.focused()); + let mut body = if app.page == Page::Home { + row![container(main).width(Fill).height(Fill)].height(Fill) + } else if process_layout || scenario_layout { + // Keep main at the same widget-tree path across Focus toggles. The + // collapsed slot has no controls, so it cannot paint over or hit the canvas. + let process_sidebar: View<'_, Message> = if focus_behavior { + Space::new().width(0).into() + } else { + sidebar.into() + }; + // Row::push would discard the zero-width slot and shift main again. + widget::Row::from_vec(vec![ + container(process_sidebar) + .width(if focus_behavior { 0 } else { 260 }) + .height(Fill) + .clip(true) + .into(), + container(main).width(Fill).height(Fill).into(), + ]) + .width(Fill) + .height(Fill) + } else { + row![sidebar, container(main).width(Fill).height(Fill)].height(Fill) + }; + if !focus_behavior && !matches!(app.page, Page::Home | Page::Text | Page::Guide) { + body = body.push(inspector(app)); + } + let footer = container( + row![ + container(tooltip( + text(short(if app.busy { "Working…" } else { &app.status }, 145)).size(11), + container(text(if app.busy { "Working…" } else { &app.status }).size(12)) + .padding(10) + .max_width(600) + .style(style::card), + tooltip::Position::Top, + )) + .width(Fill), + label(format!( + "{} objects · {} links", + p.elements.len(), + p.relations.len() + )), + action( + &format!("{} checks", app.issue_count()), + Message::Page(Page::Validation) + ) + ] + .spacing(12) + .align_y(iced::Center), + ) + .padding([4, 16]) + .style(style::panel); + let root: View<'_, Message> = column![header, task_nav, body, footer].into(); + if app.architecture.as_ref().is_some_and(|s| s.modal()) { + return modal_width( + root, + crate::app::architecture_authoring::dialog(app), + (app.window_size.width - 50.).clamp(500., 820.), + ); + } + if let Some(workflow) = &app.workflow { + if matches!(workflow, crate::workflow::Workflow::Semantic(_)) { + return modal_width( + root, + workflow.view(p), + (app.window_size.width - 50.).clamp(800., 1120.), + ); + } + return modal(root, workflow.view(p)); + } + if let Some(p) = &app.file_prompt { + let title = match p.operation { + FileOperation::Open => "Open model", + FileOperation::Save => "Save model", + FileOperation::Export => "Export diagram", + }; + return modal( + root, + column![ + text(title).size(21), + label(match p.operation { + FileOperation::Export => "Save this diagram as .svg.", + FileOperation::Save => "Choose a .arcadia entry in a new destination, or .json to export the model.", + FileOperation::Open => "Open an .arcadia project entry or import a .json model.", + }), + text_input("File path", &p.path) + .on_input(Message::FilePath) + .on_submit(Message::SubmitFile) + .padding(10) + .size(13), + text(match (p.operation, p.overwrite) { + (FileOperation::Export, true) => + "This file exists. Replace it with the current diagram?", + (FileOperation::Export, false) => + "Includes visible elements and their authored connection routes.", + (FileOperation::Save, _) => "Source Save As retains included file paths. Existing destination files are protected.", + (FileOperation::Open, _) => "Included source files are loaded together. Invalid drafts remain editable.", + }) + .size(12), + row![ + action("Cancel", Message::CancelFile), + button(text(if p.overwrite { "Replace file" } else { title }).size(12)) + .padding(10) + .on_press(Message::SubmitFile) + ] + .spacing(10) + ] + .spacing(16) + .into(), + ); + } + if app.delete_pending { + return modal(root,column![text("Delete from model?").size(21),text(format!("{} and its owned elements will be removed. Incident relationships, occurrences and view placements are updated together. Counterparts in the other layer remain.",p.named(app.selected))).size(13),label("Undo restores the complete change. Use Hide for diagram-only removal."),row![action("Cancel",Message::CancelDelete),button("Delete from model").style(button::danger).padding(10).on_press(Message::ConfirmDelete)].spacing(10)].spacing(16).into()); + } + if app.pending.is_some() { + return modal(root,column![text("Keep your changes?").size(21),text("Save the model and pending edits before continuing. Invalid drafts stay available for correction.").size(13),row![action("Cancel",Message::Cancel),action("Discard changes",Message::Discard),button("Save & continue").padding(10).on_press(Message::SaveAndContinue)].spacing(8)].spacing(16).into()); + } + root +} +fn modal<'a>(base: View<'a, Message>, content: View<'a, Message>) -> View<'a, Message> { + modal_width(base, content, 800.) +} +fn modal_width<'a>( + base: View<'a, Message>, + content: View<'a, Message>, + width: f32, +) -> View<'a, Message> { + widget::stack![ + base, + widget::opaque( + container( + container(content) + .padding(26) + .width(width) + .style(style::card) + ) + .center(Fill) + .style(|_| container::Style { + background: Some(iced::Color::from_rgba(0.08, 0.12, 0.18, 0.38).into()), + ..Default::default() + }) + ) + ] + .into() +} +fn diagram(app: &App) -> View<'_, Message> { + let mut diagrams = app + .project() + .diagrams + .values() + .filter(|d| d.layer == app.layer || d.projection == ProjectionKind::Traceability) + .map(|d| Choice { + id: d.id, + label: d.name.clone(), + }) + .collect::>(); + diagrams.sort_by(|a, b| a.label.cmp(&b.label).then(a.id.cmp(&b.id))); + let selected = diagrams + .iter() + .find(|c| Some(c.id) == app.active_diagram) + .cloned(); + let mut chooser = row![ + pick_list(diagrams, selected, Message::Diagram) + .placeholder("Choose diagram") + .text_size(12) + .padding(8) + .width(Fill), + action("+ View", Message::AddDiagram) + ] + .spacing(7) + .align_y(iced::Center); + let mut controls = row![ + action("Fit", Message::Fit), + action("−", Message::Zoom(1. / 1.2)), + label(format!("{:.0}%", app.zoom * 100.)), + action("+", Message::Zoom(1.2)), + action("Export SVG", Message::Export) + ] + .spacing(7) + .align_y(iced::Center); + if let Some(id) = app.active_diagram { + chooser = chooser.push(action("View properties", Message::Select(id))); + controls = controls.push(action("Arrange", Message::Command(Command::Layout(id)))); + } + let toolbar = column![chooser, controls].spacing(6); + let projection = app + .active_diagram + .and_then(|id| app.project().diagrams.get(&id)) + .map(|d| d.projection); + let modes = row![ + label("View content"), + pick_list( + [ + ProjectionKind::Allocation, + ProjectionKind::FunctionalDataflow, + ProjectionKind::Capabilities, + ProjectionKind::Decomposition, + ProjectionKind::Overview, + ProjectionKind::Traceability, + ], + projection, + Message::Projection + ) + .padding(8) + .text_size(12) + ] + .spacing(10) + .align_y(iced::Center); + let canvas: View<'_, Message> = if let Some(id) = app.active_diagram { + let program = DiagramCanvas { + project: app.project(), + view_index: Some(app.document.view_index()), + diagram: id, + selected: app.selected, + zoom: app.zoom, + pan: app.pan, + context: app.route_context().unwrap(), + selected_bend: app + .selected_bend + .filter(|(edge, _)| *edge == app.selected) + .map(|(_, i)| i), + editable: !app.draft_dirty() && !app.source_dirty(), + placing: app.architecture.as_ref().is_some_and(|s| s.saved.placing), + connection: app.connection.as_ref(), + }; + let mut scene = widget::stack![ + widget::canvas(program).width(Fill).height(Fill), + widget::canvas(crate::diagram::PortLabels(program)) + .width(Fill) + .height(Fill), + ]; + if let Some(editor) = crate::app::architecture_authoring::inline_editor(app) { + scene = scene.push(editor); + } + row![ + widget::sensor(scene) + .on_show(Message::CanvasResized) + .on_resize(Message::CanvasResized), + crate::app::architecture_authoring::palette(app) + ] + .height(Fill) + .width(Fill) + .into() + } else { + container( + column![ + text(if app.layer == Layer::Oa { + "Define the operational context" + } else { + "Define your system boundary" + }) + .size(23), + text("Create a view, then add participants and the work they perform.") + .size(13) + .color(style::MUTED), + button("Create architecture view") + .padding(12) + .on_press(Message::AddDiagram) + ] + .spacing(16), + ) + .center(Fill) + .into() + }; + let mut tools = column![toolbar].spacing(8); + if app.active_diagram.is_some() { + tools = tools.push(modes); + } + if let Some(diagram) = app.active_diagram { + let view = oa_core::projection::project_view(app.project(), diagram); + let edge = view.edges.iter().find(|edge| edge.id == app.selected); + let promoted = edge.is_some_and(|edge| { + oa_core::projection::edge_endpoint_placements( + app.project(), + &app.project().diagrams[&diagram], + edge.id, + ) + .is_some_and(|(source, target)| source != edge.source || target != edge.target) + }); + let hint = if let Some(session) = &app.connection { + if session.source.is_some() { + if session.candidates.is_empty() { + "No compatible targets are visible. Expand containers or show an endpoint · Esc cancels" + } else { + "Choose a highlighted target · middle-drag or arrow keys pan · Esc cancels" + } + } else { + session.tool.hint() + } + } else if promoted { + "Expand endpoint containers to edit this connection route" + } else if edge.is_some() { + "Right-click for routing · drag line / bend / label · Insert adds a bend · Esc cancels" + } else { + "Right-click for actions · drag to arrange · scroll to zoom" + }; + tools = tools.push(container(label(hint)).height(30)); + } + column![container(tools).padding(14), canvas].into() +} + +fn inspector(app: &App) -> View<'_, Message> { + let p = app.project(); + if app.source_dirty() { + let mut notice = column![ + text("Source drafts pending").size(17), + label("Properties become editable after source drafts are applied or reverted."), + action("Open source drafts", Message::Page(Page::Text)) + ] + .spacing(12); + if app.draft_dirty() { + notice = notice + .push(label( + "A property draft is also retained. Revert it to apply the source drafts.", + )) + .push(action("Revert property draft", Message::RevertProperties)); + } + return container(notice) + .padding(14) + .width(320) + .height(Fill) + .style(style::panel) + .into(); + } + let tabs = row![ + action( + "Properties", + Message::InspectorTab(crate::navigation::InspectorTab::Properties) + ) + .style( + if app.inspector_tab == crate::navigation::InspectorTab::Properties { + style::selected + } else { + style::nav + } + ), + action( + "Connections", + Message::InspectorTab(crate::navigation::InspectorTab::Connections) + ) + .style( + if app.inspector_tab == crate::navigation::InspectorTab::Connections { + style::selected + } else { + style::nav + } + ), + ] + .spacing(4); + if app.inspector_tab == crate::navigation::InspectorTab::Connections { + return container( + column![ + tabs, + scrollable(crate::navigation::view(p, app.selected)).height(Fill) + ] + .spacing(14), + ) + .padding(14) + .width(320) + .height(Fill) + .style(style::panel) + .into(); + } + let mut body = column![ + row![ + label("PROPERTIES"), + Space::new().width(Fill), + crate::model_menu::trigger(app) + ] + .align_y(iced::Center) + ] + .spacing(12); + if let Some(e) = p.elements.get(&app.selected) { + body = body.push( + row![ + text(e.kind().label()) + .size(17) + .color(style::kind_color(e.kind())), + Space::new().width(Fill), + label(e.layer().to_string()) + ] + .align_y(iced::Center), + ); + body = body.push( + pick_list( + Kind::ALL + .into_iter() + .filter(|k| k.supports(e.layer())) + .collect::>(), + Some(e.kind()), + Message::ElementKind, + ) + .text_size(12) + .padding(8) + .width(Fill), + ); + if let Some(parent) = e.parent { + body = body.push( + action( + &format!("Parent: {}", short(p.named(parent), 27)), + Message::Select(parent), + ) + .width(Fill), + ); + } + for r in p + .relations + .values() + .filter(|r| r.kind() == RelationKind::Allocation && r.target() == e.id) + { + body = body.push( + action( + &format!("Performer: {}", short(p.named(r.source()), 24)), + Message::Select(r.source()), + ) + .width(Fill), + ); + } + if !p + .relations + .values() + .any(|r| r.kind() == RelationKind::Allocation && r.target() == e.id) + && let Some(performer) = oa_core::validation::allocation_summary(p, e.id) + { + body = body.push(label( + "Allocation summary: all leaf activities or functions belong to the same performer. The parent has no direct allocation.", + )); + body = body.push( + action( + &format!("Leaf performer: {}", short(p.named(performer), 24)), + Message::Select(performer), + ) + .width(Fill), + ); + } + } + // Keep a discoverable primary action; secondary actions live in Actions. + if p.elements + .get(&app.selected) + .is_some_and(|e| e.layer() == Layer::Oa && matches!(e.kind(), Kind::Entity | Kind::Actor)) + { + let draw = app.page == Page::Diagram + && app.active_diagram.is_some_and(|diagram| { + crate::connection_edit::visible(&projection::project_view(p, diagram)) + .any(|id| id == app.selected) + }); + body = body.push( + button( + text(if draw { + "Draw communication means" + } else { + "Configure communication means…" + }) + .size(12), + ) + .padding(9) + .width(Fill) + .on_press(if draw { + Message::Connection(crate::connection_edit::Event::Begin( + crate::connection_tool::Tool::CommunicationMean, + app.selected, + )) + } else { + Message::AddRelationKind(RelationKind::CommunicationMean, false) + }), + ); + } + if p.elements + .get(&app.selected) + .is_some_and(|e| matches!(e.kind(), Kind::System | Kind::SystemActor)) + { + body = body.push( + button(text("+ Add port…").size(12)) + .padding(9) + .width(Fill) + .on_press(Message::PortAction(crate::port_workflow::Action::Component)), + ); + } + if p.elements + .get(&app.selected) + .is_some_and(|e| matches!(port_contract(e), Some(PortContract::Component { .. }))) + { + let draw = app.page == Page::Diagram + && crate::connection_tool::Tool::BoundaryExchange.can_start(p, app.selected) + && app.active_diagram.is_some_and(|diagram| { + crate::connection_edit::visible(&projection::project_view(p, diagram)) + .any(|id| id == app.selected) + }); + body = body.push( + button( + text(if draw { + "Draw boundary exchange" + } else { + "Configure boundary exchange…" + }) + .size(12), + ) + .padding(9) + .width(Fill) + .on_press(if draw { + Message::Connection(crate::connection_edit::Event::Begin( + crate::connection_tool::Tool::BoundaryExchange, + app.selected, + )) + } else { + Message::AddRelationKind( + RelationKind::BoundaryExchange, + p.elements.get(&app.selected).is_some_and(|e| { + matches!( + port_contract(e), + Some(PortContract::Component { + kind: ComponentPortKind::Flow, + orientation: ComponentPortOrientation::In + }) + ) + }), + ) + }), + ); + } + if let Some(r) = p.relations.get(&app.selected) { + body = body.push(text(r.kind().to_string()).size(17)); + if r.kind() != RelationKind::ContextualLink { + body = body.push( + pick_list( + RelationKind::ALL + .into_iter() + .filter(|kind| *kind != RelationKind::ContextualLink) + .collect::>(), + Some(r.kind()), + Message::RelationKind, + ) + .text_size(12) + .padding(8) + .width(Fill), + ); + } + } + body = body.push( + row![ + button(text("Apply changes").size(12)) + .padding([9, 12]) + .on_press(Message::Apply) + .width(Fill), + action("Revert", Message::RevertProperties) + ] + .spacing(5), + ); + if let Some(d) = &app.draft { + body = body.push(forms::view(d, p)); + } + container( + column![ + tabs, + scrollable(body.padding(iced::Padding { + right: 14., + ..Default::default() + })) + .id("inspector") + .height(Fill) + ] + .spacing(12), + ) + .padding(14) + .width(320) + .height(Fill) + .style(style::panel) + .into() +} + +fn data_catalog(app: &App) -> View<'_, Message> { + crate::data_view::view(app) +} + +fn traces(app: &App) -> View<'_, Message> { + let p = app.project(); + use traceability::{Event as E, Filter}; + let (traces, artifacts) = app.traceability.matching(p); + let mut tabs = row![].spacing(6); + for (filter, label) in [ + ( + Filter::All, + format!("All ({})", p.traces.len() + p.artifact_links.len()), + ), + (Filter::Traces, format!("Layer traces ({})", p.traces.len())), + ( + Filter::Artifacts, + format!("Development artifacts ({})", p.artifact_links.len()), + ), + ] { + tabs = tabs.push( + button(text(label).size(12)) + .style(if app.traceability.filter == filter { + button::primary + } else { + style::nav + }) + .on_press(Message::Traceability(E::Filter(filter))), + ); + } + let header = column![ + heading( + "Traceability", + "Connect operational needs, system responsibilities and development evidence." + ), + row![ + button( + text( + if p.layer_of(app.selected).unwrap_or(app.layer) == Layer::Oa { + "Create System counterpart…" + } else { + "Create Operational counterpart…" + } + ) + .size(12) + ) + .padding(9) + .on_press(Message::StartTransition), + action("+ Manual trace", Message::AddTrace), + action( + "Review counterpart changes…", + Message::StartSemanticReview(app.selected) + ), + action("+ Artifact", Message::AddArtifact) + ] + .spacing(8) + .wrap(), + tabs.wrap(), + row![ + text_input( + "Search names, aliases, owners or artifact URI…", + &app.traceability.query + ) + .on_input(|raw| Message::Traceability(E::Search(raw))) + .padding(8) + .size(12) + .width(Fill), + button("Clear search").on_press(Message::Traceability(E::Search(String::new()))) + ] + .spacing(6), + label(format!( + "{} matching traces · {} matching artifacts", + traces.len(), + artifacts.len() + )) + ] + .spacing(10) + .padding(24); + let mut out = column![].spacing(16); + for id in &traces { + let t = &p.traces[id]; + let current = match (&t.baseline, p.properties(t.oa), p.properties(t.sa)) { + (Some(b), Some(oa), Some(sa)) if b.oa == oa && b.sa == sa => "Reviewed", + (Some(_), _, _) => "Review needed", + _ => "No review baseline", + }; + out = out.push( + container( + column![ + row![ + action(p.named(t.oa), Message::Select(t.oa)).width(Fill), + text("→").color(style::TEAL), + action(p.named(t.sa), Message::Select(t.sa)).width(Fill) + ] + .spacing(8) + .align_y(iced::Center), + row![ + label(format!("{:?} · Prose: {current}", t.kind)), + Space::new().width(Fill), + action( + "Review counterpart changes…", + Message::StartSemanticReview(t.id) + ), + action("Edit link", Message::Select(t.id)) + ], + text(crate::semantic_review::summary(p, t)) + .size(11) + .color(style::MUTED), + text(short(&t.description, 130)).size(12) + ] + .spacing(10), + ) + .padding(16) + .style(style::card), + ); + } + if !artifacts.is_empty() { + out = out.push(text("Development artifacts").size(18)); + } + for id in &artifacts { + let a = &p.artifact_links[id]; + let owner = traceability::owner_label(p, a.owner); + out = out.push( + container( + column![ + row![ + action(&a.name, Message::Select(a.id)).width(Fill), + label(format!("{:?}", a.relation)) + ], + text(&a.uri).size(12).font(Font::MONOSPACE), + label(format!( + "{}{}", + owner, + a.revision + .as_ref() + .map(|r| format!(" · revision {r}")) + .unwrap_or_default() + )) + ] + .spacing(8), + ) + .padding(16) + .style(style::card), + ); + } + if p.traces.is_empty() && p.artifact_links.is_empty() { + out=out.push(text("Select a model element, then connect it to the other perspective or attach a code, CAD, schematic or document reference.").size(14).color(style::MUTED)); + } else if traces.is_empty() && artifacts.is_empty() { + out = out + .push(text("No matching records. Clear the search or choose another filter.").size(13)); + } + column![ + header, + scrollable(out.padding(iced::Padding::from(24).right(42))) + .id("traceability-list") + .height(Fill) + ] + .height(Fill) + .into() +} + +fn source_files(app: &App) -> View<'_, Message> { + let workspace = &app.source_workspace; + let panel = column![ + row![ + text("SOURCE FILES").size(13).width(Fill), + crate::context_menu::Area::left( + action("Actions ▾", Message::Menu(crate::model_menu::Event::Close)), + move |anchor| Message::SourceTree(crate::source_tree::Event::FileMenu( + workspace.active.clone(), + anchor + )) + ) + ] + .align_y(iced::Center), + label(format!( + "{} files · one system model", + workspace.files.len() + )), + row![ + action("Collapse all", Message::SourceTreeCollapse), + action("Locate", Message::SourceTreeLocate) + ] + .spacing(3), + crate::source_tree::view(workspace, &app.source_diagnostics, &app.source_tree) + .map(Message::SourceTree), + action("Load includes", Message::SourceLoadIncludes).width(Fill), + text_input("oa/new-file.arcadia", &workspace.new_path) + .size(12) + .padding(8) + .on_input(Message::SourceNewPath) + .on_submit(Message::SourceCreateFile), + action("+ Create source file", Message::SourceCreateFile).width(Fill), + label("Includes define file membership. Closing a detached buffer never deletes its file."), + ] + .spacing(9); + panel.into() +} + +fn source(app: &App) -> View<'_, Message> { + use crate::source_navigation::Event as SourceEvent; + let navigation: View<'_, Message> = if app.source_navigation.open { + column![ + row![ + text_input("Find literal text…", &app.source_navigation.query) + .id("source-find") + .on_input(|query| Message::SourceNavigation(SourceEvent::Query(query))) + .on_submit(Message::SourceNavigation(SourceEvent::Next(false))) + .padding(8) + .size(12) + .width(Fill), + action( + "Previous", + Message::SourceNavigation(SourceEvent::Next(true)) + ), + action("Next", Message::SourceNavigation(SourceEvent::Next(false))), + label(app.source_navigation.label()), + action("Close", Message::SourceNavigation(SourceEvent::Close)), + ] + .spacing(6) + .align_y(iced::Center), + row![ + text_input("Line", &app.source_navigation.line) + .id("source-line") + .on_input(|line| Message::SourceNavigation(SourceEvent::Line(line))) + .on_submit(Message::SourceNavigation(SourceEvent::Go)) + .padding(8) + .size(12) + .width(80), + action("Go to line", Message::SourceNavigation(SourceEvent::Go)), + label("Enter or F3: next match · Shift F3: previous · Esc: close"), + ] + .spacing(6) + .align_y(iced::Center), + ] + .spacing(6) + .into() + } else { + column![].into() + }; + let recovery: View<'_, Message> = if let Some(path) = &app.pending_recovery { + let edits_block_recovery = + !app.source_workspace.applied && app.source_workspace.has_edits(); + let filename = path.file_name().unwrap_or_default().to_string_lossy(); + container( + column![ + tooltip( + text(format!("Interrupted save · {filename}")).size(15), + text(path.display().to_string()).size(12), + tooltip::Position::Bottom, + ), + text(if edits_block_recovery { + "Revert the edited files before recovery. Recovery restores files to their state before the interrupted save, then reopens them." + } else if app.source_workspace.applied { + "Restore files to their state before the interrupted save. Your current model and editor drafts are kept." + } else { + "Restore files to their state before the interrupted save, then reopen them. This rolls back the incomplete save." + }) + .size(13), + button(text("Recover interrupted save").size(12)) + .padding(10) + .on_press_maybe( + (!edits_block_recovery && !app.busy).then_some(Message::SourceRecover), + ), + ] + .spacing(8), + ) + .padding(12) + .width(Fill) + .style(style::card) + .into() + } else { + column![].into() + }; + let mut diagnostics = column![].spacing(5); + let mut visible_diagnostics = 0; + for (index, issue) in app.source_diagnostics.iter().enumerate() { + // The persistent recovery banner supplies the action and explanation; + // repeating the internal journal path obscures ordinary diagnostics. + if app.pending_recovery.is_some() && issue.diagnostic.code == "pending_save" { + continue; + } + visible_diagnostics += 1; + diagnostics = diagnostics.push( + button( + text(format!( + "{}:{}:{} {}", + issue.path, + issue.diagnostic.line, + issue.diagnostic.column, + issue.diagnostic.message + )) + .size(12) + .color(match issue.diagnostic.severity { + validation::Severity::Error => iced::Color::from_rgb8(174, 46, 64), + validation::Severity::Warning => iced::Color::from_rgb8(145, 93, 23), + }), + ) + .width(Fill) + .padding([4, 6]) + .style(style::nav) + .on_press(Message::SourceDiagnostic(index)), + ); + for related in &issue.related { + diagnostics = diagnostics.push(action( + &format!("Related declaration · {}", related.path), + Message::SourceRelated(related.clone()), + )); + } + } + let editor = widget::text_editor(&app.source_editor) + .id(app.source_editor_id()) + .on_action(Message::SourceEdit) + .key_binding({ + let context = app.source_symbol_context(); + move |press| source_binding(press, &context) + }) + .font(Font::MONOSPACE) + .size(14) + .padding(16) + .height(Fill) + .highlight_with::( + app.source_snapshot.clone(), + crate::highlight::format, + ); + let header = container( + column![ + row![ + container(heading( + "Textual model", + "One model across files · comments and identities preserved" + )) + .width(Fill), + button(text("Apply all").size(12)) + .padding(10) + .on_press(Message::ApplySource), + action("Revert file", Message::RevertSource) + ] + .spacing(8) + .align_y(iced::Center), + row![ + action("Undo text", Message::SourceUndo), + action("Redo text", Message::SourceRedo), + button(text("Undo model").size(12)).padding([8,10]).style(style::nav) + .on_press_maybe((app.document.can_undo() && !app.source_dirty()).then_some(Message::Undo)), + button(text("Redo model").size(12)).padding([8,10]).style(style::nav) + .on_press_maybe((app.document.can_redo() && !app.source_dirty()).then_some(Message::Redo)), + action("Find / go to…", Message::SourceNavigation(SourceEvent::Open(false))), + label(if app.source_dirty() { + "Drafts pending" + } else { + "Model in sync" + }) + ] + .spacing(7) + .align_y(iced::Center), + recovery, + text(app.source_workspace.active.clone()).font(Font::MONOSPACE).size(12).color(style::INK), + label(if app.pending_recovery.is_some() && !app.source_workspace.applied { + "The previous graphical model remains available while these files are recovered." + } else if !app.source_workspace.applied { + "This project needs repair. Apply all adopts it; the previous graphical model remains available." + } else if app.source_workspace.detached_dirty() { + "A detached file has an unsaved draft. Reattach it or revert that file before saving." + } else { + "Undo text affects this file's draft. Model Undo restores accepted files together (100 changes / about 32 MiB)." + }), + navigation, + row![ + action("Definition · F12", app.source_symbol_message(crate::source_navigation::SymbolEvent::Query(crate::source_navigation::query::Action::Definition))), + action("References · Shift F12", app.source_symbol_message(crate::source_navigation::SymbolEvent::Query(crate::source_navigation::query::Action::References))), + button(text("Back · Alt ←").size(12)).padding([8, 10]).style(style::nav) + .on_press_maybe((app.source_symbols.back.iter().any(|entry| entry.session == app.source_workspace.session())).then(|| app.source_symbol_message(crate::source_navigation::SymbolEvent::Back))), + ].spacing(7), + scrollable(diagnostics) + .height((visible_diagnostics as f32 * 32.).min(132.)) + ] + .spacing(12) + ) + .padding(18); + let editor = widget::sensor(editor) + .key(( + app.source_workspace.active.clone(), + app.source_reveal_ticket(), + )) + .on_show({ + let ticket = app.source_reveal_ticket(); + move |_| Message::SourceViewport(ticket) + }) + .on_resize({ + let ticket = app.source_reveal_ticket(); + move |_| Message::SourceViewport(ticket) + }); + let workspace: View<'_, Message> = if app.source_symbols.open { + row![ + container(editor).width(Fill).height(Fill), + container(scrollable(source_symbols::panel(app))) + .width(300) + .height(Fill), + ] + .height(Fill) + .into() + } else { + container(editor).width(Fill).height(Fill).into() + }; + column![ + container(scrollable(header)).max_height((app.window_size.height * 0.42).max(180.)), + workspace, + ] + .height(Fill) + .into() +} +fn source_binding( + press: widget::text_editor::KeyPress, + context: &crate::source_navigation::SymbolContext, +) -> Option> { + use crate::source_navigation::{SymbolEvent, query::Action}; + use iced::keyboard::{Key, key::Named}; + use widget::text_editor::{Binding, Status}; + if matches!(press.status, Status::Focused { .. }) + && !press.modifiers.control() + && !press.modifiers.logo() + { + let event = match &press.key { + Key::Named(Named::F12) if !press.modifiers.alt() => { + Some(SymbolEvent::Query(if press.modifiers.shift() { + Action::References + } else { + Action::Definition + })) + } + Key::Named(Named::ArrowLeft) if press.modifiers.alt() && !press.modifiers.shift() => { + Some(SymbolEvent::Back) + } + _ => None, + }; + if let Some(event) = event { + return Some(Binding::Custom(Message::SourceSymbols( + context.clone(), + event, + ))); + } + } + Binding::from_key_press(press) +} +fn checks(app: &App) -> View<'_, Message> { + let issues = &app.model_issues; + let mut out = column![heading( + "Model checks", + "Structural validity and engineering completeness, with direct navigation." + )] + .spacing(15); + if let Some(report) = &app.migration { + let mut card = column![text(format!("Imported schema {} → {}", report.from_schema, report.to_schema)).size(19), + label("Import preserves the original file. Saving explicitly writes the current schema; legacy associations remain available for review.")].spacing(8); + for port in &report.preserved_ports { + card = card + .push(action( + &format!("Preserved port · @{}", port.alias), + Message::Select(port.id), + )) + .push(label(&port.required_resolution)); + } + for endpoint in &report.generated_endpoints { + card = card + .push(action( + &format!("Created {} endpoint · @{}", endpoint.side, endpoint.alias), + Message::Select(endpoint.port), + )) + .push(label(format!( + "Owner: {} · exchange: {}", + app.project().named(endpoint.owner), + app.project().named(endpoint.exchange) + ))); + } + card=card.push(label(format!("Data migration: {} semantic defaults · {} interface allocations · {} unresolved value addresses",report.semantic_defaults.len(),report.generated_interface_allocations.len(),report.unresolved_message_values.len()))); + for default in report.semantic_defaults.iter().take(6) { + card = card + .push(action( + &format!( + "{} · {}", + app.project().named(default.object), + default.field + ), + Message::Select(default.object), + )) + .push(label(&default.description)); + } + for allocation in report.generated_interface_allocations.iter().take(6) { + card = card + .push(action( + &format!( + "Created item allocation · @{} · order {}", + allocation.alias, allocation.order + ), + Message::Select(allocation.id), + )) + .push(label(format!( + "{} → {}", + app.project().named(allocation.source), + app.project().named(allocation.target) + ))); + } + for value in report.unresolved_message_values.iter().take(6) { + card = card + .push(action( + &format!( + "Review qualified value · {}", + app.project().named(value.occurrence) + ), + Message::EditProperties(value.occurrence), + )) + .push(label(&value.reason)); + } + if report.semantic_defaults.len() > 6 + || report.generated_interface_allocations.len() > 6 + || report.unresolved_message_values.len() > 6 + { + card=card.push(label("Showing the first six entries in each data migration category. Model checks below link remaining unresolved contracts.")); + } + for boundary in &report.orientation_defaults { + card = card.push(action( + &format!( + "Preserved directed exchange · {}", + app.project().named(boundary.exchange) + ), + Message::Select(boundary.exchange), + )); + } + out = out.push(container(card).padding(18).style(style::card)); + } + if issues.is_empty() { + out = out.push( + container( + column![ + text("Model checks passed").size(19).color(style::TEAL), + label("No structural errors or completeness warnings.") + ] + .spacing(8), + ) + .padding(20) + .style(style::card), + ); + } + for issue in issues { + let mut card = + column![text(format!("{:?} · {}", issue.severity, issue.message)).size(13)].spacing(8); + if let Some(id) = issue.element { + card = card.push(action( + &format!("Open {}", app.project().named(id)), + Message::Select(id), + )); + } + out = out.push(container(card).padding(15).style(style::card)); + } + scrollable(out.padding(24)).into() +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/run-focused1.ps1 b/harness/experiments/text-navigation-native-20260911/corrections/run-focused1.ps1 new file mode 100644 index 00000000..ef085a4e --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/run-focused1.ps1 @@ -0,0 +1,18 @@ +$ErrorActionPreference = 'Stop' +. ./.local/toolchain/env.ps1 +$env:CARGO_BUILD_JOBS = '1' +$gateRoot = Join-Path (Get-Location) '.local/text-navigation-native-fixes-20260911' +$gates = @( + @{name='focused1'; args=@('test','--locked','--offline','-p','oa-desktop','--bin','arcadia-studio','source_','--','--test-threads=1')}, + @{name='clippy1'; args=@('clippy','--locked','--offline','-p','oa-desktop','--all-targets','--','-D','warnings')} +) +foreach ($gate in $gates) { + $log = Join-Path $gateRoot ($gate.name + '.log') + if (Test-Path -LiteralPath $log) { throw "Refusing to overwrite $($gate.name)" } + $started = [DateTime]::UtcNow.ToString('o') + $gateArgs = $gate.args + & cargo @gateArgs 2>&1 | Tee-Object -FilePath $log + $gateExit = $LASTEXITCODE + [ordered]@{started=$started;finished=[DateTime]::UtcNow.ToString('o');exitCode=$gateExit;args=$gateArgs;buildJobs=1} | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $gateRoot ($gate.name + '-status.json')) + if ($gateExit -ne 0) { exit $gateExit } +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/run-focused2.ps1 b/harness/experiments/text-navigation-native-20260911/corrections/run-focused2.ps1 new file mode 100644 index 00000000..2c6b0a72 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/run-focused2.ps1 @@ -0,0 +1,18 @@ +$ErrorActionPreference = 'Stop' +. ./.local/toolchain/env.ps1 +$env:CARGO_BUILD_JOBS = '1' +$gateRoot = Join-Path (Get-Location) '.local/text-navigation-native-fixes-20260911' +$gates = @( + @{name='focused2'; args=@('test','--locked','--offline','-p','oa-desktop','--bin','arcadia-studio','source_','--','--test-threads=1')}, + @{name='clippy2'; args=@('clippy','--locked','--offline','-p','oa-desktop','--all-targets','--','-D','warnings')} +) +foreach ($gate in $gates) { + $log = Join-Path $gateRoot ($gate.name + '.log') + if (Test-Path -LiteralPath $log) { throw "Refusing to overwrite $($gate.name)" } + $started = [DateTime]::UtcNow.ToString('o') + $gateArgs = $gate.args + & cargo @gateArgs 2>&1 | Tee-Object -FilePath $log + $gateExit = $LASTEXITCODE + [ordered]@{started=$started;finished=[DateTime]::UtcNow.ToString('o');exitCode=$gateExit;args=$gateArgs;buildJobs=1} | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $gateRoot ($gate.name + '-status.json')) + if ($gateExit -ne 0) { exit $gateExit } +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/run-focused3.ps1 b/harness/experiments/text-navigation-native-20260911/corrections/run-focused3.ps1 new file mode 100644 index 00000000..35fa63bb --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/run-focused3.ps1 @@ -0,0 +1,18 @@ +$ErrorActionPreference = 'Stop' +. ./.local/toolchain/env.ps1 +$env:CARGO_BUILD_JOBS = '1' +$gateRoot = Join-Path (Get-Location) '.local/text-navigation-native-fixes-20260911' +$gates = @( + @{name='focused3'; args=@('test','--locked','--offline','-p','oa-desktop','--bin','arcadia-studio','source_','--','--test-threads=1')}, + @{name='clippy3'; args=@('clippy','--locked','--offline','-p','oa-desktop','--all-targets','--','-D','warnings')} +) +foreach ($gate in $gates) { + $log = Join-Path $gateRoot ($gate.name + '.log') + if (Test-Path -LiteralPath $log) { throw "Refusing to overwrite $($gate.name)" } + $started = [DateTime]::UtcNow.ToString('o') + $gateArgs = $gate.args + & cargo @gateArgs 2>&1 | Tee-Object -FilePath $log + $gateExit = $LASTEXITCODE + [ordered]@{started=$started;finished=[DateTime]::UtcNow.ToString('o');exitCode=$gateExit;args=$gateArgs;buildJobs=1} | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $gateRoot ($gate.name + '-status.json')) + if ($gateExit -ne 0) { exit $gateExit } +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/run-focused4.ps1 b/harness/experiments/text-navigation-native-20260911/corrections/run-focused4.ps1 new file mode 100644 index 00000000..9b124608 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/run-focused4.ps1 @@ -0,0 +1,18 @@ +$ErrorActionPreference = 'Stop' +. ./.local/toolchain/env.ps1 +$env:CARGO_BUILD_JOBS = '1' +$gateRoot = Join-Path (Get-Location) '.local/text-navigation-native-fixes-20260911' +$gates = @( + @{name='focused4'; args=@('test','--locked','--offline','-p','oa-desktop','--bin','arcadia-studio','source_','--','--test-threads=1')}, + @{name='clippy4'; args=@('clippy','--locked','--offline','-p','oa-desktop','--all-targets','--','-D','warnings')} +) +foreach ($gate in $gates) { + $log = Join-Path $gateRoot ($gate.name + '.log') + if (Test-Path -LiteralPath $log) { throw "Refusing to overwrite $($gate.name)" } + $started = [DateTime]::UtcNow.ToString('o') + $gateArgs = $gate.args + & cargo @gateArgs 2>&1 | Tee-Object -FilePath $log + $gateExit = $LASTEXITCODE + [ordered]@{started=$started;finished=[DateTime]::UtcNow.ToString('o');exitCode=$gateExit;args=$gateArgs;buildJobs=1} | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $gateRoot ($gate.name + '-status.json')) + if ($gateExit -ne 0) { exit $gateExit } +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/run-focused5.ps1 b/harness/experiments/text-navigation-native-20260911/corrections/run-focused5.ps1 new file mode 100644 index 00000000..14fce85f --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/run-focused5.ps1 @@ -0,0 +1,18 @@ +$ErrorActionPreference = 'Stop' +. ./.local/toolchain/env.ps1 +$env:CARGO_BUILD_JOBS = '1' +$gateRoot = Join-Path (Get-Location) '.local/text-navigation-native-fixes-20260911' +$gates = @( + @{name='focused5'; args=@('test','--locked','--offline','-p','oa-desktop','--bin','arcadia-studio','source_','--','--test-threads=1')}, + @{name='clippy5'; args=@('clippy','--locked','--offline','-p','oa-desktop','--all-targets','--','-D','warnings')} +) +foreach ($gate in $gates) { + $log = Join-Path $gateRoot ($gate.name + '.log') + if (Test-Path -LiteralPath $log) { throw "Refusing to overwrite $($gate.name)" } + $started = [DateTime]::UtcNow.ToString('o') + $gateArgs = $gate.args + & cargo @gateArgs 2>&1 | Tee-Object -FilePath $log + $gateExit = $LASTEXITCODE + [ordered]@{started=$started;finished=[DateTime]::UtcNow.ToString('o');exitCode=$gateExit;args=$gateArgs;buildJobs=1} | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $gateRoot ($gate.name + '-status.json')) + if ($gateExit -ne 0) { exit $gateExit } +} diff --git a/harness/experiments/text-navigation-native-20260911/corrections/test-binary.json b/harness/experiments/text-navigation-native-20260911/corrections/test-binary.json new file mode 100644 index 00000000..99eb0ba9 --- /dev/null +++ b/harness/experiments/text-navigation-native-20260911/corrections/test-binary.json @@ -0,0 +1,6 @@ +{ + "path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\.local\\target-gnullvm\\debug\\deps\\arcadia_studio-58e30cee1fd51a8b.exe", + "bytes": 110330368, + "sha256": "6FCB1E9D264A709297DEA9856E5927DCEEDEB39C84938D4EEB46B320A3514D7D", + "scope": "Executed focused5 binary identity; binary not copied into this evidence directory." +} diff --git a/harness/release-text-navigation-integrated-20260911.md b/harness/release-text-navigation-integrated-20260911.md index 1c05bf1d..21ff344a 100644 --- a/harness/release-text-navigation-integrated-20260911.md +++ b/harness/release-text-navigation-integrated-20260911.md @@ -113,6 +113,10 @@ The subsequent [initial native trial](release-text-navigation-native-initial-202 verified useful navigation and exact saved-source/model equality, but found four interaction defects. It is not accepted for release. Corrections and a matching new native evaluation are required; earlier build/test results keep their scope. +The subsequent [four-file correction](release-text-navigation-native-corrections-20260911.md) +passed 188 focused tests and strict Clippy after independent review. Its raw +inputs and failed attempts are preserved separately; corrected native acceptance +is still pending. - [Component and prepared fixture archive](experiments/text-navigation-components-20260911/README.md) - [Desktop gate archive](experiments/text-navigation-desktop-20260911/README.md) diff --git a/harness/release-text-navigation-native-corrections-20260911.md b/harness/release-text-navigation-native-corrections-20260911.md new file mode 100644 index 00000000..98dc9f8c --- /dev/null +++ b/harness/release-text-navigation-native-corrections-20260911.md @@ -0,0 +1,79 @@ +# Native navigation corrections — 2026-09-11 + +Codex-9e8r6t `/root`; [issue 6](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/6). +The four-file correction above `f4e426ae2a6971395e1ca7e6f094b0c20056cf93` +passes its focused Windows gates and independent source review. A corrected +full desktop run, GUI and native acceptance remain separate requirements. + +## Changes and review + +The [initial DF71 native trial](release-text-navigation-native-initial-20260911.md) +found four interaction defects. The correction reserves the existing bounded +header's outer height so lint cannot move the editor; keeps results closed on a +successful Back without a notice; dismisses Find alone through the existing +captured-Escape bridge; and suppresses exactly focused Windows Alt-only Space +in the source editor. Ordinary Space, shifted input and Ctrl+Alt/AltGr remain +on their existing paths. The header still scrolls when its contents overflow. + +Find Close and ordinary dismissing Escape restore the existing source selection +through the guarded viewport/focus ticket. Modal dismissal retains priority. +Independent review found that the previously unscoped Find Close could now +restore focus in a newer workspace or Find invocation. Its actual button message +now carries session/path plus an invocation token renewed on every Find Open. +Stale envelopes and bare legacy Close are rejected before invalidating current +navigation; current Close still works. Review2 accepted this closure. Root also +reviewed the final renderer-bound and evaluator-only changes. + +## Verified scope + +- `cargo test --locked --offline -p oa-desktop --bin arcadia-studio source_ -- --test-threads=1`: + **188 passed, 0 failed, 1 ignored, 562 filtered**, 41.73 s execution, + finished 19:38:11 UTC. +- `cargo clippy --locked --offline -p oa-desktop --all-targets -- -D warnings`: + **passed**, finished 19:40:12 UTC. Scoped formatting and diff checks passed. +- All **499 inputs / 9,470,838 bytes** were unchanged at 19:41:08 UTC. + ZIP members were also compared with the manifest and current source bytes. + Final correction `inputs4` archive SHA256: + `7ff9e5703e33bd72e5c2186dd61125e965b82b8dfbf085961d514b005e716798`. + +Seven added regressions exercise Back visibility, actual captured Find Escape, +stale Find Close across reset/file switch/reopen, mounted guarded focus, stable +editor geometry, real Scrollable wheel/offset behavior, and text-bearing Windows +key events with ordinary/international input controls. Affected App assertions +compare accepted Project, raw SourceBundle, selection and history. + +Geometry uses the shared production layout helper with real paragraph/editor +metrics and representative dynamic header content, not the whole App view. +The focus tree verifies removal of Find and later foreign focus; its raw-clock +case also changes focus, so it does not independently isolate that race end to +end. Existing primitive guards provide narrower separate coverage. The supplied +Alt+Space payload test is not instrumentation of the native Windows event. +Actual settled menu/neutral-click behavior must still be repeated on a new GUI. + +## Preserved failures + +The first PowerShell 5 wrapper stopped on ordinary Cargo stderr. The corrected +PowerShell 7 run reached three real E0659 macro-import errors and was stopped +after the independent stale-Close finding; both diagnostics and interruption +are retained. Inputs2 then failed compilation because the generic helper needed +`text::Renderer`. Inputs3 fixed only that bound; 187 tests passed, but its geometry +test incorrectly equated the short inner Scrollable with the fixed outer slot +(243.70001 versus 294 px). Inputs4 corrected only the measurement to the actual +outer Container/editor boundary. Exact editor rectangle stability and the +separate overflow/offset assertions then passed. No production layout change +was made merely to satisfy that assertion. Failed runs are not Clippy or native +passes; every earlier input snapshot retains its own readback. + +## Evidence and continuation + +[Raw correction archive](experiments/text-navigation-native-20260911/corrections/manifest.json): +44 payloads, 9,167,596 bytes; manifest SHA256 +`25a210de4a65b2221007e077fe72dfe0bb68483a068127e122839798aa4da332`. +It preserves original files, exact source ZIPs, helpers, patch, actual logs and +receipts, independent reviews and final gate result. The test executable has an +identity receipt; its large binary is not included. + +The next native evaluation must repeat the four failures, existing navigation +and draft/Undo behavior, invalid-source repair and the realistic 30-file +engineering walkthrough, followed by explicit Save and complete saved equality. +The existing contextual release remains unchanged. Linux/WSL remains paused.