Bound Create labels within lifeline capsules and preserve Unicode test inputs

This commit is contained in:
2026-09-11 06:56:17 -07:00
parent fb77b857d2
commit cb611a71df
16 changed files with 1815 additions and 12 deletions
+2 -1
View File
@@ -2164,7 +2164,8 @@ impl canvas::Program<Message> for Scene {
..Default::default() ..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 { if let Some((context, tool, editable)) = self.interaction {
let active = editable && state.context == Some(context) && state.tool == tool; let active = editable && state.context == Some(context) && state.tool == tool;
let point = cursor let point = cursor
@@ -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 { for marker in &self.markers {
let color = if selected == marker.event.occurrence || selected == marker.lifeline { let color = if selected == marker.event.occurrence || selected == marker.lifeline {
style::TEAL style::TEAL
@@ -302,13 +302,20 @@ impl Rendering {
}, },
), ),
); );
frame.fill_text(Text { if let Some(clip) = birth_label_clip(marker.capsule, scale, frame.size()) {
content: short(&marker.name, 18), // WGPU clipped frames start with an identity transform;
position: marker.capsule.position() + iced::Vector::new(8., 6.), // neither the parent's scale nor its clip is inherited.
size: 12.into(), frame.with_clip(clip, |label| {
color, label.scale(scale);
..Default::default() 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 => { MarkerKind::Death => {
for (a, b) in death_strokes(marker.center) { 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<Rectangle> {
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 { fn marker_distance(marker: &EventMarker, point: Point) -> f32 {
match marker.event.kind { match marker.event.kind {
MarkerKind::Birth => { MarkerKind::Birth => {
@@ -172,6 +172,67 @@ fn intervals(scene: &Scene, lifeline: Id, scope: Id) -> Vec<(f32, f32, Life)> {
.collect() .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] #[test]
fn real_scene_empty_and_create_only_use_visible_root_extents_not_insertion_bounds() { fn real_scene_empty_and_create_only_use_visible_root_extents_not_insertion_bounds() {
for layer in [Layer::Oa, Layer::Sa] { for layer in [Layer::Oa, Layer::Sa] {
+6 -3
View File
@@ -1,9 +1,12 @@
# Progress Ledger — first release # Progress Ledger — first release
Updated 2026-09-11 by Codex-ytr83r /root for current execution. Updated 2026-09-11 by Codex-ytr83r /root for current execution.
**Reboot checkpoint:** the user requested saving progress before reboot. The **Post-reboot:** the user confirmed restart; fresh Windows boot13:41:27UTC is
desktop Cargo session93786 was interrupted during dependency compilation; no verified and saved checkpointfb77b85 was clean. Desktop session93786 had been
desktop test result exists. Follow [resume instructions](RESUME.md) after reboot. 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. **Release remains incomplete.** This is the new Codex-ytr83r Windows checkout.
It started clean at `ff615d0`; no local compiled desktop or native acceptance It started clean at `ff615d0`; no local compiled desktop or native acceptance
is claimed for the combined source at this checkpoint. is claimed for the combined source at this checkpoint.
@@ -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"
}
]
@@ -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"
}
@@ -0,0 +1 @@
PASS same: all identities, fields, reachable source and physical bytes
@@ -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"
}
}
}
}
}
@@ -0,0 +1 @@
PASS same: all identities, fields, reachable source and physical bytes
@@ -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 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 predictions used native outputs. Pending: matching GUI, visual/interaction checks
and every native Save/Undo/Redo/reopen step above. 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.
@@ -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;
}
}
@@ -0,0 +1,2 @@
// Preserve lifecycle note: 雨 · receiver.
// Geometry never changes these bytes.
@@ -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;
}
}
@@ -0,0 +1,2 @@
// Preserve lifecycle note: 雨 · receiver.
// Geometry never changes these bytes.
@@ -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.
@@ -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.