From cb611a71df53704abc5ebe4290b916e17ee96bf1 Mon Sep 17 00:00:00 2001 From: Codex-ytr83r Date: Fri, 11 Sep 2026 06:56:17 -0700 Subject: [PATCH] Bound Create labels within lifeline capsules and preserve Unicode test inputs --- crates/oa-desktop/src/behavior.rs | 3 +- .../src/behavior/scenario_lifecycle/render.rs | 34 +- .../scenario_lifecycle/render_tests.rs | 61 ++ harness/STATE.md | 9 +- .../desktop-clipping-inputs.json | 14 + .../typography-admission.json | 18 + .../typography-clusters-admission.log | 1 + .../typography-predictions.json | 59 ++ .../typography-wide-admission.log | 1 + .../scenario-lifecycle-native/README.md | 25 + .../typography-clusters/project.arcadia | 692 ++++++++++++++++++ .../typography-clusters/rationale.arcadia | 2 + .../typography-wide/project.arcadia | 692 ++++++++++++++++++ .../typography-wide/rationale.arcadia | 2 + ...ease-lifecycle-clipping-ytr83r-20260911.md | 79 ++ ...se-postboot-integration-ytr83r-20260911.md | 135 ++++ 16 files changed, 1815 insertions(+), 12 deletions(-) create mode 100644 harness/experiments/lifecycle-native-ytr83r-20260911/desktop-clipping-inputs.json create mode 100644 harness/experiments/lifecycle-native-ytr83r-20260911/typography-admission.json create mode 100644 harness/experiments/lifecycle-native-ytr83r-20260911/typography-clusters-admission.log create mode 100644 harness/experiments/lifecycle-native-ytr83r-20260911/typography-predictions.json create mode 100644 harness/experiments/lifecycle-native-ytr83r-20260911/typography-wide-admission.log create mode 100644 harness/fixtures/scenario-lifecycle-native/typography-clusters/project.arcadia create mode 100644 harness/fixtures/scenario-lifecycle-native/typography-clusters/rationale.arcadia create mode 100644 harness/fixtures/scenario-lifecycle-native/typography-wide/project.arcadia create mode 100644 harness/fixtures/scenario-lifecycle-native/typography-wide/rationale.arcadia create mode 100644 harness/release-lifecycle-clipping-ytr83r-20260911.md create mode 100644 harness/release-postboot-integration-ytr83r-20260911.md diff --git a/crates/oa-desktop/src/behavior.rs b/crates/oa-desktop/src/behavior.rs index c00cae21..91ec951f 100644 --- a/crates/oa-desktop/src/behavior.rs +++ b/crates/oa-desktop/src/behavior.rs @@ -2164,7 +2164,8 @@ impl canvas::Program for Scene { ..Default::default() }); } - self.lifecycle.draw_markers(&mut f, self.selected); + self.lifecycle + .draw_markers(&mut f, self.selected, self.scale); if let Some((context, tool, editable)) = self.interaction { let active = editable && state.context == Some(context) && state.tool == tool; let point = cursor diff --git a/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs b/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs index facb4d9f..1c2a8f7b 100644 --- a/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs +++ b/crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs @@ -277,7 +277,7 @@ impl Rendering { } } - pub(in crate::behavior) fn draw_markers(&self, frame: &mut Frame, selected: Id) { + pub(in crate::behavior) fn draw_markers(&self, frame: &mut Frame, selected: Id, scale: f32) { for marker in &self.markers { let color = if selected == marker.event.occurrence || selected == marker.lifeline { style::TEAL @@ -302,13 +302,20 @@ impl Rendering { }, ), ); - frame.fill_text(Text { - content: short(&marker.name, 18), - position: marker.capsule.position() + iced::Vector::new(8., 6.), - size: 12.into(), - color, - ..Default::default() - }); + if let Some(clip) = birth_label_clip(marker.capsule, scale, frame.size()) { + // WGPU clipped frames start with an identity transform; + // neither the parent's scale nor its clip is inherited. + frame.with_clip(clip, |label| { + label.scale(scale); + label.fill_text(Text { + content: short(&marker.name, 18), + position: marker.capsule.position() + iced::Vector::new(8., 6.), + size: 12.into(), + color, + ..Default::default() + }); + }); + } } MarkerKind::Death => { for (a, b) in death_strokes(marker.center) { @@ -323,6 +330,17 @@ impl Rendering { } } +fn birth_label_clip(capsule: Rectangle, scale: f32, viewport: Size) -> Option { + if !scale.is_finite() || scale <= 0. { + return None; + } + Rectangle::new( + Point::new((capsule.x + 8.) * scale, (capsule.y + 4.) * scale), + Size::new((capsule.width - 16.) * scale, (capsule.height - 8.) * scale), + ) + .intersection(&Rectangle::new(Point::ORIGIN, viewport)) +} + fn marker_distance(marker: &EventMarker, point: Point) -> f32 { match marker.event.kind { MarkerKind::Birth => { diff --git a/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs b/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs index d042fc3d..76e60fb1 100644 --- a/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs +++ b/crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs @@ -172,6 +172,67 @@ fn intervals(scene: &Scene, lifeline: Id, scope: Id) -> Vec<(f32, f32, Life)> { .collect() } +#[test] +fn birth_label_clip_keeps_padded_world_bounds_at_each_scene_scale() { + let capsule = Rectangle::new(Point::new(100., 200.), Size::new(140., 28.)); + for (scale, expected) in [ + ( + 0.05, + Rectangle::new(Point::new(5.4, 10.2), Size::new(6.2, 1.)), + ), + ( + 0.5, + Rectangle::new(Point::new(54., 102.), Size::new(62., 10.)), + ), + ( + 1., + Rectangle::new(Point::new(108., 204.), Size::new(124., 20.)), + ), + ( + 2., + Rectangle::new(Point::new(216., 408.), Size::new(248., 40.)), + ), + ] { + let clip = birth_label_clip(capsule, scale, Size::new(1000., 1000.)).unwrap(); + for (actual, expected) in [ + (clip.x, expected.x), + (clip.y, expected.y), + (clip.width, expected.width), + (clip.height, expected.height), + ] { + assert!((actual - expected).abs() < 0.0001); + } + assert!(capsule.contains(Point::new(clip.x / scale, clip.y / scale))); + assert!(capsule.contains(Point::new( + (clip.x + clip.width) / scale, + (clip.y + clip.height) / scale, + ))); + } +} + +#[test] +fn birth_label_clip_preserves_parent_viewport_bounds() { + let capsule = Rectangle::new(Point::new(100., 200.), Size::new(140., 28.)); + assert_eq!( + birth_label_clip(capsule, 2., Size::new(300., 420.)), + Some(Rectangle::new(Point::new(216., 408.), Size::new(84., 12.))) + ); + let crossing_origin = Rectangle::new(Point::new(-20., -10.), Size::new(140., 28.)); + assert_eq!( + birth_label_clip(crossing_origin, 2., Size::new(300., 420.)), + Some(Rectangle::new(Point::ORIGIN, Size::new(224., 28.))) + ); + for viewport in [Size::new(200., 420.), Size::new(300., 400.), Size::ZERO] { + assert_eq!(birth_label_clip(capsule, 2., viewport), None); + } + for scale in [0., -1., f32::NAN, f32::INFINITY] { + assert_eq!( + birth_label_clip(capsule, scale, Size::new(1000., 1000.)), + None + ); + } +} + #[test] fn real_scene_empty_and_create_only_use_visible_root_extents_not_insertion_bounds() { for layer in [Layer::Oa, Layer::Sa] { diff --git a/harness/STATE.md b/harness/STATE.md index 9836a2d6..7969c426 100644 --- a/harness/STATE.md +++ b/harness/STATE.md @@ -1,9 +1,12 @@ # Progress Ledger — first release Updated 2026-09-11 by Codex-ytr83r /root for current execution. -**Reboot checkpoint:** the user requested saving progress before reboot. The -desktop Cargo session93786 was interrupted during dependency compilation; no -desktop test result exists. Follow [resume instructions](RESUME.md) after reboot. +**Post-reboot:** the user confirmed restart; fresh Windows boot13:41:27UTC is +verified and saved checkpointfb77b85 was clean. Desktop session93786 had been +interrupted during dependency compilation; no test result exists. Current work +is the reviewed Unicode capsule clipping correction and cached Windows gate, +plus ordinary Ubuntu26.04 installation because no distro was yet registered. +The old [resume instructions](RESUME.md) preserve the exact interruption context. **Release remains incomplete.** This is the new Codex-ytr83r Windows checkout. It started clean at `ff615d0`; no local compiled desktop or native acceptance is claimed for the combined source at this checkpoint. diff --git a/harness/experiments/lifecycle-native-ytr83r-20260911/desktop-clipping-inputs.json b/harness/experiments/lifecycle-native-ytr83r-20260911/desktop-clipping-inputs.json new file mode 100644 index 00000000..11aefaab --- /dev/null +++ b/harness/experiments/lifecycle-native-ytr83r-20260911/desktop-clipping-inputs.json @@ -0,0 +1,14 @@ +[ + { + "Path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\crates\\oa-desktop\\src\\behavior.rs", + "Hash": "F2FB8850480FB96F8038A4C1D855EE31E408890B1D943E7B3A9F26B5E4498445" + }, + { + "Path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\crates\\oa-desktop\\src\\behavior\\scenario_lifecycle\\render.rs", + "Hash": "88594D0758358D776BB5453CCF5D482A5775600D926C53D4FCE71DD7833AC8C7" + }, + { + "Path": "C:\\Users\\User\\Documents\\Git\\ARCADIA-Studio\\crates\\oa-desktop\\src\\behavior\\scenario_lifecycle\\render_tests.rs", + "Hash": "862FC0B04517187B7F02AA1B98914C6FB12D6D650D9F72946C8B1FFFB0A3C05D" + } +] diff --git a/harness/experiments/lifecycle-native-ytr83r-20260911/typography-admission.json b/harness/experiments/lifecycle-native-ytr83r-20260911/typography-admission.json new file mode 100644 index 00000000..b0983373 --- /dev/null +++ b/harness/experiments/lifecycle-native-ytr83r-20260911/typography-admission.json @@ -0,0 +1,18 @@ +{ + "results": [ + { + "seconds": 0.4776694, + "mode": "typography-wide", + "scope": "ordinary core/source admission of fixed expected input only; no native output", + "exit": 0 + }, + { + "seconds": 0.257928, + "mode": "typography-clusters", + "scope": "ordinary core/source admission of fixed expected input only; no native output", + "exit": 0 + } + ], + "completed_utc": "2026-09-11T13:50:08.2961401Z", + "oracle_sha256": "798D7A1907B894C13549BAD35511B21D6BC7F3D67D63674042B7DF71184C7524" +} diff --git a/harness/experiments/lifecycle-native-ytr83r-20260911/typography-clusters-admission.log b/harness/experiments/lifecycle-native-ytr83r-20260911/typography-clusters-admission.log new file mode 100644 index 00000000..314b7a69 --- /dev/null +++ b/harness/experiments/lifecycle-native-ytr83r-20260911/typography-clusters-admission.log @@ -0,0 +1 @@ +PASS same: all identities, fields, reachable source and physical bytes diff --git a/harness/experiments/lifecycle-native-ytr83r-20260911/typography-predictions.json b/harness/experiments/lifecycle-native-ytr83r-20260911/typography-predictions.json new file mode 100644 index 00000000..f3228fb1 --- /dev/null +++ b/harness/experiments/lifecycle-native-ytr83r-20260911/typography-predictions.json @@ -0,0 +1,59 @@ +{ + "origin": "baseline/project.arcadia", + "scope": "Exactly the two root receiver Lifeline names; all other bytes unchanged", + "native_acceptance": false, + "variants": { + "typography-wide": { + "changes": [ + { + "id": "5ceab400-0000-4000-8000-00000000044e", + "name": "WWWWWWWWWWWWWWWWWW", + "before": "oa_lifeline life_oa_102 \"OA Receiver lane\" id \"5ceab400-0000-4000-8000-00000000044e\"", + "after": "oa_lifeline life_oa_102 \"WWWWWWWWWWWWWWWWWW\" id \"5ceab400-0000-4000-8000-00000000044e\"" + }, + { + "id": "5ceab400-0000-4000-8000-000000000836", + "name": "界界界界界界界界界界界界界界界界界界", + "before": "sa_lifeline life_sa_102 \"SA Receiver lane\" id \"5ceab400-0000-4000-8000-000000000836\"", + "after": "sa_lifeline life_sa_102 \"界界界界界界界界界界界界界界界界界界\" id \"5ceab400-0000-4000-8000-000000000836\"" + } + ], + "files": { + "project.arcadia": { + "bytes": 20128, + "sha256": "6a18ee1f246321bdf8ab0e7e8e5d4eba134ce486ed5224c4ffd61c7342c3a7d3" + }, + "rationale.arcadia": { + "bytes": 86, + "sha256": "8509f8d8a136d808cf98a1bb0fe50348b8a24409f30dee4ee65b62bf5cb9e6bf" + } + } + }, + "typography-clusters": { + "changes": [ + { + "id": "5ceab400-0000-4000-8000-00000000044e", + "name": "abcdefghijklmnopé尾", + "before": "oa_lifeline life_oa_102 \"OA Receiver lane\" id \"5ceab400-0000-4000-8000-00000000044e\"", + "after": "oa_lifeline life_oa_102 \"abcdefghijklmnopé尾\" id \"5ceab400-0000-4000-8000-00000000044e\"" + }, + { + "id": "5ceab400-0000-4000-8000-000000000836", + "name": "abcdefghijklmnop👩‍🔬 tail", + "before": "sa_lifeline life_sa_102 \"SA Receiver lane\" id \"5ceab400-0000-4000-8000-000000000836\"", + "after": "sa_lifeline life_sa_102 \"abcdefghijklmnop👩‍🔬 tail\" id \"5ceab400-0000-4000-8000-000000000836\"" + } + ], + "files": { + "project.arcadia": { + "bytes": 20110, + "sha256": "eecddfc4a4514e995633ea58b89fe154dc6dc43509b1f53ee05b76f8e6b993c8" + }, + "rationale.arcadia": { + "bytes": 86, + "sha256": "8509f8d8a136d808cf98a1bb0fe50348b8a24409f30dee4ee65b62bf5cb9e6bf" + } + } + } + } +} diff --git a/harness/experiments/lifecycle-native-ytr83r-20260911/typography-wide-admission.log b/harness/experiments/lifecycle-native-ytr83r-20260911/typography-wide-admission.log new file mode 100644 index 00000000..314b7a69 --- /dev/null +++ b/harness/experiments/lifecycle-native-ytr83r-20260911/typography-wide-admission.log @@ -0,0 +1 @@ +PASS same: all identities, fields, reachable source and physical bytes diff --git a/harness/fixtures/scenario-lifecycle-native/README.md b/harness/fixtures/scenario-lifecycle-native/README.md index a95599e6..0f62f8d6 100644 --- a/harness/fixtures/scenario-lifecycle-native/README.md +++ b/harness/fixtures/scenario-lifecycle-native/README.md @@ -136,3 +136,28 @@ source byte and identity is unchanged. All three rationale files remain identica 86-byte Unicode text with exactly two CRLF lines and no bare LF. None of these predictions used native outputs. Pending: matching GUI, visual/interaction checks and every native Save/Undo/Redo/reopen step above. + +## Separate Unicode display predictions — after reboot + +`typography-wide` changes only the OA root receiver Lifeline name to eighteen +`W` characters and the SA root receiver name to eighteen `界` characters. +`typography-clusters` instead uses a combining accent and a joined emoji near +the existing display cutoff. Both derive from the original baseline by replacing +exactly the two named Lifeline declaration name tokens; reverse replacement +reproduced every original byte. All six original fixture hashes remain unchanged. + +The expected full strings, IDs, byte sizes and SHA256 values are preserved in +`../../experiments/lifecycle-native-ytr83r-20260911/typography-predictions.json`. +The unchanged, hash-verified original oracle admitted both inputs through its +`same EXPECTED EXPECTED` path using ordinary core/source loading and validation. +This proves input admission only; it is not a native comparison. Exact logs and +timings are alongside the manifest in `typography-admission.json`. + +Before opening either variant in Studio, copy it to a fresh native working +directory. Compare every passive open/zoom/select/Save result with the immutable +expected variant using `same EXPECTED ACTUAL`. Inspect Create label containment +at 0.5x/1x/2x and minimum Fit, while retaining the original Create selection IDs. +Select the neutral lane header/guide to inspect its full Lifeline name, then +cancel property editing without changing it. Missing font glyphs are observations +to record, not a reason to change the source names or weaken containment checks. +No native output or pixel clipping acceptance is claimed yet. diff --git a/harness/fixtures/scenario-lifecycle-native/typography-clusters/project.arcadia b/harness/fixtures/scenario-lifecycle-native/typography-clusters/project.arcadia new file mode 100644 index 00000000..99ad0b59 --- /dev/null +++ b/harness/fixtures/scenario-lifecycle-native/typography-clusters/project.arcadia @@ -0,0 +1,692 @@ +arcadia 7; +project lifecycle_native "Lifecycle native contract" id "5ceab400-0000-4000-8000-000000000001" { + include "rationale.arcadia"; + description "Fixed semantic inputs; lifecycle geometry is derived and never authored."; + + oa_activity life_oa_10 "OA Controller work" id "5ceab400-0000-4000-8000-0000000003f2" { + description ""; + parent none; + } + + oa_activity life_oa_11 "OA Receiver work" id "5ceab400-0000-4000-8000-0000000003f3" { + description ""; + parent none; + } + + oa_scenario life_oa_100 "OA 01 Root create action delete" id "5ceab400-0000-4000-8000-00000000044c" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_110, @life_oa_111, @life_oa_112]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_101 "OA Controller lane" id "5ceab400-0000-4000-8000-00000000044d" { + description ""; + parent @life_oa_100; + represented @life_oa_10; + } + + oa_lifeline life_oa_102 "abcdefghijklmnopé尾" id "5ceab400-0000-4000-8000-00000000044e" { + description ""; + parent @life_oa_100; + represented @life_oa_11; + } + + oa_occurrence life_oa_110 "OA Create receiver" id "5ceab400-0000-4000-8000-000000000456" { + body { + Exchange { + exchange @life_oa_service; + message_kind Create; + receiver @life_oa_102; + reply_to none; + sender @life_oa_101; + values []; + }; + }; + description ""; + parent @life_oa_100; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_111 "OA Receiver action" id "5ceab400-0000-4000-8000-000000000457" { + body { + Action { + action @life_oa_11; + lifeline @life_oa_102; + }; + }; + description ""; + parent @life_oa_100; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_112 "OA Delete receiver" id "5ceab400-0000-4000-8000-000000000458" { + body { + Exchange { + exchange @life_oa_service; + message_kind Delete; + receiver @life_oa_102; + reply_to none; + sender @life_oa_101; + values []; + }; + }; + description ""; + parent @life_oa_100; + postcondition ""; + precondition ""; + } + + oa_scenario life_oa_200 "OA 02 Preexisting empty" id "5ceab400-0000-4000-8000-0000000004b0" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_201 "OA Controller lane" id "5ceab400-0000-4000-8000-0000000004b1" { + description ""; + parent @life_oa_200; + represented @life_oa_10; + } + + oa_lifeline life_oa_202 "OA Receiver lane" id "5ceab400-0000-4000-8000-0000000004b2" { + description ""; + parent @life_oa_200; + represented @life_oa_11; + } + + oa_scenario life_oa_300 "OA 03 Create only" id "5ceab400-0000-4000-8000-000000000514" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_310]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_301 "OA Controller lane" id "5ceab400-0000-4000-8000-000000000515" { + description ""; + parent @life_oa_300; + represented @life_oa_10; + } + + oa_lifeline life_oa_302 "OA Receiver lane" id "5ceab400-0000-4000-8000-000000000516" { + description ""; + parent @life_oa_300; + represented @life_oa_11; + } + + oa_occurrence life_oa_310 "OA Create only receiver" id "5ceab400-0000-4000-8000-00000000051e" { + body { + Exchange { + exchange @life_oa_service; + message_kind Create; + receiver @life_oa_302; + reply_to none; + sender @life_oa_301; + values []; + }; + }; + description ""; + parent @life_oa_300; + postcondition ""; + precondition ""; + } + + oa_scenario life_oa_400 "OA 04 Conditional delete" id "5ceab400-0000-4000-8000-000000000578" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_410, @life_oa_411]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_401 "OA Controller lane" id "5ceab400-0000-4000-8000-000000000579" { + description ""; + parent @life_oa_400; + represented @life_oa_10; + } + + oa_lifeline life_oa_402 "OA Receiver lane" id "5ceab400-0000-4000-8000-00000000057a" { + description ""; + parent @life_oa_400; + represented @life_oa_11; + } + + oa_occurrence life_oa_410 "OA Open call" id "5ceab400-0000-4000-8000-000000000582" { + body { + Exchange { + exchange @life_oa_service; + message_kind Call; + receiver @life_oa_402; + reply_to none; + sender @life_oa_401; + values []; + }; + }; + description ""; + parent @life_oa_400; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_411 "OA ALT delete or keep" id "5ceab400-0000-4000-8000-000000000583" { + body { + Fragment { + branches [@life_oa_412, @life_oa_413]; + operator Alternative; + }; + }; + description ""; + parent @life_oa_400; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_412 "OA Left delete operand" id "5ceab400-0000-4000-8000-000000000584" { + body { + Branch { + guard "stop_requested"; + occurrences [@life_oa_414]; + }; + }; + description ""; + parent @life_oa_411; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_413 "OA Right empty operand" id "5ceab400-0000-4000-8000-000000000585" { + body { + Branch { + guard "else"; + occurrences []; + }; + }; + description ""; + parent @life_oa_411; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_414 "OA Conditional delete receiver" id "5ceab400-0000-4000-8000-000000000586" { + body { + Exchange { + exchange @life_oa_service; + message_kind Delete; + receiver @life_oa_402; + reply_to none; + sender @life_oa_401; + values []; + }; + }; + description ""; + parent @life_oa_412; + postcondition ""; + precondition ""; + } + + oa_scenario life_oa_500 "OA 05 Unassigned receiver" id "5ceab400-0000-4000-8000-0000000005dc" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_510, @life_oa_511]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_501 "OA Controller lane" id "5ceab400-0000-4000-8000-0000000005dd" { + description ""; + parent @life_oa_500; + represented @life_oa_10; + } + + oa_lifeline life_oa_502 "OA Unassigned receiver lane" id "5ceab400-0000-4000-8000-0000000005de" { + description ""; + parent @life_oa_500; + represented none; + } + + oa_occurrence life_oa_510 "OA Create unassigned receiver" id "5ceab400-0000-4000-8000-0000000005e6" { + body { + Exchange { + exchange none; + message_kind Create; + receiver @life_oa_502; + reply_to none; + sender @life_oa_501; + values []; + }; + }; + description ""; + parent @life_oa_500; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_511 "OA Delete unassigned receiver" id "5ceab400-0000-4000-8000-0000000005e7" { + body { + Exchange { + exchange none; + message_kind Delete; + receiver @life_oa_502; + reply_to none; + sender @life_oa_501; + values []; + }; + }; + description ""; + parent @life_oa_500; + postcondition ""; + precondition ""; + } + + oa_scenario life_oa_600 "OA 06 Self delete" id "5ceab400-0000-4000-8000-000000000640" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_610]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_601 "OA Controller lane" id "5ceab400-0000-4000-8000-000000000641" { + description ""; + parent @life_oa_600; + represented @life_oa_10; + } + + oa_occurrence life_oa_610 "OA Self delete controller" id "5ceab400-0000-4000-8000-00000000064a" { + body { + Exchange { + exchange none; + message_kind Delete; + receiver @life_oa_601; + reply_to none; + sender @life_oa_601; + values []; + }; + }; + description ""; + parent @life_oa_600; + postcondition ""; + precondition ""; + } + + sa_function life_sa_10 "SA Controller work" id "5ceab400-0000-4000-8000-0000000007da" { + description ""; + parent none; + } + + sa_function life_sa_11 "SA Receiver work" id "5ceab400-0000-4000-8000-0000000007db" { + description ""; + parent none; + } + + sa_scenario life_sa_100 "SA 01 Root create action delete" id "5ceab400-0000-4000-8000-000000000834" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_110, @life_sa_111, @life_sa_112]; + viewpoint Functional; + } + + sa_lifeline life_sa_101 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000835" { + description ""; + parent @life_sa_100; + represented @life_sa_10; + } + + sa_lifeline life_sa_102 "abcdefghijklmnop👩‍🔬 tail" id "5ceab400-0000-4000-8000-000000000836" { + description ""; + parent @life_sa_100; + represented @life_sa_11; + } + + sa_occurrence life_sa_110 "SA Create receiver" id "5ceab400-0000-4000-8000-00000000083e" { + body { + Exchange { + exchange @life_sa_service; + message_kind Create; + receiver @life_sa_102; + reply_to none; + sender @life_sa_101; + values []; + }; + }; + description ""; + parent @life_sa_100; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_111 "SA Receiver action" id "5ceab400-0000-4000-8000-00000000083f" { + body { + Action { + action @life_sa_11; + lifeline @life_sa_102; + }; + }; + description ""; + parent @life_sa_100; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_112 "SA Delete receiver" id "5ceab400-0000-4000-8000-000000000840" { + body { + Exchange { + exchange @life_sa_service; + message_kind Delete; + receiver @life_sa_102; + reply_to none; + sender @life_sa_101; + values []; + }; + }; + description ""; + parent @life_sa_100; + postcondition ""; + precondition ""; + } + + sa_scenario life_sa_200 "SA 02 Preexisting empty" id "5ceab400-0000-4000-8000-000000000898" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint Functional; + } + + sa_lifeline life_sa_201 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000899" { + description ""; + parent @life_sa_200; + represented @life_sa_10; + } + + sa_lifeline life_sa_202 "SA Receiver lane" id "5ceab400-0000-4000-8000-00000000089a" { + description ""; + parent @life_sa_200; + represented @life_sa_11; + } + + sa_scenario life_sa_300 "SA 03 Create only" id "5ceab400-0000-4000-8000-0000000008fc" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_310]; + viewpoint Functional; + } + + sa_lifeline life_sa_301 "SA Controller lane" id "5ceab400-0000-4000-8000-0000000008fd" { + description ""; + parent @life_sa_300; + represented @life_sa_10; + } + + sa_lifeline life_sa_302 "SA Receiver lane" id "5ceab400-0000-4000-8000-0000000008fe" { + description ""; + parent @life_sa_300; + represented @life_sa_11; + } + + sa_occurrence life_sa_310 "SA Create only receiver" id "5ceab400-0000-4000-8000-000000000906" { + body { + Exchange { + exchange @life_sa_service; + message_kind Create; + receiver @life_sa_302; + reply_to none; + sender @life_sa_301; + values []; + }; + }; + description ""; + parent @life_sa_300; + postcondition ""; + precondition ""; + } + + sa_scenario life_sa_400 "SA 04 Conditional delete" id "5ceab400-0000-4000-8000-000000000960" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_410, @life_sa_411]; + viewpoint Functional; + } + + sa_lifeline life_sa_401 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000961" { + description ""; + parent @life_sa_400; + represented @life_sa_10; + } + + sa_lifeline life_sa_402 "SA Receiver lane" id "5ceab400-0000-4000-8000-000000000962" { + description ""; + parent @life_sa_400; + represented @life_sa_11; + } + + sa_occurrence life_sa_410 "SA Open call" id "5ceab400-0000-4000-8000-00000000096a" { + body { + Exchange { + exchange @life_sa_service; + message_kind Call; + receiver @life_sa_402; + reply_to none; + sender @life_sa_401; + values []; + }; + }; + description ""; + parent @life_sa_400; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_411 "SA ALT delete or keep" id "5ceab400-0000-4000-8000-00000000096b" { + body { + Fragment { + branches [@life_sa_412, @life_sa_413]; + operator Alternative; + }; + }; + description ""; + parent @life_sa_400; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_412 "SA Left delete operand" id "5ceab400-0000-4000-8000-00000000096c" { + body { + Branch { + guard "stop_requested"; + occurrences [@life_sa_414]; + }; + }; + description ""; + parent @life_sa_411; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_413 "SA Right empty operand" id "5ceab400-0000-4000-8000-00000000096d" { + body { + Branch { + guard "else"; + occurrences []; + }; + }; + description ""; + parent @life_sa_411; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_414 "SA Conditional delete receiver" id "5ceab400-0000-4000-8000-00000000096e" { + body { + Exchange { + exchange @life_sa_service; + message_kind Delete; + receiver @life_sa_402; + reply_to none; + sender @life_sa_401; + values []; + }; + }; + description ""; + parent @life_sa_412; + postcondition ""; + precondition ""; + } + + sa_scenario life_sa_500 "SA 05 Unassigned receiver" id "5ceab400-0000-4000-8000-0000000009c4" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_510, @life_sa_511]; + viewpoint Functional; + } + + sa_lifeline life_sa_501 "SA Controller lane" id "5ceab400-0000-4000-8000-0000000009c5" { + description ""; + parent @life_sa_500; + represented @life_sa_10; + } + + sa_lifeline life_sa_502 "SA Unassigned receiver lane" id "5ceab400-0000-4000-8000-0000000009c6" { + description ""; + parent @life_sa_500; + represented none; + } + + sa_occurrence life_sa_510 "SA Create unassigned receiver" id "5ceab400-0000-4000-8000-0000000009ce" { + body { + Exchange { + exchange none; + message_kind Create; + receiver @life_sa_502; + reply_to none; + sender @life_sa_501; + values []; + }; + }; + description ""; + parent @life_sa_500; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_511 "SA Delete unassigned receiver" id "5ceab400-0000-4000-8000-0000000009cf" { + body { + Exchange { + exchange none; + message_kind Delete; + receiver @life_sa_502; + reply_to none; + sender @life_sa_501; + values []; + }; + }; + description ""; + parent @life_sa_500; + postcondition ""; + precondition ""; + } + + sa_scenario life_sa_600 "SA 06 Self delete" id "5ceab400-0000-4000-8000-000000000a28" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_610]; + viewpoint Functional; + } + + sa_lifeline life_sa_601 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000a29" { + description ""; + parent @life_sa_600; + represented @life_sa_10; + } + + sa_occurrence life_sa_610 "SA Self delete controller" id "5ceab400-0000-4000-8000-000000000a32" { + body { + Exchange { + exchange none; + message_kind Delete; + receiver @life_sa_601; + reply_to none; + sender @life_sa_601; + values []; + }; + }; + description ""; + parent @life_sa_600; + postcondition ""; + precondition ""; + } + + sa_port sa_lifecycle_service_input "SA Lifecycle service input" id "a4a6ecc0-3e12-51a5-b08b-199ad743525c" { + contract { + FunctionInput { + incoming_items []; + }; + }; + description ""; + legacy none; + parent @life_sa_11; + } + + sa_port sa_lifecycle_service_output "SA Lifecycle service output" id "b1aa66c4-0e8e-5091-beda-2b8d2005b688" { + contract { + FunctionOutput { + outgoing_items []; + }; + }; + description ""; + legacy none; + parent @life_sa_10; + } + + interaction life_oa_service "OA Lifecycle service" id "5ceab400-0000-4000-8000-0000000003f4" { + description ""; + items []; + source @life_oa_10; + target @life_oa_11; + } + + functional_exchange life_sa_service "SA Lifecycle service" id "5ceab400-0000-4000-8000-0000000007dc" { + description ""; + items []; + source @life_sa_10; + source_port @sa_lifecycle_service_output; + target @life_sa_11; + target_port @sa_lifecycle_service_input; + } + +} diff --git a/harness/fixtures/scenario-lifecycle-native/typography-clusters/rationale.arcadia b/harness/fixtures/scenario-lifecycle-native/typography-clusters/rationale.arcadia new file mode 100644 index 00000000..a6c18ddd --- /dev/null +++ b/harness/fixtures/scenario-lifecycle-native/typography-clusters/rationale.arcadia @@ -0,0 +1,2 @@ +// Preserve lifecycle note: 雨 · receiver. +// Geometry never changes these bytes. diff --git a/harness/fixtures/scenario-lifecycle-native/typography-wide/project.arcadia b/harness/fixtures/scenario-lifecycle-native/typography-wide/project.arcadia new file mode 100644 index 00000000..3e04bde6 --- /dev/null +++ b/harness/fixtures/scenario-lifecycle-native/typography-wide/project.arcadia @@ -0,0 +1,692 @@ +arcadia 7; +project lifecycle_native "Lifecycle native contract" id "5ceab400-0000-4000-8000-000000000001" { + include "rationale.arcadia"; + description "Fixed semantic inputs; lifecycle geometry is derived and never authored."; + + oa_activity life_oa_10 "OA Controller work" id "5ceab400-0000-4000-8000-0000000003f2" { + description ""; + parent none; + } + + oa_activity life_oa_11 "OA Receiver work" id "5ceab400-0000-4000-8000-0000000003f3" { + description ""; + parent none; + } + + oa_scenario life_oa_100 "OA 01 Root create action delete" id "5ceab400-0000-4000-8000-00000000044c" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_110, @life_oa_111, @life_oa_112]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_101 "OA Controller lane" id "5ceab400-0000-4000-8000-00000000044d" { + description ""; + parent @life_oa_100; + represented @life_oa_10; + } + + oa_lifeline life_oa_102 "WWWWWWWWWWWWWWWWWW" id "5ceab400-0000-4000-8000-00000000044e" { + description ""; + parent @life_oa_100; + represented @life_oa_11; + } + + oa_occurrence life_oa_110 "OA Create receiver" id "5ceab400-0000-4000-8000-000000000456" { + body { + Exchange { + exchange @life_oa_service; + message_kind Create; + receiver @life_oa_102; + reply_to none; + sender @life_oa_101; + values []; + }; + }; + description ""; + parent @life_oa_100; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_111 "OA Receiver action" id "5ceab400-0000-4000-8000-000000000457" { + body { + Action { + action @life_oa_11; + lifeline @life_oa_102; + }; + }; + description ""; + parent @life_oa_100; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_112 "OA Delete receiver" id "5ceab400-0000-4000-8000-000000000458" { + body { + Exchange { + exchange @life_oa_service; + message_kind Delete; + receiver @life_oa_102; + reply_to none; + sender @life_oa_101; + values []; + }; + }; + description ""; + parent @life_oa_100; + postcondition ""; + precondition ""; + } + + oa_scenario life_oa_200 "OA 02 Preexisting empty" id "5ceab400-0000-4000-8000-0000000004b0" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_201 "OA Controller lane" id "5ceab400-0000-4000-8000-0000000004b1" { + description ""; + parent @life_oa_200; + represented @life_oa_10; + } + + oa_lifeline life_oa_202 "OA Receiver lane" id "5ceab400-0000-4000-8000-0000000004b2" { + description ""; + parent @life_oa_200; + represented @life_oa_11; + } + + oa_scenario life_oa_300 "OA 03 Create only" id "5ceab400-0000-4000-8000-000000000514" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_310]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_301 "OA Controller lane" id "5ceab400-0000-4000-8000-000000000515" { + description ""; + parent @life_oa_300; + represented @life_oa_10; + } + + oa_lifeline life_oa_302 "OA Receiver lane" id "5ceab400-0000-4000-8000-000000000516" { + description ""; + parent @life_oa_300; + represented @life_oa_11; + } + + oa_occurrence life_oa_310 "OA Create only receiver" id "5ceab400-0000-4000-8000-00000000051e" { + body { + Exchange { + exchange @life_oa_service; + message_kind Create; + receiver @life_oa_302; + reply_to none; + sender @life_oa_301; + values []; + }; + }; + description ""; + parent @life_oa_300; + postcondition ""; + precondition ""; + } + + oa_scenario life_oa_400 "OA 04 Conditional delete" id "5ceab400-0000-4000-8000-000000000578" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_410, @life_oa_411]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_401 "OA Controller lane" id "5ceab400-0000-4000-8000-000000000579" { + description ""; + parent @life_oa_400; + represented @life_oa_10; + } + + oa_lifeline life_oa_402 "OA Receiver lane" id "5ceab400-0000-4000-8000-00000000057a" { + description ""; + parent @life_oa_400; + represented @life_oa_11; + } + + oa_occurrence life_oa_410 "OA Open call" id "5ceab400-0000-4000-8000-000000000582" { + body { + Exchange { + exchange @life_oa_service; + message_kind Call; + receiver @life_oa_402; + reply_to none; + sender @life_oa_401; + values []; + }; + }; + description ""; + parent @life_oa_400; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_411 "OA ALT delete or keep" id "5ceab400-0000-4000-8000-000000000583" { + body { + Fragment { + branches [@life_oa_412, @life_oa_413]; + operator Alternative; + }; + }; + description ""; + parent @life_oa_400; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_412 "OA Left delete operand" id "5ceab400-0000-4000-8000-000000000584" { + body { + Branch { + guard "stop_requested"; + occurrences [@life_oa_414]; + }; + }; + description ""; + parent @life_oa_411; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_413 "OA Right empty operand" id "5ceab400-0000-4000-8000-000000000585" { + body { + Branch { + guard "else"; + occurrences []; + }; + }; + description ""; + parent @life_oa_411; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_414 "OA Conditional delete receiver" id "5ceab400-0000-4000-8000-000000000586" { + body { + Exchange { + exchange @life_oa_service; + message_kind Delete; + receiver @life_oa_402; + reply_to none; + sender @life_oa_401; + values []; + }; + }; + description ""; + parent @life_oa_412; + postcondition ""; + precondition ""; + } + + oa_scenario life_oa_500 "OA 05 Unassigned receiver" id "5ceab400-0000-4000-8000-0000000005dc" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_510, @life_oa_511]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_501 "OA Controller lane" id "5ceab400-0000-4000-8000-0000000005dd" { + description ""; + parent @life_oa_500; + represented @life_oa_10; + } + + oa_lifeline life_oa_502 "OA Unassigned receiver lane" id "5ceab400-0000-4000-8000-0000000005de" { + description ""; + parent @life_oa_500; + represented none; + } + + oa_occurrence life_oa_510 "OA Create unassigned receiver" id "5ceab400-0000-4000-8000-0000000005e6" { + body { + Exchange { + exchange none; + message_kind Create; + receiver @life_oa_502; + reply_to none; + sender @life_oa_501; + values []; + }; + }; + description ""; + parent @life_oa_500; + postcondition ""; + precondition ""; + } + + oa_occurrence life_oa_511 "OA Delete unassigned receiver" id "5ceab400-0000-4000-8000-0000000005e7" { + body { + Exchange { + exchange none; + message_kind Delete; + receiver @life_oa_502; + reply_to none; + sender @life_oa_501; + values []; + }; + }; + description ""; + parent @life_oa_500; + postcondition ""; + precondition ""; + } + + oa_scenario life_oa_600 "OA 06 Self delete" id "5ceab400-0000-4000-8000-000000000640" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_oa_610]; + viewpoint OperationalActivity; + } + + oa_lifeline life_oa_601 "OA Controller lane" id "5ceab400-0000-4000-8000-000000000641" { + description ""; + parent @life_oa_600; + represented @life_oa_10; + } + + oa_occurrence life_oa_610 "OA Self delete controller" id "5ceab400-0000-4000-8000-00000000064a" { + body { + Exchange { + exchange none; + message_kind Delete; + receiver @life_oa_601; + reply_to none; + sender @life_oa_601; + values []; + }; + }; + description ""; + parent @life_oa_600; + postcondition ""; + precondition ""; + } + + sa_function life_sa_10 "SA Controller work" id "5ceab400-0000-4000-8000-0000000007da" { + description ""; + parent none; + } + + sa_function life_sa_11 "SA Receiver work" id "5ceab400-0000-4000-8000-0000000007db" { + description ""; + parent none; + } + + sa_scenario life_sa_100 "SA 01 Root create action delete" id "5ceab400-0000-4000-8000-000000000834" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_110, @life_sa_111, @life_sa_112]; + viewpoint Functional; + } + + sa_lifeline life_sa_101 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000835" { + description ""; + parent @life_sa_100; + represented @life_sa_10; + } + + sa_lifeline life_sa_102 "界界界界界界界界界界界界界界界界界界" id "5ceab400-0000-4000-8000-000000000836" { + description ""; + parent @life_sa_100; + represented @life_sa_11; + } + + sa_occurrence life_sa_110 "SA Create receiver" id "5ceab400-0000-4000-8000-00000000083e" { + body { + Exchange { + exchange @life_sa_service; + message_kind Create; + receiver @life_sa_102; + reply_to none; + sender @life_sa_101; + values []; + }; + }; + description ""; + parent @life_sa_100; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_111 "SA Receiver action" id "5ceab400-0000-4000-8000-00000000083f" { + body { + Action { + action @life_sa_11; + lifeline @life_sa_102; + }; + }; + description ""; + parent @life_sa_100; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_112 "SA Delete receiver" id "5ceab400-0000-4000-8000-000000000840" { + body { + Exchange { + exchange @life_sa_service; + message_kind Delete; + receiver @life_sa_102; + reply_to none; + sender @life_sa_101; + values []; + }; + }; + description ""; + parent @life_sa_100; + postcondition ""; + precondition ""; + } + + sa_scenario life_sa_200 "SA 02 Preexisting empty" id "5ceab400-0000-4000-8000-000000000898" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps []; + viewpoint Functional; + } + + sa_lifeline life_sa_201 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000899" { + description ""; + parent @life_sa_200; + represented @life_sa_10; + } + + sa_lifeline life_sa_202 "SA Receiver lane" id "5ceab400-0000-4000-8000-00000000089a" { + description ""; + parent @life_sa_200; + represented @life_sa_11; + } + + sa_scenario life_sa_300 "SA 03 Create only" id "5ceab400-0000-4000-8000-0000000008fc" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_310]; + viewpoint Functional; + } + + sa_lifeline life_sa_301 "SA Controller lane" id "5ceab400-0000-4000-8000-0000000008fd" { + description ""; + parent @life_sa_300; + represented @life_sa_10; + } + + sa_lifeline life_sa_302 "SA Receiver lane" id "5ceab400-0000-4000-8000-0000000008fe" { + description ""; + parent @life_sa_300; + represented @life_sa_11; + } + + sa_occurrence life_sa_310 "SA Create only receiver" id "5ceab400-0000-4000-8000-000000000906" { + body { + Exchange { + exchange @life_sa_service; + message_kind Create; + receiver @life_sa_302; + reply_to none; + sender @life_sa_301; + values []; + }; + }; + description ""; + parent @life_sa_300; + postcondition ""; + precondition ""; + } + + sa_scenario life_sa_400 "SA 04 Conditional delete" id "5ceab400-0000-4000-8000-000000000960" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_410, @life_sa_411]; + viewpoint Functional; + } + + sa_lifeline life_sa_401 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000961" { + description ""; + parent @life_sa_400; + represented @life_sa_10; + } + + sa_lifeline life_sa_402 "SA Receiver lane" id "5ceab400-0000-4000-8000-000000000962" { + description ""; + parent @life_sa_400; + represented @life_sa_11; + } + + sa_occurrence life_sa_410 "SA Open call" id "5ceab400-0000-4000-8000-00000000096a" { + body { + Exchange { + exchange @life_sa_service; + message_kind Call; + receiver @life_sa_402; + reply_to none; + sender @life_sa_401; + values []; + }; + }; + description ""; + parent @life_sa_400; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_411 "SA ALT delete or keep" id "5ceab400-0000-4000-8000-00000000096b" { + body { + Fragment { + branches [@life_sa_412, @life_sa_413]; + operator Alternative; + }; + }; + description ""; + parent @life_sa_400; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_412 "SA Left delete operand" id "5ceab400-0000-4000-8000-00000000096c" { + body { + Branch { + guard "stop_requested"; + occurrences [@life_sa_414]; + }; + }; + description ""; + parent @life_sa_411; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_413 "SA Right empty operand" id "5ceab400-0000-4000-8000-00000000096d" { + body { + Branch { + guard "else"; + occurrences []; + }; + }; + description ""; + parent @life_sa_411; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_414 "SA Conditional delete receiver" id "5ceab400-0000-4000-8000-00000000096e" { + body { + Exchange { + exchange @life_sa_service; + message_kind Delete; + receiver @life_sa_402; + reply_to none; + sender @life_sa_401; + values []; + }; + }; + description ""; + parent @life_sa_412; + postcondition ""; + precondition ""; + } + + sa_scenario life_sa_500 "SA 05 Unassigned receiver" id "5ceab400-0000-4000-8000-0000000009c4" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_510, @life_sa_511]; + viewpoint Functional; + } + + sa_lifeline life_sa_501 "SA Controller lane" id "5ceab400-0000-4000-8000-0000000009c5" { + description ""; + parent @life_sa_500; + represented @life_sa_10; + } + + sa_lifeline life_sa_502 "SA Unassigned receiver lane" id "5ceab400-0000-4000-8000-0000000009c6" { + description ""; + parent @life_sa_500; + represented none; + } + + sa_occurrence life_sa_510 "SA Create unassigned receiver" id "5ceab400-0000-4000-8000-0000000009ce" { + body { + Exchange { + exchange none; + message_kind Create; + receiver @life_sa_502; + reply_to none; + sender @life_sa_501; + values []; + }; + }; + description ""; + parent @life_sa_500; + postcondition ""; + precondition ""; + } + + sa_occurrence life_sa_511 "SA Delete unassigned receiver" id "5ceab400-0000-4000-8000-0000000009cf" { + body { + Exchange { + exchange none; + message_kind Delete; + receiver @life_sa_502; + reply_to none; + sender @life_sa_501; + values []; + }; + }; + description ""; + parent @life_sa_500; + postcondition ""; + precondition ""; + } + + sa_scenario life_sa_600 "SA 06 Self delete" id "5ceab400-0000-4000-8000-000000000a28" { + context none; + description ""; + parent none; + postcondition ""; + precondition ""; + steps [@life_sa_610]; + viewpoint Functional; + } + + sa_lifeline life_sa_601 "SA Controller lane" id "5ceab400-0000-4000-8000-000000000a29" { + description ""; + parent @life_sa_600; + represented @life_sa_10; + } + + sa_occurrence life_sa_610 "SA Self delete controller" id "5ceab400-0000-4000-8000-000000000a32" { + body { + Exchange { + exchange none; + message_kind Delete; + receiver @life_sa_601; + reply_to none; + sender @life_sa_601; + values []; + }; + }; + description ""; + parent @life_sa_600; + postcondition ""; + precondition ""; + } + + sa_port sa_lifecycle_service_input "SA Lifecycle service input" id "a4a6ecc0-3e12-51a5-b08b-199ad743525c" { + contract { + FunctionInput { + incoming_items []; + }; + }; + description ""; + legacy none; + parent @life_sa_11; + } + + sa_port sa_lifecycle_service_output "SA Lifecycle service output" id "b1aa66c4-0e8e-5091-beda-2b8d2005b688" { + contract { + FunctionOutput { + outgoing_items []; + }; + }; + description ""; + legacy none; + parent @life_sa_10; + } + + interaction life_oa_service "OA Lifecycle service" id "5ceab400-0000-4000-8000-0000000003f4" { + description ""; + items []; + source @life_oa_10; + target @life_oa_11; + } + + functional_exchange life_sa_service "SA Lifecycle service" id "5ceab400-0000-4000-8000-0000000007dc" { + description ""; + items []; + source @life_sa_10; + source_port @sa_lifecycle_service_output; + target @life_sa_11; + target_port @sa_lifecycle_service_input; + } + +} diff --git a/harness/fixtures/scenario-lifecycle-native/typography-wide/rationale.arcadia b/harness/fixtures/scenario-lifecycle-native/typography-wide/rationale.arcadia new file mode 100644 index 00000000..a6c18ddd --- /dev/null +++ b/harness/fixtures/scenario-lifecycle-native/typography-wide/rationale.arcadia @@ -0,0 +1,2 @@ +// Preserve lifecycle note: 雨 · receiver. +// Geometry never changes these bytes. diff --git a/harness/release-lifecycle-clipping-ytr83r-20260911.md b/harness/release-lifecycle-clipping-ytr83r-20260911.md new file mode 100644 index 00000000..989c9051 --- /dev/null +++ b/harness/release-lifecycle-clipping-ytr83r-20260911.md @@ -0,0 +1,79 @@ +# B4 Create label clipping, 2026-09-11 + +Codex-ytr83r /root/lifecycle_clip. Root ratified correction A from +`release-lifecycle-typography-review-ytr83r-20260911.md` after reboot; source base +reported by root is `fb77b857d26b64b80d99eabb4c65cf6785f3f451` (B4 `52f6e17` +plus CLI `023e3a8`). Coordination: issue 1 comments 272 and 276; current issue 2, +open PR list (empty), and ScenarioLifetimeRendering Wiki read before editing. +Full canvas redesign remains Codex-956atf's work. + +## Implemented, frozen for root's build + +The existing Create name is clipped to the 140 x 28 capsule's interior: 8 units +of horizontal and 4 units of vertical padding. It retains `short(name, 18)`, its +original world position, size 12, default single-line/unbounded-width text and +selection color. The finite clip can cut a glyph or hide the existing ellipsis; +measured, grapheme-aware fitting remains separate work. No capsule, endpoint, +marker identity, hit selection, lifetime, model or source contract changed. + +Root review refined the first draft's 6-unit vertical clip padding to 4 units: +the final 124 x 20 clip gives glyph overhang two extra units above and below +while retaining the original text offset (+8, +6). The first draft merely +matched the text origin symmetrically; it had no font evidence favoring the +tighter bound. Default 12 x 1.2 line height is 14.4, but that does not establish +ink bounds for accents or fallback glyphs. Native typography remains necessary. + +`draw_markers` now receives Scene's current uniform scale. The only behavior.rs +change is `self.lifecycle.draw_markers(&mut f, self.selected, self.scale);`. +`birth_label_clip` scales the padded rectangle into canvas coordinates and +intersects it with the origin/frame-size viewport, skipping an empty intersection +or invalid scale. The clipped child explicitly reapplies scale to the unchanged +world-space text position. It does not translate to the clip's origin. + +## Installed API scrutiny + +Sources read under `.local/toolchain/cargo/registry/src/index.crates.io-1949cf8c6b5b557f/`: + +- `iced_graphics-0.14.0/src/geometry/frame.rs`: `size` is available; `with_clip` + drafts a child, invokes the closure, then pastes its geometry. +- `iced_wgpu-0.14.0/src/geometry.rs`: `Frame::new` initializes identity transform + and uses the supplied clip verbatim; `draft` calls that constructor. It does + not inherit transform, add the clip origin, or intersect the parent clip. + `paste` appends child text unchanged. Positive uniform scale in `fill_text` + transforms the position and font size and stores the child's clip bounds. +- `iced_core-0.14.0/src/rectangle.rs`: `intersection` returns only a strictly + positive intersection. `Size::ZERO` exists in the installed core API. + +This matches current Scene draw: origin-based full canvas frame followed by +`f.scale(self.scale)`, with no pan/rotation transform before markers. Any later +camera integration must adapt BOTH clip coordinates and child text transform; +this narrow bridge does not claim to support that future camera automatically. + +## Validation scope and handoff + +Two tests are prepared in render_tests.rs: independently specified padded bounds +at 0.05, 0.5, 1 and 2 scale, plus partial right/bottom clipping, negative-origin +intersection, wholly outside/empty viewport and invalid scale. These exercise +geometry only. Existing real-Scene endpoint, identity, hit and source tests remain +unchanged. No fake font metrics or assertions of native pixel containment added. + +No Cargo, rustc, rustfmt, native app, Git, dependency or frozen-fixture action was +run by this worker. Root owns compilation/tests/format checks and native evidence. +Root is preparing separate wide and cluster typography inputs with unchanged +original six fixtures/oracle. Ordinary admission must precede native opening. +Actual WGPU text appearance, fallback, clipping at normal and minimum Fit, DPI, +hit identity and exact passive Project/SourceBundle preservation remain pending. +No native, font-width or pixel pass follows from the geometry tests. + +Frozen source SHA256 (before root's build or formatting): + +| File | SHA256 | +| --- | --- | +| `crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs` | `88594D0758358D776BB5453CCF5D482A5775600D926C53D4FCE71DD7833AC8C7` | +| `crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs` | `8C81103BB2B258289E137A45A5DE026A418CE681E3EE182C797ED3D05B53730F` | +| `crates/oa-desktop/src/behavior.rs` | `BAE613FD378B39A2E265B354F6D652C549C1F9ECA4A79255EEDF95705FD52FCC` | + +Root received the freeze before this report was completed so cached Windows +compilation can proceed. No further source edits by this worker without follow-up. +Root should link the resulting verified checkpoint and tests from the shared Wiki +once its gate completes; the prior Wiki's pending acceptance remains accurate. diff --git a/harness/release-postboot-integration-ytr83r-20260911.md b/harness/release-postboot-integration-ytr83r-20260911.md new file mode 100644 index 00000000..4de81165 --- /dev/null +++ b/harness/release-postboot-integration-ytr83r-20260911.md @@ -0,0 +1,135 @@ +# Postboot contextual integration delta — 2026-09-11 + +Codex-ytr83r /root/integration_resume. Read-only delta review against root +`fb77b857d26b64b80d99eabb4c65cf6785f3f451`; read AGENTS, issues 1/2 through +276/269, no open PRs, Authoring20260911, BehaviorAuthoring20260911 and Home. +Coordination: issue 1 comment 274. This supplements, rather than repeats, +`release-staged-source-integration-ytr83r-20260911.md`. + +Root will finish its frozen B4 correction/gates while the source owner resumes +validation. Do not import the author's unvalidated reboot WIP as an accepted +milestone. The smallest updated contextual source, once those gates mature, is +the coherent df6 implementation plus the two-file ca53 correction described +below, or its explicitly frozen successor. No chooser/canvas/core WIP is needed. + +## Ordered import recommendation + +1. Preserve root's B4 clip, lifecycle, CLI and current ledgers. Recheck owner + heads and comments immediately before integration; the recorded 9e head is + `ca53f574e57381a523e946d5277b4081cff74355` on codex/release1-9e8r6t. +2. Import contextual implementation `df6f59562643b7771ecf0c972f8655f3e3f1c4da` + and its associated oracle/fixtures/review/archive as the earlier preflight + specifies. Resolve only the behavior.rs module and guide.rs walkthrough + unions, retaining B4. Its scenario workspace overlap remains comment-only + on this host. Do not replace those complete files with the peer tree. +3. Apply only the ca53-versus-df6 production delta: creation.rs `picker_view` + caption (six added/one removed lines), and source_draft.rs essentials-first + view plus its three prepared mounted tests. These are the only two production + paths changed after df6. ca53's parent c4bad4b and grandparent d95b1ab contain + scenario and CLI publication evidence respectively, not source prerequisites. + The two-file correction does not touch App, scenario/topology workspace, + FormShown, core/server/CLI, schema, Cargo.toml or Cargo.lock. +4. Bring the ca53 corrected staged-source fixture README and appended + release-staged-source-authoring-oracle report. Save after child Use can adopt + a valid parent: inspect before Save or Cancel parent then Save for an + unchanged staged-only check. The frozen oracle and base source do not change. + Preserve the observed missing-runtime loader failure and scoped DLL remedy. +5. Preserve ca53's contextual-source-native-20260911 and + contextual-source-layout-reboot-20260911 archives, and reports + release-contextual-source-native, release-contextual-source-layout-review, + release-contextual-source-layout-independent and release-staged-owner-label + (all suffixed -20260911.md). Keep the peer RESTART_HANDOFF as linked, + source-specific history; do not overwrite root's RESUME or shared ledgers. + Earlier CLI/scenario evidence can be deliberately imported separately; + neither intervening complete commit is required for this source correction. +6. Union the raw-byte attributes before staging. Verify imported index and later + checkout bytes against original inventories, then capture fresh combined + source/binary provenance and run root's affected gates/native acceptance. + Any later peer correction must be reviewed as a new exact delta. + +## Overlap and still-open acceptance + +The ca53 source_draft delta starts at view line 327; the rest is a new test +module after Draft::command. All pre-view state, tokens, serialization, update, +combination, final command, existing parent controls and pinned footer remain. +Kind choices precede unbounded parent detail; a single-kind button disappears +only when the draft already holds that permissible kind. The caption changes +only the selected exact staged Owner's presentation. Neither path intersects +root's B4 render.rs/render_tests.rs or its draw_markers scale argument. + +The author's independent review at 89B08EF6 closed a long-parent-before-kind +finding. ca53 source C8D36BD6 also includes mechanical fixes for two actual test +helper compile errors (column macro ambiguity and Id::new(String)). Corrected +focused2 was interrupted before tests. Expected contextual26, strict Clippy, +formatting and a matching new GUI remain pending. The three tests compose a +caption plus child card at 340/500 by 215; they do not mount full scenario or +topology workspaces. Real 1100x700 ordinary-panel Name/kind/root-parent and +owner-caption acceptance, plus long-parent/recovery/wide controls, is still due. + +Peer 956's published restart main is +`8d55d2d2eb05aed826b96a917cf776e1d8c3b690`; isolated core WIP is +`b96ff3935ab3f36b7144566e46559a05a29292a5`, incomplete canvas WIP is +`e511c4153fb5bb484652434340e0e4c7000c93d0`. Do not import these to obtain +the card/caption correction. Issue 1/275 keeps them paused pending that owner's +post-reboot return. Its source-derived, unexecuted P2 focus findings remain: +normal Scenario child Back/Use/Escape remounts a parent whose initial focus flag +was consumed; an already accepted FormShown task later operates using only a +global NAME_INPUT and can disturb a replacement session. Their report at exact +8d55d2d2 is `harness/release-chooser-contextual-integration-review-20260911.md`. +The remedy belongs to that owner's exact current-mount/session focus work; +ca53 does not resolve it. Keep delayed-task and ordinary child-return tests, +modal ownership, parent scroll retention and live native validation pending. +This does not assert the global task reaches Popup's separate search input. + +Historical GUI52 native acceptance is distinct: Lifeline Save-adoption and SA +Chain direct Create each passed complete model/source/files and one Undo/Redo +with original IDs. SA Machine Create/Save and Undo/Save passed; Machine Redo and +reopen did not. The live trial was closed at saved Machine Undo; reboot does not +preserve in-memory history. Use its original pinned first-commit carrier for +detached-file expectations, and a fresh trial for missing history. Direct +Lifeline Apply/Create, cancellation/recovery and corrected-layout native gates +remain separate. None of these form/B4 slices closes issue 2. + +## Exact Git-byte audit + +Authorized fetch of exact ca53 used --no-tags --no-write-fetch-head, populated +objects only, and completed successfully. No ref/index/source/commit/Cargo or +native mutation was performed. Only this report was written by this reviewer. + +All 13 layout manifest payloads match exact Git blobs in size and SHA-256. +Manifest SHA-256: 7639dbd81f1a766f656e563013c16910950eec359c92c5765c39c4c0981eef70. +All 77 native original records / 51 unique payloads match, and all 51 checksum +entries match. Native manifest SHA-256: +9a2ad6fb186606ef2a4fd1101d68c8e45bc96953093670fe9451ed9fb90a2ea6; +SHA256SUMS.txt: f69019970c42c52e5a0506b5f0369f804c216a3f0280e37d0e9b1eedf4a9523a. +The 69 total files in the two archives include README/manifests/preservation +method files outside those payload lists. Preserve all, including zero-byte +stdout/stderr, initial helper/loader failures and interruption records. + +The unchanged oracle and both base source blobs remain byte-identical to df6: +9eb9dd3868b6cb772f907d16ae02995ad10a16f85c087012c24948e6e6fe775d, +aa844950ec4fb86f262a257e1fc370a26557ea7978d8a4cab78265037660234c, +ad9de02963c20d1f43856455a797deb05ca674659e45f2c4b96b52783024f8bd respectively. + +ca53 source_draft.rs is 38,949 bytes and exactly matches frozen C8D36BD6BCD0818AAD2FBBC404B29085F4ADCAF8191B95A04208A7C2346C36E0. +creation.rs is 29,301 LF bytes, SHA-256 +438a245ead397060767c790c51a8f21cd5021342627999deb4695cf3bd22091a. +The author's inputs3 instead records 30,053 bytes / 0FB19BE3A5688C4BD3CA3643C47A97DA7E7F85ADD8A860CD046A0D9CB3CE9DFC. +Uniform CRLF conversion gives 30,067 bytes / 5d9d5e72036c54b1446eb207eb20c951e728832307c7090e1b22d289e54c5f79, +so uniform normalization alone has not established exact author-source equality. +A mixed-newline original is plausible, but is not proven by this review. The +published caption diff exactly matches the report; no extra semantic source +delta appears. Keep the original manifest unchanged and obtain fresh import +build provenance; do not claim creation's committed bytes equal its old freeze. + +Additional raw rules for these two ca53 archives (retain the earlier union): + +```gitattributes +harness/experiments/contextual-source-native-20260911/** -text whitespace=cr-at-eol +harness/experiments/contextual-source-native-20260911/**/*.arcadia whitespace=-blank-at-eol,-blank-at-eof,cr-at-eol +harness/experiments/contextual-source-layout-reboot-20260911/** -text whitespace=cr-at-eol +harness/experiments/contextual-source-layout-reboot-20260911/run-gates2.ps1 whitespace=-blank-at-eof,cr-at-eol +``` + +No additional dependency blocker was found. This is a delta/import handoff, +not a performed integration, new test/native pass or release milestone.